< Summary

Class:Azure.Data.Tables.Sas.TableAccountSasBuilder
Assembly:Azure.Data.Tables
File(s):C:\Git\azure-sdk-for-net\sdk\tables\Azure.Data.Tables\src\Sas\TableAccountSasBuilder.cs
Covered lines:50
Uncovered lines:13
Coverable lines:63
Total lines:232
Line coverage:79.3% (50 of 63)
Covered branches:5
Total branches:10
Branch coverage:50% (5 of 10)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor(...)-100%100%
.ctor(...)-100%100%
get_Protocol()-0%100%
get_StartsOn()-0%100%
get_ExpiresOn()-100%100%
get_Permissions()-100%100%
get_IPRange()-0%100%
get_Identifier()-0%100%
get_ResourceTypes()-100%100%
get_Version()-100%100%
SetPermissions(...)-100%100%
SetPermissions(...)-0%100%
ToSasQueryParameters(...)-100%50%
Sign(...)-100%100%
ToString()-0%100%
Equals(...)-0%100%
GetHashCode()-0%100%
EnsureState()-55.56%50%

File(s)

C:\Git\azure-sdk-for-net\sdk\tables\Azure.Data.Tables\src\Sas\TableAccountSasBuilder.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using System.ComponentModel;
 6using Azure.Core;
 7
 8namespace Azure.Data.Tables.Sas
 9{
 10    /// <summary>
 11    /// <see cref="TableAccountSasBuilder"/> is used to generate a Shared Access
 12    /// Signature (SAS) for an Azure Storage table.
 13    /// For more information, see <see href="https://docs.microsoft.com/en-us/rest/api/storageservices/create-account-sa
 14    /// </summary>
 15    public class TableAccountSasBuilder
 16    {
 17        /// <summary>
 18        /// Initializes an instance of a <see cref="TableAccountSasBuilder"/>.
 19        /// </summary>
 20        /// <param name="permissions">The permissions associated with the shared access signature.</param>
 21        /// <param name="resourceTypes"><see cref="TableAccountSasResourceTypes"/> containing the accessible resource ty
 22        /// <param name="expiresOn">The time at which the shared access signature becomes invalid.</param>
 3623        public TableAccountSasBuilder(TableAccountSasPermissions permissions, TableAccountSasResourceTypes resourceTypes
 24        {
 3625            ExpiresOn = expiresOn;
 3626            SetPermissions(permissions);
 3627            ResourceTypes = resourceTypes;
 3628        }
 29
 30        /// <summary>
 31        /// Initializes an instance of a <see cref="TableAccountSasBuilder"/>.
 32        /// </summary>
 33        /// <param name="rawPermissions">The permissions associated with the shared access signature. This string should
 34        /// <param name="resourceTypes"><see cref="TableAccountSasResourceTypes"/> containing the accessible resource ty
 35        /// <param name="expiresOn">The time at which the shared access signature becomes invalid.</param>
 436        public TableAccountSasBuilder(string rawPermissions, TableAccountSasResourceTypes resourceTypes, DateTimeOffset 
 37        {
 438            ExpiresOn = expiresOn;
 439            Permissions = rawPermissions;
 440            ResourceTypes = resourceTypes;
 441        }
 42
 43        /// <summary>
 44        /// The optional signed protocol field specifies the protocol
 45        /// permitted for a request made with the SAS.  Possible values are
 46        /// <see cref="TableSasProtocol.HttpsAndHttp"/>,
 47        /// <see cref="TableSasProtocol.Https"/>, and
 48        /// <see cref="TableSasProtocol.None"/>.
 49        /// </summary>
 050        public TableSasProtocol Protocol { get; set; }
 51
 52        /// <summary>
 53        /// Optionally specify the time at which the shared access signature
 54        /// becomes valid.  If omitted when DateTimeOffset.MinValue is used,
 55        /// start time for this call is assumed to be the time when the
 56        /// storage service receives the request.
 57        /// </summary>
 058        public DateTimeOffset StartsOn { get; set; }
 59
 60        /// <summary>
 61        /// The time at which the shared access signature becomes invalid.
 62        /// This field must be omitted if it has been specified in an
 63        /// associated stored access policy.
 64        /// </summary>
 14465        public DateTimeOffset ExpiresOn { get; set; }
 66
 67        /// <summary>
 68        /// The permissions associated with the shared access signature. The
 69        /// user is restricted to operations allowed by the permissions. This
 70        /// field must be omitted if it has been specified in an associated
 71        /// stored access policy.  <see cref="TableAccountSasPermissions"/> can be used to create the
 72        /// permissions string.
 73        /// </summary>
 14474        public string Permissions { get; private set; }
 75
 76        /// <summary>
 77        /// Specifies an IP address or a range of IP addresses from which to
 78        /// accept requests. If the IP address from which the request
 79        /// originates does not match the IP address or address range
 80        /// specified on the SAS token, the request is not authenticated.
 81        /// When specifying a range of IP addresses, note that the range is
 82        /// inclusive.
 83        /// </summary>
 084        public TableSasIPRange IPRange { get; set; }
 85
 86        /// <summary>
 87        /// An optional unique value up to 64 characters in length that
 88        /// correlates to an access policy specified for the container.
 89        /// </summary>
 090        public string Identifier { get; set; }
 91
 92        /// <summary>
 93        /// The resource types associated with the shared access signature. The
 94        /// user is restricted to operations on the specified resources.
 95        /// </summary>
 14496        public TableAccountSasResourceTypes ResourceTypes { get; set; }
 97
 98        /// <summary>
 99        /// The storage service version to use to authenticate requests made
 100        /// with this shared access signature, and the service version to use
 101        /// when handling requests made with this shared access signature.
 102        /// </summary>
 136103        internal string Version { get; set; }
 104
 105        /// <summary>
 106        /// Sets the permissions for a table SAS.
 107        /// </summary>
 108        /// <param name="permissions">
 109        /// <see cref="TableAccountSasPermissions"/> containing the allowed permissions.
 110        /// </param>
 111        public void SetPermissions(TableAccountSasPermissions permissions)
 112        {
 36113            Permissions = permissions.ToPermissionsString();
 36114        }
 115
 116        /// <summary>
 117        /// Sets the permissions for the SAS using a raw permissions string.
 118        /// </summary>
 119        /// <param name="rawPermissions">Raw permissions string for the SAS.</param>
 120        public void SetPermissions(string rawPermissions)
 121        {
 0122            Permissions = rawPermissions;
 0123        }
 124
 125        /// <summary>
 126        /// Use an account's <see cref="TableSharedKeyCredential"/> to sign this
 127        /// shared access signature values to produce the proper SAS query
 128        /// parameters for authenticating requests.
 129        /// </summary>
 130        /// <param name="sharedKeyCredential">
 131        /// The storage account's <see cref="TableSharedKeyCredential"/>.
 132        /// </param>
 133        /// <returns>
 134        /// An instance of <see cref="TableAccountSasQueryParameters"/>.
 135        /// </returns>
 136        public TableAccountSasQueryParameters ToSasQueryParameters(TableSharedKeyCredential sharedKeyCredential)
 137        {
 32138            sharedKeyCredential = sharedKeyCredential ?? throw Errors.ArgumentNull(nameof(sharedKeyCredential));
 139
 32140            EnsureState();
 141
 32142            var startTime = TableSasExtensions.FormatTimesForSasSigning(StartsOn);
 32143            var expiryTime = TableSasExtensions.FormatTimesForSasSigning(ExpiresOn);
 144
 145            // String to sign: https://docs.microsoft.com/en-us/rest/api/storageservices/create-account-sas#constructing
 32146            var stringToSign = string.Join("\n",
 32147                sharedKeyCredential.AccountName,
 32148                Permissions,
 32149                TableConstants.Sas.TableAccountServices.Table,
 32150                ResourceTypes.ToPermissionsString(),
 32151                startTime,
 32152                expiryTime,
 32153                IPRange.ToString(),
 32154                Protocol.ToProtocolString(),
 32155                Version,
 32156                "");
 32157            var signature = TableSharedKeyCredential.ComputeSasSignature(sharedKeyCredential, stringToSign);
 32158            var p = new TableAccountSasQueryParameters(
 32159                version: Version,
 32160                resourceTypes: ResourceTypes,
 32161                protocol: Protocol,
 32162                startsOn: StartsOn,
 32163                expiresOn: ExpiresOn,
 32164                ipRange: IPRange,
 32165                identifier: Identifier,
 32166                resource: null,
 32167                permissions: Permissions,
 32168                signature: signature);
 32169            return p;
 170        }
 171
 172        /// <summary>
 173        /// Use an account's <see cref="TableSharedKeyCredential"/> to sign this
 174        /// shared access signature values to produce the proper SAS query
 175        /// parameters for authenticating requests.
 176        /// </summary>
 177        /// <param name="sharedKeyCredential">
 178        /// The storage account's <see cref="TableSharedKeyCredential"/>.
 179        /// </param>
 180        /// <returns>
 181        /// A URL encoded query string representing the SAS.
 182        /// </returns>
 183        public string Sign(TableSharedKeyCredential sharedKeyCredential) =>
 32184            ToSasQueryParameters(sharedKeyCredential).ToString();
 185
 186        /// <summary>
 187        /// Returns a string that represents the current object.
 188        /// </summary>
 189        /// <returns>A string that represents the current object.</returns>
 190        [EditorBrowsable(EditorBrowsableState.Never)]
 0191        public override string ToString() => base.ToString();
 192
 193        /// <summary>
 194        /// Check if two TablesSasBuilder instances are equal.
 195        /// </summary>
 196        /// <param name="obj">The instance to compare to.</param>
 197        /// <returns>True if they're equal, false otherwise.</returns>
 198        [EditorBrowsable(EditorBrowsableState.Never)]
 0199        public override bool Equals(object obj) => base.Equals(obj);
 200
 201        /// <summary>
 202        /// Get a hash code for the TablesSasBuilder.
 203        /// </summary>
 204        /// <returns>Hash code for the TablesSasBuilder.</returns>
 205        [EditorBrowsable(EditorBrowsableState.Never)]
 0206        public override int GetHashCode() => base.GetHashCode();
 207
 208        /// <summary>
 209        /// Ensure the <see cref="TableAccountSasBuilder"/>'s properties are in a
 210        /// consistent state.
 211        /// </summary>
 212        private void EnsureState()
 213        {
 32214            if (ResourceTypes == default)
 215            {
 0216                throw Errors.SasMissingData(nameof(ResourceTypes));
 217            }
 32218            if (ExpiresOn == default)
 219            {
 0220                throw Errors.SasMissingData(nameof(ExpiresOn));
 221            }
 32222            if (string.IsNullOrEmpty(Permissions))
 223            {
 0224                throw Errors.SasMissingData(nameof(Permissions));
 225            }
 32226            if (string.IsNullOrEmpty(Version))
 227            {
 0228                Version = TableAccountSasQueryParameters.DefaultSasVersion;
 229            }
 32230        }
 231    }
 232}