You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

routes.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package install
  5. import (
  6. "fmt"
  7. "net/http"
  8. "path"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/public"
  11. "code.gitea.io/gitea/modules/setting"
  12. "code.gitea.io/gitea/modules/templates"
  13. "code.gitea.io/gitea/modules/web"
  14. "code.gitea.io/gitea/modules/web/middleware"
  15. "code.gitea.io/gitea/routers/common"
  16. "code.gitea.io/gitea/services/forms"
  17. "gitea.com/go-chi/session"
  18. )
  19. type dataStore map[string]interface{}
  20. func (d *dataStore) GetData() map[string]interface{} {
  21. return *d
  22. }
  23. func installRecovery() func(next http.Handler) http.Handler {
  24. var rnd = templates.HTMLRenderer()
  25. return func(next http.Handler) http.Handler {
  26. return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
  27. defer func() {
  28. // Why we need this? The first recover will try to render a beautiful
  29. // error page for user, but the process can still panic again, then
  30. // we have to just recover twice and send a simple error page that
  31. // should not panic any more.
  32. defer func() {
  33. if err := recover(); err != nil {
  34. combinedErr := fmt.Sprintf("PANIC: %v\n%s", err, string(log.Stack(2)))
  35. log.Error(combinedErr)
  36. if setting.IsProd() {
  37. http.Error(w, http.StatusText(500), 500)
  38. } else {
  39. http.Error(w, combinedErr, 500)
  40. }
  41. }
  42. }()
  43. if err := recover(); err != nil {
  44. combinedErr := fmt.Sprintf("PANIC: %v\n%s", err, string(log.Stack(2)))
  45. log.Error("%v", combinedErr)
  46. lc := middleware.Locale(w, req)
  47. var store = dataStore{
  48. "Language": lc.Language(),
  49. "CurrentURL": setting.AppSubURL + req.URL.RequestURI(),
  50. "i18n": lc,
  51. "SignedUserID": int64(0),
  52. "SignedUserName": "",
  53. }
  54. w.Header().Set(`X-Frame-Options`, `SAMEORIGIN`)
  55. if !setting.IsProd() {
  56. store["ErrorMsg"] = combinedErr
  57. }
  58. err = rnd.HTML(w, 500, "status/500", templates.BaseVars().Merge(store))
  59. if err != nil {
  60. log.Error("%v", err)
  61. }
  62. }
  63. }()
  64. next.ServeHTTP(w, req)
  65. })
  66. }
  67. }
  68. // Routes registers the install routes
  69. func Routes() *web.Route {
  70. r := web.NewRoute()
  71. for _, middle := range common.Middlewares() {
  72. r.Use(middle)
  73. }
  74. r.Use(public.AssetsHandler(&public.Options{
  75. Directory: path.Join(setting.StaticRootPath, "public"),
  76. Prefix: "/assets",
  77. }))
  78. r.Use(session.Sessioner(session.Options{
  79. Provider: setting.SessionConfig.Provider,
  80. ProviderConfig: setting.SessionConfig.ProviderConfig,
  81. CookieName: setting.SessionConfig.CookieName,
  82. CookiePath: setting.SessionConfig.CookiePath,
  83. Gclifetime: setting.SessionConfig.Gclifetime,
  84. Maxlifetime: setting.SessionConfig.Maxlifetime,
  85. Secure: setting.SessionConfig.Secure,
  86. SameSite: setting.SessionConfig.SameSite,
  87. Domain: setting.SessionConfig.Domain,
  88. }))
  89. r.Use(installRecovery())
  90. r.Use(Init)
  91. r.Get("/", Install)
  92. r.Post("/", web.Bind(forms.InstallForm{}), SubmitInstall)
  93. r.NotFound(func(w http.ResponseWriter, req *http.Request) {
  94. http.Redirect(w, req, setting.AppURL, http.StatusFound)
  95. })
  96. return r
  97. }