SecondaryLoginService.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. * Licensed Materials - Property of IBM
  3. * IBM Cognos Products: Glass
  4. * (C) Copyright IBM Corp. 2020
  5. * US Government Users Restricted Rights - Use, duplication or disclosure
  6. * restricted by GSA ADP Schedule Contract with IBM Corp.
  7. */
  8. import StringResources from "caglass/nls/StringResources";
  9. import UrlUtils from "baglass/core-client/js/core-client/utils/UrlUtils";
  10. import BrowserUtils from "baglass/core-client/js/core-client/utils/BrowserUtils";
  11. import CoreUtils from "baglass/core-client/js/core-client/utils/Utils";
  12. export enum SecondaryLoginConstants {
  13. path = "/login",
  14. parameters = "secondaryLogin=true",
  15. successMessageKey = "secondaryLoginSuccess",
  16. refreshMessageKey = "secondaryLoginRefresh"
  17. }
  18. const LOGIN_PATH = `${SecondaryLoginConstants.path}?${SecondaryLoginConstants.parameters}`;
  19. function showSuccessToast(glassContext: any): void {
  20. const callback = (e: any): void => {
  21. if (e.btn === "ok") {
  22. setTimeout(() => {
  23. glassContext.close().then(() => {
  24. const currentWindow = CoreUtils.getCurrentWindow();
  25. currentWindow.location = currentWindow.location.pathname;
  26. });
  27. }, 1);
  28. }
  29. };
  30. glassContext.appController.showMessage(
  31. StringResources.get(SecondaryLoginConstants.successMessageKey),
  32. StringResources.get(SecondaryLoginConstants.refreshMessageKey),
  33. "info",
  34. ["ok", "cancel"],
  35. "500px",
  36. callback,
  37. true,
  38. "ANSDialog"
  39. );
  40. }
  41. function addMessageListener(
  42. loginWindow: Window,
  43. glassContext: any,
  44. resolve: Function
  45. ): void {
  46. window.addEventListener(
  47. "message",
  48. (event: any): void => {
  49. if (loginWindow && event.source === loginWindow) {
  50. resolve(event.data);
  51. loginWindow.close();
  52. showSuccessToast(glassContext);
  53. }
  54. },
  55. {
  56. once: true
  57. }
  58. );
  59. }
  60. function addStorageListener(
  61. loginWindow: Window,
  62. glassContext: any,
  63. resolve: Function
  64. ): void {
  65. const storageEventHandler = (event: any): void => {
  66. let secondaryLoginResult;
  67. if (event.key && event.key === "secondaryLoginResult") {
  68. secondaryLoginResult = event.newValue;
  69. }
  70. if (secondaryLoginResult && loginWindow) {
  71. window.removeEventListener("storage", storageEventHandler);
  72. window.localStorage.removeItem("secondaryLoginResult");
  73. const data = JSON.parse(secondaryLoginResult);
  74. resolve(data);
  75. loginWindow.close();
  76. showSuccessToast(glassContext);
  77. }
  78. };
  79. window.addEventListener("storage", storageEventHandler);
  80. }
  81. export function postSecondaryLogin(
  82. currentWindow: Window,
  83. loginResult: any
  84. ): any {
  85. if (BrowserUtils.isIE()) {
  86. /* eslint-disable no-param-reassign */
  87. currentWindow.localStorage.secondaryLoginResult = JSON.stringify(
  88. loginResult
  89. );
  90. /* eslint-enable no-param-reassign */
  91. } else if (currentWindow.opener) {
  92. currentWindow.opener.postMessage(loginResult);
  93. } else {
  94. currentWindow.close();
  95. }
  96. return loginResult;
  97. }
  98. export default function secondaryLogin(
  99. glassContext: any,
  100. camError?: any
  101. ): Promise<any> {
  102. const gatewayPath = glassContext.gateway ? glassContext.gateway : "/bi";
  103. let loginUrl: string = window.location.origin + gatewayPath + LOGIN_PATH;
  104. if (camError) {
  105. const state = `&state=${UrlUtils.base64Encode(
  106. JSON.stringify(camError)
  107. )}`;
  108. loginUrl += state;
  109. }
  110. const secondaryLoginWindow: Window = window.open(loginUrl, "");
  111. const currentWindow = CoreUtils.getCurrentWindow();
  112. currentWindow.onbeforeunload = (): void => {
  113. if (secondaryLoginWindow) {
  114. secondaryLoginWindow.close();
  115. }
  116. };
  117. return new Promise((resolve, reject) => {
  118. try {
  119. if (secondaryLoginWindow) {
  120. secondaryLoginWindow.onbeforeunload = (): void => {
  121. reject(new Error("SecondaryLogin cancelled"));
  122. };
  123. }
  124. if (BrowserUtils.isIE()) {
  125. window.localStorage.removeItem("secondaryLoginResult");
  126. addStorageListener(secondaryLoginWindow, glassContext, resolve);
  127. } else {
  128. addMessageListener(secondaryLoginWindow, glassContext, resolve);
  129. }
  130. } catch (error) {
  131. reject(error);
  132. }
  133. }).catch(() => {
  134. glassContext.appController.unlockGlass();
  135. return Promise.reject();
  136. });
  137. }