]> source.dussan.org Git - gitea.git/commitdiff
Finish new reset password, etc.
authorUnknwon <joe2010xtmf@163.com>
Sun, 10 Aug 2014 04:02:00 +0000 (21:02 -0700)
committerUnknwon <joe2010xtmf@163.com>
Sun, 10 Aug 2014 04:02:00 +0000 (21:02 -0700)
16 files changed:
.gitignore
conf/locale/locale_en-US.ini
conf/locale/locale_zh-CN.ini
modules/middleware/auth.go
public/ng/css/ui.css
public/ng/less/gogs/repository.less
public/ng/less/ui/form.less
routers/home.go
routers/user/auth.go
templates/.brackets.json [deleted file]
templates/home.tmpl
templates/user/activate.tmpl
templates/user/forgot_passwd.tmpl
templates/user/reset_passwd.tmpl
templates/user/signin.tmpl
templates/user/signup.tmpl

index e8b5ee1f93f7409a7cd149bb491fc504cc4c5873..57d1493b06d4b9729c368fa164c2bfbf69bfa57e 100644 (file)
@@ -38,3 +38,4 @@ __pycache__
 *.pem
 output*
 config.codekit
+.brackets.json
index 9e2302195d70bf74f4444044d56643ac58de4bc5..d5adde92b0ecf547e243e23b6faa8b1001abe920 100644 (file)
@@ -52,9 +52,23 @@ create_new_account = Create New Account
 register_hepler_msg = Already have an account? Sign in now!
 social_register_hepler_msg = Already have an account? Bind now!
 disable_register_prompt = Sorry, registration has been disabled. Please contact the site administrator.
+disable_register_mail = Sorry, Register Mail Confirmation has been disabled.
 remember_me = Remember Me
+forgot_password= Fotgot Password
 forget_password = Fotget password?
 sign_up_now = Need an account? Sign up now.
+confirmation_mail_sent_prompt = A new confirmation e-mail has been sent to <b>%s</b>, please check your inbox within the next %d hours to complete your registration.
+sign_in_email = Sign in to your e-mail
+active_your_account = Activate Your Account
+resent_limit_prompt = Sorry, you are sending an activation e-mail too frequently. Please wait 3 minutes.
+has_unconfirmed_mail = Hi %s, you have an unconfirmed email address(<b>%s</b>). If you haven't received a confirmation e-mail or need to resend a new one, please click on the button below.
+resend_mail = Click here to resend your activation e-mail
+email_not_associate = This e-mail address does not associate to any account.
+send_reset_mail = Click here to (re)send your passowrd reset e-mail
+reset_password = Reset Your Password
+invalid_code = Sorry, your confirmation code has exipired or not valid.
+reset_password_helper = Click here to reset your password
+password_too_short = Password length cannot be less then 6.
 
 [form]
 UserName = Username
index 8aec50092ce6e63840d29339af973d94fa61477f..c847f763457283c76e2330353afe6e187fe877cf 100644 (file)
@@ -52,9 +52,23 @@ create_new_account = 创建帐户
 register_hepler_msg = 已经注册?立即登录!
 social_register_hepler_msg = 已经注册?立即绑定!
 disable_register_prompt = 对不起,注册功能已被关闭。请联系网站管理员。
+disable_register_mail = 对不起,注册邮箱确认功能已被关闭。
 remember_me = 记住登录
+forgot_password = 忘记密码
 forget_password = 忘记密码?
 sign_up_now = 还没帐户?马上注册。
+confirmation_mail_sent_prompt = 一封新的确认邮件已经被发送至 <b>%s</b>,请检查您的收件箱并在 %d 小时内完成确认注册操作。
+sign_in_email = 登录到您的邮箱
+active_your_account = 激活您的帐户
+resent_limit_prompt = 对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试!
+has_unconfirmed_mail = %s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。
+resend_mail = 单击此处重新发送确认邮件
+email_not_associate = 您输入的邮箱地址未被关联到任何帐号!
+send_reset_mail = 单击此处(重新)发送您的密码重置邮件
+reset_password = 重置密码
+invalid_code = 对不起,您的确认代码已过期或已失效。
+reset_password_helper = 单击此处重置密码
+password_too_short = 密码长度不能少于 6 位!
 
 [form]
 UserName = 用户名
index 29a2d68110a4936cfa21ea8dc1ac3ee0be24b788..5862787b348a7142b37e33d755d3ca3e3e1e9ed6 100644 (file)
@@ -5,6 +5,7 @@
 package middleware
 
 import (
+       "fmt"
        "net/url"
        "strings"
 
@@ -43,6 +44,7 @@ func Toggle(options *ToggleOptions) macaron.Handler {
                }
 
                if options.SignInRequire {
+                       fmt.Println(ctx.User.IsActive, setting.Service.RegisterEmailConfirm)
                        if !ctx.IsSigned {
                                // Ignore watch repository operation.
                                if strings.HasSuffix(ctx.Req.RequestURI, "watch") {
@@ -52,7 +54,7 @@ func Toggle(options *ToggleOptions) macaron.Handler {
                                ctx.Redirect("/user/login")
                                return
                        } else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
-                               // ctx.Data["Title"] = "Activate Your Account"
+                               ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
                                ctx.HTML(200, "user/activate")
                                return
                        }
index e5b0de3304708d9f0eed3479ee5971fee5a292bf..e9e3d3ff863a97082342d3b46d036f8ed58ce065 100644 (file)
@@ -435,6 +435,7 @@ dt {
 }
 .btn-link {
   overflow: visible;
+  color: white;
   padding: .6em 1.2em;
 }
 .btn-radius {
index abc2f9387460ed4cd5ec6689e494eb837790da28..2843fac2d9edeb92f5d078359eef0b0173e46b38 100644 (file)
 @import "../ui/var";
-
 @repoHeaderBorderColor: #D6D6D6;
 @repoHeaderBgColor: #FFF;
 @repoHeaderNameColor: #888;
 
 /* repository main */
+
 #repo-wrapper {
-    padding-bottom: 100px;
+       padding-bottom: 100px;
 }
 #repo-header {
-  height: 69px;
-  border-bottom: 1px solid @repoHeaderBorderColor;
-  background-color: @repoHeaderBgColor;
+       height: 69px;
+       border-bottom: 1px solid@repoHeaderBorderColor;
+
+background-color: @repoHeaderBgColor;
+
 }
 #repo-header-name {
-  line-height: 66px;
-  color: @repoHeaderNameColor;
-  font-size: 1.6em;
-  font-weight: normal;
-  margin-bottom: 0;
-  i {
-    margin-right: 12px;
-    vertical-align: middle;
-  }
-  .divider {
-    margin: 0 4px;
-  }
-}
+       line-height: 66px;
+       color: @repoHeaderNameColor;
 
+font-size: 1.6em;
+       font-weight: normal;
+       margin-bottom: 0;
+       i {
+               margin-right: 12px;
+               vertical-align: middle;
+       }
+       .divider {
+               margin: 0 4px;
+       }
+}
 #repo-header-meta {
