aboutsummaryrefslogtreecommitdiff
path: root/clientapi
diff options
context:
space:
mode:
authorTill <2353100+S7evinK@users.noreply.github.com>2023-04-03 20:19:26 +0200
committerGitHub <noreply@github.com>2023-04-03 20:19:26 +0200
commitc2db38d2954b8d5d1944b64671985d5ffd3b5c28 (patch)
tree7199fa013869cd7298562d75f6e94f8321da8a15 /clientapi
parent4cb9cd7842e58b542b25a2e9d7cdb7f61d147e96 (diff)
Add user profile tests, refactor user API methods (#3030)
This adds tests for `/profile`. Also, as a first change in this regard, refactors the methods defined on the `UserInternalAPI` to not use structs as the request/response parameters.
Diffstat (limited to 'clientapi')
-rw-r--r--clientapi/admin_test.go19
-rw-r--r--clientapi/clientapi_test.go235
-rw-r--r--clientapi/routing/joinroom.go27
-rw-r--r--clientapi/routing/profile.go87
-rw-r--r--clientapi/routing/register.go8
-rw-r--r--clientapi/routing/register_test.go12
-rw-r--r--clientapi/routing/server_notices.go30
-rw-r--r--clientapi/threepid/invites.go11
8 files changed, 318 insertions, 111 deletions
diff --git a/clientapi/admin_test.go b/clientapi/admin_test.go
index 79e88d13..ca78f32e 100644
--- a/clientapi/admin_test.go
+++ b/clientapi/admin_test.go
@@ -261,6 +261,25 @@ func TestAdminEvacuateRoom(t *testing.T) {
}
})
}
+
+ // Wait for the FS API to have consumed every message
+ js, _ := natsInstance.Prepare(processCtx, &cfg.Global.JetStream)
+ timeout := time.After(time.Second)
+ for {
+ select {
+ case <-timeout:
+ t.Fatalf("FS API didn't process all events in time")
+ default:
+ }
+ info, err := js.ConsumerInfo(cfg.Global.JetStream.Prefixed(jetstream.OutputRoomEvent), cfg.Global.JetStream.Durable("FederationAPIRoomServerConsumer")+"Pull")
+ if err != nil {
+ time.Sleep(time.Millisecond * 10)
+ continue
+ }
+ if info.NumPending == 0 && info.NumAckPending == 0 {
+ break
+ }
+ }
})
}
diff --git a/clientapi/clientapi_test.go b/clientapi/clientapi_test.go
index d9091552..2168a2b3 100644
--- a/clientapi/clientapi_test.go
+++ b/clientapi/clientapi_test.go
@@ -4,25 +4,30 @@ import (
"bytes"
"context"
"encoding/json"
+ "fmt"
+ "io"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
+ "github.com/matrix-org/gomatrixserverlib"
+ "github.com/matrix-org/util"
+ "github.com/tidwall/gjson"
+
+ "github.com/matrix-org/dendrite/appservice"
"github.com/matrix-org/dendrite/clientapi/auth/authtypes"
"github.com/matrix-org/dendrite/internal/caching"
"github.com/matrix-org/dendrite/internal/httputil"
"github.com/matrix-org/dendrite/internal/sqlutil"
"github.com/matrix-org/dendrite/roomserver"
+ "github.com/matrix-org/dendrite/setup/base"
"github.com/matrix-org/dendrite/setup/jetstream"
"github.com/matrix-org/dendrite/test"
"github.com/matrix-org/dendrite/test/testrig"
"github.com/matrix-org/dendrite/userapi"
uapi "github.com/matrix-org/dendrite/userapi/api"
- "github.com/matrix-org/gomatrixserverlib"
- "github.com/matrix-org/util"
- "github.com/tidwall/gjson"
)
type userDevice struct {
@@ -371,3 +376,227 @@ func createAccessTokens(t *testing.T, accessTokens map[*test.User]userDevice, us
}
}
}
+
+func TestSetDisplayname(t *testing.T) {
+ alice := test.NewUser(t)
+ bob := test.NewUser(t)
+ notLocalUser := &test.User{ID: "@charlie:localhost", Localpart: "charlie"}
+ changeDisplayName := "my new display name"
+
+ testCases := []struct {
+ name string
+ user *test.User
+ wantOK bool
+ changeReq io.Reader
+ wantDisplayName string
+ }{
+ {
+ name: "invalid user",
+ user: &test.User{ID: "!notauser"},
+ },
+ {
+ name: "non-existent user",
+ user: &test.User{ID: "@doesnotexist:test"},
+ },
+ {
+ name: "non-local user is not allowed",
+ user: notLocalUser,
+ },
+ {
+ name: "existing user is allowed to change own name",
+ user: alice,
+ wantOK: true,
+ wantDisplayName: changeDisplayName,
+ },
+ {
+ name: "existing user is not allowed to change own name if name is empty",
+ user: bob,
+ wantOK: false,
+ wantDisplayName: "",
+ },
+ }
+
+ test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) {
+ cfg, processCtx, closeDB := testrig.CreateConfig(t, dbType)
+ defer closeDB()
+ caches := caching.NewRistrettoCache(128*1024*1024, time.Hour, caching.DisableMetrics)
+ routers := httputil.NewRouters()
+ cm := sqlutil.NewConnectionManager(processCtx, cfg.Global.DatabaseOptions)
+ natsInstance := &jetstream.NATSInstance{}
+
+ rsAPI := roomserver.NewInternalAPI(processCtx, cfg, cm, natsInstance, caches, caching.DisableMetrics)
+ rsAPI.SetFederationAPI(nil, nil)
+ userAPI := userapi.NewInternalAPI(processCtx, cfg, cm, natsInstance, rsAPI, nil)
+ asPI := appservice.NewInternalAPI(processCtx, cfg, natsInstance, userAPI, rsAPI)
+
+ AddPublicRoutes(processCtx, routers, cfg, natsInstance, base.CreateFederationClient(cfg, nil), rsAPI, asPI, nil, nil, userAPI, nil, nil, caching.DisableMetrics)
+
+ accessTokens := map[*test.User]userDevice{
+ alice: {},
+ bob: {},
+ }
+
+ createAccessTokens(t, accessTokens, userAPI, processCtx.Context(), routers)
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ wantDisplayName := tc.user.Localpart
+ if tc.changeReq == nil {
+ tc.changeReq = strings.NewReader("")
+ }
+
+ // check profile after initial account creation
+ rec := httptest.NewRecorder()
+ req := httptest.NewRequest(http.MethodGet, "/_matrix/client/v3/profile/"+tc.user.ID, strings.NewReader(""))
+ t.Logf("%s", req.URL.String())
+ routers.Client.ServeHTTP(rec, req)
+
+ if tc.wantOK && rec.Code != http.StatusOK {
+ t.Fatalf("expected HTTP 200, got %d", rec.Code)
+ }
+
+ if gotDisplayName := gjson.GetBytes(rec.Body.Bytes(), "displayname").Str; tc.wantOK && gotDisplayName != wantDisplayName {
+ t.Fatalf("expected displayname to be '%s', but got '%s'", wantDisplayName, gotDisplayName)
+ }
+
+ // now set the new display name
+ wantDisplayName = tc.wantDisplayName
+ tc.changeReq = strings.NewReader(fmt.Sprintf(`{"displayname":"%s"}`, tc.wantDisplayName))
+
+ rec = httptest.NewRecorder()
+ req = httptest.NewRequest(http.MethodPut, "/_matrix/client/v3/profile/"+tc.user.ID+"/displayname", tc.changeReq)
+ req.Header.Set("Authorization", "Bearer "+accessTokens[tc.user].accessToken)
+
+ routers.Client.ServeHTTP(rec, req)
+ if tc.wantOK && rec.Code != http.StatusOK {
+ t.Fatalf("expected HTTP 200, got %d: %s", rec.Code, rec.Body.String())
+ }
+
+ // now only get the display name
+ rec = httptest.NewRecorder()
+ req = httptest.NewRequest(http.MethodGet, "/_matrix/client/v3/profile/"+tc.user.ID+"/displayname", strings.NewReader(""))
+
+ routers.Client.ServeHTTP(rec, req)
+ if tc.wantOK && rec.Code != http.StatusOK {
+ t.Fatalf("expected HTTP 200, got %d: %s", rec.Code, rec.Body.String())
+ }
+
+ if gotDisplayName := gjson.GetBytes(rec.Body.Bytes(), "displayname").Str; tc.wantOK && gotDisplayName != wantDisplayName {
+ t.Fatalf("expected displayname to be '%s', but got '%s'", wantDisplayName, gotDisplayName)
+ }
+ })
+ }
+ })
+}
+
+func TestSetAvatarURL(t *testing.T) {
+ alice := test.NewUser(t)
+ bob := test.NewUser(t)
+ notLocalUser := &test.User{ID: "@charlie:localhost", Localpart: "charlie"}
+ changeDisplayName := "mxc://newMXID"
+
+ testCases := []struct {
+ name string
+ user *test.User
+ wantOK bool
+ changeReq io.Reader
+ avatar_url string
+ }{
+ {
+ name: "invalid user",
+ user: &test.User{ID: "!notauser"},
+ },
+ {
+ name: "non-existent user",
+ user: &test.User{ID: "@doesnotexist:test"},
+ },
+ {
+ name: "non-local user is not allowed",
+ user: notLocalUser,
+ },
+ {
+ name: "existing user is allowed to change own avatar",
+ user: alice,
+ wantOK: true,
+ avatar_url: changeDisplayName,
+ },
+ {
+ name: "existing user is not allowed to change own avatar if avatar is empty",
+ user: bob,
+ wantOK: false,
+ avatar_url: "",
+ },
+ }
+
+ test.WithAllDatabases(t, func(t *testing.T, dbType test.DBType) {
+ cfg, processCtx, closeDB := testrig.CreateConfig(t, dbType)
+ defer closeDB()
+ caches := caching.NewRistrettoCache(128*1024*1024, time.Hour, caching.DisableMetrics)
+ routers := httputil.NewRouters()
+ cm := sqlutil.NewConnectionManager(processCtx, cfg.Global.DatabaseOptions)
+ natsInstance := &jetstream.NATSInstance{}
+
+ rsAPI := roomserver.NewInternalAPI(processCtx, cfg, cm, natsInstance, caches, caching.DisableMetrics)
+ rsAPI.SetFederationAPI(nil, nil)
+ userAPI := userapi.NewInternalAPI(processCtx, cfg, cm, natsInstance, rsAPI, nil)
+ asPI := appservice.NewInternalAPI(processCtx, cfg, natsInstance, userAPI, rsAPI)
+
+ AddPublicRoutes(processCtx, routers, cfg, natsInstance, base.CreateFederationClient(cfg, nil), rsAPI, asPI, nil, nil, userAPI, nil, nil, caching.DisableMetrics)
+
+ accessTokens := map[*test.User]userDevice{
+ alice: {},
+ bob: {},
+ }
+
+ createAccessTokens(t, accessTokens, userAPI, processCtx.Context(), routers)
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ wantAvatarURL := ""
+ if tc.changeReq == nil {
+ tc.changeReq = strings.NewReader("")
+ }
+
+ // check profile after initial account creation
+ rec := httptest.NewRecorder()
+ req := httptest.NewRequest(http.MethodGet, "/_matrix/client/v3/profile/"+tc.user.ID, strings.NewReader(""))
+ t.Logf("%s", req.URL.String())
+ routers.Client.ServeHTTP(rec, req)
+
+ if tc.wantOK && rec.Code != http.StatusOK {
+ t.Fatalf("expected HTTP 200, got %d", rec.Code)
+ }
+
+ if gotDisplayName := gjson.GetBytes(rec.Body.Bytes(), "avatar_url").Str; tc.wantOK && gotDisplayName != wantAvatarURL {
+ t.Fatalf("expected displayname to be '%s', but got '%s'", wantAvatarURL, gotDisplayName)
+ }
+
+ // now set the new display name
+ wantAvatarURL = tc.avatar_url
+ tc.changeReq = strings.NewReader(fmt.Sprintf(`{"avatar_url":"%s"}`, tc.avatar_url))
+
+ rec = httptest.NewRecorder()
+ req = httptest.NewRequest(http.MethodPut, "/_matrix/client/v3/profile/"+tc.user.ID+"/avatar_url", tc.changeReq)
+ req.Header.Set("Authorization", "Bearer "+accessTokens[tc.user].accessToken)
+
+ routers.Client.ServeHTTP(rec, req)
+ if tc.wantOK && rec.Code != http.StatusOK {
+ t.Fatalf("expected HTTP 200, got %d: %s", rec.Code, rec.Body.String())
+ }
+
+ // now only get the display name
+ rec = httptest.NewRecorder()
+ req = httptest.NewRequest(http.MethodGet, "/_matrix/client/v3/profile/"+tc.user.ID+"/avatar_url", strings.NewReader(""))
+
+ routers.Client.ServeHTTP(rec, req)
+ if tc.wantOK && rec.Code != http.StatusOK {
+ t.Fatalf("expected HTTP 200, got %d: %s", rec.Code, rec.Body.String())
+ }
+
+ if gotDisplayName := gjson.GetBytes(rec.Body.Bytes(), "avatar_url").Str; tc.wantOK && gotDisplayName != wantAvatarURL {
+ t.Fatalf("expected displayname to be '%s', but got '%s'", wantAvatarURL, gotDisplayName)
+ }
+ })
+ }
+ })
+}
diff --git a/clientapi/routing/joinroom.go b/clientapi/routing/joinroom.go
index e371d921..3493dd6d 100644
--- a/clientapi/routing/joinroom.go
+++ b/clientapi/routing/joinroom.go
@@ -18,6 +18,7 @@ import (
"net/http"
"time"
+ appserviceAPI "github.com/matrix-org/dendrite/appservice/api"
"github.com/matrix-org/dendrite/clientapi/httputil"
"github.com/matrix-org/dendrite/clientapi/jsonerror"
roomserverAPI "github.com/matrix-org/dendrite/roomserver/api"
@@ -61,21 +62,19 @@ func JoinRoomByIDOrAlias(
// Work out our localpart for the client profile request.
// Request our profile content to populate the request content with.
- res := &api.QueryProfileResponse{}
- err := profileAPI.QueryProfile(req.Context(), &api.QueryProfileRequest{UserID: device.UserID}, res)
- if err != nil || !res.UserExists {
- if !res.UserExists {
- util.GetLogger(req.Context()).Error("Unable to query user profile, no profile found.")
- return util.JSONResponse{
- Code: http.StatusInternalServerError,
- JSON: jsonerror.Unknown("Unable to query user profile, no profile found."),
- }
- }
+ profile, err := profileAPI.QueryProfile(req.Context(), device.UserID)
- util.GetLogger(req.Context()).WithError(err).Error("UserProfileAPI.QueryProfile failed")
- } else {
- joinReq.Content["displayname"] = res.DisplayName
- joinReq.Content["avatar_url"] = res.AvatarURL
+ switch err {
+ case nil:
+ joinReq.Content["displayname"] = profile.DisplayName
+ joinReq.Content["avatar_url"] = profile.AvatarURL
+ case appserviceAPI.ErrProfileNotExists:
+ util.GetLogger(req.Context()).Error("Unable to query user profile, no profile found.")
+ return util.JSONResponse{
+ Code: http.StatusInternalServerError,
+ JSON: jsonerror.Unknown("Unable to query user profile, no profile found."),
+ }
+ default:
}
// Ask the roomserver to perform the join.
diff --git a/clientapi/routing/profile.go b/clientapi/routing/profile.go
index 92a75fc7..ab0fd990 100644
--- a/clientapi/routing/profile.go
+++ b/clientapi/routing/profile.go
@@ -36,14 +36,14 @@ import (
// GetProfile implements GET /profile/{userID}
func GetProfile(
- req *http.Request, profileAPI userapi.ClientUserAPI, cfg *config.ClientAPI,
+ req *http.Request, profileAPI userapi.ProfileAPI, cfg *config.ClientAPI,
userID string,
asAPI appserviceAPI.AppServiceInternalAPI,
federation *gomatrixserverlib.FederationClient,
) util.JSONResponse {
profile, err := getProfile(req.Context(), profileAPI, cfg, userID, asAPI, federation)
if err != nil {
- if err == eventutil.ErrProfileNoExists {
+ if err == appserviceAPI.ErrProfileNotExists {
return util.JSONResponse{
Code: http.StatusNotFound,
JSON: jsonerror.NotFound("The user does not exist or does not have a profile"),
@@ -56,7 +56,7 @@ func GetProfile(
return util.JSONResponse{
Code: http.StatusOK,
- JSON: eventutil.ProfileResponse{
+ JSON: eventutil.UserProfile{
AvatarURL: profile.AvatarURL,
DisplayName: profile.DisplayName,
},
@@ -65,34 +65,28 @@ func GetProfile(
// GetAvatarURL implements GET /profile/{userID}/avatar_url
func GetAvatarURL(
- req *http.Request, profileAPI userapi.ClientUserAPI, cfg *config.ClientAPI,
+ req *http.Request, profileAPI userapi.ProfileAPI, cfg *config.ClientAPI,
userID string, asAPI appserviceAPI.AppServiceInternalAPI,
federation *gomatrixserverlib.FederationClient,
) util.JSONResponse {
- profile, err := getProfile(req.Context(), profileAPI, cfg, userID, asAPI, federation)
- if err != nil {
- if err == eventutil.ErrProfileNoExists {
- return util.JSONResponse{
- Code: http.StatusNotFound,
- JSON: jsonerror.NotFound("The user does not exist or does not have a profile"),
- }
- }
-
- util.GetLogger(req.Context()).WithError(err).Error("getProfile failed")
- return jsonerror.InternalServerError()
+ profile := GetProfile(req, profileAPI, cfg, userID, asAPI, federation)
+ p, ok := profile.JSON.(eventutil.UserProfile)
+ // not a profile response, so most likely an error, return that
+ if !ok {
+ return profile
}
return util.JSONResponse{
Code: http.StatusOK,
- JSON: eventutil.AvatarURL{
- AvatarURL: profile.AvatarURL,
+ JSON: eventutil.UserProfile{
+ AvatarURL: p.AvatarURL,
},
}
}
// SetAvatarURL implements PUT /profile/{userID}/avatar_url
func SetAvatarURL(
- req *http.Request, profileAPI userapi.ClientUserAPI,
+ req *http.Request, profileAPI userapi.ProfileAPI,
device *userapi.Device, userID string, cfg *config.ClientAPI, rsAPI api.ClientRoomserverAPI,
) util.JSONResponse {
if userID != device.UserID {
@@ -102,7 +96,7 @@ func SetAvatarURL(
}
}
- var r eventutil.AvatarURL
+ var r eventutil.UserProfile
if resErr := httputil.UnmarshalJSONRequest(req, &r); resErr != nil {
return *resErr
}
@@ -134,24 +128,20 @@ func SetAvatarURL(
}
}
- setRes := &userapi.PerformSetAvatarURLResponse{}
- if err = profileAPI.SetAvatarURL(req.Context(), &userapi.PerformSetAvatarURLRequest{
- Localpart: localpart,
- ServerName: domain,
- AvatarURL: r.AvatarURL,
- }, setRes); err != nil {
+ profile, changed, err := profileAPI.SetAvatarURL(req.Context(), localpart, domain, r.AvatarURL)
+ if err != nil {
util.GetLogger(req.Context()).WithError(err).Error("profileAPI.SetAvatarURL failed")
return jsonerror.InternalServerError()
}
// No need to build new membership events, since nothing changed
- if !setRes.Changed {
+ if !changed {
return util.JSONResponse{
Code: http.StatusOK,
JSON: struct{}{},
}
}
- response, err := updateProfile(req.Context(), rsAPI, device, setRes.Profile, userID, cfg, evTime)
+ response, err := updateProfile(req.Context(), rsAPI, device, profile, userID, cfg, evTime)
if err != nil {
return response
}
@@ -164,34 +154,28 @@ func SetAvatarURL(
// GetDisplayName implements GET /profile/{userID}/displayname
func GetDisplayName(
- req *http.Request, profileAPI userapi.ClientUserAPI, cfg *config.ClientAPI,
+ req *http.Request, profileAPI userapi.ProfileAPI, cfg *config.ClientAPI,
userID string, asAPI appserviceAPI.AppServiceInternalAPI,
federation *gomatrixserverlib.FederationClient,
) util.JSONResponse {
- profile, err := getProfile(req.Context(), profileAPI, cfg, userID, asAPI, federation)
- if err != nil {
- if err == eventutil.ErrProfileNoExists {
- return util.JSONResponse{
- Code: http.StatusNotFound,
- JSON: jsonerror.NotFound("The user does not exist or does not have a profile"),
- }
- }
-
- util.GetLogger(req.Context()).WithError(err).Error("getProfile failed")
- return jsonerror.InternalServerError()
+ profile := GetProfile(req, profileAPI, cfg, userID, asAPI, federation)
+ p, ok := profile.JSON.(eventutil.UserProfile)
+ // not a profile response, so most likely an error, return that
+ if !ok {
+ return profile
}
return util.JSONResponse{
Code: http.StatusOK,
- JSON: eventutil.DisplayName{
- DisplayName: profile.DisplayName,
+ JSON: eventutil.UserProfile{
+ DisplayName: p.DisplayName,
},
}
}
// SetDisplayName implements PUT /profile/{userID}/displayname
func SetDisplayName(
- req *http.Request, profileAPI userapi.ClientUserAPI,
+ req *http.Request, profileAPI userapi.ProfileAPI,
device *userapi.Device, userID string, cfg *config.ClientAPI, rsAPI api.ClientRoomserverAPI,
) util.JSONResponse {
if userID != device.UserID {
@@ -201,7 +185,7 @@ func SetDisplayName(
}
}
- var r eventutil.DisplayName
+ var r eventutil.UserProfile
if resErr := httputil.UnmarshalJSONRequest(req, &r); resErr != nil {
return *resErr
}
@@ -233,25 +217,20 @@ func SetDisplayName(
}
}
- profileRes := &userapi.PerformUpdateDisplayNameResponse{}
- err = profileAPI.SetDisplayName(req.Context(), &userapi.PerformUpdateDisplayNameRequest{
- Localpart: localpart,
- ServerName: domain,
- DisplayName: r.DisplayName,
- }, profileRes)
+ profile, changed, err := profileAPI.SetDisplayName(req.Context(), localpart, domain, r.DisplayName)
if err != nil {
util.GetLogger(req.Context()).WithError(err).Error("profileAPI.SetDisplayName failed")
return jsonerror.InternalServerError()
}
// No need to build new membership events, since nothing changed
- if !profileRes.Changed {
+ if !changed {
return util.JSONResponse{
Code: http.StatusOK,
JSON: struct{}{},
}
}
- response, err := updateProfile(req.Context(), rsAPI, device, profileRes.Profile, userID, cfg, evTime)
+ response, err := updateProfile(req.Context(), rsAPI, device, profile, userID, cfg, evTime)
if err != nil {
return response
}
@@ -308,9 +287,9 @@ func updateProfile(
// getProfile gets the full profile of a user by querying the database or a
// remote homeserver.
// Returns an error when something goes wrong or specifically
-// eventutil.ErrProfileNoExists when the profile doesn't exist.
+// eventutil.ErrProfileNotExists when the profile doesn't exist.
func getProfile(
- ctx context.Context, profileAPI userapi.ClientUserAPI, cfg *config.ClientAPI,
+ ctx context.Context, profileAPI userapi.ProfileAPI, cfg *config.ClientAPI,
userID string,
asAPI appserviceAPI.AppServiceInternalAPI,
federation *gomatrixserverlib.FederationClient,
@@ -325,7 +304,7 @@ func getProfile(
if fedErr != nil {
if x, ok := fedErr.(gomatrix.HTTPError); ok {
if x.Code == http.StatusNotFound {
- return nil, eventutil.ErrProfileNoExists
+ return nil, appserviceAPI.ErrProfileNotExists
}
}
diff --git a/clientapi/routing/register.go b/clientapi/routing/register.go
index ff6a0900..d880961f 100644
--- a/clientapi/routing/register.go
+++ b/clientapi/routing/register.go
@@ -888,13 +888,7 @@ func completeRegistration(
}
if displayName != "" {
- nameReq := userapi.PerformUpdateDisplayNameRequest{
- Localpart: username,
- ServerName: serverName,
- DisplayName: displayName,
- }
- var nameRes userapi.PerformUpdateDisplayNameResponse
- err = userAPI.SetDisplayName(ctx, &nameReq, &nameRes)
+ _, _, err = userAPI.SetDisplayName(ctx, username, serverName, displayName)
if err != nil {
return util.JSONResponse{
Code: http.StatusInternalServerError,
diff --git a/clientapi/routing/register_test.go b/clientapi/routing/register_test.go
index 46cd8b2b..b07f636d 100644
--- a/clientapi/routing/register_test.go
+++ b/clientapi/routing/register_test.go
@@ -611,11 +611,9 @@ func TestRegisterUserWithDisplayName(t *testing.T) {
assert.Equal(t, http.StatusOK, response.Code)
- req := api.QueryProfileRequest{UserID: "@user:server"}
- var res api.QueryProfileResponse
- err := userAPI.QueryProfile(processCtx.Context(), &req, &res)
+ profile, err := userAPI.QueryProfile(processCtx.Context(), "@user:server")
assert.NoError(t, err)
- assert.Equal(t, expectedDisplayName, res.DisplayName)
+ assert.Equal(t, expectedDisplayName, profile.DisplayName)
})
}
@@ -662,10 +660,8 @@ func TestRegisterAdminUsingSharedSecret(t *testing.T) {
)
assert.Equal(t, http.StatusOK, response.Code)
- profilReq := api.QueryProfileRequest{UserID: "@alice:server"}
- var profileRes api.QueryProfileResponse
- err = userAPI.QueryProfile(processCtx.Context(), &profilReq, &profileRes)
+ profile, err := userAPI.QueryProfile(processCtx.Context(), "@alice:server")
assert.NoError(t, err)
- assert.Equal(t, expectedDisplayName, profileRes.DisplayName)
+ assert.Equal(t, expectedDisplayName, profile.DisplayName)
})
}
diff --git a/clientapi/routing/server_notices.go b/clientapi/routing/server_notices.go
index fb93d878..d6191f3b 100644
--- a/clientapi/routing/server_notices.go
+++ b/clientapi/routing/server_notices.go
@@ -295,30 +295,28 @@ func getSenderDevice(
}
// Set the avatarurl for the user
- avatarRes := &userapi.PerformSetAvatarURLResponse{}
- if err = userAPI.SetAvatarURL(ctx, &userapi.PerformSetAvatarURLRequest{
- Localpart: cfg.Matrix.ServerNotices.LocalPart,
- ServerName: cfg.Matrix.ServerName,
- AvatarURL: cfg.Matrix.ServerNotices.AvatarURL,
- }, avatarRes); err != nil {
+ profile, avatarChanged, err := userAPI.SetAvatarURL(ctx,
+ cfg.Matrix.ServerNotices.LocalPart,
+ cfg.Matrix.ServerName,
+ cfg.Matrix.ServerNotices.AvatarURL,
+ )
+ if err != nil {
util.GetLogger(ctx).WithError(err).Error("userAPI.SetAvatarURL failed")
return nil, err
}
- profile := avatarRes.Profile
-
// Set the displayname for the user
- displayNameRes := &userapi.PerformUpdateDisplayNameResponse{}
- if err = userAPI.SetDisplayName(ctx, &userapi.PerformUpdateDisplayNameRequest{
- Localpart: cfg.Matrix.ServerNotices.LocalPart,
- ServerName: cfg.Matrix.ServerName,
- DisplayName: cfg.Matrix.ServerNotices.DisplayName,
- }, displayNameRes); err != nil {
+ _, displayNameChanged, err := userAPI.SetDisplayName(ctx,
+ cfg.Matrix.ServerNotices.LocalPart,
+ cfg.Matrix.ServerName,
+ cfg.Matrix.ServerNotices.DisplayName,
+ )
+ if err != nil {
util.GetLogger(ctx).WithError(err).Error("userAPI.SetDisplayName failed")
return nil, err
}
- if displayNameRes.Changed {
+ if displayNameChanged {
profile.DisplayName = cfg.Matrix.ServerNotices.DisplayName
}
@@ -334,7 +332,7 @@ func getSenderDevice(
// We've got an existing account, return the first device of it
if len(deviceRes.Devices) > 0 {
// If there were changes to the profile, create a new membership event
- if displayNameRes.Changed || avatarRes.Changed {
+ if displayNameChanged || avatarChanged {
_, err = updateProfile(ctx, rsAPI, &deviceRes.Devices[0], profile, accRes.Account.UserID, cfg, time.Now())
if err != nil {
return nil, err
diff --git a/clientapi/threepid/invites.go b/clientapi/threepid/invites.go
index 1f294a03..a9910b78 100644
--- a/clientapi/threepid/invites.go
+++ b/clientapi/threepid/invites.go
@@ -209,24 +209,17 @@ func queryIDServerStoreInvite(
body *MembershipRequest, roomID string,
) (*idServerStoreInviteResponse, error) {
// Retrieve the sender's profile to get their display name
- localpart, serverName, err := gomatrixserverlib.SplitID('@', device.UserID)
+ _, serverName, err := gomatrixserverlib.SplitID('@', device.UserID)
if err != nil {
return nil, err
}
var profile *authtypes.Profile
if cfg.Matrix.IsLocalServerName(serverName) {
- res := &userapi.QueryProfileResponse{}
- err = userAPI.QueryProfile(ctx, &userapi.QueryProfileRequest{UserID: device.UserID}, res)
+ profile, err = userAPI.QueryProfile(ctx, device.UserID)
if err != nil {
return nil, err
}
- profile = &authtypes.Profile{
- Localpart: localpart,
- DisplayName: res.DisplayName,
- AvatarURL: res.AvatarURL,
- }
-
} else {
profile = &authtypes.Profile{}
}