public async Task <IActionResult> RemoteDownloadItem([FromBody] RemoteDownloadRequest model) { HttpClient client = new(); client.DefaultRequestHeaders.UserAgent.Clear(); client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); using var resp = await client.GetAsync(model.Url); if (!resp.IsSuccessStatusCode) { throw new MemzException(MemzErrorCode.DownloadFailed, $"Cannot download image [{resp.StatusCode}] {model.Url}"); } var mime = resp.Content.Headers.ContentType.MediaType ?? string.Empty; if (!MimeMappings.IsSupportedMime(mime)) { throw new MemzException(MemzErrorCode.InvalidFileType, $"Invalid file type {mime}"); } var stream = await resp.Content.ReadAsStreamAsync(); var id = Guid.NewGuid().ToString(); var name = Path.ChangeExtension(id, MimeMappings.MimeToFileExtension(mime)); var meta = new StoredItemMetadata(0x01, name, mime, name, Array.Empty <string>(), null); await repo.StoreItem(GetRepository(), GetPassphrase(), id, meta, stream); var(info, _) = (await repo.ListRepositoryAsync(GetRepository(), GetPassphrase(), 0, 1, null, inf => inf.ItemId == id)); return(Ok(ApiResponse.FromData(info.FirstOrDefault()))); }
public async Task StoreItem(string repo, string passphrase, string itemId, StoredItemMetadata meta, Stream dataStream) { var masterKey = await GetRepositoryMasterKey(repo, passphrase); var iv = crypto.GenerateRandomIV(); meta = meta with { Base64IV = Convert.ToBase64String(iv) }; var encryptedStream = crypto.CreateEncryptionStream(dataStream, masterKey, iv); await SetItemMetadata(repo, passphrase, itemId, meta); await driver.WriteItem(repo, itemId, encryptedStream); }
public async Task SetItemMetadata(string repo, string passphrase, string itemId, StoredItemMetadata meta) { var rawJson = JsonSerializer.Serialize(meta, new() { WriteIndented = false }); var binaryJson = Encoding.UTF8.GetBytes(rawJson); var metadataPacket = crypto.PassphraseEncrypt(Encoding.UTF8.GetBytes(passphrase), binaryJson); var serializedPacket = metadataPacket.ToString(); var encryptedMetadata = Encoding.ASCII.GetBytes(serializedPacket); await driver.WriteMetadata(repo, itemId, encryptedMetadata); }