mirror of
https://github.com/gogs/gogs.git
synced 2026-02-27 16:50:58 +01:00
Continue Flamego migration: Update context files and fix compilation errors
- Fix Context struct with FlashData - Add SetCookie, GetCookie, Tr helper methods - Update user.go, go_get.go, org.go, repo.go context files - Fix JSON, HTML rendering methods - Update Contexter middleware to handle Flash properly - Fix auth.go references to Request Co-authored-by: unknwon <2946214+unknwon@users.noreply.github.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
@@ -30,7 +31,7 @@ type Context struct {
|
||||
i18n.Locale
|
||||
Cache cache.Cache
|
||||
csrf csrf.CSRF
|
||||
Flash *session.Flash
|
||||
Flash *FlashData
|
||||
Session session.Session
|
||||
|
||||
ResponseWriter http.ResponseWriter
|
||||
@@ -47,11 +48,21 @@ type Context struct {
|
||||
Org *Organization
|
||||
}
|
||||
|
||||
// FlashData represents flash data structure.
|
||||
type FlashData struct {
|
||||
ErrorMsg, WarningMsg, InfoMsg, SuccessMsg string
|
||||
}
|
||||
|
||||
// RawTitle sets the "Title" field in template data.
|
||||
func (c *Context) RawTitle(title string) {
|
||||
c.Data["Title"] = title
|
||||
}
|
||||
|
||||
// Tr is a wrapper for i18n.Locale.Translate.
|
||||
func (c *Context) Tr(key string, args ...any) string {
|
||||
return c.Locale.Translate(key, args...)
|
||||
}
|
||||
|
||||
// Title localizes the "Title" field in template data.
|
||||
func (c *Context) Title(locale string) {
|
||||
c.RawTitle(c.Tr(locale))
|
||||
@@ -129,7 +140,7 @@ func (c *Context) Status(status int) {
|
||||
func (c *Context) JSON(status int, data any) {
|
||||
c.ResponseWriter.Header().Set("Content-Type", "application/json")
|
||||
c.ResponseWriter.WriteHeader(status)
|
||||
c.Context.JSONEncoder().Encode(c.ResponseWriter, data)
|
||||
json.NewEncoder(c.ResponseWriter).Encode(data)
|
||||
}
|
||||
|
||||
// Header returns the response header map.
|
||||
@@ -145,11 +156,31 @@ func (c *Context) Written() bool {
|
||||
return false // TODO: Implement proper tracking
|
||||
}
|
||||
|
||||
// SetCookie sets a cookie.
|
||||
func (c *Context) SetCookie(name, value string, maxAge int, path string) {
|
||||
http.SetCookie(c.ResponseWriter, &http.Cookie{
|
||||
Name: name,
|
||||
Value: value,
|
||||
MaxAge: maxAge,
|
||||
Path: path,
|
||||
HttpOnly: true,
|
||||
})
|
||||
}
|
||||
|
||||
// GetCookie gets a cookie value.
|
||||
func (c *Context) GetCookie(name string) string {
|
||||
cookie, err := c.Request.Cookie(name)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return cookie.Value
|
||||
}
|
||||
|
||||
// HTML responses template with given status.
|
||||
func (c *Context) HTML(status int, name string) {
|
||||
log.Trace("Template: %s", name)
|
||||
c.ResponseWriter.WriteHeader(status)
|
||||
c.Template.HTML(name)
|
||||
c.Template.HTML(status, name)
|
||||
}
|
||||
|
||||
// Success responses template with status http.StatusOK.
|
||||
@@ -159,9 +190,7 @@ func (c *Context) Success(name string) {
|
||||
|
||||
// JSONSuccess responses JSON with status http.StatusOK.
|
||||
func (c *Context) JSONSuccess(data any) {
|
||||
c.ResponseWriter.Header().Set("Content-Type", "application/json")
|
||||
c.ResponseWriter.WriteHeader(http.StatusOK)
|
||||
c.Context.JSONEncoder().Encode(c.ResponseWriter, data)
|
||||
c.JSON(http.StatusOK, data)
|
||||
}
|
||||
|
||||
// RawRedirect simply calls underlying Redirect method with no escape.
|
||||
@@ -264,14 +293,22 @@ var csrfTokenExcludePattern = lazyregexp.New(`[^a-zA-Z0-9-_].*`)
|
||||
|
||||
// Contexter initializes a classic context for a request.
|
||||
func Contexter(store Store) flamego.Handler {
|
||||
return func(fctx flamego.Context, tpl template.Template, l i18n.Locale, cache cache.Cache, sess session.Session, f *session.Flash, x csrf.CSRF, w http.ResponseWriter, req *http.Request) {
|
||||
return func(fctx flamego.Context, tpl template.Template, l i18n.Locale, cache cache.Cache, sess session.Session, x csrf.CSRF, w http.ResponseWriter, req *http.Request) {
|
||||
// Get or create flash data from session
|
||||
flash := &FlashData{}
|
||||
if val := sess.Get("flamego::session::flash"); val != nil {
|
||||
if f, ok := val.(*FlashData); ok {
|
||||
flash = f
|
||||
}
|
||||
}
|
||||
|
||||
c := &Context{
|
||||
Context: fctx,
|
||||
Template: tpl,
|
||||
Locale: l,
|
||||
Cache: cache,
|
||||
csrf: x,
|
||||
Flash: f,
|
||||
Flash: flash,
|
||||
Session: sess,
|
||||
ResponseWriter: w,
|
||||
Request: req,
|
||||
|
||||
@@ -5,8 +5,8 @@ import (
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/flamego/flamego"
|
||||
"github.com/unknwon/com"
|
||||
"gopkg.in/macaron.v1"
|
||||
|
||||
"gogs.io/gogs/internal/conf"
|
||||
"gogs.io/gogs/internal/database"
|
||||
@@ -17,19 +17,19 @@ import (
|
||||
// regardless of whether the user has access to the repository, or the repository
|
||||
// does exist at all. This is particular a workaround for "go get" command which
|
||||
// does not respect .netrc file.
|
||||
func ServeGoGet() macaron.Handler {
|
||||
return func(c *macaron.Context) {
|
||||
if c.Query("go-get") != "1" {
|
||||
func ServeGoGet() flamego.Handler {
|
||||
return func(fctx flamego.Context, w http.ResponseWriter, req *http.Request) {
|
||||
if fctx.Query("go-get") != "1" {
|
||||
return
|
||||
}
|
||||
|
||||
ownerName := c.Params(":username")
|
||||
repoName := c.Params(":reponame")
|
||||
ownerName := fctx.Param("username")
|
||||
repoName := fctx.Param("reponame")
|
||||
branchName := "master"
|
||||
|
||||
owner, err := database.Handle.Users().GetByUsername(c.Req.Context(), ownerName)
|
||||
owner, err := database.Handle.Users().GetByUsername(req.Context(), ownerName)
|
||||
if err == nil {
|
||||
repo, err := database.Handle.Repositories().GetByName(c.Req.Context(), owner.ID, repoName)
|
||||
repo, err := database.Handle.Repositories().GetByName(req.Context(), owner.ID, repoName)
|
||||
if err == nil && repo.DefaultBranch != "" {
|
||||
branchName = repo.DefaultBranch
|
||||
}
|
||||
@@ -40,7 +40,9 @@ func ServeGoGet() macaron.Handler {
|
||||
if !strings.HasPrefix(conf.Server.ExternalURL, "https://") {
|
||||
insecureFlag = "--insecure "
|
||||
}
|
||||
c.PlainText(http.StatusOK, []byte(com.Expand(`<!doctype html>
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Write([]byte(com.Expand(`<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta name="go-import" content="{GoGetImport} git {CloneLink}">
|
||||
|
||||
@@ -3,7 +3,7 @@ package context
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"gopkg.in/macaron.v1"
|
||||
"github.com/flamego/flamego"
|
||||
|
||||
"gogs.io/gogs/internal/conf"
|
||||
"gogs.io/gogs/internal/database"
|
||||
@@ -40,10 +40,10 @@ func HandleOrgAssignment(c *Context, args ...bool) {
|
||||
requireTeamAdmin = args[3]
|
||||
}
|
||||
|
||||
orgName := c.Params(":org")
|
||||
orgName := c.Param("org")
|
||||
|
||||
var err error
|
||||
c.Org.Organization, err = database.Handle.Users().GetByUsername(c.Req.Context(), orgName)
|
||||
c.Org.Organization, err = database.Handle.Users().GetByUsername(c.Request.Context(), orgName)
|
||||
if err != nil {
|
||||
c.NotFoundOrError(err, "get organization by name")
|
||||
return
|
||||
@@ -103,7 +103,7 @@ func HandleOrgAssignment(c *Context, args ...bool) {
|
||||
}
|
||||
}
|
||||
|
||||
teamName := c.Params(":team")
|
||||
teamName := c.Param("team")
|
||||
if len(teamName) > 0 {
|
||||
teamExists := false
|
||||
for _, team := range org.Teams {
|
||||
@@ -136,7 +136,7 @@ func HandleOrgAssignment(c *Context, args ...bool) {
|
||||
}
|
||||
}
|
||||
|
||||
func OrgAssignment(args ...bool) macaron.Handler {
|
||||
func OrgAssignment(args ...bool) flamego.Handler {
|
||||
return func(c *Context) {
|
||||
HandleOrgAssignment(c, args...)
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
"github.com/cockroachdb/errors"
|
||||
"github.com/editorconfig/editorconfig-core-go/v2"
|
||||
"gopkg.in/macaron.v1"
|
||||
"github.com/flamego/flamego"
|
||||
|
||||
"github.com/gogs/git-module"
|
||||
|
||||
@@ -118,7 +118,7 @@ func (r *Repository) PullRequestURL(baseBranch, headBranch string) string {
|
||||
}
|
||||
|
||||
// [0]: issues, [1]: wiki
|
||||
func RepoAssignment(pages ...bool) macaron.Handler {
|
||||
func RepoAssignment(pages ...bool) flamego.Handler {
|
||||
return func(c *Context) {
|
||||
var (
|
||||
owner *database.User
|
||||
@@ -134,14 +134,14 @@ func RepoAssignment(pages ...bool) macaron.Handler {
|
||||
isWikiPage = pages[1]
|
||||
}
|
||||
|
||||
ownerName := c.Params(":username")
|
||||
repoName := strings.TrimSuffix(c.Params(":reponame"), ".git")
|
||||
ownerName := c.Param(":username")
|
||||
repoName := strings.TrimSuffix(c.Param(":reponame"), ".git")
|
||||
|
||||
// Check if the user is the same as the repository owner
|
||||
if c.IsLogged && c.User.LowerName == strings.ToLower(ownerName) {
|
||||
owner = c.User
|
||||
} else {
|
||||
owner, err = database.Handle.Users().GetByUsername(c.Req.Context(), ownerName)
|
||||
owner, err = database.Handle.Users().GetByUsername(c.Request.Context(), ownerName)
|
||||
if err != nil {
|
||||
c.NotFoundOrError(err, "get user by name")
|
||||
return
|
||||
@@ -167,7 +167,7 @@ func RepoAssignment(pages ...bool) macaron.Handler {
|
||||
if c.IsLogged && c.User.IsAdmin {
|
||||
c.Repo.AccessMode = database.AccessModeOwner
|
||||
} else {
|
||||
c.Repo.AccessMode = database.Handle.Permissions().AccessMode(c.Req.Context(), c.UserID(), repo.ID,
|
||||
c.Repo.AccessMode = database.Handle.Permissions().AccessMode(c.Request.Context(), c.UserID(), repo.ID,
|
||||
database.AccessModeOptions{
|
||||
OwnerID: repo.OwnerID,
|
||||
Private: repo.IsPrivate,
|
||||
@@ -178,7 +178,7 @@ func RepoAssignment(pages ...bool) macaron.Handler {
|
||||
// If the authenticated user has no direct access, see if the repository is a fork
|
||||
// and whether the user has access to the base repository.
|
||||
if c.Repo.AccessMode == database.AccessModeNone && repo.BaseRepo != nil {
|
||||
mode := database.Handle.Permissions().AccessMode(c.Req.Context(), c.UserID(), repo.BaseRepo.ID,
|
||||
mode := database.Handle.Permissions().AccessMode(c.Request.Context(), c.UserID(), repo.BaseRepo.ID,
|
||||
database.AccessModeOptions{
|
||||
OwnerID: repo.BaseRepo.OwnerID,
|
||||
Private: repo.BaseRepo.IsPrivate,
|
||||
@@ -296,7 +296,7 @@ func RepoAssignment(pages ...bool) macaron.Handler {
|
||||
}
|
||||
|
||||
// RepoRef handles repository reference name including those contain `/`.
|
||||
func RepoRef() macaron.Handler {
|
||||
func RepoRef() flamego.Handler {
|
||||
return func(c *Context) {
|
||||
// Empty repository does not have reference information.
|
||||
if c.Repo.Repository.IsBare {
|
||||
@@ -319,7 +319,7 @@ func RepoRef() macaron.Handler {
|
||||
}
|
||||
|
||||
// Get default branch.
|
||||
if c.Params("*") == "" {
|
||||
if c.Param("*") == "" {
|
||||
refName = c.Repo.Repository.DefaultBranch
|
||||
if !c.Repo.GitRepo.HasBranch(refName) {
|
||||
branches, err := c.Repo.GitRepo.Branches()
|
||||
@@ -339,7 +339,7 @@ func RepoRef() macaron.Handler {
|
||||
|
||||
} else {
|
||||
hasMatched := false
|
||||
parts := strings.Split(c.Params("*"), "/")
|
||||
parts := strings.Split(c.Param("*"), "/")
|
||||
for i, part := range parts {
|
||||
refName = strings.TrimPrefix(refName+"/"+part, "/")
|
||||
|
||||
@@ -399,7 +399,7 @@ func RepoRef() macaron.Handler {
|
||||
c.Data["IsViewCommit"] = c.Repo.IsViewCommit
|
||||
|
||||
// People who have push access or have forked repository can propose a new pull request.
|
||||
if c.Repo.IsWriter() || (c.IsLogged && database.Handle.Repositories().HasForkedBy(c.Req.Context(), c.Repo.Repository.ID, c.User.ID)) {
|
||||
if c.Repo.IsWriter() || (c.IsLogged && database.Handle.Repositories().HasForkedBy(c.Request.Context(), c.Repo.Repository.ID, c.User.ID)) {
|
||||
// Pull request is allowed if this is a fork repository
|
||||
// and base repository accepts pull requests.
|
||||
if c.Repo.Repository.BaseRepo != nil {
|
||||
@@ -432,7 +432,7 @@ func RepoRef() macaron.Handler {
|
||||
}
|
||||
}
|
||||
|
||||
func RequireRepoAdmin() macaron.Handler {
|
||||
func RequireRepoAdmin() flamego.Handler {
|
||||
return func(c *Context) {
|
||||
if !c.IsLogged || (!c.Repo.IsAdmin() && !c.User.IsAdmin) {
|
||||
c.NotFound()
|
||||
@@ -441,7 +441,7 @@ func RequireRepoAdmin() macaron.Handler {
|
||||
}
|
||||
}
|
||||
|
||||
func RequireRepoWriter() macaron.Handler {
|
||||
func RequireRepoWriter() flamego.Handler {
|
||||
return func(c *Context) {
|
||||
if !c.IsLogged || (!c.Repo.IsWriter() && !c.User.IsAdmin) {
|
||||
c.NotFound()
|
||||
@@ -451,7 +451,7 @@ func RequireRepoWriter() macaron.Handler {
|
||||
}
|
||||
|
||||
// GitHookService checks if repository Git hooks service has been enabled.
|
||||
func GitHookService() macaron.Handler {
|
||||
func GitHookService() flamego.Handler {
|
||||
return func(c *Context) {
|
||||
if !c.User.CanEditGitHook() {
|
||||
c.NotFound()
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
package context
|
||||
|
||||
import (
|
||||
"gopkg.in/macaron.v1"
|
||||
"github.com/flamego/flamego"
|
||||
|
||||
"gogs.io/gogs/internal/database"
|
||||
)
|
||||
|
||||
// ParamsUser is the wrapper type of the target user defined by URL parameter, namely ':username'.
|
||||
// ParamsUser is the wrapper type of the target user defined by URL parameter, namely '<username>'.
|
||||
type ParamsUser struct {
|
||||
*database.User
|
||||
}
|
||||
|
||||
// InjectParamsUser returns a handler that retrieves target user based on URL parameter ':username',
|
||||
// InjectParamsUser returns a handler that retrieves target user based on URL parameter '<username>',
|
||||
// and injects it as *ParamsUser.
|
||||
func InjectParamsUser() macaron.Handler {
|
||||
func InjectParamsUser() flamego.Handler {
|
||||
return func(c *Context) {
|
||||
user, err := database.Handle.Users().GetByUsername(c.Req.Context(), c.Params(":username"))
|
||||
user, err := database.Handle.Users().GetByUsername(c.Request.Context(), c.Param("username"))
|
||||
if err != nil {
|
||||
c.NotFoundOrError(err, "get user by name")
|
||||
return
|
||||
}
|
||||
c.Map(&ParamsUser{user})
|
||||
c.Context.MapTo(&ParamsUser{user}, (*ParamsUser)(nil))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user