diff --git a/Duplicati/Library/Backend/S3/S3IAM.cs b/Duplicati/Library/Backend/S3/S3IAM.cs index a33a7ac68..b53614c21 100644 --- a/Duplicati/Library/Backend/S3/S3IAM.cs +++ b/Duplicati/Library/Backend/S3/S3IAM.cs @@ -148,34 +148,51 @@ namespace Duplicati.Library.Backend return POLICY_DOCUMENT_TEMPLATE.Replace("bucket-name", bucketname).Trim(); } - private Dictionary CanCreateUser(string awsid, string awskey) + private IDictionary CanCreateUser(string awsid, string awskey) { var cl = new AmazonIdentityManagementServiceClient(awsid, awskey); - Dictionary dict; + User user; try { - var user = cl.GetUser().User; - - dict = new Dictionary - { - ["isroot"] = "False", - ["arn"] = user.Arn, - ["id"] = user.UserId, - ["name"] = user.UserName, - - ["isroot"] = (cl.SimulatePrincipalPolicy(new SimulatePrincipalPolicyRequest { PolicySourceArn = user.Arn, ActionNames = new[] { "iam:CreateUser" }.ToList() }).EvaluationResults.First().EvalDecision == PolicyEvaluationDecisionType.Allowed).ToString() - }; + user = cl.GetUser().User; } - catch (Exception ex) + catch (Exception ex) when (ex is NoSuchEntityException || ex is ServiceFailureException) { - dict = new Dictionary + return new Dictionary { ["ex"] = ex.ToString(), ["error"] = ex.Message }; } - return dict; + var resultDict = new Dictionary + { + ["isroot"] = "False", + ["arn"] = user.Arn, + ["id"] = user.UserId, + ["name"] = user.UserName, + }; + + var simulatePrincipalPolicy = new SimulatePrincipalPolicyRequest + { + PolicySourceArn = user.Arn, + ActionNames = new[] { "iam:CreateUser" }.ToList() + }; + + try + { + resultDict["isroot"] = (cl.SimulatePrincipalPolicy(simulatePrincipalPolicy). + EvaluationResults.First(). + EvalDecision == PolicyEvaluationDecisionType.Allowed). + ToString(); + } + catch (Exception ex) + { + resultDict["ex"] = ex.ToString(); + resultDict["ex"] = ex.Message; + } + + return resultDict; } private Dictionary CreateUnprivilegedUser(string awsid, string awskey, string path)