public static async Task <PasswordRecord> AddRecordToFolder(this VaultOnline vault, PasswordRecord record, string folderUid = null)
        {
            FolderNode node = null;

            if (!string.IsNullOrEmpty(folderUid))
            {
                vault.TryGetFolder(folderUid, out node);
            }

            record.Uid       = CryptoUtils.GenerateUid();
            record.RecordKey = CryptoUtils.GenerateEncryptionKey();
            var recordAdd = new RecordAddCommand
            {
                RecordUid  = record.Uid,
                RecordKey  = CryptoUtils.EncryptAesV1(record.RecordKey, vault.Auth.AuthContext.DataKey).Base64UrlEncode(),
                RecordType = "password"
            };

            if (node == null)
            {
                recordAdd.FolderType = "user_folder";
            }
            else
            {
                switch (node.FolderType)
                {
                case FolderType.UserFolder:
                    recordAdd.FolderType = "user_folder";
                    recordAdd.FolderUid  = node.FolderUid;
                    break;

                case FolderType.SharedFolder:
                case FolderType.SharedFolderFolder:
                    recordAdd.FolderUid  = node.FolderUid;
                    recordAdd.FolderType = node.FolderType == FolderType.SharedFolder
                            ? "shared_folder"
                            : "shared_folder_folder";
                    if (vault.TryGetSharedFolder(node.SharedFolderUid, out var sf))
                    {
                        recordAdd.FolderKey = CryptoUtils.EncryptAesV1(record.RecordKey, sf.SharedFolderKey)
                                              .Base64UrlEncode();
                    }

                    if (string.IsNullOrEmpty(recordAdd.FolderKey))
                    {
                        throw new Exception($"Cannot resolve shared folder for folder UID: {folderUid}");
                    }

                    break;
                }
            }

            var dataSerializer = new DataContractJsonSerializer(typeof(RecordData), JsonUtils.JsonSettings);
            var data           = record.ExtractRecordData();

            using (var ms = new MemoryStream())
            {
                dataSerializer.WriteObject(ms, data);
                recordAdd.Data = CryptoUtils.EncryptAesV1(ms.ToArray(), record.RecordKey).Base64UrlEncode();
            }

            await vault.Auth.ExecuteAuthCommand(recordAdd);

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

            return(vault.TryGetRecord(record.Uid, out var r) ? r : record);
        }
Beispiel #2
0
        public async Task AddRecord(PasswordRecord record, string folderUid)
        {
            IFolderNode node = null;

            if (!string.IsNullOrEmpty(folderUid))
            {
                userFolders.TryGetValue(folderUid, out node);
            }
            var recordKey = CryptoUtils.GenerateEncryptionKey();
            var recordAdd = new RecordAddCommand
            {
                recordUid  = CryptoUtils.GenerateUid(),
                recordKey  = CryptoUtils.EncryptAesV1(recordKey, Auth.DataKey).Base64UrlEncode(),
                recordType = "password"
            };

            if (node == null)
            {
                recordAdd.folderType = "user_folder";
            }
            else
            {
                switch (node.Type)
                {
                case FolderType.UserFolder:
                    recordAdd.folderType = "user_folder";
                    recordAdd.folderUid  = node.FolderUid;
                    break;

                case FolderType.SharedFolder:
                case FolderType.SharedFolderForder:
                    recordAdd.folderUid  = node.FolderUid;
                    recordAdd.folderType = node.Type == FolderType.SharedFolder ? "shared_folder" : "shared_folder_folder";
                    if (node is ISharedFolderNode sfn)
                    {
                        if (sharedFolders.TryGetValue(sfn.SharedFolderUid, out SyncDownSharedFolder sf))
                        {
                            recordAdd.folderKey = CryptoUtils.EncryptAesV1(recordKey, sf.unencryptedSharedFolderKey).Base64UrlEncode();
                        }
                    }
                    if (string.IsNullOrEmpty(recordAdd.folderKey))
                    {
                        throw new Exception(string.Format("Cannot resolve shared folder for folder UID", folderUid));
                    }
                    break;
                }
            }
            var settings = new DataContractJsonSerializerSettings
            {
                UseSimpleDictionaryFormat = true
            };
            var dataSerializer = new DataContractJsonSerializer(typeof(RecordData), settings);
            var data           = record.ExtractRecordData();

            using (var ms = new MemoryStream())
            {
                dataSerializer.WriteObject(ms, data);
                recordAdd.data = CryptoUtils.EncryptAesV1(ms.ToArray(), recordKey).Base64UrlEncode();
            }

            await Auth.ExecuteAuthCommand <RecordAddCommand>(recordAdd);

            await this.SyncDown();
        }