2017-11-05 18:03:54 +00: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 (
"net/http"
2018-08-20 10:45:17 +01:00
appserviceAPI "github.com/matrix-org/dendrite/appservice/api"
2017-11-05 18:03:54 +00:00
"github.com/matrix-org/dendrite/clientapi/auth/storage/accounts"
"github.com/matrix-org/dendrite/clientapi/httputil"
"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 17:27:33 +00:00
accountDB accounts . Database ,
2020-02-11 11:18:12 +00:00
cfg * config . Dendrite ,
2018-08-20 10:45:17 +01:00
asAPI appserviceAPI . AppServiceQueryAPI ,
2017-11-05 18:03:54 +00: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 15:55:45 +00:00
Code : http . StatusBadRequest ,
2017-11-05 18:03:54 +00:00
JSON : jsonerror . MissingArgument ( "The request body did not contain required argument 'user_id'." ) ,
}
}
2018-08-20 10:45:17 +01:00
_ , domain , err := gomatrixserverlib . SplitID ( '@' , userID )
2017-11-05 18:03:54 +00:00
if err != nil {
return httputil . LogThenError ( httpReq , err )
}
if domain != cfg . Matrix . ServerName {
return httputil . LogThenError ( httpReq , err )
}
2019-07-12 16:43:01 +01:00
profile , err := appserviceAPI . RetrieveUserProfile ( httpReq . Context ( ) , userID , asAPI , accountDB )
2018-08-20 10:45:17 +01:00
if err != nil {
2017-11-05 18:03:54 +00:00
return httputil . LogThenError ( httpReq , err )
}
var res interface { }
2018-03-13 15:55:45 +00:00
code := http . StatusOK
2017-11-05 18:03:54 +00:00
if field != "" {
switch field {
case "displayname" :
res = common . DisplayName {
2017-11-15 11:13:09 +00:00
DisplayName : profile . DisplayName ,
2017-11-05 18:03:54 +00:00
}
case "avatar_url" :
res = common . AvatarURL {
2017-11-15 11:13:09 +00:00
AvatarURL : profile . AvatarURL ,
2017-11-05 18:03:54 +00:00
}
default :
2018-03-13 15:55:45 +00:00
code = http . StatusBadRequest
2017-11-05 18:03:54 +00: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 11:13:09 +00:00
AvatarURL : profile . AvatarURL ,
DisplayName : profile . DisplayName ,
2017-11-05 18:03:54 +00:00
}
}
return util . JSONResponse {
Code : code ,
JSON : res ,
}
}