public IEnumerator<TemporaryExposureKeyExportModel> Create(
            ulong startTimestamp, ulong endTimestamp, IEnumerable<TemporaryExposureKey> keys)
        {
            var current = keys;
            var num = 1;
            while (current.Any())
            {
                var exportKeys = current.Take(MaxKeysPerFile);
                current = current.Skip(MaxKeysPerFile);

                var bin = new TemporaryExposureKeyExport();
                bin.Keys.AddRange(keys);

                bin.BatchNum = num++;
                bin.BatchSize = bin.Keys.Count;
                bin.Region = Region;
                bin.StartTimestamp = startTimestamp;
                bin.EndTimestamp = endTimestamp;

                var signature = CreateSignature(bin.BatchNum, bin.BatchSize);
                bin.SignatureInfos.Add(signature.SignatureInfo);

                var sig = new Covid19Radar.Protobuf.TEKSignatureList();
                sig.Signatures.Add(signature);

                var model = new TemporaryExposureKeyExportModel();
                model.Url = WriteToBlob(bin, sig);
                model.startTimestamp = startTimestamp;
                model.endTimestamp = endTimestamp;

                yield return model;
            }

        }
        public async Task WriteToBlobAsync(Stream s, TemporaryExposureKeyExportModel model, TemporaryExposureKeyExport bin, TEKSignatureList sig)
        {
            Logger.LogInformation($"start {nameof(WriteToBlobAsync)}");
            // skip if completed upload
            if (model.Uploaded)
            {
                return;
            }
            //  write to blob storage
            var blobContainerName  = $"{TekExportBlobStorageContainerPrefix}".ToLower();
            var cloudBlobContainer = BlobClient.GetContainerReference(blobContainerName);
            await cloudBlobContainer.CreateIfNotExistsAsync(BlobContainerPublicAccessType.Blob, new BlobRequestOptions(), new OperationContext());

            var blobDirectory = cloudBlobContainer.GetDirectoryReference($"{model.Region}".ToLower());

            // Filename is inferable as batch number
            var exportFileName = $"{model.BatchNum}{fileNameSuffix}";
            //var blockBlob = cloudBlobContainer.GetBlockBlobReference(exportFileName);
            var blockBlob = blobDirectory.GetBlockBlobReference(exportFileName);

            // Set the batch number and region as metadata
            blockBlob.Metadata[batchNumberMetadataKey] = model.BatchNum.ToString();
            blockBlob.Metadata[batchRegionMetadataKey] = model.Region;

            await blockBlob.UploadFromStreamAsync(s);

            Logger.LogInformation($" {nameof(WriteToBlobAsync)} upload {exportFileName}");
            await blockBlob.SetMetadataAsync();

            Logger.LogInformation($" {nameof(WriteToBlobAsync)} set metadata {exportFileName}");
            // set upload
            model.Uploaded = true;
        }
Esempio n. 3
0
        public async Task <TemporaryExposureKeyExportModel> CreateAsync(TemporaryExposureKeyExportModel model)
        {
            _logger.LogInformation($"start {nameof(CreateAsync)}");
            var pk       = new PartitionKey(model.PartitionKey);
            var response = await _db.TemporaryExposureKeyExport.CreateItemAsync(model, pk);

            return(response.Resource);
        }
        public void PropertiesTest()
        {
            // preparation
            var model = new TemporaryExposureKeyExportModel();

            // model property access
            Helper.ModelTestHelper.PropetiesTest(model);
        }
        public void CreateMethod()
        {
            // action
            var model = new TemporaryExposureKeyExportModel();

            // assert
            Assert.IsNotNull(model);
        }
        public async Task <TemporaryExposureKeyExportModel> CreateAsync()
        {
            var partitionKey = PartitionKey.None;
            var newItem      = new TemporaryExposureKeyExportModel();

            newItem.BatchNum = await _sequence.GetNextAsync(SequenceName, 1);

            var pk = PartitionKey.Null;

            return((await _db.TemporaryExposureKeyExport.CreateItemAsync(newItem, pk)).Resource);
        }
Esempio n. 7
0
        public async Task <TemporaryExposureKeyExportModel> CreateAsync()
        {
            var pk       = PartitionKey.None;
            var newItem  = new TemporaryExposureKeyExportModel();
            var batchNum = await _sequence.GetNextAsync(SequenceName, 1);

            newItem.id       = batchNum.ToString();
            newItem.BatchNum = batchNum;
            await _db.TemporaryExposureKeyExport.CreateItemAsync(newItem, pk);

            return(newItem);
        }
        public async Task DeleteAsync(TemporaryExposureKeyExportModel model)
        {
            Logger.LogInformation($"start {nameof(DeleteAsync)}");
            var blobContainerName  = $"{TekExportBlobStorageContainerPrefix}{model.Region}".ToLower();
            var cloudBlobContainer = BlobClient.GetContainerReference(blobContainerName);
            await cloudBlobContainer.CreateIfNotExistsAsync(BlobContainerPublicAccessType.Blob, new BlobRequestOptions(), new OperationContext());

            // Filename is inferable as batch number
            var exportFileName = $"{model.BatchNum}{fileNameSuffix}";
            var blockBlob      = cloudBlobContainer.GetBlockBlobReference(exportFileName);

            await blockBlob.DeleteIfExistsAsync();
        }
