Avatars and Repo avatars support storing in minio (#12516)
* Avatar support minio * Support repo avatar minio storage * Add missing migration * Fix bug * Fix test * Add test for minio store type on avatars and repo avatars; Add documents * Fix bug * Fix bug * Add back missed avatar link method * refactor codes * Simplify the codes * Code improvements * Fix lint * Fix test mysql * Fix test mysql * Fix test mysql * Fix settings * Fix test * fix test * Fix bug
This commit is contained in:
parent
93f7525061
commit
80a6b0f5bc
21 changed files with 705 additions and 477 deletions
|
@ -30,7 +30,6 @@ import (
|
|||
mirror_service "code.gitea.io/gitea/services/mirror"
|
||||
repo_service "code.gitea.io/gitea/services/repository"
|
||||
|
||||
"github.com/unknwon/com"
|
||||
"mvdan.cc/xurls/v2"
|
||||
)
|
||||
|
||||
|
@ -928,7 +927,7 @@ func UpdateAvatarSetting(ctx *context.Context, form auth.AvatarForm) error {
|
|||
// No avatar is uploaded and we not removing it here.
|
||||
// No random avatar generated here.
|
||||
// Just exit, no action.
|
||||
if !com.IsFile(ctxRepo.CustomAvatarPath()) {
|
||||
if ctxRepo.CustomAvatarRelativePath() == "" {
|
||||
log.Trace("No avatar was uploaded for repo: %d. Default icon will appear instead.", ctxRepo.ID)
|
||||
}
|
||||
return nil
|
||||
|
@ -940,7 +939,7 @@ func UpdateAvatarSetting(ctx *context.Context, form auth.AvatarForm) error {
|
|||
}
|
||||
defer r.Close()
|
||||
|
||||
if form.Avatar.Size > setting.AvatarMaxFileSize {
|
||||
if form.Avatar.Size > setting.Avatar.MaxFileSize {
|
||||
return errors.New(ctx.Tr("settings.uploaded_avatar_is_too_big"))
|
||||
}
|
||||
|
||||
|
|
|
@ -7,8 +7,10 @@ package routes
|
|||
import (
|
||||
"bytes"
|
||||
"encoding/gob"
|
||||
"io"
|
||||
"net/http"
|
||||
"path"
|
||||
"strings"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
|
@ -21,6 +23,7 @@ import (
|
|||
"code.gitea.io/gitea/modules/options"
|
||||
"code.gitea.io/gitea/modules/public"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/storage"
|
||||
"code.gitea.io/gitea/modules/templates"
|
||||
"code.gitea.io/gitea/modules/validation"
|
||||
"code.gitea.io/gitea/routers"
|
||||
|
@ -107,6 +110,61 @@ func RouterHandler(level log.Level) func(ctx *macaron.Context) {
|
|||
}
|
||||
}
|
||||
|
||||
func storageHandler(storageSetting setting.Storage, prefix string, objStore storage.ObjectStorage) macaron.Handler {
|
||||
if storageSetting.ServeDirect {
|
||||
return func(ctx *macaron.Context) {
|
||||
req := ctx.Req.Request
|
||||
if req.Method != "GET" && req.Method != "HEAD" {
|
||||
return
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(req.RequestURI, "/"+prefix) {
|
||||
return
|
||||
}
|
||||
|
||||
rPath := strings.TrimPrefix(req.RequestURI, "/"+prefix)
|
||||
u, err := objStore.URL(rPath, path.Base(rPath))
|
||||
if err != nil {
|
||||
ctx.Error(500, err.Error())
|
||||
return
|
||||
}
|
||||
http.Redirect(
|
||||
ctx.Resp,
|
||||
req,
|
||||
u.String(),
|
||||
301,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return func(ctx *macaron.Context) {
|
||||
req := ctx.Req.Request
|
||||
if req.Method != "GET" && req.Method != "HEAD" {
|
||||
return
|
||||
}
|
||||
|
||||
if !strings.HasPrefix(req.RequestURI, "/"+prefix) {
|
||||
return
|
||||
}
|
||||
|
||||
rPath := strings.TrimPrefix(req.RequestURI, "/"+prefix)
|
||||
rPath = strings.TrimPrefix(rPath, "/")
|
||||
//If we have matched and access to release or issue
|
||||
fr, err := objStore.Open(rPath)
|
||||
if err != nil {
|
||||
ctx.Error(500, err.Error())
|
||||
return
|
||||
}
|
||||
defer fr.Close()
|
||||
|
||||
_, err = io.Copy(ctx.Resp, fr)
|
||||
if err != nil {
|
||||
ctx.Error(500, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NewMacaron initializes Macaron instance.
|
||||
func NewMacaron() *macaron.Macaron {
|
||||
gob.Register(&u2f.Challenge{})
|
||||
|
@ -149,22 +207,9 @@ func NewMacaron() *macaron.Macaron {
|
|||
ExpiresAfter: setting.StaticCacheTime,
|
||||
},
|
||||
))
|
||||
m.Use(public.StaticHandler(
|
||||
setting.AvatarUploadPath,
|
||||
&public.Options{
|
||||
Prefix: "avatars",
|
||||
SkipLogging: setting.DisableRouterLog,
|
||||
ExpiresAfter: setting.StaticCacheTime,
|
||||
},
|
||||
))
|
||||
m.Use(public.StaticHandler(
|
||||
setting.RepositoryAvatarUploadPath,
|
||||
&public.Options{
|
||||
Prefix: "repo-avatars",
|
||||
SkipLogging: setting.DisableRouterLog,
|
||||
ExpiresAfter: setting.StaticCacheTime,
|
||||
},
|
||||
))
|
||||
|
||||
m.Use(storageHandler(setting.Avatar.Storage, "avatars", storage.Avatars))
|
||||
m.Use(storageHandler(setting.RepoAvatar.Storage, "repo-avatars", storage.RepoAvatars))
|
||||
|
||||
m.Use(templates.HTMLRenderer())
|
||||
mailer.InitMailRender(templates.Mailer())
|
||||
|
|
|
@ -20,7 +20,6 @@ import (
|
|||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
|
||||
"github.com/unknwon/com"
|
||||
"github.com/unknwon/i18n"
|
||||
)
|
||||
|
||||
|
@ -133,7 +132,7 @@ func UpdateAvatarSetting(ctx *context.Context, form auth.AvatarForm, ctxUser *mo
|
|||
}
|
||||
defer fr.Close()
|
||||
|
||||
if form.Avatar.Size > setting.AvatarMaxFileSize {
|
||||
if form.Avatar.Size > setting.Avatar.MaxFileSize {
|
||||
return errors.New(ctx.Tr("settings.uploaded_avatar_is_too_big"))
|
||||
}
|
||||
|
||||
|
@ -147,7 +146,7 @@ func UpdateAvatarSetting(ctx *context.Context, form auth.AvatarForm, ctxUser *mo
|
|||
if err = ctxUser.UploadAvatar(data); err != nil {
|
||||
return fmt.Errorf("UploadAvatar: %v", err)
|
||||
}
|
||||
} else if ctxUser.UseCustomAvatar && !com.IsFile(ctxUser.CustomAvatarPath()) {
|
||||
} else if ctxUser.UseCustomAvatar && ctxUser.Avatar == "" {
|
||||
// No avatar is uploaded but setting has been changed to enable,
|
||||
// generate a random one when needed.
|
||||
if err := ctxUser.GenerateRandomAvatar(); err != nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue