Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
e135ca6
Merge pull request #83 from SeanFeldman/release-4.1.0
SeanFeldman Jan 16, 2019
6af62dc
Merge pull request #100 from SeanFeldman/release-5.0.0
SeanFeldman Mar 15, 2019
5a8ae31
Release 5.1.0 (#117)
SeanFeldman Jun 22, 2019
af1a862
Merge pull request #153 from SeanFeldman/develop
SeanFeldman Nov 12, 2019
cbf3480
Merge pull request #182 from SeanFeldman/develop
SeanFeldman Feb 28, 2020
d615d82
Merge pull request #192 from SeanFeldman/develop
SeanFeldman Apr 18, 2020
9756ae1
Initial take on Storage v12
SeanFeldman May 18, 2020
709c251
Merge branches 'develop', 'master' and 'storage-skd-v12' of https://g…
SeanFeldman May 19, 2020
3e2193a
Update ReceiveOnlyAzureStorageAttachment to use Storage v12 SDK
SeanFeldman May 20, 2020
51035f3
Initial take on Storage v12
SeanFeldman May 18, 2020
eb7a627
Update ReceiveOnlyAzureStorageAttachment to use Storage v12 SDK
SeanFeldman May 20, 2020
35a7efd
Bump MarkdownSnippets from 18.0.0 to 19.0.0 in /src (#206)
dependabot-preview[bot] Jun 3, 2020
4ce463f
update azure.storage.blobs nuget
SeanFeldman Jun 3, 2020
66b3262
Merge branches 'develop' and 'storage-skd-v12' of https://github.com/…
SeanFeldman Jun 3, 2020
00a9d61
Add Azure.Identity for authentication with SDK v12
SeanFeldman Jun 10, 2020
7629625
Minimal Configuration object
SeanFeldman Jun 19, 2020
703449d
Throw on what's not implemented
SeanFeldman Jun 19, 2020
b8d7073
Compiling, not working 100%
SeanFeldman Jun 22, 2020
f62ed2e
Reflecting StorageConnectionString to partse connection strings
SeanFeldman Jun 25, 2020
d679d28
Reflecting StorageConnectionString to partse connection strings
SeanFeldman Jun 25, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 14 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ var sender = new MessageSender(connectionString, queueName);
var config = new AzureStorageAttachmentConfiguration(storageConnectionString);
sender.RegisterAzureStorageAttachmentPlugin(config);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L14-L20' title='File snippet `configurationandregistration` was extracted from'>snippet source</a> | <a href='#snippet-configurationandregistration' title='Navigate to start of snippet `configurationandregistration`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L13-L19' title='File snippet `configurationandregistration` was extracted from'>snippet source</a> | <a href='#snippet-configurationandregistration' title='Navigate to start of snippet `configurationandregistration`'>anchor</a></sup>
<!-- endsnippet -->

Sending
Expand All @@ -72,7 +72,7 @@ var serialized = JsonConvert.SerializeObject(payload);
var payloadAsBytes = Encoding.UTF8.GetBytes(serialized);
var message = new Message(payloadAsBytes);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L26-L36' title='File snippet `attachmentsending` was extracted from'>snippet source</a> | <a href='#snippet-attachmentsending' title='Navigate to start of snippet `attachmentsending`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L25-L35' title='File snippet `attachmentsending` was extracted from'>snippet source</a> | <a href='#snippet-attachmentsending' title='Navigate to start of snippet `attachmentsending`'>anchor</a></sup>
<!-- endsnippet -->

Receiving
Expand All @@ -85,7 +85,7 @@ receiver.RegisterAzureStorageAttachmentPlugin(config);
var message = await receiver.ReceiveAsync().ConfigureAwait(false);
// message will contain the original payload
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L42-L49' title='File snippet `attachmentreceiving` was extracted from'>snippet source</a> | <a href='#snippet-attachmentreceiving' title='Navigate to start of snippet `attachmentreceiving`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L41-L48' title='File snippet `attachmentreceiving` was extracted from'>snippet source</a> | <a href='#snippet-attachmentreceiving' title='Navigate to start of snippet `attachmentreceiving`'>anchor</a></sup>
<!-- endsnippet -->

### Sending a message without exposing the storage account to receivers
Expand All @@ -102,7 +102,7 @@ var config = new AzureStorageAttachmentConfiguration(storageConnectionString)
messagePropertyToIdentifySasUri: "mySasUriProperty");
sender.RegisterAzureStorageAttachmentPlugin(config);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L54-L63' title='File snippet `configurationandregistrationsas` was extracted from'>snippet source</a> | <a href='#snippet-configurationandregistrationsas' title='Navigate to start of snippet `configurationandregistrationsas`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L53-L62' title='File snippet `configurationandregistrationsas` was extracted from'>snippet source</a> | <a href='#snippet-configurationandregistrationsas' title='Navigate to start of snippet `configurationandregistrationsas`'>anchor</a></sup>
<!-- endsnippet -->

Sending
Expand All @@ -118,7 +118,7 @@ var serialized = JsonConvert.SerializeObject(payload);
var payloadAsBytes = Encoding.UTF8.GetBytes(serialized);
var message = new Message(payloadAsBytes);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L111-L121' title='File snippet `attachmentsendingsas` was extracted from'>snippet source</a> | <a href='#snippet-attachmentsendingsas' title='Navigate to start of snippet `attachmentsendingsas`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L110-L120' title='File snippet `attachmentsendingsas` was extracted from'>snippet source</a> | <a href='#snippet-attachmentsendingsas' title='Navigate to start of snippet `attachmentsendingsas`'>anchor</a></sup>
<!-- endsnippet -->

Receiving only mode (w/o Storage account credentials)
Expand All @@ -131,7 +131,7 @@ Receiving only mode (w/o Storage account credentials)
messageReceiver.RegisterAzureStorageAttachmentPluginForReceivingOnly("mySasUriProperty");
var message = await messageReceiver.ReceiveAsync().ConfigureAwait(false);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L127-L134' title='File snippet `attachmentreceivingsas` was extracted from'>snippet source</a> | <a href='#snippet-attachmentreceivingsas' title='Navigate to start of snippet `attachmentreceivingsas`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L126-L133' title='File snippet `attachmentreceivingsas` was extracted from'>snippet source</a> | <a href='#snippet-attachmentreceivingsas' title='Navigate to start of snippet `attachmentreceivingsas`'>anchor</a></sup>
<!-- endsnippet -->

### Configure blob container name
Expand Down Expand Up @@ -167,7 +167,7 @@ var config = new AzureStorageAttachmentConfiguration(storageConnectionString)
});
sender.RegisterAzureStorageAttachmentPlugin(config);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L68-L80' title='File snippet `configure_blob_name_override` was extracted from'>snippet source</a> | <a href='#snippet-configure_blob_name_override' title='Navigate to start of snippet `configure_blob_name_override`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L67-L79' title='File snippet `configure_blob_name_override` was extracted from'>snippet source</a> | <a href='#snippet-configure_blob_name_override' title='Navigate to start of snippet `configure_blob_name_override`'>anchor</a></sup>
<!-- endsnippet -->


