@@ -35,11 +35,17 @@ function getService(params, callback) {
35
35
domain = protocol + '//service.cos.myqcloud.com' ;
36
36
}
37
37
38
+ var SignHost = '' ;
39
+ var standardHost = region ? 'cos.' + region + '.myqcloud.com' : 'service.cos.myqcloud.com' ;
40
+ var urlHost = domain . replace ( / ^ h t t p s ? : \/ \/ ( [ ^ / ] + ) ( \/ .* ) ? $ / , '$1' ) ;
41
+ if ( standardHost === urlHost ) SignHost = standardHost ;
42
+
38
43
submitRequest . call ( this , {
39
44
Action : 'name/cos:GetService' ,
40
45
url : domain ,
41
46
method : 'GET' ,
42
47
headers : params . Headers ,
48
+ SignHost : SignHost ,
43
49
} , function ( err , data ) {
44
50
if ( err ) return callback ( err ) ;
45
51
var buckets = ( data && data . ListAllMyBucketsResult && data . ListAllMyBucketsResult . Buckets
@@ -2958,6 +2964,8 @@ function getAuth(params) {
2958
2964
return util . getAuth ( {
2959
2965
SecretId : params . SecretId || this . options . SecretId || '' ,
2960
2966
SecretKey : params . SecretKey || this . options . SecretKey || '' ,
2967
+ Bucket : params . Bucket ,
2968
+ Region : params . Region ,
2961
2969
Method : params . Method ,
2962
2970
Key : params . Key ,
2963
2971
Query : params . Query ,
@@ -2999,13 +3007,21 @@ function getObjectUrl(params, callback) {
2999
3007
queryParamsStr += ( queryParamsStr ? '&' : '' ) + params . QueryString ;
3000
3008
}
3001
3009
3010
+ // 签名加上 Host,避免跨桶访问
3011
+ var SignHost = '' ;
3012
+ var standardHost = 'cos.' + params . Region + '.myqcloud.com' ;
3013
+ if ( ! self . options . ForcePathStyle ) standardHost = params . Bucket + '.' + standardHost ;
3014
+ var urlHost = url . replace ( / ^ h t t p s ? : \/ \/ ( [ ^ / ] + ) ( \/ .* ) ? $ / , '$1' ) ;
3015
+ if ( standardHost === urlHost ) SignHost = standardHost ;
3016
+
3002
3017
var syncUrl = url ;
3003
3018
if ( params . Sign !== undefined && ! params . Sign ) {
3004
3019
queryParamsStr && ( syncUrl += '?' + queryParamsStr ) ;
3005
3020
callback ( null , { Url : syncUrl } ) ;
3006
3021
return syncUrl ;
3007
3022
}
3008
-
3023
+
3024
+ var SignHost = getSignHost . call ( this , { Bucket : params . Bucket , Region : params . Region , Url : url } ) ;
3009
3025
var AuthData = getAuthorizationAsync . call ( this , {
3010
3026
Action : ( ( params . Method || '' ) . toUpperCase ( ) === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject' ) ,
3011
3027
Bucket : params . Bucket || '' ,
@@ -3015,6 +3031,7 @@ function getObjectUrl(params, callback) {
3015
3031
Expires : params . Expires ,
3016
3032
Headers : params . Headers ,
3017
3033
Query : params . Query ,
3034
+ SignHost : SignHost ,
3018
3035
} , function ( err , AuthData ) {
3019
3036
if ( ! callback ) return ;
3020
3037
if ( err ) {
@@ -3033,7 +3050,6 @@ function getObjectUrl(params, callback) {
3033
3050
callback ( null , { Url : signUrl } ) ;
3034
3051
} ) ;
3035
3052
} ) ;
3036
-
3037
3053
if ( AuthData ) {
3038
3054
syncUrl += '?' + AuthData . Authorization +
3039
3055
( AuthData . SecurityToken ? '&x-cos-security-token=' + AuthData . SecurityToken : '' ) ;
@@ -3044,7 +3060,6 @@ function getObjectUrl(params, callback) {
3044
3060
return syncUrl ;
3045
3061
}
3046
3062
3047
-
3048
3063
/**
3049
3064
* 私有方法
3050
3065
*/
@@ -3163,14 +3178,35 @@ function getUrl(params) {
3163
3178
return url ;
3164
3179
}
3165
3180
3181
+ var getSignHost = function ( opt ) {
3182
+ if ( ! opt . Bucket || ! opt . Bucket ) return '' ;
3183
+ var url = opt . Url || getUrl ( {
3184
+ ForcePathStyle : this . options . ForcePathStyle ,
3185
+ protocol : this . options . Protocol ,
3186
+ domain : this . options . Domain ,
3187
+ bucket : opt . Bucket ,
3188
+ region : opt . Region ,
3189
+ } ) ;
3190
+ var urlHost = url . replace ( / ^ h t t p s ? : \/ \/ ( [ ^ / ] + ) ( \/ .* ) ? $ / , '$1' ) ;
3191
+ var standardHostReg = new RegExp ( '^([a-z\\d-]+-\\d+\\.)?(cos|cosv6|ci|pic)\\.([a-z\\d-]+)\\.myqcloud\\.com$' ) ;
3192
+ if ( standardHostReg . test ( urlHost ) ) return urlHost ;
3193
+ return '' ;
3194
+ }
3195
+
3196
+
3166
3197
// 异步获取签名
3167
3198
function getAuthorizationAsync ( params , callback ) {
3168
3199
3169
3200
var headers = util . clone ( params . Headers ) ;
3201
+ var headerHost = '' ;
3170
3202
util . each ( headers , function ( v , k ) {
3171
3203
( v === '' || [ 'content-type' , 'cache-control' , 'expires' ] . indexOf ( k . toLowerCase ( ) ) > - 1 ) && delete headers [ k ] ;
3204
+ if ( k . toLowerCase ( ) === 'host' ) headerHost = v ;
3172
3205
} ) ;
3173
3206
3207
+ // Host 加入签名计算
3208
+ if ( ! headerHost && params . SignHost ) headers . Host = params . SignHost ;
3209
+
3174
3210
// 获取凭证的回调,避免用户 callback 多次
3175
3211
var cbDone = false ;
3176
3212
var cb = function ( err , AuthData ) {
@@ -3405,6 +3441,8 @@ function submitRequest(params, callback) {
3405
3441
var Query = util . clone ( params . qs ) ;
3406
3442
params . action && ( Query [ params . action ] = '' ) ;
3407
3443
3444
+ var paramsUrl = params . url || params . Url ;
3445
+ var SignHost = params . SignHost || getSignHost . call ( this , { Bucket : params . Bucket , Region : params . Region , Url : paramsUrl } ) ;
3408
3446
var next = function ( tryTimes ) {
3409
3447
var oldClockOffset = self . options . SystemClockOffset ;
3410
3448
getAuthorizationAsync . call ( self , {
@@ -3414,6 +3452,7 @@ function submitRequest(params, callback) {
3414
3452
Key : params . Key ,
3415
3453
Query : Query ,
3416
3454
Headers : params . headers ,
3455
+ SignHost : SignHost ,
3417
3456
Action : params . Action ,
3418
3457
ResourceKey : params . ResourceKey ,
3419
3458
Scope : params . Scope ,
0 commit comments