forked from gitea/gitea
		
	Split setting.go as multiple files (#6014)
* split setting.go as multiple files * fix comments
This commit is contained in:
		
							parent
							
								
									9e8cc3b18d
								
							
						
					
					
						commit
						820e28c904
					
				
							
								
								
									
										43
									
								
								modules/setting/cache.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								modules/setting/cache.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | // Copyright 2019 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 setting | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | 
 | ||||||
|  | 	"code.gitea.io/gitea/modules/log" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Cache represents cache settings | ||||||
|  | type Cache struct { | ||||||
|  | 	Adapter  string | ||||||
|  | 	Interval int | ||||||
|  | 	Conn     string | ||||||
|  | 	TTL      time.Duration | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	// CacheService the global cache | ||||||
|  | 	CacheService *Cache | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func newCacheService() { | ||||||
|  | 	sec := Cfg.Section("cache") | ||||||
|  | 	CacheService = &Cache{ | ||||||
|  | 		Adapter: sec.Key("ADAPTER").In("memory", []string{"memory", "redis", "memcache"}), | ||||||
|  | 	} | ||||||
|  | 	switch CacheService.Adapter { | ||||||
|  | 	case "memory": | ||||||
|  | 		CacheService.Interval = sec.Key("INTERVAL").MustInt(60) | ||||||
|  | 	case "redis", "memcache": | ||||||
|  | 		CacheService.Conn = strings.Trim(sec.Key("HOST").String(), "\" ") | ||||||
|  | 	default: | ||||||
|  | 		log.Fatal(4, "Unknown cache adapter: %s", CacheService.Adapter) | ||||||
|  | 	} | ||||||
|  | 	CacheService.TTL = sec.Key("ITEM_TTL").MustDuration(16 * time.Hour) | ||||||
|  | 
 | ||||||
|  | 	log.Info("Cache Service Enabled") | ||||||
|  | } | ||||||
							
								
								
									
										186
									
								
								modules/setting/log.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										186
									
								
								modules/setting/log.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,186 @@ | |||||||
|  | // Copyright 2019 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 setting | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"path" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"code.gitea.io/gitea/modules/log" | ||||||
|  | 	"github.com/go-xorm/core" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var logLevels = map[string]string{ | ||||||
|  | 	"Trace":    "0", | ||||||
|  | 	"Debug":    "1", | ||||||
|  | 	"Info":     "2", | ||||||
|  | 	"Warn":     "3", | ||||||
|  | 	"Error":    "4", | ||||||
|  | 	"Critical": "5", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func getLogLevel(section string, key string, defaultValue string) string { | ||||||
|  | 	validLevels := []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"} | ||||||
|  | 	return Cfg.Section(section).Key(key).In(defaultValue, validLevels) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newLogService() { | ||||||
|  | 	log.Info("Gitea v%s%s", AppVer, AppBuiltWith) | ||||||
|  | 
 | ||||||
|  | 	LogModes = strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") | ||||||
|  | 	LogConfigs = make([]string, len(LogModes)) | ||||||
|  | 
 | ||||||
|  | 	useConsole := false | ||||||
|  | 	for i := 0; i < len(LogModes); i++ { | ||||||
|  | 		LogModes[i] = strings.TrimSpace(LogModes[i]) | ||||||
|  | 		if LogModes[i] == "console" { | ||||||
|  | 			useConsole = true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if !useConsole { | ||||||
|  | 		log.DelLogger("console") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for i, mode := range LogModes { | ||||||
|  | 		sec, err := Cfg.GetSection("log." + mode) | ||||||
|  | 		if err != nil { | ||||||
|  | 			sec, _ = Cfg.NewSection("log." + mode) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Log level. | ||||||
|  | 		levelName := getLogLevel("log."+mode, "LEVEL", LogLevel) | ||||||
|  | 		level, ok := logLevels[levelName] | ||||||
|  | 		if !ok { | ||||||
|  | 			log.Fatal(4, "Unknown log level: %s", levelName) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Generate log configuration. | ||||||
|  | 		switch mode { | ||||||
|  | 		case "console": | ||||||
|  | 			LogConfigs[i] = fmt.Sprintf(`{"level":%s}`, level) | ||||||
|  | 		case "file": | ||||||
|  | 			logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "gitea.log")) | ||||||
|  | 			if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { | ||||||
|  | 				panic(err.Error()) | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			LogConfigs[i] = fmt.Sprintf( | ||||||
|  | 				`{"level":%s,"filename":"%s","rotate":%v,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, | ||||||
|  | 				logPath, | ||||||
|  | 				sec.Key("LOG_ROTATE").MustBool(true), | ||||||
|  | 				1<<uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)), | ||||||
|  | 				sec.Key("DAILY_ROTATE").MustBool(true), | ||||||
|  | 				sec.Key("MAX_DAYS").MustInt(7)) | ||||||
|  | 		case "conn": | ||||||
|  | 			LogConfigs[i] = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level, | ||||||
|  | 				sec.Key("RECONNECT_ON_MSG").MustBool(), | ||||||
|  | 				sec.Key("RECONNECT").MustBool(), | ||||||
|  | 				sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}), | ||||||
|  | 				sec.Key("ADDR").MustString(":7020")) | ||||||
|  | 		case "smtp": | ||||||
|  | 			LogConfigs[i] = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":["%s"],"subject":"%s"}`, level, | ||||||
|  | 				sec.Key("USER").MustString("example@example.com"), | ||||||
|  | 				sec.Key("PASSWD").MustString("******"), | ||||||
|  | 				sec.Key("HOST").MustString("127.0.0.1:25"), | ||||||
|  | 				strings.Replace(sec.Key("RECEIVERS").MustString("example@example.com"), ",", "\",\"", -1), | ||||||
|  | 				sec.Key("SUBJECT").MustString("Diagnostic message from serve")) | ||||||
|  | 		case "database": | ||||||
|  | 			LogConfigs[i] = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level, | ||||||
|  | 				sec.Key("DRIVER").String(), | ||||||
|  | 				sec.Key("CONN").String()) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		log.NewLogger(Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000), mode, LogConfigs[i]) | ||||||
|  | 		log.Info("Log Mode: %s(%s)", strings.Title(mode), levelName) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewXORMLogService initializes xorm logger service | ||||||
|  | func NewXORMLogService(disableConsole bool) { | ||||||
|  | 	logModes := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") | ||||||
|  | 	var logConfigs string | ||||||
|  | 	for _, mode := range logModes { | ||||||
|  | 		mode = strings.TrimSpace(mode) | ||||||
|  | 
 | ||||||
|  | 		if disableConsole && mode == "console" { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		sec, err := Cfg.GetSection("log." + mode) | ||||||
|  | 		if err != nil { | ||||||
|  | 			sec, _ = Cfg.NewSection("log." + mode) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Log level. | ||||||
|  | 		levelName := getLogLevel("log."+mode, "LEVEL", LogLevel) | ||||||
|  | 		level, ok := logLevels[levelName] | ||||||
|  | 		if !ok { | ||||||
|  | 			log.Fatal(4, "Unknown log level: %s", levelName) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// Generate log configuration. | ||||||
|  | 		switch mode { | ||||||
|  | 		case "console": | ||||||
|  | 			logConfigs = fmt.Sprintf(`{"level":%s}`, level) | ||||||
|  | 		case "file": | ||||||
|  | 			logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "xorm.log")) | ||||||
|  | 			if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { | ||||||
|  | 				panic(err.Error()) | ||||||
|  | 			} | ||||||
|  | 			logPath = path.Join(filepath.Dir(logPath), "xorm.log") | ||||||
|  | 
 | ||||||
|  | 			logConfigs = fmt.Sprintf( | ||||||
|  | 				`{"level":%s,"filename":"%s","rotate":%v,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, | ||||||
|  | 				logPath, | ||||||
|  | 				sec.Key("LOG_ROTATE").MustBool(true), | ||||||
|  | 				1<<uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)), | ||||||
|  | 				sec.Key("DAILY_ROTATE").MustBool(true), | ||||||
|  | 				sec.Key("MAX_DAYS").MustInt(7)) | ||||||
|  | 		case "conn": | ||||||
|  | 			logConfigs = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level, | ||||||
|  | 				sec.Key("RECONNECT_ON_MSG").MustBool(), | ||||||
|  | 				sec.Key("RECONNECT").MustBool(), | ||||||
|  | 				sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}), | ||||||
|  | 				sec.Key("ADDR").MustString(":7020")) | ||||||
|  | 		case "smtp": | ||||||
|  | 			logConfigs = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level, | ||||||
|  | 				sec.Key("USER").MustString("example@example.com"), | ||||||
|  | 				sec.Key("PASSWD").MustString("******"), | ||||||
|  | 				sec.Key("HOST").MustString("127.0.0.1:25"), | ||||||
|  | 				sec.Key("RECEIVERS").MustString("[]"), | ||||||
|  | 				sec.Key("SUBJECT").MustString("Diagnostic message from serve")) | ||||||
|  | 		case "database": | ||||||
|  | 			logConfigs = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level, | ||||||
|  | 				sec.Key("DRIVER").String(), | ||||||
|  | 				sec.Key("CONN").String()) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		log.NewXORMLogger(Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000), mode, logConfigs) | ||||||
|  | 		if !disableConsole { | ||||||
|  | 			log.Info("XORM Log Mode: %s(%s)", strings.Title(mode), levelName) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		var lvl core.LogLevel | ||||||
|  | 		switch levelName { | ||||||
|  | 		case "Trace", "Debug": | ||||||
|  | 			lvl = core.LOG_DEBUG | ||||||
|  | 		case "Info": | ||||||
|  | 			lvl = core.LOG_INFO | ||||||
|  | 		case "Warn": | ||||||
|  | 			lvl = core.LOG_WARNING | ||||||
|  | 		case "Error", "Critical": | ||||||
|  | 			lvl = core.LOG_ERR | ||||||
|  | 		} | ||||||
|  | 		log.XORMLogger.SetLevel(lvl) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(logConfigs) == 0 { | ||||||
|  | 		log.DiscardXORMLogger() | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										126
									
								
								modules/setting/mailer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								modules/setting/mailer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,126 @@ | |||||||
|  | // Copyright 2019 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 setting | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"net/mail" | ||||||
|  | 
 | ||||||
|  | 	"code.gitea.io/gitea/modules/log" | ||||||
|  | 	shellquote "github.com/kballard/go-shellquote" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Mailer represents mail service. | ||||||
|  | type Mailer struct { | ||||||
|  | 	// Mailer | ||||||
|  | 	QueueLength     int | ||||||
|  | 	Name            string | ||||||
|  | 	From            string | ||||||
|  | 	FromName        string | ||||||
|  | 	FromEmail       string | ||||||
|  | 	SendAsPlainText bool | ||||||
|  | 	MailerType      string | ||||||
|  | 
 | ||||||
|  | 	// SMTP sender | ||||||
|  | 	Host              string | ||||||
|  | 	User, Passwd      string | ||||||
|  | 	DisableHelo       bool | ||||||
|  | 	HeloHostname      string | ||||||
|  | 	SkipVerify        bool | ||||||
|  | 	UseCertificate    bool | ||||||
|  | 	CertFile, KeyFile string | ||||||
|  | 	IsTLSEnabled      bool | ||||||
|  | 
 | ||||||
|  | 	// Sendmail sender | ||||||
|  | 	SendmailPath string | ||||||
|  | 	SendmailArgs []string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	// MailService the global mailer | ||||||
|  | 	MailService *Mailer | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func newMailService() { | ||||||
|  | 	sec := Cfg.Section("mailer") | ||||||
|  | 	// Check mailer setting. | ||||||
|  | 	if !sec.Key("ENABLED").MustBool() { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	MailService = &Mailer{ | ||||||
|  | 		QueueLength:     sec.Key("SEND_BUFFER_LEN").MustInt(100), | ||||||
|  | 		Name:            sec.Key("NAME").MustString(AppName), | ||||||
|  | 		SendAsPlainText: sec.Key("SEND_AS_PLAIN_TEXT").MustBool(false), | ||||||
|  | 		MailerType:      sec.Key("MAILER_TYPE").In("", []string{"smtp", "sendmail", "dummy"}), | ||||||
|  | 
 | ||||||
|  | 		Host:           sec.Key("HOST").String(), | ||||||
|  | 		User:           sec.Key("USER").String(), | ||||||
|  | 		Passwd:         sec.Key("PASSWD").String(), | ||||||
|  | 		DisableHelo:    sec.Key("DISABLE_HELO").MustBool(), | ||||||
|  | 		HeloHostname:   sec.Key("HELO_HOSTNAME").String(), | ||||||
|  | 		SkipVerify:     sec.Key("SKIP_VERIFY").MustBool(), | ||||||
|  | 		UseCertificate: sec.Key("USE_CERTIFICATE").MustBool(), | ||||||
|  | 		CertFile:       sec.Key("CERT_FILE").String(), | ||||||
|  | 		KeyFile:        sec.Key("KEY_FILE").String(), | ||||||
|  | 		IsTLSEnabled:   sec.Key("IS_TLS_ENABLED").MustBool(), | ||||||
|  | 
 | ||||||
|  | 		SendmailPath: sec.Key("SENDMAIL_PATH").MustString("sendmail"), | ||||||
|  | 	} | ||||||
|  | 	MailService.From = sec.Key("FROM").MustString(MailService.User) | ||||||
|  | 
 | ||||||
|  | 	if sec.HasKey("ENABLE_HTML_ALTERNATIVE") { | ||||||
|  | 		log.Warn("ENABLE_HTML_ALTERNATIVE is deprecated, use SEND_AS_PLAIN_TEXT") | ||||||
|  | 		MailService.SendAsPlainText = !sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(false) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if sec.HasKey("USE_SENDMAIL") { | ||||||
|  | 		log.Warn("USE_SENDMAIL is deprecated, use MAILER_TYPE=sendmail") | ||||||
|  | 		if MailService.MailerType == "" && sec.Key("USE_SENDMAIL").MustBool(false) { | ||||||
|  | 			MailService.MailerType = "sendmail" | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	parsed, err := mail.ParseAddress(MailService.From) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatal(4, "Invalid mailer.FROM (%s): %v", MailService.From, err) | ||||||
|  | 	} | ||||||
|  | 	MailService.FromName = parsed.Name | ||||||
|  | 	MailService.FromEmail = parsed.Address | ||||||
|  | 
 | ||||||
|  | 	if MailService.MailerType == "" { | ||||||
|  | 		MailService.MailerType = "smtp" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if MailService.MailerType == "sendmail" { | ||||||
|  | 		MailService.SendmailArgs, err = shellquote.Split(sec.Key("SENDMAIL_ARGS").String()) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Error(4, "Failed to parse Sendmail args: %v", CustomConf, err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	log.Info("Mail Service Enabled") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newRegisterMailService() { | ||||||
|  | 	if !Cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").MustBool() { | ||||||
|  | 		return | ||||||
|  | 	} else if MailService == nil { | ||||||
|  | 		log.Warn("Register Mail Service: Mail Service is not enabled") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	Service.RegisterEmailConfirm = true | ||||||
|  | 	log.Info("Register Mail Service Enabled") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newNotifyMailService() { | ||||||
|  | 	if !Cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").MustBool() { | ||||||
|  | 		return | ||||||
|  | 	} else if MailService == nil { | ||||||
|  | 		log.Warn("Notify Mail Service: Mail Service is not enabled") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	Service.EnableNotifyMail = true | ||||||
|  | 	log.Info("Notify Mail Service Enabled") | ||||||
|  | } | ||||||
							
								
								
									
										89
									
								
								modules/setting/service.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								modules/setting/service.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,89 @@ | |||||||
|  | // Copyright 2019 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 setting | ||||||
|  | 
 | ||||||
|  | import "regexp" | ||||||
|  | 
 | ||||||
|  | // Service settings | ||||||
|  | var Service struct { | ||||||
|  | 	ActiveCodeLives                         int | ||||||
|  | 	ResetPwdCodeLives                       int | ||||||
|  | 	RegisterEmailConfirm                    bool | ||||||
|  | 	EmailDomainWhitelist                    []string | ||||||
|  | 	DisableRegistration                     bool | ||||||
|  | 	AllowOnlyExternalRegistration           bool | ||||||
|  | 	ShowRegistrationButton                  bool | ||||||
|  | 	RequireSignInView                       bool | ||||||
|  | 	EnableNotifyMail                        bool | ||||||
|  | 	EnableReverseProxyAuth                  bool | ||||||
|  | 	EnableReverseProxyAutoRegister          bool | ||||||
|  | 	EnableReverseProxyEmail                 bool | ||||||
|  | 	EnableCaptcha                           bool | ||||||
|  | 	CaptchaType                             string | ||||||
|  | 	RecaptchaSecret                         string | ||||||
|  | 	RecaptchaSitekey                        string | ||||||
|  | 	DefaultKeepEmailPrivate                 bool | ||||||
|  | 	DefaultAllowCreateOrganization          bool | ||||||
|  | 	EnableTimetracking                      bool | ||||||
|  | 	DefaultEnableTimetracking               bool | ||||||
|  | 	DefaultEnableDependencies               bool | ||||||
|  | 	DefaultAllowOnlyContributorsToTrackTime bool | ||||||
|  | 	NoReplyAddress                          string | ||||||
|  | 	EnableUserHeatmap                       bool | ||||||
|  | 	AutoWatchNewRepos                       bool | ||||||
|  | 
 | ||||||
|  | 	// OpenID settings | ||||||
|  | 	EnableOpenIDSignIn bool | ||||||
|  | 	EnableOpenIDSignUp bool | ||||||
|  | 	OpenIDWhitelist    []*regexp.Regexp | ||||||
|  | 	OpenIDBlacklist    []*regexp.Regexp | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newService() { | ||||||
|  | 	sec := Cfg.Section("service") | ||||||
|  | 	Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180) | ||||||
|  | 	Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180) | ||||||
|  | 	Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool() | ||||||
|  | 	Service.AllowOnlyExternalRegistration = sec.Key("ALLOW_ONLY_EXTERNAL_REGISTRATION").MustBool() | ||||||
|  | 	Service.EmailDomainWhitelist = sec.Key("EMAIL_DOMAIN_WHITELIST").Strings(",") | ||||||
|  | 	Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!(Service.DisableRegistration || Service.AllowOnlyExternalRegistration)) | ||||||
|  | 	Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() | ||||||
|  | 	Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() | ||||||
|  | 	Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() | ||||||
|  | 	Service.EnableReverseProxyEmail = sec.Key("ENABLE_REVERSE_PROXY_EMAIL").MustBool() | ||||||
|  | 	Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool(false) | ||||||
|  | 	Service.CaptchaType = sec.Key("CAPTCHA_TYPE").MustString(ImageCaptcha) | ||||||
|  | 	Service.RecaptchaSecret = sec.Key("RECAPTCHA_SECRET").MustString("") | ||||||
|  | 	Service.RecaptchaSitekey = sec.Key("RECAPTCHA_SITEKEY").MustString("") | ||||||
|  | 	Service.DefaultKeepEmailPrivate = sec.Key("DEFAULT_KEEP_EMAIL_PRIVATE").MustBool() | ||||||
|  | 	Service.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true) | ||||||
|  | 	Service.EnableTimetracking = sec.Key("ENABLE_TIMETRACKING").MustBool(true) | ||||||
|  | 	if Service.EnableTimetracking { | ||||||
|  | 		Service.DefaultEnableTimetracking = sec.Key("DEFAULT_ENABLE_TIMETRACKING").MustBool(true) | ||||||
|  | 	} | ||||||
|  | 	Service.DefaultEnableDependencies = sec.Key("DEFAULT_ENABLE_DEPENDENCIES").MustBool(true) | ||||||
|  | 	Service.DefaultAllowOnlyContributorsToTrackTime = sec.Key("DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME").MustBool(true) | ||||||
|  | 	Service.NoReplyAddress = sec.Key("NO_REPLY_ADDRESS").MustString("noreply.example.org") | ||||||
|  | 	Service.EnableUserHeatmap = sec.Key("ENABLE_USER_HEATMAP").MustBool(true) | ||||||
|  | 	Service.AutoWatchNewRepos = sec.Key("AUTO_WATCH_NEW_REPOS").MustBool(true) | ||||||
|  | 
 | ||||||
|  | 	sec = Cfg.Section("openid") | ||||||
|  | 	Service.EnableOpenIDSignIn = sec.Key("ENABLE_OPENID_SIGNIN").MustBool(!InstallLock) | ||||||
|  | 	Service.EnableOpenIDSignUp = sec.Key("ENABLE_OPENID_SIGNUP").MustBool(!Service.DisableRegistration && Service.EnableOpenIDSignIn) | ||||||
|  | 	pats := sec.Key("WHITELISTED_URIS").Strings(" ") | ||||||
|  | 	if len(pats) != 0 { | ||||||
|  | 		Service.OpenIDWhitelist = make([]*regexp.Regexp, len(pats)) | ||||||
|  | 		for i, p := range pats { | ||||||
|  | 			Service.OpenIDWhitelist[i] = regexp.MustCompilePOSIX(p) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	pats = sec.Key("BLACKLISTED_URIS").Strings(" ") | ||||||
|  | 	if len(pats) != 0 { | ||||||
|  | 		Service.OpenIDBlacklist = make([]*regexp.Regexp, len(pats)) | ||||||
|  | 		for i, p := range pats { | ||||||
|  | 			Service.OpenIDBlacklist[i] = regexp.MustCompilePOSIX(p) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								modules/setting/session.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								modules/setting/session.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | // Copyright 2019 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 setting | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"path" | ||||||
|  | 	"path/filepath" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"code.gitea.io/gitea/modules/log" | ||||||
|  | 	"github.com/go-macaron/session" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	// SessionConfig difines Session settings | ||||||
|  | 	SessionConfig session.Options | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func newSessionService() { | ||||||
|  | 	SessionConfig.Provider = Cfg.Section("session").Key("PROVIDER").In("memory", | ||||||
|  | 		[]string{"memory", "file", "redis", "mysql", "postgres", "couchbase", "memcache", "nodb"}) | ||||||
|  | 	SessionConfig.ProviderConfig = strings.Trim(Cfg.Section("session").Key("PROVIDER_CONFIG").MustString(path.Join(AppDataPath, "sessions")), "\" ") | ||||||
|  | 	if SessionConfig.Provider == "file" && !filepath.IsAbs(SessionConfig.ProviderConfig) { | ||||||
|  | 		SessionConfig.ProviderConfig = path.Join(AppWorkPath, SessionConfig.ProviderConfig) | ||||||
|  | 	} | ||||||
|  | 	SessionConfig.CookieName = Cfg.Section("session").Key("COOKIE_NAME").MustString("i_like_gitea") | ||||||
|  | 	SessionConfig.CookiePath = AppSubURL | ||||||
|  | 	SessionConfig.Secure = Cfg.Section("session").Key("COOKIE_SECURE").MustBool(false) | ||||||
|  | 	SessionConfig.Gclifetime = Cfg.Section("session").Key("GC_INTERVAL_TIME").MustInt64(86400) | ||||||
|  | 	SessionConfig.Maxlifetime = Cfg.Section("session").Key("SESSION_LIFE_TIME").MustInt64(86400) | ||||||
|  | 
 | ||||||
|  | 	log.Info("Session Service Enabled") | ||||||
|  | } | ||||||
| @ -7,9 +7,7 @@ package setting | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
| 	"fmt" |  | ||||||
| 	"net" | 	"net" | ||||||
| 	"net/mail" |  | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
| @ -30,14 +28,12 @@ import ( | |||||||
| 	"github.com/Unknwon/com" | 	"github.com/Unknwon/com" | ||||||
| 	_ "github.com/go-macaron/cache/memcache" // memcache plugin for cache | 	_ "github.com/go-macaron/cache/memcache" // memcache plugin for cache | ||||||
| 	_ "github.com/go-macaron/cache/redis" | 	_ "github.com/go-macaron/cache/redis" | ||||||
| 	"github.com/go-macaron/session" |  | ||||||
| 	_ "github.com/go-macaron/session/couchbase" // couchbase plugin for session store | 	_ "github.com/go-macaron/session/couchbase" // couchbase plugin for session store | ||||||
| 	_ "github.com/go-macaron/session/memcache"  // memcache plugin for session store | 	_ "github.com/go-macaron/session/memcache"  // memcache plugin for session store | ||||||
| 	_ "github.com/go-macaron/session/mysql"     // mysql plugin for session store | 	_ "github.com/go-macaron/session/mysql"     // mysql plugin for session store | ||||||
| 	_ "github.com/go-macaron/session/nodb"      // nodb plugin for session store | 	_ "github.com/go-macaron/session/nodb"      // nodb plugin for session store | ||||||
| 	_ "github.com/go-macaron/session/postgres"  // postgres plugin for session store | 	_ "github.com/go-macaron/session/postgres"  // postgres plugin for session store | ||||||
| 	_ "github.com/go-macaron/session/redis"     // redis plugin for store session | 	_ "github.com/go-macaron/session/redis"     // redis plugin for store session | ||||||
| 	"github.com/go-xorm/core" |  | ||||||
| 	shellquote "github.com/kballard/go-shellquote" | 	shellquote "github.com/kballard/go-shellquote" | ||||||
| 	version "github.com/mcuadros/go-version" | 	version "github.com/mcuadros/go-version" | ||||||
| 	ini "gopkg.in/ini.v1" | 	ini "gopkg.in/ini.v1" | ||||||
| @ -192,20 +188,6 @@ var ( | |||||||
| 		MaxIndexerFileSize int64 | 		MaxIndexerFileSize int64 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Webhook settings |  | ||||||
| 	Webhook = struct { |  | ||||||
| 		QueueLength    int |  | ||||||
| 		DeliverTimeout int |  | ||||||
| 		SkipTLSVerify  bool |  | ||||||
| 		Types          []string |  | ||||||
| 		PagingNum      int |  | ||||||
| 	}{ |  | ||||||
| 		QueueLength:    1000, |  | ||||||
| 		DeliverTimeout: 5, |  | ||||||
| 		SkipTLSVerify:  false, |  | ||||||
| 		PagingNum:      10, |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Repository settings | 	// Repository settings | ||||||
| 	Repository = struct { | 	Repository = struct { | ||||||
| 		AnsiCharset              string | 		AnsiCharset              string | ||||||
| @ -409,8 +391,6 @@ var ( | |||||||
| 	// Time settings | 	// Time settings | ||||||
| 	TimeFormat string | 	TimeFormat string | ||||||
| 
 | 
 | ||||||
| 	// Session settings |  | ||||||
| 	SessionConfig  session.Options |  | ||||||
| 	CSRFCookieName = "_csrf" | 	CSRFCookieName = "_csrf" | ||||||
| 
 | 
 | ||||||
| 	// Cron tasks | 	// Cron tasks | ||||||
| @ -1235,428 +1215,6 @@ func NewContext() { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Service settings |  | ||||||
| var Service struct { |  | ||||||
| 	ActiveCodeLives                         int |  | ||||||
| 	ResetPwdCodeLives                       int |  | ||||||
| 	RegisterEmailConfirm                    bool |  | ||||||
| 	EmailDomainWhitelist                    []string |  | ||||||
| 	DisableRegistration                     bool |  | ||||||
| 	AllowOnlyExternalRegistration           bool |  | ||||||
| 	ShowRegistrationButton                  bool |  | ||||||
| 	RequireSignInView                       bool |  | ||||||
| 	EnableNotifyMail                        bool |  | ||||||
| 	EnableReverseProxyAuth                  bool |  | ||||||
| 	EnableReverseProxyAutoRegister          bool |  | ||||||
| 	EnableReverseProxyEmail                 bool |  | ||||||
| 	EnableCaptcha                           bool |  | ||||||
| 	CaptchaType                             string |  | ||||||
| 	RecaptchaSecret                         string |  | ||||||
| 	RecaptchaSitekey                        string |  | ||||||
| 	DefaultKeepEmailPrivate                 bool |  | ||||||
| 	DefaultAllowCreateOrganization          bool |  | ||||||
| 	EnableTimetracking                      bool |  | ||||||
| 	DefaultEnableTimetracking               bool |  | ||||||
| 	DefaultEnableDependencies               bool |  | ||||||
| 	DefaultAllowOnlyContributorsToTrackTime bool |  | ||||||
| 	NoReplyAddress                          string |  | ||||||
| 	EnableUserHeatmap                       bool |  | ||||||
| 	AutoWatchNewRepos                       bool |  | ||||||
| 
 |  | ||||||
| 	// OpenID settings |  | ||||||
| 	EnableOpenIDSignIn bool |  | ||||||
| 	EnableOpenIDSignUp bool |  | ||||||
| 	OpenIDWhitelist    []*regexp.Regexp |  | ||||||
| 	OpenIDBlacklist    []*regexp.Regexp |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func newService() { |  | ||||||
| 	sec := Cfg.Section("service") |  | ||||||
| 	Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180) |  | ||||||
| 	Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180) |  | ||||||
| 	Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool() |  | ||||||
| 	Service.AllowOnlyExternalRegistration = sec.Key("ALLOW_ONLY_EXTERNAL_REGISTRATION").MustBool() |  | ||||||
| 	Service.EmailDomainWhitelist = sec.Key("EMAIL_DOMAIN_WHITELIST").Strings(",") |  | ||||||
| 	Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!(Service.DisableRegistration || Service.AllowOnlyExternalRegistration)) |  | ||||||
| 	Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() |  | ||||||
| 	Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() |  | ||||||
| 	Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() |  | ||||||
| 	Service.EnableReverseProxyEmail = sec.Key("ENABLE_REVERSE_PROXY_EMAIL").MustBool() |  | ||||||
| 	Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool(false) |  | ||||||
| 	Service.CaptchaType = sec.Key("CAPTCHA_TYPE").MustString(ImageCaptcha) |  | ||||||
| 	Service.RecaptchaSecret = sec.Key("RECAPTCHA_SECRET").MustString("") |  | ||||||
| 	Service.RecaptchaSitekey = sec.Key("RECAPTCHA_SITEKEY").MustString("") |  | ||||||
| 	Service.DefaultKeepEmailPrivate = sec.Key("DEFAULT_KEEP_EMAIL_PRIVATE").MustBool() |  | ||||||
| 	Service.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true) |  | ||||||
| 	Service.EnableTimetracking = sec.Key("ENABLE_TIMETRACKING").MustBool(true) |  | ||||||
| 	if Service.EnableTimetracking { |  | ||||||
| 		Service.DefaultEnableTimetracking = sec.Key("DEFAULT_ENABLE_TIMETRACKING").MustBool(true) |  | ||||||
| 	} |  | ||||||
| 	Service.DefaultEnableDependencies = sec.Key("DEFAULT_ENABLE_DEPENDENCIES").MustBool(true) |  | ||||||
| 	Service.DefaultAllowOnlyContributorsToTrackTime = sec.Key("DEFAULT_ALLOW_ONLY_CONTRIBUTORS_TO_TRACK_TIME").MustBool(true) |  | ||||||
| 	Service.NoReplyAddress = sec.Key("NO_REPLY_ADDRESS").MustString("noreply.example.org") |  | ||||||
| 	Service.EnableUserHeatmap = sec.Key("ENABLE_USER_HEATMAP").MustBool(true) |  | ||||||
| 	Service.AutoWatchNewRepos = sec.Key("AUTO_WATCH_NEW_REPOS").MustBool(true) |  | ||||||
| 
 |  | ||||||
| 	sec = Cfg.Section("openid") |  | ||||||
| 	Service.EnableOpenIDSignIn = sec.Key("ENABLE_OPENID_SIGNIN").MustBool(!InstallLock) |  | ||||||
| 	Service.EnableOpenIDSignUp = sec.Key("ENABLE_OPENID_SIGNUP").MustBool(!Service.DisableRegistration && Service.EnableOpenIDSignIn) |  | ||||||
| 	pats := sec.Key("WHITELISTED_URIS").Strings(" ") |  | ||||||
| 	if len(pats) != 0 { |  | ||||||
| 		Service.OpenIDWhitelist = make([]*regexp.Regexp, len(pats)) |  | ||||||
| 		for i, p := range pats { |  | ||||||
| 			Service.OpenIDWhitelist[i] = regexp.MustCompilePOSIX(p) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	pats = sec.Key("BLACKLISTED_URIS").Strings(" ") |  | ||||||
| 	if len(pats) != 0 { |  | ||||||
| 		Service.OpenIDBlacklist = make([]*regexp.Regexp, len(pats)) |  | ||||||
| 		for i, p := range pats { |  | ||||||
| 			Service.OpenIDBlacklist[i] = regexp.MustCompilePOSIX(p) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var logLevels = map[string]string{ |  | ||||||
| 	"Trace":    "0", |  | ||||||
| 	"Debug":    "1", |  | ||||||
| 	"Info":     "2", |  | ||||||
| 	"Warn":     "3", |  | ||||||
| 	"Error":    "4", |  | ||||||
| 	"Critical": "5", |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func getLogLevel(section string, key string, defaultValue string) string { |  | ||||||
| 	validLevels := []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"} |  | ||||||
| 	return Cfg.Section(section).Key(key).In(defaultValue, validLevels) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func newLogService() { |  | ||||||
| 	log.Info("Gitea v%s%s", AppVer, AppBuiltWith) |  | ||||||
| 
 |  | ||||||
| 	LogModes = strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") |  | ||||||
| 	LogConfigs = make([]string, len(LogModes)) |  | ||||||
| 
 |  | ||||||
| 	useConsole := false |  | ||||||
| 	for i := 0; i < len(LogModes); i++ { |  | ||||||
| 		LogModes[i] = strings.TrimSpace(LogModes[i]) |  | ||||||
| 		if LogModes[i] == "console" { |  | ||||||
| 			useConsole = true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if !useConsole { |  | ||||||
| 		log.DelLogger("console") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for i, mode := range LogModes { |  | ||||||
| 		sec, err := Cfg.GetSection("log." + mode) |  | ||||||
| 		if err != nil { |  | ||||||
| 			sec, _ = Cfg.NewSection("log." + mode) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Log level. |  | ||||||
| 		levelName := getLogLevel("log."+mode, "LEVEL", LogLevel) |  | ||||||
| 		level, ok := logLevels[levelName] |  | ||||||
| 		if !ok { |  | ||||||
| 			log.Fatal(4, "Unknown log level: %s", levelName) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Generate log configuration. |  | ||||||
| 		switch mode { |  | ||||||
| 		case "console": |  | ||||||
| 			LogConfigs[i] = fmt.Sprintf(`{"level":%s}`, level) |  | ||||||
| 		case "file": |  | ||||||
| 			logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "gitea.log")) |  | ||||||
| 			if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { |  | ||||||
| 				panic(err.Error()) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			LogConfigs[i] = fmt.Sprintf( |  | ||||||
| 				`{"level":%s,"filename":"%s","rotate":%v,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, |  | ||||||
| 				logPath, |  | ||||||
| 				sec.Key("LOG_ROTATE").MustBool(true), |  | ||||||
| 				1<<uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)), |  | ||||||
| 				sec.Key("DAILY_ROTATE").MustBool(true), |  | ||||||
| 				sec.Key("MAX_DAYS").MustInt(7)) |  | ||||||
| 		case "conn": |  | ||||||
| 			LogConfigs[i] = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level, |  | ||||||
| 				sec.Key("RECONNECT_ON_MSG").MustBool(), |  | ||||||
| 				sec.Key("RECONNECT").MustBool(), |  | ||||||
| 				sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}), |  | ||||||
| 				sec.Key("ADDR").MustString(":7020")) |  | ||||||
| 		case "smtp": |  | ||||||
| 			LogConfigs[i] = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":["%s"],"subject":"%s"}`, level, |  | ||||||
| 				sec.Key("USER").MustString("example@example.com"), |  | ||||||
| 				sec.Key("PASSWD").MustString("******"), |  | ||||||
| 				sec.Key("HOST").MustString("127.0.0.1:25"), |  | ||||||
| 				strings.Replace(sec.Key("RECEIVERS").MustString("example@example.com"), ",", "\",\"", -1), |  | ||||||
| 				sec.Key("SUBJECT").MustString("Diagnostic message from serve")) |  | ||||||
| 		case "database": |  | ||||||
| 			LogConfigs[i] = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level, |  | ||||||
| 				sec.Key("DRIVER").String(), |  | ||||||
| 				sec.Key("CONN").String()) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		log.NewLogger(Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000), mode, LogConfigs[i]) |  | ||||||
| 		log.Info("Log Mode: %s(%s)", strings.Title(mode), levelName) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewXORMLogService initializes xorm logger service |  | ||||||
| func NewXORMLogService(disableConsole bool) { |  | ||||||
| 	logModes := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") |  | ||||||
| 	var logConfigs string |  | ||||||
| 	for _, mode := range logModes { |  | ||||||
| 		mode = strings.TrimSpace(mode) |  | ||||||
| 
 |  | ||||||
| 		if disableConsole && mode == "console" { |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		sec, err := Cfg.GetSection("log." + mode) |  | ||||||
| 		if err != nil { |  | ||||||
| 			sec, _ = Cfg.NewSection("log." + mode) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Log level. |  | ||||||
| 		levelName := getLogLevel("log."+mode, "LEVEL", LogLevel) |  | ||||||
| 		level, ok := logLevels[levelName] |  | ||||||
| 		if !ok { |  | ||||||
| 			log.Fatal(4, "Unknown log level: %s", levelName) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Generate log configuration. |  | ||||||
| 		switch mode { |  | ||||||
| 		case "console": |  | ||||||
| 			logConfigs = fmt.Sprintf(`{"level":%s}`, level) |  | ||||||
| 		case "file": |  | ||||||
| 			logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "xorm.log")) |  | ||||||
| 			if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { |  | ||||||
| 				panic(err.Error()) |  | ||||||
| 			} |  | ||||||
| 			logPath = path.Join(filepath.Dir(logPath), "xorm.log") |  | ||||||
| 
 |  | ||||||
| 			logConfigs = fmt.Sprintf( |  | ||||||
| 				`{"level":%s,"filename":"%s","rotate":%v,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, |  | ||||||
| 				logPath, |  | ||||||
| 				sec.Key("LOG_ROTATE").MustBool(true), |  | ||||||
| 				1<<uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)), |  | ||||||
| 				sec.Key("DAILY_ROTATE").MustBool(true), |  | ||||||
| 				sec.Key("MAX_DAYS").MustInt(7)) |  | ||||||
| 		case "conn": |  | ||||||
| 			logConfigs = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level, |  | ||||||
| 				sec.Key("RECONNECT_ON_MSG").MustBool(), |  | ||||||
| 				sec.Key("RECONNECT").MustBool(), |  | ||||||
| 				sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}), |  | ||||||
| 				sec.Key("ADDR").MustString(":7020")) |  | ||||||
| 		case "smtp": |  | ||||||
| 			logConfigs = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level, |  | ||||||
| 				sec.Key("USER").MustString("example@example.com"), |  | ||||||
| 				sec.Key("PASSWD").MustString("******"), |  | ||||||
| 				sec.Key("HOST").MustString("127.0.0.1:25"), |  | ||||||
| 				sec.Key("RECEIVERS").MustString("[]"), |  | ||||||
| 				sec.Key("SUBJECT").MustString("Diagnostic message from serve")) |  | ||||||
| 		case "database": |  | ||||||
| 			logConfigs = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level, |  | ||||||
| 				sec.Key("DRIVER").String(), |  | ||||||
| 				sec.Key("CONN").String()) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		log.NewXORMLogger(Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000), mode, logConfigs) |  | ||||||
| 		if !disableConsole { |  | ||||||
| 			log.Info("XORM Log Mode: %s(%s)", strings.Title(mode), levelName) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		var lvl core.LogLevel |  | ||||||
| 		switch levelName { |  | ||||||
| 		case "Trace", "Debug": |  | ||||||
| 			lvl = core.LOG_DEBUG |  | ||||||
| 		case "Info": |  | ||||||
| 			lvl = core.LOG_INFO |  | ||||||
| 		case "Warn": |  | ||||||
| 			lvl = core.LOG_WARNING |  | ||||||
| 		case "Error", "Critical": |  | ||||||
| 			lvl = core.LOG_ERR |  | ||||||
| 		} |  | ||||||
| 		log.XORMLogger.SetLevel(lvl) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if len(logConfigs) == 0 { |  | ||||||
| 		log.DiscardXORMLogger() |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Cache represents cache settings |  | ||||||
| type Cache struct { |  | ||||||
| 	Adapter  string |  | ||||||
| 	Interval int |  | ||||||
| 	Conn     string |  | ||||||
| 	TTL      time.Duration |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	// CacheService the global cache |  | ||||||
| 	CacheService *Cache |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func newCacheService() { |  | ||||||
| 	sec := Cfg.Section("cache") |  | ||||||
| 	CacheService = &Cache{ |  | ||||||
| 		Adapter: sec.Key("ADAPTER").In("memory", []string{"memory", "redis", "memcache"}), |  | ||||||
| 	} |  | ||||||
| 	switch CacheService.Adapter { |  | ||||||
| 	case "memory": |  | ||||||
| 		CacheService.Interval = sec.Key("INTERVAL").MustInt(60) |  | ||||||
| 	case "redis", "memcache": |  | ||||||
| 		CacheService.Conn = strings.Trim(sec.Key("HOST").String(), "\" ") |  | ||||||
| 	default: |  | ||||||
| 		log.Fatal(4, "Unknown cache adapter: %s", CacheService.Adapter) |  | ||||||
| 	} |  | ||||||
| 	CacheService.TTL = sec.Key("ITEM_TTL").MustDuration(16 * time.Hour) |  | ||||||
| 
 |  | ||||||
| 	log.Info("Cache Service Enabled") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func newSessionService() { |  | ||||||
| 	SessionConfig.Provider = Cfg.Section("session").Key("PROVIDER").In("memory", |  | ||||||
| 		[]string{"memory", "file", "redis", "mysql", "postgres", "couchbase", "memcache", "nodb"}) |  | ||||||
| 	SessionConfig.ProviderConfig = strings.Trim(Cfg.Section("session").Key("PROVIDER_CONFIG").MustString(path.Join(AppDataPath, "sessions")), "\" ") |  | ||||||
| 	if SessionConfig.Provider == "file" && !filepath.IsAbs(SessionConfig.ProviderConfig) { |  | ||||||
| 		SessionConfig.ProviderConfig = path.Join(AppWorkPath, SessionConfig.ProviderConfig) |  | ||||||
| 	} |  | ||||||
| 	SessionConfig.CookieName = Cfg.Section("session").Key("COOKIE_NAME").MustString("i_like_gitea") |  | ||||||
| 	SessionConfig.CookiePath = AppSubURL |  | ||||||
| 	SessionConfig.Secure = Cfg.Section("session").Key("COOKIE_SECURE").MustBool(false) |  | ||||||
| 	SessionConfig.Gclifetime = Cfg.Section("session").Key("GC_INTERVAL_TIME").MustInt64(86400) |  | ||||||
| 	SessionConfig.Maxlifetime = Cfg.Section("session").Key("SESSION_LIFE_TIME").MustInt64(86400) |  | ||||||
| 
 |  | ||||||
| 	log.Info("Session Service Enabled") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Mailer represents mail service. |  | ||||||
| type Mailer struct { |  | ||||||
| 	// Mailer |  | ||||||
| 	QueueLength     int |  | ||||||
| 	Name            string |  | ||||||
| 	From            string |  | ||||||
| 	FromName        string |  | ||||||
| 	FromEmail       string |  | ||||||
| 	SendAsPlainText bool |  | ||||||
| 	MailerType      string |  | ||||||
| 
 |  | ||||||
| 	// SMTP sender |  | ||||||
| 	Host              string |  | ||||||
| 	User, Passwd      string |  | ||||||
| 	DisableHelo       bool |  | ||||||
| 	HeloHostname      string |  | ||||||
| 	SkipVerify        bool |  | ||||||
| 	UseCertificate    bool |  | ||||||
| 	CertFile, KeyFile string |  | ||||||
| 	IsTLSEnabled      bool |  | ||||||
| 
 |  | ||||||
| 	// Sendmail sender |  | ||||||
| 	SendmailPath string |  | ||||||
| 	SendmailArgs []string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var ( |  | ||||||
| 	// MailService the global mailer |  | ||||||
| 	MailService *Mailer |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func newMailService() { |  | ||||||
| 	sec := Cfg.Section("mailer") |  | ||||||
| 	// Check mailer setting. |  | ||||||
| 	if !sec.Key("ENABLED").MustBool() { |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	MailService = &Mailer{ |  | ||||||
| 		QueueLength:     sec.Key("SEND_BUFFER_LEN").MustInt(100), |  | ||||||
| 		Name:            sec.Key("NAME").MustString(AppName), |  | ||||||
| 		SendAsPlainText: sec.Key("SEND_AS_PLAIN_TEXT").MustBool(false), |  | ||||||
| 		MailerType:      sec.Key("MAILER_TYPE").In("", []string{"smtp", "sendmail", "dummy"}), |  | ||||||
| 
 |  | ||||||
| 		Host:           sec.Key("HOST").String(), |  | ||||||
| 		User:           sec.Key("USER").String(), |  | ||||||
| 		Passwd:         sec.Key("PASSWD").String(), |  | ||||||
| 		DisableHelo:    sec.Key("DISABLE_HELO").MustBool(), |  | ||||||
| 		HeloHostname:   sec.Key("HELO_HOSTNAME").String(), |  | ||||||
| 		SkipVerify:     sec.Key("SKIP_VERIFY").MustBool(), |  | ||||||
| 		UseCertificate: sec.Key("USE_CERTIFICATE").MustBool(), |  | ||||||
| 		CertFile:       sec.Key("CERT_FILE").String(), |  | ||||||
| 		KeyFile:        sec.Key("KEY_FILE").String(), |  | ||||||
| 		IsTLSEnabled:   sec.Key("IS_TLS_ENABLED").MustBool(), |  | ||||||
| 
 |  | ||||||
| 		SendmailPath: sec.Key("SENDMAIL_PATH").MustString("sendmail"), |  | ||||||
| 	} |  | ||||||
| 	MailService.From = sec.Key("FROM").MustString(MailService.User) |  | ||||||
| 
 |  | ||||||
| 	if sec.HasKey("ENABLE_HTML_ALTERNATIVE") { |  | ||||||
| 		log.Warn("ENABLE_HTML_ALTERNATIVE is deprecated, use SEND_AS_PLAIN_TEXT") |  | ||||||
| 		MailService.SendAsPlainText = !sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(false) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if sec.HasKey("USE_SENDMAIL") { |  | ||||||
| 		log.Warn("USE_SENDMAIL is deprecated, use MAILER_TYPE=sendmail") |  | ||||||
| 		if MailService.MailerType == "" && sec.Key("USE_SENDMAIL").MustBool(false) { |  | ||||||
| 			MailService.MailerType = "sendmail" |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	parsed, err := mail.ParseAddress(MailService.From) |  | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal(4, "Invalid mailer.FROM (%s): %v", MailService.From, err) |  | ||||||
| 	} |  | ||||||
| 	MailService.FromName = parsed.Name |  | ||||||
| 	MailService.FromEmail = parsed.Address |  | ||||||
| 
 |  | ||||||
| 	if MailService.MailerType == "" { |  | ||||||
| 		MailService.MailerType = "smtp" |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if MailService.MailerType == "sendmail" { |  | ||||||
| 		MailService.SendmailArgs, err = shellquote.Split(sec.Key("SENDMAIL_ARGS").String()) |  | ||||||
| 		if err != nil { |  | ||||||
| 			log.Error(4, "Failed to parse Sendmail args: %v", CustomConf, err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	log.Info("Mail Service Enabled") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func newRegisterMailService() { |  | ||||||
| 	if !Cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").MustBool() { |  | ||||||
| 		return |  | ||||||
| 	} else if MailService == nil { |  | ||||||
| 		log.Warn("Register Mail Service: Mail Service is not enabled") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	Service.RegisterEmailConfirm = true |  | ||||||
| 	log.Info("Register Mail Service Enabled") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func newNotifyMailService() { |  | ||||||
| 	if !Cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").MustBool() { |  | ||||||
| 		return |  | ||||||
| 	} else if MailService == nil { |  | ||||||
| 		log.Warn("Notify Mail Service: Mail Service is not enabled") |  | ||||||
| 		return |  | ||||||
| 	} |  | ||||||
| 	Service.EnableNotifyMail = true |  | ||||||
| 	log.Info("Notify Mail Service Enabled") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func newWebhookService() { |  | ||||||
| 	sec := Cfg.Section("webhook") |  | ||||||
| 	Webhook.QueueLength = sec.Key("QUEUE_LENGTH").MustInt(1000) |  | ||||||
| 	Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) |  | ||||||
| 	Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool() |  | ||||||
| 	Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk"} |  | ||||||
| 	Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewServices initializes the services | // NewServices initializes the services | ||||||
| func NewServices() { | func NewServices() { | ||||||
| 	newService() | 	newService() | ||||||
|  | |||||||
							
								
								
									
										30
									
								
								modules/setting/webhook.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								modules/setting/webhook.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | // Copyright 2019 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 setting | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	// Webhook settings | ||||||
|  | 	Webhook = struct { | ||||||
|  | 		QueueLength    int | ||||||
|  | 		DeliverTimeout int | ||||||
|  | 		SkipTLSVerify  bool | ||||||
|  | 		Types          []string | ||||||
|  | 		PagingNum      int | ||||||
|  | 	}{ | ||||||
|  | 		QueueLength:    1000, | ||||||
|  | 		DeliverTimeout: 5, | ||||||
|  | 		SkipTLSVerify:  false, | ||||||
|  | 		PagingNum:      10, | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func newWebhookService() { | ||||||
|  | 	sec := Cfg.Section("webhook") | ||||||
|  | 	Webhook.QueueLength = sec.Key("QUEUE_LENGTH").MustInt(1000) | ||||||
|  | 	Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) | ||||||
|  | 	Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool() | ||||||
|  | 	Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk"} | ||||||
|  | 	Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 GitHub
							GitHub