2017-03-17 15:16:08 +01:00
|
|
|
// Copyright 2017 The Gitea Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT-style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
2022-01-02 14:12:35 +01:00
|
|
|
package auth
|
2017-03-17 15:16:08 +01:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2021-04-05 17:30:52 +02:00
|
|
|
"net/http"
|
2017-03-17 15:16:08 +01:00
|
|
|
"net/url"
|
|
|
|
|
2021-11-17 10:58:31 +01:00
|
|
|
user_model "code.gitea.io/gitea/models/user"
|
2017-03-17 15:16:08 +01:00
|
|
|
"code.gitea.io/gitea/modules/auth/openid"
|
|
|
|
"code.gitea.io/gitea/modules/base"
|
|
|
|
"code.gitea.io/gitea/modules/context"
|
2020-10-03 05:37:53 +02:00
|
|
|
"code.gitea.io/gitea/modules/hcaptcha"
|
2017-03-17 15:16:08 +01:00
|
|
|
"code.gitea.io/gitea/modules/log"
|
2022-08-10 15:20:10 +02:00
|
|
|
"code.gitea.io/gitea/modules/mcaptcha"
|
2018-07-05 06:13:05 +02:00
|
|
|
"code.gitea.io/gitea/modules/recaptcha"
|
2021-12-20 15:12:26 +01:00
|
|
|
"code.gitea.io/gitea/modules/session"
|
2017-03-17 15:16:08 +01:00
|
|
|
"code.gitea.io/gitea/modules/setting"
|
2021-05-10 08:45:17 +02:00
|
|
|
"code.gitea.io/gitea/modules/util"
|
2021-01-26 16:36:53 +01:00
|
|
|
"code.gitea.io/gitea/modules/web"
|
2021-03-07 09:12:43 +01:00
|
|
|
"code.gitea.io/gitea/modules/web/middleware"
|
2021-07-24 12:16:34 +02:00
|
|
|
"code.gitea.io/gitea/services/auth"
|
2021-04-06 21:44:05 +02:00
|
|
|
"code.gitea.io/gitea/services/forms"
|
2017-03-17 15:16:08 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
tplSignInOpenID base.TplName = "user/auth/signin_openid"
|
|
|
|
tplConnectOID base.TplName = "user/auth/signup_openid_connect"
|
|
|
|
tplSignUpOID base.TplName = "user/auth/signup_openid_register"
|
|
|
|
)
|
|
|
|
|
|
|
|
// SignInOpenID render sign in page
|
|
|
|
func SignInOpenID(ctx *context.Context) {
|
|
|
|
ctx.Data["Title"] = ctx.Tr("sign_in")
|
|
|
|
|
2021-08-11 02:31:13 +02:00
|
|
|
if ctx.FormString("openid.return_to") != "" {
|
2017-03-17 15:16:08 +01:00
|
|
|
signInOpenIDVerify(ctx)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check auto-login.
|
|
|
|
isSucceed, err := AutoSignIn(ctx)
|
|
|
|
if err != nil {
|
2018-01-10 22:34:17 +01:00
|
|
|
ctx.ServerError("AutoSignIn", err)
|
2017-03-17 15:16:08 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-08-11 02:31:13 +02:00
|
|
|
redirectTo := ctx.FormString("redirect_to")
|
2017-03-17 15:16:08 +01:00
|
|
|
if len(redirectTo) > 0 {
|
2021-03-07 09:12:43 +01:00
|
|
|
middleware.SetRedirectToCookie(ctx.Resp, redirectTo)
|
2017-03-17 15:16:08 +01:00
|
|
|
} else {
|
2019-03-21 03:06:16 +01:00
|
|
|
redirectTo = ctx.GetCookie("redirect_to")
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if isSucceed {
|
2021-03-07 09:12:43 +01:00
|
|
|
middleware.DeleteRedirectToCookie(ctx.Resp)
|
2018-03-15 22:13:34 +01:00
|
|
|
ctx.RedirectToFirst(redirectTo)
|
2017-03-17 15:16:08 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.Data["PageIsSignIn"] = true
|
|
|
|
ctx.Data["PageIsLoginOpenID"] = true
|
2021-04-05 17:30:52 +02:00
|
|
|
ctx.HTML(http.StatusOK, tplSignInOpenID)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Check if the given OpenID URI is allowed by blacklist/whitelist
|
|
|
|
func allowedOpenIDURI(uri string) (err error) {
|
|
|
|
// In case a Whitelist is present, URI must be in it
|
|
|
|
// in order to be accepted
|
2017-03-29 12:57:43 +02:00
|
|
|
if len(setting.Service.OpenIDWhitelist) != 0 {
|
|
|
|
for _, pat := range setting.Service.OpenIDWhitelist {
|
2017-03-17 15:16:08 +01:00
|
|
|
if pat.MatchString(uri) {
|
|
|
|
return nil // pass
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// must match one of this or be refused
|
|
|
|
return fmt.Errorf("URI not allowed by whitelist")
|
|
|
|
}
|
|
|
|
|
|
|
|
// A blacklist match expliclty forbids
|
2017-03-29 12:57:43 +02:00
|
|
|
for _, pat := range setting.Service.OpenIDBlacklist {
|
2017-03-17 15:16:08 +01:00
|
|
|
if pat.MatchString(uri) {
|
|
|
|
return fmt.Errorf("URI forbidden by blacklist")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// SignInOpenIDPost response for openid sign in request
|
2021-01-26 16:36:53 +01:00
|
|
|
func SignInOpenIDPost(ctx *context.Context) {
|
2021-04-06 21:44:05 +02:00
|
|
|
form := web.GetForm(ctx).(*forms.SignInOpenIDForm)
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.Data["Title"] = ctx.Tr("sign_in")
|
|
|
|
ctx.Data["PageIsSignIn"] = true
|
|
|
|
ctx.Data["PageIsLoginOpenID"] = true
|
|
|
|
|
|
|
|
if ctx.HasError() {
|
2021-04-05 17:30:52 +02:00
|
|
|
ctx.HTML(http.StatusOK, tplSignInOpenID)
|
2017-03-17 15:16:08 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
id, err := openid.Normalize(form.Openid)
|
|
|
|
if err != nil {
|
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &form)
|
2017-03-21 01:55:00 +01:00
|
|
|
return
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
form.Openid = id
|
|
|
|
|
|
|
|
log.Trace("OpenID uri: " + id)
|
|
|
|
|
2017-03-21 01:55:00 +01:00
|
|
|
err = allowedOpenIDURI(id)
|
|
|
|
if err != nil {
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &form)
|
2017-03-21 01:55:00 +01:00
|
|
|
return
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
redirectTo := setting.AppURL + "user/login/openid"
|
|
|
|
url, err := openid.RedirectURL(id, redirectTo, setting.AppURL)
|
2017-03-21 01:55:00 +01:00
|
|
|
if err != nil {
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Error("Error in OpenID redirect URL: %s, %v", redirectTo, err.Error())
|
2019-01-12 20:24:47 +01:00
|
|
|
ctx.RenderWithErr(fmt.Sprintf("Unable to find OpenID provider in %s", redirectTo), tplSignInOpenID, &form)
|
2017-03-21 01:55:00 +01:00
|
|
|
return
|
|
|
|
}
|
2017-03-17 15:16:08 +01:00
|
|
|
|
|
|
|
// Request optional nickname and email info
|
|
|
|
// NOTE: change to `openid.sreg.required` to require it
|
|
|
|
url += "&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1"
|
|
|
|
url += "&openid.sreg.optional=nickname%2Cemail"
|
|
|
|
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Trace("Form-passed openid-remember: %t", form.Remember)
|
2020-05-17 14:43:29 +02:00
|
|
|
|
|
|
|
if err := ctx.Session.Set("openid_signin_remember", form.Remember); err != nil {
|
|
|
|
log.Error("SignInOpenIDPost: Could not set openid_signin_remember in session: %v", err)
|
|
|
|
}
|
|
|
|
if err := ctx.Session.Release(); err != nil {
|
|
|
|
log.Error("SignInOpenIDPost: Unable to save changes to the session: %v", err)
|
2019-06-12 21:41:28 +02:00
|
|
|
}
|
2017-03-17 15:16:08 +01:00
|
|
|
|
|
|
|
ctx.Redirect(url)
|
|
|
|
}
|
|
|
|
|
|
|
|
// signInOpenIDVerify handles response from OpenID provider
|
|
|
|
func signInOpenIDVerify(ctx *context.Context) {
|
2021-12-14 09:37:11 +01:00
|
|
|
log.Trace("Incoming call to: %s", ctx.Req.URL.String())
|
2017-03-17 15:16:08 +01:00
|
|
|
|
2021-01-26 16:36:53 +01:00
|
|
|
fullURL := setting.AppURL + ctx.Req.URL.String()[1:]
|
2021-12-14 09:37:11 +01:00
|
|
|
log.Trace("Full URL: %s", fullURL)
|
2017-03-17 15:16:08 +01:00
|
|
|
|
2022-01-20 18:46:10 +01:00
|
|
|
id, err := openid.Verify(fullURL)
|
2017-03-17 15:16:08 +01:00
|
|
|
if err != nil {
|
2021-04-06 21:44:05 +02:00
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &forms.SignInOpenIDForm{
|
2017-03-17 15:16:08 +01:00
|
|
|
Openid: id,
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-12-14 09:37:11 +01:00
|
|
|
log.Trace("Verified ID: %s", id)
|
2017-03-17 15:16:08 +01:00
|
|
|
|
|
|
|
/* Now we should seek for the user and log him in, or prompt
|
|
|
|
* to register if not found */
|
|
|
|
|
2021-11-24 10:49:20 +01:00
|
|
|
u, err := user_model.GetUserByOpenID(id)
|
2017-03-17 15:16:08 +01:00
|
|
|
if err != nil {
|
2021-11-24 10:49:20 +01:00
|
|
|
if !user_model.IsErrUserNotExist(err) {
|
2021-04-06 21:44:05 +02:00
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &forms.SignInOpenIDForm{
|
2017-03-17 15:16:08 +01:00
|
|
|
Openid: id,
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
2019-06-12 21:41:28 +02:00
|
|
|
log.Error("signInOpenIDVerify: %v", err)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
if u != nil {
|
|
|
|
log.Trace("User exists, logging in")
|
|
|
|
remember, _ := ctx.Session.Get("openid_signin_remember").(bool)
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Trace("Session stored openid-remember: %t", remember)
|
2017-03-17 15:16:08 +01:00
|
|
|
handleSignIn(ctx, u, remember)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-12-14 09:37:11 +01:00
|
|
|
log.Trace("User with openid: %s does not exist, should connect or register", id)
|
2017-03-17 15:16:08 +01:00
|
|
|
|
|
|
|
parsedURL, err := url.Parse(fullURL)
|
|
|
|
if err != nil {
|
2021-04-06 21:44:05 +02:00
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &forms.SignInOpenIDForm{
|
2017-03-17 15:16:08 +01:00
|
|
|
Openid: id,
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
values, err := url.ParseQuery(parsedURL.RawQuery)
|
|
|
|
if err != nil {
|
2021-04-06 21:44:05 +02:00
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &forms.SignInOpenIDForm{
|
2017-03-17 15:16:08 +01:00
|
|
|
Openid: id,
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
email := values.Get("openid.sreg.email")
|
|
|
|
nickname := values.Get("openid.sreg.nickname")
|
|
|
|
|
2021-12-14 09:37:11 +01:00
|
|
|
log.Trace("User has email=%s and nickname=%s", email, nickname)
|
2017-03-17 15:16:08 +01:00
|
|
|
|
|
|
|
if email != "" {
|
2021-11-24 10:49:20 +01:00
|
|
|
u, err = user_model.GetUserByEmail(email)
|
2017-03-17 15:16:08 +01:00
|
|
|
if err != nil {
|
2021-11-24 10:49:20 +01:00
|
|
|
if !user_model.IsErrUserNotExist(err) {
|
2021-04-06 21:44:05 +02:00
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &forms.SignInOpenIDForm{
|
2017-03-17 15:16:08 +01:00
|
|
|
Openid: id,
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
2019-06-12 21:41:28 +02:00
|
|
|
log.Error("signInOpenIDVerify: %v", err)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
if u != nil {
|
2021-12-14 09:37:11 +01:00
|
|
|
log.Trace("Local user %s has OpenID provided email %s", u.LowerName, email)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if u == nil && nickname != "" {
|
2022-05-20 16:08:52 +02:00
|
|
|
u, _ = user_model.GetUserByName(ctx, nickname)
|
2017-03-17 15:16:08 +01:00
|
|
|
if err != nil {
|
2021-11-24 10:49:20 +01:00
|
|
|
if !user_model.IsErrUserNotExist(err) {
|
2021-04-06 21:44:05 +02:00
|
|
|
ctx.RenderWithErr(err.Error(), tplSignInOpenID, &forms.SignInOpenIDForm{
|
2017-03-17 15:16:08 +01:00
|
|
|
Openid: id,
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if u != nil {
|
2021-12-14 09:37:11 +01:00
|
|
|
log.Trace("Local user %s has OpenID provided nickname %s", u.LowerName, nickname)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-12-20 15:12:26 +01:00
|
|
|
if _, err := session.RegenerateSession(ctx.Resp, ctx.Req); err != nil {
|
|
|
|
ctx.ServerError("RegenerateSession", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2020-05-17 14:43:29 +02:00
|
|
|
if err := ctx.Session.Set("openid_verified_uri", id); err != nil {
|
|
|
|
log.Error("signInOpenIDVerify: Could not set openid_verified_uri in session: %v", err)
|
2019-06-12 21:41:28 +02:00
|
|
|
}
|
2020-05-17 14:43:29 +02:00
|
|
|
if err := ctx.Session.Set("openid_determined_email", email); err != nil {
|
|
|
|
log.Error("signInOpenIDVerify: Could not set openid_determined_email in session: %v", err)
|
2019-06-12 21:41:28 +02:00
|
|
|
}
|
2017-03-17 15:16:08 +01:00
|
|
|
|
|
|
|
if u != nil {
|
|
|
|
nickname = u.LowerName
|
|
|
|
}
|
|
|
|
|
2020-05-17 14:43:29 +02:00
|
|
|
if err := ctx.Session.Set("openid_determined_username", nickname); err != nil {
|
|
|
|
log.Error("signInOpenIDVerify: Could not set openid_determined_username in session: %v", err)
|
|
|
|
}
|
|
|
|
if err := ctx.Session.Release(); err != nil {
|
|
|
|
log.Error("signInOpenIDVerify: Unable to save changes to the session: %v", err)
|
2019-06-12 21:41:28 +02:00
|
|
|
}
|
2017-03-17 15:16:08 +01:00
|
|
|
|
2021-05-09 16:13:35 +02:00
|
|
|
if u != nil || !setting.Service.EnableOpenIDSignUp || setting.Service.AllowOnlyInternalRegistration {
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.Redirect(setting.AppSubURL + "/user/openid/connect")
|
|
|
|
} else {
|
|
|
|
ctx.Redirect(setting.AppSubURL + "/user/openid/register")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ConnectOpenID shows a form to connect an OpenID URI to an existing account
|
|
|
|
func ConnectOpenID(ctx *context.Context) {
|
|
|
|
oid, _ := ctx.Session.Get("openid_verified_uri").(string)
|
|
|
|
if oid == "" {
|
|
|
|
ctx.Redirect(setting.AppSubURL + "/user/login/openid")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx.Data["Title"] = "OpenID connect"
|
|
|
|
ctx.Data["PageIsSignIn"] = true
|
|
|
|
ctx.Data["PageIsOpenIDConnect"] = true
|
2017-03-29 12:57:43 +02:00
|
|
|
ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp
|
2021-05-09 16:13:35 +02:00
|
|
|
ctx.Data["AllowOnlyInternalRegistration"] = setting.Service.AllowOnlyInternalRegistration
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.Data["OpenID"] = oid
|
|
|
|
userName, _ := ctx.Session.Get("openid_determined_username").(string)
|
|
|
|
if userName != "" {
|
|
|
|
ctx.Data["user_name"] = userName
|
|
|
|
}
|
2021-04-05 17:30:52 +02:00
|
|
|
ctx.HTML(http.StatusOK, tplConnectOID)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// ConnectOpenIDPost handles submission of a form to connect an OpenID URI to an existing account
|
2021-01-26 16:36:53 +01:00
|
|
|
func ConnectOpenIDPost(ctx *context.Context) {
|
2021-04-06 21:44:05 +02:00
|
|
|
form := web.GetForm(ctx).(*forms.ConnectOpenIDForm)
|
2017-03-17 15:16:08 +01:00
|
|
|
oid, _ := ctx.Session.Get("openid_verified_uri").(string)
|
|
|
|
if oid == "" {
|
|
|
|
ctx.Redirect(setting.AppSubURL + "/user/login/openid")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx.Data["Title"] = "OpenID connect"
|
|
|
|
ctx.Data["PageIsSignIn"] = true
|
|
|
|
ctx.Data["PageIsOpenIDConnect"] = true
|
2017-03-29 12:57:43 +02:00
|
|
|
ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.Data["OpenID"] = oid
|
|
|
|
|
2021-09-17 13:43:47 +02:00
|
|
|
u, _, err := auth.UserSignIn(form.UserName, form.Password)
|
2017-03-17 15:16:08 +01:00
|
|
|
if err != nil {
|
2021-11-24 10:49:20 +01:00
|
|
|
if user_model.IsErrUserNotExist(err) {
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.RenderWithErr(ctx.Tr("form.username_password_incorrect"), tplConnectOID, &form)
|
|
|
|
} else {
|
2018-01-10 22:34:17 +01:00
|
|
|
ctx.ServerError("ConnectOpenIDPost", err)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// add OpenID for the user
|
2021-11-17 10:58:31 +01:00
|
|
|
userOID := &user_model.UserOpenID{UID: u.ID, URI: oid}
|
2022-05-20 16:08:52 +02:00
|
|
|
if err = user_model.AddUserOpenID(ctx, userOID); err != nil {
|
2021-11-17 10:58:31 +01:00
|
|
|
if user_model.IsErrOpenIDAlreadyUsed(err) {
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.RenderWithErr(ctx.Tr("form.openid_been_used", oid), tplConnectOID, &form)
|
|
|
|
return
|
|
|
|
}
|
2018-01-10 22:34:17 +01:00
|
|
|
ctx.ServerError("AddUserOpenID", err)
|
2017-03-17 15:16:08 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.Flash.Success(ctx.Tr("settings.add_openid_success"))
|
|
|
|
|
|
|
|
remember, _ := ctx.Session.Get("openid_signin_remember").(bool)
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Trace("Session stored openid-remember: %t", remember)
|
2017-03-17 15:16:08 +01:00
|
|
|
handleSignIn(ctx, u, remember)
|
|
|
|
}
|
|
|
|
|
|
|
|
// RegisterOpenID shows a form to create a new user authenticated via an OpenID URI
|
|
|
|
func RegisterOpenID(ctx *context.Context) {
|
|
|
|
oid, _ := ctx.Session.Get("openid_verified_uri").(string)
|
|
|
|
if oid == "" {
|
|
|
|
ctx.Redirect(setting.AppSubURL + "/user/login/openid")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx.Data["Title"] = "OpenID signup"
|
|
|
|
ctx.Data["PageIsSignIn"] = true
|
|
|
|
ctx.Data["PageIsOpenIDRegister"] = true
|
2017-03-29 12:57:43 +02:00
|
|
|
ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp
|
2021-05-09 16:13:35 +02:00
|
|
|
ctx.Data["AllowOnlyInternalRegistration"] = setting.Service.AllowOnlyInternalRegistration
|
2017-03-17 17:40:39 +01:00
|
|
|
ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha
|
2021-01-27 15:56:54 +01:00
|
|
|
ctx.Data["Captcha"] = context.GetImageCaptcha()
|
2018-07-05 06:13:05 +02:00
|
|
|
ctx.Data["CaptchaType"] = setting.Service.CaptchaType
|
|
|
|
ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
|
2020-10-03 05:37:53 +02:00
|
|
|
ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey
|
2019-05-02 15:09:39 +02:00
|
|
|
ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
|
2022-08-10 15:20:10 +02:00
|
|
|
ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey
|
|
|
|
ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.Data["OpenID"] = oid
|
|
|
|
userName, _ := ctx.Session.Get("openid_determined_username").(string)
|
|
|
|
if userName != "" {
|
|
|
|
ctx.Data["user_name"] = userName
|
|
|
|
}
|
|
|
|
email, _ := ctx.Session.Get("openid_determined_email").(string)
|
|
|
|
if email != "" {
|
|
|
|
ctx.Data["email"] = email
|
|
|
|
}
|
2021-04-05 17:30:52 +02:00
|
|
|
ctx.HTML(http.StatusOK, tplSignUpOID)
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// RegisterOpenIDPost handles submission of a form to create a new user authenticated via an OpenID URI
|
2021-01-26 16:36:53 +01:00
|
|
|
func RegisterOpenIDPost(ctx *context.Context) {
|
2021-04-06 21:44:05 +02:00
|
|
|
form := web.GetForm(ctx).(*forms.SignUpOpenIDForm)
|
2017-03-17 15:16:08 +01:00
|
|
|
oid, _ := ctx.Session.Get("openid_verified_uri").(string)
|
|
|
|
if oid == "" {
|
|
|
|
ctx.Redirect(setting.AppSubURL + "/user/login/openid")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.Data["Title"] = "OpenID signup"
|
|
|
|
ctx.Data["PageIsSignIn"] = true
|
|
|
|
ctx.Data["PageIsOpenIDRegister"] = true
|
2017-03-29 12:57:43 +02:00
|
|
|
ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp
|
2017-03-17 17:40:39 +01:00
|
|
|
ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha
|
2019-05-02 15:09:39 +02:00
|
|
|
ctx.Data["RecaptchaURL"] = setting.Service.RecaptchaURL
|
2021-01-27 15:56:54 +01:00
|
|
|
ctx.Data["Captcha"] = context.GetImageCaptcha()
|
2018-07-05 06:13:05 +02:00
|
|
|
ctx.Data["CaptchaType"] = setting.Service.CaptchaType
|
|
|
|
ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey
|
2020-10-03 05:37:53 +02:00
|
|
|
ctx.Data["HcaptchaSitekey"] = setting.Service.HcaptchaSitekey
|
2022-08-10 15:20:10 +02:00
|
|
|
ctx.Data["McaptchaSitekey"] = setting.Service.McaptchaSitekey
|
|
|
|
ctx.Data["McaptchaURL"] = setting.Service.McaptchaURL
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.Data["OpenID"] = oid
|
|
|
|
|
2021-05-09 16:13:35 +02:00
|
|
|
if setting.Service.AllowOnlyInternalRegistration {
|
|
|
|
ctx.Error(http.StatusForbidden)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2019-07-06 21:48:02 +02:00
|
|
|
if setting.Service.EnableCaptcha {
|
|
|
|
var valid bool
|
2020-10-03 05:37:53 +02:00
|
|
|
var err error
|
2019-07-06 21:48:02 +02:00
|
|
|
switch setting.Service.CaptchaType {
|
|
|
|
case setting.ImageCaptcha:
|
2021-01-26 16:36:53 +01:00
|
|
|
valid = context.GetImageCaptcha().VerifyReq(ctx.Req)
|
2019-07-06 21:48:02 +02:00
|
|
|
case setting.ReCaptcha:
|
2020-10-03 05:37:53 +02:00
|
|
|
if err := ctx.Req.ParseForm(); err != nil {
|
2019-07-06 21:48:02 +02:00
|
|
|
ctx.ServerError("", err)
|
|
|
|
return
|
|
|
|
}
|
2021-05-31 08:18:11 +02:00
|
|
|
valid, err = recaptcha.Verify(ctx, form.GRecaptchaResponse)
|
2020-10-03 05:37:53 +02:00
|
|
|
case setting.HCaptcha:
|
|
|
|
if err := ctx.Req.ParseForm(); err != nil {
|
|
|
|
ctx.ServerError("", err)
|
|
|
|
return
|
|
|
|
}
|
2021-05-31 08:18:11 +02:00
|
|
|
valid, err = hcaptcha.Verify(ctx, form.HcaptchaResponse)
|
2022-08-10 15:20:10 +02:00
|
|
|
case setting.MCaptcha:
|
|
|
|
if err := ctx.Req.ParseForm(); err != nil {
|
|
|
|
ctx.ServerError("", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
valid, err = mcaptcha.Verify(ctx, form.McaptchaResponse)
|
2019-07-06 21:48:02 +02:00
|
|
|
default:
|
|
|
|
ctx.ServerError("Unknown Captcha Type", fmt.Errorf("Unknown Captcha Type: %s", setting.Service.CaptchaType))
|
2019-06-12 21:41:28 +02:00
|
|
|
return
|
|
|
|
}
|
2020-10-03 05:37:53 +02:00
|
|
|
if err != nil {
|
|
|
|
log.Debug("%s", err.Error())
|
|
|
|
}
|
2019-07-06 21:48:02 +02:00
|
|
|
|
2018-07-05 06:13:05 +02:00
|
|
|
if !valid {
|
|
|
|
ctx.Data["Err_Captcha"] = true
|
|
|
|
ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplSignUpOID, &form)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-05-28 17:45:54 +02:00
|
|
|
length := setting.MinPasswordLength
|
|
|
|
if length < 256 {
|
|
|
|
length = 256
|
2017-03-21 01:55:00 +01:00
|
|
|
}
|
2022-01-26 05:10:10 +01:00
|
|
|
password, err := util.CryptoRandomString(int64(length))
|
2017-03-17 15:16:08 +01:00
|
|
|
if err != nil {
|
|
|
|
ctx.RenderWithErr(err.Error(), tplSignUpOID, form)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-11-24 10:49:20 +01:00
|
|
|
u := &user_model.User{
|
2022-04-29 21:38:11 +02:00
|
|
|
Name: form.UserName,
|
|
|
|
Email: form.Email,
|
|
|
|
Passwd: password,
|
2017-03-17 15:16:08 +01:00
|
|
|
}
|
2022-04-29 21:38:11 +02:00
|
|
|
if !createUserInContext(ctx, tplSignUpOID, form, u, nil, nil, false) {
|
2021-04-14 14:02:12 +02:00
|
|
|
// error already handled
|
2017-03-17 15:16:08 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// add OpenID for the user
|
2021-11-17 10:58:31 +01:00
|
|
|
userOID := &user_model.UserOpenID{UID: u.ID, URI: oid}
|
2022-05-20 16:08:52 +02:00
|
|
|
if err = user_model.AddUserOpenID(ctx, userOID); err != nil {
|
2021-11-17 10:58:31 +01:00
|
|
|
if user_model.IsErrOpenIDAlreadyUsed(err) {
|
2017-03-17 15:16:08 +01:00
|
|
|
ctx.RenderWithErr(ctx.Tr("form.openid_been_used", oid), tplSignUpOID, &form)
|
|
|
|
return
|
|
|
|
}
|
2018-01-10 22:34:17 +01:00
|
|
|
ctx.ServerError("AddUserOpenID", err)
|
2017-03-17 15:16:08 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-04-14 14:02:12 +02:00
|
|
|
if !handleUserCreated(ctx, u, nil) {
|
|
|
|
// error already handled
|
2017-03-17 15:16:08 +01:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
remember, _ := ctx.Session.Get("openid_signin_remember").(bool)
|
2019-04-02 09:48:31 +02:00
|
|
|
log.Trace("Session stored openid-remember: %t", remember)
|
2017-03-17 15:16:08 +01:00
|
|
|
handleSignIn(ctx, u, remember)
|
|
|
|
}
|