def test__writes_with_lock(self): lock = FileLock(security.get_shared_secret_filesystem_path()) self.assertFalse(lock.is_locked()) def check_lock(path, data): self.assertTrue(lock.is_locked()) write_text_file = self.patch_autospec(security, "write_text_file") write_text_file.side_effect = check_lock security.set_shared_secret_on_filesystem(b"foo") self.assertThat(write_text_file, MockCalledOnceWith(ANY, ANY)) self.assertFalse(lock.is_locked())
def test__reads_with_lock(self): lock = FileLock(security.get_shared_secret_filesystem_path()) self.assertFalse(lock.is_locked()) def check_lock(path): self.assertTrue(lock.is_locked()) return "12" # Two arbitrary hex characters. read_text_file = self.patch_autospec(security, "read_text_file") read_text_file.side_effect = check_lock security.get_shared_secret_from_filesystem() self.assertThat(read_text_file, MockCalledOnceWith(ANY)) self.assertFalse(lock.is_locked())
def get_shared_secret_from_filesystem(): """Load the secret from the filesystem. `get_shared_secret_filesystem_path` defines where the file will be written. If the directory does not already exist, this will attempt to create it, including all parent directories. :return: A byte string of arbitrary length. """ secret_path = get_shared_secret_filesystem_path() # ensure the parent dir exists so that the lock can be created secret_path.parent.mkdir(parents=True, exist_ok=True) with FileLock(secret_path).wait(10): if not secret_path.exists(): return None return to_bin(secret_path.read_text())
def set_shared_secret_on_filesystem(secret): """Write the secret to the filesystem. `get_shared_secret_filesystem_path` defines where the file will be written. If the directory does not already exist, this will attempt to create it, including all parent directories. :type secret: A byte string of arbitrary length. """ secret_path = get_shared_secret_filesystem_path() makedirs(dirname(secret_path), exist_ok=True) secret_hex = to_hex(secret) with FileLock(secret_path).wait(10): # Ensure that the file has sensible permissions. with open(secret_path, "ab") as secret_f: fchmod(secret_f.fileno(), 0o640) # Write secret to the filesystem. write_text_file(secret_path, secret_hex)
def set_shared_secret_on_filesystem(secret): """Write the secret to the filesystem. `get_shared_secret_filesystem_path` defines where the file will be written. If the directory does not already exist, this will attempt to create it, including all parent directories. :type secret: A byte string of arbitrary length. """ secret_path = get_shared_secret_filesystem_path() if secret: secret_path.parent.mkdir(parents=True, exist_ok=True) secret_hex = to_hex(secret) with FileLock(str(secret_path)).wait(10): secret_path.touch() secret_path.chmod(0o640) secret_path.write_text(secret_hex) elif secret_path.exists(): secret_path.unlink()
def get_shared_secret_from_filesystem(): """Load the secret from the filesystem. `get_shared_secret_filesystem_path` defines where the file will be written. If the directory does not already exist, this will attempt to create it, including all parent directories. :return: A byte string of arbitrary length. """ secret_path = get_shared_secret_filesystem_path() makedirs(dirname(secret_path), exist_ok=True) with FileLock(secret_path).wait(10): # Load secret from the filesystem, if it exists. try: secret_hex = read_text_file(secret_path) except IOError as e: if e.errno == errno.ENOENT: return None else: raise else: return to_bin(secret_hex)
def test_path(self): filename = self.make_file() expected = filename + ".lock" observed = FileLock(filename).path self.assertEqual(expected, observed)