public async void Unsupported_SignPostPolicy()
            {
                var signer  = UrlSigner.FromServiceAccountCredential(CreateFakeServiceAccountCredential());
                var options = Options
                              .FromExpiration(DateTimeOffset.UtcNow + TimeSpan.FromDays(1))
                              .WithSigningVersion(SigningVersion.V2);
                var postPolicy = PostPolicy.ForBucketAndKey("my-bucket", "my-test-object");

                Assert.Throws <NotSupportedException>(() => signer.Sign(postPolicy, options));
                await Assert.ThrowsAsync <NotSupportedException>(() => signer.SignAsync(postPolicy, options));
            }
Esempio n. 2
0
        public void PostPolicyTest(PostPolicyV4Test test)
        {
            var timestamp = test.PolicyInput.Timestamp.ToDateTime();
            var clock     = new FakeClock(timestamp);
            var signer    = UrlSigner
                            .FromServiceAccountCredential(StorageConformanceTestData.TestCredential)
                            .WithClock(clock);

            var options = Options
                          .FromDuration(TimeSpan.FromSeconds(test.PolicyInput.Expiration))
                          .WithSigningVersion(SigningVersion.V4)
                          .WithScheme(test.PolicyInput.Scheme);

            switch (test.PolicyInput.UrlStyle)
            {
            case UrlStyle.VirtualHostedStyle:
                options = options.WithUrlStyle(UrlSigner.UrlStyle.VirtualHostedStyle);
                break;

            case UrlStyle.BucketBoundHostname:
                options = options.WithBucketBoundHostname(test.PolicyInput.BucketBoundHostname);
                break;

            default:
                break;
            }

            var postPolicy = PostPolicy.ForBucketAndKey(test.PolicyInput.Bucket, test.PolicyInput.Object, new PostPolicyElementTestComparer());

            foreach (var field in test.PolicyInput.Fields)
            {
                if (field.Key.StartsWith("x-goog-meta-"))
                {
                    postPolicy.SetCustomField(PostPolicyCustomElement.GoogleMetadata, field.Key, field.Value);
                }
                else
                {
                    var element = GetStandardElement(field.Key);
                    if (element == PostPolicyStandardElement.SuccessActionStatus)
                    {
                        postPolicy.SetField(element, (HttpStatusCode)int.Parse(field.Value));
                    }
                    else
                    {
                        postPolicy.SetField(element, field.Value);
                    }
                }
            }

            for (int i = 0; i < test.PolicyInput.Conditions?.StartsWith?.Count; i += 2)
            {
                postPolicy.SetStartsWith(
                    GetStandardElement(test.PolicyInput.Conditions.StartsWith[i]),
                    test.PolicyInput.Conditions.StartsWith[i + 1]);
            }

            if (test.PolicyInput.Conditions?.ContentLengthRange?.Count > 0)
            {
                postPolicy.SetRange(PostPolicyStandardElement.ContentLength, test.PolicyInput.Conditions.ContentLengthRange[0], test.PolicyInput.Conditions.ContentLengthRange[1]);
            }

            var signedPostPolicy = signer.Sign(postPolicy, options);

            Assert.Equal(test.PolicyOutput.Url, signedPostPolicy.PostUrl.ToString());

            Assert.Equal(test.PolicyOutput.Fields.Count, signedPostPolicy.Fields.Count);
            foreach (var field in test.PolicyOutput.Fields)
            {
                Assert.True(signedPostPolicy.Fields.TryGetValue(field.Key, out object value));
                Assert.Equal(field.Value, value.ToString());
            }

            PostPolicyStandardElement GetStandardElement(string name) =>
            name switch
            {
                "acl" => PostPolicyStandardElement.Acl,
                "$acl" => PostPolicyStandardElement.Acl,
                "cache-control" => PostPolicyStandardElement.CacheControl,
                "$cache-control" => PostPolicyStandardElement.CacheControl,
                "success_action_status" => PostPolicyStandardElement.SuccessActionStatus,
                "$success_action_status" => PostPolicyStandardElement.SuccessActionStatus,
                "success_action_redirect" => PostPolicyStandardElement.SuccessActionRedirect,
                "$success_action_redirect" => PostPolicyStandardElement.SuccessActionRedirect,
                "content-disposition" => PostPolicyStandardElement.ContentDisposition,
                "$content-disposition" => PostPolicyStandardElement.ContentDisposition,
                "content-encoding" => PostPolicyStandardElement.ContentEncoding,
                "$content-encoding" => PostPolicyStandardElement.ContentEncoding,
                "content-type" => PostPolicyStandardElement.ContentType,
                _ => throw new NotImplementedException($"{name} missing from {nameof(GetStandardElement)}.")
            };
        }