diff options
author | Runxi Yu <me@runxiyu.org> | 2025-02-13 15:16:11 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-02-13 15:16:11 +0800 |
commit | 1364d688e454454258c6c97b1dc844cc94a67a9e (patch) | |
tree | f95b9370cff76eeba71b86dbcd7333586ba1f7a9 | |
parent | {http,ssh}_server.go: Add debug logs for incoming requests (diff) | |
download | forge-1364d688e454454258c6c97b1dc844cc94a67a9e.tar.gz forge-1364d688e454454258c6c97b1dc844cc94a67a9e.tar.zst forge-1364d688e454454258c6c97b1dc844cc94a67a9e.zip |
ssh_url_generation.go, etc.: Add config ssh.root and use it
Detecting it based on HTTP host name is definitely unreliable.
Just add a configuration option and it should work.
Diffstat (limited to '')
-rw-r--r-- | config.go | 1 | ||||
-rw-r--r-- | forge.scfg | 1 | ||||
-rw-r--r-- | http_handle_repo_index.go | 3 | ||||
-rw-r--r-- | http_handle_repo_info.go | 3 | ||||
-rw-r--r-- | ssh_server.go | 3 | ||||
-rw-r--r-- | ssh_url_generation.go | 11 |
6 files changed, 18 insertions, 4 deletions
@@ -24,6 +24,7 @@ var config struct { Net string `scfg:"net"` Addr string `scfg:"addr"` Key string `scfg:"key"` + Root string `scfg:"root"` } `scfg:"ssh"` Git struct { Root string `scfg:"root"` @@ -8,6 +8,7 @@ ssh { net tcp addr :2222 key /etc/ssh/ssh_host_ed25519_key + root ssh://forge.example.org } db { diff --git a/http_handle_repo_index.go b/http_handle_repo_index.go index 8a6f7b8..25bc107 100644 --- a/http_handle_repo_index.go +++ b/http_handle_repo_index.go @@ -2,7 +2,6 @@ package main import ( "net/http" - "net/url" ) func handle_repo_index(w http.ResponseWriter, r *http.Request, params map[string]any) { @@ -40,7 +39,7 @@ func handle_repo_index(w http.ResponseWriter, r *http.Request, params map[string params["readme_filename"], params["readme"] = render_readme_at_tree(tree) params["files"] = build_display_git_tree(tree) - params["clone_url"] = "ssh://" + r.Host + "/" + url.PathEscape(group_name) + "/:/repos/" + url.PathEscape(repo_name) + params["clone_url"] = generate_ssh_remote_url(group_name, repo_name) err = templates.ExecuteTemplate(w, "repo_index", params) if err != nil { diff --git a/http_handle_repo_info.go b/http_handle_repo_info.go index e220f18..f5b9dfd 100644 --- a/http_handle_repo_info.go +++ b/http_handle_repo_info.go @@ -2,9 +2,8 @@ package main import ( "net/http" - "net/url" ) func handle_repo_info(w http.ResponseWriter, r *http.Request, params map[string]any) { - http.Error(w, "\x1b[1;93mHi! We do not support Git operations over HTTP yet.\x1b[0m\n\x1b[1;93mMeanwhile, please use ssh by simply replacing the scheme with \"ssh://\":\x1b[0m\n\x1b[1;93mssh://"+r.Host+"/"+url.PathEscape(params["group_name"].(string))+"/:/repos/"+url.PathEscape(params["repo_name"].(string))+"\x1b[0m", http.StatusNotImplemented) + http.Error(w, "\x1b[1;93mHi! We do not support Git operations over HTTP yet.\x1b[0m\n\x1b[1;93mMeanwhile, please use ssh by simply replacing the scheme with \"ssh://\":\x1b[0m\n\x1b[1;93m"+ generate_ssh_remote_url(params["group_name"].(string), params["repo_name"].(string)) + "\x1b[0m", http.StatusNotImplemented) } diff --git a/ssh_server.go b/ssh_server.go index 8cea1a9..b226b7c 100644 --- a/ssh_server.go +++ b/ssh_server.go @@ -80,6 +80,9 @@ func serve_ssh(listener net.Listener) error { }, PublicKeyHandler: func(ctx glider_ssh.Context, key glider_ssh.PublicKey) bool { return true }, KeyboardInteractiveHandler: func(ctx glider_ssh.Context, challenge go_ssh.KeyboardInteractiveChallenge) bool { return true }, + // It is intentional that we do not check any credentials and accept all connections. + // This allows all users to connect and clone repositories; when pushing is added later, + // we will check their public key in the session handler, not in the auth handlers. } server.AddHostKey(host_key) diff --git a/ssh_url_generation.go b/ssh_url_generation.go new file mode 100644 index 0000000..0cf4c1e --- /dev/null +++ b/ssh_url_generation.go @@ -0,0 +1,11 @@ +package main + +import ( + "net/url" + "strings" +) + +func generate_ssh_remote_url(group_name, repo_name string) string { + return strings.TrimSuffix(config.SSH.Root, "/")+"/"+url.PathEscape(group_name)+"/:/repos/"+url.PathEscape(repo_name) +} + |