def add_file(self, path, vlob): path = '/' + path.strip('/') parent_folder = os.path.dirname(path) if parent_folder not in self.entries: raise ManifestNotFound('Destination Folder not found.') if path in self.entries: raise ManifestError('already_exists', 'File already exists.') self.entries[path] = vlob
def restore(self, version=None): if version is None: version = self.version - 1 if self.version > 1 else 1 if version > 0 and version < self.version: vlob = yield Effect(EUserVlobRead(version)) yield Effect(EUserVlobUpdate(self.version, vlob['blob'])) elif version < 1 or version > self.version: raise ManifestError('bad_version', 'Bad version number.') yield self.reload(reset=True)
def undelete_file(self, vlob): for entry in self.dustbin: if entry['id'] == vlob: path = entry['path'] if path in self.entries: raise ManifestError('already_exists', 'Restore path already used.') del entry['path'] del entry['removed_date'] self.dustbin[:] = [item for item in self.dustbin if item['id'] != vlob] self.entries[path] = entry folder = os.path.dirname(path) self.create_folder(folder, parents=True) return raise ManifestNotFound('Vlob not found.')
def create_folder(self, path, parents=False): path = '/' + path.strip('/') if path in self.entries: if parents: return self.entries[path] else: raise ManifestError('already_exists', 'Folder already exists.') parent_folder = os.path.dirname(path) if parent_folder not in self.entries: if parents: self.create_folder(parent_folder, parents=True) else: raise ManifestNotFound("Parent folder doesn't exists.") self.entries[path] = None return self.entries[path]
def move(self, old_path, new_path): old_path = '/' + old_path.strip('/') new_path = '/' + new_path.strip('/') new_parent_folder = os.path.dirname(new_path) if old_path not in self.entries: raise ManifestNotFound('File not found.') if new_parent_folder not in self.entries: raise ManifestNotFound('Destination Folder not found.') if new_path in self.entries: raise ManifestError('already_exists', 'File already exists.') for entry, vlob in self.entries.items(): if entry.startswith(old_path): new_entry = new_path + entry[len(old_path):] self.entries[new_entry] = vlob del self.entries[entry]
def reload(self, reset=False): vlob = yield Effect(EUserVlobRead()) if not vlob['blob']: raise ManifestNotFound('User manifest not found.') blob = from_jsonb64(vlob['blob']) content = self.encryptor.decrypt(blob) if not reset and vlob['version'] <= self.version: return new_manifest = ejson_loads(content.decode()) backup_new_manifest = deepcopy(new_manifest) consistency = yield self.check_consistency(new_manifest) if not consistency: raise ManifestError('not_consistent', 'User manifest not consistent.') if not reset: diff = yield self.diff_versions() new_manifest = self.patch(new_manifest, diff) self.entries = new_manifest['entries'] self.dustbin = new_manifest['dustbin'] self.version = vlob['version'] self.group_manifests = {} for group, group_vlob in new_manifest['groups'].items(): self.import_group_vlob(group, group_vlob) self.original_manifest = backup_new_manifest versions = new_manifest['versions'] file_vlob = None for vlob_id, version in sorted(versions.items()): for entry in self.entries.values(): if entry and entry['id'] == vlob_id: file_vlob = entry break if not file_vlob: for entry in self.dustbin: if entry['id'] == vlob_id: file_vlob = {'id': entry['id'], 'read_trust_seed': entry['read_trust_seed'], 'write_trust_seed': entry['write_trust_seed'], 'key': entry['key']} break if file_vlob: file_vlob = None file = yield File.load(entry['id'], entry['key'], entry['read_trust_seed'], entry['write_trust_seed']) try: yield file.restore(version) except FileError: pass
def history(self, first_version=1, last_version=None, summary=False): if first_version and last_version and first_version > last_version: raise ManifestError('bad_versions', 'First version number higher than the second one.') if summary: diff = yield self.diff_versions(first_version, last_version) return {'summary_history': diff} else: if not last_version: last_version = self.version history = [] for current_version in range(first_version, last_version + 1): diff = yield self.diff_versions(current_version - 1, current_version) diff['version'] = current_version history.append(diff) return {'detailed_history': history}
def reload(self, reset=False): # Subscribe to events # yield Effect(EConnectEvent('on_vlob_updated', self.id, self.handler)) # TODO call vlob = yield Effect(EVlobRead(self.id, self.read_trust_seed)) blob = from_jsonb64(vlob['blob']) content = self.encryptor.decrypt(blob) if not reset and vlob['version'] <= self.version: return new_manifest = ejson_loads(content.decode()) backup_new_manifest = deepcopy(new_manifest) consistency = yield self.check_consistency(new_manifest) if not consistency: raise ManifestError('not_consistent', 'Group manifest not consistent.') if not reset: diff = yield self.diff_versions() new_manifest = self.patch(new_manifest, diff) self.entries = new_manifest['entries'] self.dustbin = new_manifest['dustbin'] self.version = vlob['version'] self.original_manifest = backup_new_manifest versions = new_manifest['versions'] file_vlob = None for vlob_id, version in sorted(versions.items()): for entry in self.entries.values(): if entry and entry['id'] == vlob_id: file_vlob = entry break if not file_vlob: for entry in self.dustbin: if entry['id'] == vlob_id: file_vlob = {'id': entry['id'], 'read_trust_seed': entry['read_trust_seed'], 'write_trust_seed': entry['write_trust_seed'], 'key': entry['key']} break if file_vlob: file_vlob = None file = yield File.load(entry['id'], entry['key'], entry['read_trust_seed'], entry['write_trust_seed']) try: yield file.restore(version) except FileError: pass
def create_group_manifest(self, group): if group in self.group_manifests: raise ManifestError('already_exists', 'Group already exists.') group_manifest = yield GroupManifest.create() self.group_manifests[group] = group_manifest