]> source.dussan.org Git - gitea.git/commitdiff
Finsih mail resend limit
authorUnknown <joe2010xtmf@163.com>
Fri, 21 Mar 2014 14:09:57 +0000 (10:09 -0400)
committerUnknown <joe2010xtmf@163.com>
Fri, 21 Mar 2014 14:09:57 +0000 (10:09 -0400)
README.md
conf/app.ini
gogs.go
models/models.go
modules/base/conf.go
routers/admin/admin.go
routers/user/user.go
templates/admin/config.tmpl
templates/user/active.tmpl

index e78ce8fe99b348990e6856ae564c461193e5a6c6..cbd1f588df5ba94c3104ddab89cdfcfb81ee99da 100644 (file)
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Gogs(Go Git Service) is a GitHub-like clone in the Go Programming Language.
 
 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
 
index 71fe81e83499302155aa6559bf8fe04bd2016833..ecb0d2511f4f5444a5ad013c0a2f1af604b4f266 100644 (file)
@@ -61,8 +61,14 @@ USER =
 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"
diff --git a/gogs.go b/gogs.go
index a9f7e6b5c4d30409cafdd094dbd8db73537f1bff..41df79280a192cbad8cd35ed9986d35de0a8277e 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -20,7 +20,7 @@ import (
 // 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
index a4550d72438a5bf973fc063ad7449b8dcf3732f9..8713ff2896a61949c71ae111b2702d835a3ff5c1 100644 (file)
@@ -35,7 +35,6 @@ func LoadModelsConfig() {
 }
 
 func setEngine() {
-
        var err error
        switch DbCfg.Type {
        case "mysql":
index 3962972cda0351a0788a4827deba3c9d9abaa27b..2c3ecd72d8d4784a2fbd552e85a540b94d64dfc7 100644 (file)
@@ -133,6 +133,30 @@ func newLogService() {
        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") {
@@ -188,16 +212,6 @@ func NewConfigContext() {
        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 {
@@ -209,6 +223,7 @@ func NewConfigContext() {
 func NewServices() {
        newService()
        newLogService()
+       newCacheService()
        newMailService()
        newRegisterMailService()
 }
index 6d3831a9f39f142cec8e015df5b1a60072a9ae4e..d70af3c50c352595f739b21c02158d3292052024 100644 (file)
@@ -67,5 +67,8 @@ func Config(ctx *middleware.Context) {
                ctx.Data["Mailer"] = base.MailService
        }
 
+       ctx.Data["CacheAdapter"] = base.CacheAdapter
+       ctx.Data["CacheConfig"] = base.CacheConfig
+
        ctx.HTML(200, "admin/config")
 }
index 40b594ab806af01eb7481f8d77fad36753faf1f5..d38eb1ceb352e5ac5b564196369edeb9825a98e1 100644 (file)
@@ -167,6 +167,10 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
                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")
@@ -247,8 +251,12 @@ func Activate(ctx *middleware.Context) {
                }
                // 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
                }
index 7013c201ae9610c70ba1174007dfa9b11acc2cf1..ad32ec3fb1054f8b58cbdaf328bbb4b770abc79b 100644 (file)
                 <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
index fefd7d3aed131faf3afec2d14927ddc025ece874..47c87a591c6c0e778ce9b4ce1359711f276b289e 100644 (file)
@@ -6,6 +6,8 @@
         {{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/>