aboutsummaryrefslogtreecommitdiff
path: root/userapi
diff options
context:
space:
mode:
authorS7evinK <2353100+S7evinK@users.noreply.github.com>2022-03-24 22:45:44 +0100
committerGitHub <noreply@github.com>2022-03-24 22:45:44 +0100
commitf2e550efd832662e6c032bebfef4a68da0b4c8ee (patch)
treef46d0e82f85f0e30687fe568a26c0923e8f14a83 /userapi
parent8e76523b04e3ebc9546f2b019e86dcd3b516be5a (diff)
Refactor appservice & client API to use userapi internal (#2290)
* Refactor user api internal * Refactor clientapi to use internal userapi * Use internal userapi instead of user DB directly * Remove AccountDB dependency * Fix linter issues Co-authored-by: Neil Alexander <neilalexander@users.noreply.github.com>
Diffstat (limited to 'userapi')
-rw-r--r--userapi/api/api.go93
-rw-r--r--userapi/api/api_trace.go54
-rw-r--r--userapi/internal/api.go68
-rw-r--r--userapi/inthttp/client.go129
-rw-r--r--userapi/inthttp/server.go97
-rw-r--r--userapi/storage/interface.go10
6 files changed, 418 insertions, 33 deletions
diff --git a/userapi/api/api.go b/userapi/api/api.go
index e9cdbe01..513a060c 100644
--- a/userapi/api/api.go
+++ b/userapi/api/api.go
@@ -27,16 +27,16 @@ import (
// UserInternalAPI is the internal API for information about users and devices.
type UserInternalAPI interface {
LoginTokenInternalAPI
+ UserProfileAPI
+ UserRegisterAPI
+ UserAccountAPI
+ UserThreePIDAPI
InputAccountData(ctx context.Context, req *InputAccountDataRequest, res *InputAccountDataResponse) error
- PerformAccountCreation(ctx context.Context, req *PerformAccountCreationRequest, res *PerformAccountCreationResponse) error
- PerformPasswordUpdate(ctx context.Context, req *PerformPasswordUpdateRequest, res *PerformPasswordUpdateResponse) error
- PerformDeviceCreation(ctx context.Context, req *PerformDeviceCreationRequest, res *PerformDeviceCreationResponse) error
PerformDeviceDeletion(ctx context.Context, req *PerformDeviceDeletionRequest, res *PerformDeviceDeletionResponse) error
PerformLastSeenUpdate(ctx context.Context, req *PerformLastSeenUpdateRequest, res *PerformLastSeenUpdateResponse) error
PerformDeviceUpdate(ctx context.Context, req *PerformDeviceUpdateRequest, res *PerformDeviceUpdateResponse) error
- PerformAccountDeactivation(ctx context.Context, req *PerformAccountDeactivationRequest, res *PerformAccountDeactivationResponse) error
PerformOpenIDTokenCreation(ctx context.Context, req *PerformOpenIDTokenCreationRequest, res *PerformOpenIDTokenCreationResponse) error
PerformKeyBackup(ctx context.Context, req *PerformKeyBackupRequest, res *PerformKeyBackupResponse) error
PerformPusherSet(ctx context.Context, req *PerformPusherSetRequest, res *struct{}) error
@@ -44,18 +44,47 @@ type UserInternalAPI interface {
PerformPushRulesPut(ctx context.Context, req *PerformPushRulesPutRequest, res *struct{}) error
QueryKeyBackup(ctx context.Context, req *QueryKeyBackupRequest, res *QueryKeyBackupResponse)
- QueryProfile(ctx context.Context, req *QueryProfileRequest, res *QueryProfileResponse) error
QueryAccessToken(ctx context.Context, req *QueryAccessTokenRequest, res *QueryAccessTokenResponse) error
QueryDevices(ctx context.Context, req *QueryDevicesRequest, res *QueryDevicesResponse) error
QueryAccountData(ctx context.Context, req *QueryAccountDataRequest, res *QueryAccountDataResponse) error
QueryDeviceInfos(ctx context.Context, req *QueryDeviceInfosRequest, res *QueryDeviceInfosResponse) error
- QuerySearchProfiles(ctx context.Context, req *QuerySearchProfilesRequest, res *QuerySearchProfilesResponse) error
QueryOpenIDToken(ctx context.Context, req *QueryOpenIDTokenRequest, res *QueryOpenIDTokenResponse) error
QueryPushers(ctx context.Context, req *QueryPushersRequest, res *QueryPushersResponse) error
QueryPushRules(ctx context.Context, req *QueryPushRulesRequest, res *QueryPushRulesResponse) error
QueryNotifications(ctx context.Context, req *QueryNotificationsRequest, res *QueryNotificationsResponse) error
}
+// UserProfileAPI provides functions for getting user profiles
+type UserProfileAPI interface {
+ QueryProfile(ctx context.Context, req *QueryProfileRequest, res *QueryProfileResponse) error
+ QuerySearchProfiles(ctx context.Context, req *QuerySearchProfilesRequest, res *QuerySearchProfilesResponse) error
+ SetAvatarURL(ctx context.Context, req *PerformSetAvatarURLRequest, res *PerformSetAvatarURLResponse) error
+ SetDisplayName(ctx context.Context, req *PerformUpdateDisplayNameRequest, res *struct{}) error
+}
+
+// UserRegisterAPI defines functions for registering accounts
+type UserRegisterAPI interface {
+ QueryNumericLocalpart(ctx context.Context, res *QueryNumericLocalpartResponse) error
+ QueryAccountAvailability(ctx context.Context, req *QueryAccountAvailabilityRequest, res *QueryAccountAvailabilityResponse) error
+ PerformAccountCreation(ctx context.Context, req *PerformAccountCreationRequest, res *PerformAccountCreationResponse) error
+ PerformDeviceCreation(ctx context.Context, req *PerformDeviceCreationRequest, res *PerformDeviceCreationResponse) error
+}
+
+// UserAccountAPI defines functions for changing an account
+type UserAccountAPI interface {
+ PerformPasswordUpdate(ctx context.Context, req *PerformPasswordUpdateRequest, res *PerformPasswordUpdateResponse) error
+ PerformAccountDeactivation(ctx context.Context, req *PerformAccountDeactivationRequest, res *PerformAccountDeactivationResponse) error
+ QueryAccountByPassword(ctx context.Context, req *QueryAccountByPasswordRequest, res *QueryAccountByPasswordResponse) error
+}
+
+// UserThreePIDAPI defines functions for 3PID
+type UserThreePIDAPI interface {
+ QueryLocalpartForThreePID(ctx context.Context, req *QueryLocalpartForThreePIDRequest, res *QueryLocalpartForThreePIDResponse) error
+ QueryThreePIDsForLocalpart(ctx context.Context, req *QueryThreePIDsForLocalpartRequest, res *QueryThreePIDsForLocalpartResponse) error
+ PerformForgetThreePID(ctx context.Context, req *PerformForgetThreePIDRequest, res *struct{}) error
+ PerformSaveThreePIDAssociation(ctx context.Context, req *PerformSaveThreePIDAssociationRequest, res *struct{}) error
+}
+
type PerformKeyBackupRequest struct {
UserID string
Version string // optional if modifying a key backup
@@ -507,3 +536,55 @@ type Notification struct {
RoomID string `json:"room_id"` // Required.
TS gomatrixserverlib.Timestamp `json:"ts"` // Required.
}
+
+type PerformSetAvatarURLRequest struct {
+ Localpart, AvatarURL string
+}
+type PerformSetAvatarURLResponse struct{}
+
+type QueryNumericLocalpartResponse struct {
+ ID int64
+}
+
+type QueryAccountAvailabilityRequest struct {
+ Localpart string
+}
+
+type QueryAccountAvailabilityResponse struct {
+ Available bool
+}
+
+type QueryAccountByPasswordRequest struct {
+ Localpart, PlaintextPassword string
+}
+
+type QueryAccountByPasswordResponse struct {
+ Account *Account
+ Exists bool
+}
+
+type PerformUpdateDisplayNameRequest struct {
+ Localpart, DisplayName string
+}
+
+type QueryLocalpartForThreePIDRequest struct {
+ ThreePID, Medium string
+}
+
+type QueryLocalpartForThreePIDResponse struct {
+ Localpart string
+}
+
+type QueryThreePIDsForLocalpartRequest struct {
+ Localpart string
+}
+
+type QueryThreePIDsForLocalpartResponse struct {
+ ThreePIDs []authtypes.ThreePID
+}
+
+type PerformForgetThreePIDRequest QueryLocalpartForThreePIDRequest
+
+type PerformSaveThreePIDAssociationRequest struct {
+ ThreePID, Localpart, Medium string
+}
diff --git a/userapi/api/api_trace.go b/userapi/api/api_trace.go
index 9334f445..6d8d2800 100644
--- a/userapi/api/api_trace.go
+++ b/userapi/api/api_trace.go
@@ -149,6 +149,60 @@ func (t *UserInternalAPITrace) QueryNotifications(ctx context.Context, req *Quer
return err
}
+func (t *UserInternalAPITrace) SetAvatarURL(ctx context.Context, req *PerformSetAvatarURLRequest, res *PerformSetAvatarURLResponse) error {
+ err := t.Impl.SetAvatarURL(ctx, req, res)
+ util.GetLogger(ctx).Infof("SetAvatarURL req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) QueryNumericLocalpart(ctx context.Context, res *QueryNumericLocalpartResponse) error {
+ err := t.Impl.QueryNumericLocalpart(ctx, res)
+ util.GetLogger(ctx).Infof("QueryNumericLocalpart req= res=%+v", js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) QueryAccountAvailability(ctx context.Context, req *QueryAccountAvailabilityRequest, res *QueryAccountAvailabilityResponse) error {
+ err := t.Impl.QueryAccountAvailability(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryAccountAvailability req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) SetDisplayName(ctx context.Context, req *PerformUpdateDisplayNameRequest, res *struct{}) error {
+ err := t.Impl.SetDisplayName(ctx, req, res)
+ util.GetLogger(ctx).Infof("SetDisplayName req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) QueryAccountByPassword(ctx context.Context, req *QueryAccountByPasswordRequest, res *QueryAccountByPasswordResponse) error {
+ err := t.Impl.QueryAccountByPassword(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryAccountByPassword req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) QueryLocalpartForThreePID(ctx context.Context, req *QueryLocalpartForThreePIDRequest, res *QueryLocalpartForThreePIDResponse) error {
+ err := t.Impl.QueryLocalpartForThreePID(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryLocalpartForThreePID req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) QueryThreePIDsForLocalpart(ctx context.Context, req *QueryThreePIDsForLocalpartRequest, res *QueryThreePIDsForLocalpartResponse) error {
+ err := t.Impl.QueryThreePIDsForLocalpart(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryThreePIDsForLocalpart req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) PerformForgetThreePID(ctx context.Context, req *PerformForgetThreePIDRequest, res *struct{}) error {
+ err := t.Impl.PerformForgetThreePID(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformForgetThreePID req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) PerformSaveThreePIDAssociation(ctx context.Context, req *PerformSaveThreePIDAssociationRequest, res *struct{}) error {
+ err := t.Impl.PerformSaveThreePIDAssociation(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformSaveThreePIDAssociation req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
func js(thing interface{}) string {
b, err := json.Marshal(thing)
if err != nil {
diff --git a/userapi/internal/api.go b/userapi/internal/api.go
index 7a42fc60..afe57da2 100644
--- a/userapi/internal/api.go
+++ b/userapi/internal/api.go
@@ -26,6 +26,7 @@ import (
"github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/util"
"github.com/sirupsen/logrus"
+ "golang.org/x/crypto/bcrypt"
"github.com/matrix-org/dendrite/appservice/types"
"github.com/matrix-org/dendrite/clientapi/userutil"
@@ -761,4 +762,71 @@ func (a *UserInternalAPI) QueryPushRules(ctx context.Context, req *api.QueryPush
return nil
}
+func (a *UserInternalAPI) SetAvatarURL(ctx context.Context, req *api.PerformSetAvatarURLRequest, res *api.PerformSetAvatarURLResponse) error {
+ return a.DB.SetAvatarURL(ctx, req.Localpart, req.AvatarURL)
+}
+
+func (a *UserInternalAPI) QueryNumericLocalpart(ctx context.Context, res *api.QueryNumericLocalpartResponse) error {
+ id, err := a.DB.GetNewNumericLocalpart(ctx)
+ if err != nil {
+ return err
+ }
+ res.ID = id
+ return nil
+}
+
+func (a *UserInternalAPI) QueryAccountAvailability(ctx context.Context, req *api.QueryAccountAvailabilityRequest, res *api.QueryAccountAvailabilityResponse) error {
+ _, err := a.DB.CheckAccountAvailability(ctx, req.Localpart)
+ if err == sql.ErrNoRows {
+ res.Available = true
+ return nil
+ }
+ res.Available = false
+ return err
+}
+
+func (a *UserInternalAPI) QueryAccountByPassword(ctx context.Context, req *api.QueryAccountByPasswordRequest, res *api.QueryAccountByPasswordResponse) error {
+ acc, err := a.DB.GetAccountByPassword(ctx, req.Localpart, req.PlaintextPassword)
+ switch err {
+ case sql.ErrNoRows: // user does not exist
+ return nil
+ case bcrypt.ErrMismatchedHashAndPassword: // user exists, but password doesn't match
+ return nil
+ default:
+ res.Exists = true
+ res.Account = acc
+ return nil
+ }
+}
+
+func (a *UserInternalAPI) SetDisplayName(ctx context.Context, req *api.PerformUpdateDisplayNameRequest, _ *struct{}) error {
+ return a.DB.SetDisplayName(ctx, req.Localpart, req.DisplayName)
+}
+
+func (a *UserInternalAPI) QueryLocalpartForThreePID(ctx context.Context, req *api.QueryLocalpartForThreePIDRequest, res *api.QueryLocalpartForThreePIDResponse) error {
+ localpart, err := a.DB.GetLocalpartForThreePID(ctx, req.ThreePID, req.Medium)
+ if err != nil {
+ return err
+ }
+ res.Localpart = localpart
+ return nil
+}
+
+func (a *UserInternalAPI) QueryThreePIDsForLocalpart(ctx context.Context, req *api.QueryThreePIDsForLocalpartRequest, res *api.QueryThreePIDsForLocalpartResponse) error {
+ r, err := a.DB.GetThreePIDsForLocalpart(ctx, req.Localpart)
+ if err != nil {
+ return err
+ }
+ res.ThreePIDs = r
+ return nil
+}
+
+func (a *UserInternalAPI) PerformForgetThreePID(ctx context.Context, req *api.PerformForgetThreePIDRequest, res *struct{}) error {
+ return a.DB.RemoveThreePIDAssociation(ctx, req.ThreePID, req.Medium)
+}
+
+func (a *UserInternalAPI) PerformSaveThreePIDAssociation(ctx context.Context, req *api.PerformSaveThreePIDAssociationRequest, res *struct{}) error {
+ return a.DB.SaveThreePIDAssociation(ctx, req.ThreePID, req.Localpart, req.Medium)
+}
+
const pushRulesAccountDataType = "m.push_rules"
diff --git a/userapi/inthttp/client.go b/userapi/inthttp/client.go
index 8ec649ad..23c335cf 100644
--- a/userapi/inthttp/client.go
+++ b/userapi/inthttp/client.go
@@ -28,30 +28,39 @@ import (
const (
InputAccountDataPath = "/userapi/inputAccountData"
- PerformDeviceCreationPath = "/userapi/performDeviceCreation"
- PerformAccountCreationPath = "/userapi/performAccountCreation"
- PerformPasswordUpdatePath = "/userapi/performPasswordUpdate"
- PerformDeviceDeletionPath = "/userapi/performDeviceDeletion"
- PerformLastSeenUpdatePath = "/userapi/performLastSeenUpdate"
- PerformDeviceUpdatePath = "/userapi/performDeviceUpdate"
- PerformAccountDeactivationPath = "/userapi/performAccountDeactivation"
- PerformOpenIDTokenCreationPath = "/userapi/performOpenIDTokenCreation"
- PerformKeyBackupPath = "/userapi/performKeyBackup"
- PerformPusherSetPath = "/pushserver/performPusherSet"
- PerformPusherDeletionPath = "/pushserver/performPusherDeletion"
- PerformPushRulesPutPath = "/pushserver/performPushRulesPut"
-
- QueryKeyBackupPath = "/userapi/queryKeyBackup"
- QueryProfilePath = "/userapi/queryProfile"
- QueryAccessTokenPath = "/userapi/queryAccessToken"
- QueryDevicesPath = "/userapi/queryDevices"
- QueryAccountDataPath = "/userapi/queryAccountData"
- QueryDeviceInfosPath = "/userapi/queryDeviceInfos"
- QuerySearchProfilesPath = "/userapi/querySearchProfiles"
- QueryOpenIDTokenPath = "/userapi/queryOpenIDToken"
- QueryPushersPath = "/pushserver/queryPushers"
- QueryPushRulesPath = "/pushserver/queryPushRules"
- QueryNotificationsPath = "/pushserver/queryNotifications"
+ PerformDeviceCreationPath = "/userapi/performDeviceCreation"
+ PerformAccountCreationPath = "/userapi/performAccountCreation"
+ PerformPasswordUpdatePath = "/userapi/performPasswordUpdate"
+ PerformDeviceDeletionPath = "/userapi/performDeviceDeletion"
+ PerformLastSeenUpdatePath = "/userapi/performLastSeenUpdate"
+ PerformDeviceUpdatePath = "/userapi/performDeviceUpdate"
+ PerformAccountDeactivationPath = "/userapi/performAccountDeactivation"
+ PerformOpenIDTokenCreationPath = "/userapi/performOpenIDTokenCreation"
+ PerformKeyBackupPath = "/userapi/performKeyBackup"
+ PerformPusherSetPath = "/pushserver/performPusherSet"
+ PerformPusherDeletionPath = "/pushserver/performPusherDeletion"
+ PerformPushRulesPutPath = "/pushserver/performPushRulesPut"
+ PerformSetAvatarURLPath = "/userapi/performSetAvatarURL"
+ PerformSetDisplayNamePath = "/userapi/performSetDisplayName"
+ PerformForgetThreePIDPath = "/userapi/performForgetThreePID"
+ PerformSaveThreePIDAssociationPath = "/userapi/performSaveThreePIDAssociation"
+
+ QueryKeyBackupPath = "/userapi/queryKeyBackup"
+ QueryProfilePath = "/userapi/queryProfile"
+ QueryAccessTokenPath = "/userapi/queryAccessToken"
+ QueryDevicesPath = "/userapi/queryDevices"
+ QueryAccountDataPath = "/userapi/queryAccountData"
+ QueryDeviceInfosPath = "/userapi/queryDeviceInfos"
+ QuerySearchProfilesPath = "/userapi/querySearchProfiles"
+ QueryOpenIDTokenPath = "/userapi/queryOpenIDToken"
+ QueryPushersPath = "/pushserver/queryPushers"
+ QueryPushRulesPath = "/pushserver/queryPushRules"
+ QueryNotificationsPath = "/pushserver/queryNotifications"
+ QueryNumericLocalpartPath = "/userapi/queryNumericLocalpart"
+ QueryAccountAvailabilityPath = "/userapi/queryAccountAvailability"
+ QueryAccountByPasswordPath = "/userapi/queryAccountByPassword"
+ QueryLocalpartForThreePIDPath = "/userapi/queryLocalpartForThreePID"
+ QueryThreePIDsForLocalpartPath = "/userapi/queryThreePIDsForLocalpart"
)
// NewUserAPIClient creates a UserInternalAPI implemented by talking to a HTTP POST API.
@@ -310,3 +319,75 @@ func (h *httpUserInternalAPI) QueryPushRules(ctx context.Context, req *api.Query
apiURL := h.apiURL + QueryPushRulesPath
return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
}
+
+func (h *httpUserInternalAPI) SetAvatarURL(ctx context.Context, req *api.PerformSetAvatarURLRequest, res *api.PerformSetAvatarURLResponse) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, PerformSetAvatarURLPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + PerformSetAvatarURLPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
+
+func (h *httpUserInternalAPI) QueryNumericLocalpart(ctx context.Context, res *api.QueryNumericLocalpartResponse) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, QueryNumericLocalpartPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + QueryNumericLocalpartPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, struct{}{}, res)
+}
+
+func (h *httpUserInternalAPI) QueryAccountAvailability(ctx context.Context, req *api.QueryAccountAvailabilityRequest, res *api.QueryAccountAvailabilityResponse) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, QueryAccountAvailabilityPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + QueryAccountAvailabilityPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
+
+func (h *httpUserInternalAPI) QueryAccountByPassword(ctx context.Context, req *api.QueryAccountByPasswordRequest, res *api.QueryAccountByPasswordResponse) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, QueryAccountByPasswordPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + QueryAccountByPasswordPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
+
+func (h *httpUserInternalAPI) SetDisplayName(ctx context.Context, req *api.PerformUpdateDisplayNameRequest, res *struct{}) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, PerformSetDisplayNamePath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + PerformSetDisplayNamePath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
+
+func (h *httpUserInternalAPI) QueryLocalpartForThreePID(ctx context.Context, req *api.QueryLocalpartForThreePIDRequest, res *api.QueryLocalpartForThreePIDResponse) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, QueryLocalpartForThreePIDPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + QueryLocalpartForThreePIDPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
+
+func (h *httpUserInternalAPI) QueryThreePIDsForLocalpart(ctx context.Context, req *api.QueryThreePIDsForLocalpartRequest, res *api.QueryThreePIDsForLocalpartResponse) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, QueryThreePIDsForLocalpartPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + QueryThreePIDsForLocalpartPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
+
+func (h *httpUserInternalAPI) PerformForgetThreePID(ctx context.Context, req *api.PerformForgetThreePIDRequest, res *struct{}) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, PerformForgetThreePIDPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + PerformForgetThreePIDPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
+
+func (h *httpUserInternalAPI) PerformSaveThreePIDAssociation(ctx context.Context, req *api.PerformSaveThreePIDAssociationRequest, res *struct{}) error {
+ span, ctx := opentracing.StartSpanFromContext(ctx, PerformSaveThreePIDAssociationPath)
+ defer span.Finish()
+
+ apiURL := h.apiURL + PerformSaveThreePIDAssociationPath
+ return httputil.PostJSON(ctx, span, h.httpClient, apiURL, req, res)
+}
diff --git a/userapi/inthttp/server.go b/userapi/inthttp/server.go
index 526f9957..f229aa3b 100644
--- a/userapi/inthttp/server.go
+++ b/userapi/inthttp/server.go
@@ -347,4 +347,101 @@ func AddRoutes(internalAPIMux *mux.Router, s api.UserInternalAPI) {
return util.JSONResponse{Code: http.StatusOK, JSON: &response}
}),
)
+ internalAPIMux.Handle(PerformSetAvatarURLPath,
+ httputil.MakeInternalAPI("performSetAvatarURL", func(req *http.Request) util.JSONResponse {
+ request := api.PerformSetAvatarURLRequest{}
+ response := api.PerformSetAvatarURLResponse{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.SetAvatarURL(req.Context(), &request, &response); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &response}
+ }),
+ )
+ internalAPIMux.Handle(QueryNumericLocalpartPath,
+ httputil.MakeInternalAPI("queryNumericLocalpart", func(req *http.Request) util.JSONResponse {
+ response := api.QueryNumericLocalpartResponse{}
+ if err := s.QueryNumericLocalpart(req.Context(), &response); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &response}
+ }),
+ )
+ internalAPIMux.Handle(QueryAccountByPasswordPath,
+ httputil.MakeInternalAPI("queryAccountByPassword", func(req *http.Request) util.JSONResponse {
+ request := api.QueryAccountByPasswordRequest{}
+ response := api.QueryAccountByPasswordResponse{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.QueryAccountByPassword(req.Context(), &request, &response); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &response}
+ }),
+ )
+ internalAPIMux.Handle(PerformSetDisplayNamePath,
+ httputil.MakeInternalAPI("performSetDisplayName", func(req *http.Request) util.JSONResponse {
+ request := api.PerformUpdateDisplayNameRequest{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.SetDisplayName(req.Context(), &request, &struct{}{}); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &struct{}{}}
+ }),
+ )
+ internalAPIMux.Handle(QueryLocalpartForThreePIDPath,
+ httputil.MakeInternalAPI("queryLocalpartForThreePID", func(req *http.Request) util.JSONResponse {
+ request := api.QueryLocalpartForThreePIDRequest{}
+ response := api.QueryLocalpartForThreePIDResponse{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.QueryLocalpartForThreePID(req.Context(), &request, &response); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &response}
+ }),
+ )
+ internalAPIMux.Handle(QueryThreePIDsForLocalpartPath,
+ httputil.MakeInternalAPI("queryThreePIDsForLocalpart", func(req *http.Request) util.JSONResponse {
+ request := api.QueryThreePIDsForLocalpartRequest{}
+ response := api.QueryThreePIDsForLocalpartResponse{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.QueryThreePIDsForLocalpart(req.Context(), &request, &response); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &response}
+ }),
+ )
+ internalAPIMux.Handle(PerformForgetThreePIDPath,
+ httputil.MakeInternalAPI("performForgetThreePID", func(req *http.Request) util.JSONResponse {
+ request := api.PerformForgetThreePIDRequest{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.PerformForgetThreePID(req.Context(), &request, &struct{}{}); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &struct{}{}}
+ }),
+ )
+ internalAPIMux.Handle(PerformSaveThreePIDAssociationPath,
+ httputil.MakeInternalAPI("performSaveThreePIDAssociation", func(req *http.Request) util.JSONResponse {
+ request := api.PerformSaveThreePIDAssociationRequest{}
+ if err := json.NewDecoder(req.Body).Decode(&request); err != nil {
+ return util.MessageResponse(http.StatusBadRequest, err.Error())
+ }
+ if err := s.PerformSaveThreePIDAssociation(req.Context(), &request, &struct{}{}); err != nil {
+ return util.ErrorResponse(err)
+ }
+ return util.JSONResponse{Code: http.StatusOK, JSON: &struct{}{}}
+ }),
+ )
}
diff --git a/userapi/storage/interface.go b/userapi/storage/interface.go
index 77706710..b15470dd 100644
--- a/userapi/storage/interface.go
+++ b/userapi/storage/interface.go
@@ -24,12 +24,17 @@ import (
"github.com/matrix-org/dendrite/userapi/storage/tables"
)
-type Database interface {
- GetAccountByPassword(ctx context.Context, localpart, plaintextPassword string) (*api.Account, error)
+type Profile interface {
GetProfileByLocalpart(ctx context.Context, localpart string) (*authtypes.Profile, error)
+ SearchProfiles(ctx context.Context, searchString string, limit int) ([]authtypes.Profile, error)
SetPassword(ctx context.Context, localpart string, plaintextPassword string) error
SetAvatarURL(ctx context.Context, localpart string, avatarURL string) error
SetDisplayName(ctx context.Context, localpart string, displayName string) error
+}
+
+type Database interface {
+ Profile
+ GetAccountByPassword(ctx context.Context, localpart, plaintextPassword string) (*api.Account, error)
// CreateAccount makes a new account with the given login name and password, and creates an empty profile
// for this account. If no password is supplied, the account will be a passwordless account. If the
// account already exists, it will return nil, ErrUserExists.
@@ -48,7 +53,6 @@ type Database interface {
GetThreePIDsForLocalpart(ctx context.Context, localpart string) (threepids []authtypes.ThreePID, err error)
CheckAccountAvailability(ctx context.Context, localpart string) (bool, error)
GetAccountByLocalpart(ctx context.Context, localpart string) (*api.Account, error)
- SearchProfiles(ctx context.Context, searchString string, limit int) ([]authtypes.Profile, error)
DeactivateAccount(ctx context.Context, localpart string) (err error)
CreateOpenIDToken(ctx context.Context, token, localpart string) (exp int64, err error)
GetOpenIDTokenAttributes(ctx context.Context, token string) (*api.OpenIDTokenAttributes, error)