(params)
| 1090 | |
| 1091 | |
| 1092 | def prepare_folder_tree(params): # type: (KeeperParams) -> None |
| 1093 | params.folder_cache = {} |
| 1094 | params.root_folder = RootFolderNode() |
| 1095 | |
| 1096 | for sf in params.subfolder_cache.values(): |
| 1097 | data_unencrypted = sf.get('data_unencrypted') # type: Optional[bytes] |
| 1098 | folder_uid = None |
| 1099 | if sf['type'] == 'user_folder': |
| 1100 | folder_uid = sf['folder_uid'] |
| 1101 | if sf.get('source') == 'nested_share_folder': |
| 1102 | uf = NestedShareFolderNode() |
| 1103 | else: |
| 1104 | uf = UserFolderNode() |
| 1105 | uf.uid = folder_uid |
| 1106 | uf.parent_uid = sf.get('parent_uid') |
| 1107 | if sf.get('name'): |
| 1108 | uf.name = sf['name'] |
| 1109 | params.folder_cache[uf.uid] = uf |
| 1110 | |
| 1111 | elif sf['type'] == 'shared_folder_folder': |
| 1112 | folder_uid = sf['folder_uid'] |
| 1113 | sff = SharedFolderFolderNode() |
| 1114 | sff.uid = folder_uid |
| 1115 | sff.shared_folder_uid = sf['shared_folder_uid'] |
| 1116 | sff.parent_uid = sf.get('parent_uid') or sff.shared_folder_uid |
| 1117 | params.folder_cache[sff.uid] = sff |
| 1118 | |
| 1119 | elif sf['type'] == 'shared_folder': |
| 1120 | folder_uid = sf['shared_folder_uid'] |
| 1121 | shf = SharedFolderNode() |
| 1122 | shf.uid = folder_uid |
| 1123 | shf.parent_uid = sf.get('folder_uid') |
| 1124 | folder = params.shared_folder_cache.get(shf.uid) |
| 1125 | if folder is not None: |
| 1126 | data_unencrypted = folder.get('data_unencrypted') |
| 1127 | shf.name = folder['name_unencrypted'] |
| 1128 | params.folder_cache[shf.uid] = shf |
| 1129 | |
| 1130 | if data_unencrypted and folder_uid: |
| 1131 | try: |
| 1132 | f = params.folder_cache.get(folder_uid) # type: Optional[BaseFolderNode] |
| 1133 | data = json.loads(data_unencrypted.decode()) |
| 1134 | f.name = data.get('name') or f.name or f.uid |
| 1135 | f.color = data.get('color') |
| 1136 | except Exception as e: |
| 1137 | logging.debug('Error decrypting user folder name. Folder UID: %s. Error: %s', sf.uid, e) |
| 1138 | |
| 1139 | for f in params.folder_cache.values(): |
| 1140 | parent_folder = params.folder_cache.get(f.parent_uid) if f.parent_uid else params.root_folder |
| 1141 | if parent_folder: |
| 1142 | parent_folder.subfolders.append(f.uid) |
| 1143 | elif f.parent_uid and hasattr(params, 'nested_share_folders') and f.uid in params.nested_share_folders: |
| 1144 | # Nested Share Folder root-level folders have a parent UID pointing to the NSF vault root, |
| 1145 | # which is not a real vault folder. Clear parent_uid so that navigation |
| 1146 | # and ls treat them as direct children of the vault root. |
| 1147 | f.parent_uid = None |
| 1148 | params.root_folder.subfolders.append(f.uid) |
no test coverage detected