域名限制

This commit is contained in:
xing 2022-10-10 21:07:39 +08:00
parent 5c9107fd03
commit 90120056d4
7 changed files with 58 additions and 7 deletions

View File

@ -60,5 +60,5 @@ func getCommentByIds(args ...any) (map[uint64]models.WpComments, error) {
} }
return helper.SliceToMap(r, func(t models.WpComments) uint64 { return helper.SliceToMap(r, func(t models.WpComments) uint64 {
return t.CommentId return t.CommentId
}), err }, true), err
} }

View File

@ -57,3 +57,7 @@ commentsCacheTime: 24h
gzip: false gzip: false
# 提交评论url # 提交评论url
postCommentUrl: http://wp.test/wp-comments-post.php postCommentUrl: http://wp.test/wp-comments-post.php
# TrustIps
trustIps: []
# trust servername 信任的域名
trustServerNames: ["xy.test","blog.xy.test"]

View File

@ -231,10 +231,15 @@ func SliceSelfReverse[T any](arr []T) []T {
return arr return arr
} }
func SliceToMap[K comparable, V any](arr []V, fn func(V) K) map[K]V { func SliceToMap[K comparable, V any](arr []V, fn func(V) K, isCoverPrev bool) map[K]V {
m := make(map[K]V) m := make(map[K]V)
for _, v := range arr { for _, v := range arr {
k := fn(v) k := fn(v)
if !isCoverPrev {
if _, ok := m[k]; ok {
continue
}
}
m[k] = v m[k] = v
} }
return m return m

View File

@ -512,8 +512,9 @@ func TestSliceToMap(t *testing.T) {
v string v string
} }
type args struct { type args struct {
arr []ss arr []ss
fn func(ss) int fn func(ss) int
isCoverPrev bool
} }
tests := []struct { tests := []struct {
name string name string
@ -523,17 +524,28 @@ func TestSliceToMap(t *testing.T) {
{ {
name: "t1", name: "t1",
args: args{ args: args{
arr: []ss{{1, "k1"}, {2, "v2"}}, arr: []ss{{1, "k1"}, {2, "v2"}, {2, "v3"}},
fn: func(s ss) int { fn: func(s ss) int {
return s.id return s.id
}, },
isCoverPrev: true,
},
want: map[int]ss{1: {1, "k1"}, 2: {2, "v3"}},
}, {
name: "t2",
args: args{
arr: []ss{{1, "k1"}, {2, "v2"}, {2, "v3"}},
fn: func(s ss) int {
return s.id
},
isCoverPrev: false,
}, },
want: map[int]ss{1: {1, "k1"}, 2: {2, "v2"}}, want: map[int]ss{1: {1, "k1"}, 2: {2, "v2"}},
}, },
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if got := SliceToMap(tt.args.arr, tt.args.fn); !reflect.DeepEqual(got, tt.want) { if got := SliceToMap(tt.args.arr, tt.args.fn, tt.args.isCoverPrev); !reflect.DeepEqual(got, tt.want) {
t.Errorf("SliceToMap() = %v, want %v", got, tt.want) t.Errorf("SliceToMap() = %v, want %v", got, tt.want)
} }
}) })

View File

@ -0,0 +1,23 @@
package middleware
import (
"github.com/gin-gonic/gin"
"github/fthvgb1/wp-go/helper"
"github/fthvgb1/wp-go/vars"
"net/http"
"strings"
)
func ValidateServerNames() func(ctx *gin.Context) {
serverName := helper.SliceToMap(vars.Conf.TrustServerNames, func(v string) string {
return v
}, true)
return func(c *gin.Context) {
if len(serverName) > 0 {
if _, ok := serverName[strings.Split(c.Request.Host, ":")[0]]; !ok {
c.Status(http.StatusForbidden)
c.Abort()
}
}
}
}

View File

@ -36,7 +36,13 @@ func SetupRouter() *gin.Engine {
return t.Format("2006年 01月 02日") return t.Format("2006年 01月 02日")
}, },
}).SetTemplate() }).SetTemplate()
r.Use(gin.Logger(), middleware.FlowLimit(vars.Conf.MaxRequestSleepNum, vars.Conf.MaxRequestNum, vars.Conf.SingleIpSearchNum, vars.Conf.SleepTime), gin.Recovery(), middleware.SetStaticFileCache) r.Use(
middleware.ValidateServerNames(),
gin.Logger(),
middleware.FlowLimit(vars.Conf.MaxRequestSleepNum, vars.Conf.MaxRequestNum, vars.Conf.SingleIpSearchNum, vars.Conf.SleepTime),
gin.Recovery(),
middleware.SetStaticFileCache,
)
//gzip 因为一般会用nginx做反代时自动使用gzip,所以go这边本身可以不用 //gzip 因为一般会用nginx做反代时自动使用gzip,所以go这边本身可以不用
if vars.Conf.Gzip { if vars.Conf.Gzip {
r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPaths([]string{ r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPaths([]string{

View File

@ -34,6 +34,7 @@ type Config struct {
Gzip bool `yaml:"gzip"` Gzip bool `yaml:"gzip"`
PostCommentUrl string `yaml:"postCommentUrl"` PostCommentUrl string `yaml:"postCommentUrl"`
TrustIps []string `yaml:"trustIps"` TrustIps []string `yaml:"trustIps"`
TrustServerNames []string `yaml:"trustServerNames"`
} }
type Mysql struct { type Mysql struct {