@ebondu/angular2-keycloak
Version:
100 lines • 13.7 kB
JavaScript
/*
* Copyright 2018 ebondu and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* URI parser.
*/
export class URIParser {
static initialParse(uriToParse, responseMode) {
let baseUri;
let queryString;
let fragmentString;
const questionMarkIndex = uriToParse.indexOf('?');
let fragmentIndex = uriToParse.indexOf('#', questionMarkIndex + 1);
if (questionMarkIndex === -1 && fragmentIndex === -1) {
baseUri = uriToParse;
}
else if (questionMarkIndex !== -1) {
baseUri = uriToParse.substring(0, questionMarkIndex);
queryString = uriToParse.substring(questionMarkIndex + 1);
if (fragmentIndex !== -1) {
fragmentIndex = queryString.indexOf('#');
fragmentString = queryString.substring(fragmentIndex + 1);
queryString = queryString.substring(0, fragmentIndex);
}
}
else {
baseUri = uriToParse.substring(0, fragmentIndex);
fragmentString = uriToParse.substring(fragmentIndex + 1);
}
return { baseUri: baseUri, queryString: queryString, fragmentString: fragmentString };
}
static parseParams(paramString) {
const result = {};
const params = paramString.split('&');
for (let i = 0; i < params.length; i++) {
const p = params[i].split('=');
const paramName = decodeURIComponent(p[0]);
const paramValue = decodeURIComponent(p[1]);
result[paramName] = paramValue;
}
return result;
}
static handleQueryParam(paramName, paramValue, oauth) {
const supportedOAuthParams = ['code', 'state', 'error', 'session_state', 'error_description'];
for (let i = 0; i < supportedOAuthParams.length; i++) {
if (paramName === supportedOAuthParams[i]) {
oauth[paramName] = paramValue;
return true;
}
}
return false;
}
static parseUri(uriToParse, responseMode) {
const parsedUri = this.initialParse(decodeURIComponent(uriToParse), responseMode);
let queryParams = {};
if (parsedUri.queryString) {
queryParams = this.parseParams(parsedUri.queryString);
}
const oauth = { newUrl: parsedUri.baseUri };
Object.keys(queryParams).forEach(param => {
switch (param) {
case 'redirect_fragment':
oauth.fragment = queryParams[param];
break;
case 'prompt':
oauth.prompt = queryParams[param];
break;
default:
if (responseMode !== 'query' || !this.handleQueryParam(param, queryParams[param], oauth)) {
oauth.newUrl += (oauth.newUrl.indexOf('?') === -1 ? '?' : '&') + param + '=' + queryParams[param];
}
break;
}
});
if (responseMode === 'fragment') {
let fragmentParams = {};
if (parsedUri.fragmentString) {
fragmentParams = this.parseParams(parsedUri.fragmentString);
}
Object.keys(fragmentParams).forEach(param => {
oauth[param] = fragmentParams[param];
});
}
return oauth;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2xvYWsudXRpbHMuVVJJUGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWJvbmR1L2FuZ3VsYXIta2V5Y2xvYWsvc3JjL2xpYi91dGlsL2tleWNsb2FrLnV0aWxzLlVSSVBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFTO0lBRXBCLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBa0IsRUFBRSxZQUFvQjtRQUMxRCxJQUFJLE9BQWUsQ0FBQztRQUNwQixJQUFJLFdBQW1CLENBQUM7UUFDeEIsSUFBSSxjQUFzQixDQUFDO1FBRTNCLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLGFBQWEsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxJQUFJLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDdkIsQ0FBQzthQUFNLElBQUksaUJBQWlCLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxPQUFPLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNyRCxXQUFXLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFJLGFBQWEsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN6QixhQUFhLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFB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QkFDRSxJQUFJLFlBQVksS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN6RixLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BHLENBQUM7b0JBQ0QsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksWUFBWSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQUksY0FBYyxHQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDN0IsY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDMUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxOCBlYm9uZHUgYW5kL29yIGl0cyBhZmZpbGlhdGVzXG4gKiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIGFzIGluZGljYXRlZCBieSB0aGUgQGF1dGhvciB0YWdzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogVVJJIHBhcnNlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFVSSVBhcnNlciB7XG5cbiAgc3RhdGljIGluaXRpYWxQYXJzZSh1cmlUb1BhcnNlOiBzdHJpbmcsIHJlc3BvbnNlTW9kZTogc3RyaW5nKSB7XG4gICAgbGV0IGJhc2VVcmk6IHN0cmluZztcbiAgICBsZXQgcXVlcnlTdHJpbmc6IHN0cmluZztcbiAgICBsZXQgZnJhZ21lbnRTdHJpbmc6IHN0cmluZztcblxuICAgIGNvbnN0IHF1ZXN0aW9uTWFya0luZGV4ID0gdXJpVG9QYXJzZS5pbmRleE9mKCc/Jyk7XG4gICAgbGV0IGZyYWdtZW50SW5kZXggPSB1cmlUb1BhcnNlLmluZGV4T2YoJyMnLCBxdWVzdGlvbk1hcmtJbmRleCArIDEpO1xuICAgIGlmIChxdWVzdGlvbk1hcmtJbmRleCA9PT0gLTEgJiYgZnJhZ21lbnRJbmRleCA9PT0gLTEpIHtcbiAgICAgIGJhc2VVcmkgPSB1cmlUb1BhcnNlO1xuICAgIH0gZWxzZSBpZiAocXVlc3Rpb25NYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICBiYXNlVXJpID0gdXJpVG9QYXJzZS5zdWJzdHJpbmcoMCwgcXVlc3Rpb25NYXJrSW5kZXgpO1xuICAgICAgcXVlcnlTdHJpbmcgPSB1cmlUb1BhcnNlLnN1YnN0cmluZyhxdWVzdGlvbk1hcmtJbmRleCArIDEpO1xuICAgICAgaWYgKGZyYWdtZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgIGZyYWdtZW50SW5kZXggPSBxdWVyeVN0cmluZy5pbmRleE9mKCcjJyk7XG4gICAgICAgIGZyYWdtZW50U3RyaW5nID0gcXVlcnlTdHJpbmcuc3Vic3RyaW5nKGZyYWdtZW50SW5kZXggKyAxKTtcbiAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5zdWJzdHJpbmcoMCwgZnJhZ21lbnRJbmRleCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhc2VVcmkgPSB1cmlUb1BhcnNlLnN1YnN0cmluZygwLCBmcmFnbWVudEluZGV4KTtcbiAgICAgIGZyYWdtZW50U3RyaW5nID0gdXJpVG9QYXJzZS5zdWJzdHJpbmcoZnJhZ21lbnRJbmRleCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB7YmFzZVVyaTogYmFzZVVyaSwgcXVlcnlTdHJpbmc6IHF1ZXJ5U3RyaW5nLCBmcmFnbWVudFN0cmluZzogZnJhZ21lbnRTdHJpbmd9O1xuICB9XG5cbiAgc3RhdGljIHBhcnNlUGFyYW1zKHBhcmFtU3RyaW5nOiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtU3RyaW5nLnNwbGl0KCcmJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSBwYXJhbXNbaV0uc3BsaXQoJz0nKTtcbiAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChwWzBdKTtcbiAgICAgIGNvbnN0IHBhcmFtVmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQocFsxXSk7XG4gICAgICByZXN1bHRbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlUXVlcnlQYXJhbShwYXJhbU5hbWU6IHN0cmluZywgcGFyYW1WYWx1ZTogc3RyaW5nLCBvYXV0aDogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3VwcG9ydGVkT0F1dGhQYXJhbXMgPSBbJ2NvZGUnLCAnc3RhdGUnLCAnZXJyb3InLCAnc2Vzc2lvbl9zdGF0ZScsICdlcnJvcl9kZXNjcmlwdGlvbiddO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdXBwb3J0ZWRPQXV0aFBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhcmFtTmFtZSA9PT0gc3VwcG9ydGVkT0F1dGhQYXJhbXNbaV0pIHtcbiAgICAgICAgb2F1dGhbcGFyYW1OYW1lXSA9IHBhcmFtVmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuXG4gIHN0YXRpYyBwYXJzZVVyaSh1cmlUb1BhcnNlOiBzdHJpbmcsIHJlc3BvbnNlTW9kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFyc2VkVXJpID0gdGhpcy5pbml0aWFsUGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHVyaVRvUGFyc2UpLCByZXNwb25zZU1vZGUpO1xuXG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7fTtcbiAgICBpZiAocGFyc2VkVXJpLnF1ZXJ5U3RyaW5nKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VQYXJhbXMocGFyc2VkVXJpLnF1ZXJ5U3RyaW5nKTtcbiAgICB9XG5cbiAgICBjb25zdCBvYXV0aDogYW55ID0ge25ld1VybDogcGFyc2VkVXJpLmJhc2VVcml9O1xuXG4gICAgT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgc3dpdGNoIChwYXJhbSkge1xuICAgICAgICBjYXNlICdyZWRpcmVjdF9mcmFnbWVudCc6XG4gICAgICAgICAgb2F1dGguZnJhZ21lbnQgPSBxdWVyeVBhcmFtc1twYXJhbV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Byb21wdCc6XG4gICAgICAgICAgb2F1dGgucHJvbXB0ID0gcXVlcnlQYXJhbXNbcGFyYW1dO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChyZXNwb25zZU1vZGUgIT09ICdxdWVyeScgfHwgIXRoaXMuaGFuZGxlUXVlcnlQYXJhbShwYXJhbSwgcXVlcnlQYXJhbXNbcGFyYW1dLCBvYXV0aCkpIHtcbiAgICAgICAgICAgIG9hdXRoLm5ld1VybCArPSAob2F1dGgubmV3VXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgcGFyYW0gKyAnPScgKyBxdWVyeVBhcmFtc1twYXJhbV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlTW9kZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgbGV0IGZyYWdtZW50UGFyYW1zOiBhbnkgPSB7fTtcbiAgICAgIGlmIChwYXJzZWRVcmkuZnJhZ21lbnRTdHJpbmcpIHtcbiAgICAgICAgZnJhZ21lbnRQYXJhbXMgPSB0aGlzLnBhcnNlUGFyYW1zKHBhcnNlZFVyaS5mcmFnbWVudFN0cmluZyk7XG4gICAgICB9XG4gICAgICBPYmplY3Qua2V5cyhmcmFnbWVudFBhcmFtcykuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgIG9hdXRoW3BhcmFtXSA9IGZyYWdtZW50UGFyYW1zW3BhcmFtXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb2F1dGg7XG4gIH1cbn1cbiJdfQ==