Ejemplo n.º 1
0
        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())));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }