| 
									
										
										
										
											2013-05-24 17:22:34 -04:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2023-11-30 07:55:51 -08:00
										 |  |  | from base64 import b64encode | 
					
						
							|  |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  | from unittest.mock import patch | 
					
						
							| 
									
										
										
										
											2013-05-24 17:22:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 19:59:04 -08:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2023-11-30 07:55:51 -08:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2019-07-20 08:25:46 +02:00
										 |  |  | from botocore.client import ClientError | 
					
						
							| 
									
										
										
										
											2013-05-24 17:22:34 -04:00
										 |  |  | from freezegun import freeze_time | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-30 07:55:51 -08:00
										 |  |  | from moto import mock_iam, mock_sts, settings | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  | from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2019-07-20 08:25:46 +02:00
										 |  |  | from moto.sts.responses import MAX_FEDERATION_TOKEN_POLICY_LENGTH | 
					
						
							| 
									
										
										
										
											2013-05-24 17:22:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | def test_get_session_token_boto3(): | 
					
						
							|  |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     creds = client.get_session_token(DurationSeconds=903)["Credentials"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert isinstance(creds["Expiration"], datetime) | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |         fdate = creds["Expiration"].strftime("%Y-%m-%dT%H:%M:%S.000Z") | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert fdate == "2012-01-01T12:15:03.000Z" | 
					
						
							|  |  |  |     assert creds["SessionToken"] == ( | 
					
						
							|  |  |  |         "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrR" | 
					
						
							|  |  |  |         "h3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb" | 
					
						
							|  |  |  |         "4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7" | 
					
						
							|  |  |  |         "b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert creds["AccessKeyId"] == "AKIAIOSFODNN7EXAMPLE" | 
					
						
							|  |  |  |     assert creds["SecretAccessKey"] == "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | def test_get_federation_token_boto3(): | 
					
						
							|  |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     token_name = "Bob" | 
					
						
							|  |  |  |     fed_token = client.get_federation_token(DurationSeconds=903, Name=token_name) | 
					
						
							|  |  |  |     creds = fed_token["Credentials"] | 
					
						
							|  |  |  |     fed_user = fed_token["FederatedUser"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert isinstance(creds["Expiration"], datetime) | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |         fdate = creds["Expiration"].strftime("%Y-%m-%dT%H:%M:%S.000Z") | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert fdate == "2012-01-01T12:15:03.000Z" | 
					
						
							|  |  |  |     assert creds["SessionToken"] == ( | 
					
						
							|  |  |  |         "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZ" | 
					
						
							|  |  |  |         "TwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkP" | 
					
						
							|  |  |  |         "pKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7W" | 
					
						
							|  |  |  |         "Z0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7Z" | 
					
						
							|  |  |  |         "D0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx" | 
					
						
							|  |  |  |         "3iSIlTJabIQwj2ICCR/oLxBA==" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert creds["AccessKeyId"] == "AKIAIOSFODNN7EXAMPLE" | 
					
						
							|  |  |  |     assert creds["SecretAccessKey"] == "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert fed_user["Arn"] == (f"arn:aws:sts::{ACCOUNT_ID}:federated-user/{token_name}") | 
					
						
							|  |  |  |     assert fed_user["FederatedUserId"] == f"{ACCOUNT_ID}:{token_name}" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-24 17:22:34 -04:00
										 |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							| 
									
										
										
										
											2019-08-21 10:45:36 +02:00
										 |  |  | @mock_sts | 
					
						
							| 
									
										
										
										
											2022-09-30 00:14:03 +02:00
										 |  |  | @mock_iam | 
					
						
							| 
									
										
										
										
											2013-05-24 17:22:34 -04:00
										 |  |  | def test_assume_role(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2022-09-30 00:14:03 +02:00
										 |  |  |     iam_client = boto3.client("iam", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2013-05-24 17:22:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-21 10:45:36 +02:00
										 |  |  |     session_name = "session-name" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     policy = json.dumps( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "Statement": [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "Sid": "Stmt13690092345534", | 
					
						
							|  |  |  |                     "Action": ["S3:ListBucket"], | 
					
						
							|  |  |  |                     "Effect": "Allow", | 
					
						
							|  |  |  |                     "Resource": ["arn:aws:s3:::foobar-tester"], | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-09-30 00:14:03 +02:00
										 |  |  |     trust_policy_document = { | 
					
						
							|  |  |  |         "Version": "2012-10-17", | 
					
						
							|  |  |  |         "Statement": { | 
					
						
							|  |  |  |             "Effect": "Allow", | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |             "Principal": {"AWS": f"arn:aws:iam::{ACCOUNT_ID}:root"}, | 
					
						
							| 
									
										
										
										
											2022-09-30 00:14:03 +02:00
										 |  |  |             "Action": "sts:AssumeRole", | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-08-21 19:47:12 +02:00
										 |  |  |     role_name = "test-role" | 
					
						
							| 
									
										
										
										
											2022-09-30 00:14:03 +02:00
										 |  |  |     role = iam_client.create_role( | 
					
						
							|  |  |  |         RoleName="test-role", AssumeRolePolicyDocument=json.dumps(trust_policy_document) | 
					
						
							|  |  |  |     )["Role"] | 
					
						
							|  |  |  |     role_id = role["RoleId"] | 
					
						
							|  |  |  |     role_arn = role["Arn"] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assume_role_response = client.assume_role( | 
					
						
							| 
									
										
										
										
											2022-09-30 00:14:03 +02:00
										 |  |  |         RoleArn=role_arn, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         RoleSessionName=session_name, | 
					
						
							|  |  |  |         Policy=policy, | 
					
						
							|  |  |  |         DurationSeconds=900, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-21 10:45:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     credentials = assume_role_response["Credentials"] | 
					
						
							| 
									
										
										
										
											2019-08-22 11:06:42 +02:00
										 |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert credentials["Expiration"].isoformat() == "2012-01-01T12:15:00+00:00" | 
					
						
							|  |  |  |     assert len(credentials["SessionToken"]) == 356 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert credentials["SessionToken"].startswith("FQoGZXIvYXdzE") | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert len(credentials["AccessKeyId"]) == 20 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert credentials["AccessKeyId"].startswith("ASIA") | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert len(credentials["SecretAccessKey"]) == 40 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert assume_role_response["AssumedRoleUser"]["Arn"] == ( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f"arn:aws:sts::{ACCOUNT_ID}:assumed-role/{role_name}/{session_name}" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert assume_role_response["AssumedRoleUser"]["AssumedRoleId"].startswith("AROA") | 
					
						
							| 
									
										
										
										
											2022-09-30 00:14:03 +02:00
										 |  |  |     assert ( | 
					
						
							|  |  |  |         assume_role_response["AssumedRoleUser"]["AssumedRoleId"].rpartition(":")[0] | 
					
						
							|  |  |  |         == role_id | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assert assume_role_response["AssumedRoleUser"]["AssumedRoleId"].endswith( | 
					
						
							|  |  |  |         ":" + session_name | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert len(assume_role_response["AssumedRoleUser"]["AssumedRoleId"]) == ( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         21 + 1 + len(session_name) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-01-18 19:59:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | def test_assume_role_with_saml(): | 
					
						
							|  |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     role_name = "test-role" | 
					
						
							|  |  |  |     provider_name = "TestProvFed" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     fed_identifier = "7ca82df9-1bad-4dd3-9b2b-adb68b554282" | 
					
						
							|  |  |  |     fed_name = "testuser" | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |     role_input = f"arn:aws:iam::{ACCOUNT_ID}:role/{role_name}" | 
					
						
							|  |  |  |     principal_role = f"arn:aws:iam:{ACCOUNT_ID}:saml-provider/{provider_name}" | 
					
						
							|  |  |  |     saml_assertion = f"""
 | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  | <?xml version="1.0"?> | 
					
						
							|  |  |  | <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="_00000000-0000-0000-0000-000000000000" Version="2.0" IssueInstant="2012-01-01T12:00:00.000Z" Destination="https://signin.aws.amazon.com/saml" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"> | 
					
						
							|  |  |  |   <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost/</Issuer> | 
					
						
							|  |  |  |   <samlp:Status> | 
					
						
							|  |  |  |     <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> | 
					
						
							|  |  |  |   </samlp:Status> | 
					
						
							|  |  |  |   <Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_00000000-0000-0000-0000-000000000000" IssueInstant="2012-12-01T12:00:00.000Z" Version="2.0"> | 
					
						
							|  |  |  |     <Issuer>http://localhost:3000/</Issuer> | 
					
						
							|  |  |  |     <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |       <ds:SignedInfo> | 
					
						
							|  |  |  |         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |         <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> | 
					
						
							|  |  |  |         <ds:Reference URI="#_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |           <ds:Transforms> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |           </ds:Transforms> | 
					
						
							|  |  |  |           <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> | 
					
						
							|  |  |  |           <ds:DigestValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:DigestValue> | 
					
						
							|  |  |  |         </ds:Reference> | 
					
						
							|  |  |  |       </ds:SignedInfo> | 
					
						
							|  |  |  |       <ds:SignatureValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:SignatureValue> | 
					
						
							|  |  |  |       <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |         <ds:X509Data> | 
					
						
							|  |  |  |           <ds:X509Certificate>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:X509Certificate> | 
					
						
							|  |  |  |         </ds:X509Data> | 
					
						
							|  |  |  |       </KeyInfo> | 
					
						
							|  |  |  |     </ds:Signature> | 
					
						
							|  |  |  |     <Subject> | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |       <NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">{fed_identifier}</NameID> | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |       <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> | 
					
						
							|  |  |  |         <SubjectConfirmationData NotOnOrAfter="2012-01-01T13:00:00.000Z" Recipient="https://signin.aws.amazon.com/saml"/> | 
					
						
							|  |  |  |       </SubjectConfirmation> | 
					
						
							|  |  |  |     </Subject> | 
					
						
							|  |  |  |     <Conditions NotBefore="2012-01-01T12:00:00.000Z" NotOnOrAfter="2012-01-01T13:00:00.000Z"> | 
					
						
							|  |  |  |       <AudienceRestriction> | 
					
						
							|  |  |  |         <Audience>urn:amazon:webservices</Audience> | 
					
						
							|  |  |  |       </AudienceRestriction> | 
					
						
							|  |  |  |     </Conditions> | 
					
						
							|  |  |  |     <AttributeStatement> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName"> | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |         <AttributeValue>{fed_name}</AttributeValue> | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |       </Attribute> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/Role"> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         <AttributeValue>arn:aws:iam::{ACCOUNT_ID}:saml-provider/{provider_name},arn:aws:iam::{ACCOUNT_ID}:role/{role_name}</AttributeValue> | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |       </Attribute> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration"> | 
					
						
							|  |  |  |         <AttributeValue>900</AttributeValue> | 
					
						
							|  |  |  |       </Attribute> | 
					
						
							|  |  |  |     </AttributeStatement> | 
					
						
							|  |  |  |     <AuthnStatement AuthnInstant="2012-01-01T12:00:00.000Z" SessionIndex="_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |       <AuthnContext> | 
					
						
							|  |  |  |         <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</AuthnContextClassRef> | 
					
						
							|  |  |  |       </AuthnContext> | 
					
						
							|  |  |  |     </AuthnStatement> | 
					
						
							|  |  |  |   </Assertion> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  | </samlp:Response>""".replace(
 | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |         "\n", "" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assume_role_response = client.assume_role_with_saml( | 
					
						
							|  |  |  |         RoleArn=role_input, | 
					
						
							|  |  |  |         PrincipalArn=principal_role, | 
					
						
							|  |  |  |         SAMLAssertion=b64encode(saml_assertion.encode("utf-8")).decode("utf-8"), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     credentials = assume_role_response["Credentials"] | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert credentials["Expiration"].isoformat() == "2012-01-01T12:15:00+00:00" | 
					
						
							|  |  |  |     assert len(credentials["SessionToken"]) == 356 | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |     assert credentials["SessionToken"].startswith("FQoGZXIvYXdzE") | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert len(credentials["AccessKeyId"]) == 20 | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |     assert credentials["AccessKeyId"].startswith("ASIA") | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert len(credentials["SecretAccessKey"]) == 40 | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert assume_role_response["AssumedRoleUser"]["Arn"] == ( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f"arn:aws:sts::{ACCOUNT_ID}:assumed-role/{role_name}/{fed_name}" | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     assert assume_role_response["AssumedRoleUser"]["AssumedRoleId"].startswith("AROA") | 
					
						
							|  |  |  |     assert assume_role_response["AssumedRoleUser"]["AssumedRoleId"].endswith( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f":{fed_name}" | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert len(assume_role_response["AssumedRoleUser"]["AssumedRoleId"]) == ( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         21 + 1 + len(f"{fed_name}") | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | def test_assume_role_with_saml_should_not_rely_on_attribute_order(): | 
					
						
							|  |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     role_name = "test-role" | 
					
						
							|  |  |  |     provider_name = "TestProvFed" | 
					
						
							|  |  |  |     fed_identifier = "7ca82df9-1bad-4dd3-9b2b-adb68b554282" | 
					
						
							|  |  |  |     fed_name = "testuser" | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |     role_input = f"arn:aws:iam::{ACCOUNT_ID}:role/{role_name}" | 
					
						
							|  |  |  |     principal_role = f"arn:aws:iam:{ACCOUNT_ID}:saml-provider/{provider_name}" | 
					
						
							|  |  |  |     saml_assertion = f"""
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  | <?xml version="1.0"?> | 
					
						
							|  |  |  | <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="_00000000-0000-0000-0000-000000000000" Version="2.0" IssueInstant="2012-01-01T12:00:00.000Z" Destination="https://signin.aws.amazon.com/saml" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"> | 
					
						
							|  |  |  |   <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost/</Issuer> | 
					
						
							|  |  |  |   <samlp:Status> | 
					
						
							|  |  |  |     <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> | 
					
						
							|  |  |  |   </samlp:Status> | 
					
						
							|  |  |  |   <Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_00000000-0000-0000-0000-000000000000" IssueInstant="2012-12-01T12:00:00.000Z" Version="2.0"> | 
					
						
							|  |  |  |     <Issuer>http://localhost:3000/</Issuer> | 
					
						
							|  |  |  |     <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |       <ds:SignedInfo> | 
					
						
							|  |  |  |         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |         <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> | 
					
						
							|  |  |  |         <ds:Reference URI="#_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |           <ds:Transforms> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |           </ds:Transforms> | 
					
						
							|  |  |  |           <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> | 
					
						
							|  |  |  |           <ds:DigestValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:DigestValue> | 
					
						
							|  |  |  |         </ds:Reference> | 
					
						
							|  |  |  |       </ds:SignedInfo> | 
					
						
							|  |  |  |       <ds:SignatureValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:SignatureValue> | 
					
						
							|  |  |  |       <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |         <ds:X509Data> | 
					
						
							|  |  |  |           <ds:X509Certificate>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:X509Certificate> | 
					
						
							|  |  |  |         </ds:X509Data> | 
					
						
							|  |  |  |       </KeyInfo> | 
					
						
							|  |  |  |     </ds:Signature> | 
					
						
							|  |  |  |     <Subject> | 
					
						
							|  |  |  |       <NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">{fed_identifier}</NameID> | 
					
						
							|  |  |  |       <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> | 
					
						
							|  |  |  |         <SubjectConfirmationData NotOnOrAfter="2012-01-01T13:00:00.000Z" Recipient="https://signin.aws.amazon.com/saml"/> | 
					
						
							|  |  |  |       </SubjectConfirmation> | 
					
						
							|  |  |  |     </Subject> | 
					
						
							|  |  |  |     <Conditions NotBefore="2012-01-01T12:00:00.000Z" NotOnOrAfter="2012-01-01T13:00:00.000Z"> | 
					
						
							|  |  |  |       <AudienceRestriction> | 
					
						
							|  |  |  |         <Audience>urn:amazon:webservices</Audience> | 
					
						
							|  |  |  |       </AudienceRestriction> | 
					
						
							|  |  |  |     </Conditions> | 
					
						
							|  |  |  |     <AttributeStatement> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/Role"> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         <AttributeValue>arn:aws:iam::{ACCOUNT_ID}:saml-provider/{provider_name},arn:aws:iam::{ACCOUNT_ID}:role/{role_name}</AttributeValue> | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |       </Attribute> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration"> | 
					
						
							|  |  |  |         <AttributeValue>900</AttributeValue> | 
					
						
							|  |  |  |       </Attribute> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName"> | 
					
						
							|  |  |  |         <AttributeValue>{fed_name}</AttributeValue> | 
					
						
							|  |  |  |       </Attribute> | 
					
						
							|  |  |  |     </AttributeStatement> | 
					
						
							|  |  |  |     <AuthnStatement AuthnInstant="2012-01-01T12:00:00.000Z" SessionIndex="_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |       <AuthnContext> | 
					
						
							|  |  |  |         <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</AuthnContextClassRef> | 
					
						
							|  |  |  |       </AuthnContext> | 
					
						
							|  |  |  |     </AuthnStatement> | 
					
						
							|  |  |  |   </Assertion> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  | </samlp:Response>""".replace(
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |         "\n", "" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assume_role_response = client.assume_role_with_saml( | 
					
						
							|  |  |  |         RoleArn=role_input, | 
					
						
							|  |  |  |         PrincipalArn=principal_role, | 
					
						
							|  |  |  |         SAMLAssertion=b64encode(saml_assertion.encode("utf-8")).decode("utf-8"), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     credentials = assume_role_response["Credentials"] | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert credentials["Expiration"].isoformat() == "2012-01-01T12:15:00+00:00" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert assume_role_response["AssumedRoleUser"]["Arn"] == ( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f"arn:aws:sts::{ACCOUNT_ID}:assumed-role/{role_name}/{fed_name}" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | def test_assume_role_with_saml_should_respect_xml_namespaces(): | 
					
						
							|  |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     role_name = "test-role" | 
					
						
							|  |  |  |     provider_name = "TestProvFed" | 
					
						
							|  |  |  |     fed_identifier = "7ca82df9-1bad-4dd3-9b2b-adb68b554282" | 
					
						
							|  |  |  |     fed_name = "testuser" | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |     role_input = f"arn:aws:iam::{ACCOUNT_ID}:role/{role_name}" | 
					
						
							|  |  |  |     principal_role = f"arn:aws:iam:{ACCOUNT_ID}:saml-provider/{provider_name}" | 
					
						
							|  |  |  |     saml_assertion = f"""
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  | <?xml version="1.0"?> | 
					
						
							|  |  |  | <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_00000000-0000-0000-0000-000000000000" Version="2.0" IssueInstant="2012-01-01T12:00:00.000Z" Destination="https://signin.aws.amazon.com/saml" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"> | 
					
						
							|  |  |  |   <saml:Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost/</saml:Issuer> | 
					
						
							|  |  |  |   <samlp:Status> | 
					
						
							|  |  |  |     <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> | 
					
						
							|  |  |  |   </samlp:Status> | 
					
						
							|  |  |  |   <saml:Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_00000000-0000-0000-0000-000000000000" IssueInstant="2012-12-01T12:00:00.000Z" Version="2.0"> | 
					
						
							|  |  |  |     <saml:Issuer>http://localhost:3000/</saml:Issuer> | 
					
						
							|  |  |  |     <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |       <ds:SignedInfo> | 
					
						
							|  |  |  |         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |         <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> | 
					
						
							|  |  |  |         <ds:Reference URI="#_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |           <ds:Transforms> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |           </ds:Transforms> | 
					
						
							|  |  |  |           <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> | 
					
						
							|  |  |  |           <ds:DigestValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:DigestValue> | 
					
						
							|  |  |  |         </ds:Reference> | 
					
						
							|  |  |  |       </ds:SignedInfo> | 
					
						
							|  |  |  |       <ds:SignatureValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:SignatureValue> | 
					
						
							|  |  |  |       <ds:KeyInfo> | 
					
						
							|  |  |  |         <ds:X509Data> | 
					
						
							|  |  |  |           <ds:X509Certificate>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:X509Certificate> | 
					
						
							|  |  |  |         </ds:X509Data> | 
					
						
							|  |  |  |       </ds:KeyInfo> | 
					
						
							|  |  |  |     </ds:Signature> | 
					
						
							|  |  |  |     <saml:Subject> | 
					
						
							|  |  |  |       <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">{fed_identifier}</saml:NameID> | 
					
						
							|  |  |  |       <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> | 
					
						
							|  |  |  |         <saml:SubjectConfirmationData NotOnOrAfter="2012-01-01T13:00:00.000Z" Recipient="https://signin.aws.amazon.com/saml"/> | 
					
						
							|  |  |  |       </saml:SubjectConfirmation> | 
					
						
							|  |  |  |     </saml:Subject> | 
					
						
							|  |  |  |     <saml:Conditions NotBefore="2012-01-01T12:00:00.000Z" NotOnOrAfter="2012-01-01T13:00:00.000Z"> | 
					
						
							|  |  |  |       <saml:AudienceRestriction> | 
					
						
							|  |  |  |         <Audience>urn:amazon:webservices</Audience> | 
					
						
							|  |  |  |       </saml:AudienceRestriction> | 
					
						
							|  |  |  |     </saml:Conditions> | 
					
						
							|  |  |  |     <saml:AttributeStatement> | 
					
						
							|  |  |  |       <saml:Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName"> | 
					
						
							|  |  |  |         <saml:AttributeValue>{fed_name}</saml:AttributeValue> | 
					
						
							|  |  |  |       </saml:Attribute> | 
					
						
							|  |  |  |       <saml:Attribute Name="https://aws.amazon.com/SAML/Attributes/Role"> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         <saml:AttributeValue>arn:aws:iam::{ACCOUNT_ID}:saml-provider/{provider_name},arn:aws:iam::{ACCOUNT_ID}:role/{role_name}</saml:AttributeValue> | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |       </saml:Attribute> | 
					
						
							|  |  |  |       <saml:Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration"> | 
					
						
							|  |  |  |         <saml:AttributeValue>900</saml:AttributeValue> | 
					
						
							|  |  |  |       </saml:Attribute> | 
					
						
							|  |  |  |     </saml:AttributeStatement> | 
					
						
							|  |  |  |     <saml:AuthnStatement AuthnInstant="2012-01-01T12:00:00.000Z" SessionIndex="_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |       <saml:AuthnContext> | 
					
						
							|  |  |  |         <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef> | 
					
						
							|  |  |  |       </saml:AuthnContext> | 
					
						
							|  |  |  |     </saml:AuthnStatement> | 
					
						
							|  |  |  |   </saml:Assertion> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  | </samlp:Response>""".replace(
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |         "\n", "" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assume_role_response = client.assume_role_with_saml( | 
					
						
							|  |  |  |         RoleArn=role_input, | 
					
						
							|  |  |  |         PrincipalArn=principal_role, | 
					
						
							|  |  |  |         SAMLAssertion=b64encode(saml_assertion.encode("utf-8")).decode("utf-8"), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     credentials = assume_role_response["Credentials"] | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert credentials["Expiration"].isoformat() == "2012-01-01T12:15:00+00:00" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert assume_role_response["AssumedRoleUser"]["Arn"] == ( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f"arn:aws:sts::{ACCOUNT_ID}:assumed-role/{role_name}/{fed_name}" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  | def test_assume_role_with_saml_when_xml_tag_contains_xmlns_attributes(): | 
					
						
							|  |  |  |     """Test assume role with saml when xml tag contains xmlns attributes.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Sssume role with saml should retrieve attribute value when xml tag | 
					
						
							|  |  |  |     contains xmlns attributes. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     role_name = "test-role" | 
					
						
							|  |  |  |     provider_name = "TestProvFed" | 
					
						
							|  |  |  |     fed_identifier = "7ca82df9-1bad-4dd3-9b2b-adb68b554282" | 
					
						
							|  |  |  |     fed_name = "testuser" | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |     role_input = f"arn:aws:iam::{ACCOUNT_ID}:role/{role_name}" | 
					
						
							|  |  |  |     principal_role = f"arn:aws:iam:{ACCOUNT_ID}:saml-provider/{provider_name}" | 
					
						
							|  |  |  |     saml_assertion = f"""
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  | <?xml version="1.0"?> | 
					
						
							|  |  |  | <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="_00000000-0000-0000-0000-000000000000" Version="2.0" IssueInstant="2012-01-01T12:00:00.000Z" Destination="https://signin.aws.amazon.com/saml" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"> | 
					
						
							|  |  |  |   <saml:Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost/</saml:Issuer> | 
					
						
							|  |  |  |   <samlp:Status> | 
					
						
							|  |  |  |     <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> | 
					
						
							|  |  |  |   </samlp:Status> | 
					
						
							|  |  |  |   <saml:Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_00000000-0000-0000-0000-000000000000" IssueInstant="2012-12-01T12:00:00.000Z" Version="2.0"> | 
					
						
							|  |  |  |     <saml:Issuer>http://localhost:3000/</saml:Issuer> | 
					
						
							|  |  |  |     <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |       <ds:SignedInfo> | 
					
						
							|  |  |  |         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |         <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> | 
					
						
							|  |  |  |         <ds:Reference URI="#_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |           <ds:Transforms> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |           </ds:Transforms> | 
					
						
							|  |  |  |           <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> | 
					
						
							|  |  |  |           <ds:DigestValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:DigestValue> | 
					
						
							|  |  |  |         </ds:Reference> | 
					
						
							|  |  |  |       </ds:SignedInfo> | 
					
						
							|  |  |  |       <ds:SignatureValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:SignatureValue> | 
					
						
							|  |  |  |       <ds:KeyInfo> | 
					
						
							|  |  |  |         <ds:X509Data> | 
					
						
							|  |  |  |           <ds:X509Certificate>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:X509Certificate> | 
					
						
							|  |  |  |         </ds:X509Data> | 
					
						
							|  |  |  |       </ds:KeyInfo> | 
					
						
							|  |  |  |     </ds:Signature> | 
					
						
							|  |  |  |     <saml:Subject> | 
					
						
							|  |  |  |       <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">{fed_identifier}</saml:NameID> | 
					
						
							|  |  |  |       <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> | 
					
						
							|  |  |  |         <saml:SubjectConfirmationData NotOnOrAfter="2012-01-01T13:00:00.000Z" Recipient="https://signin.aws.amazon.com/saml"/> | 
					
						
							|  |  |  |       </saml:SubjectConfirmation> | 
					
						
							|  |  |  |     </saml:Subject> | 
					
						
							|  |  |  |     <saml:Conditions NotBefore="2012-01-01T12:00:00.000Z" NotOnOrAfter="2012-01-01T13:00:00.000Z"> | 
					
						
							|  |  |  |       <saml:AudienceRestriction> | 
					
						
							|  |  |  |         <Audience>urn:amazon:webservices</Audience> | 
					
						
							|  |  |  |       </saml:AudienceRestriction> | 
					
						
							|  |  |  |     </saml:Conditions> | 
					
						
							|  |  |  |     <saml:AttributeStatement> | 
					
						
							|  |  |  |       <saml:Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName"> | 
					
						
							|  |  |  |         <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" | 
					
						
							| 
									
										
										
										
											2021-07-26 16:21:17 +02:00
										 |  |  |                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |                              xsi:type="xs:string">{fed_name}</saml:AttributeValue> | 
					
						
							|  |  |  |       </saml:Attribute> | 
					
						
							|  |  |  |       <saml:Attribute Name="https://aws.amazon.com/SAML/Attributes/Role"> | 
					
						
							|  |  |  |         <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" | 
					
						
							| 
									
										
										
										
											2021-07-26 16:21:17 +02:00
										 |  |  |                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |                              xsi:type="xs:string">arn:aws:iam::{ACCOUNT_ID}:saml-provider/{provider_name},arn:aws:iam::{ACCOUNT_ID}:role/{role_name}</saml:AttributeValue> | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |       </saml:Attribute> | 
					
						
							|  |  |  |       <saml:Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration"> | 
					
						
							|  |  |  |         <saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" | 
					
						
							| 
									
										
										
										
											2021-07-26 16:21:17 +02:00
										 |  |  |                              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |                              xsi:type="xs:string">900</saml:AttributeValue> | 
					
						
							|  |  |  |       </saml:Attribute> | 
					
						
							|  |  |  |     </saml:AttributeStatement> | 
					
						
							|  |  |  |     <saml:AuthnStatement AuthnInstant="2012-01-01T12:00:00.000Z" SessionIndex="_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |       <saml:AuthnContext> | 
					
						
							|  |  |  |         <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef> | 
					
						
							|  |  |  |       </saml:AuthnContext> | 
					
						
							|  |  |  |     </saml:AuthnStatement> | 
					
						
							|  |  |  |   </saml:Assertion> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  | </samlp:Response>""".replace(
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |         "\n", "" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assume_role_response = client.assume_role_with_saml( | 
					
						
							|  |  |  |         RoleArn=role_input, | 
					
						
							|  |  |  |         PrincipalArn=principal_role, | 
					
						
							|  |  |  |         SAMLAssertion=b64encode(saml_assertion.encode("utf-8")).decode("utf-8"), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     credentials = assume_role_response["Credentials"] | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert credentials["Expiration"].isoformat() == "2012-01-01T12:15:00+00:00" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert assume_role_response["AssumedRoleUser"]["Arn"] == ( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f"arn:aws:sts::{ACCOUNT_ID}:assumed-role/{role_name}/{fed_name}" | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  | def test_assume_role_with_saml_when_saml_attribute_not_provided(): | 
					
						
							|  |  |  |     """Test session duration when saml attribute are not provided.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Assume role should default the session duration to 3600 seconds when | 
					
						
							|  |  |  |     a saml attribute is not provided. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     role_name = "test-role" | 
					
						
							|  |  |  |     provider_name = "TestProvFed" | 
					
						
							|  |  |  |     fed_identifier = "7ca82df9-1bad-4dd3-9b2b-adb68b554282" | 
					
						
							|  |  |  |     fed_name = "testuser" | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |     role_input = f"arn:aws:iam::{ACCOUNT_ID}:role/{role_name}" | 
					
						
							|  |  |  |     principal_role = f"arn:aws:iam:{ACCOUNT_ID}:saml-provider/{provider_name}" | 
					
						
							|  |  |  |     saml_assertion = f"""
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  | <?xml version="1.0"?> | 
					
						
							|  |  |  | <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="_00000000-0000-0000-0000-000000000000" Version="2.0" IssueInstant="2012-01-01T12:00:00.000Z" Destination="https://signin.aws.amazon.com/saml" Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"> | 
					
						
							|  |  |  |   <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://localhost/</Issuer> | 
					
						
							|  |  |  |   <samlp:Status> | 
					
						
							|  |  |  |     <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/> | 
					
						
							|  |  |  |   </samlp:Status> | 
					
						
							|  |  |  |   <Assertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion" ID="_00000000-0000-0000-0000-000000000000" IssueInstant="2012-12-01T12:00:00.000Z" Version="2.0"> | 
					
						
							|  |  |  |     <Issuer>http://localhost:3000/</Issuer> | 
					
						
							|  |  |  |     <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |       <ds:SignedInfo> | 
					
						
							|  |  |  |         <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |         <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> | 
					
						
							|  |  |  |         <ds:Reference URI="#_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |           <ds:Transforms> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> | 
					
						
							|  |  |  |             <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> | 
					
						
							|  |  |  |           </ds:Transforms> | 
					
						
							|  |  |  |           <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> | 
					
						
							|  |  |  |           <ds:DigestValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:DigestValue> | 
					
						
							|  |  |  |         </ds:Reference> | 
					
						
							|  |  |  |       </ds:SignedInfo> | 
					
						
							|  |  |  |       <ds:SignatureValue>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:SignatureValue> | 
					
						
							|  |  |  |       <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> | 
					
						
							|  |  |  |         <ds:X509Data> | 
					
						
							|  |  |  |           <ds:X509Certificate>NTIyMzk0ZGI4MjI0ZjI5ZGNhYjkyOGQyZGQ1NTZjODViZjk5YTY4ODFjOWRjNjkyYzZmODY2ZDQ4NjlkZjY3YSAgLQo=</ds:X509Certificate> | 
					
						
							|  |  |  |         </ds:X509Data> | 
					
						
							|  |  |  |       </KeyInfo> | 
					
						
							|  |  |  |     </ds:Signature> | 
					
						
							|  |  |  |     <Subject> | 
					
						
							|  |  |  |       <NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">{fed_identifier}</NameID> | 
					
						
							|  |  |  |       <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> | 
					
						
							|  |  |  |         <SubjectConfirmationData NotOnOrAfter="2012-01-01T13:00:00.000Z" Recipient="https://signin.aws.amazon.com/saml"/> | 
					
						
							|  |  |  |       </SubjectConfirmation> | 
					
						
							|  |  |  |     </Subject> | 
					
						
							|  |  |  |     <Conditions NotBefore="2012-01-01T12:00:00.000Z" NotOnOrAfter="2012-01-01T13:00:00.000Z"> | 
					
						
							|  |  |  |       <AudienceRestriction> | 
					
						
							|  |  |  |         <Audience>urn:amazon:webservices</Audience> | 
					
						
							|  |  |  |       </AudienceRestriction> | 
					
						
							|  |  |  |     </Conditions> | 
					
						
							|  |  |  |     <AttributeStatement> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/Role"> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         <AttributeValue>arn:aws:iam::{ACCOUNT_ID}:saml-provider/{provider_name},arn:aws:iam::{ACCOUNT_ID}:role/{role_name}</AttributeValue> | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |       </Attribute> | 
					
						
							|  |  |  |       <Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName"> | 
					
						
							|  |  |  |         <AttributeValue>{fed_name}</AttributeValue> | 
					
						
							|  |  |  |       </Attribute> | 
					
						
							|  |  |  |     </AttributeStatement> | 
					
						
							|  |  |  |     <AuthnStatement AuthnInstant="2012-01-01T12:00:00.000Z" SessionIndex="_00000000-0000-0000-0000-000000000000"> | 
					
						
							|  |  |  |       <AuthnContext> | 
					
						
							|  |  |  |         <AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</AuthnContextClassRef> | 
					
						
							|  |  |  |       </AuthnContext> | 
					
						
							|  |  |  |     </AuthnStatement> | 
					
						
							|  |  |  |   </Assertion> | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  | </samlp:Response>""".replace(
 | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |         "\n", "" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assume_role_response = client.assume_role_with_saml( | 
					
						
							|  |  |  |         RoleArn=role_input, | 
					
						
							|  |  |  |         PrincipalArn=principal_role, | 
					
						
							|  |  |  |         SAMLAssertion=b64encode(saml_assertion.encode("utf-8")).decode("utf-8"), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     credentials = assume_role_response["Credentials"] | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert "Expiration" in credentials | 
					
						
							| 
									
										
										
										
											2020-12-08 10:08:40 +01:00
										 |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert credentials["Expiration"].isoformat() == "2012-01-01T13:00:00+00:00" | 
					
						
							| 
									
										
										
										
											2020-04-15 20:11:33 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | @freeze_time("2012-01-01 12:00:00") | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | def test_assume_role_with_web_identity_boto3(): | 
					
						
							|  |  |  |     client = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     policy = json.dumps( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "Statement": [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "Sid": "Stmt13690092345534", | 
					
						
							|  |  |  |                     "Action": ["S3:ListBucket"], | 
					
						
							|  |  |  |                     "Effect": "Allow", | 
					
						
							|  |  |  |                     "Resource": ["arn:aws:s3:::foobar-tester"], | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     role_name = "test-role" | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |     s3_role = f"arn:aws:iam::{ACCOUNT_ID}:role/{role_name}" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  |     session_name = "session-name" | 
					
						
							|  |  |  |     role = client.assume_role_with_web_identity( | 
					
						
							|  |  |  |         RoleArn=s3_role, | 
					
						
							|  |  |  |         RoleSessionName=session_name, | 
					
						
							|  |  |  |         WebIdentityToken="????", | 
					
						
							|  |  |  |         Policy=policy, | 
					
						
							|  |  |  |         DurationSeconds=903, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     creds = role["Credentials"] | 
					
						
							|  |  |  |     user = role["AssumedRoleUser"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert isinstance(creds["Expiration"], datetime) | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							|  |  |  |         fdate = creds["Expiration"].strftime("%Y-%m-%dT%H:%M:%S.000Z") | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |         assert fdate == "2012-01-01T12:15:03.000Z" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert len(creds["SessionToken"]) == 356 | 
					
						
							|  |  |  |     assert re.match("^FQoGZXIvYXdzE", creds["SessionToken"]) | 
					
						
							|  |  |  |     assert len(creds["AccessKeyId"]) == 20 | 
					
						
							|  |  |  |     assert re.match("^ASIA", creds["AccessKeyId"]) | 
					
						
							|  |  |  |     assert len(creds["SecretAccessKey"]) == 40 | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert user["Arn"] == ( | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         f"arn:aws:sts::{ACCOUNT_ID}:assumed-role/{role_name}/{session_name}" | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert "session-name" in user["AssumedRoleId"] | 
					
						
							| 
									
										
										
										
											2021-09-23 12:09:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-18 19:59:04 -08:00
										 |  |  | @mock_sts | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  | def test_get_caller_identity_with_default_credentials(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     identity = boto3.client("sts", region_name="us-east-1").get_caller_identity() | 
					
						
							| 
									
										
										
										
											2017-01-18 19:59:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert identity["Arn"] == f"arn:aws:sts::{ACCOUNT_ID}:user/moto" | 
					
						
							|  |  |  |     assert identity["UserId"] == "AKIAIOSFODNN7EXAMPLE" | 
					
						
							|  |  |  |     assert identity["Account"] == str(ACCOUNT_ID) | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | @mock_iam | 
					
						
							|  |  |  | def test_get_caller_identity_with_iam_user_credentials(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     iam_client = boto3.client("iam", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  |     iam_user_name = "new-user" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     iam_user = iam_client.create_user(UserName=iam_user_name)["User"] | 
					
						
							|  |  |  |     access_key = iam_client.create_access_key(UserName=iam_user_name)["AccessKey"] | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     identity = boto3.client( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "sts", | 
					
						
							|  |  |  |         region_name="us-east-1", | 
					
						
							|  |  |  |         aws_access_key_id=access_key["AccessKeyId"], | 
					
						
							|  |  |  |         aws_secret_access_key=access_key["SecretAccessKey"], | 
					
						
							|  |  |  |     ).get_caller_identity() | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert identity["Arn"] == iam_user["Arn"] | 
					
						
							|  |  |  |     assert identity["UserId"] == iam_user["UserId"] | 
					
						
							|  |  |  |     assert identity["Account"] == str(ACCOUNT_ID) | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | @mock_iam | 
					
						
							|  |  |  | def test_get_caller_identity_with_assumed_role_credentials(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     iam_client = boto3.client("iam", region_name="us-east-1") | 
					
						
							|  |  |  |     sts_client = boto3.client("sts", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  |     iam_role_name = "new-user" | 
					
						
							|  |  |  |     trust_policy_document = { | 
					
						
							|  |  |  |         "Version": "2012-10-17", | 
					
						
							|  |  |  |         "Statement": { | 
					
						
							|  |  |  |             "Effect": "Allow", | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |             "Principal": {"AWS": f"arn:aws:iam::{ACCOUNT_ID}:root"}, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "Action": "sts:AssumeRole", | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     iam_role_arn = iam_client.role_arn = iam_client.create_role( | 
					
						
							|  |  |  |         RoleName=iam_role_name, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         AssumeRolePolicyDocument=json.dumps(trust_policy_document), | 
					
						
							|  |  |  |     )["Role"]["Arn"] | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  |     session_name = "new-session" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     assumed_role = sts_client.assume_role( | 
					
						
							|  |  |  |         RoleArn=iam_role_arn, RoleSessionName=session_name | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     access_key = assumed_role["Credentials"] | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     identity = boto3.client( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "sts", | 
					
						
							|  |  |  |         region_name="us-east-1", | 
					
						
							|  |  |  |         aws_access_key_id=access_key["AccessKeyId"], | 
					
						
							|  |  |  |         aws_secret_access_key=access_key["SecretAccessKey"], | 
					
						
							|  |  |  |     ).get_caller_identity() | 
					
						
							| 
									
										
										
										
											2019-08-21 12:20:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert identity["Arn"] == assumed_role["AssumedRoleUser"]["Arn"] | 
					
						
							|  |  |  |     assert identity["UserId"] == assumed_role["AssumedRoleUser"]["AssumedRoleId"] | 
					
						
							|  |  |  |     assert identity["Account"] == str(ACCOUNT_ID) | 
					
						
							| 
									
										
										
										
											2019-07-20 08:25:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sts | 
					
						
							|  |  |  | def test_federation_token_with_too_long_policy(): | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     """Test federation token with policy longer than 2048 character fails.""" | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     cli = boto3.client("sts", region_name="us-east-1") | 
					
						
							|  |  |  |     resource_tmpl = ( | 
					
						
							|  |  |  |         "arn:aws:s3:::yyyy-xxxxx-cloud-default/my_default_folder/folder-name-%s/*" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-07-20 08:25:46 +02:00
										 |  |  |     statements = [] | 
					
						
							|  |  |  |     for num in range(30): | 
					
						
							|  |  |  |         statements.append( | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 "Effect": "Allow", | 
					
						
							|  |  |  |                 "Action": ["s3:*"], | 
					
						
							|  |  |  |                 "Resource": resource_tmpl % str(num), | 
					
						
							| 
									
										
										
										
											2019-07-20 08:25:46 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     policy = {"Version": "2012-10-17", "Statement": statements} | 
					
						
							| 
									
										
										
										
											2019-07-20 08:25:46 +02:00
										 |  |  |     json_policy = json.dumps(policy) | 
					
						
							|  |  |  |     assert len(json_policy) > MAX_FEDERATION_TOKEN_POLICY_LENGTH | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     with pytest.raises(ClientError) as ex: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         cli.get_federation_token(Name="foo", DurationSeconds=3600, Policy=json_policy) | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert ex.value.response["Error"]["Code"] == "ValidationError" | 
					
						
							|  |  |  |     assert ( | 
					
						
							|  |  |  |         str(MAX_FEDERATION_TOKEN_POLICY_LENGTH) in ex.value.response["Error"]["Message"] | 
					
						
							| 
									
										
										
										
											2019-07-20 08:25:46 +02:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-01-08 06:22:12 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 21:23:33 +00:00
										 |  |  | @patch.dict("os.environ", {"MOTO_ENABLE_ISO_REGIONS": "true"}) | 
					
						
							| 
									
										
										
										
											2023-06-18 08:05:55 -04:00
										 |  |  | @pytest.mark.parametrize("region", ["us-west-2", "cn-northwest-1", "us-isob-east-1"]) | 
					
						
							| 
									
										
										
										
											2021-01-08 06:22:12 -08:00
										 |  |  | @mock_sts | 
					
						
							|  |  |  | def test_sts_regions(region): | 
					
						
							|  |  |  |     client = boto3.client("sts", region_name=region) | 
					
						
							|  |  |  |     resp = client.get_caller_identity() | 
					
						
							| 
									
										
										
										
											2023-08-10 18:03:47 -04:00
										 |  |  |     assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200 |