Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/drivers/189/help.go
1987 views
1
package _189
2
3
import (
4
"bytes"
5
"crypto/aes"
6
"crypto/hmac"
7
"crypto/md5"
8
"crypto/rand"
9
"crypto/rsa"
10
"crypto/sha1"
11
"crypto/x509"
12
"encoding/base64"
13
"encoding/hex"
14
"encoding/pem"
15
"fmt"
16
"net/url"
17
"regexp"
18
"strconv"
19
"strings"
20
21
myrand "github.com/alist-org/alist/v3/pkg/utils/random"
22
log "github.com/sirupsen/logrus"
23
)
24
25
func random() string {
26
return fmt.Sprintf("0.%17v", myrand.Rand.Int63n(100000000000000000))
27
}
28
29
func RsaEncode(origData []byte, j_rsakey string, hex bool) string {
30
publicKey := []byte("-----BEGIN PUBLIC KEY-----\n" + j_rsakey + "\n-----END PUBLIC KEY-----")
31
block, _ := pem.Decode(publicKey)
32
pubInterface, _ := x509.ParsePKIXPublicKey(block.Bytes)
33
pub := pubInterface.(*rsa.PublicKey)
34
b, err := rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
35
if err != nil {
36
log.Errorf("err: %s", err.Error())
37
}
38
res := base64.StdEncoding.EncodeToString(b)
39
if hex {
40
return b64tohex(res)
41
}
42
return res
43
}
44
45
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
46
47
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"
48
49
func int2char(a int) string {
50
return strings.Split(BI_RM, "")[a]
51
}
52
53
func b64tohex(a string) string {
54
d := ""
55
e := 0
56
c := 0
57
for i := 0; i < len(a); i++ {
58
m := strings.Split(a, "")[i]
59
if m != "=" {
60
v := strings.Index(b64map, m)
61
if 0 == e {
62
e = 1
63
d += int2char(v >> 2)
64
c = 3 & v
65
} else if 1 == e {
66
e = 2
67
d += int2char(c<<2 | v>>4)
68
c = 15 & v
69
} else if 2 == e {
70
e = 3
71
d += int2char(c)
72
d += int2char(v >> 2)
73
c = 3 & v
74
} else {
75
e = 0
76
d += int2char(c<<2 | v>>4)
77
d += int2char(15 & v)
78
}
79
}
80
}
81
if e == 1 {
82
d += int2char(c << 2)
83
}
84
return d
85
}
86
87
func qs(form map[string]string) string {
88
f := make(url.Values)
89
for k, v := range form {
90
f.Set(k, v)
91
}
92
return EncodeParam(f)
93
//strList := make([]string, 0)
94
//for k, v := range form {
95
// strList = append(strList, fmt.Sprintf("%s=%s", k, url.QueryEscape(v)))
96
//}
97
//return strings.Join(strList, "&")
98
}
99
100
func EncodeParam(v url.Values) string {
101
if v == nil {
102
return ""
103
}
104
var buf strings.Builder
105
keys := make([]string, 0, len(v))
106
for k := range v {
107
keys = append(keys, k)
108
}
109
for _, k := range keys {
110
vs := v[k]
111
for _, v := range vs {
112
if buf.Len() > 0 {
113
buf.WriteByte('&')
114
}
115
buf.WriteString(k)
116
buf.WriteByte('=')
117
//if k == "fileName" {
118
// buf.WriteString(encode(v))
119
//} else {
120
buf.WriteString(v)
121
//}
122
}
123
}
124
return buf.String()
125
}
126
127
func encode(str string) string {
128
//str = strings.ReplaceAll(str, "%", "%25")
129
//str = strings.ReplaceAll(str, "&", "%26")
130
//str = strings.ReplaceAll(str, "+", "%2B")
131
//return str
132
return url.QueryEscape(str)
133
}
134
135
func AesEncrypt(data, key []byte) []byte {
136
block, _ := aes.NewCipher(key)
137
if block == nil {
138
return []byte{}
139
}
140
data = PKCS7Padding(data, block.BlockSize())
141
decrypted := make([]byte, len(data))
142
size := block.BlockSize()
143
for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size {
144
block.Encrypt(decrypted[bs:be], data[bs:be])
145
}
146
return decrypted
147
}
148
149
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
150
padding := blockSize - len(ciphertext)%blockSize
151
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
152
return append(ciphertext, padtext...)
153
}
154
155
func hmacSha1(data string, secret string) string {
156
h := hmac.New(sha1.New, []byte(secret))
157
h.Write([]byte(data))
158
return hex.EncodeToString(h.Sum(nil))
159
}
160
161
func getMd5(data []byte) []byte {
162
h := md5.New()
163
h.Write(data)
164
return h.Sum(nil)
165
}
166
167
func decodeURIComponent(str string) string {
168
r, _ := url.PathUnescape(str)
169
//r = strings.ReplaceAll(r, " ", "+")
170
return r
171
}
172
173
func Random(v string) string {
174
reg := regexp.MustCompilePOSIX("[xy]")
175
data := reg.ReplaceAllFunc([]byte(v), func(msg []byte) []byte {
176
var i int64
177
t := int64(16 * myrand.Rand.Float32())
178
if msg[0] == 120 {
179
i = t
180
} else {
181
i = 3&t | 8
182
}
183
return []byte(strconv.FormatInt(i, 16))
184
})
185
return string(data)
186
}
187
188