feat: custom hide error message by regexp (close #1468)

This commit is contained in:
Noah Hsu 2022-08-08 12:52:54 +08:00
parent d6437a337f
commit 2b04cf4ac3
8 changed files with 144 additions and 20 deletions

View File

@ -47,7 +47,6 @@ func initSettings() {
log.Fatalf("failed get setting: %+v", err) log.Fatalf("failed get setting: %+v", err)
} }
} }
db.ResetTypeMap()
} }
func isActive(key string) bool { func isActive(key string) bool {
@ -93,6 +92,9 @@ func initialSettings() {
{Key: conf.CustomizeHead, Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE}, {Key: conf.CustomizeHead, Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE},
{Key: conf.CustomizeBody, Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE}, {Key: conf.CustomizeBody, Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE},
{Key: conf.LinkExpiration, Value: "0", Type: conf.TypeNumber, Group: model.GLOBAL, Flag: model.PRIVATE}, {Key: conf.LinkExpiration, Value: "0", Type: conf.TypeNumber, Group: model.GLOBAL, Flag: model.PRIVATE},
{Key: conf.PrivacyRegs, Value: `(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
([[:xdigit:]]{1,4}(?::[[:xdigit:]]{1,4}){7}|::|:(?::[[:xdigit:]]{1,4}){1,6}|[[:xdigit:]]{1,4}:(?::[[:xdigit:]]{1,4}){1,5}|(?:[[:xdigit:]]{1,4}:){2}(?::[[:xdigit:]]{1,4}){1,4}|(?:[[:xdigit:]]{1,4}:){3}(?::[[:xdigit:]]{1,4}){1,3}|(?:[[:xdigit:]]{1,4}:){4}(?::[[:xdigit:]]{1,4}){1,2}|(?:[[:xdigit:]]{1,4}:){5}:[[:xdigit:]]{1,4}|(?:[[:xdigit:]]{1,4}:){1,6}:)`,
Type: conf.TypeText, Group: model.GLOBAL, Flag: model.PRIVATE},
// aria2 settings // aria2 settings
{Key: conf.Aria2Uri, Value: "http://localhost:6800/jsonrpc", Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE}, {Key: conf.Aria2Uri, Value: "http://localhost:6800/jsonrpc", Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE},
{Key: conf.Aria2Secret, Value: "", Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE}, {Key: conf.Aria2Secret, Value: "", Type: conf.TypeString, Group: model.ARIA2, Flag: model.PRIVATE},

View File

@ -27,7 +27,7 @@ func initUser() {
if err := db.CreateUser(admin); err != nil { if err := db.CreateUser(admin); err != nil {
panic(err) panic(err)
} else { } else {
log.Infof("Successfully created the administrator user and the initial password is: %s", admin.Password) log.Infof("Successfully created the admin user and the initial password is: %s", admin.Password)
} }
} else { } else {
panic(err) panic(err)

View File

@ -9,6 +9,7 @@ const (
) )
const ( const (
// site
VERSION = "version" VERSION = "version"
ApiUrl = "api_url" ApiUrl = "api_url"
BasePath = "base_path" BasePath = "base_path"
@ -18,6 +19,7 @@ const (
Announcement = "announcement" Announcement = "announcement"
IconColor = "icon_color" IconColor = "icon_color"
// preview
TextTypes = "text_types" TextTypes = "text_types"
AudioTypes = "audio_types" AudioTypes = "audio_types"
VideoTypes = "video_types" VideoTypes = "video_types"
@ -28,15 +30,19 @@ const (
AudioAutoplay = "audio_autoplay" AudioAutoplay = "audio_autoplay"
VideoAutoplay = "video_autoplay" VideoAutoplay = "video_autoplay"
// global
HideFiles = "hide_files" HideFiles = "hide_files"
GlobalReadme = "global_readme" GlobalReadme = "global_readme"
CustomizeHead = "customize_head" CustomizeHead = "customize_head"
CustomizeBody = "customize_body" CustomizeBody = "customize_body"
LinkExpiration = "link_expiration" LinkExpiration = "link_expiration"
PrivacyRegs = "privacy_regs"
// aria2
Aria2Uri = "aria2_uri" Aria2Uri = "aria2_uri"
Aria2Secret = "aria2_secret" Aria2Secret = "aria2_secret"
// single
Token = "token" Token = "token"
) )

View File

@ -1,5 +1,7 @@
package conf package conf
import "regexp"
var ( var (
BuiltAt string BuiltAt string
GoVersion string GoVersion string
@ -14,3 +16,4 @@ var (
) )
var TypesMap = make(map[string][]string) var TypesMap = make(map[string][]string)
var PrivacyReg []*regexp.Regexp

View File

@ -0,0 +1,84 @@
package db
import (
"regexp"
"strings"
"github.com/alist-org/alist/v3/internal/conf"
"github.com/alist-org/alist/v3/internal/model"
"github.com/pkg/errors"
)
type SettingItemHook struct {
Hook func(item *model.SettingItem) error
}
var SettingItemHooks = map[string]SettingItemHook{
conf.VideoTypes: {
Hook: func(item *model.SettingItem) error {
conf.TypesMap[conf.VideoTypes] = strings.Split(item.Value, ",")
return nil
},
},
conf.AudioTypes: {
Hook: func(item *model.SettingItem) error {
conf.TypesMap[conf.AudioTypes] = strings.Split(item.Value, ",")
return nil
},
},
conf.ImageTypes: {
Hook: func(item *model.SettingItem) error {
conf.TypesMap[conf.ImageTypes] = strings.Split(item.Value, ",")
return nil
},
},
conf.TextTypes: {
Hook: func(item *model.SettingItem) error {
conf.TypesMap[conf.TextTypes] = strings.Split(item.Value, ",")
return nil
},
},
conf.OfficeTypes: {
Hook: func(item *model.SettingItem) error {
conf.TypesMap[conf.OfficeTypes] = strings.Split(item.Value, ",")
return nil
},
},
conf.ProxyTypes: {
func(item *model.SettingItem) error {
conf.TypesMap[conf.ProxyTypes] = strings.Split(item.Value, ",")
return nil
},
},
conf.PrivacyRegs: {
Hook: func(item *model.SettingItem) error {
regStrs := strings.Split(item.Value, "\n")
regs := make([]*regexp.Regexp, 0, len(regStrs))
for _, regStr := range regStrs {
reg, err := regexp.Compile(regStr)
if err != nil {
return errors.WithStack(err)
}
regs = append(regs, reg)
}
conf.PrivacyReg = regs
return nil
},
},
}
func HandleSettingItem(item *model.SettingItem) (bool, error) {
if hook, ok := SettingItemHooks[item.Key]; ok {
return true, hook.Hook(item)
}
return false, nil
}
// func HandleSettingItems(items []model.SettingItem) error {
// for i := range items {
// if err := HandleSettingItem(&items[i]); err != nil {
// return err
// }
// }
// return nil
// }

View File

@ -2,9 +2,7 @@ package db
import ( import (
"fmt" "fmt"
"strings"
"github.com/alist-org/alist/v3/internal/conf"
"github.com/alist-org/alist/v3/internal/model" "github.com/alist-org/alist/v3/internal/model"
"github.com/pkg/errors" "github.com/pkg/errors"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -13,19 +11,9 @@ import (
var settingsMap map[string]string var settingsMap map[string]string
var publicSettingsMap map[string]string var publicSettingsMap map[string]string
func ResetTypeMap() {
settingsMap := GetSettingsMap()
conf.TypesMap[conf.AudioTypes] = strings.Split(settingsMap[conf.AudioTypes], ",")
conf.TypesMap[conf.VideoTypes] = strings.Split(settingsMap[conf.VideoTypes], ",")
conf.TypesMap[conf.ImageTypes] = strings.Split(settingsMap[conf.ImageTypes], ",")
conf.TypesMap[conf.TextTypes] = strings.Split(settingsMap[conf.TextTypes], ",")
conf.TypesMap[conf.OfficeTypes] = strings.Split(settingsMap[conf.OfficeTypes], ",")
}
func settingsUpdate() { func settingsUpdate() {
settingsMap = nil settingsMap = nil
publicSettingsMap = nil publicSettingsMap = nil
ResetTypeMap()
} }
func GetPublicSettingsMap() map[string]string { func GetPublicSettingsMap() map[string]string {
@ -105,13 +93,38 @@ func GetSettingItemsInGroups(groups []int) ([]model.SettingItem, error) {
} }
func SaveSettingItems(items []model.SettingItem) error { func SaveSettingItems(items []model.SettingItem) error {
settingsUpdate() others := make([]model.SettingItem, 0)
return errors.WithStack(db.Save(items).Error) for i := range items {
if ok, err := HandleSettingItem(&items[i]); ok {
if err != nil {
return err
} else {
err = db.Save(items[i]).Error
if err != nil {
return errors.WithStack(err)
}
}
} else {
others = append(others, items[i])
}
}
err := db.Save(others).Error
if err == nil {
settingsUpdate()
}
return err
} }
func SaveSettingItem(item model.SettingItem) error { func SaveSettingItem(item model.SettingItem) error {
settingsUpdate() _, err := HandleSettingItem(&item)
return errors.WithStack(db.Save(item).Error) if err != nil {
return err
}
err = db.Save(item).Error
if err == nil {
settingsUpdate()
}
return errors.WithStack(err)
} }
func DeleteSettingItemByKey(key string) error { func DeleteSettingItemByKey(key string) error {

View File

@ -1,11 +1,23 @@
package common package common
import ( import (
"strings"
"github.com/alist-org/alist/v3/cmd/flags" "github.com/alist-org/alist/v3/cmd/flags"
"github.com/alist-org/alist/v3/internal/conf"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func hidePrivacy(msg string) string {
for _, r := range conf.PrivacyReg {
msg = r.ReplaceAllStringFunc(msg, func(s string) string {
return strings.Repeat("*", len(s))
})
}
return msg
}
// ErrorResp is used to return error response // ErrorResp is used to return error response
// @param l: if true, log error // @param l: if true, log error
func ErrorResp(c *gin.Context, err error, code int, l ...bool) { func ErrorResp(c *gin.Context, err error, code int, l ...bool) {
@ -18,7 +30,7 @@ func ErrorResp(c *gin.Context, err error, code int, l ...bool) {
} }
c.JSON(200, Resp{ c.JSON(200, Resp{
Code: code, Code: code,
Message: err.Error(), Message: hidePrivacy(err.Error()),
Data: nil, Data: nil,
}) })
c.Abort() c.Abort()
@ -30,7 +42,7 @@ func ErrorStrResp(c *gin.Context, str string, code int, l ...bool) {
} }
c.JSON(200, Resp{ c.JSON(200, Resp{
Code: code, Code: code,
Message: str, Message: hidePrivacy(str),
Data: nil, Data: nil,
}) })
c.Abort() c.Abort()

View File

@ -1,6 +1,7 @@
package server package server
import ( import (
"github.com/alist-org/alist/v3/server/common"
"github.com/alist-org/alist/v3/server/middlewares" "github.com/alist-org/alist/v3/server/middlewares"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@ -12,4 +13,7 @@ func dev(g *gin.RouterGroup) {
"path": rawPath, "path": rawPath,
}) })
}) })
g.GET("/hide_privacy", func(ctx *gin.Context) {
common.ErrorStrResp(ctx, "This is ip: 1.1.1.1", 400)
})
} }