예제 #1
0
        FolderUpdateResponse IEasConnection.FolderUpdate(FolderUpdateRequest folderUpdateRequest)
        {
            FolderUpdateCommand folderUpdateCommand = new FolderUpdateCommand(this.EasConnectionSettings);

            return(folderUpdateCommand.Execute(folderUpdateRequest));
        }
        public static async Task <FolderNode> FolderUpdate(this VaultOnline vault, string folderUid, string folderName, SharedFolderOptions sharedFolderOptions = null)
        {
            if (string.IsNullOrEmpty(folderName) && sharedFolderOptions == null)
            {
                throw new VaultException("Folder name cannot be empty");
            }

            var folder = vault.GetFolder(folderUid);

            if (string.IsNullOrEmpty(folderName))
            {
                folderName = folder.Name;
            }

            var parent = vault.RootFolder;

            if (!string.IsNullOrEmpty(folder.ParentUid))
            {
                vault.TryGetFolder(folder.ParentUid, out parent);
            }

            var nameExists = parent.Subfolders
                             .Select(x => vault.TryGetFolder(x, out var v) ? v : null)
                             .Any(x => x != null && x.FolderUid != folderUid && string.Compare(x.Name, folderName, StringComparison.InvariantCultureIgnoreCase) == 0);

            if (nameExists)
            {
                throw new VaultException($"Folder with name {folderName} already exists in {parent.Name}");
            }

            var request = new FolderUpdateCommand
            {
                FolderUid       = folder.FolderUid,
                FolderType      = folder.FolderType.GetFolderTypeText(),
                ParentUid       = string.IsNullOrEmpty(folder.ParentUid) ? null : folder.ParentUid,
                SharedFolderUid = string.IsNullOrEmpty(folder.SharedFolderUid) ? null : folder.SharedFolderUid,
            };

            var existingRecord = vault.Storage.Folders.GetEntity(folderUid);
            var data           = string.IsNullOrEmpty(existingRecord?.Data)
                ? new FolderData()
                : JsonUtils.ParseJson <FolderData>(existingRecord.Data.Base64UrlDecode());

            data.name = folderName;
            var dataBytes = JsonUtils.DumpJson(data);

            var encryptionKey = vault.Auth.AuthContext.DataKey;

            if (folder.FolderType == FolderType.SharedFolderFolder)
            {
                encryptionKey = vault.GetSharedFolder(folder.SharedFolderUid).SharedFolderKey;
            }

            request.Data = CryptoUtils.EncryptAesV1(dataBytes, encryptionKey).Base64UrlEncode();

            if (folder.FolderType != FolderType.UserFolder)
            {
                var sharedFolderUid = folder.FolderType == FolderType.UserFolder ? folder.FolderUid : folder.SharedFolderUid;
                var perm            = vault.ResolveSharedFolderAccessPath(vault.Auth.Username, sharedFolderUid, true, true);
                if (perm != null)
                {
                    if (perm.UserType == UserType.Team)
                    {
                        request.TeamUid = perm.UserId;
                    }
                }
                else
                {
                    throw new VaultException($"You don't have permissions to modify shared folder ({sharedFolderUid})");
                }
            }

            if (sharedFolderOptions != null && folder.FolderType == FolderType.SharedFolder)
            {
                if (!vault.TryGetSharedFolder(folder.FolderUid, out var sharedFolder))
                {
                    request.Name = CryptoUtils.EncryptAesV1(Encoding.UTF8.GetBytes(folderName), sharedFolder.SharedFolderKey).Base64UrlEncode();
                }

                request.ManageUsers   = sharedFolderOptions.ManageUsers;
                request.ManageRecords = sharedFolderOptions.ManageRecords;
                request.CanEdit       = sharedFolderOptions.CanEdit;
                request.CanShare      = sharedFolderOptions.CanShare;
            }

            await vault.Auth.ExecuteAuthCommand(request);

            await vault.ScheduleSyncDown(TimeSpan.FromSeconds(0));

            return(vault.TryGetFolder(request.FolderUid, out var f) ? f : null);
        }