mirror of
https://github.com/bitwarden/web
synced 2025-12-11 05:43:16 +00:00
Compare commits
15 Commits
feature/co
...
feature/cm
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac8bd7292e | ||
|
|
2a4f6415d6 | ||
|
|
91eb60ebef | ||
|
|
29476f6744 | ||
|
|
ff7151fbbd | ||
|
|
4415720f3f | ||
|
|
c49a9aa330 | ||
|
|
189b4437d4 | ||
|
|
d22f17fc81 | ||
|
|
6efe992680 | ||
|
|
a1cde3c820 | ||
|
|
79b6f3595e | ||
|
|
d0c0db70c5 | ||
|
|
f05b9439cc | ||
|
|
371c21553c |
4
.github/workflows/version-bump.yml
vendored
4
.github/workflows/version-bump.yml
vendored
@@ -27,13 +27,13 @@ jobs:
|
|||||||
ref: version_bump_${{ github.event.inputs.version_number }}
|
ref: version_bump_${{ github.event.inputs.version_number }}
|
||||||
|
|
||||||
- name: Bump Version - package.json
|
- name: Bump Version - package.json
|
||||||
uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
|
uses: bitwarden/gh-actions/version-bump@0c263b3963211ccaf5804313c3b3a0bcc52d4b19
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version_number }}
|
version: ${{ github.event.inputs.version_number }}
|
||||||
file_path: "./package.json"
|
file_path: "./package.json"
|
||||||
|
|
||||||
- name: Bump Version - package-lock.json
|
- name: Bump Version - package-lock.json
|
||||||
uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945
|
uses: bitwarden/gh-actions/version-bump@0c263b3963211ccaf5804313c3b3a0bcc52d4b19
|
||||||
with:
|
with:
|
||||||
version: ${{ github.event.inputs.version_number }}
|
version: ${{ github.event.inputs.version_number }}
|
||||||
file_path: "./package-lock.json"
|
file_path: "./package-lock.json"
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ const { AngularWebpackPlugin } = require("@ngtools/webpack");
|
|||||||
const webpackConfig = require("../webpack.config");
|
const webpackConfig = require("../webpack.config");
|
||||||
|
|
||||||
webpackConfig.entry["app/main"] = "./bitwarden_license/src/app/main.ts";
|
webpackConfig.entry["app/main"] = "./bitwarden_license/src/app/main.ts";
|
||||||
webpackConfig.plugins[webpackConfig.plugins.length - 1].entryModule = "bitwarden_license/src/app/app.module#AppModule";
|
webpackConfig.plugins[webpackConfig.plugins.length - 1] = new AngularWebpackPlugin({
|
||||||
|
tsConfigPath: "tsconfig.json",
|
||||||
|
entryModule: "bitwarden_license/src/app/app.module#AppModule",
|
||||||
|
sourceMap: true,
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = webpackConfig;
|
module.exports = webpackConfig;
|
||||||
|
|||||||
17
config.js
17
config.js
@@ -30,24 +30,7 @@ function loadConfig(configName) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateSubstitutions(configObj) {
|
|
||||||
let result = {};
|
|
||||||
|
|
||||||
Object.keys(configObj.compileFlags ?? {}).forEach(key => {
|
|
||||||
result = { ...result, ...generateSubstitutionsForFlag(key) };
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function generateSubstitutionsForFlag(flagName) {
|
|
||||||
return {
|
|
||||||
"featureFlag: (.*)[\\s\\S]*?\\/\\/ endFeatureFlag": ""
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
load,
|
load,
|
||||||
log,
|
log,
|
||||||
generateSubstitutions,
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,8 +7,5 @@
|
|||||||
"proxyIdentity": "http://localhost:33656",
|
"proxyIdentity": "http://localhost:33656",
|
||||||
"proxyEvents": "http://localhost:46273",
|
"proxyEvents": "http://localhost:46273",
|
||||||
"proxyNotifications": "http://localhost:61840"
|
"proxyNotifications": "http://localhost:61840"
|
||||||
},
|
|
||||||
"compileFlags": {
|
|
||||||
"Test": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
jslib
2
jslib
Submodule jslib updated: e4cd0af2f9...462a4d7c56
@@ -4,6 +4,7 @@ import { ToastrModule } from "ngx-toastr";
|
|||||||
import { BroadcasterMessagingService } from "../../services/broadcasterMessaging.service";
|
import { BroadcasterMessagingService } from "../../services/broadcasterMessaging.service";
|
||||||
import { HtmlStorageService } from "../../services/htmlStorage.service";
|
import { HtmlStorageService } from "../../services/htmlStorage.service";
|
||||||
import { I18nService } from "../../services/i18n.service";
|
import { I18nService } from "../../services/i18n.service";
|
||||||
|
import { KeyConnectorService } from "../../services/keyConnector.service";
|
||||||
import { MemoryStorageService } from "../../services/memoryStorage.service";
|
import { MemoryStorageService } from "../../services/memoryStorage.service";
|
||||||
import { PasswordRepromptService } from "../../services/passwordReprompt.service";
|
import { PasswordRepromptService } from "../../services/passwordReprompt.service";
|
||||||
import { StateService } from "../../services/state.service";
|
import { StateService } from "../../services/state.service";
|
||||||
@@ -40,6 +41,7 @@ import { EventService as EventLoggingServiceAbstraction } from "jslib-common/abs
|
|||||||
import { FolderService as FolderServiceAbstraction } from "jslib-common/abstractions/folder.service";
|
import { FolderService as FolderServiceAbstraction } from "jslib-common/abstractions/folder.service";
|
||||||
import { I18nService as I18nServiceAbstraction } from "jslib-common/abstractions/i18n.service";
|
import { I18nService as I18nServiceAbstraction } from "jslib-common/abstractions/i18n.service";
|
||||||
import { ImportService as ImportServiceAbstraction } from "jslib-common/abstractions/import.service";
|
import { ImportService as ImportServiceAbstraction } from "jslib-common/abstractions/import.service";
|
||||||
|
import { KeyConnectorService as KeyConnectorServiceAbstraction } from "jslib-common/abstractions/keyConnector.service";
|
||||||
import { LogService } from "jslib-common/abstractions/log.service";
|
import { LogService } from "jslib-common/abstractions/log.service";
|
||||||
import { MessagingService as MessagingServiceAbstraction } from "jslib-common/abstractions/messaging.service";
|
import { MessagingService as MessagingServiceAbstraction } from "jslib-common/abstractions/messaging.service";
|
||||||
import { NotificationsService as NotificationsServiceAbstraction } from "jslib-common/abstractions/notifications.service";
|
import { NotificationsService as NotificationsServiceAbstraction } from "jslib-common/abstractions/notifications.service";
|
||||||
@@ -190,6 +192,10 @@ export function initFactory(
|
|||||||
provide: PasswordRepromptServiceAbstraction,
|
provide: PasswordRepromptServiceAbstraction,
|
||||||
useClass: PasswordRepromptService,
|
useClass: PasswordRepromptService,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
provide: KeyConnectorServiceAbstraction,
|
||||||
|
useClass: KeyConnectorService,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class ServicesModule {}
|
export class ServicesModule {}
|
||||||
|
|||||||
@@ -587,7 +587,6 @@
|
|||||||
id="idEmail"
|
id="idEmail"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
type="text"
|
type="text"
|
||||||
inputmode="email"
|
|
||||||
name="Identity.Email"
|
name="Identity.Email"
|
||||||
[(ngModel)]="cipher.identity.email"
|
[(ngModel)]="cipher.identity.email"
|
||||||
appInputVerbatim
|
appInputVerbatim
|
||||||
@@ -600,7 +599,6 @@
|
|||||||
id="idPhone"
|
id="idPhone"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
type="text"
|
type="text"
|
||||||
inputmode="tel"
|
|
||||||
name="Identity.Phone"
|
name="Identity.Phone"
|
||||||
[(ngModel)]="cipher.identity.phone"
|
[(ngModel)]="cipher.identity.phone"
|
||||||
[disabled]="cipher.isDeleted || viewOnly"
|
[disabled]="cipher.isDeleted || viewOnly"
|
||||||
|
|||||||
@@ -37,9 +37,6 @@ import { SyncService } from "jslib-common/abstractions/sync.service";
|
|||||||
import { TokenService } from "jslib-common/abstractions/token.service";
|
import { TokenService } from "jslib-common/abstractions/token.service";
|
||||||
|
|
||||||
import { ModalService } from "jslib-angular/services/modal.service";
|
import { ModalService } from "jslib-angular/services/modal.service";
|
||||||
// featureFlag: Test
|
|
||||||
import { TestService } from 'jslib-common/services/test.service';
|
|
||||||
// endFeatureFlag
|
|
||||||
|
|
||||||
const BroadcasterSubscriptionId = "VaultComponent";
|
const BroadcasterSubscriptionId = "VaultComponent";
|
||||||
|
|
||||||
@@ -92,12 +89,10 @@ export class VaultComponent implements OnInit, OnDestroy {
|
|||||||
private ngZone: NgZone,
|
private ngZone: NgZone,
|
||||||
private stateService: StateService,
|
private stateService: StateService,
|
||||||
private organizationService: OrganizationService,
|
private organizationService: OrganizationService,
|
||||||
private providerService: ProviderService,
|
private providerService: ProviderService
|
||||||
/* featureFlag: Test */private testService: TestService, // endFeatureFlag
|
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async ngOnInit() {
|
async ngOnInit() {
|
||||||
/** featureFlag: Test */ this.testService.Print("test service was loaded"); // endFeatureFlag
|
|
||||||
this.showVerifyEmail = !(await this.tokenService.getEmailVerified());
|
this.showVerifyEmail = !(await this.tokenService.getEmailVerified());
|
||||||
this.showBrowserOutdated = window.navigator.userAgent.indexOf("MSIE") !== -1;
|
this.showBrowserOutdated = window.navigator.userAgent.indexOf("MSIE") !== -1;
|
||||||
this.trashCleanupWarning = this.i18nService.t(
|
this.trashCleanupWarning = this.i18nService.t(
|
||||||
|
|||||||
12
src/connectors/cme.html
Normal file
12
src/connectors/cme.html
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
|
||||||
|
/>
|
||||||
|
<title>Bitwarden CME Connector</title>
|
||||||
|
</head>
|
||||||
|
<body></body>
|
||||||
|
</html>
|
||||||
135
src/connectors/cme.ts
Normal file
135
src/connectors/cme.ts
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
import { KeyConnectorUserKeyResponse } from "jslib-common/models/response/keyConnectorUserKeyResponse";
|
||||||
|
import { b64Decode, getQsParam } from "./common";
|
||||||
|
|
||||||
|
document.addEventListener("DOMContentLoaded", () => {
|
||||||
|
init();
|
||||||
|
});
|
||||||
|
|
||||||
|
let parentUrl: string = null;
|
||||||
|
let parentOrigin: string = null;
|
||||||
|
let sentSuccess = false;
|
||||||
|
|
||||||
|
async function init() {
|
||||||
|
await start();
|
||||||
|
onMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function start() {
|
||||||
|
sentSuccess = false;
|
||||||
|
|
||||||
|
const data = getQsParam("data");
|
||||||
|
if (!data) {
|
||||||
|
error("No data.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
parentUrl = getQsParam("parent");
|
||||||
|
if (!parentUrl) {
|
||||||
|
error("No parent.");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
parentUrl = decodeURIComponent(parentUrl);
|
||||||
|
parentOrigin = new URL(parentUrl).origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
let decodedData: any;
|
||||||
|
try {
|
||||||
|
decodedData = JSON.parse(b64Decode(data));
|
||||||
|
} catch (e) {
|
||||||
|
error("Cannot parse data.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const keyConnectorUrl = new URL(decodedData.url);
|
||||||
|
const bearerAccessToken = decodedData.token;
|
||||||
|
const operation = decodedData.operation;
|
||||||
|
const key = decodedData.key;
|
||||||
|
|
||||||
|
if (keyConnectorUrl.hostname === "vault.bitwarden.com") {
|
||||||
|
error("Invalid hostname.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (operation === "get") {
|
||||||
|
const getRequest = new Request(keyConnectorUrl.href + "user-keys", {
|
||||||
|
cache: "no-store",
|
||||||
|
method: "GET",
|
||||||
|
headers: new Headers({
|
||||||
|
Accept: "application/json",
|
||||||
|
Authorization: "Bearer " + bearerAccessToken,
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
getRequest.headers.set("Cache-Control", "no-store");
|
||||||
|
getRequest.headers.set("Pragma", "no-cache");
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(getRequest);
|
||||||
|
if (response.status !== 200) {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
success(new KeyConnectorUserKeyResponse(await response.json()));
|
||||||
|
} catch {
|
||||||
|
error("Error getting key");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else if (operation === "post") {
|
||||||
|
const postRequest = new Request(keyConnectorUrl.href + "user-keys", {
|
||||||
|
cache: "no-store",
|
||||||
|
method: "POST",
|
||||||
|
headers: new Headers({
|
||||||
|
Accept: "application/json",
|
||||||
|
Authorization: "Bearer " + bearerAccessToken,
|
||||||
|
"Content-Type": "application/json; charset=utf-8",
|
||||||
|
}),
|
||||||
|
body: JSON.stringify({ key: key }),
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(postRequest);
|
||||||
|
if (response.status !== 200) {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
error("Error posting key");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
success(null);
|
||||||
|
} else {
|
||||||
|
// TODO: put operation
|
||||||
|
error("Unsupported operation.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMessage() {
|
||||||
|
window.addEventListener(
|
||||||
|
"message",
|
||||||
|
(event) => {
|
||||||
|
if (!event.origin || event.origin === "" || event.origin !== parentOrigin) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.data === "start") {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function error(message: string) {
|
||||||
|
parent.postMessage("error|" + message, parentUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
function success(response: KeyConnectorUserKeyResponse) {
|
||||||
|
if (sentSuccess) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
parent.postMessage(
|
||||||
|
"success|" + (response != null && response.key != null ? response.key : ""),
|
||||||
|
parentUrl
|
||||||
|
);
|
||||||
|
sentSuccess = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function info(message: string | object) {
|
||||||
|
parent.postMessage("info|" + JSON.stringify(message), parentUrl);
|
||||||
|
}
|
||||||
@@ -3445,7 +3445,7 @@
|
|||||||
"message": "Αποσύνδεση SSO"
|
"message": "Αποσύνδεση SSO"
|
||||||
},
|
},
|
||||||
"unlinkSsoConfirmation": {
|
"unlinkSsoConfirmation": {
|
||||||
"message": "Είστε βέβαιοι ότι θέλετε να αποσυνδέσετε το SSO για αυτόν τον οργανισμό;"
|
"message": "Are you sure you want to unlink SSO for this organization?"
|
||||||
},
|
},
|
||||||
"linkSso": {
|
"linkSso": {
|
||||||
"message": "Σύνδεσμος SSO"
|
"message": "Σύνδεσμος SSO"
|
||||||
|
|||||||
@@ -2078,7 +2078,7 @@
|
|||||||
"message": "Samodzielnie hostowane środowisko (opcjonalnie)"
|
"message": "Samodzielnie hostowane środowisko (opcjonalnie)"
|
||||||
},
|
},
|
||||||
"usersGetPremium": {
|
"usersGetPremium": {
|
||||||
"message": "Użytkownicy uzyskują dostęp do kont Premium"
|
"message": "Użytkownicy uzyskują dostęp do funkcji Premium"
|
||||||
},
|
},
|
||||||
"controlAccessWithGroups": {
|
"controlAccessWithGroups": {
|
||||||
"message": "Kontroluj dostęp z użyciem grup użytkowników"
|
"message": "Kontroluj dostęp z użyciem grup użytkowników"
|
||||||
@@ -4504,7 +4504,7 @@
|
|||||||
"message": "Plan Bitwarden Families zawiera"
|
"message": "Plan Bitwarden Families zawiera"
|
||||||
},
|
},
|
||||||
"sponsoredFamiliesPremiumAccess": {
|
"sponsoredFamiliesPremiumAccess": {
|
||||||
"message": "Konto Premium dla maksymalnie 6 użytkowników"
|
"message": "Dostęp premium dla maksymalnie 6 użytkowników"
|
||||||
},
|
},
|
||||||
"sponsoredFamiliesSharedCollections": {
|
"sponsoredFamiliesSharedCollections": {
|
||||||
"message": "Udostępnione kolekcje dla sekretów rodziny"
|
"message": "Udostępnione kolekcje dla sekretów rodziny"
|
||||||
@@ -4597,7 +4597,7 @@
|
|||||||
"message": "Utworzono sponsorowanie"
|
"message": "Utworzono sponsorowanie"
|
||||||
},
|
},
|
||||||
"revoke": {
|
"revoke": {
|
||||||
"message": "Unieważnij"
|
"message": "Odwołaj"
|
||||||
},
|
},
|
||||||
"emailSent": {
|
"emailSent": {
|
||||||
"message": "Wiadomość została wysłana"
|
"message": "Wiadomość została wysłana"
|
||||||
|
|||||||
@@ -30,6 +30,12 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#cme_iframe {
|
||||||
|
border: none;
|
||||||
|
height: 0;
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.list-group-2fa {
|
.list-group-2fa {
|
||||||
.logo-2fa {
|
.logo-2fa {
|
||||||
min-width: 100px;
|
min-width: 100px;
|
||||||
|
|||||||
105
src/services/keyConnector.service.ts
Normal file
105
src/services/keyConnector.service.ts
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
import { Injectable } from "@angular/core";
|
||||||
|
|
||||||
|
import { ApiService } from "jslib-common/abstractions/api.service";
|
||||||
|
import { CryptoService } from "jslib-common/abstractions/crypto.service";
|
||||||
|
import { CryptoFunctionService } from "jslib-common/abstractions/cryptoFunction.service";
|
||||||
|
import { EnvironmentService } from "jslib-common/abstractions/environment.service";
|
||||||
|
import { LogService } from "jslib-common/abstractions/log.service";
|
||||||
|
import { OrganizationService } from "jslib-common/abstractions/organization.service";
|
||||||
|
import { PlatformUtilsService } from "jslib-common/abstractions/platformUtils.service";
|
||||||
|
import { StateService } from "jslib-common/abstractions/state.service";
|
||||||
|
import { TokenService } from "jslib-common/abstractions/token.service";
|
||||||
|
|
||||||
|
import { CMEIFrame } from "jslib-common/misc/cme_iframe";
|
||||||
|
import { KeyConnectorUserKeyRequest } from "jslib-common/models/request/keyConnectorUserKeyRequest";
|
||||||
|
import { KeyConnectorUserKeyResponse } from "jslib-common/models/response/keyConnectorUserKeyResponse";
|
||||||
|
|
||||||
|
import { KeyConnectorService as BaseKeyConnectorService } from "jslib-common/services/keyConnector.service";
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class KeyConnectorService extends BaseKeyConnectorService {
|
||||||
|
constructor(
|
||||||
|
stateService: StateService,
|
||||||
|
cryptoFunctionService: CryptoFunctionService,
|
||||||
|
cryptoService: CryptoService,
|
||||||
|
apiService: ApiService,
|
||||||
|
tokenService: TokenService,
|
||||||
|
logService: LogService,
|
||||||
|
organizationService: OrganizationService,
|
||||||
|
private environmentService: EnvironmentService,
|
||||||
|
private platformUtilsService: PlatformUtilsService
|
||||||
|
) {
|
||||||
|
super(
|
||||||
|
stateService,
|
||||||
|
cryptoFunctionService,
|
||||||
|
cryptoService,
|
||||||
|
apiService,
|
||||||
|
tokenService,
|
||||||
|
logService,
|
||||||
|
organizationService
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async getUserKeyFromKeyConnector(url: string): Promise<KeyConnectorUserKeyResponse> {
|
||||||
|
if (this.platformUtilsService.isSelfHost()) {
|
||||||
|
return super.getUserKeyFromKeyConnector(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
const frame = this.createIframe();
|
||||||
|
frame.frame.initGet(await this.apiService.getActiveBearerToken(), url);
|
||||||
|
|
||||||
|
return frame.promise.then((key: string) => new KeyConnectorUserKeyResponse({ Key: key }));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async postUserKeyToKeyConnector(
|
||||||
|
url: string,
|
||||||
|
request: KeyConnectorUserKeyRequest
|
||||||
|
): Promise<void> {
|
||||||
|
if (this.platformUtilsService.isSelfHost()) {
|
||||||
|
return super.postUserKeyToKeyConnector(url, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
const frame = this.createIframe();
|
||||||
|
frame.frame.initPost(await this.apiService.getActiveBearerToken(), url, request.key);
|
||||||
|
|
||||||
|
// tslint:disable-next-line
|
||||||
|
return frame.promise.then(() => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
private createIframe(): { frame: CMEIFrame; promise: Promise<string> } {
|
||||||
|
const el = this.createIframeElement();
|
||||||
|
|
||||||
|
const webVaultUrl = this.environmentService.getWebVaultUrl();
|
||||||
|
|
||||||
|
let iframe: CMEIFrame;
|
||||||
|
|
||||||
|
const promise: Promise<string> = new Promise(async (resolve) => {
|
||||||
|
iframe = new CMEIFrame(
|
||||||
|
window,
|
||||||
|
webVaultUrl,
|
||||||
|
resolve,
|
||||||
|
(error: string) => {
|
||||||
|
this.platformUtilsService.showToast("error", null, error);
|
||||||
|
},
|
||||||
|
(info: string) => {
|
||||||
|
this.logService.info(info);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
promise.finally(() => el.remove());
|
||||||
|
|
||||||
|
return {
|
||||||
|
frame: iframe,
|
||||||
|
promise: promise,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private createIframeElement() {
|
||||||
|
const el = document.createElement("iframe");
|
||||||
|
el.id = "cme_iframe";
|
||||||
|
document.body.appendChild(el);
|
||||||
|
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,9 +17,6 @@ const NODE_ENV = process.env.NODE_ENV == null ? "development" : process.env.NODE
|
|||||||
const envConfig = config.load(ENV);
|
const envConfig = config.load(ENV);
|
||||||
config.log(envConfig);
|
config.log(envConfig);
|
||||||
|
|
||||||
const fileReplacements = {};
|
|
||||||
const substitutions = config.generateSubstitutions(envConfig);
|
|
||||||
|
|
||||||
const moduleRules = [
|
const moduleRules = [
|
||||||
{
|
{
|
||||||
test: /\.ts$/,
|
test: /\.ts$/,
|
||||||
@@ -34,7 +31,7 @@ const moduleRules = [
|
|||||||
test: /.(ttf|otf|eot|svg|woff(2)?)(\?[a-z0-9]+)?$/,
|
test: /.(ttf|otf|eot|svg|woff(2)?)(\?[a-z0-9]+)?$/,
|
||||||
exclude: /loading(|-white).svg/,
|
exclude: /loading(|-white).svg/,
|
||||||
generator: {
|
generator: {
|
||||||
filename: "fonts/[name][ext]",
|
filename: "fonts/[name].[ext]",
|
||||||
},
|
},
|
||||||
type: "asset/resource",
|
type: "asset/resource",
|
||||||
},
|
},
|
||||||
@@ -42,7 +39,7 @@ const moduleRules = [
|
|||||||
test: /\.(jpe?g|png|gif|svg|webp|avif)$/i,
|
test: /\.(jpe?g|png|gif|svg|webp|avif)$/i,
|
||||||
exclude: /.*(fontawesome-webfont)\.svg/,
|
exclude: /.*(fontawesome-webfont)\.svg/,
|
||||||
generator: {
|
generator: {
|
||||||
filename: "images/[name][ext]",
|
filename: "images/[name].[ext]",
|
||||||
},
|
},
|
||||||
type: "asset/resource",
|
type: "asset/resource",
|
||||||
},
|
},
|
||||||
@@ -115,6 +112,11 @@ const plugins = [
|
|||||||
filename: "captcha-mobile-connector.html",
|
filename: "captcha-mobile-connector.html",
|
||||||
chunks: ["connectors/captcha"],
|
chunks: ["connectors/captcha"],
|
||||||
}),
|
}),
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
template: "./src/connectors/cme.html",
|
||||||
|
filename: "cme-connector.html",
|
||||||
|
chunks: ["connectors/cme"],
|
||||||
|
}),
|
||||||
new CopyWebpackPlugin({
|
new CopyWebpackPlugin({
|
||||||
patterns: [
|
patterns: [
|
||||||
{ from: "./src/.nojekyll" },
|
{ from: "./src/.nojekyll" },
|
||||||
@@ -158,8 +160,6 @@ const plugins = [
|
|||||||
tsConfigPath: "tsconfig.json",
|
tsConfigPath: "tsconfig.json",
|
||||||
entryModule: "src/app/app.module#AppModule",
|
entryModule: "src/app/app.module#AppModule",
|
||||||
sourceMap: true,
|
sourceMap: true,
|
||||||
fileReplacements: fileReplacements,
|
|
||||||
substitutions: substitutions,
|
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -226,6 +226,7 @@ const webpackConfig = {
|
|||||||
"connectors/duo": "./src/connectors/duo.ts",
|
"connectors/duo": "./src/connectors/duo.ts",
|
||||||
"connectors/sso": "./src/connectors/sso.ts",
|
"connectors/sso": "./src/connectors/sso.ts",
|
||||||
"connectors/captcha": "./src/connectors/captcha.ts",
|
"connectors/captcha": "./src/connectors/captcha.ts",
|
||||||
|
"connectors/cme": "./src/connectors/cme.ts",
|
||||||
theme_head: "./src/theme.js",
|
theme_head: "./src/theme.js",
|
||||||
},
|
},
|
||||||
externals: {
|
externals: {
|
||||||
|
|||||||
Reference in New Issue
Block a user