sdk/storage/storage-queue/src/SASQueryParameters.ts (118 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
import type { SasIPRange } from "./SasIPRange.js";
import { ipRangeToString } from "./SasIPRange.js";
import { truncatedISO8061Date } from "./utils/utils.common.js";
/**
* Protocols for generated SAS.
*/
export enum SASProtocol {
/**
* Protocol that allows HTTPS only
*/
Https = "https",
/**
* Protocol that allows both HTTPS and HTTP
*/
HttpsAndHttp = "https,http",
}
/**
* Represents the components that make up an Azure Storage SAS' query parameters. This type is not constructed directly
* by the user; it is only generated by the {@link AccountSASSignatureValues} and {@link QueueSASSignatureValues}
* types. Once generated, it can be encoded into a {@link String} and appended to a URL directly (though caution should
* be taken here in case there are existing query parameters, which might affect the appropriate means of appending
* these query parameters).
*
* NOTE: Instances of this class are immutable.
*/
export class SASQueryParameters {
/**
* The storage API version.
*/
public readonly version: string;
/**
* Optional. The allowed HTTP protocol(s).
*/
public readonly protocol?: SASProtocol;
/**
* Optional. The start time for this SAS token.
*/
public readonly startsOn?: Date;
/**
* Optional only when identifier is provided. The expiry time for this SAS token.
*/
public readonly expiresOn?: Date;
/**
* Optional only when identifier is provided.
* Please refer to {@link AccountSASPermissions}, {@link QueueSASPermissions} for more details.
*/
public readonly permissions?: string;
/**
* Optional. The storage services being accessed (only for Account SAS). Please refer to {@link AccountSASServices}
* for more details.
*/
public readonly services?: string;
/**
* Optional. The storage resource types being accessed (only for Account SAS). Please refer to
* {@link AccountSASResourceTypes} for more details.
*/
public readonly resourceTypes?: string;
/**
* Optional. The signed identifier (only for {@link QueueSASSignatureValues}).
*
* @see https://learn.microsoft.com/en-us/rest/api/storageservices/establishing-a-stored-access-policy
*/
public readonly identifier?: string;
/**
* Optional. The storage queue (only for {@link QueueSASSignatureValues}).
*/
public readonly resource?: string;
/**
* The signature for the SAS token.
*/
public readonly signature: string;
/**
* Inner value of getter ipRange.
*/
private readonly ipRangeInner?: SasIPRange;
/**
* Optional. IP range allowed for this SAS.
*
* @readonly
*/
public get ipRange(): SasIPRange | undefined {
if (this.ipRangeInner) {
return {
end: this.ipRangeInner.end,
start: this.ipRangeInner.start,
};
}
return undefined;
}
/**
* Creates an instance of SASQueryParameters.
*
* @param version - Representing the storage version
* @param signature - Representing the signature for the SAS token
* @param permissions - Representing the storage permissions
* @param services - Representing the storage services being accessed (only for Account SAS)
* @param resourceTypes - Representing the storage resource types being accessed (only for Account SAS)
* @param protocol - Representing the allowed HTTP protocol(s)
* @param startsOn - Representing the start time for this SAS token
* @param expiresOn - Representing the expiry time for this SAS token
* @param ipRange - Representing the range of valid IP addresses for this SAS token
* @param identifier - Representing the signed identifier (only for Service SAS)
* @param resource - Representing the storage queue (only for Service SAS)
*/
constructor(
version: string,
signature: string,
permissions?: string,
services?: string,
resourceTypes?: string,
protocol?: SASProtocol,
startsOn?: Date,
expiresOn?: Date,
ipRange?: SasIPRange,
identifier?: string,
resource?: string,
) {
this.version = version;
this.services = services;
this.resourceTypes = resourceTypes;
this.expiresOn = expiresOn;
this.permissions = permissions;
this.protocol = protocol;
this.startsOn = startsOn;
this.ipRangeInner = ipRange;
this.identifier = identifier;
this.resource = resource;
this.signature = signature;
}
/**
* Encodes all SAS query parameters into a string that can be appended to a URL.
*
*/
public toString(): string {
const params: string[] = ["sv", "ss", "srt", "spr", "st", "se", "sip", "si", "sr", "sp", "sig"];
const queries: string[] = [];
for (const param of params) {
switch (param) {
case "sv":
this.tryAppendQueryParameter(queries, param, this.version);
break;
case "ss":
this.tryAppendQueryParameter(queries, param, this.services);
break;
case "srt":
this.tryAppendQueryParameter(queries, param, this.resourceTypes);
break;
case "spr":
this.tryAppendQueryParameter(queries, param, this.protocol);
break;
case "st":
this.tryAppendQueryParameter(
queries,
param,
this.startsOn ? truncatedISO8061Date(this.startsOn, false) : undefined,
);
break;
case "se":
this.tryAppendQueryParameter(
queries,
param,
this.expiresOn ? truncatedISO8061Date(this.expiresOn, false) : undefined,
);
break;
case "sip":
this.tryAppendQueryParameter(
queries,
param,
this.ipRange ? ipRangeToString(this.ipRange) : undefined,
);
break;
case "si":
this.tryAppendQueryParameter(queries, param, this.identifier);
break;
case "sr":
this.tryAppendQueryParameter(queries, param, this.resource);
break;
case "sp":
this.tryAppendQueryParameter(queries, param, this.permissions);
break;
case "sig":
this.tryAppendQueryParameter(queries, param, this.signature);
break;
}
}
return queries.join("&");
}
/**
* A private helper method used to filter and append query key/value pairs into an array.
*
* @param queries -
* @param key -
* @param value -
*/
private tryAppendQueryParameter(queries: string[], key: string, value?: string): void {
if (!value) {
return;
}
key = encodeURIComponent(key);
value = encodeURIComponent(value);
if (key.length > 0 && value.length > 0) {
queries.push(`${key}=${value}`);
}
}
}