aboutsummaryrefslogtreecommitdiff
path: root/keyserver
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2022-09-20 11:32:03 +0200
committerGitHub <noreply@github.com>2022-09-20 11:32:03 +0200
commite007b8038f677b6578a65cfe2cbd8a7192ae69b0 (patch)
tree27157dc3e229c2a2b6fcf190d4d94a1a0ba17621 /keyserver
parent47af4bff5b930c86630c7879e14f5b07b9d08497 (diff)
Mark device list as stale, if we don't have the requesting device (#2728)
This hopefully makes E2EE chats a little bit more reliable by re-syncing devices if we don't have the `requesting_device_id` in our database. (As seen in [Synapse](https://github.com/matrix-org/synapse/blob/c52abc1cfdd9e5480cdb4a03d626fe61cacc6573/synapse/handlers/devicemessage.py#L157-L201))
Diffstat (limited to 'keyserver')
-rw-r--r--keyserver/api/api.go10
-rw-r--r--keyserver/internal/internal.go24
-rw-r--r--keyserver/inthttp/client.go12
-rw-r--r--keyserver/inthttp/server.go6
4 files changed, 46 insertions, 6 deletions
diff --git a/keyserver/api/api.go b/keyserver/api/api.go
index 9ba3988b..c9ec59a7 100644
--- a/keyserver/api/api.go
+++ b/keyserver/api/api.go
@@ -21,9 +21,10 @@ import (
"strings"
"time"
+ "github.com/matrix-org/gomatrixserverlib"
+
"github.com/matrix-org/dendrite/keyserver/types"
userapi "github.com/matrix-org/dendrite/userapi/api"
- "github.com/matrix-org/gomatrixserverlib"
)
type KeyInternalAPI interface {
@@ -56,6 +57,7 @@ type UserKeyAPI interface {
type SyncKeyAPI interface {
QueryKeyChanges(ctx context.Context, req *QueryKeyChangesRequest, res *QueryKeyChangesResponse) error
QueryOneTimeKeys(ctx context.Context, req *QueryOneTimeKeysRequest, res *QueryOneTimeKeysResponse) error
+ PerformMarkAsStaleIfNeeded(ctx context.Context, req *PerformMarkAsStaleRequest, res *struct{}) error
}
type FederationKeyAPI interface {
@@ -335,3 +337,9 @@ type QuerySignaturesResponse struct {
// The request error, if any
Error *KeyError
}
+
+type PerformMarkAsStaleRequest struct {
+ UserID string
+ Domain gomatrixserverlib.ServerName
+ DeviceID string
+}
diff --git a/keyserver/internal/internal.go b/keyserver/internal/internal.go
index 41b4d44a..a8d1128c 100644
--- a/keyserver/internal/internal.go
+++ b/keyserver/internal/internal.go
@@ -23,16 +23,17 @@ import (
"sync"
"time"
- fedsenderapi "github.com/matrix-org/dendrite/federationapi/api"
- "github.com/matrix-org/dendrite/keyserver/api"
- "github.com/matrix-org/dendrite/keyserver/producers"
- "github.com/matrix-org/dendrite/keyserver/storage"
- userapi "github.com/matrix-org/dendrite/userapi/api"
"github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/util"
"github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
"github.com/tidwall/sjson"
+
+ fedsenderapi "github.com/matrix-org/dendrite/federationapi/api"
+ "github.com/matrix-org/dendrite/keyserver/api"
+ "github.com/matrix-org/dendrite/keyserver/producers"
+ "github.com/matrix-org/dendrite/keyserver/storage"
+ userapi "github.com/matrix-org/dendrite/userapi/api"
)
type KeyInternalAPI struct {
@@ -224,6 +225,19 @@ func (a *KeyInternalAPI) QueryDeviceMessages(ctx context.Context, req *api.Query
return nil
}
+// PerformMarkAsStaleIfNeeded marks the users device list as stale, if the given deviceID is not present
+// in our database.
+func (a *KeyInternalAPI) PerformMarkAsStaleIfNeeded(ctx context.Context, req *api.PerformMarkAsStaleRequest, res *struct{}) error {
+ knownDevices, err := a.DB.DeviceKeysForUser(ctx, req.UserID, []string{req.DeviceID}, true)
+ if err != nil {
+ return err
+ }
+ if len(knownDevices) == 0 {
+ return a.Updater.ManualUpdate(ctx, req.Domain, req.UserID)
+ }
+ return nil
+}
+
// nolint:gocyclo
func (a *KeyInternalAPI) QueryKeys(ctx context.Context, req *api.QueryKeysRequest, res *api.QueryKeysResponse) error {
res.DeviceKeys = make(map[string]map[string]json.RawMessage)
diff --git a/keyserver/inthttp/client.go b/keyserver/inthttp/client.go
index 7a713114..75d537d9 100644
--- a/keyserver/inthttp/client.go
+++ b/keyserver/inthttp/client.go
@@ -37,6 +37,7 @@ const (
QueryOneTimeKeysPath = "/keyserver/queryOneTimeKeys"
QueryDeviceMessagesPath = "/keyserver/queryDeviceMessages"
QuerySignaturesPath = "/keyserver/querySignatures"
+ PerformMarkAsStalePath = "/keyserver/markAsStale"
)
// NewKeyServerClient creates a KeyInternalAPI implemented by talking to a HTTP POST API.
@@ -172,3 +173,14 @@ func (h *httpKeyInternalAPI) QuerySignatures(
h.httpClient, ctx, request, response,
)
}
+
+func (h *httpKeyInternalAPI) PerformMarkAsStaleIfNeeded(
+ ctx context.Context,
+ request *api.PerformMarkAsStaleRequest,
+ response *struct{},
+) error {
+ return httputil.CallInternalRPCAPI(
+ "MarkAsStale", h.apiURL+PerformMarkAsStalePath,
+ h.httpClient, ctx, request, response,
+ )
+}
diff --git a/keyserver/inthttp/server.go b/keyserver/inthttp/server.go
index 4e5f9fba..7af0ff6e 100644
--- a/keyserver/inthttp/server.go
+++ b/keyserver/inthttp/server.go
@@ -16,6 +16,7 @@ package inthttp
import (
"github.com/gorilla/mux"
+
"github.com/matrix-org/dendrite/internal/httputil"
"github.com/matrix-org/dendrite/keyserver/api"
)
@@ -70,4 +71,9 @@ func AddRoutes(internalAPIMux *mux.Router, s api.KeyInternalAPI) {
QuerySignaturesPath,
httputil.MakeInternalRPCAPI("KeyserverQuerySignatures", s.QuerySignatures),
)
+
+ internalAPIMux.Handle(
+ PerformMarkAsStalePath,
+ httputil.MakeInternalRPCAPI("KeyserverMarkAsStale", s.PerformMarkAsStaleIfNeeded),
+ )
}