Exemple #1
0
        private static Dictionary <string, int> BuildDictionaryOfIdsToIndices(ClaimPermissions permissions)
        {
            var permissionsDictionary = new Dictionary <string, int>();

            permissions.ResourceAccessRuleSets.ForEachAtIndex((r, i) => permissionsDictionary.Add(r.Id, i));
            return(permissionsDictionary);
        }
Exemple #2
0
        public async Task <OpenApiResult> GetClaimPermissionResourceAccessRulesAsync(
            IOpenApiContext context,
            string claimPermissionsId)
        {
            if (context is null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (claimPermissionsId is null)
            {
                throw new ArgumentNullException(nameof(claimPermissionsId));
            }

            ITenant tenant = await this.marainServicesTenancy.GetRequestingTenantAsync(context.CurrentTenantId).ConfigureAwait(false);

            IClaimPermissionsStore store = await this.permissionsStoreFactory.GetClaimPermissionsStoreAsync(tenant).ConfigureAwait(false);

            try
            {
                ClaimPermissions claimPermissions = await store.GetAsync(claimPermissionsId).ConfigureAwait(false);

                return(this.OkResult(claimPermissions.AllResourceAccessRules, "application/json"));
            }
            catch (ClaimPermissionsNotFoundException)
            {
                return(this.NotFoundResult());
            }
        }
Exemple #3
0
        /// <inheritdoc/>
        public async Task <ClaimPermissions> UpdateAsync(ClaimPermissions claimPermissions)
        {
            if (claimPermissions is null)
            {
                throw new ArgumentNullException(nameof(claimPermissions));
            }

            if (string.IsNullOrWhiteSpace(claimPermissions.ETag))
            {
                throw new ArgumentException(
                          "There is no ETag on this ClaimPermissions. Updates are not safe without an ETag.");
            }

            BlobClient blob = this.Container.GetBlobClient(claimPermissions.Id);
            string     serializedPermissions    = JsonConvert.SerializeObject(claimPermissions, this.serializerSettings);
            Response <BlobContentInfo> response = await blob.UploadAsync(
                BinaryData.FromString(serializedPermissions),
                new BlobUploadOptions { Conditions = new BlobRequestConditions {
                                            IfMatch = new ETag(claimPermissions.ETag)
                                        } })
                                                  .ConfigureAwait(false);

            claimPermissions.ETag = response.Value.ETag.ToString("G");
            return(claimPermissions);
        }
Exemple #4
0
        /// <inheritdoc/>
        public async Task <ClaimPermissions> CreateAsync(ClaimPermissions claimPermissions)
        {
            if (claimPermissions is null)
            {
                throw new ArgumentNullException(nameof(claimPermissions));
            }

            BlockBlobClient blob = this.Container.GetBlockBlobClient(claimPermissions.Id);
            string          serializedPermissions = JsonConvert.SerializeObject(claimPermissions, this.serializerSettings);

            try
            {
                using var content = BinaryData.FromString(serializedPermissions).ToStream();
                Response <BlobContentInfo> response = await blob.UploadAsync(
                    content,
                    new BlobUploadOptions { Conditions = new BlobRequestConditions {
                                                IfNoneMatch = ETag.All
                                            } })
                                                      .ConfigureAwait(false);

                claimPermissions.ETag = response.Value.ETag.ToString("G");
                return(claimPermissions);
            }
            catch (RequestFailedException x)
            {
                System.Diagnostics.Debug.WriteLine(x.ToString());
                throw new InvalidOperationException();
            }
        }
Exemple #5
0
        private async Task <ClaimPermissions> DownloadPermissionsAsync(string id)
        {
            BlobClient blob = this.Container.GetBlobClient(id);
            Response <BlobDownloadResult> response = await blob.DownloadContentAsync().ConfigureAwait(false);

            // Note: although BlobDownloadResult supports direct deserialization from JSON, using System.Text.Json
            // (meaning it can work directly with UTF-8 content, avoiding the conversion to UTF-16 we're doing
            // here) we currently depend on the JSON.NET serialization settings mechanism, so we have to use
            // this more inefficient route for now.
            string           permissionsJson = response.Value.Content.ToString();
            ClaimPermissions permissions     = JsonConvert.DeserializeObject <ClaimPermissions>(permissionsJson, this.serializerSettings);

            permissions.ETag = response.Value.Details.ETag.ToString("G");
            return(permissions);
        }
Exemple #6
0
        public async Task <OpenApiResult> CreateClaimPermissionsAsync(
            IOpenApiContext context,
            ClaimPermissions body)
        {
            if (context is null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (body is null)
            {
                throw new ArgumentNullException(nameof(body));
            }

            ITenant tenant = await this.marainServicesTenancy.GetRequestingTenantAsync(context.CurrentTenantId).ConfigureAwait(false);

            (bool allRulesExist, OpenApiResult failureResult) = await this.CheckRuleSetsExist(tenant, body.ResourceAccessRuleSets);

            if (!allRulesExist)
            {
                return(failureResult);
            }

            IClaimPermissionsStore claimPermissionsStore = await this.permissionsStoreFactory.GetClaimPermissionsStoreAsync(tenant).ConfigureAwait(false);

            try
            {
                ClaimPermissions result = await claimPermissionsStore.CreateAsync(body).ConfigureAwait(false);

                return(this.OkResult(result, "application/json"));
            }
            catch (InvalidOperationException)
            {
                var response = new JObject
                {
                    ["status"] = 400,
                    ["detail"] = "A ClaimPermissions with this ID has already been created",
                };
                return(new OpenApiResult
                {
                    StatusCode = 400,
                    Results = { { "application/json", response } },
                });
            }
        }
Exemple #7
0
        /// <inheritdoc/>
        public async Task <ClaimPermissions> GetAsync(string id)
        {
            if (id is null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            try
            {
                ClaimPermissions permissions = await this.DownloadPermissionsAsync(id);

                return(await this.UpdateRuleSetsAsync(permissions).ConfigureAwait(false));
            }
            catch (Exception ex) when(ex is not ResourceAccessRuleSetNotFoundException)
            {
                throw new ClaimPermissionsNotFoundException(id, ex);
            }
        }
Exemple #8
0
        /// <inheritdoc/>
        public async Task <(int HttpStatusCode, ClaimPermissions Result)> CreateClaimPermissionsAsync(ClaimPermissions newClaimPermissions)
        {
            this.ToClientLibraryType(newClaimPermissions, out Client.Models.CreateClaimPermissionsRequest input);
            HttpOperationResponse <object> result = await this.claimsServiceClient.CreateClaimPermissionsWithHttpMessagesAsync(
                this.testTenants.TransientClientTenantId,
                input);

            return(await GetStatusAndConvertedBody(result));
        }
Exemple #9
0
        private async Task <ClaimPermissions> UpdateRuleSetsAsync(ClaimPermissions permissions)
        {
            IEnumerable <ClaimPermissions> result = await this.UpdateRuleSetsAsync(new[] { permissions }, 1).ConfigureAwait(false);

            return(result.First());
        }
Exemple #10
0
        /// <inheritdoc/>
        public async Task <(int HttpStatusCode, ClaimPermissions Result)> CreateClaimPermissionsAsync(ClaimPermissions newClaimPermissions)
        {
            OpenApiResult result = await this.claimsService.CreateClaimPermissionsAsync(this.MakeOpenApiContext(), newClaimPermissions);

            result.Results.TryGetValue("application/json", out object claimPermissions);
            return(result.StatusCode, claimPermissions as ClaimPermissions);
        }