예제 #1
0
        public async Task <IActionResult> Refresh([FromRoute] string structure,
                                                  [FromRoute] int structureVersion,
                                                  [FromBody] TemporaryKeyList keys)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(structure))
                {
                    return(BadRequest("structure invalid"));
                }

                if (structureVersion < 0)
                {
                    return(BadRequest("structureVersion invalid"));
                }

                if (keys is null)
                {
                    return(BadRequest("invalid body-data"));
                }

                if (keys.Entries is null || !keys.Entries.Any())
                {
                    return(BadRequest("no or invalid {Body}.Entries"));
                }

                if (keys.Duration == default)
                {
                    return(BadRequest("no or invalid {Body}.Duration"));
                }

                var result = await _keyStore.Extend(MakeTemporaryRegion(structure, structureVersion),
                                                    keys.Entries.Select(e => e.Key).ToList(),
                                                    keys.Duration);

                return(Result(result));
            }
            catch (Exception e)
            {
                Logger.LogWarning(e, "could not refresh temporary keys due to an internal error");
                return(StatusCode(HttpStatusCode.InternalServerError,
                                  "could not refresh temporary keys due to an internal error"));
            }
        }
예제 #2
0
        public async Task <IActionResult> Set([FromRoute] string structure,
                                              [FromRoute] int structureVersion,
                                              [FromBody] TemporaryKeyList keys)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(structure))
                {
                    return(BadRequest("structure invalid"));
                }

                if (structureVersion < 0)
                {
                    return(BadRequest("structureVersion invalid"));
                }

                if (keys is null)
                {
                    return(BadRequest("invalid body-data"));
                }

                if (keys.Entries is null || !keys.Entries.Any())
                {
                    return(BadRequest("no or invalid {Body}.Entries"));
                }

                if (keys.Duration == default)
                {
                    return(BadRequest("no or invalid {Body}.Duration"));
                }

                var result = await _keyStore.Set(MakeTemporaryRegion(structure, structureVersion),
                                                 keys.Entries.ToDictionary(e => e.Key, e => e.Value),
                                                 keys.Duration);

                if (result.IsError)
                {
                    return(ProviderError(result));
                }

                KnownMetrics.TemporaryKeyCreated.Inc(keys.Entries.Length);

                await _eventBus.Connect();

                await _eventBus.Publish(new EventMessage
                {
                    Event = new TemporaryKeysAdded
                    {
                        Structure = structure,
                        Version   = structureVersion,
                        Values    = keys.Entries.ToDictionary(e => e.Key, e => e.Value)
                    },
                    EventType = nameof(TemporaryKeysAdded)
                });

                return(Result(result));
            }
            catch (Exception e)
            {
                Logger.LogWarning(e, "could not store temporary keys due to an internal error");
                return(StatusCode(HttpStatusCode.InternalServerError,
                                  "could not store temporary key due to an internal error"));
            }
        }