-  line-height: 66px;
-  li {
-    > a {
-      padding: 0;
-      &:hover {
-        background-color: transparent;
-      }
-    }
-  }
-  a > .btn {
-    font-size: 1.05em;
-    margin-left: 16px;
-    i {
-      margin-right: 6px;
-    }
-    line-height: 16px;
-    .num {
-      margin-left: 6px;
-    }
-  }
+       line-height: 66px;
+       li {
+               > a {
+                       padding: 0;
+                       &:hover {
+                               background-color: transparent;
+                       }
+               }
+       }
+       a > .btn {
+               font-size: 1.05em;
+               margin-left: 16px;
+               i {
+                       margin-right: 6px;
+               }
+               line-height:16px;
+               .num {
+                       margin-left: 6px;
+               }
+       }
 }
-
 #repo-header-download-btn {
-  > .btn > i {
-    margin-right: 0 !important;
-  }
-  &:hover {
-    &:after,
-    .btn {
-      background-color: @btnHoverBlackColor;
-      color: #FFF;
-    }
-  }
-  &:after {
-    background-color: @btnBlackColor;
-    padding: 9px 16px 8px 0;
-    margin-left: -8px !important;
-    color: #FFF;
-    border-top: 1px solid @btnBlackColor;
-    border-bottom: 1px solid @btnBlackColor;
-    border-top-right-radius: .25em;
-    border-bottom-right-radius: .25em;
-  }
-}
+       > .btn > i {
+               margin-right: 0 !important;
+       }
+       &:hover {
+               &:after, .btn {
+                       background-color: @btnHoverBlackColor;
+
+color: #FFF;
+               }
+       }
+       &:after {
+               background-color: @btnBlackColor;
 
+padding: 9px 16px 8px 0;
+               margin-left: -8px !important;
+               color: #FFF;
+               border-top: 1px solid@btnBlackColor;
+
+border-bottom: 1px solid@btnBlackColor;
+
+border-top-right-radius: .25em;
+               border-bottom-right-radius: .25em;
+       }
+}
 #repo-header-download-drop {
-  line-height: 24px;
-  width: 440px;
-  top: 50px;
-  left: -354px;
-  padding: 20px;
-  box-sizing: border-box;
-  .btn > i {
-    margin-right: 6px;
-  }
+       line-height: 24px;
+       width: 440px;
+       top: 50px;
+       left: -354px;
+       padding: 20px;
+       box-sizing: border-box;
+       .btn > i {
+               margin-right: 6px;
+       }
 }
-
 #repo-content {
-  padding: 18px 0;
+       padding: 18px 0;
 }
-
 #repo-clone-url {
-  border-right: none;
-  width: 196px;
-  border-left: none;
+       border-right: none;
+       width: 196px;
+       border-left: none;
 }
-
 #repo-clone-help {
-  line-height: 48px;
+       line-height: 48px;
 }
-
 #repo-clone-zip {
-  line-height: 48px;
-  a {
-    cursor: pointer;
-    color: white;
-    overflow: visible;
-    padding: .6em 1.2em;
-  }
-  .btn {
-    margin: 0 6px;
-  }
+       line-height: 48px;
+       a {
+               cursor: pointer;
+               color: white;
+               overflow: visible;
+               padding: .6em 1.2em;
+       }
+       .btn {
+               margin: 0 6px;
+       }
 }
-
 #repo-desc {
-  font-size: 1.2em;
+       font-size: 1.2em;
 }
-
 #repo-sidebar-nav {
-  .label {
-    font-size: 12px;
-    line-height: 1.4em;
-    margin-top: 2px;
-  }
-  i {
-    margin-right: 6px;
-  }
+       .label {
+               font-size: 12px;
+               line-height: 1.4em;
+               margin-top: 2px;
+       }
+       i {
+               margin-right: 6px;
+       }
 }
-
 #repo-file-nav {
-  padding: .6em 0 1em 0;
-  > li > a {
-    padding-left: 0;
-    &:hover {
-      background-color: transparent;
-    }
-  }
-  li.repo-jump > a {
-    padding-right: 0;
-    .btn {
-      margin-left: -1px;
-    }
-  }
+       padding: .6em 0 1em 0;
+       > li > a {
+               padding-left: 0;
+               &:hover {
+                       background-color: transparent;
+               }
+       }
+       li.repo-jump > a {
+               padding-right: 0;
+               .btn {
+                       margin-left: -1px;
+               }
+       }
 }
-
 #repo-branch-switch {
-  > a {
-    .btn {
-      padding-right: 30px;
-    }
-    &:after {
-      position: absolute;
-      top: 12px;
-      right: 30px;
-      margin-left: 0;
-      color: @baseFontColor;
-    }
-  }
-  > .drop-down {
-    top: 40px;
-    left: 0;
-  }
-}
+       > a {
+               .btn {
+                       padding-right: 30px;
+               }
+               &:after {
+                       position: absolute;
+                       top: 12px;
+                       right: 30px;
+                       margin-left: 0;
+                       color: @baseFontColor;
 
+               }
+       }
+       > .drop-down {
+               top: 40px;
+               left: 0;
+       }
+}
 #repo-branch-filter-ipt {
