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); }
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(); }