2021-01-05 16:05:40 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package routes
import (
"fmt"
"net/http"
2021-01-26 18:36:53 +03:00
"path"
2021-01-05 16:05:40 +03:00
"code.gitea.io/gitea/modules/log"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/modules/public"
2021-01-05 16:05:40 +03:00
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/templates"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/modules/web"
2021-01-30 11:55:53 +03:00
"code.gitea.io/gitea/modules/web/middleware"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/routers"
2021-04-06 22:44:05 +03:00
"code.gitea.io/gitea/services/forms"
2021-01-05 16:05:40 +03:00
2021-01-26 18:36:53 +03:00
"gitea.com/go-chi/session"
2021-01-05 16:05:40 +03:00
)
2021-01-26 18:36:53 +03:00
func installRecovery ( ) func ( next http . Handler ) http . Handler {
var rnd = templates . HTMLRenderer ( )
2021-01-05 16:05:40 +03:00
return func ( next http . Handler ) http . Handler {
return http . HandlerFunc ( func ( w http . ResponseWriter , req * http . Request ) {
defer func ( ) {
// Why we need this? The first recover will try to render a beautiful
// error page for user, but the process can still panic again, then
// we have to just recover twice and send a simple error page that
// should not panic any more.
defer func ( ) {
if err := recover ( ) ; err != nil {
combinedErr := fmt . Sprintf ( "PANIC: %v\n%s" , err , string ( log . Stack ( 2 ) ) )
log . Error ( combinedErr )
2021-01-15 00:17:03 +03:00
if setting . IsProd ( ) {
2021-01-05 16:05:40 +03:00
http . Error ( w , http . StatusText ( 500 ) , 500 )
2021-01-15 00:17:03 +03:00
} else {
http . Error ( w , combinedErr , 500 )
2021-01-05 16:05:40 +03:00
}
}
} ( )
if err := recover ( ) ; err != nil {
combinedErr := fmt . Sprintf ( "PANIC: %v\n%s" , err , string ( log . Stack ( 2 ) ) )
log . Error ( "%v" , combinedErr )
2021-01-30 11:55:53 +03:00
lc := middleware . Locale ( w , req )
2021-01-05 16:05:40 +03:00
var store = dataStore {
Data : templates . Vars {
2021-01-26 18:36:53 +03:00
"Language" : lc . Language ( ) ,
"CurrentURL" : setting . AppSubURL + req . URL . RequestURI ( ) ,
"i18n" : lc ,
"SignedUserID" : int64 ( 0 ) ,
"SignedUserName" : "" ,
2021-01-05 16:05:40 +03:00
} ,
}
w . Header ( ) . Set ( ` X-Frame-Options ` , ` SAMEORIGIN ` )
2021-01-15 00:17:03 +03:00
if ! setting . IsProd ( ) {
2021-01-14 18:35:10 +03:00
store . Data [ "ErrorMsg" ] = combinedErr
2021-01-05 16:05:40 +03:00
}
2021-01-08 15:15:06 +03:00
err = rnd . HTML ( w , 500 , "status/500" , templates . BaseVars ( ) . Merge ( store . Data ) )
2021-01-05 16:05:40 +03:00
if err != nil {
log . Error ( "%v" , err )
}
}
} ( )
next . ServeHTTP ( w , req )
} )
}
}
2021-01-26 18:36:53 +03:00
// InstallRoutes registers the install routes
func InstallRoutes ( ) * web . Route {
r := web . NewRoute ( )
for _ , middle := range commonMiddlewares ( ) {
r . Use ( middle )
}
r . Use ( session . Sessioner ( session . Options {
Provider : setting . SessionConfig . Provider ,
ProviderConfig : setting . SessionConfig . ProviderConfig ,
CookieName : setting . SessionConfig . CookieName ,
CookiePath : setting . SessionConfig . CookiePath ,
Gclifetime : setting . SessionConfig . Gclifetime ,
Maxlifetime : setting . SessionConfig . Maxlifetime ,
Secure : setting . SessionConfig . Secure ,
Domain : setting . SessionConfig . Domain ,
} ) )
r . Use ( installRecovery ( ) )
r . Use ( public . Custom (
& public . Options {
SkipLogging : setting . DisableRouterLog ,
} ,
) )
r . Use ( public . Static (
& public . Options {
Directory : path . Join ( setting . StaticRootPath , "public" ) ,
SkipLogging : setting . DisableRouterLog ,
} ,
) )
r . Use ( routers . InstallInit )
r . Get ( "/" , routers . Install )
r . Post ( "/" , web . Bind ( forms . InstallForm { } ) , routers . InstallPost )
r . NotFound ( func ( w http . ResponseWriter , req * http . Request ) {
http . Redirect ( w , req , setting . AppURL , 302 )
} )
return r
}