@@ -39,11 +39,17 @@ function getService(params, callback) {
39
39
domain = protocol + '//service.cos.myqcloud.com' ;
40
40
}
41
41
42
+ var SignHost = '' ;
43
+ var standardHost = region ? 'cos.' + region + '.myqcloud.com' : 'service.cos.myqcloud.com' ;
44
+ var urlHost = domain . replace ( / ^ h t t p s ? : \/ \/ ( [ ^ / ] + ) ( \/ .* ) ? $ / , '$1' ) ;
45
+ if ( standardHost === urlHost ) SignHost = standardHost ;
46
+
42
47
submitRequest . call ( this , {
43
48
Action : 'name/cos:GetService' ,
44
49
url : domain ,
45
50
method : 'GET' ,
46
51
headers : params . Headers ,
52
+ SignHost : SignHost ,
47
53
} , function ( err , data ) {
48
54
if ( err ) return callback ( err ) ;
49
55
var buckets = ( data && data . ListAllMyBucketsResult && data . ListAllMyBucketsResult . Buckets
@@ -3022,6 +3028,8 @@ function getAuth(params) {
3022
3028
return util . getAuth ( {
3023
3029
SecretId : params . SecretId || this . options . SecretId || '' ,
3024
3030
SecretKey : params . SecretKey || this . options . SecretKey || '' ,
3031
+ Bucket : params . Bucket ,
3032
+ Region : params . Region ,
3025
3033
Method : params . Method ,
3026
3034
Key : params . Key ,
3027
3035
Query : params . Query ,
@@ -3067,19 +3075,27 @@ function getObjectUrl(params, callback) {
3067
3075
3068
3076
var queryParamsStr = '' ;
3069
3077
if ( params . Query ) {
3070
- queryParamsStr += util . obj2str ( params . Query ) ;
3078
+ queryParamsStr += util . obj2str ( params . Query ) ;
3071
3079
}
3072
3080
if ( params . QueryString ) {
3073
- queryParamsStr += ( queryParamsStr ? '&' : '' ) + params . QueryString ;
3081
+ queryParamsStr += ( queryParamsStr ? '&' : '' ) + params . QueryString ;
3074
3082
}
3075
3083
3084
+ // 签名加上 Host,避免跨桶访问
3085
+ var SignHost = '' ;
3086
+ var standardHost = 'cos.' + params . Region + '.myqcloud.com' ;
3087
+ if ( ! self . options . ForcePathStyle ) standardHost = params . Bucket + '.' + standardHost ;
3088
+ var urlHost = url . replace ( / ^ h t t p s ? : \/ \/ ( [ ^ / ] + ) ( \/ .* ) ? $ / , '$1' ) ;
3089
+ if ( standardHost === urlHost ) SignHost = standardHost ;
3090
+
3076
3091
var syncUrl = url ;
3077
3092
if ( params . Sign !== undefined && ! params . Sign ) {
3078
3093
queryParamsStr && ( syncUrl += '?' + queryParamsStr ) ;
3079
3094
callback ( null , { Url : syncUrl } ) ;
3080
3095
return syncUrl ;
3081
3096
}
3082
3097
3098
+ var SignHost = getSignHost . call ( this , { Bucket : params . Bucket , Region : params . Region , Url : url } ) ;
3083
3099
var AuthData = getAuthorizationAsync . call ( this , {
3084
3100
Action : ( ( params . Method || '' ) . toUpperCase ( ) === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject' ) ,
3085
3101
Bucket : params . Bucket || '' ,
@@ -3088,7 +3104,8 @@ function getObjectUrl(params, callback) {
3088
3104
Key : params . Key ,
3089
3105
Expires : params . Expires ,
3090
3106
Headers : params . Headers ,
3091
- Query : params . Query
3107
+ Query : params . Query ,
3108
+ SignHost : SignHost ,
3092
3109
} , function ( err , AuthData ) {
3093
3110
if ( ! callback ) return ;
3094
3111
if ( err ) {
@@ -3234,14 +3251,36 @@ function getUrl(params) {
3234
3251
return url ;
3235
3252
}
3236
3253
3254
+ var getSignHost = function ( opt ) {
3255
+ if ( ! opt . Bucket || ! opt . Bucket ) return '' ;
3256
+ var ps = this . options . ForcePathStyle ;
3257
+ var url = opt . Url || getUrl ( {
3258
+ ForcePathStyle : ps ,
3259
+ protocol : this . options . Protocol ,
3260
+ domain : this . options . Domain ,
3261
+ bucket : opt . Bucket ,
3262
+ region : opt . Region ,
3263
+ } ) ;
3264
+ var standardHost = ( ps ? '' : opt . Bucket + '.' ) + 'cos.' + opt . Region + '.myqcloud.com' ;
3265
+ var urlHost = url . replace ( / ^ h t t p s ? : \/ \/ ( [ ^ / ] + ) ( \/ .* ) ? $ / , '$1' ) ;
3266
+ if ( standardHost === urlHost ) return standardHost ;
3267
+ return '' ;
3268
+ }
3269
+
3237
3270
// 异步获取签名
3238
3271
function getAuthorizationAsync ( params , callback ) {
3239
3272
3240
3273
var headers = util . clone ( params . Headers ) ;
3274
+ var headerHost = '' ;
3241
3275
util . each ( headers , function ( v , k ) {
3242
3276
( v === '' || [ 'content-type' , 'cache-control' , 'expires' ] . indexOf ( k . toLowerCase ( ) ) > - 1 ) && delete headers [ k ] ;
3277
+ if ( k . toLowerCase ( ) === 'host' ) headerHost = v ;
3243
3278
} ) ;
3244
3279
3280
+ // Host 加入签名计算
3281
+ if ( ! headerHost && params . SignHost ) headers . Host = params . SignHost ;
3282
+
3283
+
3245
3284
// 获取凭证的回调,避免用户 callback 多次
3246
3285
var cbDone = false ;
3247
3286
var cb = function ( err , AuthData ) {
@@ -3479,6 +3518,7 @@ function submitRequest(params, callback) {
3479
3518
var Query = util . clone ( params . qs ) ;
3480
3519
params . action && ( Query [ params . action ] = '' ) ;
3481
3520
3521
+ var SignHost = params . SignHost || getSignHost . call ( this , { Bucket : params . Bucket , Region : params . Region } ) ;
3482
3522
var next = function ( tryTimes ) {
3483
3523
var oldClockOffset = self . options . SystemClockOffset ;
3484
3524
getAuthorizationAsync . call ( self , {
@@ -3488,6 +3528,7 @@ function submitRequest(params, callback) {
3488
3528
Key : params . Key ,
3489
3529
Query : Query ,
3490
3530
Headers : params . headers ,
3531
+ SignHost : SignHost ,
3491
3532
Action : params . Action ,
3492
3533
ResourceKey : params . ResourceKey ,
3493
3534
Scope : params . Scope ,
0 commit comments