| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /**
- * Licensed Materials - Property of IBM
- * IBM Cognos Products: Glass
- * (C) Copyright IBM Corp. 2020
- * US Government Users Restricted Rights - Use, duplication or disclosure
- * restricted by GSA ADP Schedule Contract with IBM Corp.
- */
- import StringResources from "caglass/nls/StringResources";
- import UrlUtils from "baglass/core-client/js/core-client/utils/UrlUtils";
- import BrowserUtils from "baglass/core-client/js/core-client/utils/BrowserUtils";
- import CoreUtils from "baglass/core-client/js/core-client/utils/Utils";
- export enum SecondaryLoginConstants {
- path = "/login",
- parameters = "secondaryLogin=true",
- successMessageKey = "secondaryLoginSuccess",
- refreshMessageKey = "secondaryLoginRefresh"
- }
- const LOGIN_PATH = `${SecondaryLoginConstants.path}?${SecondaryLoginConstants.parameters}`;
- function showSuccessToast(glassContext: any): void {
- const callback = (e: any): void => {
- if (e.btn === "ok") {
- setTimeout(() => {
- glassContext.close().then(() => {
- const currentWindow = CoreUtils.getCurrentWindow();
- currentWindow.location = currentWindow.location.pathname;
- });
- }, 1);
- }
- };
- glassContext.appController.showMessage(
- StringResources.get(SecondaryLoginConstants.successMessageKey),
- StringResources.get(SecondaryLoginConstants.refreshMessageKey),
- "info",
- ["ok", "cancel"],
- "500px",
- callback,
- true,
- "ANSDialog"
- );
- }
- function addMessageListener(
- loginWindow: Window,
- glassContext: any,
- resolve: Function
- ): void {
- window.addEventListener(
- "message",
- (event: any): void => {
- if (loginWindow && event.source === loginWindow) {
- resolve(event.data);
- loginWindow.close();
- showSuccessToast(glassContext);
- }
- },
- {
- once: true
- }
- );
- }
- function addStorageListener(
- loginWindow: Window,
- glassContext: any,
- resolve: Function
- ): void {
- const storageEventHandler = (event: any): void => {
- let secondaryLoginResult;
- if (event.key && event.key === "secondaryLoginResult") {
- secondaryLoginResult = event.newValue;
- }
- if (secondaryLoginResult && loginWindow) {
- window.removeEventListener("storage", storageEventHandler);
- window.localStorage.removeItem("secondaryLoginResult");
- const data = JSON.parse(secondaryLoginResult);
- resolve(data);
- loginWindow.close();
- showSuccessToast(glassContext);
- }
- };
- window.addEventListener("storage", storageEventHandler);
- }
- export function postSecondaryLogin(
- currentWindow: Window,
- loginResult: any
- ): any {
- if (BrowserUtils.isIE()) {
- /* eslint-disable no-param-reassign */
- currentWindow.localStorage.secondaryLoginResult = JSON.stringify(
- loginResult
- );
- /* eslint-enable no-param-reassign */
- } else if (currentWindow.opener) {
- currentWindow.opener.postMessage(loginResult);
- } else {
- currentWindow.close();
- }
- return loginResult;
- }
- export default function secondaryLogin(
- glassContext: any,
- camError?: any
- ): Promise<any> {
- const gatewayPath = glassContext.gateway ? glassContext.gateway : "/bi";
- let loginUrl: string = window.location.origin + gatewayPath + LOGIN_PATH;
- if (camError) {
- const state = `&state=${UrlUtils.base64Encode(
- JSON.stringify(camError)
- )}`;
- loginUrl += state;
- }
- const secondaryLoginWindow: Window = window.open(loginUrl, "");
- const currentWindow = CoreUtils.getCurrentWindow();
- currentWindow.onbeforeunload = (): void => {
- if (secondaryLoginWindow) {
- secondaryLoginWindow.close();
- }
- };
- return new Promise((resolve, reject) => {
- try {
- if (secondaryLoginWindow) {
- secondaryLoginWindow.onbeforeunload = (): void => {
- reject(new Error("SecondaryLogin cancelled"));
- };
- }
- if (BrowserUtils.isIE()) {
- window.localStorage.removeItem("secondaryLoginResult");
- addStorageListener(secondaryLoginWindow, glassContext, resolve);
- } else {
- addMessageListener(secondaryLoginWindow, glassContext, resolve);
- }
- } catch (error) {
- reject(error);
- }
- }).catch(() => {
- glassContext.appController.unlockGlass();
- return Promise.reject();
- });
- }
|