// Copyright 2021 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT package asymkey import ( "context" "fmt" "strings" "code.gitea.io/gitea/models/db" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" ) // CheckPrincipalKeyString strips spaces and returns an error if the given principal contains newlines func CheckPrincipalKeyString(ctx context.Context, user *user_model.User, content string) (_ string, err error) { if setting.SSH.Disabled { return "", db.ErrSSHDisabled{} } content = strings.TrimSpace(content) if strings.ContainsAny(content, "\r\n") { return "", util.NewInvalidArgumentErrorf("only a single line with a single principal please") } // check all the allowed principals, email, username or anything // if any matches, return ok for _, v := range setting.SSH.AuthorizedPrincipalsAllow { switch v { case "anything": return content, nil case "email": emails, err := user_model.GetEmailAddresses(ctx, user.ID) if err != nil { return "", err } for _, email := range emails { if !email.IsActivated { continue } if content == email.Email { return content, nil } } case "username": if content == user.Name { return content, nil } } } return "", fmt.Errorf("didn't match allowed principals: %s", setting.SSH.AuthorizedPrincipalsAllow) }