* add `/assets` as root dir of public files
Signed-off-by: a101211279
<1012112796@qq.com>
* move serviceworker.js
* make fmt
* fix some link
* fix test
* Apply suggestions from code review
Co-authored-by: silverwind <me@silverwind.io>
* Apply suggestions from code review
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: zeripath <art27@cantab.net>
tags/v1.15.0-rc1
@@ -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 { |
@@ -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() | |||
} | |||
@@ -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) |
@@ -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"), | |||
}, |
@@ -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" | |||
@@ -772,7 +771,7 @@ func (u *User) IsGhost() bool { | |||
} | |||
var ( | |||
reservedUsernames = append([]string{ | |||
reservedUsernames = []string{ | |||
".", | |||
"..", | |||
".well-known", | |||
@@ -807,7 +806,8 @@ var ( | |||
"stars", | |||
"template", | |||
"user", | |||
}, public.KnownPublicEntries...) | |||
"favicon.ico", | |||
} | |||
reservedUserPatterns = []string{"*.keys", "*.gpg"} | |||
) |
@@ -32,7 +32,6 @@ var KnownPublicEntries = []string{ | |||
"js", | |||
"serviceworker.js", | |||
"vendor", | |||
"favicon.ico", | |||
} | |||
// Custom implements the static handler for serving custom assets. |
@@ -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") | |||
} |
@@ -1139,12 +1139,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", | |||
}, |
@@ -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 |
@@ -152,6 +152,7 @@ func WebRoutes() *web.Route { | |||
&public.Options{ | |||
Directory: path.Join(setting.StaticRootPath, "public"), | |||
SkipLogging: setting.DisableRouterLog, | |||
Prefix: "/assets", | |||
}, | |||
)) | |||
@@ -46,11 +46,14 @@ 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. | |||
if uname == "favicon.ico" { | |||
ctx.ServeFile(path.Join(setting.StaticRootPath, "public/img/favicon.png")) | |||
return | |||
} else if strings.HasSuffix(uname, ".png") { | |||
} | |||
if strings.HasSuffix(uname, ".png") { | |||
ctx.Error(http.StatusNotFound) | |||
return | |||
} |
@@ -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); |