From b9e3801d066ecd1f77d9b7fd57c44041072f4bcc Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Wed, 31 Mar 2021 10:37:31 +0800 Subject: [PATCH 1/7] add `/assets` as root dir of public files Signed-off-by: a1012112796 <1012112796@qq.com> --- models/user.go | 7 ++++--- modules/public/public.go | 1 - modules/setting/setting.go | 4 ++-- modules/templates/helper.go | 2 +- routers/routes/web.go | 1 + routers/user/profile.go | 12 ++++++++++-- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/models/user.go b/models/user.go index 098f6af2b374a..12247ff4557c6 100644 --- a/models/user.go +++ b/models/user.go @@ -25,7 +25,6 @@ import ( "code.gitea.io/gitea/modules/generate" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/log" - "code.gitea.io/gitea/modules/public" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/storage" "code.gitea.io/gitea/modules/structs" @@ -780,7 +779,7 @@ func (u *User) IsGhost() bool { } var ( - reservedUsernames = append([]string{ + reservedUsernames = []string{ ".", "..", ".well-known", @@ -815,7 +814,9 @@ var ( "stars", "template", "user", - }, public.KnownPublicEntries...) + "favicon.ico", + "serviceworker.js", + } reservedUserPatterns = []string{"*.keys", "*.gpg"} ) diff --git a/modules/public/public.go b/modules/public/public.go index ee3d2cf75f739..494ff9a2a418d 100644 --- a/modules/public/public.go +++ b/modules/public/public.go @@ -32,7 +32,6 @@ var KnownPublicEntries = []string{ "js", "serviceworker.js", "vendor", - "favicon.ico", } // Custom implements the static handler for serving custom assets. diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 280987ed66e40..650fbd4ca3e46 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1144,12 +1144,12 @@ func MakeManifestData(appName string, appURL string, absoluteAssetURL string) [] StartURL: appURL, Icons: []manifestIcon{ { - Src: absoluteAssetURL + "/img/logo.png", + Src: absoluteAssetURL + "/assets/img/logo.png", Type: "image/png", Sizes: "512x512", }, { - Src: absoluteAssetURL + "/img/logo.svg", + Src: absoluteAssetURL + "/assets/img/logo.svg", Type: "image/svg+xml", Sizes: "512x512", }, diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 7e33f262094ee..ea25783e93afd 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -61,7 +61,7 @@ func NewFuncMap() []template.FuncMap { return setting.AppSubURL }, "StaticUrlPrefix": func() string { - return setting.StaticURLPrefix + return setting.StaticURLPrefix + "/assets" }, "AppUrl": func() string { return setting.AppURL diff --git a/routers/routes/web.go b/routers/routes/web.go index e59609d83117f..d20677d68156c 100644 --- a/routers/routes/web.go +++ b/routers/routes/web.go @@ -152,6 +152,7 @@ func WebRoutes() *web.Route { &public.Options{ Directory: path.Join(setting.StaticRootPath, "public"), SkipLogging: setting.DisableRouterLog, + Prefix: "/assets", }, )) diff --git a/routers/user/profile.go b/routers/user/profile.go index ea4a1e8893466..c681898b9674d 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -44,11 +44,19 @@ func GetUserByParams(ctx *context.Context) *models.User { // Profile render user's profile page func Profile(ctx *context.Context) { uname := ctx.Params(":username") - // Special handle for FireFox requests favicon.ico. + + // Special handle for requests `favicon.ico` and `serviceworker.js`. if uname == "favicon.ico" { ctx.ServeFile(path.Join(setting.StaticRootPath, "public/img/favicon.png")) return - } else if strings.HasSuffix(uname, ".png") { + } + + if uname == "serviceworker.js" { + ctx.ServeFile(path.Join(setting.StaticRootPath, "public/serviceworker.js")) + return + } + + if strings.HasSuffix(uname, ".png") { ctx.Error(404) return } From 23fbe1bf2deee21fca74c038f741c0219fbb0066 Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Thu, 1 Apr 2021 09:27:26 +0800 Subject: [PATCH 2/7] move serviceworker.js --- models/user.go | 1 - routers/user/profile.go | 7 +------ web_src/js/features/serviceworker.js | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/models/user.go b/models/user.go index 12247ff4557c6..3ce3cbd0f0206 100644 --- a/models/user.go +++ b/models/user.go @@ -815,7 +815,6 @@ var ( "template", "user", "favicon.ico", - "serviceworker.js", } reservedUserPatterns = []string{"*.keys", "*.gpg"} diff --git a/routers/user/profile.go b/routers/user/profile.go index c681898b9674d..da2edea9226fb 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -45,17 +45,12 @@ func GetUserByParams(ctx *context.Context) *models.User { func Profile(ctx *context.Context) { uname := ctx.Params(":username") - // Special handle for requests `favicon.ico` and `serviceworker.js`. + // Special handle for FireFox requests favicon.ico. if uname == "favicon.ico" { ctx.ServeFile(path.Join(setting.StaticRootPath, "public/img/favicon.png")) return } - if uname == "serviceworker.js" { - ctx.ServeFile(path.Join(setting.StaticRootPath, "public/serviceworker.js")) - return - } - if strings.HasSuffix(uname, ".png") { ctx.Error(404) return diff --git a/web_src/js/features/serviceworker.js b/web_src/js/features/serviceworker.js index fa415866cd299..400a33140b15a 100644 --- a/web_src/js/features/serviceworker.js +++ b/web_src/js/features/serviceworker.js @@ -35,7 +35,7 @@ export default async function initServiceWorker() { // the spec strictly requires it to be same-origin so it has to be AppSubUrl to work await Promise.all([ checkCacheValidity(), - navigator.serviceWorker.register(`${AppSubUrl}/serviceworker.js`), + navigator.serviceWorker.register(`${AppSubUrl}/assets/serviceworker.js`), ]); } catch (err) { console.error(err); From 01c3af076e8215003b19339596421598b15e7b7b Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Thu, 8 Apr 2021 22:00:14 +0800 Subject: [PATCH 3/7] make fmt --- routers/user/profile.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/user/profile.go b/routers/user/profile.go index 8cfb5f782d863..026e26f8cb3a9 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -54,7 +54,7 @@ func Profile(ctx *context.Context) { if strings.HasSuffix(uname, ".png") { ctx.Error(http.StatusNotFound) - return + return } isShowKeys := false From 4a91f3f24ee299765b879e78ce1dd74f7ddbc206 Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Fri, 9 Apr 2021 20:24:53 +0800 Subject: [PATCH 4/7] fix some link --- integrations/links_test.go | 2 +- models/avatar.go | 2 +- models/oauth2.go | 26 +++++++++++++------------- modules/setting/picture.go | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/integrations/links_test.go b/integrations/links_test.go index e16b688c8de3b..3b9c245fc37c1 100644 --- a/integrations/links_test.go +++ b/integrations/links_test.go @@ -51,7 +51,7 @@ func TestRedirectsNoLogin(t *testing.T) { "/user2/repo1/src/master": "/user2/repo1/src/branch/master", "/user2/repo1/src/master/file.txt": "/user2/repo1/src/branch/master/file.txt", "/user2/repo1/src/master/directory/file.txt": "/user2/repo1/src/branch/master/directory/file.txt", - "/user/avatar/Ghost/-1": "/img/avatar_default.png", + "/user/avatar/Ghost/-1": "/assets/img/avatar_default.png", "/api/v1/swagger": "/api/swagger", } for link, redirectLink := range redirects { diff --git a/models/avatar.go b/models/avatar.go index 166ca337ca262..6d711d5f8f7d9 100644 --- a/models/avatar.go +++ b/models/avatar.go @@ -32,7 +32,7 @@ func DefaultAvatarLink() string { return "" } - u.Path = path.Join(u.Path, "/img/avatar_default.png") + u.Path = path.Join(u.Path, "/assets/img/avatar_default.png") return u.String() } diff --git a/models/oauth2.go b/models/oauth2.go index 83e2e8c43f0b9..cc9de74f84ebc 100644 --- a/models/oauth2.go +++ b/models/oauth2.go @@ -23,11 +23,11 @@ type OAuth2Provider struct { // key is used to map the OAuth2Provider with the goth provider type (also in LoginSource.OAuth2Config.Provider) // value is used to store display data var OAuth2Providers = map[string]OAuth2Provider{ - "bitbucket": {Name: "bitbucket", DisplayName: "Bitbucket", Image: "/img/auth/bitbucket.png"}, - "dropbox": {Name: "dropbox", DisplayName: "Dropbox", Image: "/img/auth/dropbox.png"}, - "facebook": {Name: "facebook", DisplayName: "Facebook", Image: "/img/auth/facebook.png"}, + "bitbucket": {Name: "bitbucket", DisplayName: "Bitbucket", Image: "/assets/img/auth/bitbucket.png"}, + "dropbox": {Name: "dropbox", DisplayName: "Dropbox", Image: "/assets/img/auth/dropbox.png"}, + "facebook": {Name: "facebook", DisplayName: "Facebook", Image: "/assets/img/auth/facebook.png"}, "github": { - Name: "github", DisplayName: "GitHub", Image: "/img/auth/github.png", + Name: "github", DisplayName: "GitHub", Image: "/assets/img/auth/github.png", CustomURLMapping: &oauth2.CustomURLMapping{ TokenURL: oauth2.GetDefaultTokenURL("github"), AuthURL: oauth2.GetDefaultAuthURL("github"), @@ -36,19 +36,19 @@ var OAuth2Providers = map[string]OAuth2Provider{ }, }, "gitlab": { - Name: "gitlab", DisplayName: "GitLab", Image: "/img/auth/gitlab.png", + Name: "gitlab", DisplayName: "GitLab", Image: "/assets/img/auth/gitlab.png", CustomURLMapping: &oauth2.CustomURLMapping{ TokenURL: oauth2.GetDefaultTokenURL("gitlab"), AuthURL: oauth2.GetDefaultAuthURL("gitlab"), ProfileURL: oauth2.GetDefaultProfileURL("gitlab"), }, }, - "gplus": {Name: "gplus", DisplayName: "Google", Image: "/img/auth/google.png"}, - "openidConnect": {Name: "openidConnect", DisplayName: "OpenID Connect", Image: "/img/auth/openid_connect.svg"}, - "twitter": {Name: "twitter", DisplayName: "Twitter", Image: "/img/auth/twitter.png"}, - "discord": {Name: "discord", DisplayName: "Discord", Image: "/img/auth/discord.png"}, + "gplus": {Name: "gplus", DisplayName: "Google", Image: "/assets/img/auth/google.png"}, + "openidConnect": {Name: "openidConnect", DisplayName: "OpenID Connect", Image: "/assets/img/auth/openid_connect.svg"}, + "twitter": {Name: "twitter", DisplayName: "Twitter", Image: "/assets/img/auth/twitter.png"}, + "discord": {Name: "discord", DisplayName: "Discord", Image: "/assets/img/auth/discord.png"}, "gitea": { - Name: "gitea", DisplayName: "Gitea", Image: "/img/auth/gitea.png", + Name: "gitea", DisplayName: "Gitea", Image: "/assets/img/auth/gitea.png", CustomURLMapping: &oauth2.CustomURLMapping{ TokenURL: oauth2.GetDefaultTokenURL("gitea"), AuthURL: oauth2.GetDefaultAuthURL("gitea"), @@ -56,16 +56,16 @@ var OAuth2Providers = map[string]OAuth2Provider{ }, }, "nextcloud": { - Name: "nextcloud", DisplayName: "Nextcloud", Image: "/img/auth/nextcloud.png", + Name: "nextcloud", DisplayName: "Nextcloud", Image: "/assets/img/auth/nextcloud.png", CustomURLMapping: &oauth2.CustomURLMapping{ TokenURL: oauth2.GetDefaultTokenURL("nextcloud"), AuthURL: oauth2.GetDefaultAuthURL("nextcloud"), ProfileURL: oauth2.GetDefaultProfileURL("nextcloud"), }, }, - "yandex": {Name: "yandex", DisplayName: "Yandex", Image: "/img/auth/yandex.png"}, + "yandex": {Name: "yandex", DisplayName: "Yandex", Image: "/assets/img/auth/yandex.png"}, "mastodon": { - Name: "mastodon", DisplayName: "Mastodon", Image: "/img/auth/mastodon.png", + Name: "mastodon", DisplayName: "Mastodon", Image: "/assets/img/auth/mastodon.png", CustomURLMapping: &oauth2.CustomURLMapping{ AuthURL: oauth2.GetDefaultAuthURL("mastodon"), }, diff --git a/modules/setting/picture.go b/modules/setting/picture.go index fa97245aa144b..415552d7ce646 100644 --- a/modules/setting/picture.go +++ b/modules/setting/picture.go @@ -110,5 +110,5 @@ func newRepoAvatarService() { RepoAvatar.Storage = getStorage("repo-avatars", storageType, repoAvatarSec) RepoAvatar.Fallback = sec.Key("REPOSITORY_AVATAR_FALLBACK").MustString("none") - RepoAvatar.FallbackImage = sec.Key("REPOSITORY_AVATAR_FALLBACK_IMAGE").MustString("/img/repo_default.png") + RepoAvatar.FallbackImage = sec.Key("REPOSITORY_AVATAR_FALLBACK_IMAGE").MustString("/assets/img/repo_default.png") } From 45c548ae4ad0cc5dd24dee1465c1b7a62de25f87 Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Fri, 9 Apr 2021 22:13:21 +0800 Subject: [PATCH 5/7] fix test --- models/avatar_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/avatar_test.go b/models/avatar_test.go index 89540705a0144..bf99897d8812e 100644 --- a/models/avatar_test.go +++ b/models/avatar_test.go @@ -41,7 +41,7 @@ func TestHashEmail(t *testing.T) { func TestSizedAvatarLink(t *testing.T) { disableGravatar() - assert.Equal(t, "/suburl/img/avatar_default.png", + assert.Equal(t, "/suburl/assets/img/avatar_default.png", SizedAvatarLink("gitea@example.com", 100)) enableGravatar(t) From 02f48bb14c8c925ca13567030f2985a131f3c8c5 Mon Sep 17 00:00:00 2001 From: a1012112796 <1012112796@qq.com> Date: Sat, 10 Apr 2021 10:31:04 +0800 Subject: [PATCH 6/7] Apply suggestions from code review Co-authored-by: silverwind --- webpack.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 53d5538250497..44d50a45e63ea 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -186,7 +186,7 @@ export default { type: 'asset/resource', generator: { filename: 'fonts/[name][ext]', - publicPath: '/', // required to remove css/ path segment + publicPath: '/assets/', // required to remove css/ path segment } }, { @@ -194,7 +194,7 @@ export default { type: 'asset/resource', generator: { filename: 'img/webpack/[name][ext]', - publicPath: '/', // required to remove css/ path segment + publicPath: '/assets/', // required to remove css/ path segment } }, ], From 38f78cfcbb7db518876a213efb5350e00e143417 Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 15 Apr 2021 21:33:56 +0100 Subject: [PATCH 7/7] Apply suggestions from code review Co-authored-by: silverwind --- webpack.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index 44d50a45e63ea..60c29ba60f8a8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -186,7 +186,7 @@ export default { type: 'asset/resource', generator: { filename: 'fonts/[name][ext]', - publicPath: '/assets/', // required to remove css/ path segment + publicPath: '../', // required to remove css/ path segment } }, { @@ -194,7 +194,7 @@ export default { type: 'asset/resource', generator: { filename: 'img/webpack/[name][ext]', - publicPath: '/assets/', // required to remove css/ path segment + publicPath: '../', // required to remove css/ path segment } }, ],