@@ -39,11 +39,17 @@ function getService(params, callback) {
3939 domain = protocol + '//service.cos.myqcloud.com' ;
4040 }
4141
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+
4247 submitRequest . call ( this , {
4348 Action : 'name/cos:GetService' ,
4449 url : domain ,
4550 method : 'GET' ,
4651 headers : params . Headers ,
52+ SignHost : SignHost ,
4753 } , function ( err , data ) {
4854 if ( err ) return callback ( err ) ;
4955 var buckets = ( data && data . ListAllMyBucketsResult && data . ListAllMyBucketsResult . Buckets
@@ -3022,6 +3028,8 @@ function getAuth(params) {
30223028 return util . getAuth ( {
30233029 SecretId : params . SecretId || this . options . SecretId || '' ,
30243030 SecretKey : params . SecretKey || this . options . SecretKey || '' ,
3031+ Bucket : params . Bucket ,
3032+ Region : params . Region ,
30253033 Method : params . Method ,
30263034 Key : params . Key ,
30273035 Query : params . Query ,
@@ -3067,19 +3075,27 @@ function getObjectUrl(params, callback) {
30673075
30683076 var queryParamsStr = '' ;
30693077 if ( params . Query ) {
3070- queryParamsStr += util . obj2str ( params . Query ) ;
3078+ queryParamsStr += util . obj2str ( params . Query ) ;
30713079 }
30723080 if ( params . QueryString ) {
3073- queryParamsStr += ( queryParamsStr ? '&' : '' ) + params . QueryString ;
3081+ queryParamsStr += ( queryParamsStr ? '&' : '' ) + params . QueryString ;
30743082 }
30753083
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+
30763091 var syncUrl = url ;
30773092 if ( params . Sign !== undefined && ! params . Sign ) {
30783093 queryParamsStr && ( syncUrl += '?' + queryParamsStr ) ;
30793094 callback ( null , { Url : syncUrl } ) ;
30803095 return syncUrl ;
30813096 }
30823097
3098+ var SignHost = getSignHost . call ( this , { Bucket : params . Bucket , Region : params . Region , Url : url } ) ;
30833099 var AuthData = getAuthorizationAsync . call ( this , {
30843100 Action : ( ( params . Method || '' ) . toUpperCase ( ) === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject' ) ,
30853101 Bucket : params . Bucket || '' ,
@@ -3088,7 +3104,8 @@ function getObjectUrl(params, callback) {
30883104 Key : params . Key ,
30893105 Expires : params . Expires ,
30903106 Headers : params . Headers ,
3091- Query : params . Query
3107+ Query : params . Query ,
3108+ SignHost : SignHost ,
30923109 } , function ( err , AuthData ) {
30933110 if ( ! callback ) return ;
30943111 if ( err ) {
@@ -3234,14 +3251,36 @@ function getUrl(params) {
32343251 return url ;
32353252}
32363253
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+
32373270// 异步获取签名
32383271function getAuthorizationAsync ( params , callback ) {
32393272
32403273 var headers = util . clone ( params . Headers ) ;
3274+ var headerHost = '' ;
32413275 util . each ( headers , function ( v , k ) {
32423276 ( v === '' || [ 'content-type' , 'cache-control' , 'expires' ] . indexOf ( k . toLowerCase ( ) ) > - 1 ) && delete headers [ k ] ;
3277+ if ( k . toLowerCase ( ) === 'host' ) headerHost = v ;
32433278 } ) ;
32443279
3280+ // Host 加入签名计算
3281+ if ( ! headerHost && params . SignHost ) headers . Host = params . SignHost ;
3282+
3283+
32453284 // 获取凭证的回调,避免用户 callback 多次
32463285 var cbDone = false ;
32473286 var cb = function ( err , AuthData ) {
@@ -3479,6 +3518,7 @@ function submitRequest(params, callback) {
34793518 var Query = util . clone ( params . qs ) ;
34803519 params . action && ( Query [ params . action ] = '' ) ;
34813520
3521+ var SignHost = params . SignHost || getSignHost . call ( this , { Bucket : params . Bucket , Region : params . Region } ) ;
34823522 var next = function ( tryTimes ) {
34833523 var oldClockOffset = self . options . SystemClockOffset ;
34843524 getAuthorizationAsync . call ( self , {
@@ -3488,6 +3528,7 @@ function submitRequest(params, callback) {
34883528 Key : params . Key ,
34893529 Query : Query ,
34903530 Headers : params . headers ,
3531+ SignHost : SignHost ,
34913532 Action : params . Action ,
34923533 ResourceKey : params . ResourceKey ,
34933534 Scope : params . Scope ,
0 commit comments