2017-11-05 19:03:54 +01: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 18:59:55 +02:00
"fmt"
2017-11-05 19:03:54 +01:00
"net/http"
"github.com/matrix-org/dendrite/clientapi/jsonerror"
2020-06-12 15:55:57 +02:00
"github.com/matrix-org/dendrite/internal/eventutil"
2020-12-02 18:41:00 +01:00
"github.com/matrix-org/dendrite/setup/config"
2020-06-16 15:53:19 +02:00
userapi "github.com/matrix-org/dendrite/userapi/api"
2017-11-05 19:03:54 +01:00
"github.com/matrix-org/gomatrixserverlib"
"github.com/matrix-org/util"
)
// GetProfile implements GET /_matrix/federation/v1/query/profile
func GetProfile (
httpReq * http . Request ,
2020-06-16 15:53:19 +02:00
userAPI userapi . UserInternalAPI ,
2020-08-10 15:18:04 +02:00
cfg * config . FederationAPI ,
2017-11-05 19:03:54 +01: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 16:55:45 +01:00
Code : http . StatusBadRequest ,
2017-11-05 19:03:54 +01:00
JSON : jsonerror . MissingArgument ( "The request body did not contain required argument 'user_id'." ) ,
}
}
2018-08-20 11:45:17 +02:00
_ , domain , err := gomatrixserverlib . SplitID ( '@' , userID )
2017-11-05 19:03:54 +01:00
if err != nil {
2020-03-02 17:20:44 +01:00
util . GetLogger ( httpReq . Context ( ) ) . WithError ( err ) . Error ( "gomatrixserverlib.SplitID failed" )
2020-04-16 18:59:55 +02:00
return util . JSONResponse {
Code : http . StatusBadRequest ,
JSON : jsonerror . MissingArgument ( fmt . Sprintf ( "Format of user ID %q is invalid" , userID ) ) ,
}
2017-11-05 19:03:54 +01:00
}
if domain != cfg . Matrix . ServerName {
2020-04-16 18:59:55 +02:00
return util . JSONResponse {
Code : http . StatusBadRequest ,
JSON : jsonerror . InvalidArgumentValue ( fmt . Sprintf ( "Domain %q does not match this server" , domain ) ) ,
}
2017-11-05 19:03:54 +01:00
}
2020-06-16 15:53:19 +02:00
var profileRes userapi . QueryProfileResponse
err = userAPI . QueryProfile ( httpReq . Context ( ) , & userapi . QueryProfileRequest {
UserID : userID ,
} , & profileRes )
2018-08-20 11:45:17 +02:00
if err != nil {
2020-06-16 15:53:19 +02:00
util . GetLogger ( httpReq . Context ( ) ) . WithError ( err ) . Error ( "userAPI.QueryProfile failed" )
2020-03-02 17:20:44 +01:00
return jsonerror . InternalServerError ( )
2017-11-05 19:03:54 +01:00
}
var res interface { }
2018-03-13 16:55:45 +01:00
code := http . StatusOK
2017-11-05 19:03:54 +01:00
if field != "" {
switch field {
case "displayname" :
2020-06-12 15:55:57 +02:00
res = eventutil . DisplayName {
2020-06-16 15:53:19 +02:00
DisplayName : profileRes . DisplayName ,
2017-11-05 19:03:54 +01:00
}
case "avatar_url" :
2020-06-12 15:55:57 +02:00
res = eventutil . AvatarURL {
2020-06-16 15:53:19 +02:00
AvatarURL : profileRes . AvatarURL ,
2017-11-05 19:03:54 +01:00
}
default :
2018-03-13 16:55:45 +01:00
code = http . StatusBadRequest
2017-11-05 19:03:54 +01:00
res = jsonerror . InvalidArgumentValue ( "The request body did not contain an allowed value of argument 'field'. Allowed values are either: 'avatar_url', 'displayname'." )
}
} else {
2020-06-12 15:55:57 +02:00
res = eventutil . ProfileResponse {
2020-06-16 15:53:19 +02:00
AvatarURL : profileRes . AvatarURL ,
DisplayName : profileRes . DisplayName ,
2017-11-05 19:03:54 +01:00
}
}
return util . JSONResponse {
Code : code ,
JSON : res ,
}
}