diff --git a/routers/web/web.go b/routers/web/web.go index 4f5901c0ec661..c307231c16bb2 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -350,6 +350,12 @@ func registerRoutes(m *web.Route) { ctx.Redirect(setting.AppSubURL + "/user/settings/account") }) }) + wellKnownDir := wellKnownWebDir() + m.Get("/.well-known/*", func(ctx *context.Context) { + fsHandler := http.FileServer(wellKnownDir) + fs := http.StripPrefix("/.well-known/", fsHandler) + fs.ServeHTTP(ctx.Resp, ctx.Req) + }) m.Group("/explore", func() { m.Get("", func(ctx *context.Context) { diff --git a/routers/web/well_known.go b/routers/web/well_known.go new file mode 100644 index 0000000000000..86b2c96338570 --- /dev/null +++ b/routers/web/well_known.go @@ -0,0 +1,37 @@ +// Copyright 2023 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package web + +import ( + "net/http" + "os" + "path/filepath" + + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" +) + +// create or check .well-known directory exist +func wellKnownWebDir() http.Dir { + wellKnownDir := http.Dir(filepath.Join(setting.CustomPath, "web-well-known")) + makeDirExist(string(wellKnownDir)) + + return wellKnownDir +} + +// check directory exist, create if not +func makeDirExist(dirName string) { + _, err := os.Stat(dirName) + if err == nil { + return + } + if os.IsNotExist(err) { + err := os.Mkdir(dirName, os.FileMode(0o755)) + if err != nil { + log.Fatal(".well-known directory (%s) mkdir error %v", dirName, err) + } + } else { + log.Warn(".well-known directory (%s) check error %v", dirName, err) + } +}