/
util.go
138 lines (126 loc) · 3.34 KB
/
util.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
package baidupcs
import (
"crypto/md5"
"errors"
"fmt"
"github.com/qjfoidnh/BaiduPCS-Go/baidupcs/pcserror"
"github.com/qjfoidnh/BaiduPCS-Go/pcsutil"
"github.com/qjfoidnh/BaiduPCS-Go/pcsutil/converter"
"io"
"path"
"regexp"
"strconv"
"strings"
"time"
)
// Isdir 检查路径在网盘中是否为目录
func (pcs *BaiduPCS) Isdir(pcspath string) (fileSize int64, isdir bool, pcsError pcserror.Error) {
if path.Clean(pcspath) == PathSeparator {
return 0, true, nil
}
f, pcsError := pcs.FilesDirectoriesMeta(pcspath)
if pcsError != nil {
return 0, false, pcsError
}
return f.Size, f.Isdir, nil
}
func (pcs *BaiduPCS) CheckIsdir(op string, targetPath string, policy string, fileSize int64) pcserror.Error {
// 检测文件是否存在于网盘路径
// 很重要, 如果文件存在会直接覆盖!!! 即使是根目录!
onlineSize, isdir, pcsError := pcs.Isdir(targetPath)
if pcsError != nil {
// 忽略远程服务端返回的错误
if pcsError.GetErrType() != pcserror.ErrTypeRemoteError {
return pcsError
}
}
errInfo := pcserror.NewPCSErrorInfo(op)
if isdir {
errInfo.ErrType = pcserror.ErrTypeOthers
errInfo.Err = errors.New("保存路径不可以覆盖目录")
return errInfo
}
// 如果存在文件, 则根据upload策略选择返回的错误码
if pcsError == nil {
switch policy {
case "fail":
errInfo.ErrCode = 114514
errInfo.ErrType = pcserror.ErrTypeRemoteError
errInfo.ErrMsg = "目标位置存在同名文件"
return errInfo
case "skip":
errInfo.ErrCode = 114514
errInfo.ErrMsg = "目标位置存在同名文件"
errInfo.ErrType = pcserror.ErrTypeRemoteError
return errInfo
case "rsync":
if onlineSize == fileSize {
errInfo.ErrCode = 1919810
errInfo.ErrMsg = "目标位置文件大小与源文件一致"
errInfo.ErrType = pcserror.ErrTypeRemoteError
return errInfo
}
default:
return nil
}
}
return nil
}
func mergeStringList(a ...string) string {
s := strings.Join(a, `","`)
return `["` + s + `"]`
}
func mergeInt64List(si ...int64) string {
i := converter.SliceInt64ToString(si)
s := strings.Join(i, ",")
return "[" + s + "]"
}
func allRelatedDir(pcspaths []string) (dirs []string) {
for _, pcspath := range pcspaths {
pathDir := path.Dir(pcspath)
if !pcsutil.ContainsString(dirs, pathDir) {
dirs = append(dirs, pathDir)
}
}
return
}
func CreatePasswd() string {
t := time.Now()
h := md5.New()
io.WriteString(h, "Asswecan")
io.WriteString(h, t.String())
passwd := fmt.Sprintf("%x", h.Sum(nil))
return passwd[0:4]
}
// GetHTTPScheme 获取 http 协议, https 或 http
func GetHTTPScheme(https bool) (scheme string) {
if https {
return "https"
}
return "http"
}
func DecryptMD5(rawMD5 string) string {
if len(rawMD5) != 32 {
return rawMD5
}
var keychar string = rawMD5[9:10]
match, _ := regexp.MatchString("[a-f0-9]", keychar)
if match {
return rawMD5
}
sliceFirst := fmt.Sprintf("%x", []rune(rawMD5)[9] -'g')
sliceSecond := rawMD5[0:9] + sliceFirst + rawMD5[10:]
sliceThird := ""
for i := 0; i < len(sliceSecond); i++ {
if sliceSecond[i:i+1] == "-" {
sliceThird += fmt.Sprintf("%x", 15 & i)
continue
}
num, err := strconv.ParseInt(sliceSecond[i:i+1], 16, 64)
if err != nil {
return rawMD5
}
sliceThird += fmt.Sprintf("%x", int(num) ^ (15 & i))
}
return sliceThird[8:16] + sliceThird[0:8] + sliceThird[24:32] + sliceThird[16:24]
}