mirror of
https://github.com/AlistGo/alist.git
synced 2025-11-25 19:37:41 +08:00
Compare commits
1 Commits
v3.47.1
...
fix/docker
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dbf26cd222 |
@@ -11,7 +11,7 @@ type Addition struct {
|
||||
RefreshToken string `json:"refresh_token" required:"true"`
|
||||
OrderBy string `json:"order_by" type:"select" options:"name,size,updated_at,created_at"`
|
||||
OrderDirection string `json:"order_direction" type:"select" options:"ASC,DESC"`
|
||||
OauthTokenURL string `json:"oauth_token_url" default:"https://api.alistgo.com/alist/ali_open/token"`
|
||||
OauthTokenURL string `json:"oauth_token_url" default:"https://api.nn.ci/alist/ali_open/token"`
|
||||
ClientID string `json:"client_id" required:"false" help:"Keep it empty if you don't have one"`
|
||||
ClientSecret string `json:"client_secret" required:"false" help:"Keep it empty if you don't have one"`
|
||||
RemoveWay string `json:"remove_way" required:"true" type:"select" options:"trash,delete"`
|
||||
|
||||
@@ -11,8 +11,8 @@ type Addition struct {
|
||||
OrderBy string `json:"order_by" type:"select" options:"name,time,size" default:"name"`
|
||||
OrderDirection string `json:"order_direction" type:"select" options:"asc,desc" default:"asc"`
|
||||
DownloadAPI string `json:"download_api" type:"select" options:"official,crack,crack_video" default:"official"`
|
||||
ClientID string `json:"client_id" required:"true" default:"hq9yQ9w9kR4YHj1kyYafLygVocobh7Sf"`
|
||||
ClientSecret string `json:"client_secret" required:"true" default:"YH2VpZcFJHYNnV6vLfHQXDBhcE7ZChyE"`
|
||||
ClientID string `json:"client_id" required:"true" default:"iYCeC9g08h5vuP9UqvPHKKSVrKFXGa1v"`
|
||||
ClientSecret string `json:"client_secret" required:"true" default:"jXiFMOPVPCWlO2M5CwWQzffpNPaGTRBG"`
|
||||
CustomCrackUA string `json:"custom_crack_ua" required:"true" default:"netdisk"`
|
||||
AccessToken string
|
||||
UploadThread string `json:"upload_thread" default:"3" help:"1<=thread<=32"`
|
||||
|
||||
@@ -103,8 +103,6 @@ func InitialSettings() []model.SettingItem {
|
||||
{Key: conf.AllowIndexed, Value: "false", Type: conf.TypeBool, Group: model.SITE},
|
||||
{Key: conf.AllowMounted, Value: "true", Type: conf.TypeBool, Group: model.SITE},
|
||||
{Key: conf.RobotsTxt, Value: "User-agent: *\nAllow: /", Type: conf.TypeText, Group: model.SITE},
|
||||
// newui settings
|
||||
{Key: conf.UseNewui, Value: "false", Type: conf.TypeBool, Group: model.SITE},
|
||||
// style settings
|
||||
{Key: conf.Logo, Value: "https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg", Type: conf.TypeText, Group: model.STYLE},
|
||||
{Key: conf.Favicon, Value: "https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg", Type: conf.TypeString, Group: model.STYLE},
|
||||
|
||||
@@ -16,7 +16,6 @@ const (
|
||||
AllowIndexed = "allow_indexed"
|
||||
AllowMounted = "allow_mounted"
|
||||
RobotsTxt = "robots_txt"
|
||||
UseNewui = "use_newui"
|
||||
|
||||
Logo = "logo"
|
||||
Favicon = "favicon"
|
||||
|
||||
@@ -2,14 +2,12 @@ package db
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"github.com/alist-org/alist/v3/internal/model"
|
||||
"github.com/alist-org/alist/v3/pkg/utils"
|
||||
"github.com/go-webauthn/webauthn/webauthn"
|
||||
"github.com/pkg/errors"
|
||||
"gorm.io/gorm"
|
||||
"path"
|
||||
"slices"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -26,20 +24,6 @@ func GetUserByRole(role int) (*model.User, error) {
|
||||
return nil, gorm.ErrRecordNotFound
|
||||
}
|
||||
|
||||
func GetUsersByRole(roleID int) ([]model.User, error) {
|
||||
var users []model.User
|
||||
if err := db.Find(&users).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var result []model.User
|
||||
for _, u := range users {
|
||||
if slices.Contains(u.Role, roleID) {
|
||||
result = append(result, u)
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func GetUserByName(username string) (*model.User, error) {
|
||||
user := model.User{Username: username}
|
||||
if err := db.Where(user).First(&user).Error; err != nil {
|
||||
@@ -124,29 +108,25 @@ func RemoveAuthn(u *model.User, id string) error {
|
||||
return UpdateAuthn(u.ID, string(res))
|
||||
}
|
||||
|
||||
func UpdateUserBasePathPrefix(oldPath, newPath string, usersOpt ...[]model.User) ([]string, error) {
|
||||
func UpdateUserBasePathPrefix(oldPath, newPath string) ([]string, error) {
|
||||
var users []model.User
|
||||
var modifiedUsernames []string
|
||||
|
||||
oldPathClean := path.Clean(oldPath)
|
||||
|
||||
if len(usersOpt) > 0 {
|
||||
users = usersOpt[0]
|
||||
} else {
|
||||
if err := db.Find(&users).Error; err != nil {
|
||||
return nil, errors.WithMessage(err, "failed to load users")
|
||||
}
|
||||
if err := db.Find(&users).Error; err != nil {
|
||||
return nil, errors.WithMessage(err, "failed to load users")
|
||||
}
|
||||
|
||||
oldPathClean := path.Clean(oldPath)
|
||||
|
||||
for _, user := range users {
|
||||
basePath := path.Clean(user.BasePath)
|
||||
updated := false
|
||||
|
||||
if basePath == oldPathClean {
|
||||
user.BasePath = path.Clean(newPath)
|
||||
user.BasePath = newPath
|
||||
updated = true
|
||||
} else if strings.HasPrefix(basePath, oldPathClean+"/") {
|
||||
user.BasePath = path.Clean(newPath + basePath[len(oldPathClean):])
|
||||
user.BasePath = newPath + basePath[len(oldPathClean):]
|
||||
updated = true
|
||||
}
|
||||
|
||||
@@ -160,13 +140,3 @@ func UpdateUserBasePathPrefix(oldPath, newPath string, usersOpt ...[]model.User)
|
||||
|
||||
return modifiedUsernames, nil
|
||||
}
|
||||
|
||||
func CountUsersByRoleAndEnabledExclude(roleID uint, excludeUserID uint) (int64, error) {
|
||||
var count int64
|
||||
jsonValue := fmt.Sprintf("[%d]", roleID)
|
||||
err := db.Model(&model.User{}).
|
||||
Where("disabled = ? AND id != ?", false, excludeUserID).
|
||||
Where("JSON_CONTAINS(role, ?)", jsonValue).
|
||||
Count(&count).Error
|
||||
return count, err
|
||||
}
|
||||
|
||||
@@ -97,11 +97,8 @@ func UpdateRole(r *model.Role) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
switch old.Name {
|
||||
case "admin":
|
||||
if old.Name == "admin" || old.Name == "guest" {
|
||||
return errs.ErrChangeDefaultRole
|
||||
case "guest":
|
||||
r.Name = "guest"
|
||||
}
|
||||
for i := range r.PermissionScopes {
|
||||
r.PermissionScopes[i].Path = utils.FixAndCleanPath(r.PermissionScopes[i].Path)
|
||||
@@ -111,13 +108,7 @@ func UpdateRole(r *model.Role) error {
|
||||
|
||||
oldPath := old.PermissionScopes[0].Path
|
||||
newPath := r.PermissionScopes[0].Path
|
||||
|
||||
users, err := db.GetUsersByRole(int(r.ID))
|
||||
if err != nil {
|
||||
return errors.WithMessage(err, "failed to get users by role")
|
||||
}
|
||||
|
||||
modifiedUsernames, err := db.UpdateUserBasePathPrefix(oldPath, newPath, users)
|
||||
modifiedUsernames, err := db.UpdateUserBasePathPrefix(oldPath, newPath)
|
||||
if err != nil {
|
||||
return errors.WithMessage(err, "failed to update user base path when role updated")
|
||||
}
|
||||
|
||||
@@ -165,11 +165,3 @@ func DelUserCache(username string) error {
|
||||
userCache.Del(username)
|
||||
return nil
|
||||
}
|
||||
|
||||
func CountEnabledAdminsExcluding(userID uint) (int64, error) {
|
||||
adminRole, err := GetRoleByName("admin")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return db.CountUsersByRoleAndEnabledExclude(adminRole.ID, userID)
|
||||
}
|
||||
|
||||
@@ -66,13 +66,9 @@ func UpdateRole(c *gin.Context) {
|
||||
common.ErrorResp(c, err, 500, true)
|
||||
return
|
||||
}
|
||||
switch role.Name {
|
||||
case "admin":
|
||||
if role.Name == "admin" || role.Name == "guest" {
|
||||
common.ErrorResp(c, errs.ErrChangeDefaultRole, 403)
|
||||
return
|
||||
|
||||
case "guest":
|
||||
req.Name = "guest"
|
||||
}
|
||||
if err := op.UpdateRole(&req); err != nil {
|
||||
common.ErrorResp(c, err, 500, true)
|
||||
|
||||
@@ -83,16 +83,9 @@ func UpdateUser(c *gin.Context) {
|
||||
if req.OtpSecret == "" {
|
||||
req.OtpSecret = user.OtpSecret
|
||||
}
|
||||
if req.Disabled && user.IsAdmin() {
|
||||
count, err := op.CountEnabledAdminsExcluding(user.ID)
|
||||
if err != nil {
|
||||
common.ErrorResp(c, err, 500)
|
||||
return
|
||||
}
|
||||
if count == 0 {
|
||||
common.ErrorStrResp(c, "at least one enabled admin must be kept", 400)
|
||||
return
|
||||
}
|
||||
if req.Disabled && req.IsAdmin() {
|
||||
common.ErrorStrResp(c, "admin user can not be disabled", 400)
|
||||
return
|
||||
}
|
||||
if err := op.UpdateUser(&req); err != nil {
|
||||
common.ErrorResp(c, err, 500)
|
||||
|
||||
@@ -41,15 +41,6 @@ func Auth(c *gin.Context) {
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
if len(guest.Role) > 0 {
|
||||
roles, err := op.GetRolesByUserID(guest.ID)
|
||||
if err != nil {
|
||||
common.ErrorStrResp(c, fmt.Sprintf("Fail to load guest roles: %v", err), 500)
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
guest.RolesDetail = roles
|
||||
}
|
||||
c.Set("user", guest)
|
||||
log.Debugf("use empty token: %+v", guest)
|
||||
c.Next()
|
||||
|
||||
Reference in New Issue
Block a user