示例#1
0
 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
示例#2
0
 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)
示例#3
0
 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.')
示例#4
0
 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]
示例#5
0
 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]
示例#6
0
 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
示例#7
0
 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}
示例#8
0
 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
示例#9
0
 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