@@ -37,6 +37,20 @@ func (err ErrNamePatternNotAllowed) Error() string { | |||
return fmt.Sprintf("name pattern is not allowed [pattern: %s]", err.Pattern) | |||
} | |||
// ErrSSHDisabled represents an "SSH disabled" error. | |||
type ErrSSHDisabled struct { | |||
} | |||
// IsErrSSHDisabled checks if an error is a ErrSSHDisabled. | |||
func IsErrSSHDisabled(err error) bool { | |||
_, ok := err.(ErrSSHDisabled) | |||
return ok | |||
} | |||
func (err ErrSSHDisabled) Error() string { | |||
return "SSH is disabled" | |||
} | |||
// ____ ___ | |||
// | | \______ ___________ | |||
// | | / ___// __ \_ __ \ |
@@ -260,7 +260,7 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) { | |||
// It returns the actual public key line on success. | |||
func CheckPublicKeyString(content string) (_ string, err error) { | |||
if setting.SSH.Disabled { | |||
return "", errors.New("SSH is disabled") | |||
return "", ErrSSHDisabled{} | |||
} | |||
content, err = parseKeyString(content) |
@@ -405,6 +405,7 @@ key_state_desc = This key has been used in the last 7 days | |||
token_state_desc = This token has been used in the last 7 days | |||
show_openid = Show on profile | |||
hide_openid = Hide from profile | |||
ssh_disabled = SSH is disabled | |||
manage_social = Manage Associated Social Accounts | |||
social_desc = This is a list of associated social accounts. For security reasons, please make sure you recognize all of these entries, as they can be used to log in to your account. |
@@ -106,7 +106,9 @@ func GetDeployKey(ctx *context.APIContext) { | |||
// HandleCheckKeyStringError handle check key error | |||
func HandleCheckKeyStringError(ctx *context.APIContext, err error) { | |||
if models.IsErrKeyUnableVerify(err) { | |||
if models.IsErrSSHDisabled(err) { | |||
ctx.Error(422, "", "SSH is disabled") | |||
} else if models.IsErrKeyUnableVerify(err) { | |||
ctx.Error(422, "", "Unable to verify key content") | |||
} else { | |||
ctx.Error(422, "", fmt.Errorf("Invalid key content: %v", err)) |
@@ -515,6 +515,7 @@ func GitHooksEditPost(ctx *context.Context) { | |||
func DeployKeys(ctx *context.Context) { | |||
ctx.Data["Title"] = ctx.Tr("repo.settings.deploy_keys") | |||
ctx.Data["PageIsSettingsKeys"] = true | |||
ctx.Data["DisableSSH"] = setting.SSH.Disabled | |||
keys, err := models.ListDeployKeys(ctx.Repo.Repository.ID) | |||
if err != nil { | |||
@@ -545,15 +546,17 @@ func DeployKeysPost(ctx *context.Context, form auth.AddKeyForm) { | |||
content, err := models.CheckPublicKeyString(form.Content) | |||
if err != nil { | |||
if models.IsErrKeyUnableVerify(err) { | |||
if models.IsErrSSHDisabled(err) { | |||
ctx.Flash.Info(ctx.Tr("settings.ssh_disabled")) | |||
} else if models.IsErrKeyUnableVerify(err) { | |||
ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) | |||
} else { | |||
ctx.Data["HasError"] = true | |||
ctx.Data["Err_Content"] = true | |||
ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) | |||
ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys") | |||
return | |||
} | |||
ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys") | |||
return | |||
} | |||
key, err := models.AddDeployKey(ctx.Repo.Repository.ID, form.Title, content) |
@@ -339,6 +339,7 @@ func DeleteEmail(ctx *context.Context) { | |||
func SettingsKeys(ctx *context.Context) { | |||
ctx.Data["Title"] = ctx.Tr("settings") | |||
ctx.Data["PageIsSettingsKeys"] = true | |||
ctx.Data["DisableSSH"] = setting.SSH.Disabled | |||
keys, err := models.ListPublicKeys(ctx.User.ID) | |||
if err != nil { | |||
@@ -405,13 +406,15 @@ func SettingsKeysPost(ctx *context.Context, form auth.AddKeyForm) { | |||
case "ssh": | |||
content, err := models.CheckPublicKeyString(form.Content) | |||
if err != nil { | |||
if models.IsErrKeyUnableVerify(err) { | |||
if models.IsErrSSHDisabled(err) { | |||
ctx.Flash.Info(ctx.Tr("settings.ssh_disabled")) | |||
} else if models.IsErrKeyUnableVerify(err) { | |||
ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) | |||
} else { | |||
ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) | |||
ctx.Redirect(setting.AppSubURL + "/user/settings/keys") | |||
return | |||
} | |||
ctx.Redirect(setting.AppSubURL + "/user/settings/keys") | |||
return | |||
} | |||
if _, err = models.AddPublicKey(ctx.User.ID, form.Title, content); err != nil { |
@@ -7,7 +7,11 @@ | |||
<h4 class="ui top attached header"> | |||
{{.i18n.Tr "repo.settings.deploy_keys"}} | |||
<div class="ui right"> | |||
{{if not .DisableSSH}} | |||
<div class="ui blue tiny show-panel button" data-panel="#add-deploy-key-panel">{{.i18n.Tr "repo.settings.add_deploy_key"}}</div> | |||
{{else}} | |||
<div class="ui blue tiny button disabled">{{.i18n.Tr "settings.ssh_disabled"}}</div> | |||
{{end}} | |||
</div> | |||
</h4> | |||
<div class="ui attached segment"> |
@@ -1,7 +1,11 @@ | |||
<h4 class="ui top attached header"> | |||
{{.i18n.Tr "settings.manage_ssh_keys"}} | |||
<div class="ui right"> | |||
{{if not .DisableSSH}} | |||
<div class="ui blue tiny show-panel button" data-panel="#add-ssh-key-panel">{{.i18n.Tr "settings.add_key"}}</div> | |||
{{else}} | |||
<div class="ui blue tiny button disabled">{{.i18n.Tr "settings.ssh_disabled"}}</div> | |||
{{end}} | |||
</div> | |||
</h4> | |||
<div class="ui attached segment"> |