-  width: 100%;
-  border-left: none;
-  border-right: none;
-  box-sizing: border-box;
+       width: 100%;
+       border-left: none;
+       border-right: none;
+       box-sizing: border-box;
 }
-
 #repo-branch-tag {
-  .tab-nav {
-    border-bottom: 1px solid #EAEAEA;
-    a {
-      padding: .3em .8em;
-    }
-    .js-tab-nav-show {
-      background-color: #EEE;
-      font-weight: bold;
-    }
-  }
+       .tab-nav {
+               border-bottom: 1px solid #EAEAEA;
+               a {
+                       padding: .3em .8em;
+               }
+               .js-tab-nav-show {
+                       background-color: #EEE;
+                       font-weight: bold;
+               }
+       }
 }
-
 #repo-branch-list,
 #repo-tag-list {
-  li {
-    i {
-      margin-right: 12px;
-      opacity: 0;
-    }
-  }
-  li.checked {
-    i {
-      opacity: 1;
-    }
-  }
+       li {
+               i {
+                       margin-right: 12px;
+                       opacity: 0;
+               }
+       }
+       li.checked {
+               i {
+                       opacity: 1;
+               }
+       }
 }
-
 #repo-tag-list {
-  display: none;
+       display: none;
 }
-
 #repo-bread {
-  .bread {
-    padding-right: 0;
-    font-size: 16px;
-    font-weight: bold;
-  }
+       .bread {
+               padding-right: 0;
+               font-size: 16px;
+               font-weight: bold;
+       }
 }
-
 #repo-main {
-  padding-right: 40px;
-  box-sizing: border-box;
+       padding-right: 40px;
+       box-sizing: border-box;
 }
-
 #repo-files-table {
-  margin-bottom: 20px;
-  th,
-  td {
-    text-align: left;
-    line-height: 32px;
-  }
-  td.icon {
-    width: 16px;
-    padding-right: .1em;
-    padding-left: 1em;
-  }
-  td.name {
-    max-width: 120px;
-    .text-truncate {
-      max-width: 100%;
-    }
-  }
-  td.age {
-    max-width: 120px;
-    text-align: right;
-  }
-  td.msg {
-    max-width: 440px;
-    .text-truncate {
-      max-width: 100%;
-    }
-  }
-  td.age,
-  td.size,
-  td.msg a {
-    color: #888;
-  }
-  td.msg a:hover {
-    color: #428BCA;
-    text-decoration: underline;
-  }
-  tbody {
-    background-color: #FFF;
-    tr:hover {
-      background-color: #ffffEE;
-    }
-  }
-  thead {
-    background-color: #F0F0F0;
-    .author {
-      a {
-        margin: 0 .4em;
-      }
-    }
-    .last-commit {
-      strong {
-        color: #444;
-      }
-      .text-truncate {
-        margin-left: .4em;
-      }
-    }
-    .last-commit .text-truncate,
-    .age {
-      font-weight: normal;
-      color: #888;
-    }
-  }
+       margin-bottom: 20px;
+       th, td {
+               text-align: left;
+               line-height: 32px;
+       }
+       td.icon {
+               width: 16px;
+               padding-right: .1em;
+               padding-left: 1em;
+       }
+       td.name {
+               max-width: 120px;
+               .text-truncate {
+                       max-width: 100%;
+               }
+       }
+       td.age {
+               max-width: 120px;
+               text-align: right;
+       }
+       td.msg {
+               max-width: 440px;
+               .text-truncate {
+                       max-width: 100%;
+               }
+       }
+       td.age,
+       td.size,
+       td.msg a {
+               color: #888;
+       }
+       td.msg a:hover {
+               color: #428BCA;
+               text-decoration: underline;
+       }
+       tbody {
+               background-color: #FFF;
+               tr:hover {
+                       background-color: #ffffEE;
+               }
+       }
+       thead {
+               background-color: #F0F0F0;
+               .author {
+                       a {
+                               margin: 0 .4em;
+                       }
+               }
+               .last-commit {
+                       strong {
+                               color: #444;
+                       }
+                       .text-truncate {
+                               margin-left: .4em;
+                       }
+               }
+               .last-commit .text-truncate,
+               .age {
+                       font-weight: normal;
+                       color: #888;
+               }
+       }
 }
-
 #repo-readme {
-  margin-bottom: 80px;
+       margin-bottom: 80px;
 }
-
 #repo-bare-start {
-  margin-bottom: 100px;
-  .panel-content {
-    background-color: #FFF;
-  }
-  pre {
-    margin: 0 40px;
-    padding: 6px 10px;
-    border: 1px solid #ddd;
-    background: #f8f8f8;
-  }
+       margin-bottom: 100px;
+       .panel-content {
+               background-color: #FFF;
+       }
+       pre {
+               margin: 0 40px;
+               padding: 6px 10px;
+               border: 1px solid #ddd;
+               background: #f8f8f8;
+       }
 }
-
 .repo-bare {
-  #repo-bare-start {
-    h2 {
-      margin-top: 30px;
-      margin-bottom: 24px;
-    }
-  }
-  #repo-header-meta {
-    display: none;
-  }
-  #repo-clone-ssh {
-    margin-left: 200px;
-  }
-  #repo-clone-copy {
-    margin-right: 200px;
-  }
-  #repo-clone-help {
-    clear: both;
-    width: 100%;
-  }
-  #repo-clone-url {
-    width: 520px;
-  }
+       #repo-bare-start {
+               h2 {
+                       margin-top: 30px;
+                       margin-bottom: 24px;
+               }
+       }
+       #repo-header-meta {
+               display: none;
+       }
+       #repo-clone-ssh {
+               margin-left: 200px;
+       }
+       #repo-clone-copy {
+               margin-right: 200px;
+       }
+       #repo-clone-help {
+               clear: both;
+               width: 100%;
+       }
+       #repo-clone-url {
+               width: 520px;
+       }
 }
-
 /* repository create */
 
 #repo-migrate-form,
 #repo-create-form {
