@@ -615,26 +615,60 @@ private static CloudBlobContainer CreateContainer(CloudBlobClient cloudBlobClien
615
615
}
616
616
617
617
CloudBlobContainer container = cloudBlobClient . GetContainerReference ( containerName . ToLowerInvariant ( ) ) ;
618
- if ( cloudBlobClient . Credentials . IsSAS )
618
+ if ( ! container . Exists ( ) )
619
619
{
620
- // Shared access signatures (SAS) have some limitations compared to shared access keys
621
- // read more on: https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1
622
- string [ ] sasTokenProperties = cloudBlobClient . Credentials . SASToken . Split ( "&" . ToCharArray ( ) , StringSplitOptions . RemoveEmptyEntries ) ;
623
- bool isAccountSas = sasTokenProperties . Where ( k => k . ToLowerInvariant ( ) . StartsWith ( "si=" ) ) . FirstOrDefault ( ) == null ;
624
- if ( isAccountSas )
620
+ if ( cloudBlobClient . Credentials . IsSAS )
625
621
{
626
- container . CreateIfNotExists ( ) ;
622
+ // Shared access signatures (SAS) have some limitations compared to shared access keys
623
+ // read more on: https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1
624
+ string [ ] sasTokenProperties = cloudBlobClient . Credentials . SASToken . Split ( "&" . ToCharArray ( ) , StringSplitOptions . RemoveEmptyEntries ) ;
625
+ bool isAccountSas = sasTokenProperties . Where ( k => k . ToLowerInvariant ( ) . StartsWith ( "ss=" ) ) . FirstOrDefault ( ) != null ;
627
626
628
- // permissions can't be set!
629
- }
627
+ string allowedServices = sasTokenProperties . Where ( k => k . ToLowerInvariant ( ) . StartsWith ( "ss=" ) ) . FirstOrDefault ( ) ;
628
+ if ( allowedServices != null )
629
+ {
630
+ allowedServices = allowedServices . Split ( '=' ) [ 1 ] . ToLower ( ) ;
631
+ }
632
+ else
633
+ {
634
+ allowedServices = string . Empty ;
635
+ }
630
636
631
- return container ;
632
- }
637
+ string resourceTypes = sasTokenProperties . Where ( k => k . ToLowerInvariant ( ) . StartsWith ( "srt=" ) ) . FirstOrDefault ( ) ;
638
+ if ( resourceTypes != null )
639
+ {
640
+ resourceTypes = resourceTypes . Split ( '=' ) [ 1 ] . ToLower ( ) ;
641
+ }
642
+ else
643
+ {
644
+ resourceTypes = string . Empty ;
645
+ }
633
646
634
- if ( ! container . Exists ( ) )
635
- {
636
- container . CreateIfNotExists ( ) ;
637
- container . SetPermissions ( new BlobContainerPermissions { PublicAccess = accessType } ) ;
647
+ string permissions = sasTokenProperties . Where ( k => k . ToLowerInvariant ( ) . StartsWith ( "sp=" ) ) . FirstOrDefault ( ) ;
648
+ if ( permissions != null )
649
+ {
650
+ permissions = permissions . Split ( '=' ) [ 1 ] . ToLower ( ) ;
651
+ }
652
+ else
653
+ {
654
+ permissions = string . Empty ;
655
+ }
656
+
657
+ bool canCreateContainer = allowedServices . Contains ( 'b' ) && resourceTypes . Contains ( 'c' ) && permissions . Contains ( 'c' ) ;
658
+ if ( canCreateContainer )
659
+ {
660
+ container . CreateIfNotExists ( ) ;
661
+
662
+ // cannot set permissions with sas access
663
+ }
664
+ }
665
+ else
666
+ {
667
+ container . CreateIfNotExists ( ) ;
668
+ BlobContainerPermissions newPermissions = container . GetPermissions ( ) ;
669
+ newPermissions . PublicAccess = accessType ;
670
+ container . SetPermissions ( newPermissions ) ;
671
+ }
638
672
}
639
673
640
674
return container ;
0 commit comments