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.
2021-06-09 02:33:54 +03:00
package install
2021-01-05 16:05:40 +03:00
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-06-09 02:33:54 +03:00
"code.gitea.io/gitea/routers/common"
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-06-09 02:33:54 +03:00
type dataStore map [ string ] interface { }
func ( d * dataStore ) GetData ( ) map [ string ] interface { } {
return * d
}
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-10-20 17:37:19 +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 {
2021-06-09 02:33:54 +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
}
2021-08-06 23:47:10 +03:00
w . Header ( ) . Set ( ` X-Frame-Options ` , setting . CORSConfig . XFrameOptions )
2021-01-05 16:05:40 +03:00
2021-10-20 17:37:19 +03:00
if ! setting . IsProd {
2021-06-09 02:33:54 +03:00
store [ "ErrorMsg" ] = combinedErr
2021-01-05 16:05:40 +03:00
}
2021-06-09 02:33:54 +03:00
err = rnd . HTML ( w , 500 , "status/500" , templates . BaseVars ( ) . Merge ( store ) )
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
2021-06-09 02:33:54 +03:00
// Routes registers the install routes
func Routes ( ) * web . Route {
2021-01-26 18:36:53 +03:00
r := web . NewRoute ( )
2021-06-09 02:33:54 +03:00
for _ , middle := range common . Middlewares ( ) {
2021-01-26 18:36:53 +03:00
r . Use ( middle )
}
2021-05-30 13:25:11 +03:00
r . Use ( public . AssetsHandler ( & public . Options {
Directory : path . Join ( setting . StaticRootPath , "public" ) ,
Prefix : "/assets" ,
} ) )
2021-01-26 18:36:53 +03:00
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 ,
2021-05-31 21:22:36 +03:00
SameSite : setting . SessionConfig . SameSite ,
2021-01-26 18:36:53 +03:00
Domain : setting . SessionConfig . Domain ,
} ) )
r . Use ( installRecovery ( ) )
2021-06-09 02:33:54 +03:00
r . Use ( Init )
r . Get ( "/" , Install )
r . Post ( "/" , web . Bind ( forms . InstallForm { } ) , SubmitInstall )
2021-01-26 18:36:53 +03:00
r . NotFound ( func ( w http . ResponseWriter , req * http . Request ) {
2021-06-01 22:12:50 +03:00
http . Redirect ( w , req , setting . AppURL , http . StatusFound )
2021-01-26 18:36:53 +03:00
} )
return r
}