diff --git a/cmd/generate.go b/cmd/generate.go
index b94ff79aae..21f8b42bff 100644
--- a/cmd/generate.go
+++ b/cmd/generate.go
@@ -78,11 +78,7 @@ func runGenerateInternalToken(_ context.Context, c *cli.Command) error {
}
func runGenerateLfsJwtSecret(_ context.Context, c *cli.Command) error {
- _, jwtSecretBase64, err := generate.NewJwtSecretWithBase64()
- if err != nil {
- return err
- }
-
+ _, jwtSecretBase64 := generate.NewJwtSecretWithBase64()
fmt.Printf("%s", jwtSecretBase64)
if isatty.IsTerminal(os.Stdout.Fd()) {
diff --git a/modules/generate/generate.go b/modules/generate/generate.go
index 2d9a3dd902..ac84504492 100644
--- a/modules/generate/generate.go
+++ b/modules/generate/generate.go
@@ -54,13 +54,13 @@ func DecodeJwtSecretBase64(src string) ([]byte, error) {
}
// NewJwtSecretWithBase64 generates a jwt secret with its base64 encoded value intended to be used for saving into config file
-func NewJwtSecretWithBase64() ([]byte, string, error) {
+func NewJwtSecretWithBase64() ([]byte, string) {
bytes := make([]byte, defaultJwtSecretLen)
- _, err := io.ReadFull(rand.Reader, bytes)
+ _, err := rand.Read(bytes)
if err != nil {
- return nil, "", err
+ panic(err) // rand.Read never fails
}
- return bytes, base64.RawURLEncoding.EncodeToString(bytes), nil
+ return bytes, base64.RawURLEncoding.EncodeToString(bytes)
}
// NewSecretKey generate a new value intended to be used by SECRET_KEY.
diff --git a/modules/generate/generate_test.go b/modules/generate/generate_test.go
index af640a60c1..f9dd20cc7f 100644
--- a/modules/generate/generate_test.go
+++ b/modules/generate/generate_test.go
@@ -25,10 +25,12 @@ func TestDecodeJwtSecretBase64(t *testing.T) {
}
func TestNewJwtSecretWithBase64(t *testing.T) {
- secret, encoded, err := NewJwtSecretWithBase64()
- assert.NoError(t, err)
+ secret, encoded := NewJwtSecretWithBase64()
assert.Len(t, secret, 32)
decoded, err := DecodeJwtSecretBase64(encoded)
assert.NoError(t, err)
assert.Equal(t, secret, decoded)
+
+ secret2, _ := NewJwtSecretWithBase64()
+ assert.NotEqual(t, secret, secret2)
}
diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go
index 26dbde9932..e231b037cc 100644
--- a/modules/markup/markdown/markdown_test.go
+++ b/modules/markup/markdown/markdown_test.go
@@ -583,3 +583,20 @@ func TestMarkdownLink(t *testing.T) {
assert.Equal(t, `
https://example.com/__init__.py
`, string(result))
}
+
+func TestMarkdownUlDir(t *testing.T) {
+ defer test.MockVariableValue(&markup.RenderBehaviorForTesting.DisableAdditionalAttributes, false)()
+ result, err := markdown.RenderString(markup.NewTestRenderContext(), `
+* a
+ * b
+`)
+ assert.NoError(t, err)
+ assert.Equal(t, `
+`, string(result))
+}
diff --git a/modules/markup/markdown/transform_list.go b/modules/markup/markdown/transform_list.go
index c89ad2f2cf..6cafa8ff78 100644
--- a/modules/markup/markdown/transform_list.go
+++ b/modules/markup/markdown/transform_list.go
@@ -81,5 +81,16 @@ func (g *ASTTransformer) transformList(_ *markup.RenderContext, v *ast.List, rc
v.AppendChild(v, newChild)
}
}
- g.applyElementDir(v)
+
+ nestedList := false
+ for p := v.Parent(); p != nil; p = p.Parent() {
+ if _, ok := p.(*ast.List); ok {
+ nestedList = true
+ break
+ }
+ }
+ if !nestedList {
+ // "dir=auto" should be only added to top-level "ul". https://github.com/go-gitea/gitea/issues/35058
+ g.applyElementDir(v)
+ }
}
diff --git a/modules/setting/lfs.go b/modules/setting/lfs.go
index 7f2d0ae159..3ec21860ae 100644
--- a/modules/setting/lfs.go
+++ b/modules/setting/lfs.go
@@ -81,10 +81,7 @@ func loadLFSFrom(rootCfg ConfigProvider) error {
jwtSecretBase64 := loadSecret(rootCfg.Section("server"), "LFS_JWT_SECRET_URI", "LFS_JWT_SECRET")
LFS.JWTSecretBytes, err = generate.DecodeJwtSecretBase64(jwtSecretBase64)
if err != nil {
- LFS.JWTSecretBytes, jwtSecretBase64, err = generate.NewJwtSecretWithBase64()
- if err != nil {
- return fmt.Errorf("error generating JWT Secret for custom config: %v", err)
- }
+ LFS.JWTSecretBytes, jwtSecretBase64 = generate.NewJwtSecretWithBase64()
// Save secret
saveCfg, err := rootCfg.PrepareSaving()
diff --git a/modules/setting/oauth2.go b/modules/setting/oauth2.go
index 2dfe77dda9..8e0210aa51 100644
--- a/modules/setting/oauth2.go
+++ b/modules/setting/oauth2.go
@@ -139,10 +139,7 @@ func loadOAuth2From(rootCfg ConfigProvider) {
if InstallLock {
jwtSecretBytes, err := generate.DecodeJwtSecretBase64(jwtSecretBase64)
if err != nil {
- jwtSecretBytes, jwtSecretBase64, err = generate.NewJwtSecretWithBase64()
- if err != nil {
- log.Fatal("error generating JWT secret: %v", err)
- }
+ jwtSecretBytes, jwtSecretBase64 = generate.NewJwtSecretWithBase64()
saveCfg, err := rootCfg.PrepareSaving()
if err != nil {
log.Fatal("save oauth2.JWT_SECRET failed: %v", err)
@@ -162,10 +159,7 @@ var generalSigningSecret atomic.Pointer[[]byte]
func GetGeneralTokenSigningSecret() []byte {
old := generalSigningSecret.Load()
if old == nil || len(*old) == 0 {
- jwtSecret, _, err := generate.NewJwtSecretWithBase64()
- if err != nil {
- log.Fatal("Unable to generate general JWT secret: %v", err)
- }
+ jwtSecret, _ := generate.NewJwtSecretWithBase64()
if generalSigningSecret.CompareAndSwap(old, &jwtSecret) {
return jwtSecret
}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index e1d836b5c8..ef38b75696 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -1228,10 +1228,10 @@ func Routes() *web.Router {
m.Group("/branch_protections", func() {
m.Get("", repo.ListBranchProtections)
m.Post("", bind(api.CreateBranchProtectionOption{}), mustNotBeArchived, repo.CreateBranchProtection)
- m.Group("/{name}", func() {
+ m.Group("/*", func() {
m.Get("", repo.GetBranchProtection)
m.Patch("", bind(api.EditBranchProtectionOption{}), mustNotBeArchived, repo.EditBranchProtection)
- m.Delete("", repo.DeleteBranchProtection)
+ m.Delete("", mustNotBeArchived, repo.DeleteBranchProtection)
})
m.Post("/priority", bind(api.UpdateBranchProtectionPriories{}), mustNotBeArchived, repo.UpdateBranchProtectionPriories)
}, reqToken(), reqAdmin())
diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go
index c3b3fc1085..295e4c2b5e 100644
--- a/routers/api/v1/repo/branch.go
+++ b/routers/api/v1/repo/branch.go
@@ -563,7 +563,7 @@ func GetBranchProtection(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
repo := ctx.Repo.Repository
- bpName := ctx.PathParam("name")
+ bpName := ctx.PathParam("*")
bp, err := git_model.GetProtectedBranchRuleByName(ctx, repo.ID, bpName)
if err != nil {
ctx.APIErrorInternal(err)
@@ -845,7 +845,7 @@ func EditBranchProtection(ctx *context.APIContext) {
// "$ref": "#/responses/repoArchivedError"
form := web.GetForm(ctx).(*api.EditBranchProtectionOption)
repo := ctx.Repo.Repository
- bpName := ctx.PathParam("name")
+ bpName := ctx.PathParam("*")
protectBranch, err := git_model.GetProtectedBranchRuleByName(ctx, repo.ID, bpName)
if err != nil {
ctx.APIErrorInternal(err)
@@ -1168,7 +1168,7 @@ func DeleteBranchProtection(ctx *context.APIContext) {
// "$ref": "#/responses/notFound"
repo := ctx.Repo.Repository
- bpName := ctx.PathParam("name")
+ bpName := ctx.PathParam("*")
bp, err := git_model.GetProtectedBranchRuleByName(ctx, repo.ID, bpName)
if err != nil {
ctx.APIErrorInternal(err)
diff --git a/routers/api/v1/repo/tag.go b/routers/api/v1/repo/tag.go
index 9e77637282..28bc508879 100644
--- a/routers/api/v1/repo/tag.go
+++ b/routers/api/v1/repo/tag.go
@@ -107,15 +107,18 @@ func GetAnnotatedTag(ctx *context.APIContext) {
return
}
- if tag, err := ctx.Repo.GitRepo.GetAnnotatedTag(sha); err != nil {
+ tag, err := ctx.Repo.GitRepo.GetAnnotatedTag(sha)
+ if err != nil {
ctx.APIError(http.StatusBadRequest, err)
- } else {
- commit, err := ctx.Repo.GitRepo.GetTagCommit(tag.Name)
- if err != nil {
- ctx.APIError(http.StatusBadRequest, err)
- }
- ctx.JSON(http.StatusOK, convert.ToAnnotatedTag(ctx, ctx.Repo.Repository, tag, commit))
+ return
}
+
+ commit, err := ctx.Repo.GitRepo.GetTagCommit(tag.Name)
+ if err != nil {
+ ctx.APIError(http.StatusBadRequest, err)
+ return
+ }
+ ctx.JSON(http.StatusOK, convert.ToAnnotatedTag(ctx, ctx.Repo.Repository, tag, commit))
}
// GetTag get the tag of a repository
diff --git a/routers/install/install.go b/routers/install/install.go
index 81fcdfa384..dec0b31e5c 100644
--- a/routers/install/install.go
+++ b/routers/install/install.go
@@ -371,12 +371,11 @@ func SubmitInstall(ctx *context.Context) {
if form.LFSRootPath != "" {
cfg.Section("server").Key("LFS_START_SERVER").SetValue("true")
cfg.Section("lfs").Key("PATH").SetValue(form.LFSRootPath)
- var lfsJwtSecret string
- if _, lfsJwtSecret, err = generate.NewJwtSecretWithBase64(); err != nil {
- ctx.RenderWithErrDeprecated(ctx.Tr("install.lfs_jwt_secret_failed", err), tplInstall, &form)
- return
+
+ if !cfg.Section("server").HasKey("LFS_JWT_SECRET_URI") {
+ _, lfsJwtSecret := generate.NewJwtSecretWithBase64()
+ cfg.Section("server").Key("LFS_JWT_SECRET").SetValue(lfsJwtSecret)
}
- cfg.Section("server").Key("LFS_JWT_SECRET").SetValue(lfsJwtSecret)
} else {
cfg.Section("server").Key("LFS_START_SERVER").SetValue("false")
}
@@ -437,11 +436,7 @@ func SubmitInstall(ctx *context.Context) {
// FIXME: at the moment, no matter oauth2 is enabled or not, it must generate a "oauth2 JWT_SECRET"
// see the "loadOAuth2From" in "setting/oauth2.go"
if !cfg.Section("oauth2").HasKey("JWT_SECRET") && !cfg.Section("oauth2").HasKey("JWT_SECRET_URI") {
- _, jwtSecretBase64, err := generate.NewJwtSecretWithBase64()
- if err != nil {
- ctx.RenderWithErrDeprecated(ctx.Tr("install.secret_key_failed", err), tplInstall, &form)
- return
- }
+ _, jwtSecretBase64 := generate.NewJwtSecretWithBase64()
cfg.Section("oauth2").Key("JWT_SECRET").SetValue(jwtSecretBase64)
}
diff --git a/templates/projects/view.tmpl b/templates/projects/view.tmpl
index 3e1afab79f..ac08e56781 100644
--- a/templates/projects/view.tmpl
+++ b/templates/projects/view.tmpl
@@ -1,6 +1,6 @@
{{$canWriteProject := and .CanWriteProjects (or (not .Repository) (not .Repository.IsArchived))}}
-