2017-11-05 12:03:54 -06:00
// Copyright 2017 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package routing
import (
2020-04-16 11:59:55 -05:00
"fmt"
2017-11-05 12:03:54 -06:00
"net/http"
2018-08-20 04:45:17 -05:00
appserviceAPI "github.com/matrix-org/dendrite/appservice/api"
2017-11-05 12:03:54 -06:00
"github.com/matrix-org/dendrite/clientapi/auth/storage/accounts"
"github.com/matrix-org/dendrite/clientapi/jsonerror"
"github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/common/config"
"github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/util"
)
// GetProfile implements GET /_matrix/federation/v1/query/profile
func GetProfile (
httpReq * http . Request ,
2020-02-13 11:27:33 -06:00
accountDB accounts . Database ,
2020-02-11 05:18:12 -06:00
cfg * config . Dendrite ,
2018-08-20 04:45:17 -05:00
asAPI appserviceAPI . AppServiceQueryAPI ,
2017-11-05 12:03:54 -06:00
) util . JSONResponse {
userID , field := httpReq . FormValue ( "user_id" ) , httpReq . FormValue ( "field" )
// httpReq.FormValue will return an empty string if value is not found
if userID == "" {
return util . JSONResponse {
2018-03-13 10:55:45 -05:00
Code : http . StatusBadRequest ,
2017-11-05 12:03:54 -06:00
JSON : jsonerror . MissingArgument ( "The request body did not contain required argument 'user_id'." ) ,
}
}
2018-08-20 04:45:17 -05:00
_ , domain , err := gomatrixserverlib . SplitID ( '@' , userID )
2017-11-05 12:03:54 -06:00
if err != nil {
2020-03-02 10:20:44 -06:00
util . GetLogger ( httpReq . Context ( ) ) . WithError ( err ) . Error ( "gomatrixserverlib.SplitID failed" )
2020-04-16 11:59:55 -05:00
return util . JSONResponse {
Code : http . StatusBadRequest ,
JSON : jsonerror . MissingArgument ( fmt . Sprintf ( "Format of user ID %q is invalid" , userID ) ) ,
}
2017-11-05 12:03:54 -06:00
}
if domain != cfg . Matrix . ServerName {
2020-04-16 11:59:55 -05:00
return util . JSONResponse {
Code : http . StatusBadRequest ,
JSON : jsonerror . InvalidArgumentValue ( fmt . Sprintf ( "Domain %q does not match this server" , domain ) ) ,
}
2017-11-05 12:03:54 -06:00
}
2019-07-12 10:43:01 -05:00
profile , err := appserviceAPI . RetrieveUserProfile ( httpReq . Context ( ) , userID , asAPI , accountDB )
2018-08-20 04:45:17 -05:00
if err != nil {
2020-03-02 10:20:44 -06:00
util . GetLogger ( httpReq . Context ( ) ) . WithError ( err ) . Error ( "appserviceAPI.RetrieveUserProfile failed" )
return jsonerror . InternalServerError ( )
2017-11-05 12:03:54 -06:00
}
var res interface { }
2018-03-13 10:55:45 -05:00
code := http . StatusOK
2017-11-05 12:03:54 -06:00
if field != "" {
switch field {
case "displayname" :
res = common . DisplayName {
2017-11-15 05:13:09 -06:00
DisplayName : profile . DisplayName ,
2017-11-05 12:03:54 -06:00
}
case "avatar_url" :
res = common . AvatarURL {
2017-11-15 05:13:09 -06:00
AvatarURL : profile . AvatarURL ,
2017-11-05 12:03:54 -06:00
}
default :
2018-03-13 10:55:45 -05:00
code = http . StatusBadRequest
2017-11-05 12:03:54 -06:00
res = jsonerror . InvalidArgumentValue ( "The request body did not contain an allowed value of argument 'field'. Allowed values are either: 'avatar_url', 'displayname'." )
}
} else {
res = common . ProfileResponse {
2017-11-15 05:13:09 -06:00
AvatarURL : profile . AvatarURL ,
DisplayName : profile . DisplayName ,
2017-11-05 12:03:54 -06:00
}
}
return util . JSONResponse {
Code : code ,
JSON : res ,
}
}