mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-11-04 19:16:22 +08:00 
			
		
		
		
	@@ -453,7 +453,7 @@ ipv4_end = "10.1.2.200"
 | 
			
		||||
- [三方文档-男孩的天职](https://note.youdao.com/s/X4AxyWfL)
 | 
			
		||||
- [三方文档-issues](https://github.com/bjdgyc/anylink/issues)
 | 
			
		||||
- [三方文档-思有云](https://www.ioiox.com/archives/128.html)
 | 
			
		||||
- [三方文档-杨杨得亿](https://yangpin.link/archives/1633.html)  [Windows电脑连接步骤-杨杨得亿](https://yangpin.link/archives/1697.html)
 | 
			
		||||
- [三方文档-杨杨得亿](https://yangpin.link/archives/1897.html)  [Windows电脑连接步骤-杨杨得亿](https://yangpin.link/archives/1697.html)
 | 
			
		||||
 | 
			
		||||
## Support Client
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,3 +19,5 @@ echo "docker tag latest $ver"
 | 
			
		||||
docker tag bjdgyc/anylink:latest bjdgyc/anylink:$ver
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# docker tag bjdgyc/anylink:$ver registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:test-$ver
 | 
			
		||||
# docker push registry.cn-hangzhou.aliyuncs.com/bjdgyc/anylink:test-$ver
 | 
			
		||||
 
 | 
			
		||||
@@ -42,9 +42,10 @@ go build -v -o anylink $flags -ldflags "$ldflags"
 | 
			
		||||
EOF
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# golang:1.20-alpine3.19
 | 
			
		||||
#使用 musl-dev 编译
 | 
			
		||||
docker run -q --rm -v $PWD/server:/app -v $gopath:/go -w /app --platform=linux/amd64 \
 | 
			
		||||
  golang:1.20-alpine3.19 sh -c "$dockercmd"
 | 
			
		||||
  golang:1.22-alpine3.19 sh -c "$dockercmd"
 | 
			
		||||
 | 
			
		||||
#arm64编译
 | 
			
		||||
#docker run -q --rm -v $PWD/server:/app -v $gopath:/go -w /app --platform=linux/arm64 \
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,8 @@
 | 
			
		||||
| 杨杨得亿        |                              |
 | 
			
		||||
| Thanataos   |                              |
 | 
			
		||||
| 憨大叔         |                              |
 | 
			
		||||
| 明月          |                              |
 | 
			
		||||
| Amis        |                              |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,8 @@
 | 
			
		||||
# 需要先编译出ui文件后 再执行docker编译
 | 
			
		||||
 | 
			
		||||
# server
 | 
			
		||||
FROM golang:1.20-alpine3.19 as builder_golang
 | 
			
		||||
# golang:1.20-alpine3.19
 | 
			
		||||
FROM golang:1.22-alpine3.19 as builder_golang
 | 
			
		||||
 | 
			
		||||
ARG CN="no"
 | 
			
		||||
ARG appVer="appVer"
 | 
			
		||||
 
 | 
			
		||||
@@ -9,12 +9,16 @@ if [[ $CN == "yes" ]]; then
 | 
			
		||||
  export GOPROXY=https://goproxy.cn
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# docker 启动使用 4.19 以上内核
 | 
			
		||||
apk add --no-cache ca-certificates bash iproute2 tzdata iptables
 | 
			
		||||
 | 
			
		||||
# alpine:3.19 兼容老版 iptables
 | 
			
		||||
apk add --no-cache iptables iptables-legacy
 | 
			
		||||
apk add --no-cache iptables-legacy
 | 
			
		||||
rm /sbin/iptables
 | 
			
		||||
ln -s /sbin/iptables-legacy /sbin/iptables
 | 
			
		||||
 | 
			
		||||
apk add --no-cache ca-certificates bash iproute2 tzdata
 | 
			
		||||
 | 
			
		||||
chmod +x /app/docker_entrypoint.sh
 | 
			
		||||
mkdir /app/log
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -220,6 +220,7 @@ type userAccountMailData struct {
 | 
			
		||||
	Username     string
 | 
			
		||||
	Nickname     string
 | 
			
		||||
	PinCode      string
 | 
			
		||||
	LimitTime    string
 | 
			
		||||
	OtpImg       string
 | 
			
		||||
	OtpImgBase64 string
 | 
			
		||||
	DisableOtp   bool
 | 
			
		||||
@@ -276,6 +277,13 @@ func userAccountMail(user *dbdata.User) error {
 | 
			
		||||
		OtpImgBase64: "data:image/png;base64," + otpData,
 | 
			
		||||
		DisableOtp:   user.DisableOtp,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if user.LimitTime == nil {
 | 
			
		||||
		data.LimitTime = "无限制"
 | 
			
		||||
	} else {
 | 
			
		||||
		data.LimitTime = user.LimitTime.Local().Format("2006-01-02")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	w := bytes.NewBufferString("")
 | 
			
		||||
	t, _ := template.New("auth_complete").Parse(htmlBody)
 | 
			
		||||
	err = t.Execute(w, data)
 | 
			
		||||
 
 | 
			
		||||
@@ -147,7 +147,7 @@ func addInitData() error {
 | 
			
		||||
		Name:         "all",
 | 
			
		||||
		AllowLan:     true,
 | 
			
		||||
		ClientDns:    []ValData{{Val: "114.114.114.114"}},
 | 
			
		||||
		RouteInclude: []ValData{{Val: All}},
 | 
			
		||||
		RouteInclude: []ValData{{Val: ALL}},
 | 
			
		||||
		Status:       1,
 | 
			
		||||
	}
 | 
			
		||||
	err = SetGroup(&g1)
 | 
			
		||||
@@ -184,6 +184,7 @@ const accountMail = `<p>您好:</p>
 | 
			
		||||
    用户组: <b>{{.Group}}</b> <br/>
 | 
			
		||||
    用户名: <b>{{.Username}}</b> <br/>
 | 
			
		||||
    用户PIN码: <b>{{.PinCode}}</b> <br/>
 | 
			
		||||
    用户过期时间: <b>{{.LimitTime}}</b> <br/>
 | 
			
		||||
    {{if .DisableOtp}}
 | 
			
		||||
    <!-- nothing -->
 | 
			
		||||
    {{else}}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/bjdgyc/anylink/base"
 | 
			
		||||
	"github.com/songgao/water/waterutil"
 | 
			
		||||
	"golang.org/x/text/language"
 | 
			
		||||
	"golang.org/x/text/message"
 | 
			
		||||
)
 | 
			
		||||
@@ -17,7 +18,10 @@ import (
 | 
			
		||||
const (
 | 
			
		||||
	Allow = "allow"
 | 
			
		||||
	Deny  = "deny"
 | 
			
		||||
	All   = "all"
 | 
			
		||||
	ALL   = "all"
 | 
			
		||||
	TCP   = "tcp"
 | 
			
		||||
	UDP   = "udp"
 | 
			
		||||
	ICMP  = "icmp"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 域名分流最大字符2万
 | 
			
		||||
@@ -25,12 +29,14 @@ const DsMaxLen = 20000
 | 
			
		||||
 | 
			
		||||
type GroupLinkAcl struct {
 | 
			
		||||
	// 自上而下匹配 默认 allow * *
 | 
			
		||||
	Action string          `json:"action"` // allow、deny
 | 
			
		||||
	Val    string          `json:"val"`
 | 
			
		||||
	Port   string          `json:"port"` // 兼容单端口历史数据类型uint16
 | 
			
		||||
	Ports  map[uint16]int8 `json:"ports"`
 | 
			
		||||
	IpNet  *net.IPNet      `json:"ip_net"`
 | 
			
		||||
	Note   string          `json:"note"`
 | 
			
		||||
	Action   string               `json:"action"`      // allow、deny
 | 
			
		||||
	Protocol string               `json:"protocol"`    // 支持 ALL、TCP、UDP、ICMP 协议
 | 
			
		||||
	IpProto  waterutil.IPProtocol `json:"ip_protocol"` // 判断协议使用
 | 
			
		||||
	Val      string               `json:"val"`
 | 
			
		||||
	Port     string               `json:"port"` // 兼容单端口历史数据类型uint16
 | 
			
		||||
	Ports    map[uint16]int8      `json:"ports"`
 | 
			
		||||
	IpNet    *net.IPNet           `json:"ip_net"`
 | 
			
		||||
	Note     string               `json:"note"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ValData struct {
 | 
			
		||||
@@ -114,7 +120,7 @@ func SetGroup(g *Group) error {
 | 
			
		||||
	routeInclude := []ValData{}
 | 
			
		||||
	for _, v := range g.RouteInclude {
 | 
			
		||||
		if v.Val != "" {
 | 
			
		||||
			if v.Val == All {
 | 
			
		||||
			if v.Val == ALL {
 | 
			
		||||
				routeInclude = append(routeInclude, v)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
@@ -164,6 +170,19 @@ func SetGroup(g *Group) error {
 | 
			
		||||
			}
 | 
			
		||||
			v.IpNet = ipNet
 | 
			
		||||
 | 
			
		||||
			// 设置协议数据
 | 
			
		||||
			switch v.Protocol {
 | 
			
		||||
			case TCP:
 | 
			
		||||
				v.IpProto = waterutil.TCP
 | 
			
		||||
			case UDP:
 | 
			
		||||
				v.IpProto = waterutil.UDP
 | 
			
		||||
			case ICMP:
 | 
			
		||||
				v.IpProto = waterutil.ICMP
 | 
			
		||||
			default:
 | 
			
		||||
				// 其他类型都是 all
 | 
			
		||||
				v.Protocol = ALL
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			portsStr := v.Port
 | 
			
		||||
			v.Port = strings.TrimSpace(portsStr)
 | 
			
		||||
			// switch vp := v.Port.(type) {
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ func SetPolicy(p *Policy) error {
 | 
			
		||||
	routeInclude := []ValData{}
 | 
			
		||||
	for _, v := range p.RouteInclude {
 | 
			
		||||
		if v.Val != "" {
 | 
			
		||||
			if v.Val == All {
 | 
			
		||||
			if v.Val == ALL {
 | 
			
		||||
				routeInclude = append(routeInclude, v)
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -67,12 +67,12 @@ type Setting struct {
 | 
			
		||||
type AccessAudit struct {
 | 
			
		||||
	Id          int       `json:"id" xorm:"pk autoincr not null"`
 | 
			
		||||
	Username    string    `json:"username" xorm:"varchar(60) not null"`
 | 
			
		||||
	Protocol    uint8     `json:"protocol" xorm:"not null"`
 | 
			
		||||
	Protocol    uint8     `json:"protocol" xorm:"Int not null"`
 | 
			
		||||
	Src         string    `json:"src" xorm:"varchar(60) not null"`
 | 
			
		||||
	SrcPort     uint16    `json:"src_port" xorm:"not null"`
 | 
			
		||||
	SrcPort     uint16    `json:"src_port" xorm:"Int not null"`
 | 
			
		||||
	Dst         string    `json:"dst" xorm:"varchar(60) not null"`
 | 
			
		||||
	DstPort     uint16    `json:"dst_port" xorm:"not null"`
 | 
			
		||||
	AccessProto uint8     `json:"access_proto" xorm:"default 0"`                // 访问协议
 | 
			
		||||
	DstPort     uint16    `json:"dst_port" xorm:"Int not null"`
 | 
			
		||||
	AccessProto uint8     `json:"access_proto" xorm:"Int default 0"`            // 访问协议
 | 
			
		||||
	Info        string    `json:"info" xorm:"varchar(255) not null default ''"` // 详情
 | 
			
		||||
	CreatedAt   time.Time `json:"created_at" xorm:"DateTime"`
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
module github.com/bjdgyc/anylink
 | 
			
		||||
 | 
			
		||||
go 1.20
 | 
			
		||||
go 1.22
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/arl/statsviz v0.6.0
 | 
			
		||||
 
 | 
			
		||||
@@ -25,11 +25,14 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8Yc
 | 
			
		||||
github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=
 | 
			
		||||
github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
 | 
			
		||||
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
 | 
			
		||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 | 
			
		||||
github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
 | 
			
		||||
github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
 | 
			
		||||
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
 | 
			
		||||
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 | 
			
		||||
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
 | 
			
		||||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
 | 
			
		||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 | 
			
		||||
@@ -65,6 +68,7 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 | 
			
		||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 | 
			
		||||
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 | 
			
		||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
@@ -83,6 +87,7 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n
 | 
			
		||||
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
 | 
			
		||||
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 | 
			
		||||
github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c=
 | 
			
		||||
github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
 | 
			
		||||
github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M=
 | 
			
		||||
github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8=
 | 
			
		||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
			
		||||
@@ -103,10 +108,12 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 | 
			
		||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 | 
			
		||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
 | 
			
		||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
 | 
			
		||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 | 
			
		||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
			
		||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
			
		||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
			
		||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
			
		||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
			
		||||
@@ -118,7 +125,9 @@ github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 | 
			
		||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 | 
			
		||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
 | 
			
		||||
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
 | 
			
		||||
github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4=
 | 
			
		||||
@@ -160,6 +169,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
 | 
			
		||||
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 | 
			
		||||
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
 | 
			
		||||
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
 | 
			
		||||
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 | 
			
		||||
@@ -170,6 +180,7 @@ github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzG
 | 
			
		||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
 | 
			
		||||
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
 | 
			
		||||
@@ -264,6 +275,7 @@ golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86h
 | 
			
		||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 | 
			
		||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
			
		||||
golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
 | 
			
		||||
golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
 | 
			
		||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 | 
			
		||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 | 
			
		||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 | 
			
		||||
@@ -363,6 +375,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
@@ -370,15 +383,25 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
layeh.com/radius v0.0.0-20231213012653-1006025d24f8 h1:orYXpi6BJZdvgytfHH4ybOe4wHnLbbS71Cmd8mWdZjs=
 | 
			
		||||
layeh.com/radius v0.0.0-20231213012653-1006025d24f8/go.mod h1:QRf+8aRqXc019kHkpcs/CTgyWXFzf+bxlsyuo2nAl1o=
 | 
			
		||||
lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI=
 | 
			
		||||
lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
 | 
			
		||||
modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw=
 | 
			
		||||
modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0=
 | 
			
		||||
modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw=
 | 
			
		||||
modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY=
 | 
			
		||||
modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0=
 | 
			
		||||
modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug=
 | 
			
		||||
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
 | 
			
		||||
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
 | 
			
		||||
modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk=
 | 
			
		||||
modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
 | 
			
		||||
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
 | 
			
		||||
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
 | 
			
		||||
modernc.org/sqlite v1.20.4 h1:J8+m2trkN+KKoE7jglyHYYYiaq5xmz2HoHJIiBlRzbE=
 | 
			
		||||
modernc.org/sqlite v1.20.4/go.mod h1:zKcGyrICaxNTMEHSr1HQ2GUraP0j+845GYw37+EyT6A=
 | 
			
		||||
modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY=
 | 
			
		||||
modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
 | 
			
		||||
modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg=
 | 
			
		||||
modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
 | 
			
		||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
 | 
			
		||||
xorm.io/builder v0.3.13 h1:a3jmiVVL19psGeXx8GIurTp7p0IIgqeDmwhcR6BAOAo=
 | 
			
		||||
xorm.io/builder v0.3.13/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=
 | 
			
		||||
 
 | 
			
		||||
@@ -28,11 +28,11 @@ func LinkHome(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if index.Homecode > 0 {
 | 
			
		||||
	if index.Homecode != http.StatusOK {
 | 
			
		||||
		w.WriteHeader(index.Homecode)
 | 
			
		||||
	} else {
 | 
			
		||||
		w.WriteHeader(http.StatusOK)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	w.WriteHeader(http.StatusOK)
 | 
			
		||||
 | 
			
		||||
	// if index.Homeindex == "" {
 | 
			
		||||
	// 	index.Homeindex = "AnyLink 是一个企业级远程办公 SSL VPN 软件,可以支持多人同时在线使用。"
 | 
			
		||||
 
 | 
			
		||||
@@ -138,7 +138,7 @@ func LinkTunnel(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
	// 允许的路由
 | 
			
		||||
	for _, v := range cSess.Group.RouteInclude {
 | 
			
		||||
		if strings.ToLower(v.Val) == dbdata.All {
 | 
			
		||||
		if strings.ToLower(v.Val) == dbdata.ALL {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		HttpAddHeader(w, "X-CSTP-Split-Include", v.IpMask)
 | 
			
		||||
 
 | 
			
		||||
@@ -86,27 +86,41 @@ func checkLinkAcl(group *dbdata.Group, pl *sessdata.Payload) bool {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, v := range group.LinkAcl {
 | 
			
		||||
		// 循环判断ip和端口
 | 
			
		||||
		if v.IpNet.Contains(ipDst) {
 | 
			
		||||
		// 放行允许ip的ping
 | 
			
		||||
		// if v.Ports == nil || len(v.Ports) == 0 {
 | 
			
		||||
		// 	//单端口历史数据兼容
 | 
			
		||||
		// 	port := uint16(v.Port.(float64))
 | 
			
		||||
		// 	if port == ipPort || port == 0 || ipProto == waterutil.ICMP {
 | 
			
		||||
		// 		if v.Action == dbdata.Allow {
 | 
			
		||||
		// 			return true
 | 
			
		||||
		// 		} else {
 | 
			
		||||
		// 			return false
 | 
			
		||||
		// 		}
 | 
			
		||||
		// 	}
 | 
			
		||||
		// } else {
 | 
			
		||||
 | 
			
		||||
			// 放行允许ip的ping
 | 
			
		||||
			// if v.Ports == nil || len(v.Ports) == 0 {
 | 
			
		||||
			// 	//单端口历史数据兼容
 | 
			
		||||
			// 	port := uint16(v.Port.(float64))
 | 
			
		||||
			// 	if port == ipPort || port == 0 || ipProto == waterutil.ICMP {
 | 
			
		||||
			// 		if v.Action == dbdata.Allow {
 | 
			
		||||
			// 			return true
 | 
			
		||||
			// 		} else {
 | 
			
		||||
			// 			return false
 | 
			
		||||
			// 		}
 | 
			
		||||
			// 	}
 | 
			
		||||
			// } else {
 | 
			
		||||
		// 先判断协议
 | 
			
		||||
		// 兼容旧数据 v.Protocol == ""
 | 
			
		||||
		if v.Protocol == "" || v.Protocol == dbdata.ALL || v.IpProto == ipProto {
 | 
			
		||||
			// 循环判断ip和端口
 | 
			
		||||
			if v.IpNet.Contains(ipDst) {
 | 
			
		||||
				// icmp 不判断端口
 | 
			
		||||
				if ipProto == waterutil.ICMP {
 | 
			
		||||
					if v.Action == dbdata.Allow {
 | 
			
		||||
						return true
 | 
			
		||||
					} else {
 | 
			
		||||
						return false
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			if dbdata.ContainsInPorts(v.Ports, ipPort) || dbdata.ContainsInPorts(v.Ports, 0) || ipProto == waterutil.ICMP {
 | 
			
		||||
				if v.Action == dbdata.Allow {
 | 
			
		||||
					return true
 | 
			
		||||
				} else {
 | 
			
		||||
					return false
 | 
			
		||||
				if dbdata.ContainsInPorts(v.Ports, ipPort) || dbdata.ContainsInPorts(v.Ports, 0) {
 | 
			
		||||
					if v.Action == dbdata.Allow {
 | 
			
		||||
						// log.Println(dbdata.Allow, v.Ports)
 | 
			
		||||
						return true
 | 
			
		||||
					} else {
 | 
			
		||||
						// log.Println(dbdata.Deny, v.Ports)
 | 
			
		||||
						return false
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,8 @@
 | 
			
		||||
    "qs": "^6.11.1",
 | 
			
		||||
    "vue": "^2.6.11",
 | 
			
		||||
    "vue-count-to": "^1.0.13",
 | 
			
		||||
    "vue-router": "^3.5.2"
 | 
			
		||||
    "vue-router": "^3.5.2",
 | 
			
		||||
    "vuedraggable": "^2.24.3"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@vue/cli-plugin-babel": "~4.5.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -191,7 +191,7 @@
 | 
			
		||||
        :close-on-click-modal="false"
 | 
			
		||||
        title="用户组"
 | 
			
		||||
        :visible.sync="user_edit_dialog"
 | 
			
		||||
        width="750px"
 | 
			
		||||
        width="850px"
 | 
			
		||||
        @close='closeDialog'
 | 
			
		||||
        center>
 | 
			
		||||
 | 
			
		||||
@@ -401,7 +401,8 @@
 | 
			
		||||
            <el-form-item label="权限控制" prop="link_acl">
 | 
			
		||||
              <el-row class="msg-info">
 | 
			
		||||
                <el-col :span="22">输入CIDR格式如: 192.168.3.0/24
 | 
			
		||||
                  端口0表示所有端口,多个端口用','号分隔,连续端口:1234-5678
 | 
			
		||||
                  协议支持 all,tcp,udp,icmp
 | 
			
		||||
                  端口0表示所有端口,多个端口:80,443,连续端口:1234-5678
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                  <el-button size="mini" type="success" icon="el-icon-plus" circle
 | 
			
		||||
@@ -409,9 +410,17 @@
 | 
			
		||||
                </el-col>
 | 
			
		||||
              </el-row>
 | 
			
		||||
 | 
			
		||||
              <!--  添加拖拽功能  -->
 | 
			
		||||
              <draggable v-model="ruleForm.link_acl" handle=".drag-handle" @end="onEnd">
 | 
			
		||||
 | 
			
		||||
              <el-row v-for="(item,index) in ruleForm.link_acl"
 | 
			
		||||
                      :key="index" style="margin-bottom: 5px" :gutter="1">
 | 
			
		||||
                <el-col :span="10">
 | 
			
		||||
 | 
			
		||||
                <el-col :span="1" class="drag-handle">
 | 
			
		||||
                <i class="el-icon-rank"></i>
 | 
			
		||||
                </el-col>
 | 
			
		||||
 | 
			
		||||
                <el-col :span="9">
 | 
			
		||||
                  <el-input placeholder="请输入CIDR地址" v-model="item.val">
 | 
			
		||||
                    <el-select v-model="item.action" slot="prepend">
 | 
			
		||||
                      <el-option label="允许" value="allow"></el-option>
 | 
			
		||||
@@ -419,18 +428,26 @@
 | 
			
		||||
                    </el-select>
 | 
			
		||||
                  </el-input>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="8">
 | 
			
		||||
 | 
			
		||||
                <el-col :span="3">
 | 
			
		||||
                    <el-input placeholder="协议" v-model="item.protocol">
 | 
			
		||||
                </el-col>
 | 
			
		||||
 | 
			
		||||
                <el-col :span="6">
 | 
			
		||||
                  <!--  type="textarea" :autosize="{ minRows: 1, maxRows: 2}"  -->
 | 
			
		||||
                  <el-input v-model="item.port" placeholder="多端口,号分隔"></el-input>
 | 
			
		||||
                </el-col>
 | 
			
		||||
                <el-col :span="4">
 | 
			
		||||
                <el-col :span="3">
 | 
			
		||||
                  <el-input v-model="item.note" placeholder="备注"></el-input>
 | 
			
		||||
                </el-col>
 | 
			
		||||
 | 
			
		||||
                <el-col :span="2">
 | 
			
		||||
                  <el-button size="mini" type="danger" icon="el-icon-minus" circle
 | 
			
		||||
                             @click.prevent="removeDomain(ruleForm.link_acl,index)"></el-button>
 | 
			
		||||
                </el-col>
 | 
			
		||||
              </el-row>
 | 
			
		||||
              </draggable>
 | 
			
		||||
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-tab-pane>
 | 
			
		||||
 | 
			
		||||
@@ -505,10 +522,11 @@
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import axios from "axios";
 | 
			
		||||
import draggable from 'vuedraggable'
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "List",
 | 
			
		||||
  components: {},
 | 
			
		||||
  components: {draggable},
 | 
			
		||||
  mixins: [],
 | 
			
		||||
  created() {
 | 
			
		||||
    this.$emit('update:route_path', this.$route.path)
 | 
			
		||||
@@ -614,6 +632,9 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    onEnd: function() {
 | 
			
		||||
       window.console.log("onEnd", this.ruleForm.link_acl);
 | 
			
		||||
    },
 | 
			
		||||
    setAuthData(row) {
 | 
			
		||||
      if (!row) {
 | 
			
		||||
        this.ruleForm.auth = JSON.parse(JSON.stringify(this.defAuth));
 | 
			
		||||
@@ -692,7 +713,7 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
    addDomain(arr) {
 | 
			
		||||
      console.log("arr", arr)
 | 
			
		||||
      arr.push({val: "", action: "allow", port: "0", note: ""});
 | 
			
		||||
      arr.push({protocol:"all", val: "", action: "allow", port: "0", note: ""});
 | 
			
		||||
    },
 | 
			
		||||
    submitForm(formName) {
 | 
			
		||||
      this.$refs[formName].validate((valid) => {
 | 
			
		||||
@@ -899,4 +920,9 @@ export default {
 | 
			
		||||
  flex: 1;
 | 
			
		||||
  overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.drag-handle {
 | 
			
		||||
  cursor: move;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -7793,6 +7793,11 @@ sort-keys@^1.0.0:
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-plain-obj "^1.0.0"
 | 
			
		||||
 | 
			
		||||
sortablejs@1.10.2:
 | 
			
		||||
  version "1.10.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290"
 | 
			
		||||
  integrity sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==
 | 
			
		||||
 | 
			
		||||
source-list-map@^2.0.0:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
 | 
			
		||||
@@ -8775,6 +8780,13 @@ vue@^2.6.11:
 | 
			
		||||
    "@vue/compiler-sfc" "2.7.16"
 | 
			
		||||
    csstype "^3.1.0"
 | 
			
		||||
 | 
			
		||||
vuedraggable@^2.24.3:
 | 
			
		||||
  version "2.24.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.24.3.tgz#43c93849b746a24ce503e123d5b259c701ba0d19"
 | 
			
		||||
  integrity sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    sortablejs "1.10.2"
 | 
			
		||||
 | 
			
		||||
watchpack-chokidar2@^2.0.1:
 | 
			
		||||
  version "2.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user