From 142fbcde218f55f50ed74d16b7e58faabc6697f6 Mon Sep 17 00:00:00 2001 From: Anant Prakash Date: Tue, 3 Jul 2018 19:27:52 +0530 Subject: [PATCH] Return 404 when profile is not found (#524) * Return 404 when profile is not found * Handler sql.ErrNoRows and avoid returning nil update federation GetProfile as well Signed-off-by: Anant Prakash --- .../dendrite/clientapi/routing/profile.go | 50 ++++++++++++------- .../dendrite/federationapi/routing/profile.go | 8 ++- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/github.com/matrix-org/dendrite/clientapi/routing/profile.go b/src/github.com/matrix-org/dendrite/clientapi/routing/profile.go index 6fb748fca..cc1180b0f 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/routing/profile.go +++ b/src/github.com/matrix-org/dendrite/clientapi/routing/profile.go @@ -16,6 +16,7 @@ package routing import ( "context" + "database/sql" "net/http" "github.com/matrix-org/dendrite/clientapi/auth/authtypes" @@ -41,15 +42,12 @@ func GetProfile( JSON: jsonerror.NotFound("Bad method"), } } - localpart, _, err := gomatrixserverlib.SplitID('@', userID) + + profile, err := getProfileByUserID(req, accountDB, userID) if err != nil { - return httputil.LogThenError(req, err) + return *err } - profile, err := accountDB.GetProfileByLocalpart(req.Context(), localpart) - if err != nil { - return httputil.LogThenError(req, err) - } res := common.ProfileResponse{ AvatarURL: profile.AvatarURL, DisplayName: profile.DisplayName, @@ -60,19 +58,39 @@ func GetProfile( } } +// getProfileByUserID returns the profile for userID, otherwise returns an error response +func getProfileByUserID( + req *http.Request, accountDB *accounts.Database, userID string, +) (*authtypes.Profile, *util.JSONResponse) { + localpart, _, err := gomatrixserverlib.SplitID('@', userID) + if err != nil { + resErr := httputil.LogThenError(req, err) + return nil, &resErr + } + + profile, err := accountDB.GetProfileByLocalpart(req.Context(), localpart) + if err == sql.ErrNoRows { + return nil, &util.JSONResponse{ + Code: http.StatusNotFound, + JSON: jsonerror.NotFound("no profile information for this user or this user does not exist"), + } + } else if err != nil { + resErr := httputil.LogThenError(req, err) + return nil, &resErr + } + + return profile, nil +} + // GetAvatarURL implements GET /profile/{userID}/avatar_url func GetAvatarURL( req *http.Request, accountDB *accounts.Database, userID string, ) util.JSONResponse { - localpart, _, err := gomatrixserverlib.SplitID('@', userID) + profile, err := getProfileByUserID(req, accountDB, userID) if err != nil { - return httputil.LogThenError(req, err) + return *err } - profile, err := accountDB.GetProfileByLocalpart(req.Context(), localpart) - if err != nil { - return httputil.LogThenError(req, err) - } res := common.AvatarURL{ AvatarURL: profile.AvatarURL, } @@ -156,15 +174,11 @@ func SetAvatarURL( func GetDisplayName( req *http.Request, accountDB *accounts.Database, userID string, ) util.JSONResponse { - localpart, _, err := gomatrixserverlib.SplitID('@', userID) + profile, err := getProfileByUserID(req, accountDB, userID) if err != nil { - return httputil.LogThenError(req, err) + return *err } - profile, err := accountDB.GetProfileByLocalpart(req.Context(), localpart) - if err != nil { - return httputil.LogThenError(req, err) - } res := common.DisplayName{ DisplayName: profile.DisplayName, } diff --git a/src/github.com/matrix-org/dendrite/federationapi/routing/profile.go b/src/github.com/matrix-org/dendrite/federationapi/routing/profile.go index a9cbfca4a..c52051380 100644 --- a/src/github.com/matrix-org/dendrite/federationapi/routing/profile.go +++ b/src/github.com/matrix-org/dendrite/federationapi/routing/profile.go @@ -15,6 +15,7 @@ package routing import ( + "database/sql" "net/http" "github.com/matrix-org/dendrite/clientapi/auth/storage/accounts" @@ -52,7 +53,12 @@ func GetProfile( } profile, err := accountDB.GetProfileByLocalpart(httpReq.Context(), localpart) - if err != nil { + if err == sql.ErrNoRows { + return util.JSONResponse{ + Code: http.StatusNotFound, + JSON: jsonerror.NotFound("no profile information for this user or this user does not exist"), + } + } else if err != nil { return httputil.LogThenError(httpReq, err) }