-
Notifications
You must be signed in to change notification settings - Fork 99
/
signurl.go
240 lines (190 loc) · 7.64 KB
/
signurl.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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
package lib
import (
"fmt"
"strings"
oss "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
var specChineseSignurl = SpecText{
synopsisText: "生成object下载链接",
paramText: "cloud_url [meta] [options]",
syntaxText: `
ossutil sign cloud_url [--timeout t] [--version-id versionId] [--trafic-limit limitSpeed] [--disable-encode-slash] [--payer requester] [--query-param key:value]
`,
detailHelpText: `
该命令签名用户指定的cloud_url,生成经过签名的url可供第三方用户访问object,其中cloud_url
必须为形如:oss://bucket/object的cloud_url,bucket和object不可缺少。通过--timeout选项指
定url的过期时间,默认为60s。通过--version-id选项指定版本号。
用法:
ossutil sign oss://bucket/object [--timeout t] [--version-id versionId] [--trafic-limit limitSpeed] [--disable-encode-slash] [--payer requester] [--query-param key:value]
`,
sampleText: `
ossutil sign oss://bucket1/object1
生成oss://bucket1/object1的签名url,超时时间60s
ossutil sign oss://bucket1/object1 --timeout 300
生成oss://bucket1/object1的签名url,超时时间300s
ossutil sign oss://tempb1/test%20a%2Bb' --encoding-type url
生成oss://tempb1/'test a+b'的签名url,超时时间60s
ossutil sign oss://bucket1/object1 --version-id versionId
生成指定版本的 oss://bucket1/object1的签名url,超时时间60s
ossutil sign oss://bucket1/object1 --trafic-limit 8388608
生成oss://bucket1/object1的签名url, http限速为8388608(bit/s)
ossutil sign oss://bucket1/dir/object1 --disable-encode-slash
生成oss://bucket1/dir/object1的签名url, 对path中的'/'不进行编码
ossutil sign oss://bucket1/object1 --payer requester
生成oss://bucket1/dir/object1的签名url, 使用访问者付费模式
ossutil sign oss://bucket1/object1.jpg --query-param x-oss-process:image/resize,m_fixed,w_100,h_100/rotate,90
生成处理过的图片 oss://bucket1/dir/object1.jpg的签名url
`,
}
var specEnglishSignurl = SpecText{
synopsisText: "Generate download link for object",
paramText: "cloud_url [options]",
syntaxText: `
ossutil sign cloud_url [--timeout t] [--version-id versionId] [--trafic-limit limitSpeed] [--disable-encode-slash] [--payer requester] [--query-param key:value]
`,
detailHelpText: `
The command will generate signature for user specified cloud_url. This signed url can
be used by third-party to access the object.
Where, cloud_url must like: oss://bucket/object
Use --timeout to specify the expire time of url, the default is 60s.
Use --version-id to specify the version.
Use --trafic-limit to specify the trafic speed
use --disable-encode-slash to specify not encoding of '/' in url path section
use --payer to specify request payment
use --query-param to specify the query parameters, can be passed multiple times.
Usage:
ossutil sign oss://bucket/object [--timeout t] [--version-id versionId] [--trafic-limit limitSpeed] [--disable-encode-slash] [--payer requester] [--query-param key:value]
`,
sampleText: `
ossutil sign oss://bucket1/object1
Generate the signature of oss://bucket1/object1 with expire time 60s
ossutil sign oss://bucket1/object1 --timeout 300
Generate the signature of oss://bucket1/object1 with expire time 300s
ossutil sign oss://tempb1/test%20a%2Bb' --encoding-type url
Generate the signature of oss://tempb1/'test a+b' with expire time 60s
ossutil sign oss://bucket1/object1 --version-id versionId
Generate the signature of a specific version of oss://bucket1/object1 with expire time 60s
ossutil sign oss://bucket1/object1 --trafic-limit 8388608
Generate the signature of oss://bucket1/object1, http limit speed is 8388608(bit/s)
ossutil sign oss://bucket1/dir/object1 --disable-encode-slash
Generate the signature of oss://bucket1/dir/object1,no encoding of '/' in url path section
ossutil sign oss://bucket1/object1 --payer requester
Generate the signature of oss://bucket1/object1, use requester payment
ossutil sign oss://bucket1/object1.jpg --query-param x-oss-process:image/resize,m_fixed,w_100,h_100/rotate,90
Generate the signature of processed picture oss://bucket1/dir/object1.jpg
`,
}
// SignurlCommand definition
type SignurlCommand struct {
command Command
signUrl string
}
var signURLCommand = SignurlCommand{
command: Command{
name: "sign",
nameAlias: []string{},
minArgc: 1,
maxArgc: 1,
specChinese: specChineseSignurl,
specEnglish: specEnglishSignurl,
group: GroupTypeNormalCommand,
validOptionNames: []string{
OptionTimeout,
OptionEncodingType,
OptionConfigFile,
OptionEndpoint,
OptionAccessKeyID,
OptionAccessKeySecret,
OptionSTSToken,
OptionLogLevel,
OptionVersionId,
OptionTrafficLimit,
OptionDisableEncodeSlash,
OptionRequestPayer,
//General options
OptionPassword,
OptionMode,
OptionECSRoleName,
OptionTokenTimeout,
OptionRamRoleArn,
OptionRoleSessionName,
OptionSTSRegion,
OptionUserAgent,
OptionQueryParam,
},
},
}
// function for FormatHelper interface
func (sc *SignurlCommand) formatHelpForWhole() string {
return sc.command.formatHelpForWhole()
}
func (sc *SignurlCommand) formatIndependHelp() string {
return sc.command.formatIndependHelp()
}
// Init simulate inheritance, and polymorphism
func (sc *SignurlCommand) Init(args []string, options OptionMapType) error {
return sc.command.Init(args, options, sc)
}
// RunCommand simulate inheritance, and polymorphism
func (sc *SignurlCommand) RunCommand() error {
encodingType, _ := GetString(OptionEncodingType, sc.command.options)
cloudURL, err := ObjectURLFromString(sc.command.args[0], encodingType)
if err != nil {
return err
}
timeout, _ := GetInt(OptionTimeout, sc.command.options)
versionId, _ := GetString(OptionVersionId, sc.command.options)
trafficLimit, getErr := GetInt(OptionTrafficLimit, sc.command.options)
if getErr == nil && trafficLimit < 0 {
return fmt.Errorf("Option value of --trafic-limit must be greater than 0")
}
payer, _ := GetString(OptionRequestPayer, sc.command.options)
if payer != "" && payer != strings.ToLower(string(oss.Requester)) {
return fmt.Errorf("invalid request payer: %s, please check", payer)
}
query, _ := GetStrings(OptionQueryParam, sc.command.options)
bucket, err := sc.command.ossBucket(cloudURL.bucket)
if err != nil {
return err
}
var options []oss.Option
if len(versionId) > 0 {
options = append(options, oss.VersionId(versionId))
}
if trafficLimit > 0 {
options = append(options, oss.TrafficLimitParam(trafficLimit))
}
if payer != "" {
options = append(options, oss.RequestPayerParam(oss.PayerType(payer)))
}
if len(query) > 0 {
options, err = AddStringsToOption(query, options)
if err != nil {
return err
}
}
str, err := sc.ossSign(bucket, cloudURL.object, timeout, options...)
if err != nil {
return err
}
sc.signUrl = str
fmt.Println(str)
return nil
}
func (sc *SignurlCommand) ossSign(bucket *oss.Bucket, object string, timeout int64, options ...oss.Option) (string, error) {
str, err := bucket.SignURL(object, oss.HTTPMethod(DefaultMethod), timeout, options...)
if err != nil {
return str, ObjectError{err, bucket.BucketName, object}
}
disableEncodeSlash, _ := GetBool(OptionDisableEncodeSlash, sc.command.options)
if !disableEncodeSlash {
return str, nil
}
// replace %2F with /
urlSlice := strings.SplitN(str, "?", 2)
headStr := strings.Replace(urlSlice[0], "%2F", "/", -1)
if len(urlSlice) == 2 {
str = headStr + "?" + urlSlice[1]
}
return str, nil
}