treat register like sign in, even oauth

This commit is contained in:
AJ ONeal 2018-10-07 03:47:44 +00:00
parent 378af8ea88
commit 2bdc146bcf
3 changed files with 59 additions and 56 deletions

View File

@ -76,6 +76,7 @@ type RegisterForm struct {
Email string `binding:"Required;Email;MaxSize(254)"` Email string `binding:"Required;Email;MaxSize(254)"`
Password string `binding:"Required;MaxSize(255)"` Password string `binding:"Required;MaxSize(255)"`
Retype string Retype string
Remember bool
GRecaptchaResponse string `form:"g-recaptcha-response"` GRecaptchaResponse string `form:"g-recaptcha-response"`
} }

View File

@ -497,6 +497,37 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR
return setting.AppSubURL + "/" return setting.AppSubURL + "/"
} }
func handleRegister(ctx *context.Context, u *models.User, remember bool, obeyRedirect bool) {
// Auto-set admin for the only user.
if models.CountUsers() == 1 {
u.IsAdmin = true
u.IsActive = true
u.SetLastLogin()
if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
}
// Send confirmation email
if setting.Service.RegisterEmailConfirm && u.ID > 1 {
models.SendActivateAccountMail(ctx.Context, u)
ctx.Data["IsSendRegisterMail"] = true
ctx.Data["Email"] = u.Email
ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language())
ctx.HTML(200, TplActivate)
if err := ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
log.Error(4, "Set cache(MailResendLimit) fail: %v", err)
}
return
}
ctx.Flash.Success(ctx.Tr("auth.sign_up_successful"))
// Complete the signin without logging in again
handleSignInFull(ctx, u, remember, true)
}
// SignInOAuth handles the OAuth2 login buttons // SignInOAuth handles the OAuth2 login buttons
func SignInOAuth(ctx *context.Context) { func SignInOAuth(ctx *context.Context) {
provider := ctx.Params(":provider") provider := ctx.Params(":provider")
@ -800,14 +831,20 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au
ctx.ServerError("CreateUser", err) ctx.ServerError("CreateUser", err)
} }
// TODO LoginName should come from form.UserName... shouldn't it?
u := &models.User{ u := &models.User{
Name: form.UserName, Name: form.UserName,
Email: form.Email, Email: form.Email,
Passwd: form.Password, Passwd: form.Password,
IsActive: !setting.Service.RegisterEmailConfirm, IsActive: !setting.Service.RegisterEmailConfirm,
LoginType: models.LoginOAuth2, }
LoginSource: loginSource.ID,
LoginName: gothUser.(goth.User).UserID, // This will link the account in such a way that it cannot be removed
// TODO why is this different from normal linking?
if setting.Service.AllowOnlyExternalRegistration {
u.LoginType = models.LoginOAuth2
u.LoginSource = loginSource.ID
u.LoginName = gothUser.(goth.User).UserID
} }
if err := models.CreateUser(u); err != nil { if err := models.CreateUser(u); err != nil {
@ -831,32 +868,16 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au
} }
log.Trace("Account created: %s", u.Name) log.Trace("Account created: %s", u.Name)
// Auto-set admin for the only user. // This will link the account in such a way that it can be removed
if models.CountUsers() == 1 { if !setting.Service.AllowOnlyExternalRegistration {
u.IsAdmin = true err = models.LinkAccountToUser(u, gothUser.(goth.User))
u.IsActive = true if err != nil {
u.SetLastLogin() ctx.ServerError("UserLinkAccount", err)
if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil {
ctx.ServerError("UpdateUser", err)
return return
} }
} }
// Send confirmation email handleRegister(ctx, u, form.Remember, true)
if setting.Service.RegisterEmailConfirm && u.ID > 1 {
models.SendActivateAccountMail(ctx.Context, u)
ctx.Data["IsSendRegisterMail"] = true
ctx.Data["Email"] = u.Email
ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language())
ctx.HTML(200, TplActivate)
if err := ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
log.Error(4, "Set cache(MailResendLimit) fail: %v", err)
}
return
}
ctx.Redirect(setting.AppSubURL + "/user/login")
} }
// SignOut sign out from login status // SignOut sign out from login status
@ -964,33 +985,7 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo
} }
log.Trace("Account created: %s", u.Name) log.Trace("Account created: %s", u.Name)
// Auto-set admin for the only user. handleRegister(ctx, u, form.Remember, true)
if models.CountUsers() == 1 {
u.IsAdmin = true
u.IsActive = true
u.SetLastLogin()
if err := models.UpdateUserCols(u, "is_admin", "is_active", "last_login_unix"); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
}
// Send confirmation email, no need for social account.
if setting.Service.RegisterEmailConfirm && u.ID > 1 {
models.SendActivateAccountMail(ctx.Context, u)
ctx.Data["IsSendRegisterMail"] = true
ctx.Data["Email"] = u.Email
ctx.Data["ActiveCodeLives"] = base.MinutesToFriendly(setting.Service.ActiveCodeLives, ctx.Locale.Language())
ctx.HTML(200, TplActivate)
if err := ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil {
log.Error(4, "Set cache(MailResendLimit) fail: %v", err)
}
return
}
ctx.Flash.Success(ctx.Tr("auth.sign_up_successful"))
handleSignInFull(ctx, u, false, true)
} }
// Activate render activate user page // Activate render activate user page

View File

@ -45,6 +45,13 @@
</div> </div>
{{end}} {{end}}
<div class="inline field">
<label></label>
<div class="ui checkbox">
<label>{{.i18n.Tr "auth.remember_me"}}</label>
<input name="remember" type="checkbox">
</div>
</div>
<div class="inline field"> <div class="inline field">
<label></label> <label></label>
<button class="ui green button">{{.i18n.Tr "auth.create_new_account"}}</button> <button class="ui green button">{{.i18n.Tr "auth.create_new_account"}}</button>