Esempio n. 9
0
        public async Task WriteToBlobAsync(Stream s, TemporaryExposureKeyExportModel model, TemporaryExposureKeyExport bin, TEKSignatureList sig)
        {
            //  write to blob storage
            var cloudBlobContainer = BlobClient.GetContainerReference(BlobContainerName);
            await cloudBlobContainer.CreateIfNotExistsAsync(BlobContainerPublicAccessType.Blob, new BlobRequestOptions(), new OperationContext());

            // Filename is inferable as batch number
            var exportFileName = $"{model.BatchNum}.tekexport";
            var blockBlob      = cloudBlobContainer.GetBlockBlobReference(exportFileName);

            // Set the batch number and region as metadata
            blockBlob.Metadata[batchNumberMetadataKey] = model.BatchNum.ToString();
            blockBlob.Metadata[batchRegionMetadataKey] = model.Region;

            await blockBlob.UploadFromStreamAsync(s);

            await blockBlob.SetMetadataAsync();
        }
Esempio n. 10
0
        public async Task CreateAsync(ulong startTimestamp,
                                      ulong endTimestamp,
                                      string region,
                                      int batchNum,
                                      long batchTimestamp,
                                      IEnumerable <TemporaryExposureKeyModel> keys)
        {
            Logger.LogInformation($"start {nameof(CreateAsync)}");
            var current = keys;

            while (current.Any())
            {
                var exportKeyModels = current.Take(MaxKeysPerFile).ToArray();
                var exportKeys      = exportKeyModels.Select(_ => _.ToKey()).ToArray();
                current = current.Skip(MaxKeysPerFile);

                var signatureInfo = SignatureService.Create();
                await SignService.SetSignatureAsync(signatureInfo);

                var exportModel = new TemporaryExposureKeyExportModel();
                exportModel.id           = batchNum.ToString();
                exportModel.PartitionKey = region;
                // TODO: not support apple
                //exportModel.BatchNum = batchNum;
                exportModel.BatchNum = 1;
                exportModel.Region   = region;
                // TODO: not support apple
                //exportModel.BatchSize = exportKeyModels.Length;
                exportModel.BatchSize                  = 1;
                exportModel.StartTimestamp             = startTimestamp;
                exportModel.EndTimestamp               = endTimestamp;
                exportModel.TimestampSecondsSinceEpoch = batchTimestamp;
                exportModel = await TekExportRepository.CreateAsync(exportModel);

                var bin = new TemporaryExposureKeyExport();
                bin.Keys.AddRange(exportKeys);
                bin.BatchNum       = exportModel.BatchNum;
                bin.BatchSize      = exportModel.BatchSize;
                bin.Region         = exportModel.Region;
                bin.StartTimestamp = exportModel.StartTimestamp;
                bin.EndTimestamp   = exportModel.EndTimestamp;
                bin.SignatureInfos.Add(signatureInfo);

                var sig = new TEKSignatureList();

                using var binStream = new MemoryStream();
                await binStream.WriteAsync(FixedHeader, 0, FixedHeaderWidth);

                using var binStreamCoded = new CodedOutputStream(binStream, true);
                bin.WriteTo(binStreamCoded);
                binStreamCoded.Flush();
                await binStream.FlushAsync();

                var signature = await CreateSignatureAsync(binStream, bin.BatchNum, bin.BatchSize);

                signature.SignatureInfo = signatureInfo;
                sig.Signatures.Add(signature);

                using (var s = new MemoryStream())
                {
                    using (var z = new System.IO.Compression.ZipArchive(s, System.IO.Compression.ZipArchiveMode.Create, true))
                    {
                        var binEntry = z.CreateEntry(ExportBinFileName);
                        using (var binFile = binEntry.Open())
                        {
                            binStream.Seek(0, SeekOrigin.Begin);
                            await binStream.CopyToAsync(binFile);

                            await binFile.FlushAsync();
                        }

                        var sigEntry = z.CreateEntry(ExportSigFileName);
                        using (var sigFile = sigEntry.Open())
                            using (var output = new CodedOutputStream(sigFile))
                            {
                                sig.WriteTo(output);
                                output.Flush();
                                await sigFile.FlushAsync();
                            }
                    }
                    s.Seek(0, SeekOrigin.Begin);
                    await BlobService.WriteToBlobAsync(s, exportModel, bin, sig);
                }
                await TekExportRepository.UpdateAsync(exportModel);
            }
        }
Esempio n. 11
0
 public async Task UpdateAsync(TemporaryExposureKeyExportModel model)
 {
     _logger.LogInformation($"start {nameof(UpdateAsync)}");
     await _db.TemporaryExposureKeyExport.UpsertItemAsync(model);
 }
Esempio n. 12
0
 public void CreateMethod()
 {
     // action
     var model = new TemporaryExposureKeyExportModel();
 }
 public async Task UpdateAsync(TemporaryExposureKeyExportModel model)
 {
     await _db.TemporaryExposureKeyExport.UpsertItemAsync(model);
 }