package software.amazon.sns.topicinlinepolicy; import java.io.IOException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.function.Function; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import software.amazon.awssdk.awscore.AwsRequest; import software.amazon.awssdk.awscore.AwsResponse; import software.amazon.awssdk.core.ResponseBytes; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.pagination.sync.SdkIterable; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.cloudformation.exceptions.CfnInvalidRequestException; import software.amazon.cloudformation.proxy.LoggerProxy; import software.amazon.cloudformation.proxy.Credentials; import software.amazon.cloudformation.proxy.ProxyClient; import software.amazon.cloudformation.proxy.AmazonWebServicesClientProxy; public class AbstractTestBase { protected static final Credentials MOCK_CREDENTIALS; protected static final LoggerProxy logger; static { MOCK_CREDENTIALS = new Credentials("accessKey", "secretKey", "token"); logger = new LoggerProxy(); } static ProxyClient MOCK_PROXY( final AmazonWebServicesClientProxy proxy, final SnsClient snsClient) { return new ProxyClient() { @Override public ResponseT injectCredentialsAndInvokeV2( RequestT request, Function requestFunction) { return proxy.injectCredentialsAndInvokeV2(request, requestFunction); } @Override public CompletableFuture injectCredentialsAndInvokeV2Async( RequestT request, Function> requestFunction) { throw new UnsupportedOperationException(); } @Override public > IterableT injectCredentialsAndInvokeIterableV2( RequestT request, Function requestFunction) { return proxy.injectCredentialsAndInvokeIterableV2(request, requestFunction); } @Override public ResponseInputStream injectCredentialsAndInvokeV2InputStream( RequestT requestT, Function> function) { throw new UnsupportedOperationException(); } @Override public ResponseBytes injectCredentialsAndInvokeV2Bytes( RequestT requestT, Function> function) { throw new UnsupportedOperationException(); } @Override public SnsClient client() { return snsClient; } }; } public Map getSNSPolicy() { final String key = "SNSTopicSPolicy"; final String accountId = "123456789"; Map policy = new HashMap(); policy.put(key, policDocument(accountId, "*")); return policy; } public String policDocument(String accountId, String topicArn) { StringBuilder sb = new StringBuilder() .append("{") .append(" \"Version\": \"2008-10-17\",") .append(" \"Id\": \"__default_policy_ID\",") .append(" \"Statement\": [") .append(" {") .append(" \"Effect\": \"Allow\",") .append(" \"Sid\": \"__default_statement_ID\",") .append(" \"Principal\": {") .append(" \"AWS\": \"*\"") .append(" },") .append(" \"Action\": [") .append(" \"SNS:GetTopicAttributes\",") .append(" \"SNS:SetTopicAttributes\",") .append(" \"SNS:AddPermission\",") .append(" \"SNS:RemovePermission\",") .append(" \"SNS:DeleteTopic\",") .append(" \"SNS:Subscribe\",") .append(" \"SNS:ListSubscriptionsByTopic\",") .append(" \"SNS:Publish\"") .append(" ],") .append(" \"Resource\": \"").append(topicArn).append("\",") .append(" \"Condition\": {") .append(" \"StringEquals\": {") .append(" \"AWS:SourceOwner\": \"").append(accountId).append("\"") .append(" }") .append(" }") .append(" }") .append(" ]") .append("}"); return sb.toString(); } public String testPolicDocument(String accountId, String topicArn) { StringBuilder sb = new StringBuilder() .append("{") .append(" \"Version\": \"2008-10-17\",") .append(" \"Id\": \"__default_policy_ID\",") .append(" \"Statement\": [") .append(" {") .append(" \"Effect\": \"Allow\",") .append(" \"Sid\": \"__default_statement_ID\",") .append(" \"Principal\": {") .append(" \"AWS\": \"*\"") .append(" },") .append(" \"Action\": [") .append(" \"SNS:GetTopicAttributes\",") .append(" \"SNS:SetTopicAttributes\",") .append(" \"SNS:AddPermission\",") .append(" \"SNS:RemovePermission\"") .append(" ],") .append(" \"Resource\": \"").append(topicArn).append("\",") .append(" \"Condition\": {") .append(" \"StringEquals\": {") .append(" \"AWS:SourceOwner\": \"").append(accountId).append("\"") .append(" }") .append(" }") .append(" }") .append(" ]") .append("}"); return sb.toString(); } protected static Map convertStringToObject(String policyDocument) { ObjectMapper mapper = new ObjectMapper(); Map object = null; TypeReference> typeRef = new TypeReference>() { }; try { if (policyDocument != null) { object = mapper.readValue(URLDecoder.decode(policyDocument, StandardCharsets.UTF_8.toString()), typeRef); } } catch (IOException e) { throw new CfnInvalidRequestException(e); } return object; } public Map getDefaultTestMap(){ Map attributes = new HashMap<>(); attributes.put("Policy", policDocument(null, "arn:aws:sns:us-east-1:123456789012:sns-topic-name")); attributes.put("TopicArn", "arn:aws:sns:us-east-1:123456789012:sns-topic-name"); return attributes; } public Map getTestMap(){ Map attributes = new HashMap<>(); attributes.put("Policy", testPolicDocument(null, "arn:aws:sns:us-east-1:123456789012:sns-topic-name")); attributes.put("TopicArn", "arn:aws:sns:us-east-1:123456789012:sns-topic-name"); return attributes; } }