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 (
2023-07-14 07:24:31 -05:00
"errors"
2020-04-16 11:59:55 -05:00
"fmt"
2017-11-05 12:03:54 -06:00
"net/http"
2023-07-14 07:24:31 -05:00
appserviceAPI "github.com/matrix-org/dendrite/appservice/api"
2020-06-12 08:55:57 -05:00
"github.com/matrix-org/dendrite/internal/eventutil"
2020-12-02 11:41:00 -06:00
"github.com/matrix-org/dendrite/setup/config"
2020-06-16 08:53:19 -05:00
userapi "github.com/matrix-org/dendrite/userapi/api"
2023-05-09 17:46:49 -05:00
"github.com/matrix-org/gomatrixserverlib/spec"
2017-11-05 12:03:54 -06:00
"github.com/matrix-org/util"
)
// GetProfile implements GET /_matrix/federation/v1/query/profile
func GetProfile (
httpReq * http . Request ,
2022-05-05 13:30:38 -05:00
userAPI userapi . FederationUserAPI ,
2020-08-10 08:18:04 -05:00
cfg * config . FederationAPI ,
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 ,
2023-05-09 17:46:49 -05:00
JSON : spec . MissingParam ( "The request body did not contain required argument 'user_id'." ) ,
2017-11-05 12:03:54 -06:00
}
}
2022-11-15 09:05:23 -06:00
_ , domain , err := cfg . Matrix . SplitLocalID ( '@' , 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 ,
2023-05-09 17:46:49 -05:00
JSON : spec . InvalidParam ( fmt . Sprintf ( "Domain %q does not match this server" , domain ) ) ,
2020-04-16 11:59:55 -05:00
}
2017-11-05 12:03:54 -06:00
}
2023-04-03 13:19:26 -05:00
profile , err := userAPI . QueryProfile ( httpReq . Context ( ) , userID )
2018-08-20 04:45:17 -05:00
if err != nil {
2023-07-14 07:24:31 -05:00
if errors . Is ( err , appserviceAPI . ErrProfileNotExists ) {
return util . JSONResponse {
Code : http . StatusNotFound ,
JSON : spec . NotFound ( "The user does not exist or does not have a profile." ) ,
}
}
2020-06-16 08:53:19 -05:00
util . GetLogger ( httpReq . Context ( ) ) . WithError ( err ) . Error ( "userAPI.QueryProfile failed" )
2023-05-16 19:33:27 -05:00
return util . JSONResponse {
Code : http . StatusInternalServerError ,
JSON : spec . 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" :
2023-04-03 13:19:26 -05:00
res = eventutil . UserProfile {
DisplayName : profile . DisplayName ,
2017-11-05 12:03:54 -06:00
}
case "avatar_url" :
2023-04-03 13:19:26 -05:00
res = eventutil . UserProfile {
AvatarURL : profile . AvatarURL ,
2017-11-05 12:03:54 -06:00
}
default :
2018-03-13 10:55:45 -05:00
code = http . StatusBadRequest
2023-05-09 17:46:49 -05:00
res = spec . InvalidParam ( "The request body did not contain an allowed value of argument 'field'. Allowed values are either: 'avatar_url', 'displayname'." )
2017-11-05 12:03:54 -06:00
}
} else {
2023-04-03 13:19:26 -05:00
res = eventutil . UserProfile {
AvatarURL : profile . AvatarURL ,
DisplayName : profile . DisplayName ,
2017-11-05 12:03:54 -06:00
}
}
return util . JSONResponse {
Code : code ,
JSON : res ,
}
}