-  width: 800px;
-  margin: 60px auto auto auto;
-  background: white;
-  h2 {
-    margin: .5em 1em;
-  }
-  .field {
-    margin: 1.2em 0 2em 0;
-  }
-  .ipt {
-    width: 540px;
-  }
-  textarea {
-    height: 120px;
-  }
-  .avatar {
-    vertical-align: middle;
-    margin-right: .6em;
-    width: 28px;
-    height: 28px;
-  }
-  &:hover {
-    box-shadow: 0px 0px 6px #CCC;
-  }
+       width: 800px;
+       margin: 60px auto auto auto;
+       background: white;
+       h2 {
+               margin: .5em 1em;
+       }
+       .field {
+               margin: 1.2em 0 2em 0;
+       }
+       .ipt {
+               width: 540px;
+       }
+       textarea {
+               height: 120px;
+       }
+       .avatar {
+               vertical-align: middle;
+               margin-right: .6em;
+               width: 28px;
+               height: 28px;
+       }
+       &:hover {
+               box-shadow: 0px 0px 6px #CCC;
+       }
 }
-
 #repo-create-cancel {
-  margin-left: 4em;
+       margin-left: 4em;
 }
-
 #repo-create-owner-list {
-    top: 30px;
-    left: 0;
-    width: auto;
-    max-width: 300px;
-    .octicon {
-        margin-right: 12px;
-        opacity: 0;
-    }
-    .avatar {
-        width: 20px;
-        height: 20px;
-    }
-    li {
-        white-space: nowrap;
-        &.checked {
-            .octicon {
-                opacity: 1;
-            }
-        }
-        a {
-            text-overflow: ellipsis; 
-            -o-text-overflow: ellipsis; 
-            overflow: hidden;
-        }
-    }
+       top: 30px;
+       left: 0;
+       width: auto;
+       max-width: 300px;
+       .octicon {
+               margin-right: 12px;
+               opacity: 0;
+       }
+       .avatar {
+               width: 20px;
+               height: 20px;
+       }
+       li {
+               white-space: nowrap;
+               &.checked {
+                       .octicon {
+                               opacity: 1;
+                       }
+               }
+               a {
+                       text-overflow: ellipsis;
+                       -o-text-overflow: ellipsis;
+                       overflow: hidden;
+               }
+       }
 }
 .file-name {
-  margin-left: 1em;
+       margin-left: 1em;
 }
 .file-size {
-  font-size: 13px;
-  color: #888;
-  margin-left: 1em;
+       font-size: 13px;
+       color: #888;
+       margin-left: 1em;
 }
 .code-view {
-  overflow: auto;
-  overflow-x: auto;
-  overflow-y: hidden;
-    background: white;
-  .view-raw {
-    min-height: 40px;
-    text-align: center;
-    padding-top: 20px;
-    .btn {
-      font-size: 1.05em;
-      line-height: 16px;
-      padding: 6px 8px;
-    }
-  }
-  table {
-    width: 100%;
-    td {
-      padding: 0;
-    }
-  }
-  .lines-num {
-    text-align: right;
-    color: #999;
-    background: #f5f5f5;
-    width: 1%;
-    span {
-      font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
-      line-height: 18px;
-       padding: 0 8px 0 10px; 
-       cursor: pointer; 
-      display: block;
-      margin-top: 2px;
-      font-size: 12px;
-    }
-  }
-  .lines-code > pre {
-    border: none;
-    border-left: 1px solid #ddd;
-    > ol.linenums > li {
-      padding: 0 10px;
-      &.active {
-        background: #ffffdd;
-      }
-    }
-  }
+       overflow: auto;
+       overflow-x: auto;
+       overflow-y: hidden;
+       background: white;
+       .view-raw {
+               min-height: 40px;
+               text-align: center;
+               padding-top: 20px;
+               .btn {
+                       font-size: 1.05em;
+                       line-height: 16px;
+                       padding: 6px 8px;
+               }
+       }
+       table {
+               width: 100%;
+               td {
+                       padding: 0;
+               }
+       }
+       .lines-num {
+               text-align: right;
+               color: #999;
+               background: #f5f5f5;
+               width: 1%;
+               span {
+                       font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+                       line-height: 18px;
+                       padding: 0 8px 0 10px;
+                       cursor: pointer;
+                       display: block;
+                       margin-top: 2px;
+                       font-size: 12px;
+               }
+       }
+       .lines-code > pre {
+               border: none;
+               border-left: 1px solid #ddd;
+               > ol.linenums > li {
+                       padding: 0 10px;
+                       &.active {
+                               background: #ffffdd;
+                       }
+               }
+       }
 }
 .repo-setting-zone {
-    padding: 30px;
+       padding: 30px;
 }
 #repo-collab-list {
-    list-style: none;
-    padding: 10px 0 5px 0;
-    li.collab {
-        clear: both;
-        height: 50px;
-        padding: 0 15px 0 15px;
-    }
-    a.member {
-        color: #444;
-        height: 50px;
-        line-height: 50px;
-        &:hover {
-            color: #4183C4;
-        }
-    }
-    .avatar {
-        margin-right: 1em;
-        width: 40px;
-    }
-    .remove-collab {
-        color: #DD4B39;
-    }
+       list-style: none;
+       padding: 10px 0 5px 0;
+       li.collab {
+               clear: both;
+               height: 50px;
+               padding: 0 15px 0 15px;
+       }
+       a.member {
+               color: #444;
+               height: 50px;
+               line-height: 50px;
+               &:hover {
+                       color: #4183C4;
+               }
+       }
+       .avatar {
+               margin-right: 1em;
+               width: 40px;
+       }
+       .remove-collab {
+               color: #DD4B39;
+       }
 }
 .repo-user-list-block {
-    position: relative;
-    top: 5px;
+       position: relative;
+       top: 5px;
 }
 .setting-list {
-    width: 100%;
-    list-style: none;
+       width: 100%;
+       list-style: none;
 }
