protected virtual async Task InitializeRepositoryAsync(IMetadataRepository repository, CancellationToken cancellationToken)
        {
            var blob = await repository.GetBLOBAsync(cancellationToken);

            foreach (var entry in blob.Entries)
            {
                if (!string.IsNullOrEmpty(entry.AaGuid))
                {
                    if (_entries.TryAdd(Guid.Parse(entry.AaGuid), entry))
                    {
                        //Load if it doesn't already exist
                        await LoadEntryStatementAsync(repository, blob, entry, cancellationToken);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        protected virtual async Task InitializeRepositoryAsync(IMetadataRepository repository, CancellationToken cancellationToken)
        {
            var blobCacheKey = GetTocCacheKey(repository);

            var cachedToc = await _cache.GetStringAsync(blobCacheKey, cancellationToken);

            MetadataBLOBPayload blob;

            DateTime?cacheUntil = null;

            if (cachedToc != null)
            {
                blob       = JsonSerializer.Deserialize <MetadataBLOBPayload>(cachedToc);
                cacheUntil = GetCacheUntilTime(blob);
            }
            else
            {
                _log?.LogInformation($"BLOB for {repository.GetType().Name} not cached so loading from MDS...");

                try
                {
                    blob = await repository.GetBLOBAsync(cancellationToken);
                }
                catch (Exception ex)
                {
                    _log?.LogError(ex, "Error getting BLOB from {0}", repository.GetType().Name);
                    throw;
                }

                _log?.LogInformation($"BLOB for {repository.GetType().Name} not cached so loading from MDS... Done.");

                cacheUntil = GetCacheUntilTime(blob);

                if (cacheUntil.HasValue)
                {
                    await _cache.SetStringAsync(
                        blobCacheKey,
                        JsonSerializer.Serialize(blob),
                        new DistributedCacheEntryOptions()
                    {
                        AbsoluteExpiration = cacheUntil
                    },
                        cancellationToken);
                }
            }

            foreach (var entry in blob.Entries)
            {
                if (!string.IsNullOrEmpty(entry.AaGuid)) //Only load FIDO2 entries
                {
                    try
                    {
                        await LoadTocEntryStatement(repository, blob, entry, cacheUntil);
                    }
                    catch (Exception ex)
                    {
                        _log?.LogError(ex, "Error getting statement from {0} for AAGUID '{1}'.\nTOC entry:\n{2} ", repository.GetType().Name, entry.AaGuid, JsonSerializer.Serialize(entry, new JsonSerializerOptions {
                            WriteIndented = true
                        }));
                    }
                }
            }
        }