diff --git a/clientapi/routing/login.go b/clientapi/routing/login.go index 7f47aafff..42f828f64 100644 --- a/clientapi/routing/login.go +++ b/clientapi/routing/login.go @@ -23,8 +23,8 @@ import ( "github.com/matrix-org/dendrite/clientapi/jsonerror" "github.com/matrix-org/dendrite/clientapi/userutil" "github.com/matrix-org/dendrite/internal/config" + userapi "github.com/matrix-org/dendrite/userapi/api" "github.com/matrix-org/dendrite/userapi/storage/accounts" - "github.com/matrix-org/dendrite/userapi/storage/devices" "github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/util" ) @@ -57,7 +57,7 @@ func passwordLogin() flows { // Login implements GET and POST /login func Login( - req *http.Request, accountDB accounts.Database, deviceDB devices.Database, + req *http.Request, accountDB accounts.Database, userAPI userapi.UserInternalAPI, cfg *config.Dendrite, ) util.JSONResponse { if req.Method == http.MethodGet { @@ -81,7 +81,7 @@ func Login( return *authErr } // make a device/access token - return completeAuth(req.Context(), cfg.Matrix.ServerName, deviceDB, login) + return completeAuth(req.Context(), cfg.Matrix.ServerName, userAPI, login) } return util.JSONResponse{ Code: http.StatusMethodNotAllowed, @@ -90,7 +90,7 @@ func Login( } func completeAuth( - ctx context.Context, serverName gomatrixserverlib.ServerName, deviceDB devices.Database, login *auth.Login, + ctx context.Context, serverName gomatrixserverlib.ServerName, userAPI userapi.UserInternalAPI, login *auth.Login, ) util.JSONResponse { token, err := auth.GenerateAccessToken() if err != nil { @@ -104,9 +104,13 @@ func completeAuth( return jsonerror.InternalServerError() } - dev, err := deviceDB.CreateDevice( - ctx, localpart, login.DeviceID, token, login.InitialDisplayName, - ) + var performRes userapi.PerformDeviceCreationResponse + err = userAPI.PerformDeviceCreation(ctx, &userapi.PerformDeviceCreationRequest{ + DeviceDisplayName: login.InitialDisplayName, + DeviceID: login.DeviceID, + AccessToken: token, + Localpart: localpart, + }, &performRes) if err != nil { return util.JSONResponse{ Code: http.StatusInternalServerError, @@ -117,10 +121,10 @@ func completeAuth( return util.JSONResponse{ Code: http.StatusOK, JSON: loginResponse{ - UserID: dev.UserID, - AccessToken: dev.AccessToken, + UserID: performRes.Device.UserID, + AccessToken: performRes.Device.AccessToken, HomeServer: serverName, - DeviceID: dev.ID, + DeviceID: performRes.Device.ID, }, } } diff --git a/clientapi/routing/routing.go b/clientapi/routing/routing.go index 6c40db865..2d992392f 100644 --- a/clientapi/routing/routing.go +++ b/clientapi/routing/routing.go @@ -387,7 +387,7 @@ func Setup( r0mux.Handle("/login", httputil.MakeExternalAPI("login", func(req *http.Request) util.JSONResponse { - return Login(req, accountDB, deviceDB, cfg) + return Login(req, accountDB, userAPI, cfg) }), ).Methods(http.MethodGet, http.MethodPost, http.MethodOptions) diff --git a/sytest-whitelist b/sytest-whitelist index c90bcc3ad..342ed9195 100644 --- a/sytest-whitelist +++ b/sytest-whitelist @@ -131,6 +131,8 @@ Local device key changes appear in v2 /sync Local device key changes appear in /keys/changes New users appear in /keys/changes Local delete device changes appear in v2 /sync +Local new device changes appear in v2 /sync +Users receive device_list updates for their own devices Get left notifs for other users in sync and /keys/changes when user leaves Can add account data Can add account data to room diff --git a/userapi/internal/api.go b/userapi/internal/api.go index 738023dd6..5de308166 100644 --- a/userapi/internal/api.go +++ b/userapi/internal/api.go @@ -104,7 +104,8 @@ func (a *UserInternalAPI) PerformDeviceCreation(ctx context.Context, req *api.Pe } res.DeviceCreated = true res.Device = dev - return nil + // create empty device keys and upload them to trigger device list changes + return a.deviceListUpdate(dev.UserID, []string{dev.ID}) } func (a *UserInternalAPI) PerformDeviceDeletion(ctx context.Context, req *api.PerformDeviceDeletionRequest, res *api.PerformDeviceDeletionResponse) error { @@ -121,10 +122,14 @@ func (a *UserInternalAPI) PerformDeviceDeletion(ctx context.Context, req *api.Pe return err } // create empty device keys and upload them to delete what was once there and trigger device list changes - deviceKeys := make([]keyapi.DeviceKeys, len(req.DeviceIDs)) - for i, did := range req.DeviceIDs { + return a.deviceListUpdate(req.UserID, req.DeviceIDs) +} + +func (a *UserInternalAPI) deviceListUpdate(userID string, deviceIDs []string) error { + deviceKeys := make([]keyapi.DeviceKeys, len(deviceIDs)) + for i, did := range deviceIDs { deviceKeys[i] = keyapi.DeviceKeys{ - UserID: req.UserID, + UserID: userID, DeviceID: did, KeyJSON: nil, }