99 lines
3.4 KiB
Go
99 lines
3.4 KiB
Go
// Copyright 2022 E99p1ant. All rights reserved.
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package auth
|
|
|
|
import (
|
|
"github.com/flamego/recaptcha"
|
|
"github.com/pkg/errors"
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/tamakyi/TamaBox/internal/captcha"
|
|
"github.com/tamakyi/TamaBox/internal/conf"
|
|
"github.com/tamakyi/TamaBox/internal/context"
|
|
"github.com/tamakyi/TamaBox/internal/db"
|
|
"github.com/tamakyi/TamaBox/internal/form"
|
|
"github.com/tamakyi/TamaBox/internal/i18n"
|
|
"github.com/tamakyi/TamaBox/internal/shared"
|
|
)
|
|
|
|
func Register(ctx context.Context) {
|
|
ctx.Success("auth/register")
|
|
}
|
|
|
|
func RegisterAction(ctx context.Context, f form.Register, recaptcha recaptcha.RecaptchaV3) {
|
|
if ctx.HasError() {
|
|
ctx.Success("auth/register")
|
|
return
|
|
}
|
|
|
|
// Check captcha code (unified: recaptcha, turnstile, or math).
|
|
ok, err := captcha.Verify(f.Recaptcha, shared.ResolveClientIP(ctx.Request().Request), ctx.Session, recaptcha, ctx.Lang())
|
|
if err != nil {
|
|
logrus.WithContext(ctx.Request().Context()).WithError(err).Error("Failed to check captcha")
|
|
ctx.SetErrorFlash(err.Error())
|
|
ctx.Redirect("/register")
|
|
return
|
|
}
|
|
if !ok {
|
|
ctx.SetErrorFlash(i18n.T(ctx.Lang(), "captcha.error"))
|
|
ctx.Redirect("/register")
|
|
return
|
|
}
|
|
|
|
if err := db.Users.Create(ctx.Request().Context(), db.CreateUserOptions{
|
|
Name: f.Name,
|
|
Password: f.Password,
|
|
Email: f.Email,
|
|
Avatar: conf.Upload.DefaultAvatarURL,
|
|
Domain: f.Domain,
|
|
Background: conf.Upload.DefaultBackground,
|
|
Intro: "问你想问的",
|
|
Qrcodebackcolor: "#FDF8F0",
|
|
Qrcodecolor: "#C45500",
|
|
Usernamecolor: "#000000",
|
|
Introcolor: "#000000",
|
|
Dotscale: "0.35",
|
|
BackgroundImage: conf.Upload.DefaultBackgroundImageURL,
|
|
Backgroundimagealpha: "0.8",
|
|
Qrcodepdpcolor: "#C45500",
|
|
Acfunlink: "none",
|
|
Bililink: "none",
|
|
Weibolink: "none",
|
|
Bloglink: "box.shiroko.one",
|
|
Xiaohongshulink: "none",
|
|
Language: i18n.Resolve(f.Language), // 注册时选择的界面语言;留空回退站点默认
|
|
}); err != nil {
|
|
switch {
|
|
case errors.Is(err, db.ErrDuplicateEmail):
|
|
ctx.SetError(errors.New(i18n.T(ctx.Lang(), "auth.errDuplicateEmail")))
|
|
case errors.Is(err, db.ErrDuplicateDomain):
|
|
ctx.SetError(errors.New(i18n.T(ctx.Lang(), "auth.errDuplicateDomain")))
|
|
// 已停用账号仍保留身份占位(占着邮箱/域名唯一索引),不再静默通过或抛 500,
|
|
// 而是明确告知用户该身份已被占用、可由站长核验后恢复。
|
|
case errors.Is(err, db.ErrDeactivatedEmail):
|
|
ctx.SetError(errors.New(i18n.T(ctx.Lang(), "auth.errDeactivatedEmail")))
|
|
case errors.Is(err, db.ErrDeactivatedDomain):
|
|
ctx.SetError(errors.New(i18n.T(ctx.Lang(), "auth.errDeactivatedDomain")))
|
|
case errors.Is(err, db.ErrBadCredential):
|
|
ctx.SetError(errors.New(i18n.T(ctx.Lang(), "auth.errBadCredential")))
|
|
|
|
default:
|
|
logrus.WithContext(ctx.Request().Context()).WithError(err).Error("Failed to create new user")
|
|
ctx.SetInternalError()
|
|
}
|
|
|
|
ctx.Success("auth/register")
|
|
return
|
|
}
|
|
|
|
// 成功提示跟随用户注册时选择的语言
|
|
lang := "zh-CN"
|
|
if l, ok := ctx.Data["Lang"].(string); ok && l != "" {
|
|
lang = l
|
|
}
|
|
ctx.SetSuccessFlash(i18n.T(lang, "auth.register.success"))
|
|
ctx.Redirect("/login")
|
|
}
|