introduce and use LeaseInfo.is_cancel_secret

This commit is contained in:
Jean-Paul Calderone 2021-10-28 12:21:22 -04:00
parent 8b976b441e
commit b5f882ffa6
4 changed files with 31 additions and 2 deletions

View File

@ -209,7 +209,7 @@ class ShareFile(object):
leases = list(self.get_leases()) leases = list(self.get_leases())
num_leases_removed = 0 num_leases_removed = 0
for i,lease in enumerate(leases): for i,lease in enumerate(leases):
if timing_safe_compare(lease.cancel_secret, cancel_secret): if lease.is_cancel_secret(cancel_secret):
leases[i] = None leases[i] = None
num_leases_removed += 1 num_leases_removed += 1
if not num_leases_removed: if not num_leases_removed:

View File

@ -80,6 +80,16 @@ class LeaseInfo(object):
""" """
return timing_safe_compare(self.renew_secret, candidate_secret) return timing_safe_compare(self.renew_secret, candidate_secret)
def is_cancel_secret(self, candidate_secret):
# type: (bytes) -> bool
"""
Check a string to see if it is the correct cancel secret.
:return: ``True`` if it is the correct cancel secret, ``False``
otherwise.
"""
return timing_safe_compare(self.cancel_secret, candidate_secret)
def get_grant_renew_time_time(self): def get_grant_renew_time_time(self):
# hack, based upon fixed 31day expiration period # hack, based upon fixed 31day expiration period
return self._expiration_time - 31*24*60*60 return self._expiration_time - 31*24*60*60

View File

@ -371,7 +371,7 @@ class MutableShareFile(object):
with open(self.home, 'rb+') as f: with open(self.home, 'rb+') as f:
for (leasenum,lease) in self._enumerate_leases(f): for (leasenum,lease) in self._enumerate_leases(f):
accepting_nodeids.add(lease.nodeid) accepting_nodeids.add(lease.nodeid)
if timing_safe_compare(lease.cancel_secret, cancel_secret): if lease.is_cancel_secret(cancel_secret):
self._write_lease_record(f, leasenum, blank_lease) self._write_lease_record(f, leasenum, blank_lease)
modified += 1 modified += 1
else: else:

View File

@ -3047,3 +3047,22 @@ class ShareFileTests(unittest.TestCase):
sf.add_lease(lease) sf.add_lease(lease)
(loaded_lease,) = sf.get_leases() (loaded_lease,) = sf.get_leases()
self.assertTrue(loaded_lease.is_renew_secret(renew_secret)) self.assertTrue(loaded_lease.is_renew_secret(renew_secret))
def test_cancel_secret(self):
"""
A lease loaded from a share file can have its cancel secret verified.
"""
renew_secret = b"r" * 32
cancel_secret = b"c" * 32
expiration_time = 2 ** 31
sf = self.get_sharefile()
lease = LeaseInfo(
owner_num=0,
renew_secret=renew_secret,
cancel_secret=cancel_secret,
expiration_time=expiration_time,
)
sf.add_lease(lease)
(loaded_lease,) = sf.get_leases()
self.assertTrue(loaded_lease.is_cancel_secret(cancel_secret))