2021-07-24 04:16:34 -06:00
|
|
|
// Copyright 2021 The Gitea Authors. All rights reserved.
|
2022-11-27 11:20:29 -07:00
|
|
|
// SPDX-License-Identifier: MIT
|
2021-07-24 04:16:34 -06:00
|
|
|
|
2021-12-10 01:14:24 -07:00
|
|
|
package asymkey
|
2021-07-24 04:16:34 -06:00
|
|
|
|
|
|
|
import (
|
2023-09-14 11:09:32 -06:00
|
|
|
"context"
|
2021-07-24 04:16:34 -06:00
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
2021-09-19 05:49:59 -06:00
|
|
|
"code.gitea.io/gitea/models/db"
|
2021-11-11 00:03:30 -07:00
|
|
|
user_model "code.gitea.io/gitea/models/user"
|
2021-07-24 04:16:34 -06:00
|
|
|
"code.gitea.io/gitea/modules/setting"
|
2022-12-31 04:49:37 -07:00
|
|
|
"code.gitea.io/gitea/modules/util"
|
2021-07-24 04:16:34 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
// CheckPrincipalKeyString strips spaces and returns an error if the given principal contains newlines
|
2023-09-14 11:09:32 -06:00
|
|
|
func CheckPrincipalKeyString(ctx context.Context, user *user_model.User, content string) (_ string, err error) {
|
2021-07-24 04:16:34 -06:00
|
|
|
if setting.SSH.Disabled {
|
2021-12-10 01:14:24 -07:00
|
|
|
return "", db.ErrSSHDisabled{}
|
2021-07-24 04:16:34 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
content = strings.TrimSpace(content)
|
|
|
|
if strings.ContainsAny(content, "\r\n") {
|
2022-12-31 04:49:37 -07:00
|
|
|
return "", util.NewInvalidArgumentErrorf("only a single line with a single principal please")
|
2021-07-24 04:16:34 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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":
|
2023-09-14 11:09:32 -06:00
|
|
|
emails, err := user_model.GetEmailAddresses(ctx, user.ID)
|
2021-07-24 04:16:34 -06:00
|
|
|
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)
|
|
|
|
}
|