@@ -36,6 +36,8 @@ const validLoggingConfigWithGrants = {
3636 } ,
3737} ;
3838
39+ const itSkipIfAWS = process . env . AWS_ON_AIR ? it . skip : it ;
40+
3941describe ( 'PUT bucket logging' , ( ) => {
4042 withV4 ( sigCfg => {
4143 const bucketUtil = new BucketUtility ( 'default' , sigCfg ) ;
@@ -102,7 +104,7 @@ describe('PUT bucket logging', () => {
102104 } ) ;
103105 } ) ;
104106
105- it ( 'should return NotImplemented if TargetGrants is present' , done => {
107+ itSkipIfAWS ( 'should return NotImplemented if TargetGrants is present' , done => {
106108 _testPutBucketLoggingError ( s3 , validLoggingConfigWithGrants , 501 , 'NotImplemented' , done ) ;
107109 } ) ;
108110
@@ -137,7 +139,7 @@ describe('PUT bucket logging', () => {
137139 } ) ;
138140 } ) ;
139141
140- it ( 'should return MethodNotAllowed if user is not bucket owner' , done => {
142+ itSkipIfAWS ( 'should return MethodNotAllowed if user is not bucket owner' , done => {
141143 _testPutBucketLoggingError ( otherAccountS3 , validLoggingConfig , 405 , 'MethodNotAllowed' , done ) ;
142144 } ) ;
143145
@@ -151,6 +153,73 @@ describe('PUT bucket logging', () => {
151153 } ;
152154 return _testPutBucketLoggingError ( s3 , invalidConfig , 400 , 'InvalidTargetBucketForLogging' , done ) ;
153155 } ) ;
156+
157+ it ( 'should allow logging when target bucket is owned by same account' , done => {
158+ // Both buckets created by same account, should succeed
159+ s3 . putBucketLogging ( {
160+ Bucket : bucketName ,
161+ BucketLoggingStatus : validLoggingConfig ,
162+ } , err => {
163+ assert . ifError ( err ) ;
164+ // Verify the config was set
165+ s3 . getBucketLogging ( { Bucket : bucketName } , ( err , data ) => {
166+ assert . ifError ( err ) ;
167+ assert ( data . LoggingEnabled ) ;
168+ assert . strictEqual ( data . LoggingEnabled . TargetBucket , targetBucket ) ;
169+ return done ( ) ;
170+ } ) ;
171+ } ) ;
172+ } ) ;
173+ } ) ;
174+
175+ describe ( 'with cross-account target bucket' , ( ) => {
176+ const otherAccountTargetBucket = 'other-account-target-bucket' ;
177+
178+ beforeEach ( done => {
179+ process . stdout . write ( 'Creating buckets\n' ) ;
180+ return s3 . createBucket ( { Bucket : bucketName } , err => {
181+ if ( err ) {
182+ return done ( err ) ;
183+ }
184+ return otherAccountS3 . createBucket ( { Bucket : otherAccountTargetBucket } , done ) ;
185+ } ) ;
186+ } ) ;
187+
188+ afterEach ( done => {
189+ process . stdout . write ( 'Deleting buckets\n' ) ;
190+ Promise . allSettled ( [
191+ bucketUtil . deleteOne ( bucketName ) ,
192+ otherAccountBucketUtility . deleteOne ( otherAccountTargetBucket ) ,
193+ ] ) . then ( results => {
194+ const errors = results
195+ . filter ( r => r . status === 'rejected' && r . reason ?. code !== 'NoSuchBucket' )
196+ . map ( r => r . reason ) ;
197+ if ( errors . length > 0 ) {
198+ return done ( errors [ 0 ] ) ;
199+ }
200+ return done ( ) ;
201+ } ) ;
202+ } ) ;
203+
204+ it ( 'should return InvalidTargetBucketForLogging when target bucket is owned by different account' , done => {
205+ // Try to set logging from first account's bucket to second account's bucket
206+ const crossAccountConfig = {
207+ LoggingEnabled : {
208+ TargetBucket : otherAccountTargetBucket ,
209+ TargetPrefix : 'logs/' ,
210+ } ,
211+ } ;
212+
213+ s3 . putBucketLogging ( {
214+ Bucket : bucketName ,
215+ BucketLoggingStatus : crossAccountConfig ,
216+ } , err => {
217+ assert ( err , 'Expected error but found none' ) ;
218+ assert . strictEqual ( err . code , 'InvalidTargetBucketForLogging' ) ;
219+ assert . strictEqual ( err . statusCode , 400 ) ;
220+ done ( ) ;
221+ } ) ;
222+ } ) ;
154223 } ) ;
155224 } ) ;
156225} ) ;
0 commit comments