Index: src/code.gitea.io/gitea/models/repo.go --- src/code.gitea.io/gitea/models/repo.go.orig 2020-01-18 20:41:43.659292000 +0100 +++ src/code.gitea.io/gitea/models/repo.go 2020-01-19 00:23:41.349515000 +0100 @@ -877,11 +877,23 @@ cl := new(CloneLink) if setting.SSH.Port != 22 { - cl.SSH = fmt.Sprintf("ssh://%s@%s:%d/%s/%s.git", sshUser, setting.SSH.Domain, setting.SSH.Port, repo.OwnerName, repoName) + if setting.SSH.StartBuiltinServer { + cl.SSH = fmt.Sprintf("ssh://%s:%d/%s/%s.git", setting.SSH.Domain, setting.SSH.Port, repo.OwnerName, repoName) + } else { + cl.SSH = fmt.Sprintf("ssh://%s@%s:%d/%s/%s.git", sshUser, setting.SSH.Domain, setting.SSH.Port, repo.OwnerName, repoName) + } } else if setting.Repository.UseCompatSSHURI { - cl.SSH = fmt.Sprintf("ssh://%s@%s/%s/%s.git", sshUser, setting.SSH.Domain, repo.OwnerName, repoName) + if setting.SSH.StartBuiltinServer { + cl.SSH = fmt.Sprintf("ssh://%s/%s/%s.git", setting.SSH.Domain, repo.OwnerName, repoName) + } else { + cl.SSH = fmt.Sprintf("ssh://%s@%s/%s/%s.git", sshUser, setting.SSH.Domain, repo.OwnerName, repoName) + } } else { - cl.SSH = fmt.Sprintf("%s@%s:%s/%s.git", sshUser, setting.SSH.Domain, repo.OwnerName, repoName) + if setting.SSH.StartBuiltinServer { + cl.SSH = fmt.Sprintf("%s:%s/%s.git", setting.SSH.Domain, repo.OwnerName, repoName) + } else { + cl.SSH = fmt.Sprintf("%s@%s:%s/%s.git", sshUser, setting.SSH.Domain, repo.OwnerName, repoName) + } } cl.HTTPS = ComposeHTTPSCloneURL(repo.OwnerName, repoName) return cl Index: src/code.gitea.io/gitea/models/ssh_key.go --- src/code.gitea.io/gitea/models/ssh_key.go.orig 2020-01-18 20:38:34.000000000 +0100 +++ src/code.gitea.io/gitea/models/ssh_key.go 2020-01-18 20:41:43.659630000 +0100 @@ -36,7 +36,7 @@ const ( tplCommentPrefix = `# gitea public key` - tplPublicKey = tplCommentPrefix + "\n" + `command="%s --config='%s' serv key-%d",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty %s` + "\n" + tplPublicKey = tplCommentPrefix + "\n" + `command="%s --config='%s' key-%d",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty %s` + "\n" ) var sshOpLocker sync.Mutex @@ -81,7 +81,7 @@ // AuthorizedString returns formatted public key string for authorized_keys file. func (key *PublicKey) AuthorizedString() string { - return fmt.Sprintf(tplPublicKey, setting.AppPath, setting.CustomConf, key.ID, key.Content) + return fmt.Sprintf(tplPublicKey, "@l_prefix@/sbin/gitea-serv", setting.CustomConf, key.ID, key.Content) } func extractTypeFromBase64Key(key string) (string, error) {