-
Notifications
You must be signed in to change notification settings - Fork 0
/
func.go
195 lines (181 loc) · 4.49 KB
/
func.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
package vweb
import(
"strings"
"time"
"crypto/rand"
mathRand "math/rand"
"os"
"path"
"github.com/456vv/verror"
"fmt"
)
//derogatoryDomain 贬域名
// host string host地址
// f func(string) bool 调用 f 函数,并传入贬域名
func derogatoryDomain(host string, f func(string) bool){
//先全字匹配
if f(host) {
return
}
//后通配符匹配
pos := strings.Index(host, ":")
var port string
if pos >= 0 {
port = host[pos:]
host = host[:pos]
}
labels := strings.Split(host, ".")
for i := range labels {
labels[i]="*"
candidate := strings.Join(labels, ".")+port
if f(candidate) {
break
}
}
}
//equalDomain 贬域名
// host string host地址
// domain string 贬域名
// ok bool 如果相等,返回true
func equalDomain(host, domain string) (ok bool) {
derogatoryDomain(host, func(d string) bool {
ok = (d == domain)
return ok
})
return
}
//GenerateRandomId 生成标识符
// []byte 生成的标识符
// err error 错误
func GenerateRandomId(rnd []byte) error {
if rnd == nil {
return verror.TrackErrorf("vweb: The parameter is nil, unable to generate random data!")
}
if _, err := rand.Read(rnd); err != nil {
//当系统随机API函数不可用,将使用备用随机数。
//该功能在效力上也不理想。
//这可能是在万分之一的情况下使用到。
source := mathRand.NewSource(0)
rr := mathRand.New(source)
for i:=0; i<len(rnd); i++ {
rr.Seed(time.Now().UnixNano()+int64(i))
r := rr.Int()
rnd[i]=byte(r)
}
}
return nil
}
//GenerateRandom 生成标识符
// length int 长度
// []byte 生成的标识符
// err error 错误
func GenerateRandom(length int) ([]byte, error){
rnd := make([]byte, length)
err := GenerateRandomId(rnd)
if err != nil {
return nil, err
}
encodeLength := len(encodeStd)
for i:=0;i<length;i++{
pos := int(rnd[i]) % encodeLength
rnd[i]=encodeStd[pos]
}
return rnd, nil
}
//GenerateRandomString 生成标识符
// length int 长度
// string 生成的标识符
// err error 错误
func GenerateRandomString(length int) (string, error){
r, err := GenerateRandom(length)
return string(r), err
}
//AddSalt 加盐
// rnd []byte 标识字节串
// salt string 盐
// string 标识符
func AddSalt(rnd []byte, salt string) string {
var (
start int
sl = len(salt)
encodeLength = len(encodeStd)
)
if sl != 0 {
for i:=0; i<len(rnd); i++ {
pos := int(rnd[i] ^ salt[start]) % encodeLength
rnd[i] = encodeStd[pos]
start++
if start == sl {
start = 0
}
}
}else{
for i:=0; i<len(rnd); i++ {
pos := int(rnd[i]) % encodeLength
rnd[i] = encodeStd[pos]
}
}
return string(rnd)
}
//PagePath 页路径
// root string 根目录
// p string 路径
// index []string 索引文件名
// os.FileInfo 文件信息
// string 路径
// error 错误,如果文件不存在
func PagePath(root, p string, index []string) (os.FileInfo, string, error) {
var (
isDir = strings.HasSuffix(p, "/")
fi os.FileInfo
errStr = "Access (%s) page document does not exist!"
err error
//为了防止跨目录,这里清除 /../ok/index.html 路径为 \ok\index.html,保证安全。
pc = path.Clean(p)
pi string //path+fileName
)
if !isDir {
fi, err = os.Stat(path.Join(root, pc))
if err != nil {
return nil, "", fmt.Errorf(errStr, p)
}
isDir = fi.IsDir()
if !isDir {
//是文件
return fi, pc, nil
}
}
//是目录,查找默认索引文件
for _, v := range index {
pi = path.Join(pc, v)
fi, err = os.Stat(path.Join(root, pi))
if err == nil && !fi.IsDir() {
return fi, pi, nil
}
}
return nil, "", fmt.Errorf(errStr, p)
}
func delay(wait, maxDelay time.Duration) time.Duration {
if wait == 0 {
wait = (maxDelay/100)
}else{
wait *= 2
}
if wait >= maxDelay {
wait = maxDelay
}
time.Sleep(wait)
return wait
}
//ExecFunc 执行函数调用
// call interface{} 函数
// args ... interface{} 参数或更多个函数是函数的参数
// []interface{} 返回直
// error 错误
func ExecFunc(f interface{}, args ...interface{}) ([]interface{}, error) {
var ef ExecCall
if err := ef.Func(f, args...); err != nil {
return nil, err
}
return ef.Exec(), nil
}