Expand All @@ -185,7 +185,7 @@ new AzureStorageAttachmentConfiguration(storageConnectionString)
messagePropertyToIdentifySasUri: "mySasUriProperty",
sasTokenValidationTime: TimeSpan.FromHours(12));
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L85-L92' title='File snippet `configure_blob_sas_uri_override` was extracted from'>snippet source</a> | <a href='#snippet-configure_blob_sas_uri_override' title='Navigate to start of snippet `configure_blob_sas_uri_override`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L84-L91' title='File snippet `configure_blob_sas_uri_override` was extracted from'>snippet source</a> | <a href='#snippet-configure_blob_sas_uri_override' title='Navigate to start of snippet `configure_blob_sas_uri_override`'>anchor</a></sup>
<!-- endsnippet -->

### Configure criteria for message max size identification
Expand All @@ -199,7 +199,7 @@ Default is to convert any body to attachment.
new AzureStorageAttachmentConfiguration(storageConnectionString,
messageMaxSizeReachedCriteria: message => message.Body.Length > 200 * 1024);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L139-L145' title='File snippet `configure_criteria_for_message_max_size_identification` was extracted from'>snippet source</a> | <a href='#snippet-configure_criteria_for_message_max_size_identification' title='Navigate to start of snippet `configure_criteria_for_message_max_size_identification`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L138-L144' title='File snippet `configure_criteria_for_message_max_size_identification` was extracted from'>snippet source</a> | <a href='#snippet-configure_criteria_for_message_max_size_identification' title='Navigate to start of snippet `configure_criteria_for_message_max_size_identification`'>anchor</a></sup>
<!-- endsnippet -->

### Configuring connection string provider
Expand All @@ -213,18 +213,19 @@ The plugin comes with a `PlainTextConnectionStringProvider` and can be used in t
var provider = new PlainTextConnectionStringProvider(connectionString);
var config = new AzureStorageAttachmentConfiguration(provider);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L151-L156' title='File snippet `configuring_connection_string_provider` was extracted from'>snippet source</a> | <a href='#snippet-configuring_connection_string_provider' title='Navigate to start of snippet `configuring_connection_string_provider`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L150-L155' title='File snippet `configuring_connection_string_provider` was extracted from'>snippet source</a> | <a href='#snippet-configuring_connection_string_provider' title='Navigate to start of snippet `configuring_connection_string_provider`'>anchor</a></sup>
<!-- endsnippet -->

