1111# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
1212# ANY KIND, either express or implied. See the License for the specific
1313# language governing permissions and limitations under the License.
14- from awscli .testutils import BaseAWSCommandParamsTest
1514import os
1615
16+ from awscli .testutils import BaseAWSCommandParamsTest , skip_if_windows
1717
18- class TestCreateVirtualMFADevice (BaseAWSCommandParamsTest ):
1918
19+ class TestCreateVirtualMFADevice (BaseAWSCommandParamsTest ):
2020 prefix = 'iam create-virtual-mfa-device'
2121
2222 def setUp (self ):
2323 super (TestCreateVirtualMFADevice , self ).setUp ()
2424 self .parsed_response = {
2525 'ResponseMetadata' : {
2626 'HTTPStatusCode' : 200 ,
27- 'RequestId' : 'requset-id'
27+ 'RequestId' : 'requset-id' ,
2828 },
2929 "VirtualMFADevice" : {
3030 "Base32StringSeed" : (
3131 "VFpYTVc2V1lIUFlFRFczSVhLUlpRUTJRVFdUSFRNRDNTQ0c3"
32- "TkZDUVdQWDVETlNWM0IyUENaQVpWTEpQTlBOTA==" ),
32+ "TkZDUVdQWDVETlNWM0IyUENaQVpWTEpQTlBOTA=="
33+ ),
3334 "SerialNumber" : "arn:aws:iam::419278470775:mfa/fiebaz" ,
3435 "QRCodePNG" : (
3536 "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAIAAAAHjs1qAAAFi"
@@ -74,12 +75,13 @@ def setUp(self):
7475 "R3EVwF8FdBHcR3EVwF8Fd5F/+AgASajf850wfAAAAAElFTkSu"
7576 "QmCC"
7677 ),
77- }
78+ },
7879 }
7980
8081 def getpath (self , filename ):
81- return os .path .join (os .path .abspath (os .path .dirname (__file__ )),
82- filename )
82+ return os .path .join (
83+ os .path .abspath (os .path .dirname (__file__ )), filename
84+ )
8385
8486 def remove_file_if_exists (self , filename ):
8587 if os .path .isfile (filename ):
@@ -91,7 +93,8 @@ def test_base32(self):
9193 cmdline = self .prefix
9294 cmdline += ' --virtual-mfa-device-name fiebaz'
9395 cmdline += (
94- ' --outfile %s --bootstrap-method Base32StringSeed' % outfile )
96+ ' --outfile %s --bootstrap-method Base32StringSeed' % outfile
97+ )
9598 result = {"VirtualMFADeviceName" : 'fiebaz' }
9699 self .assert_params_for_cmd (cmdline , result )
97100 self .assertTrue (os .path .exists (outfile ))
@@ -145,7 +148,8 @@ def test_bad_response(self):
145148 },
146149 'ResponseMetadata' : {
147150 'HTTPStatusCode' : 409 ,
148- 'RequestId' : 'requset-id' }
151+ 'RequestId' : 'requset-id' ,
152+ },
149153 }
150154 self .http_response .status_code = 409
151155 cmdline = self .prefix
@@ -155,4 +159,34 @@ def test_bad_response(self):
155159 self .assert_params_for_cmd (
156160 cmdline ,
157161 stderr_contains = self .parsed_response ['Error' ]['Message' ],
158- expected_rc = 255 )
162+ expected_rc = 255 ,
163+ )
164+
165+ @skip_if_windows ("Permissions test not valid on Windows." )
166+ def test_output_file_permissions (self ):
167+ outfile = self .getpath ('fiebaz_perms.b32' )
168+ self .addCleanup (self .remove_file_if_exists , outfile )
169+ cmdline = self .prefix
170+ cmdline += ' --virtual-mfa-device-name fiebaz'
171+ cmdline += (
172+ ' --outfile %s --bootstrap-method Base32StringSeed' % outfile
173+ )
174+ result = {"VirtualMFADeviceName" : 'fiebaz' }
175+ self .assert_params_for_cmd (cmdline , result )
176+ self .assertEqual (os .stat (outfile ).st_mode & 0xFFF , 0o600 )
177+
178+ @skip_if_windows ("Permissions test not valid on Windows." )
179+ def test_output_file_permissions_existing_file (self ):
180+ outfile = self .getpath ('fiebaz_perms_existing.b32' )
181+ self .addCleanup (self .remove_file_if_exists , outfile )
182+ with open (outfile , 'wb' ) as f :
183+ f .write (b'existing' )
184+ os .chmod (outfile , 0o644 )
185+ cmdline = self .prefix
186+ cmdline += ' --virtual-mfa-device-name fiebaz'
187+ cmdline += (
188+ ' --outfile %s --bootstrap-method Base32StringSeed' % outfile
189+ )
190+ result = {"VirtualMFADeviceName" : 'fiebaz' }
191+ self .assert_params_for_cmd (cmdline , result )
192+ self .assertEqual (os .stat (outfile ).st_mode & 0xFFF , 0o600 )
0 commit comments