From e24ee487760cade0c47958fa8c4c1b980875900f Mon Sep 17 00:00:00 2001
From: silverwind <me@silverwind.io>
Date: Sat, 20 Jun 2020 15:20:25 +0200
Subject: [PATCH] Add serviceworker.js to KnownPublicEntries (#11992)

Fixes a wrong 302 redirect to the login page, see https://github.com/go-gitea/gitea/issues/11989.
Also made it so the reserved username list is extended with those known
entries so we avoid code duplication.

Should be backported to 1.12.
---
 models/user.go           | 11 ++++-------
 modules/public/public.go |  7 ++++---
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/models/user.go b/models/user.go
index 4597508fb1..608bf219cf 100644
--- a/models/user.go
+++ b/models/user.go
@@ -29,6 +29,7 @@ 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/structs"
 	api "code.gitea.io/gitea/modules/structs"
@@ -879,7 +880,7 @@ func (u *User) IsGhost() bool {
 }
 
 var (
-	reservedUsernames = []string{
+	reservedUsernames = append([]string{
 		".",
 		"..",
 		".well-known",
@@ -889,17 +890,13 @@ var (
 		"attachments",
 		"avatars",
 		"commits",
-		"css",
 		"debug",
 		"error",
 		"explore",
-		"fomantic",
 		"ghost",
 		"help",
-		"img",
 		"install",
 		"issues",
-		"js",
 		"less",
 		"login",
 		"manifest.json",
@@ -917,8 +914,8 @@ var (
 		"stars",
 		"template",
 		"user",
-		"vendor",
-	}
+	}, public.KnownPublicEntries...)
+
 	reservedUserPatterns = []string{"*.keys", "*.gpg"}
 )
 
diff --git a/modules/public/public.go b/modules/public/public.go
index fb8d9c1955..8d027855c2 100644
--- a/modules/public/public.go
+++ b/modules/public/public.go
@@ -30,12 +30,13 @@ type Options struct {
 	Prefix       string
 }
 
-// List of known entries inside the `public` directory
-var knownEntries = []string{
+// KnownPublicEntries list all direct children in the `public` directory
+var KnownPublicEntries = []string{
 	"css",
 	"fomantic",
 	"img",
 	"js",
+	"serviceworker.js",
 	"vendor",
 }
 
@@ -114,7 +115,7 @@ func (opts *Options) handle(ctx *macaron.Context, log *log.Logger, opt *Options)
 			if len(parts) < 2 {
 				return false
 			}
-			for _, entry := range knownEntries {
+			for _, entry := range KnownPublicEntries {
 				if entry == parts[1] {
 					ctx.Resp.WriteHeader(404)
 					return true