Since we choose to use pure Go implementation of Git manipulation, Gogs certainly supports **ALL platforms** that Go supports, including Linux, Max OS X, and Windows with **ZERO** dependency.
-##### Current version: 0.1.4 Alpha
+##### Current version: 0.1.5 Alpha
## Purpose
PASSWD =
[cache]
+; Either "memory", "redis", or "memcache", default is "memory"
ADAPTER = memory
-CONFIG =
+; For "memory" only, GC interval in seconds, default is 60
+INTERVAL = 60
+; For "redis" and "memcache", connection host address
+; redis: ":6039"
+; memcache: "127.0.0.1:11211"
+HOST =
[log]
; Either "console", "file", "conn" or "smtp", default is "console"
// Test that go1.2 tag above is included in builds. main.go refers to this definition.
const go12tag = true
-const APP_VER = "0.1.4.0321"
+const APP_VER = "0.1.5.0321"
func init() {
base.AppVer = APP_VER
}
func setEngine() {
-
var err error
switch DbCfg.Type {
case "mysql":
log.Info("Log Mode: %s(%s)", strings.Title(mode), levelName)
}
+func newCacheService() {
+ CacheAdapter = Cfg.MustValue("cache", "ADAPTER", "memory")
+
+ switch CacheAdapter {
+ case "memory":
+ CacheConfig = fmt.Sprintf(`{"interval":%d}`, Cfg.MustInt("cache", "INTERVAL", 60))
+ case "redis", "memcache":
+ CacheConfig = fmt.Sprintf(`{"conn":"%s"}`, Cfg.MustValue("cache", "HOST"))
+ default:
+ fmt.Printf("Unknown cache adapter: %s\n", CacheAdapter)
+ os.Exit(2)
+ }
+
+ var err error
+ Cache, err = cache.NewCache(CacheAdapter, CacheConfig)
+ if err != nil {
+ fmt.Printf("Init cache system failed, adapter: %s, config: %s, %v\n",
+ CacheAdapter, CacheConfig, err)
+ os.Exit(2)
+ }
+
+ log.Info("Cache Service Enabled")
+}
+
func newMailService() {
// Check mailer setting.
if Cfg.MustBool("mailer", "ENABLED") {
SecretKey = Cfg.MustValue("security", "SECRET_KEY")
RunUser = Cfg.MustValue("", "RUN_USER")
- CacheAdapter = Cfg.MustValue("cache", "ADAPTER")
- CacheConfig = Cfg.MustValue("cache", "CONFIG")
-
- Cache, err = cache.NewCache(CacheAdapter, CacheConfig)
- if err != nil {
- fmt.Printf("Init cache system failed, adapter: %s, config: %s, %v\n",
- CacheAdapter, CacheConfig, err)
- os.Exit(2)
- }
-
// Determine and create root git reposiroty path.
RepoRootPath = Cfg.MustValue("repository", "ROOT")
if err = os.MkdirAll(RepoRootPath, os.ModePerm); err != nil {
func NewServices() {
newService()
newLogService()
+ newCacheService()
newMailService()
newRegisterMailService()
}
ctx.Data["Mailer"] = base.MailService
}
+ ctx.Data["CacheAdapter"] = base.CacheAdapter
+ ctx.Data["CacheConfig"] = base.CacheConfig
+
ctx.HTML(200, "admin/config")
}
ctx.Data["Email"] = u.Email
ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
ctx.HTML(200, "user/active")
+
+ if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
+ log.Error("Set cache(MailResendLimit) fail: %v", err)
+ }
return
}
ctx.Redirect("/user/login")
}
// Resend confirmation e-mail.
if base.Service.RegisterEmailConfirm {
- ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
- mailer.SendActiveMail(ctx.Render, ctx.User)
+ if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) {
+ ctx.Data["ResendLimited"] = true
+ } else {
+ ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
+ mailer.SendActiveMail(ctx.Render, ctx.User)
+ }
} else {
ctx.Data["ServiceNotEnabled"] = true
}
<div><b>User:</b> {{.Mailer.User}}</div>
</div>
</div>
+
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Cache Configuration
+ </div>
+
+ <div class="panel-body">
+ <div><b>Cache Adapter:</b> {{.CacheAdapter}}</div>
+ <div><b>Cache Config:</b> <code>{{.CacheConfig}}</code></div>
+ </div>
+ </div>
</div>
</div>
{{template "base/footer" .}}
\ No newline at end of file
{{if .IsActivatePage}}
{{if .ServiceNotEnabled}}
<p>Sorry, Register Mail Confirmation has been disabled.</p>
+ {{else if .ResendLimited}}
+ <p>Sorry, you are sending activation e-mail too frequently, please wait 3 minutes.</p>
{{else}}
<p>New confirmation e-mail has been sent to <b>{{.SignedUser.Email}}</b>, please check your inbox within {{.Hours}} hours to complete your registeration.</p>
<hr/>