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<string>(topicArn))
return true;
}
}
}
return false;
}