2014-03-25 12:51:42 +04:00
// Copyright 2014 The Gogs 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 routers
2014-03-28 15:26:22 +04:00
import (
2020-10-20 00:03:08 +03:00
"net/http"
2014-03-30 01:50:51 +04:00
"os"
2014-04-08 23:27:35 +04:00
"os/exec"
2015-02-05 13:12:37 +03:00
"path/filepath"
2014-03-30 01:50:51 +04:00
"strings"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
2018-02-18 21:14:37 +03:00
"code.gitea.io/gitea/modules/generate"
2019-12-15 12:51:28 +03:00
"code.gitea.io/gitea/modules/graceful"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/user"
2019-08-23 19:40:30 +03:00
"github.com/unknwon/com"
"gopkg.in/ini.v1"
2014-03-28 15:26:22 +04:00
)
2014-06-22 21:14:03 +04:00
const (
2016-11-18 06:03:03 +03:00
// tplInstall template for installation page
2020-10-20 00:03:08 +03:00
tplInstall base . TplName = "install"
tplPostInstall base . TplName = "post-install"
2014-06-22 21:14:03 +04:00
)
2016-11-18 06:03:03 +03:00
// InstallInit prepare for rendering installation page
2016-03-11 19:56:52 +03:00
func InstallInit ( ctx * context . Context ) {
2014-05-26 04:11:25 +04:00
if setting . InstallLock {
2020-10-20 00:03:08 +03:00
ctx . Header ( ) . Add ( "Refresh" , "1; url=" + setting . AppURL + "user/login" )
ctx . HTML ( 200 , tplPostInstall )
2014-03-28 15:26:22 +04:00
return
}
2014-03-25 12:51:42 +04:00
2014-09-08 03:02:58 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "install.install" )
2014-03-28 15:26:22 +04:00
ctx . Data [ "PageIsInstall" ] = true
2019-08-24 12:24:45 +03:00
ctx . Data [ "DbOptions" ] = setting . SupportedDatabases
2015-02-01 20:41:03 +03:00
}
2014-03-30 01:50:51 +04:00
2016-11-18 06:03:03 +03:00
// Install render installation page
2016-03-11 19:56:52 +03:00
func Install ( ctx * context . Context ) {
2015-02-01 20:41:03 +03:00
form := auth . InstallForm { }
2015-07-09 08:17:48 +03:00
// Database settings
2019-08-24 12:24:45 +03:00
form . DbHost = setting . Database . Host
form . DbUser = setting . Database . User
form . DbPasswd = setting . Database . Passwd
form . DbName = setting . Database . Name
form . DbPath = setting . Database . Path
2020-01-20 18:45:14 +03:00
form . DbSchema = setting . Database . Schema
2019-08-24 12:24:45 +03:00
form . Charset = setting . Database . Charset
2015-02-01 20:41:03 +03:00
2020-11-16 10:33:41 +03:00
var curDBOption = "MySQL"
2019-08-24 12:24:45 +03:00
switch setting . Database . Type {
2015-09-12 04:00:12 +03:00
case "postgres" :
2020-11-16 10:33:41 +03:00
curDBOption = "PostgreSQL"
2016-12-24 04:37:35 +03:00
case "mssql" :
2020-11-16 10:33:41 +03:00
curDBOption = "MSSQL"
2015-09-12 04:00:12 +03:00
case "sqlite3" :
2019-08-24 12:24:45 +03:00
if setting . EnableSQLite3 {
2020-11-16 10:33:41 +03:00
curDBOption = "SQLite3"
2015-09-12 22:31:36 +03:00
}
2015-07-09 08:17:48 +03:00
}
2020-11-16 10:33:41 +03:00
ctx . Data [ "CurDbOption" ] = curDBOption
2015-07-09 08:17:48 +03:00
// Application general settings
form . AppName = setting . AppName
2015-02-01 20:41:03 +03:00
form . RepoRootPath = setting . RepoRootPath
2020-09-29 12:05:13 +03:00
form . LFSRootPath = setting . LFS . Path
2015-02-01 20:41:03 +03:00
2017-06-18 03:30:04 +03:00
// Note(unknown): it's hard for Windows users change a running user,
2015-02-01 20:41:03 +03:00
// so just use current one if config says default.
if setting . IsWindows && setting . RunUser == "git" {
2015-07-31 09:50:11 +03:00
form . RunUser = user . CurrentUsername ( )
2015-02-01 20:41:03 +03:00
} else {
form . RunUser = setting . RunUser
2014-04-10 22:37:43 +04:00
}
2014-03-30 01:50:51 +04:00
2015-02-01 20:41:03 +03:00
form . Domain = setting . Domain
2016-02-28 04:48:39 +03:00
form . SSHPort = setting . SSH . Port
2016-08-12 00:55:10 +03:00
form . HTTPPort = setting . HTTPPort
2016-11-27 09:03:59 +03:00
form . AppURL = setting . AppURL
2016-02-12 17:19:45 +03:00
form . LogRootPath = setting . LogRootPath
2015-02-01 20:41:03 +03:00
2015-07-09 08:17:48 +03:00
// E-mail service settings
if setting . MailService != nil {
form . SMTPHost = setting . MailService . Host
2015-07-09 11:10:31 +03:00
form . SMTPFrom = setting . MailService . From
2017-02-24 04:37:13 +03:00
form . SMTPUser = setting . MailService . User
2014-04-27 08:34:48 +04:00
}
2015-07-09 08:17:48 +03:00
form . RegisterConfirm = setting . Service . RegisterEmailConfirm
form . MailNotify = setting . Service . EnableNotifyMail
// Server and other services settings
form . OfflineMode = setting . OfflineMode
2015-08-29 19:22:26 +03:00
form . DisableGravatar = setting . DisableGravatar
2016-08-07 20:27:38 +03:00
form . EnableFederatedAvatar = setting . EnableFederatedAvatar
2017-11-29 15:47:42 +03:00
form . EnableOpenIDSignIn = setting . Service . EnableOpenIDSignIn
form . EnableOpenIDSignUp = setting . Service . EnableOpenIDSignUp
2015-07-09 08:17:48 +03:00
form . DisableRegistration = setting . Service . DisableRegistration
2018-05-13 10:51:16 +03:00
form . AllowOnlyExternalRegistration = setting . Service . AllowOnlyExternalRegistration
2015-09-13 19:14:32 +03:00
form . EnableCaptcha = setting . Service . EnableCaptcha
2015-07-09 08:17:48 +03:00
form . RequireSignInView = setting . Service . RequireSignInView
2017-01-08 06:12:03 +03:00
form . DefaultKeepEmailPrivate = setting . Service . DefaultKeepEmailPrivate
2017-05-08 22:51:53 +03:00
form . DefaultAllowCreateOrganization = setting . Service . DefaultAllowCreateOrganization
2017-09-12 09:48:13 +03:00
form . DefaultEnableTimetracking = setting . Service . DefaultEnableTimetracking
2017-01-08 06:12:03 +03:00
form . NoReplyAddress = setting . Service . NoReplyAddress
2014-04-27 08:34:48 +04:00
2014-04-10 22:37:43 +04:00
auth . AssignForm ( form , ctx . Data )
2016-11-18 06:03:03 +03:00
ctx . HTML ( 200 , tplInstall )
2014-04-10 22:37:43 +04:00
}
2016-11-18 06:03:03 +03:00
// InstallPost response for submit install items
2016-03-11 19:56:52 +03:00
func InstallPost ( ctx * context . Context , form auth . InstallForm ) {
2016-12-20 15:32:02 +03:00
var err error
2015-02-01 20:41:03 +03:00
ctx . Data [ "CurDbOption" ] = form . DbType
2014-04-27 08:34:48 +04:00
2014-03-30 01:50:51 +04:00
if ctx . HasError ( ) {
2017-02-24 04:37:13 +03:00
if ctx . HasValue ( "Err_SMTPUser" ) {
2015-07-08 14:47:56 +03:00
ctx . Data [ "Err_SMTP" ] = true
}
if ctx . HasValue ( "Err_AdminName" ) ||
ctx . HasValue ( "Err_AdminPasswd" ) ||
ctx . HasValue ( "Err_AdminEmail" ) {
ctx . Data [ "Err_Admin" ] = true
}
2016-11-18 06:03:03 +03:00
ctx . HTML ( 200 , tplInstall )
2014-03-30 01:50:51 +04:00
return
}
2016-12-20 15:32:02 +03:00
if _ , err = exec . LookPath ( "git" ) ; err != nil {
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.test_git_failed" , err ) , tplInstall , & form )
2014-04-08 23:27:35 +04:00
return
}
2014-03-30 01:50:51 +04:00
// Pass basic check, now test configuration.
// Test database setting.
2019-08-24 12:24:45 +03:00
setting . Database . Type = setting . GetDBTypeByName ( form . DbType )
setting . Database . Host = form . DbHost
setting . Database . User = form . DbUser
setting . Database . Passwd = form . DbPasswd
setting . Database . Name = form . DbName
2020-01-20 18:45:14 +03:00
setting . Database . Schema = form . DbSchema
2019-08-24 12:24:45 +03:00
setting . Database . SSLMode = form . SSLMode
setting . Database . Charset = form . Charset
setting . Database . Path = form . DbPath
if ( setting . Database . Type == "sqlite3" ) &&
len ( setting . Database . Path ) == 0 {
2015-09-12 22:31:36 +03:00
ctx . Data [ "Err_DbPath" ] = true
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.err_empty_db_path" ) , tplInstall , & form )
2015-09-12 22:31:36 +03:00
return
2015-07-08 14:47:56 +03:00
}
2014-03-30 19:09:59 +04:00
// Set test engine.
2020-07-13 11:58:55 +03:00
if err = models . NewTestEngine ( ) ; err != nil {
2014-03-30 19:09:59 +04:00
if strings . Contains ( err . Error ( ) , ` Unknown database type: sqlite3 ` ) {
2015-07-08 14:47:56 +03:00
ctx . Data [ "Err_DbType" ] = true
2018-08-12 04:05:52 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.sqlite3_not_available" , "https://docs.gitea.io/en-us/install-from-binary/" ) , tplInstall , & form )
2014-03-30 17:39:44 +04:00
} else {
2015-07-08 14:47:56 +03:00
ctx . Data [ "Err_DbSetting" ] = true
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.invalid_db_setting" , err ) , tplInstall , & form )
2014-03-30 17:39:44 +04:00
}
2014-03-30 01:50:51 +04:00
return
}
// Test repository root path.
2020-10-11 23:27:20 +03:00
form . RepoRootPath = strings . ReplaceAll ( form . RepoRootPath , "\\" , "/" )
2016-12-20 15:32:02 +03:00
if err = os . MkdirAll ( form . RepoRootPath , os . ModePerm ) ; err != nil {
2014-09-15 03:22:52 +04:00
ctx . Data [ "Err_RepoRootPath" ] = true
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.invalid_repo_path" , err ) , tplInstall , & form )
2014-03-30 01:50:51 +04:00
return
}
2016-12-26 04:16:37 +03:00
// Test LFS root path if not empty, empty meaning disable LFS
if form . LFSRootPath != "" {
2020-10-11 23:27:20 +03:00
form . LFSRootPath = strings . ReplaceAll ( form . LFSRootPath , "\\" , "/" )
2016-12-26 04:16:37 +03:00
if err := os . MkdirAll ( form . LFSRootPath , os . ModePerm ) ; err != nil {
ctx . Data [ "Err_LFSRootPath" ] = true
ctx . RenderWithErr ( ctx . Tr ( "install.invalid_lfs_path" , err ) , tplInstall , & form )
return
}
}
2016-02-12 17:19:45 +03:00
// Test log root path.
2020-10-11 23:27:20 +03:00
form . LogRootPath = strings . ReplaceAll ( form . LogRootPath , "\\" , "/" )
2016-12-20 15:32:02 +03:00
if err = os . MkdirAll ( form . LogRootPath , os . ModePerm ) ; err != nil {
2016-02-12 17:19:45 +03:00
ctx . Data [ "Err_LogRootPath" ] = true
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.invalid_log_root_path" , err ) , tplInstall , & form )
2016-02-12 17:19:45 +03:00
return
}
2016-08-10 03:41:18 +03:00
currentUser , match := setting . IsRunUserMatchCurrentUser ( form . RunUser )
if ! match {
2014-09-15 03:22:52 +04:00
ctx . Data [ "Err_RunUser" ] = true
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.run_user_not_match" , form . RunUser , currentUser ) , tplInstall , & form )
2014-09-08 03:02:58 +04:00
return
}
2015-09-12 22:31:36 +03:00
// Check logic loophole between disable self-registration and no admin account.
if form . DisableRegistration && len ( form . AdminName ) == 0 {
ctx . Data [ "Err_Services" ] = true
ctx . Data [ "Err_Admin" ] = true
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.no_admin_and_disable_registration" ) , tplInstall , form )
2015-09-12 22:31:36 +03:00
return
}
2019-05-28 09:18:40 +03:00
// Check admin user creation
if len ( form . AdminName ) > 0 {
// Ensure AdminName is valid
if err := models . IsUsableUsername ( form . AdminName ) ; err != nil {
ctx . Data [ "Err_Admin" ] = true
ctx . Data [ "Err_AdminName" ] = true
if models . IsErrNameReserved ( err ) {
ctx . RenderWithErr ( ctx . Tr ( "install.err_admin_name_is_reserved" ) , tplInstall , form )
return
} else if models . IsErrNamePatternNotAllowed ( err ) {
ctx . RenderWithErr ( ctx . Tr ( "install.err_admin_name_pattern_not_allowed" ) , tplInstall , form )
return
}
ctx . RenderWithErr ( ctx . Tr ( "install.err_admin_name_is_invalid" ) , tplInstall , form )
return
}
// Check Admin email
if len ( form . AdminEmail ) == 0 {
ctx . Data [ "Err_Admin" ] = true
ctx . Data [ "Err_AdminEmail" ] = true
ctx . RenderWithErr ( ctx . Tr ( "install.err_empty_admin_email" ) , tplInstall , form )
return
}
// Check admin password.
if len ( form . AdminPasswd ) == 0 {
ctx . Data [ "Err_Admin" ] = true
ctx . Data [ "Err_AdminPasswd" ] = true
ctx . RenderWithErr ( ctx . Tr ( "install.err_empty_admin_password" ) , tplInstall , form )
return
}
if form . AdminPasswd != form . AdminConfirmPasswd {
ctx . Data [ "Err_Admin" ] = true
ctx . Data [ "Err_AdminPasswd" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.password_not_match" ) , tplInstall , form )
return
}
2014-03-30 19:58:21 +04:00
}
2016-11-27 09:03:59 +03:00
if form . AppURL [ len ( form . AppURL ) - 1 ] != '/' {
form . AppURL += "/"
2015-02-01 20:41:03 +03:00
}
2014-03-30 01:50:51 +04:00
// Save settings.
2015-02-01 22:39:58 +03:00
cfg := ini . Empty ( )
2015-02-14 00:48:23 +03:00
if com . IsFile ( setting . CustomConf ) {
// Keeps custom settings if there is already something.
2016-12-20 15:32:02 +03:00
if err = cfg . Append ( setting . CustomConf ) ; err != nil {
2019-04-02 10:48:31 +03:00
log . Error ( "Failed to load custom conf '%s': %v" , setting . CustomConf , err )
2015-02-14 00:48:23 +03:00
}
}
2019-08-24 12:24:45 +03:00
cfg . Section ( "database" ) . Key ( "DB_TYPE" ) . SetValue ( setting . Database . Type )
cfg . Section ( "database" ) . Key ( "HOST" ) . SetValue ( setting . Database . Host )
cfg . Section ( "database" ) . Key ( "NAME" ) . SetValue ( setting . Database . Name )
cfg . Section ( "database" ) . Key ( "USER" ) . SetValue ( setting . Database . User )
cfg . Section ( "database" ) . Key ( "PASSWD" ) . SetValue ( setting . Database . Passwd )
2020-01-20 18:45:14 +03:00
cfg . Section ( "database" ) . Key ( "SCHEMA" ) . SetValue ( setting . Database . Schema )
2019-08-24 12:24:45 +03:00
cfg . Section ( "database" ) . Key ( "SSL_MODE" ) . SetValue ( setting . Database . SSLMode )
cfg . Section ( "database" ) . Key ( "CHARSET" ) . SetValue ( setting . Database . Charset )
cfg . Section ( "database" ) . Key ( "PATH" ) . SetValue ( setting . Database . Path )
2020-10-10 18:19:50 +03:00
cfg . Section ( "database" ) . Key ( "LOG_SQL" ) . SetValue ( "false" ) // LOG_SQL is rarely helpful
2015-02-01 22:39:58 +03:00
2015-07-09 08:17:48 +03:00
cfg . Section ( "" ) . Key ( "APP_NAME" ) . SetValue ( form . AppName )
2015-02-01 22:39:58 +03:00
cfg . Section ( "repository" ) . Key ( "ROOT" ) . SetValue ( form . RepoRootPath )
cfg . Section ( "" ) . Key ( "RUN_USER" ) . SetValue ( form . RunUser )
2016-12-27 10:34:34 +03:00
cfg . Section ( "server" ) . Key ( "SSH_DOMAIN" ) . SetValue ( form . Domain )
2017-04-21 05:43:29 +03:00
cfg . Section ( "server" ) . Key ( "DOMAIN" ) . SetValue ( form . Domain )
2015-02-01 22:39:58 +03:00
cfg . Section ( "server" ) . Key ( "HTTP_PORT" ) . SetValue ( form . HTTPPort )
2016-11-27 09:03:59 +03:00
cfg . Section ( "server" ) . Key ( "ROOT_URL" ) . SetValue ( form . AppURL )
2014-03-30 01:50:51 +04:00
2015-08-19 15:36:19 +03:00
if form . SSHPort == 0 {
cfg . Section ( "server" ) . Key ( "DISABLE_SSH" ) . SetValue ( "true" )
} else {
cfg . Section ( "server" ) . Key ( "DISABLE_SSH" ) . SetValue ( "false" )
cfg . Section ( "server" ) . Key ( "SSH_PORT" ) . SetValue ( com . ToStr ( form . SSHPort ) )
}
2016-12-26 04:16:37 +03:00
if form . LFSRootPath != "" {
cfg . Section ( "server" ) . Key ( "LFS_START_SERVER" ) . SetValue ( "true" )
cfg . Section ( "server" ) . Key ( "LFS_CONTENT_PATH" ) . SetValue ( form . LFSRootPath )
2018-02-18 21:14:37 +03:00
var secretKey string
2019-03-08 19:42:50 +03:00
if secretKey , err = generate . NewJwtSecret ( ) ; err != nil {
2018-02-18 21:14:37 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.lfs_jwt_secret_failed" , err ) , tplInstall , & form )
return
}
cfg . Section ( "server" ) . Key ( "LFS_JWT_SECRET" ) . SetValue ( secretKey )
2016-12-26 04:16:37 +03:00
} else {
cfg . Section ( "server" ) . Key ( "LFS_START_SERVER" ) . SetValue ( "false" )
}
2015-02-01 20:41:03 +03:00
if len ( strings . TrimSpace ( form . SMTPHost ) ) > 0 {
2015-02-01 22:39:58 +03:00
cfg . Section ( "mailer" ) . Key ( "ENABLED" ) . SetValue ( "true" )
cfg . Section ( "mailer" ) . Key ( "HOST" ) . SetValue ( form . SMTPHost )
2015-07-09 11:10:31 +03:00
cfg . Section ( "mailer" ) . Key ( "FROM" ) . SetValue ( form . SMTPFrom )
2017-02-24 04:37:13 +03:00
cfg . Section ( "mailer" ) . Key ( "USER" ) . SetValue ( form . SMTPUser )
2015-02-01 22:39:58 +03:00
cfg . Section ( "mailer" ) . Key ( "PASSWD" ) . SetValue ( form . SMTPPasswd )
2015-07-09 08:17:48 +03:00
} else {
cfg . Section ( "mailer" ) . Key ( "ENABLED" ) . SetValue ( "false" )
2014-03-30 01:50:51 +04:00
}
2015-07-09 08:17:48 +03:00
cfg . Section ( "service" ) . Key ( "REGISTER_EMAIL_CONFIRM" ) . SetValue ( com . ToStr ( form . RegisterConfirm ) )
cfg . Section ( "service" ) . Key ( "ENABLE_NOTIFY_MAIL" ) . SetValue ( com . ToStr ( form . MailNotify ) )
cfg . Section ( "server" ) . Key ( "OFFLINE_MODE" ) . SetValue ( com . ToStr ( form . OfflineMode ) )
2015-08-29 19:22:26 +03:00
cfg . Section ( "picture" ) . Key ( "DISABLE_GRAVATAR" ) . SetValue ( com . ToStr ( form . DisableGravatar ) )
2016-08-07 20:27:38 +03:00
cfg . Section ( "picture" ) . Key ( "ENABLE_FEDERATED_AVATAR" ) . SetValue ( com . ToStr ( form . EnableFederatedAvatar ) )
2017-08-19 18:34:49 +03:00
cfg . Section ( "openid" ) . Key ( "ENABLE_OPENID_SIGNIN" ) . SetValue ( com . ToStr ( form . EnableOpenIDSignIn ) )
cfg . Section ( "openid" ) . Key ( "ENABLE_OPENID_SIGNUP" ) . SetValue ( com . ToStr ( form . EnableOpenIDSignUp ) )
2015-07-09 08:17:48 +03:00
cfg . Section ( "service" ) . Key ( "DISABLE_REGISTRATION" ) . SetValue ( com . ToStr ( form . DisableRegistration ) )
2018-05-13 10:51:16 +03:00
cfg . Section ( "service" ) . Key ( "ALLOW_ONLY_EXTERNAL_REGISTRATION" ) . SetValue ( com . ToStr ( form . AllowOnlyExternalRegistration ) )
2015-09-13 19:14:32 +03:00
cfg . Section ( "service" ) . Key ( "ENABLE_CAPTCHA" ) . SetValue ( com . ToStr ( form . EnableCaptcha ) )
2015-07-09 08:17:48 +03:00
cfg . Section ( "service" ) . Key ( "REQUIRE_SIGNIN_VIEW" ) . SetValue ( com . ToStr ( form . RequireSignInView ) )
2017-01-08 06:12:03 +03:00
cfg . Section ( "service" ) . Key ( "DEFAULT_KEEP_EMAIL_PRIVATE" ) . SetValue ( com . ToStr ( form . DefaultKeepEmailPrivate ) )
2017-05-08 22:51:53 +03:00
cfg . Section ( "service" ) . Key ( "DEFAULT_ALLOW_CREATE_ORGANIZATION" ) . SetValue ( com . ToStr ( form . DefaultAllowCreateOrganization ) )
2017-09-12 09:48:13 +03:00
cfg . Section ( "service" ) . Key ( "DEFAULT_ENABLE_TIMETRACKING" ) . SetValue ( com . ToStr ( form . DefaultEnableTimetracking ) )
2017-01-08 06:12:03 +03:00
cfg . Section ( "service" ) . Key ( "NO_REPLY_ADDRESS" ) . SetValue ( com . ToStr ( form . NoReplyAddress ) )
2014-03-30 01:50:51 +04:00
2015-02-01 22:39:58 +03:00
cfg . Section ( "" ) . Key ( "RUN_MODE" ) . SetValue ( "prod" )
2014-03-30 19:58:21 +04:00
2015-02-01 22:39:58 +03:00
cfg . Section ( "session" ) . Key ( "PROVIDER" ) . SetValue ( "file" )
2014-12-21 06:51:16 +03:00
2020-10-10 18:19:50 +03:00
cfg . Section ( "log" ) . Key ( "MODE" ) . SetValue ( "console" )
2017-12-01 10:41:27 +03:00
cfg . Section ( "log" ) . Key ( "LEVEL" ) . SetValue ( setting . LogLevel )
2016-02-12 17:19:45 +03:00
cfg . Section ( "log" ) . Key ( "ROOT_PATH" ) . SetValue ( form . LogRootPath )
2020-10-10 18:19:50 +03:00
cfg . Section ( "log" ) . Key ( "REDIRECT_MACARON_LOG" ) . SetValue ( "true" )
cfg . Section ( "log" ) . Key ( "MACARON" ) . SetValue ( "console" )
cfg . Section ( "log" ) . Key ( "ROUTER" ) . SetValue ( "console" )
2014-08-27 12:39:36 +04:00
2015-02-01 22:39:58 +03:00
cfg . Section ( "security" ) . Key ( "INSTALL_LOCK" ) . SetValue ( "true" )
2016-12-20 15:32:02 +03:00
var secretKey string
2018-02-18 21:14:37 +03:00
if secretKey , err = generate . NewSecretKey ( ) ; err != nil {
2016-12-20 15:32:02 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.secret_key_failed" , err ) , tplInstall , & form )
return
}
cfg . Section ( "security" ) . Key ( "SECRET_KEY" ) . SetValue ( secretKey )
2014-03-30 01:50:51 +04:00
2016-12-20 15:32:02 +03:00
err = os . MkdirAll ( filepath . Dir ( setting . CustomConf ) , os . ModePerm )
2016-11-10 13:02:01 +03:00
if err != nil {
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.save_config_failed" , err ) , tplInstall , & form )
2016-11-10 13:02:01 +03:00
return
}
2016-12-20 15:32:02 +03:00
if err = cfg . SaveTo ( setting . CustomConf ) ; err != nil {
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.save_config_failed" , err ) , tplInstall , & form )
2014-03-30 01:50:51 +04:00
return
}
2020-10-20 00:03:08 +03:00
// Re-read settings
PostInstallInit ( ctx . Req . Context ( ) )
2014-03-30 01:50:51 +04:00
2015-12-08 08:59:14 +03:00
// Create admin account
2015-07-08 14:47:56 +03:00
if len ( form . AdminName ) > 0 {
2015-12-08 08:59:14 +03:00
u := & models . User {
2015-07-08 14:47:56 +03:00
Name : form . AdminName ,
Email : form . AdminEmail ,
Passwd : form . AdminPasswd ,
IsAdmin : true ,
IsActive : true ,
2015-12-08 08:59:14 +03:00
}
2016-12-20 15:32:02 +03:00
if err = models . CreateUser ( u ) ; err != nil {
2015-07-08 14:47:56 +03:00
if ! models . IsErrUserAlreadyExist ( err ) {
setting . InstallLock = false
ctx . Data [ "Err_AdminName" ] = true
ctx . Data [ "Err_AdminEmail" ] = true
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.invalid_admin_setting" , err ) , tplInstall , & form )
2015-07-08 14:47:56 +03:00
return
}
log . Info ( "Admin account already exist" )
2015-12-08 08:59:14 +03:00
u , _ = models . GetUserByName ( u . Name )
2014-03-30 19:09:59 +04:00
}
2015-12-08 08:59:14 +03:00
2020-10-20 00:03:08 +03:00
days := 86400 * setting . LogInRememberDays
ctx . SetCookie ( setting . CookieUserName , u . Name , days , setting . AppSubURL , setting . SessionConfig . Domain , setting . SessionConfig . Secure , true )
ctx . SetSuperSecureCookie ( base . EncodeMD5 ( u . Rands + u . Passwd ) ,
setting . CookieRememberName , u . Name , days , setting . AppSubURL , setting . SessionConfig . Domain , setting . SessionConfig . Secure , true )
2015-12-08 08:59:14 +03:00
// Auto-login for admin
2016-12-20 15:32:02 +03:00
if err = ctx . Session . Set ( "uid" , u . ID ) ; err != nil {
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.save_config_failed" , err ) , tplInstall , & form )
2016-11-10 13:02:01 +03:00
return
}
2016-12-20 15:32:02 +03:00
if err = ctx . Session . Set ( "uname" , u . Name ) ; err != nil {
2016-11-18 06:03:03 +03:00
ctx . RenderWithErr ( ctx . Tr ( "install.save_config_failed" , err ) , tplInstall , & form )
2016-11-10 13:02:01 +03:00
return
}
2020-05-17 15:43:29 +03:00
if err = ctx . Session . Release ( ) ; err != nil {
ctx . RenderWithErr ( ctx . Tr ( "install.save_config_failed" , err ) , tplInstall , & form )
return
}
2014-03-30 19:09:59 +04:00
}
2014-03-30 01:50:51 +04:00
log . Info ( "First-time run install finished!" )
2020-10-20 00:03:08 +03:00
2014-09-08 03:02:58 +04:00
ctx . Flash . Success ( ctx . Tr ( "install.install_success" ) )
2020-10-20 00:03:08 +03:00
ctx . Header ( ) . Add ( "Refresh" , "1; url=" + setting . AppURL + "user/login" )
ctx . HTML ( 200 , tplPostInstall )
// Now get the http.Server from this request and shut it down
// NB: This is not our hammerable graceful shutdown this is http.Server.Shutdown
srv := ctx . Req . Context ( ) . Value ( http . ServerContextKey ) . ( * http . Server )
go func ( ) {
if err := srv . Shutdown ( graceful . GetManager ( ) . HammerContext ( ) ) ; err != nil {
log . Error ( "Unable to shutdown the install server! Error: %v" , err )
}
} ( )
2014-03-25 12:51:42 +04:00
}