### Configuring plugin using StorageCredentials (Service or Container SAS)

<!-- snippet: Configuring_plugin_using_StorageCredentials -->
<a id='snippet-configuring_plugin_using_storagecredentials'/></a>
```cs
var credentials = new StorageCredentials( /*Shared key OR Service SAS OR Container SAS*/);
var config = new AzureStorageAttachmentConfiguration(credentials, blobEndpoint);
// TODO: change
// var credentials = new StorageCredentials( /*Shared key OR Service SAS OR Container SAS*/);
// var config = new AzureStorageAttachmentConfiguration(credentials, blobEndpoint);
```
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L162-L167' title='File snippet `configuring_plugin_using_storagecredentials` was extracted from'>snippet source</a> | <a href='#snippet-configuring_plugin_using_storagecredentials' title='Navigate to start of snippet `configuring_plugin_using_storagecredentials`'>anchor</a></sup>
<sup><a href='/src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs#L161-L167' title='File snippet `configuring_plugin_using_storagecredentials` was extracted from'>snippet source</a> | <a href='#snippet-configuring_plugin_using_storagecredentials' title='Navigate to start of snippet `configuring_plugin_using_storagecredentials`'>anchor</a></sup>
<!-- endsnippet -->

See [`StorageCredentials`](https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.storage.auth.storagecredentials) for more details.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
namespace ServiceBus.AttachmentPlugin.Tests
{
using System;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.Storage.Auth;
using Xunit;

public class AzureStorageAttachmentConfigurationTests
{
const string ConnectionString = "AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1";

[Fact]
public async Task Should_apply_defaults_for_missing_arguments()
public void Should_apply_defaults_for_missing_arguments()
{
var configuration = new AzureStorageAttachmentConfiguration(new PlainTextConnectionStringProvider(ConnectionString))
var configuration = new AzureStorageAttachmentConfiguration(ConnectionString)
.WithBlobSasUri();
Assert.Equal(ConnectionString, await configuration.ConnectionStringProvider!.GetConnectionString());
Assert.NotEmpty(configuration.ContainerName);
Assert.NotEmpty(configuration.MessagePropertyToIdentifyAttachmentBlob);
Assert.Equal(AzureStorageAttachmentConfigurationExtensions.DefaultSasTokenValidationTime.Days, configuration.BlobSasTokenValidationTime!.Value.Days);
Expand All @@ -25,12 +22,12 @@ public async Task Should_apply_defaults_for_missing_arguments()

[Fact]
public void Should_not_accept_negative_token_validation_time() =>
Assert.Throws<ArgumentException>(() => new AzureStorageAttachmentConfiguration(new PlainTextConnectionStringProvider(ConnectionString))
Assert.Throws<ArgumentException>(() => new AzureStorageAttachmentConfiguration(ConnectionString)
.WithBlobSasUri(sasTokenValidationTime: TimeSpan.FromHours(-4)));

[Fact]
public void Should_throw_when_embedded_SAS_option_is_used_with_container_SAS() =>
Assert.Throws<Exception>(() => new AzureStorageAttachmentConfiguration(
new StorageCredentials("?sv=2018-03-28&sr=c&sig=5XxlRKoP4yEmibM2HhJlQuV7MG3rYgQXD89mLpNp%2F24%3D"), "http://127.0.0.1:10000/devstoreaccount1", "devstoreaccount1").WithBlobSasUri());
"http://127.0.0.1:10000/devstoreaccount1?sv=2018-03-28&sr=c&sig=5XxlRKoP4yEmibM2HhJlQuV7MG3rYgQXD89mLpNp%2F24%3D", "devstoreaccount1").WithBlobSasUri());
}
}
Original file line number Diff line number Diff line change
@@ -1,82 +1,85 @@
namespace ServiceBus.AttachmentPlugin.Tests
{
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Sas;

public class AzureStorageEmulatorFixture
{
static string ConnectionString = "UseDevelopmentStorage=true";
public static IProvideStorageConnectionString ConnectionStringProvider = new PlainTextConnectionStringProvider(ConnectionString);
CloudStorageAccount TestingStorageAccount = CloudStorageAccount.Parse(ConnectionString);
// development account
public const string TestingStorageAccountConnectionString = "UseDevelopmentStorage=true;";

public string GetBlobEndpoint()
public static string GetBlobEndpoint()
{
return TestingStorageAccount.BlobEndpoint.ToString();
return "http://127.0.0.1:10000/devstoreaccount1";
}

public async Task<string> GetContainerSas(string containerName)
public static async Task<string> GetContainerSas(string containerName)
{
// get container
var blobClient = TestingStorageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference(containerName);
if (!await container.ExistsAsync())
var containerClient = new BlobContainerClient(TestingStorageAccountConnectionString, containerName);
if (!await containerClient.ExistsAsync())
{
await container.CreateIfNotExistsAsync();
await containerClient.CreateIfNotExistsAsync();
}

await container.FetchAttributesAsync();
var permissionsFound = await container.GetPermissionsAsync();
await containerClient.GetPropertiesAsync();
BlobContainerAccessPolicy permissionsFound = await containerClient.GetAccessPolicyAsync();

// create access policy and store it
var accessPolicyId = "test-policy";

if (!permissionsFound.SharedAccessPolicies.ContainsKey(accessPolicyId))
var blobSignedIdentifier = permissionsFound.SignedIdentifiers.FirstOrDefault(x=> x.Id == accessPolicyId);
if (blobSignedIdentifier is null)
{
var permissions = new BlobContainerPermissions
var permissions = new BlobSignedIdentifier
{
PublicAccess = BlobContainerPublicAccessType.Off,
SharedAccessPolicies =
Id = accessPolicyId,
AccessPolicy = new BlobAccessPolicy
{
{
accessPolicyId,
new SharedAccessBlobPolicy
{
Permissions = SharedAccessBlobPermissions.Add | SharedAccessBlobPermissions.Create | SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write,
SharedAccessStartTime = DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(1)),
SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddDays(1)
}
}
Permissions = "acrw"
}
};

await container.SetPermissionsAsync(permissions);
await containerClient.SetAccessPolicyAsync(PublicAccessType.None, new []{permissions});
}
else
{
permissionsFound.SharedAccessPolicies[accessPolicyId].SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddDays(1);
await container.SetPermissionsAsync(permissionsFound);
blobSignedIdentifier.AccessPolicy.ExpiresOn = DateTimeOffset.UtcNow.AddDays(1);
await containerClient.SetAccessPolicyAsync(PublicAccessType.None, new []{blobSignedIdentifier});
}

// create SAS with policy
return container.GetSharedAccessSignature(null, accessPolicyId);
//return containerClient.sas.GetSharedAccessSignature(null, accessPolicyId);

var blobSasBuilder = new BlobSasBuilder
{
Identifier = accessPolicyId,
BlobContainerName = containerName,
// StartsOn = DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(1)),
// ExpiresOn = DateTimeOffset.UtcNow.AddDays(1)
};
//blobSasBuilder.SetPermissions(BlobSasPermissions.Add | BlobSasPermissions.Create | BlobSasPermissions.Read | BlobSasPermissions.Write);
var blobSasQueryParameters = blobSasBuilder.ToSasQueryParameters(new StorageSharedKeyCredential("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="));
var fullUri = $"{GetBlobEndpoint()}?{blobSasQueryParameters}";
return fullUri;
}

public async Task CreateContainer(string containerName)
{
var containerUri = new Uri($"{TestingStorageAccount.BlobEndpoint}/{containerName}");
var container = new CloudBlobContainer(containerUri, TestingStorageAccount.Credentials);
var container = new BlobContainerClient(TestingStorageAccountConnectionString, containerName);
if (!await container.ExistsAsync())
{
await container.CreateIfNotExistsAsync();
}
}
public async Task DeleteContainer(string containerName)
{
var containerUri = new Uri($"{TestingStorageAccount.BlobEndpoint}/{containerName}");
var container = new CloudBlobContainer(containerUri, TestingStorageAccount.Credentials);
var container = new BlobContainerClient(TestingStorageAccountConnectionString, containerName);
if (await container.ExistsAsync())
{
await container.DeleteIfExistsAsync();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netcoreapp3.1;net461</TargetFrameworks>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>ServiceBus.AttachmentPlugin.Tests</RootNamespace>
<Optimize>false</Optimize>
<SignAssembly>true</SignAssembly>
Expand Down
6 changes: 3 additions & 3 deletions src/ServiceBus.AttachmentPlugin.Tests/Snippets.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
using Microsoft.Azure.ServiceBus.Core;
using Microsoft.Azure.Storage.Auth;
using Newtonsoft.Json;

class Snippets
Expand Down Expand Up @@ -161,8 +160,9 @@ void Configuring_plugin_using_StorageCredentials(string connectionString, string
{
#region Configuring_plugin_using_StorageCredentials

var credentials = new StorageCredentials( /*Shared key OR Service SAS OR Container SAS*/);
var config = new AzureStorageAttachmentConfiguration(credentials, blobEndpoint);
// TODO: change
// var credentials = new StorageCredentials( /*Shared key OR Service SAS OR Container SAS*/);
// var config = new AzureStorageAttachmentConfiguration(credentials, blobEndpoint);

#endregion
}
Expand Down
Loading