\ No newline at end of file
index fa36b5dc13960a69231336d9313285cb31c5c2ef..3f530dc3904af43956aa224300a0f73768963942 100644 (file)
@@ -81,6 +81,7 @@
 }
 .btn-link {
     overflow: visible;
+    color: white;
     padding: .6em 1.2em;
 }
 .btn-radius {
index 4f7abea7a34d8d2e8afdc80a51ac9b572956d8cc..5ea3e2a0277bbac4f6ac6e8ec0a9bdf2f3760c97 100644 (file)
@@ -17,7 +17,12 @@ const (
 
 func Home(ctx *middleware.Context) {
        if ctx.IsSigned {
-               user.Dashboard(ctx)
+               if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm {
+                       ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
+                       ctx.HTML(200, user.ACTIVATE)
+               } else {
+                       user.Dashboard(ctx)
+               }
                return
        }
 
index 191da0a21919677b77cbfe8eeea5fc1f89e6bebf..404b22f24d236f954b79364c9d81a4868a6cdbda 100644 (file)
@@ -106,10 +106,9 @@ func SignInPost(ctx *middleware.Context, form auth.SignInForm) {
        if err != nil {
                if err == models.ErrUserNotExist {
                        ctx.RenderWithErr(ctx.Tr("form.username_password_incorrect"), SIGNIN, &form)
-                       return
+               } else {
+                       ctx.Handle(500, "UserSignIn", err)
                }
-
-               ctx.Handle(500, "UserSignIn", err)
                return
        }
 
@@ -294,55 +293,59 @@ func SignUpPost(ctx *middleware.Context, cpt *captcha.Captcha, form auth.Registe
 }
 
 func Activate(ctx *middleware.Context) {
-       // code := ctx.Query("code")
-       // if len(code) == 0 {
-       //      ctx.Data["IsActivatePage"] = true
-       //      if ctx.User.IsActive {
-       //              ctx.Handle(404, "user.Activate", nil)
-       //              return
-       //      }
-       //      // Resend confirmation e-mail.
-       //      if setting.Service.RegisterEmailConfirm {
-       //              if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) {
-       //                      ctx.Data["ResendLimited"] = true
-       //              } else {
-       //                      ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60
-       //                      mailer.SendActiveMail(ctx.Render, ctx.User)
-
-       //                      if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil {
-       //                              log.Error("Set cache(MailResendLimit) fail: %v", err)
-       //                      }
-       //              }
-       //      } else {
-       //              ctx.Data["ServiceNotEnabled"] = true
-       //      }
-       //      ctx.HTML(200, ACTIVATE)
-       //      return
-       // }
-
-       // // Verify code.
-       // if user := models.VerifyUserActiveCode(code); user != nil {
-       //      user.IsActive = true
-       //      user.Rands = models.GetUserSalt()
-       //      if err := models.UpdateUser(user); err != nil {
-       //              ctx.Handle(404, "user.Activate", err)
-       //              return
-       //      }
-
-       //      log.Trace("%s User activated: %s", ctx.Req.RequestURI, user.Name)
-
-       //      ctx.Session.Set("userId", user.Id)
-       //      ctx.Session.Set("userName", user.Name)
-       //      ctx.Redirect("/")
-       //      return
-       // }
-
-       // ctx.Data["IsActivateFailed"] = true
-       // ctx.HTML(200, ACTIVATE)
+       code := ctx.Query("code")
+       if len(code) == 0 {
+               ctx.Data["IsActivatePage"] = true
+               if ctx.User.IsActive {
+                       ctx.Error(404)
+                       return
+               }
+               // Resend confirmation e-mail.
+               if setting.Service.RegisterEmailConfirm {
+                       if ctx.Cache.IsExist("MailResendLimit_" + ctx.User.LowerName) {
+                               ctx.Data["ResendLimited"] = true
+                       } else {
+                               ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60
+                               mailer.SendActiveMail(ctx.Render, ctx.User)
+
+                               if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil {
+                                       log.Error(4, "Set cache(MailResendLimit) fail: %v", err)
+                               }
+                       }
+               } else {
+                       ctx.Data["ServiceNotEnabled"] = true
+               }
+               ctx.HTML(200, ACTIVATE)
+               return
+       }
+
+       // Verify code.
+       if user := models.VerifyUserActiveCode(code); user != nil {
+               user.IsActive = true
+               user.Rands = models.GetUserSalt()
+               if err := models.UpdateUser(user); err != nil {
+                       if err == models.ErrUserNotExist {
+                               ctx.Error(404)
+                       } else {
+                               ctx.Handle(500, "UpdateUser", err)
+                       }
+                       return
+               }
+
+               log.Trace("User activated: %s", user.Name)
+
+               ctx.Session.Set("uid", user.Id)
+               ctx.Session.Set("uname", user.Name)
+               ctx.Redirect("/")
+               return
+       }
+
+       ctx.Data["IsActivateFailed"] = true
+       ctx.HTML(200, ACTIVATE)
 }
 
 func ForgotPasswd(ctx *middleware.Context) {
-       ctx.Data["Title"] = "Forgot Password"
+       ctx.Data["Title"] = ctx.Tr("auth.forgot_password")
 
        if setting.MailService == nil {
                ctx.Data["IsResetDisable"] = true
@@ -355,44 +358,45 @@ func ForgotPasswd(ctx *middleware.Context) {
 }
 
 func ForgotPasswdPost(ctx *middleware.Context) {
-       // ctx.Data["Title"] = "Forgot Password"
-
-       // if setting.MailService == nil {
-       //      ctx.Handle(403, "user.ForgotPasswdPost", nil)
-       //      return
-       // }
-       // ctx.Data["IsResetRequest"] = true
-
-       // email := ctx.Query("email")
-       // u, err := models.GetUserByEmail(email)
-       // if err != nil {
-       //      if err == models.ErrUserNotExist {
-       //              ctx.RenderWithErr("This e-mail address does not associate to any account.", "user/forgot_passwd", nil)
-       //      } else {
-       //              ctx.Handle(500, "user.ResetPasswd(check existence)", err)
-       //      }
-       //      return
-       // }
-
-       // if ctx.Cache.IsExist("MailResendLimit_" + u.LowerName) {
-       //      ctx.Data["ResendLimited"] = true
-       //      ctx.HTML(200, FORGOT_PASSWORD)
-       //      return
-       // }
-
-       // mailer.SendResetPasswdMail(ctx.Render, u)
-       // if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
-       //      log.Error("Set cache(MailResendLimit) fail: %v", err)
-       // }
-
-       // ctx.Data["Email"] = email
-       // ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60
-       // ctx.Data["IsResetSent"] = true
-       // ctx.HTML(200, FORGOT_PASSWORD)
+       ctx.Data["Title"] = ctx.Tr("auth.forgot_password")
+
+       if setting.MailService == nil {
+               ctx.Handle(403, "user.ForgotPasswdPost", nil)
+               return
+       }
+       ctx.Data["IsResetRequest"] = true
+
+       email := ctx.Query("email")
+       u, err := models.GetUserByEmail(email)
+       if err != nil {
+               if err == models.ErrUserNotExist {
+                       ctx.Data["Err_Email"] = true
+                       ctx.RenderWithErr(ctx.Tr("auth.email_not_associate"), FORGOT_PASSWORD, nil)
+               } else {
+                       ctx.Handle(500, "user.ResetPasswd(check existence)", err)
+               }
+               return
+       }
+
+       if ctx.Cache.IsExist("MailResendLimit_" + u.LowerName) {
+               ctx.Data["ResendLimited"] = true
+               ctx.HTML(200, FORGOT_PASSWORD)
+               return
+       }
+
+       mailer.SendResetPasswdMail(ctx.Render, u)
+       if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
+               log.Error(4, "Set cache(MailResendLimit) fail: %v", err)
+       }
+
+       ctx.Data["Email"] = email
+       ctx.Data["Hours"] = setting.Service.ActiveCodeLives / 60
+       ctx.Data["IsResetSent"] = true
+       ctx.HTML(200, FORGOT_PASSWORD)
 }
 
 func ResetPasswd(ctx *middleware.Context) {
-       ctx.Data["Title"] = "Reset Password"
+       ctx.Data["Title"] = ctx.Tr("auth.reset_password")
 
        code := ctx.Query("code")
        if len(code) == 0 {
@@ -405,38 +409,39 @@ func ResetPasswd(ctx *middleware.Context) {
 }
 
 func ResetPasswdPost(ctx *middleware.Context) {
-       // ctx.Data["Title"] = "Reset Password"
-
-       // code := ctx.Query("code")
-       // if len(code) == 0 {
-       //      ctx.Error(404)
-       //      return
-       // }
-       // ctx.Data["Code"] = code
-
-       // if u := models.VerifyUserActiveCode(code); u != nil {
-       //      // Validate password length.
-       //      passwd := ctx.Query("passwd")
-       //      if len(passwd) < 6 || len(passwd) > 30 {
-       //              ctx.Data["IsResetForm"] = true
-       //              ctx.RenderWithErr("Password length should be in 6 and 30.", "user/reset_passwd", nil)
-       //              return
-       //      }
-
-       //      u.Passwd = passwd
-       //      u.Rands = models.GetUserSalt()
-       //      u.Salt = models.GetUserSalt()
-       //      u.EncodePasswd()
-       //      if err := models.UpdateUser(u); err != nil {
-       //              ctx.Handle(500, "user.ResetPasswd(UpdateUser)", err)
-       //              return
-       //      }
-
-       //      log.Trace("%s User password reset: %s", ctx.Req.RequestURI, u.Name)
-       //      ctx.Redirect("/user/login")
-       //      return
-       // }
-
-       // ctx.Data["IsResetFailed"] = true
-       // ctx.HTML(200, RESET_PASSWORD)
+       ctx.Data["Title"] = ctx.Tr("auth.reset_password")
+
+       code := ctx.Query("code")
+       if len(code) == 0 {
+               ctx.Error(404)
+               return
+       }
+       ctx.Data["Code"] = code
+
+       if u := models.VerifyUserActiveCode(code); u != nil {
+               // Validate password length.
+               passwd := ctx.Query("password")
+               if len(passwd) < 6 {
+                       ctx.Data["IsResetForm"] = true
+                       ctx.Data["Err_Password"] = true
+                       ctx.RenderWithErr(ctx.Tr("auth.password_too_short"), RESET_PASSWORD, nil)
+                       return
+               }
+
+               u.Passwd = passwd
+               u.Rands = models.GetUserSalt()
+               u.Salt = models.GetUserSalt()
+               u.EncodePasswd()
+               if err := models.UpdateUser(u); err != nil {
+                       ctx.Handle(500, "UpdateUser", err)
+                       return
+               }
+
+               log.Trace("User password reset: %s", u.Name)
+               ctx.Redirect("/user/login")
+               return
+       }
+
+       ctx.Data["IsResetFailed"] = true
+       ctx.HTML(200, RESET_PASSWORD)
 }
diff --git a/templates/.brackets.json b/templates/.brackets.json
deleted file mode 100644 (file)
index f358faa..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "language.fileExtensions": {
-        "tmpl": "html"
-    }
-}
\ No newline at end of file
index 47d1e69017e961065f67e38e1ffd6e76e2a87d20..a0dd408f7c77e28fa159d6bab5f202aa5d9734b3 100644 (file)
@@ -1,4 +1,5 @@
-{{template "ng/base/head" .}} {{template "ng/base/header" .}}
+{{template "ng/base/head" .}} 
+{{template "ng/base/header" .}}
 <div id="promo-wrapper">
     <div class="container clear">
         <div id="promo-logo" class="left">
index 1df3646b6d64c8ff7cf77e660d18e9f635f066ff..acdad9e80b9e25e1e5c6bcb0da6575dcb7f40cb3 100644 (file)
@@ -1,36 +1,39 @@
-{{template "base/head" .}}
-{{template "base/navbar" .}}
-<div id="body" class="container">
-    <form action="/user/activate" method="post" class="form-horizontal card" id="login-card">
+{{template "ng/base/head" .}} 
+{{template "ng/base/header" .}}
+<div id="sign-wrapper">
+    <form class="form-align form panel sign-panel sign-form container panel-radius" id="sign-up-form" action="/user/activate" method="post">
         {{.CsrfTokenHtml}}
-        <h3>Activate Your Account</h3>
+        <div class="panel-header">
+            <h2>{{.i18n.Tr "auth.active_your_account"}}</h2>
+        </div>
+        <div class="panel-content">
         {{if .IsActivatePage}}
             {{if .ServiceNotEnabled}}
-            <p>Sorry, Register Mail Confirmation has been disabled.</p>
+            <p>{{.i18n.Tr "auth.disable_register_mail"}}</p>
             {{else if .ResendLimited}}
-            <p>Sorry, you are sending an activation e-mail too frequently. Please wait 3 minutes.</p>
+            <p>{{.i18n.Tr "auth.resent_limit_prompt"}}</p>
             {{else}}
-            <p>A new confirmation e-mail has been sent to <b>{{.SignedUser.Email}}</b>, please check your inbox within the next {{.Hours}} hours to complete your registration.</p>
+            <p>{{.i18n.Tr "auth.confirmation_mail_sent_prompt" .SignedUser.Email .Hours | Str2html}}</p>
             <hr/>
-            <a href="http://{{Mail2Domain .SignedUser.Email}}" class="btn btn-lg btn-success">Sign in to your e-mail</a>
+            <label></label>
+            <a class="btn btn-green btn-large btn-link btn-radius" href="http://{{Mail2Domain .SignedUser.Email}}">{{.i18n.Tr "auth.sign_in_email"}}</a>
             {{end}}
         {{else}}
             {{if .IsSendRegisterMail}}
-            <p>A confirmation e-mail has been sent to <b>{{.Email}}</b>, please check your inbox within the next {{.Hours}} hours to complete your registration.</p>
+            <p>{{.i18n.Tr "auth.confirmation_mail_sent_prompt" .Email .Hours | Str2html}}</p>
             <hr/>
-            <a href="http://{{Mail2Domain .Email}}" class="btn btn-lg btn-success">Sign in to your e-mail</a>
+            <label></label>
+            <a class="btn btn-green btn-large btn-link btn-radius" href="http://{{Mail2Domain .Email}}">{{.i18n.Tr "auth.sign_in_email"}}</a>
             {{else if .IsActivateFailed}}
-            <p>Sorry, your confirmation code has exipired or not valid.</p>
+            <p>{{.i18n.Tr "auth.invalid_code"}}</p>
             {{else}}
-               <p>Hi, {{.SignedUser.Name}}, you have an unconfirmed email address(<b>{{.SignedUser.Email}}</b>). If you haven't received a confirmation e-mail or need to resend a new one, please click on the button below.</p>
-               <hr/>
-            <div class="form-group">
-                <div class="col-md-offset-4 col-md-6">
-                    <button type="submit" class="btn btn-lg btn-primary">Click here to resend your activation e-mail</button>
-                </div>
-            </div>
+            <p>{{.i18n.Tr "auth.has_unconfirmed_mail" .SignedUser.Name .SignedUser.Email | Str2html}}</p>
+            <hr/>
+            <label></label>
+            <button class="btn btn-blue btn-large btn-radius">{{.i18n.Tr "auth.resend_mail"}}</button>
             {{end}}
         {{end}}
+        </div>
     </form>
 </div>
-{{template "base/footer" .}}
+{{template "ng/base/footer" .}}
index 57564ffd4f9229ec6d8bb32b094c956b6d859920..3b5512673b2708c2571eb8704d940a5a99f2a1fe 100644 (file)
@@ -1,32 +1,32 @@
-{{template "base/head" .}}
-{{template "base/navbar" .}}
-<div id="body" class="container">
-    <form action="/user/forget_password" method="post" class="form-horizontal card" id="login-card">
+{{template "ng/base/head" .}} 
+{{template "ng/base/header" .}}
+<div id="sign-wrapper">
+    <form class="form-align form panel sign-panel sign-form container panel-radius" id="sign-up-form" action="/user/forget_password" method="post">
         {{.CsrfTokenHtml}}
-        <h3>Reset Your Password</h3>
-        {{template "base/alert" .}}
-        {{if .IsResetSent}}
-        <p>A confirmation e-mail has been sent to <b>{{.Email}}</b>, please check your inbox within {{.Hours}} hours.</p>
-        <hr/>
-        <a href="http://{{Mail2Domain .Email}}" class="btn btn-lg btn-success">Sign in to your e-mail</a>
-        {{else if .IsResetRequest}}
-        <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
-            <label class="col-md-3 control-label">Email: </label>
-            <div class="col-md-7">
-                <input name="email" class="form-control" placeholder="Type your e-mail address" required="required">
-            </div>
+        <div class="panel-header">
+            <h2>{{.i18n.Tr "auth.forgot_password"}}</h2>
         </div>
-        <hr/>
-        <div class="form-group">
-            <div class="col-md-offset-4 col-md-6">
-                <button type="submit" class="btn btn-lg btn-primary">Click here to send resend confirmation e-mail</button>
+        <div class="panel-content">
+            {{template "ng/base/alert" .}}
+            {{if .IsResetSent}}
+            <p>{{.i18n.Tr "auth.confirmation_mail_sent_prompt" .Email .Hours | Str2html}}</p>
+            <hr/>
+            <label></label>
+            <a class="btn btn-green btn-large btn-link btn-radius" href="http://{{Mail2Domain .Email}}">{{.i18n.Tr "auth.sign_in_email"}}</a>
+            {{else if .IsResetRequest}}
+            <div class="field">
+                <label class="req" for="email">{{.i18n.Tr "email"}}</label>
+                <input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email"  value="{{.email}}"required/>
             </div>
+            <hr/>
+            <label></label>
+            <button class="btn btn-blue btn-large btn-radius">{{.i18n.Tr "auth.send_reset_mail"}}</button>
+            {{else if .IsResetDisable}}
+            <p>{{.i18n.Tr "auth.disable_register_mail"}}</p>
+            {{else if .ResendLimited}}
+            <p>{{.i18n.Tr "auth.resent_limit_prompt"}}</p>
+            {{end}}
         </div>
-        {{else if .IsResetDisable}}
-        <p>Sorry, mail service is not enabled.</p>
-        {{else if .ResendLimited}}
-        <p>Sorry, you are sending an e-mail too frequently, please wait another 3 minutes and try again.</p>
-        {{end}}
     </form>
 </div>
-{{template "base/footer" .}}
+{{template "ng/base/footer" .}}
index a2a5ca9eceb6f61cb935be4a6b8d8cc44920b3b1..d17abde2ba9c1bc82590a95996a83fcfde8b3b61 100644 (file)
@@ -1,26 +1,25 @@
-{{template "base/head" .}}
-{{template "base/navbar" .}}
-<div id="body" class="container">
-    <form action="/user/reset_password?code={{.Code}}" method="post" class="form-horizontal card" id="login-card">
+{{template "ng/base/head" .}} 
+{{template "ng/base/header" .}}
+<div id="sign-wrapper">
+    <form class="form-align form panel sign-panel sign-form container panel-radius" id="sign-up-form" action="/user/reset_password?code={{.Code}}" method="post">
         {{.CsrfTokenHtml}}
-        <h3>Reset Your Pasword</h3>
-        {{template "base/alert" .}}
-        {{if .IsResetForm}}
-        <div class="form-group">
-            <label class="col-md-4 control-label">Password: </label>
-            <div class="col-md-6">
-                <input name="passwd" type="password" class="form-control" placeholder="Type your password" required="required">
-            </div>
+        <div class="panel-header">
+            <h2>{{.i18n.Tr "auth.reset_password"}}</h2>
         </div>
-        <hr/>
-        <div class="form-group">
-            <div class="col-md-offset-4 col-md-6">
-                <button type="submit" class="btn btn-lg btn-primary">Click here to reset your password</button>
+        <div class="panel-content">
+            {{template "ng/base/alert" .}}
+            {{if .IsResetForm}}
+            <div class="field">
+                <label class="req" for="password">{{.i18n.Tr "password"}}</label>
+                <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="password" name="password" type="password" value="{{.password}}" required/>
             </div>
+            <hr/>
+            <label></label>
+            <button class="btn btn-blue btn-large btn-radius">{{.i18n.Tr "auth.reset_password_helper"}}</button>
+            {{else}}
+            <p>{{.i18n.Tr "auth.invalid_code"}}</p>
+            {{end}}
         </div>
-        {{else}}
-        <p>Sorry, your confirmation code has expired or is not valid.</p>
-        {{end}}
     </form>
 </div>
-{{template "base/footer" .}}
+{{template "ng/base/footer" .}}
index bc5c0c0c86899b31fd4a2095a95267a57d771623..c2f6ef877af371010c031aa7ea8e90e77d5efe41 100644 (file)
@@ -7,30 +7,30 @@
         </div>
         <div class="panel-content">
             {{template "ng/base/alert" .}}
-            <p class="field">
+            <div class="field">
                 <label class="req" for="username">{{.i18n.Tr "home.uname_holder"}}</label>
                 <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="username" name="uname" type="text" value="{{.uname}}" required/>
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <label class="req" for="password">{{.i18n.Tr "password"}}</label>
                 <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="password" name="password" type="password" required/>
-            </p>
+            </div>
             {{if not .IsSocialLogin}}
-            <p class="field">
+            <div class="field">
                 <span class="form-label"></span>
                 <input class="ipt-chk" id="remember" name="remember" type="checkbox"/>&nbsp;&nbsp;&nbsp;&nbsp;<strong>{{.i18n.Tr "auth.remember_me"}}</strong>
-            </p>
+            </div>
             {{end}}
-            <p class="field">
+            <div class="field">
                 <span class="form-label"></span>
                 <button class="btn btn-green btn-large btn-radius">{{.i18n.Tr "sign_in"}}</button>&nbsp;&nbsp;&nbsp;&nbsp;
                 {{if not .IsSocialLogin}}<a href="/user/forget_password">{{.i18n.Tr "auth.forget_password"}}</a>{{end}}
-            </p>
+            </div>
             {{if not .IsSocialLogin}}
-            <p class="field">
-                <span class="form-label"></span>
+            <div class="field">
+                <label></label>
                 <a href="/user/sign_up">{{.i18n.Tr "auth.sign_up_now" | Str2html}}</a>
-            </p>
+            </div>
             {{if .OauthEnabled}}
             <hr/>
             <div id="sign-social" class="text-center social-buttons">
index 8d4a572ef58c1bcd7d79e7dae3b09c58519b22b4..b4736a07ce694225439e894cc3cfbc91b94b2299 100644 (file)
                {{if .DisableRegistration}}
                <p>{{.i18n.Tr "auth.disable_register_prompt"}}</p>
                {{else}}
-            <p class="field">
+            <div class="field">
                 <label class="req" for="username">{{.i18n.Tr "username"}}</label>
                 <input class="ipt ipt-large ipt-radius {{if .Err_UserName}}ipt-error{{end}}" id="username" name="uname" type="text" value="{{.uname}}" required/>
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <label class="req" for="email">{{.i18n.Tr "email"}}</label>
                 <input class="ipt ipt-large ipt-radius {{if .Err_Email}}ipt-error{{end}}" id="email" name="email" type="email"  value="{{.email}}"required/>
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <label class="req" for="password">{{.i18n.Tr "password"}}</label>
                 <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="password" name="password" type="password" value="{{.password}}" required/>
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <label class="req" for="re-type">{{.i18n.Tr "re_type"}}</label>
                 <input class="ipt ipt-large ipt-radius {{if .Err_Password}}ipt-error{{end}}" id="re-type" name="retype" type="password" required/>
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <label></label>
                 {{.Captcha.CreateHtml}}
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <label class="req" for="captcha">{{.i18n.Tr "captcha"}}</label>
                 <input class="ipt ipt-large ipt-radius {{if .Err_Captcha}}ipt-error{{end}}" id="captcha" name="captcha" type="text" required/>
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <span class="form-label"></span>
                 <button class="btn btn-blue btn-large btn-radius">{{.i18n.Tr "auth.create_new_account"}}</button>
-            </p>
-            <p class="field">
+            </div>
+            <div class="field">
                 <span class="form-label"></span>
                 <a href="/user/login">{{if .IsSocialLogin}}{{.i18n.Tr "auth.social_register_hepler_msg"}}{{else}}{{.i18n.Tr "auth.register_hepler_msg"}}{{end}}</a>
-            </p>
+            </div>
                {{end}}
         </div>
     </form>