internal static SharedFolder Load(this ISharedFolder sf, IEnumerable <IRecordMetadata> records, IEnumerable <ISharedFolderPermission> users, byte[] sharedFolderKey) { var sharedFolder = new SharedFolder { Uid = sf.SharedFolderUid, Name = Encoding.UTF8.GetString(CryptoUtils.DecryptAesV1(sf.Name.Base64UrlDecode(), sharedFolderKey)), DefaultManageRecords = sf.DefaultManageRecords, DefaultManageUsers = sf.DefaultManageUsers, DefaultCanEdit = sf.DefaultCanEdit, DefaultCanShare = sf.DefaultCanShare, SharedFolderKey = sharedFolderKey, }; if (users != null) { foreach (var u in users) { sharedFolder.UsersPermissions.Add(new SharedFolderPermission { UserId = u.UserId, UserType = (UserType)u.UserType, ManageRecords = u.ManageRecords, ManageUsers = u.ManageUsers }); } } if (records != null) { foreach (var r in records) { sharedFolder.RecordPermissions.Add(new SharedFolderRecord { RecordUid = r.RecordUid, CanEdit = r.CanEdit, CanShare = r.CanShare }); } } return(sharedFolder); }
public bool TryGetSharedFolder(string sharedFolderUid, out SharedFolder sharedFolder) { return(keeperSharedFolders.TryGetValue(sharedFolderUid, out sharedFolder)); }
public static async Task <FolderNode> AddFolder <T>(this VaultOnline vault, string folderName, string parentFolderUid = null, T sharedFolderOptions = null) where T : class, ISharedFolderUserOptions, ISharedFolderRecordOptions { var parent = vault.GetFolder(parentFolderUid); FolderType folderType; if (sharedFolderOptions != null) { if (parent.FolderType != FolderType.UserFolder) { throw new VaultException($"Shared folder cannot be created"); } folderType = FolderType.SharedFolder; } else { folderType = parent.FolderType == FolderType.UserFolder ? FolderType.UserFolder : FolderType.SharedFolderFolder; } var encryptionKey = vault.Auth.AuthContext.DataKey; SharedFolder sharedFolder = null; if (folderType == FolderType.SharedFolderFolder) { var sharedFolderUid = parent.FolderType == FolderType.SharedFolder ? parent.FolderUid : parent.SharedFolderUid; sharedFolder = vault.GetSharedFolder(sharedFolderUid); encryptionKey = sharedFolder.SharedFolderKey; } var data = new FolderData { name = folderName ?? "", }; var dataBytes = JsonUtils.DumpJson(data); var folderKey = CryptoUtils.GenerateEncryptionKey(); var request = new FolderAddCommand { FolderUid = CryptoUtils.GenerateUid(), FolderType = folderType.GetFolderTypeText(), Key = CryptoUtils.EncryptAesV1(folderKey, encryptionKey).Base64UrlEncode(), Data = CryptoUtils.EncryptAesV1(dataBytes, folderKey).Base64UrlEncode(), ParentUid = string.IsNullOrEmpty(parent.FolderUid) || parent.FolderType == FolderType.SharedFolder ? null : parent.FolderUid, SharedFolderUid = sharedFolder?.Uid, }; if (sharedFolderOptions != null) { request.Name = CryptoUtils.EncryptAesV1(Encoding.UTF8.GetBytes(folderName), folderKey).Base64UrlEncode(); request.ManageUsers = sharedFolderOptions.ManageUsers ?? false; request.ManageRecords = sharedFolderOptions.ManageRecords ?? false; request.CanEdit = sharedFolderOptions.CanEdit ?? false; request.CanShare = sharedFolderOptions.CanShare ?? false; } _ = await vault.Auth.ExecuteAuthCommand <FolderAddCommand, AddFolderResponse>(request); await vault.ScheduleSyncDown(TimeSpan.FromSeconds(0)); return(vault.TryGetFolder(request.FolderUid, out var f) ? f : null); }