diff options
Diffstat (limited to 'serverkeyapi/internal/api.go')
-rw-r--r-- | serverkeyapi/internal/api.go | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/serverkeyapi/internal/api.go b/serverkeyapi/internal/api.go index cbae59d9..c63b23f0 100644 --- a/serverkeyapi/internal/api.go +++ b/serverkeyapi/internal/api.go @@ -3,6 +3,7 @@ package internal import ( "context" "fmt" + "time" "github.com/matrix-org/dendrite/internal/caching" "github.com/matrix-org/dendrite/serverkeyapi/api" @@ -24,25 +25,35 @@ func (s *ServerKeyAPI) KeyRing() *gomatrixserverlib.KeyRing { } func (s *ServerKeyAPI) StoreKeys( - ctx context.Context, + _ context.Context, results map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, ) error { + // Run in a background context - we don't want to stop this work just + // because the caller gives up waiting. + ctx := context.Background() // Store any keys that we were given in our database. return s.OurKeyRing.KeyDatabase.StoreKeys(ctx, results) } func (s *ServerKeyAPI) FetchKeys( - ctx context.Context, + _ context.Context, requests map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.Timestamp, ) (map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult, error) { + // Run in a background context - we don't want to stop this work just + // because the caller gives up waiting. + ctx := context.Background() results := map[gomatrixserverlib.PublicKeyLookupRequest]gomatrixserverlib.PublicKeyLookupResult{} // First consult our local database and see if we have the requested // keys. These might come from a cache, depending on the database // implementation used. + now := gomatrixserverlib.AsTimestamp(time.Now()) if dbResults, err := s.OurKeyRing.KeyDatabase.FetchKeys(ctx, requests); err == nil { // We successfully got some keys. Add them to the results and // remove them from the request list. for req, res := range dbResults { + if now > res.ValidUntilTS && res.ExpiredTS == gomatrixserverlib.PublicKeyNotExpired { + continue + } results[req] = res delete(requests, req) } @@ -61,6 +72,9 @@ func (s *ServerKeyAPI) FetchKeys( results[req] = res delete(requests, req) } + if err = s.OurKeyRing.KeyDatabase.StoreKeys(ctx, fetcherResults); err != nil { + return nil, fmt.Errorf("server key API failed to store retrieved keys: %w", err) + } } } // If we failed to fetch any keys then we should report an error. |