|
|
|
@ -7,9 +7,7 @@ package setting |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"encoding/base64" |
|
|
|
|
"fmt" |
|
|
|
|
"net" |
|
|
|
|
"net/mail" |
|
|
|
|
"net/url" |
|
|
|
|
"os" |
|
|
|
|
"os/exec" |
|
|
|
@ -30,14 +28,12 @@ import ( |
|
|
|
|
"github.com/Unknwon/com" |
|
|
|
|
_ "github.com/go-macaron/cache/memcache" // memcache plugin for cache
|
|
|
|
|
_ "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/memcache" // memcache 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/postgres" // postgres plugin for session store
|
|
|
|
|
_ "github.com/go-macaron/session/redis" // redis plugin for store session
|
|
|
|
|
"github.com/go-xorm/core" |
|
|
|
|
shellquote "github.com/kballard/go-shellquote" |
|
|
|
|
version "github.com/mcuadros/go-version" |
|
|
|
|
ini "gopkg.in/ini.v1" |
|
|
|
@ -192,20 +188,6 @@ var ( |
|
|
|
|
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 = struct { |
|
|
|
|
AnsiCharset string |
|
|
|
@ -409,8 +391,6 @@ var ( |
|
|
|
|
// Time settings
|
|
|
|
|
TimeFormat string |
|
|
|
|
|
|
|
|
|
// Session settings
|
|
|
|
|
SessionConfig session.Options |
|
|
|
|
CSRFCookieName = "_csrf" |
|
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
func NewServices() { |
|
|
|
|
newService() |
|
|
|
|