nnanh3-msal-browser
Version:
Thư viện đã custom của azure masl có common kèm trong
193 lines (190 loc) • 7.57 kB
JavaScript
/*! @azure/msal-common v4.5.1 2021-08-02 */
;
import { __spreadArrays } from '../_virtual/_tslib.js';
import { ClientConfigurationError } from '../error/ClientConfigurationError.js';
import { StringUtils } from '../utils/StringUtils.js';
import { ClientAuthError } from '../error/ClientAuthError.js';
import { OIDC_SCOPES } from '../utils/Constants.js';
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
/**
* The ScopeSet class creates a set of scopes. Scopes are case-insensitive, unique values, so the Set object in JS makes
* the most sense to implement for this class. All scopes are trimmed and converted to lower case strings in intersection and union functions
* to ensure uniqueness of strings.
*/
var ScopeSet = /** @class */ (function () {
function ScopeSet(inputScopes) {
var _this = this;
// Filter empty string and null/undefined array items
var scopeArr = inputScopes ? StringUtils.trimArrayEntries(__spreadArrays(inputScopes)) : [];
var filteredInput = scopeArr ? StringUtils.removeEmptyStringsFromArray(scopeArr) : [];
// Validate and filter scopes (validate function throws if validation fails)
this.validateInputScopes(filteredInput);
this.scopes = new Set(); // Iterator in constructor not supported by IE11
filteredInput.forEach(function (scope) { return _this.scopes.add(scope); });
}
/**
* Factory method to create ScopeSet from space-delimited string
* @param inputScopeString
* @param appClientId
* @param scopesRequired
*/
ScopeSet.fromString = function (inputScopeString) {
var scopeString = inputScopeString || "";
var inputScopes = scopeString.split(" ");
return new ScopeSet(inputScopes);
};
/**
* Used to validate the scopes input parameter requested by the developer.
* @param {Array<string>} inputScopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.
* @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not
*/
ScopeSet.prototype.validateInputScopes = function (inputScopes) {
// Check if scopes are required but not given or is an empty array
if (!inputScopes || inputScopes.length < 1) {
throw ClientConfigurationError.createEmptyScopesArrayError();
}
};
/**
* Check if a given scope is present in this set of scopes.
* @param scope
*/
ScopeSet.prototype.containsScope = function (scope) {
var lowerCaseScopes = this.printScopesLowerCase().split(" ");
var lowerCaseScopesSet = new ScopeSet(lowerCaseScopes);
// compare lowercase scopes
return !StringUtils.isEmpty(scope) ? lowerCaseScopesSet.scopes.has(scope.toLowerCase()) : false;
};
/**
* Check if a set of scopes is present in this set of scopes.
* @param scopeSet
*/
ScopeSet.prototype.containsScopeSet = function (scopeSet) {
var _this = this;
if (!scopeSet || scopeSet.scopes.size <= 0) {
return false;
}
return (this.scopes.size >= scopeSet.scopes.size && scopeSet.asArray().every(function (scope) { return _this.containsScope(scope); }));
};
/**
* Check if set of scopes contains only the defaults
*/
ScopeSet.prototype.containsOnlyOIDCScopes = function () {
var _this = this;
var defaultScopeCount = 0;
OIDC_SCOPES.forEach(function (defaultScope) {
if (_this.containsScope(defaultScope)) {
defaultScopeCount += 1;
}
});
return this.scopes.size === defaultScopeCount;
};
/**
* Appends single scope if passed
* @param newScope
*/
ScopeSet.prototype.appendScope = function (newScope) {
if (!StringUtils.isEmpty(newScope)) {
this.scopes.add(newScope.trim());
}
};
/**
* Appends multiple scopes if passed
* @param newScopes
*/
ScopeSet.prototype.appendScopes = function (newScopes) {
var _this = this;
try {
newScopes.forEach(function (newScope) { return _this.appendScope(newScope); });
}
catch (e) {
throw ClientAuthError.createAppendScopeSetError(e);
}
};
/**
* Removes element from set of scopes.
* @param scope
*/
ScopeSet.prototype.removeScope = function (scope) {
if (StringUtils.isEmpty(scope)) {
throw ClientAuthError.createRemoveEmptyScopeFromSetError(scope);
}
this.scopes.delete(scope.trim());
};
/**
* Removes default scopes from set of scopes
* Primarily used to prevent cache misses if the default scopes are not returned from the server
*/
ScopeSet.prototype.removeOIDCScopes = function () {
var _this = this;
OIDC_SCOPES.forEach(function (defaultScope) {
_this.scopes.delete(defaultScope);
});
};
/**
* Combines an array of scopes with the current set of scopes.
* @param otherScopes
*/
ScopeSet.prototype.unionScopeSets = function (otherScopes) {
if (!otherScopes) {
throw ClientAuthError.createEmptyInputScopeSetError();
}
var unionScopes = new Set(); // Iterator in constructor not supported in IE11
otherScopes.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
this.scopes.forEach(function (scope) { return unionScopes.add(scope.toLowerCase()); });
return unionScopes;
};
/**
* Check if scopes intersect between this set and another.
* @param otherScopes
*/
ScopeSet.prototype.intersectingScopeSets = function (otherScopes) {
if (!otherScopes) {
throw ClientAuthError.createEmptyInputScopeSetError();
}
// Do not allow OIDC scopes to be the only intersecting scopes
if (!otherScopes.containsOnlyOIDCScopes()) {
otherScopes.removeOIDCScopes();
}
var unionScopes = this.unionScopeSets(otherScopes);
var sizeOtherScopes = otherScopes.getScopeCount();
var sizeThisScopes = this.getScopeCount();
var sizeUnionScopes = unionScopes.size;
return sizeUnionScopes < (sizeThisScopes + sizeOtherScopes);
};
/**
* Returns size of set of scopes.
*/
ScopeSet.prototype.getScopeCount = function () {
return this.scopes.size;
};
/**
* Returns the scopes as an array of string values
*/
ScopeSet.prototype.asArray = function () {
var array = [];
this.scopes.forEach(function (val) { return array.push(val); });
return array;
};
/**
* Prints scopes into a space-delimited string
*/
ScopeSet.prototype.printScopes = function () {
if (this.scopes) {
var scopeArr = this.asArray();
return scopeArr.join(" ");
}
return "";
};
/**
* Prints scopes into a space-delimited lower-case string (used for caching)
*/
ScopeSet.prototype.printScopesLowerCase = function () {
return this.printScopes().toLowerCase();
};
return ScopeSet;
}());
export { ScopeSet };
//# sourceMappingURL=ScopeSet.js.map