Browse Source

Merge branch 'V20210731' into fix-170

pull/173/head
avadesian 3 years ago
parent
commit
4f95506034
2 changed files with 124 additions and 1 deletions
  1. +8
    -1
      routers/routes/routes.go
  2. +116
    -0
      routers/secure/user.go

+ 8
- 1
routers/routes/routes.go View File

@@ -6,6 +6,7 @@ package routes


import ( import (
"bytes" "bytes"
"code.gitea.io/gitea/routers/secure"
"encoding/gob" "encoding/gob"
"net/http" "net/http"
"path" "path"
@@ -21,6 +22,7 @@ import (
"code.gitea.io/gitea/modules/options" "code.gitea.io/gitea/modules/options"
"code.gitea.io/gitea/modules/public" "code.gitea.io/gitea/modules/public"
"code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/templates" "code.gitea.io/gitea/modules/templates"
"code.gitea.io/gitea/modules/validation" "code.gitea.io/gitea/modules/validation"
"code.gitea.io/gitea/routers" "code.gitea.io/gitea/routers"
@@ -265,7 +267,7 @@ func RegisterRoutes(m *macaron.Macaron) {
ignSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: setting.Service.RequireSignInView}) ignSignIn := context.Toggle(&context.ToggleOptions{SignInRequired: setting.Service.RequireSignInView})
ignSignInAndCsrf := context.Toggle(&context.ToggleOptions{DisableCSRF: true}) ignSignInAndCsrf := context.Toggle(&context.ToggleOptions{DisableCSRF: true})
reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true}) reqSignOut := context.Toggle(&context.ToggleOptions{SignOutRequired: true})
reqBasicAuth := context.Toggle(&context.ToggleOptions{BasicAuthRequired: true})
reqBasicAuth := context.Toggle(&context.ToggleOptions{BasicAuthRequired: true, DisableCSRF: true})


bindIgnErr := binding.BindIgnErr bindIgnErr := binding.BindIgnErr
validation.AddBindingRules() validation.AddBindingRules()
@@ -1125,6 +1127,11 @@ func RegisterRoutes(m *macaron.Macaron) {
apiv1.RegisterRoutes(m) apiv1.RegisterRoutes(m)
}, handlers...) }, handlers...)


//secure api,
m.Group("/secure", func() {
m.Post("/user", binding.Bind(structs.CreateUserOption{}), secure.CreateUser)
}, reqBasicAuth)

m.Group("/api/internal", func() { m.Group("/api/internal", func() {
// package name internal is ideal but Golang is not allowed, so we use private as package name. // package name internal is ideal but Golang is not allowed, so we use private as package name.
private.RegisterRoutes(m) private.RegisterRoutes(m)


+ 116
- 0
routers/secure/user.go View File

@@ -0,0 +1,116 @@
// Copyright 2015 The Gogs Authors. All rights reserved.
// Copyright 2019 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.

package secure

import (
"net/http"

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/password"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/services/mailer"
)

func parseLoginSource(ctx *context.Context, u *models.User, sourceID int64, loginName string) {
if sourceID == 0 {
return
}

source, err := models.GetLoginSourceByID(sourceID)
if err != nil {
if models.IsErrLoginSourceNotExist(err) {
ctx.Error(http.StatusUnprocessableEntity, "", err.Error())
} else {
ctx.Error(http.StatusInternalServerError, "GetLoginSourceByID", err.Error())
}
return
}

u.LoginType = source.Type
u.LoginSource = source.ID
u.LoginName = loginName
}

// CreateUser create a user
func CreateUser(ctx *context.Context, form api.CreateUserOption) {
// swagger:operation POST /admin/users admin adminCreateUser
// ---
// summary: Create a user
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/CreateUserOption"
// responses:
// "201":
// "$ref": "#/responses/User"
// "400":
// "$ref": "#/responses/error"
// "403":
// "$ref": "#/responses/forbidden"
// "422":
// "$ref": "#/responses/validationError"

u := &models.User{
Name: form.Username,
FullName: form.FullName,
Email: form.Email,
Passwd: form.Password,
MustChangePassword: false,
IsActive: true,
LoginType: models.LoginPlain,
}
if form.MustChangePassword != nil {
u.MustChangePassword = *form.MustChangePassword
}

parseLoginSource(ctx, u, form.SourceID, form.LoginName)
if ctx.Written() {
return
}
if !password.IsComplexEnough(form.Password) {
log.Error("CreateUser failed: PasswordComplexity", ctx.Data["MsgID"])
ctx.JSON(http.StatusBadRequest, map[string]string{
"error_msg": "PasswordComplexity",
})
return
}
if err := models.CreateUser(u); err != nil {
if models.IsErrUserAlreadyExist(err) ||
models.IsErrEmailAlreadyUsed(err) ||
models.IsErrNameReserved(err) ||
models.IsErrNameCharsNotAllowed(err) ||
models.IsErrNamePatternNotAllowed(err) {
log.Error("CreateUser failed:%v",err.Error(), ctx.Data["MsgID"])
ctx.JSON(http.StatusUnprocessableEntity, map[string]string{
"error_msg": err.Error(),
})
} else {
log.Error("CreateUser failed:%v",err.Error(), ctx.Data["MsgID"])
ctx.JSON(http.StatusInternalServerError, map[string]string{
"error_msg": err.Error(),
})
}
return
}
log.Trace("Account created (%s): %s", ctx.User.Name, u.Name, ctx.Data["MsgID"])

// Send email notification.
if form.SendNotify {
mailer.SendRegisterNotifyMail(ctx.Locale, u)
}
ctx.JSON(http.StatusCreated, convert.ToUser(u, ctx.IsSigned, ctx.User.IsAdmin))
}




Loading…
Cancel
Save