You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.5 KiB
75 lines
2.5 KiB
/* |
|
GoToSocial |
|
Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org |
|
|
|
This program is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU Affero General Public License as published by |
|
the Free Software Foundation, either version 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU Affero General Public License for more details. |
|
|
|
You should have received a copy of the GNU Affero General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
*/ |
|
|
|
package users |
|
|
|
import ( |
|
"encoding/json" |
|
"errors" |
|
"net/http" |
|
"strings" |
|
|
|
"github.com/gin-gonic/gin" |
|
apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" |
|
"github.com/superseriousbusiness/gotosocial/internal/gtserror" |
|
) |
|
|
|
// UsersGETHandler should be served at https://example.org/users/:username. |
|
// |
|
// The goal here is to return the activitypub representation of an account |
|
// in the form of a vocab.ActivityStreamsPerson. This should only be served |
|
// to REMOTE SERVERS that present a valid signature on the GET request, on |
|
// behalf of a user, otherwise we risk leaking information about users publicly. |
|
// |
|
// And of course, the request should be refused if the account or server making the |
|
// request is blocked. |
|
func (m *Module) UsersGETHandler(c *gin.Context) { |
|
// usernames on our instance are always lowercase |
|
requestedUsername := strings.ToLower(c.Param(UsernameKey)) |
|
if requestedUsername == "" { |
|
err := errors.New("no username specified in request") |
|
apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGet) |
|
return |
|
} |
|
|
|
format, err := apiutil.NegotiateAccept(c, apiutil.HTMLOrActivityPubHeaders...) |
|
if err != nil { |
|
apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGet) |
|
return |
|
} |
|
|
|
if format == string(apiutil.TextHTML) { |
|
// redirect to the user's profile |
|
c.Redirect(http.StatusSeeOther, "/@"+requestedUsername) |
|
return |
|
} |
|
|
|
resp, errWithCode := m.processor.GetFediUser(apiutil.TransferSignatureContext(c), requestedUsername, c.Request.URL) |
|
if errWithCode != nil { |
|
apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGet) |
|
return |
|
} |
|
|
|
b, err := json.Marshal(resp) |
|
if err != nil { |
|
apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGet) |
|
return |
|
} |
|
|
|
c.Data(http.StatusOK, format, b) |
|
}
|
|
|