/*
* Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Amazon.Runtime;
using Amazon.Runtime.SharedInterfaces;
using Amazon.SimpleNotificationService.Model;
using Amazon.Auth.AccessControlPolicy;
using Amazon.Auth.AccessControlPolicy.ActionIdentifiers;
using System.Globalization;
namespace Amazon.SimpleNotificationService
{
public partial class AmazonSimpleNotificationServiceClient
{
///
/// Add statement to the policy that gives the sns topic access to send a message to the queue.
///
///
///
///
private static void AddSQSPermission(Policy policy, string topicArn, string sqsQueueArn)
{
Statement statement = new Statement(Statement.StatementEffect.Allow);
statement.Actions.Add(SQSActionIdentifiers.SendMessage);
statement.Resources.Add(new Resource(sqsQueueArn));
statement.Conditions.Add(ConditionFactory.NewSourceArnCondition(topicArn));
statement.Principals.Add(new Principal("*"));
policy.Statements.Add(statement);
}
///
/// Check to see if the policy for the queue has already given permission to the topic.
///
///
///
///
///
private static bool HasSQSPermission(Policy policy, string topicArn, string sqsQueueArn)
{
foreach (Statement statement in policy.Statements)
{
// See if the statement contains the topic as a resource
bool containsResource = false;
foreach (var resource in statement.Resources)
{
if (resource.Id.Equals(sqsQueueArn))
{
containsResource = true;
break;
}
}
// If queue found as the resource see if the condition is for this topic
if (containsResource)
{
foreach (var condition in statement.Conditions)
{
if ((string.Equals(condition.Type, ConditionFactory.StringComparisonType.StringLike.ToString(), StringComparison.OrdinalIgnoreCase) ||
string.Equals(condition.Type, ConditionFactory.StringComparisonType.StringEquals.ToString(), StringComparison.OrdinalIgnoreCase) ||
string.Equals(condition.Type, ConditionFactory.ArnComparisonType.ArnEquals.ToString(), StringComparison.OrdinalIgnoreCase) ||
string.Equals(condition.Type, ConditionFactory.ArnComparisonType.ArnLike.ToString(), StringComparison.OrdinalIgnoreCase)) &&
string.Equals(condition.ConditionKey, ConditionFactory.SOURCE_ARN_CONDITION_KEY, StringComparison.OrdinalIgnoreCase) &&
condition.Values.Contains(topicArn))
return true;
}
}
}
return false;
}
///
/// Verifies that the ARN for the topic matches the topic name
///
///
///
///
private static bool TopicNameMatcher(string topicArn, string topicName)
{
if (String.IsNullOrEmpty(topicArn))
{
return false;
}
if (String.IsNullOrEmpty(topicName))
{
return false;
}
int indexOfLastColon = topicArn.LastIndexOf(":", StringComparison.OrdinalIgnoreCase);
if (indexOfLastColon.Equals(-1))
{
return false;
}
return topicArn.Substring(indexOfLastColon + 1).Equals(topicName);
}
///
/// Helper method for AuthorizeS3ToPublishAsync()
///
///
///
///
///
///
private static void GetNewPolicyAndStatementForTopicAttributes(Dictionary attributes, string topicArn, string bucket, out Policy policy, out Statement statement)
{
if(attributes.ContainsKey("Policy") && !string.IsNullOrEmpty(attributes["Policy"]))
{
policy = Policy.FromJson(attributes["Policy"]);
}
else
{
policy = new Policy();
}
var sourceArn = string.Format(CultureInfo.InvariantCulture, "arn:aws:s3:*:*:{0}", bucket);
statement = new Statement(Statement.StatementEffect.Allow);
statement.Actions.Add(SNSActionIdentifiers.Publish);
statement.Resources.Add(new Resource(topicArn));
statement.Conditions.Add(ConditionFactory.NewSourceArnCondition(sourceArn));
statement.Principals.Add(new Principal("*"));
}
}
}