New Sign in

fierj

Public

Tiny personal git forge

f7772b440f50569594efdf378a7fa925179490f8
diff --git a/repo_handlers.go b/repo_handlers.go
index 10b569f..70a7eb8 100644
--- a/repo_handlers.go
+++ b/repo_handlers.go
@@ -73,11 +73,13 @@ var funcMap = template.FuncMap{
 	},
 }
 
-func renderError(w http.ResponseWriter, tmpl *template.Template, code int, message string) {
+func renderError(w http.ResponseWriter, r *http.Request, tmpl *template.Template, code int, message string) {
 	w.WriteHeader(code)
 	tmpl.ExecuteTemplate(w, "error.html", map[string]any{
 		"Code":    code,
 		"Message": message,
+		"User":    User(r),
+		"CSRF":    CSRF(r),
 	})
 }
 
@@ -103,6 +105,7 @@ func withUser(r *http.Request, data map[string]any) map[string]any {
 		data = map[string]any{}
 	}
 	data["User"] = User(r)
+	data["CSRF"] = CSRF(r)
 	return data
 }
 
@@ -120,7 +123,7 @@ func Repos(cfg Config, tmpl *template.Template) http.HandlerFunc {
 	return func(w http.ResponseWriter, r *http.Request) {
 		repos, err := ListRepos(cfg)
 		if err != nil {
-			renderError(w, tmpl, http.StatusInternalServerError, "failed to list repositories: "+err.Error())
+			renderError(w, r, tmpl, http.StatusInternalServerError, "failed to list repositories: "+err.Error())
 			return
 		}
 		// Filter private repos for anonymous users.
@@ -134,6 +137,7 @@ func Repos(cfg Config, tmpl *template.Template) http.HandlerFunc {
 		tmpl.ExecuteTemplate(w, "repo_list.html", map[string]any{
 			"Repos": visible,
 			"User":  user,
+			"CSRF":  CSRF(r),
 		})
 	}
 }
@@ -207,7 +211,7 @@ func Tree(cfg Config, tmpl *template.Template) http.HandlerFunc {
 		}
 		entries, err := git.List(ref, treePath)
 		if err != nil {
-			renderError(w, tmpl, http.StatusInternalServerError, "failed to list tree: "+err.Error())
+			renderError(w, r, tmpl, http.StatusInternalServerError, "failed to list tree: "+err.Error())
 			return
 		}
 		// directories first
@@ -257,7 +261,7 @@ func Blob(cfg Config, tmpl *template.Template) http.HandlerFunc {
 
 		content, err := git.Blob(ref, filePath)
 		if err != nil {
-			renderError(w, tmpl, http.StatusNotFound, err.Error())
+			renderError(w, r, tmpl, http.StatusNotFound, err.Error())
 			return
 		}
 		tmpl.ExecuteTemplate(w, "repo_blob.html", withUser(r, map[string]any{
@@ -285,11 +289,12 @@ func Log(cfg Config, tmpl *template.Template) http.HandlerFunc {
 		ref, _ := splitRefPath(git, r.PathValue("refpath"))
 		commits, err := git.Log(ref, 50)
 		if err != nil {
-			renderError(w, tmpl, http.StatusInternalServerError, err.Error())
+			renderError(w, r, tmpl, http.StatusInternalServerError, err.Error())
 			return
 		}
 		data := map[string]any{
 			"User":        User(r),
+			"CSRF":        CSRF(r),
 			"Repo":        git.Repo(),
 			"IsPrivate":   git.IsPrivate(),
 			"Ref":         ref,
@@ -313,7 +318,7 @@ func Diff(cfg Config, tmpl *template.Template) http.HandlerFunc {
 		ref := r.PathValue("hash")
 		commit, err := git.Diff(ref)
 		if err != nil || len(commit) == 0 {
-			renderError(w, tmpl, http.StatusNotFound, "commit not found")
+			renderError(w, r, tmpl, http.StatusNotFound, "commit not found")
 			return
 		}
 		if err := tmpl.ExecuteTemplate(w, "repo_commit.html", withUser(r, map[string]any{
@@ -339,7 +344,7 @@ func NewRepoGet(tmpl *template.Template) http.HandlerFunc {
 			http.Redirect(w, r, "/login", http.StatusSeeOther)
 			return
 		}
-		tmpl.ExecuteTemplate(w, "repo_new.html", map[string]any{"User": User(r)})
+		tmpl.ExecuteTemplate(w, "repo_new.html", map[string]any{"User": User(r), "CSRF": CSRF(r)})
 	}
 }
 
@@ -356,7 +361,7 @@ func NewRepoPost(cfg Config, tmpl *template.Template) http.HandlerFunc {
 		if importURL != "" {
 			importedName, err := ImportRepo(cfg, importURL, desc)
 			if err != nil {
-				renderError(w, tmpl, http.StatusBadRequest, "failed to import: "+err.Error())
+				renderError(w, r, tmpl, http.StatusBadRequest, "failed to import: "+err.Error())
 				return
 			}
 			http.Redirect(w, r, "/"+importedName, http.StatusSeeOther)
@@ -364,11 +369,11 @@ func NewRepoPost(cfg Config, tmpl *template.Template) http.HandlerFunc {
 		}
 
 		if name == "" {
-			renderError(w, tmpl, http.StatusBadRequest, "repository name is required")
+			renderError(w, r, tmpl, http.StatusBadRequest, "repository name is required")
 			return
 		}
 		if err := InitRepo(cfg, name, desc); err != nil {
-			renderError(w, tmpl, http.StatusBadRequest, "failed to create repository: "+err.Error())
+			renderError(w, r, tmpl, http.StatusBadRequest, "failed to create repository: "+err.Error())
 			return
 		}
 		http.Redirect(w, r, "/"+name, http.StatusSeeOther)
@@ -416,6 +421,7 @@ func SettingsGet(cfg Config, tmpl *template.Template) http.HandlerFunc {
 			"ProtectedBranches": strings.Join(meta.ProtectedBranches, "\n"),
 			"ActiveTab":         "settings",
 			"User":              User(r),
+			"CSRF":              CSRF(r),
 		})
 	}
 }
@@ -460,7 +466,7 @@ func SettingsPost(cfg Config, tmpl *template.Template) http.HandlerFunc {
 		}
 
 		if err := git.SaveMeta(meta); err != nil {
-			renderError(w, tmpl, http.StatusInternalServerError, "failed to save settings: "+err.Error())
+			renderError(w, r, tmpl, http.StatusInternalServerError, "failed to save settings: "+err.Error())
 			return
 		}
 		// Re-install hook in case protected branches changed.