siarashield_workspace 0.0.30 → 0.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,196 @@
1
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
2
+ import { getInitCaptchaFn, getSiaraShieldGlobals } from './siara-shield.globals';
3
+ import { installVendorRuntimeErrorSuppression, suppressVendorConsoleWindow } from './siara-shield-log-utils';
4
+ import { prepareScriptNonce } from './siara-shield-script-utils';
5
+ import { installCaptchaSubmitGuard } from './siara-shield-submit-guard';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./siara-shield-loader.service";
8
+ const JQUERY_FALLBACK_SRC = 'https://embedcdn.mycybersiara.com/capcha-temple/js/jquery.min.js';
9
+ const CAPTCHA_SCRIPT_SRC = 'https://embedcdn.mycybersiara.com/CaptchaFormate/CaptchaResources.js';
10
+ const VALIDATION_SCRIPT_SRC = 'https://embed.mycybersiara.com/CaptchaFormate/SiaraShield_Validation.js';
11
+ const CAPTCHA_READY_TIMEOUT_MS = 8000;
12
+ function ensureAccessibilityPopupAliases() {
13
+ const g = globalThis;
14
+ const aliasNames = [
15
+ 'RemoveAccesibilityPopup',
16
+ '_RemoveAccesibilityPopup',
17
+ 'RemoveAccesiblityPopup',
18
+ '_RemoveAccesiblityPopup',
19
+ ];
20
+ const existing = aliasNames
21
+ .map((name) => g[name])
22
+ .find((value) => typeof value === 'function');
23
+ const stableFn = existing ?? (() => undefined);
24
+ for (const name of aliasNames) {
25
+ g[name] = stableFn;
26
+ }
27
+ }
28
+ function runInRootZone(fn) {
29
+ const g = globalThis;
30
+ const zoneRootRun = g.Zone?.root?.run;
31
+ if (typeof zoneRootRun === 'function') {
32
+ return zoneRootRun.call(g.Zone?.root, fn);
33
+ }
34
+ return fn();
35
+ }
36
+ export class SiaraShieldComponent {
37
+ host;
38
+ loader;
39
+ publicKey;
40
+ loadJQuery = true;
41
+ cspNonce;
42
+ allowVendorConsoleLogs = false;
43
+ /**
44
+ * Emits the current `CyberSiaraToken` right after a successful `checkCaptcha()`.
45
+ */
46
+ token = new EventEmitter();
47
+ initialized = false;
48
+ constructor(host, loader) {
49
+ this.host = host;
50
+ this.loader = loader;
51
+ }
52
+ async ngAfterViewInit() {
53
+ await this.init({
54
+ publicKey: this.publicKey,
55
+ loadJQuery: this.loadJQuery,
56
+ cspNonce: this.cspNonce,
57
+ allowVendorConsoleLogs: this.allowVendorConsoleLogs,
58
+ });
59
+ }
60
+ async init(options) {
61
+ if (this.initialized)
62
+ return;
63
+ // Ensure the host element is in DOM before scripts run.
64
+ void this.host.nativeElement;
65
+ installCaptchaSubmitGuard();
66
+ if (!options.publicKey) {
67
+ throw new Error('SiaraShieldComponent: publicKey is required.');
68
+ }
69
+ const cspNonce = prepareScriptNonce(this.host.nativeElement.ownerDocument, options.cspNonce);
70
+ if ((options.loadJQuery ?? true) && !this.isJQueryAlreadyAvailable()) {
71
+ await this.loader.loadScript(JQUERY_FALLBACK_SRC, { nonce: cspNonce });
72
+ }
73
+ await this.loader.loadScript(CAPTCHA_SCRIPT_SRC, {
74
+ nonce: cspNonce,
75
+ });
76
+ await this.loader.loadScript(VALIDATION_SCRIPT_SRC, {
77
+ nonce: cspNonce,
78
+ });
79
+ const g = getSiaraShieldGlobals();
80
+ ensureAccessibilityPopupAliases();
81
+ this.preventDuplicateValidationBootstrap(g);
82
+ const initCaptchaFn = getInitCaptchaFn(g);
83
+ if (!initCaptchaFn) {
84
+ throw new Error('SiaraShield: InitCaptcha() is not available after loading scripts. Check whether CSP blocked vendor scripts or inline execution.');
85
+ }
86
+ if (!options.allowVendorConsoleLogs) {
87
+ suppressVendorConsoleWindow();
88
+ installVendorRuntimeErrorSuppression();
89
+ }
90
+ runInRootZone(() => initCaptchaFn(options.publicKey));
91
+ await this.waitForCheckCaptchaApi();
92
+ this.initialized = true;
93
+ }
94
+ /**
95
+ * Detect preloaded jQuery from global object or an existing script tag.
96
+ */
97
+ isJQueryAlreadyAvailable() {
98
+ const g = getSiaraShieldGlobals();
99
+ if (typeof g.jQuery === 'function' || typeof g.$ === 'function') {
100
+ return true;
101
+ }
102
+ const existingJqueryScript = this.host.nativeElement.ownerDocument.querySelector('script[src*="jquery"]');
103
+ return Boolean(existingJqueryScript);
104
+ }
105
+ preventDuplicateValidationBootstrap(g) {
106
+ const originalAppendValidation = g.AppendValidationJS;
107
+ if (typeof originalAppendValidation !== 'function') {
108
+ return;
109
+ }
110
+ g.AppendValidationJS = () => {
111
+ const existing = this.host.nativeElement.ownerDocument.querySelector(`script[src="${VALIDATION_SCRIPT_SRC}"]`);
112
+ if (existing) {
113
+ return;
114
+ }
115
+ originalAppendValidation();
116
+ };
117
+ }
118
+ async waitForCheckCaptchaApi(timeoutMs = CAPTCHA_READY_TIMEOUT_MS) {
119
+ const startedAt = Date.now();
120
+ while (Date.now() - startedAt < timeoutMs) {
121
+ if (getSiaraShieldGlobals().CheckCaptcha) {
122
+ return;
123
+ }
124
+ await new Promise((resolve) => setTimeout(resolve, 100));
125
+ }
126
+ throw new Error('SiaraShield: CheckCaptcha() was not available within timeout. This can happen when CSP blocks the captcha runtime.');
127
+ }
128
+ /**
129
+ * Calls the global `CheckCaptcha()` from SiaraShield script.
130
+ * Returns true when captcha is valid; emits token if available.
131
+ */
132
+ checkCaptcha() {
133
+ const g = getSiaraShieldGlobals();
134
+ if (!g.CheckCaptcha) {
135
+ throw new Error('SiaraShield: CheckCaptcha() is not available. Did init() run, and is CSP allowing the captcha scripts?');
136
+ }
137
+ if (!this.allowVendorConsoleLogs) {
138
+ suppressVendorConsoleWindow();
139
+ }
140
+ const ok = g.CheckCaptcha();
141
+ if (ok && typeof g.CyberSiaraToken === 'string') {
142
+ this.token.emit(g.CyberSiaraToken);
143
+ }
144
+ return ok;
145
+ }
146
+ /**
147
+ * Async-friendly captcha validation to avoid first-click timing issues.
148
+ * Performs one validation call and waits for token propagation.
149
+ */
150
+ async checkCaptchaAsync(options) {
151
+ const timeoutMs = options?.timeoutMs ?? 2000;
152
+ const pollIntervalMs = options?.pollIntervalMs ?? 120;
153
+ const beforeCheckDelayMs = options?.beforeCheckDelayMs ?? 140;
154
+ await new Promise((resolve) => setTimeout(resolve, beforeCheckDelayMs));
155
+ const ok = this.checkCaptcha();
156
+ if (!ok)
157
+ return false;
158
+ const g = getSiaraShieldGlobals();
159
+ if (typeof g.CyberSiaraToken === 'string' && g.CyberSiaraToken.length > 0) {
160
+ return true;
161
+ }
162
+ const startedAt = Date.now();
163
+ while (Date.now() - startedAt < timeoutMs) {
164
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
165
+ const token = getSiaraShieldGlobals().CyberSiaraToken;
166
+ if (typeof token === 'string' && token.length > 0) {
167
+ this.token.emit(token);
168
+ return true;
169
+ }
170
+ }
171
+ return true;
172
+ }
173
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiaraShieldComponent, deps: [{ token: i0.ElementRef }, { token: i1.SiaraShieldLoaderService }], target: i0.ɵɵFactoryTarget.Component });
174
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SiaraShieldComponent, isStandalone: true, selector: "siara-shield", inputs: { publicKey: "publicKey", loadJQuery: "loadJQuery", cspNonce: "cspNonce", allowVendorConsoleLogs: "allowVendorConsoleLogs" }, outputs: { token: "token" }, ngImport: i0, template: `<div class="SiaraShield"></div>`, isInline: true, encapsulation: i0.ViewEncapsulation.None });
175
+ }
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiaraShieldComponent, decorators: [{
177
+ type: Component,
178
+ args: [{
179
+ selector: 'siara-shield',
180
+ standalone: true,
181
+ template: `<div class="SiaraShield"></div>`,
182
+ encapsulation: ViewEncapsulation.None,
183
+ }]
184
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.SiaraShieldLoaderService }], propDecorators: { publicKey: [{
185
+ type: Input,
186
+ args: [{ required: true }]
187
+ }], loadJQuery: [{
188
+ type: Input
189
+ }], cspNonce: [{
190
+ type: Input
191
+ }], allowVendorConsoleLogs: [{
192
+ type: Input
193
+ }], token: [{
194
+ type: Output
195
+ }] } });
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NpYXJhc2hpZWxkLXdvcmtzcGFjZS9zcmMvbGliL3NpYXJhLXNoaWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0csT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7OztBQUV4RSxNQUFNLG1CQUFtQixHQUFHLGtFQUFrRSxDQUFDO0FBQy9GLE1BQU0sa0JBQWtCLEdBQUcsc0VBQXNFLENBQUM7QUFDbEcsTUFBTSxxQkFBcUIsR0FBRyx5RUFBeUUsQ0FBQztBQUN4RyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQUV0QyxTQUFTLCtCQUErQjtJQUN0QyxNQUFNLENBQUMsR0FBRyxVQUF5RCxDQUFDO0lBQ3BFLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLHlCQUF5QjtRQUN6QiwwQkFBMEI7UUFDMUIsd0JBQXdCO1FBQ3hCLHlCQUF5QjtLQUNqQixDQUFDO0lBRVgsTUFBTSxRQUFRLEdBQUcsVUFBVTtTQUN4QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQXVCLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxVQUFVLENBQUMsQ0FB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LENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO3dHQWpLVSxvQkFBb0I7NEZBQXBCLG9CQUFvQiwyT0FIckIsaUNBQWlDOzs0RkFHaEMsb0JBQW9CO2tCQU5oQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGlDQUFpQztvQkFDM0MsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7aUJBQ3RDO3NIQUU0QixTQUFTO3NCQUFuQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFLSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNpYXJhU2hpZWxkTG9hZGVyU2VydmljZSB9IGZyb20gJy4vc2lhcmEtc2hpZWxkLWxvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEluaXRDYXB0Y2hhRm4sIGdldFNpYXJhU2hpZWxkR2xvYmFscyB9IGZyb20gJy4vc2lhcmEtc2hpZWxkLmdsb2JhbHMnO1xuaW1wb3J0IHsgaW5zdGFsbFZlbmRvclJ1bnRpbWVFcnJvclN1cHByZXNzaW9uLCBzdXBwcmVzc1ZlbmRvckNvbnNvbGVXaW5kb3cgfSBmcm9tICcuL3NpYXJhLXNoaWVsZC1sb2ctdXRpbHMnO1xuaW1wb3J0IHsgcHJlcGFyZVNjcmlwdE5vbmNlIH0gZnJvbSAnLi9zaWFyYS1zaGllbGQtc2NyaXB0LXV0aWxzJztcbmltcG9ydCB7IGluc3RhbGxDYXB0Y2hhU3VibWl0R3VhcmQgfSBmcm9tICcuL3NpYXJhLXNoaWVsZC1zdWJtaXQtZ3VhcmQnO1xuXG5jb25zdCBKUVVFUllfRkFMTEJBQ0tfU1JDID0gJ2h0dHBzOi8vZW1iZWRjZG4ubXljeWJlcnNpYXJhLmNvbS9jYXBjaGEtdGVtcGxlL2pzL2pxdWVyeS5taW4uanMnO1xuY29uc3QgQ0FQVENIQV9TQ1JJUFRfU1JDID0gJ2h0dHBzOi8vZW1iZWRjZG4ubXljeWJlcnNpYXJhLmNvbS9DYXB0Y2hhRm9ybWF0ZS9DYXB0Y2hhUmVzb3VyY2VzLmpzJztcbmNvbnN0IFZBTElEQVRJT05fU0NSSVBUX1NSQyA9ICdodHRwczovL2VtYmVkLm15Y3liZXJzaWFyYS5jb20vQ2FwdGNoYUZvcm1hdGUvU2lhcmFTaGllbGRfVmFsaWRhdGlvbi5qcyc7XG5jb25zdCBDQVBUQ0hBX1JFQURZX1RJTUVPVVRfTVMgPSA4MDAwO1xuXG5mdW5jdGlvbiBlbnN1cmVBY2Nlc3NpYmlsaXR5UG9wdXBBbGlhc2VzKCk6IHZvaWQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBhbGlhc05hbWVzID0gW1xuICAgICdSZW1vdmVBY2Nlc2liaWxpdHlQb3B1cCcsXG4gICAgJ19SZW1vdmVBY2Nlc2liaWxpdHlQb3B1cCcsXG4gICAgJ1JlbW92ZUFjY2VzaWJsaXR5UG9wdXAnLFxuICAgICdfUmVtb3ZlQWNjZXNpYmxpdHlQb3B1cCcsXG4gIF0gYXMgY29uc3Q7XG5cbiAgY29uc3QgZXhpc3RpbmcgPSBhbGlhc05hbWVzXG4gICAgLm1hcCgobmFtZSkgPT4gZ1tuYW1lXSlcbiAgICAuZmluZCgodmFsdWUpOiB2YWx1ZSBpcyAoKSA9PiB2b2lkID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyk7XG5cbiAgY29uc3Qgc3RhYmxlRm4gPSBleGlzdGluZyA/PyAoKCkgPT4gdW5kZWZpbmVkKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGFsaWFzTmFtZXMpIHtcbiAgICBnW25hbWVdID0gc3RhYmxlRm47XG4gIH1cbn1cblxuZnVuY3Rpb24gcnVuSW5Sb290Wm9uZTxUPihmbjogKCkgPT4gVCk6IFQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHsgWm9uZT86IHsgcm9vdD86IHsgcnVuPzogPFU+KGNiOiAoKSA9PiBVKSA9PiBVIH0gfSB9O1xuICBjb25zdCB6b25lUm9vdFJ1biA9IGcuWm9uZT8ucm9vdD8ucnVuO1xuICBpZiAodHlwZW9mIHpvbmVSb290UnVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHpvbmVSb290UnVuLmNhbGwoZy5ab25lPy5yb290LCBmbikgYXMgVDtcbiAgfVxuICByZXR1cm4gZm4oKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWFyYVNoaWVsZEluaXRPcHRpb25zIHtcbiAgLyoqIFNpYXJhU2hpZWxkIHB1YmxpYyBrZXkuIFVzZSBcIlRFU1QtQ1lCRVJTSUFSQVwiIGZvciBzdGFnaW5nL2RldmVsb3BtZW50LiAqL1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgLyoqIExvYWRzIGpRdWVyeSBiZWZvcmUgU2lhcmFTaGllbGQgc2NyaXB0LiBEZWZhdWx0IGlzIHRydWUgZm9yIGVhc2llciBpbnRlZ3JhdGlvbi4gU2V0IHRvIGZhbHNlIG9ubHkgaWYgeW91ciBwYWdlIGFscmVhZHkgaW5jbHVkZXMgalF1ZXJ5LiAqL1xuICBsb2FkSlF1ZXJ5PzogYm9vbGVhbjtcbiAgLyoqIENTUCBub25jZSBmb3Igc3RyaWN0IHBvbGljaWVzIChgc2NyaXB0LXNyYyAnbm9uY2UtLi4uJ2ApLiBQYWlyIHdpdGggYGdldFNpYXJhU2hpZWxkQ3NwUG9saWN5KClgLiAqL1xuICBjc3BOb25jZT86IHN0cmluZztcbiAgLyoqIFNldCB0cnVlIG9ubHkgd2hlbiBhY3RpdmVseSBkZWJ1Z2dpbmcgdmVuZG9yL3J1bnRpbWUgaW50ZXJuYWxzIGluIGJyb3dzZXIgY29uc29sZS4gKi9cbiAgYWxsb3dWZW5kb3JDb25zb2xlTG9ncz86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpYXJhLXNoaWVsZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cIlNpYXJhU2hpZWxkXCI+PC9kaXY+YCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgU2lhcmFTaGllbGRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgcHVibGljS2V5ITogc3RyaW5nO1xuICBASW5wdXQoKSBsb2FkSlF1ZXJ5ID0gdHJ1ZTtcbiAgQElucHV0KCkgY3NwTm9uY2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFsbG93VmVuZG9yQ29uc29sZUxvZ3MgPSBmYWxzZTtcblxuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnQgYEN5YmVyU2lhcmFUb2tlbmAgcmlnaHQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBjaGVja0NhcHRjaGEoKWAuXG4gICAqL1xuICBAT3V0cHV0KCkgdG9rZW4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvYWRlcjogU2lhcmFTaGllbGRMb2FkZXJTZXJ2aWNlLFxuICApIHt9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh7XG4gICAgICBwdWJsaWNLZXk6IHRoaXMucHVibGljS2V5LFxuICAgICAgbG9hZEpRdWVyeTogdGhpcy5sb2FkSlF1ZXJ5LFxuICAgICAgY3NwTm9uY2U6IHRoaXMuY3NwTm9uY2UsXG4gICAgICBhbGxvd1ZlbmRvckNvbnNvbGVMb2dzOiB0aGlzLmFsbG93VmVuZG9yQ29uc29sZUxvZ3MsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbml0KG9wdGlvbnM6IFNpYXJhU2hpZWxkSW5pdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBob3N0IGVsZW1lbnQgaXMgaW4gRE9NIGJlZm9yZSBzY3JpcHRzIHJ1bi5cbiAgICB2b2lkIHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50O1xuICAgIGluc3RhbGxDYXB0Y2hhU3VibWl0R3VhcmQoKTtcblxuICAgIGlmICghb3B0aW9ucy5wdWJsaWNLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2lhcmFTaGllbGRDb21wb25lbnQ6IHB1YmxpY0tleSBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gICAgY29uc3QgY3NwTm9uY2UgPSBwcmVwYXJlU2NyaXB0Tm9uY2UodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQub3duZXJEb2N1bWVudCwgb3B0aW9ucy5jc3BOb25jZSk7XG5cbiAgICBpZiAoKG9wdGlvbnMubG9hZEpRdWVyeSA/PyB0cnVlKSAmJiAhdGhpcy5pc0pRdWVyeUFscmVhZHlBdmFpbGFibGUoKSkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkZXIubG9hZFNjcmlwdChKUVVFUllfRkFMTEJBQ0tfU1JDLCB7IG5vbmNlOiBjc3BOb25jZSB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmxvYWRlci5sb2FkU2NyaXB0KENBUFRDSEFfU0NSSVBUX1NSQywge1xuICAgICAgbm9uY2U6IGNzcE5vbmNlLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubG9hZGVyLmxvYWRTY3JpcHQoVkFMSURBVElPTl9TQ1JJUFRfU1JDLCB7XG4gICAgICBub25jZTogY3NwTm9uY2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBnID0gZ2V0U2lhcmFTaGllbGRHbG9iYWxzKCk7XG4gICAgZW5zdXJlQWNjZXNzaWJpbGl0eVBvcHVwQWxpYXNlcygpO1xuICAgIHRoaXMucHJldmVudER1cGxpY2F0ZVZhbGlkYXRpb25Cb290c3RyYXAoZyk7XG4gICAgY29uc3QgaW5pdENhcHRjaGFGbiA9IGdldEluaXRDYXB0Y2hhRm4oZyk7XG4gICAgaWYgKCFpbml0Q2FwdGNoYUZuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdTaWFyYVNoaWVsZDogSW5pdENhcHRjaGEoKSBpcyBub3QgYXZhaWxhYmxlIGFmdGVyIGxvYWRpbmcgc2NyaXB0cy4gQ2hlY2sgd2hldGhlciBDU1AgYmxvY2tlZCB2ZW5kb3Igc2NyaXB0cyBvciBpbmxpbmUgZXhlY3V0aW9uLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5hbGxvd1ZlbmRvckNvbnNvbGVMb2dzKSB7XG4gICAgICBzdXBwcmVzc1ZlbmRvckNvbnNvbGVXaW5kb3coKTtcbiAgICAgIGluc3RhbGxWZW5kb3JSdW50aW1lRXJyb3JTdXBwcmVzc2lvbigpO1xuICAgIH1cbiAgICBydW5JblJvb3Rab25lKCgpID0+IGluaXRDYXB0Y2hhRm4ob3B0aW9ucy5wdWJsaWNLZXkpKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JDaGVja0NhcHRjaGFBcGkoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgcHJlbG9hZGVkIGpRdWVyeSBmcm9tIGdsb2JhbCBvYmplY3Qgb3IgYW4gZXhpc3Rpbmcgc2NyaXB0IHRhZy5cbiAgICovXG4gIHByaXZhdGUgaXNKUXVlcnlBbHJlYWR5QXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGcgPSBnZXRTaWFyYVNoaWVsZEdsb2JhbHMoKTtcbiAgICBpZiAodHlwZW9mIGcualF1ZXJ5ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBnLiQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nSnF1ZXJ5U2NyaXB0ID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxTY3JpcHRFbGVtZW50PihcbiAgICAgICdzY3JpcHRbc3JjKj1cImpxdWVyeVwiXScsXG4gICAgKTtcbiAgICByZXR1cm4gQm9vbGVhbihleGlzdGluZ0pxdWVyeVNjcmlwdCk7XG4gIH1cblxuICBwcml2YXRlIHByZXZlbnREdXBsaWNhdGVWYWxpZGF0aW9uQm9vdHN0cmFwKGc6IFJldHVyblR5cGU8dHlwZW9mIGdldFNpYXJhU2hpZWxkR2xvYmFscz4pOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbEFwcGVuZFZhbGlkYXRpb24gPSBnLkFwcGVuZFZhbGlkYXRpb25KUztcbiAgICBpZiAodHlwZW9mIG9yaWdpbmFsQXBwZW5kVmFsaWRhdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGcuQXBwZW5kVmFsaWRhdGlvbkpTID0gKCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTFNjcmlwdEVsZW1lbnQ+KFxuICAgICAgICBgc2NyaXB0W3NyYz1cIiR7VkFMSURBVElPTl9TQ1JJUFRfU1JDfVwiXWAsXG4gICAgICApO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgb3JpZ2luYWxBcHBlbmRWYWxpZGF0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckNoZWNrQ2FwdGNoYUFwaSh0aW1lb3V0TXMgPSBDQVBUQ0hBX1JFQURZX1RJTUVPVVRfTVMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRlZEF0IDwgdGltZW91dE1zKSB7XG4gICAgICBpZiAoZ2V0U2lhcmFTaGllbGRHbG9iYWxzKCkuQ2hlY2tDYXB0Y2hhKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpYXJhU2hpZWxkOiBDaGVja0NhcHRjaGEoKSB3YXMgbm90IGF2YWlsYWJsZSB3aXRoaW4gdGltZW91dC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gQ1NQIGJsb2NrcyB0aGUgY2FwdGNoYSBydW50aW1lLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSBnbG9iYWwgYENoZWNrQ2FwdGNoYSgpYCBmcm9tIFNpYXJhU2hpZWxkIHNjcmlwdC5cbiAgICogUmV0dXJucyB0cnVlIHdoZW4gY2FwdGNoYSBpcyB2YWxpZDsgZW1pdHMgdG9rZW4gaWYgYXZhaWxhYmxlLlxuICAgKi9cbiAgY2hlY2tDYXB0Y2hhKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGcgPSBnZXRTaWFyYVNoaWVsZEdsb2JhbHMoKTtcbiAgICBpZiAoIWcuQ2hlY2tDYXB0Y2hhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpYXJhU2hpZWxkOiBDaGVja0NhcHRjaGEoKSBpcyBub3QgYXZhaWxhYmxlLiBEaWQgaW5pdCgpIHJ1biwgYW5kIGlzIENTUCBhbGxvd2luZyB0aGUgY2FwdGNoYSBzY3JpcHRzPycpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hbGxvd1ZlbmRvckNvbnNvbGVMb2dzKSB7XG4gICAgICBzdXBwcmVzc1ZlbmRvckNvbnNvbGVXaW5kb3coKTtcbiAgICB9XG4gICAgY29uc3Qgb2sgPSBnLkNoZWNrQ2FwdGNoYSgpO1xuICAgIGlmIChvayAmJiB0eXBlb2YgZy5DeWJlclNpYXJhVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnRva2VuLmVtaXQoZy5DeWJlclNpYXJhVG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4gb2s7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMtZnJpZW5kbHkgY2FwdGNoYSB2YWxpZGF0aW9uIHRvIGF2b2lkIGZpcnN0LWNsaWNrIHRpbWluZyBpc3N1ZXMuXG4gICAqIFBlcmZvcm1zIG9uZSB2YWxpZGF0aW9uIGNhbGwgYW5kIHdhaXRzIGZvciB0b2tlbiBwcm9wYWdhdGlvbi5cbiAgICovXG4gIGFzeW5jIGNoZWNrQ2FwdGNoYUFzeW5jKG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlcjsgcG9sbEludGVydmFsTXM/OiBudW1iZXI7IGJlZm9yZUNoZWNrRGVsYXlNcz86IG51bWJlciB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zID8/IDIwMDA7XG4gICAgY29uc3QgcG9sbEludGVydmFsTXMgPSBvcHRpb25zPy5wb2xsSW50ZXJ2YWxNcyA/PyAxMjA7XG4gICAgY29uc3QgYmVmb3JlQ2hlY2tEZWxheU1zID0gb3B0aW9ucz8uYmVmb3JlQ2hlY2tEZWxheU1zID8/IDE0MDtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBiZWZvcmVDaGVja0RlbGF5TXMpKTtcbiAgICBjb25zdCBvayA9IHRoaXMuY2hlY2tDYXB0Y2hhKCk7XG4gICAgaWYgKCFvaykgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZyA9IGdldFNpYXJhU2hpZWxkR2xvYmFscygpO1xuICAgIGlmICh0eXBlb2YgZy5DeWJlclNpYXJhVG9rZW4gPT09ICdzdHJpbmcnICYmIGcuQ3liZXJTaWFyYVRva2VuLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydGVkQXQgPCB0aW1lb3V0TXMpIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHBvbGxJbnRlcnZhbE1zKSk7XG4gICAgICBjb25zdCB0b2tlbiA9IGdldFNpYXJhU2hpZWxkR2xvYmFscygpLkN5YmVyU2lhcmFUb2tlbjtcbiAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnICYmIHRva2VuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50b2tlbi5lbWl0KHRva2VuKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuIl19
@@ -0,0 +1,7 @@
1
+ export function getSiaraShieldGlobals() {
2
+ return globalThis;
3
+ }
4
+ export function getInitCaptchaFn(g) {
5
+ return g.initCaptcha ?? g.InitCaptcha;
6
+ }
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLmdsb2JhbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWFyYXNoaWVsZC13b3Jrc3BhY2Uvc3JjL2xpYi9zaWFyYS1zaGllbGQuZ2xvYmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQVEsVUFBd0UsQ0FBQztBQUNuRixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQXFCO0lBQ3BELE9BQU8sQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBJbml0Q2FwdGNoYUZuID0gKHB1YmxpY0tleTogc3RyaW5nKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQ2hlY2tDYXB0Y2hhRm4gPSAoKSA9PiBib29sZWFuO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpYXJhU2hpZWxkR2xvYmFscyB7XG4gIGluaXRDYXB0Y2hhPzogSW5pdENhcHRjaGFGbjtcbiAgSW5pdENhcHRjaGE/OiBJbml0Q2FwdGNoYUZuO1xuICBDaGVja0NhcHRjaGE/OiBDaGVja0NhcHRjaGFGbjtcbiAgQXBwZW5kVmFsaWRhdGlvbkpTPzogKCkgPT4gdm9pZDtcbiAgQ3liZXJTaWFyYVRva2VuPzogc3RyaW5nO1xuICBqUXVlcnk/OiB1bmtub3duO1xuICAkPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpYXJhU2hpZWxkR2xvYmFscygpOiBTaWFyYVNoaWVsZEdsb2JhbHMge1xuICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyB7IFtrOiBzdHJpbmddOiB1bmtub3duIH0pIGFzIFNpYXJhU2hpZWxkR2xvYmFscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRDYXB0Y2hhRm4oZzogU2lhcmFTaGllbGRHbG9iYWxzKTogSW5pdENhcHRjaGFGbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnLmluaXRDYXB0Y2hhID8/IGcuSW5pdENhcHRjaGE7XG59XG4iXX0=
@@ -0,0 +1,156 @@
1
+ import { getInitCaptchaFn, getSiaraShieldGlobals } from './siara-shield.globals';
2
+ import { installVendorRuntimeErrorSuppression, suppressVendorConsoleWindow } from './siara-shield-log-utils';
3
+ import { loadScript, prepareScriptNonce } from './siara-shield-script-utils';
4
+ import { installCaptchaSubmitGuard } from './siara-shield-submit-guard';
5
+ const JQUERY_FALLBACK_SRC = 'https://embedcdn.mycybersiara.com/capcha-temple/js/jquery.min.js';
6
+ const CAPTCHA_SCRIPT_SRC = 'https://embedcdn.mycybersiara.com/CaptchaFormate/CaptchaResources.js';
7
+ const VALIDATION_SCRIPT_SRC = 'https://embed.mycybersiara.com/CaptchaFormate/SiaraShield_Validation.js';
8
+ const CAPTCHA_READY_TIMEOUT_MS = 8000;
9
+ let pending = null;
10
+ let initialized = false;
11
+ function ensureAccessibilityPopupAliases() {
12
+ const g = globalThis;
13
+ const aliasNames = [
14
+ 'RemoveAccesibilityPopup',
15
+ '_RemoveAccesibilityPopup',
16
+ 'RemoveAccesiblityPopup',
17
+ '_RemoveAccesiblityPopup',
18
+ ];
19
+ const existing = aliasNames
20
+ .map((name) => g[name])
21
+ .find((value) => typeof value === 'function');
22
+ const stableFn = existing ?? (() => undefined);
23
+ for (const name of aliasNames) {
24
+ g[name] = stableFn;
25
+ }
26
+ }
27
+ function isJQueryAlreadyAvailable() {
28
+ const g = getSiaraShieldGlobals();
29
+ if (typeof g.jQuery === 'function' || typeof g.$ === 'function') {
30
+ return true;
31
+ }
32
+ const existingJqueryScript = document.querySelector('script[src*="jquery"]');
33
+ return Boolean(existingJqueryScript);
34
+ }
35
+ function runInRootZone(fn) {
36
+ const g = globalThis;
37
+ const zoneRootRun = g.Zone?.root?.run;
38
+ if (typeof zoneRootRun === 'function') {
39
+ return zoneRootRun.call(g.Zone?.root, fn);
40
+ }
41
+ return fn();
42
+ }
43
+ function preventDuplicateValidationBootstrap(g) {
44
+ const originalAppendValidation = g.AppendValidationJS;
45
+ if (typeof originalAppendValidation !== 'function') {
46
+ return;
47
+ }
48
+ g.AppendValidationJS = () => {
49
+ const existing = document.querySelector(`script[src="${VALIDATION_SCRIPT_SRC}"]`);
50
+ if (existing) {
51
+ return;
52
+ }
53
+ originalAppendValidation();
54
+ };
55
+ }
56
+ async function waitForCheckCaptchaApi(timeoutMs = CAPTCHA_READY_TIMEOUT_MS) {
57
+ const startedAt = Date.now();
58
+ while (Date.now() - startedAt < timeoutMs) {
59
+ if (getSiaraShieldGlobals().CheckCaptcha) {
60
+ return;
61
+ }
62
+ await new Promise((resolve) => setTimeout(resolve, 100));
63
+ }
64
+ throw new Error('SiaraShield: CheckCaptcha() was not available within timeout. This can happen when CSP blocks the captcha runtime.');
65
+ }
66
+ /**
67
+ * Drop-in initializer for SiaraShield.
68
+ * - Loads required scripts (optionally jQuery)
69
+ * - Calls global `initCaptcha(publicKey)`
70
+ *
71
+ * Requirements in your HTML/template:
72
+ * - You must render: `<div class="SiaraShield"></div>`
73
+ */
74
+ export async function initSiaraShield(options) {
75
+ if (initialized)
76
+ return;
77
+ if (pending)
78
+ return pending;
79
+ if (!options?.publicKey) {
80
+ throw new Error('initSiaraShield: publicKey is required.');
81
+ }
82
+ pending = (async () => {
83
+ installCaptchaSubmitGuard();
84
+ const cspNonce = prepareScriptNonce(document, options.cspNonce);
85
+ if ((options.loadJQuery ?? true) && !isJQueryAlreadyAvailable()) {
86
+ await loadScript(document, JQUERY_FALLBACK_SRC, { nonce: cspNonce });
87
+ }
88
+ await loadScript(document, CAPTCHA_SCRIPT_SRC, {
89
+ nonce: cspNonce,
90
+ });
91
+ await loadScript(document, VALIDATION_SCRIPT_SRC, {
92
+ nonce: cspNonce,
93
+ });
94
+ const g = getSiaraShieldGlobals();
95
+ ensureAccessibilityPopupAliases();
96
+ preventDuplicateValidationBootstrap(g);
97
+ const initCaptchaFn = getInitCaptchaFn(g);
98
+ if (!initCaptchaFn) {
99
+ throw new Error('SiaraShield: InitCaptcha() is not available after loading scripts. Check whether CSP blocked vendor scripts or inline execution.');
100
+ }
101
+ if (!options.allowVendorConsoleLogs) {
102
+ suppressVendorConsoleWindow();
103
+ installVendorRuntimeErrorSuppression();
104
+ }
105
+ runInRootZone(() => initCaptchaFn(options.publicKey));
106
+ await waitForCheckCaptchaApi();
107
+ initialized = true;
108
+ })();
109
+ try {
110
+ await pending;
111
+ }
112
+ finally {
113
+ // keep `pending` cached for subsequent callers
114
+ }
115
+ }
116
+ /**
117
+ * Calls global `CheckCaptcha()` and returns its boolean result.
118
+ * If successful, returns `{ ok: true, token?: string }`.
119
+ */
120
+ export function checkSiaraShieldCaptcha(options) {
121
+ const g = getSiaraShieldGlobals();
122
+ if (!g.CheckCaptcha) {
123
+ throw new Error('SiaraShield: CheckCaptcha() is not available. Did initSiaraShield() run, and is CSP allowing the captcha scripts?');
124
+ }
125
+ if (!options?.allowVendorConsoleLogs) {
126
+ suppressVendorConsoleWindow();
127
+ }
128
+ const ok = g.CheckCaptcha();
129
+ const token = typeof g.CyberSiaraToken === 'string' ? g.CyberSiaraToken : undefined;
130
+ return ok ? { ok: true, token } : { ok: false };
131
+ }
132
+ /**
133
+ * Async-friendly captcha check to handle delayed token population.
134
+ */
135
+ export async function checkSiaraShieldCaptchaAsync(options) {
136
+ const timeoutMs = options?.timeoutMs ?? 1200;
137
+ const pollIntervalMs = options?.pollIntervalMs ?? 120;
138
+ const beforeCheckDelayMs = options?.beforeCheckDelayMs ?? 140;
139
+ await new Promise((resolve) => setTimeout(resolve, beforeCheckDelayMs));
140
+ const firstCheck = checkSiaraShieldCaptcha(); // one API call only
141
+ if (!firstCheck.ok)
142
+ return firstCheck;
143
+ if (firstCheck.token)
144
+ return firstCheck;
145
+ const startedAt = Date.now();
146
+ // Token can be assigned slightly after successful verification.
147
+ while (Date.now() - startedAt < timeoutMs) {
148
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
149
+ const token = getSiaraShieldGlobals().CyberSiaraToken;
150
+ if (typeof token === 'string' && token.length > 0) {
151
+ return { ok: true, token };
152
+ }
153
+ }
154
+ return { ok: true };
155
+ }
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmEtc2hpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lhcmFzaGllbGQtd29ya3NwYWNlL3NyYy9saWIvc2lhcmEtc2hpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdHLE9BQU8sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RSxNQUFNLG1CQUFtQixHQUFHLGtFQUFrRSxDQUFDO0FBQy9GLE1BQU0sa0JBQWtCLEdBQUcsc0VBQXNFLENBQUM7QUFDbEcsTUFBTSxxQkFBcUIsR0FBRyx5RUFBeUUsQ0FBQztBQUN4RyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQztBQWlCdEMsSUFBSSxPQUFPLEdBQXlCLElBQUksQ0FBQztBQUN6QyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFFeEIsU0FBUywrQkFBK0I7SUFDdEMsTUFBTSxDQUFDLEdBQUcsVUFBeUQsQ0FBQztJQUNwRSxNQUFNLFVBQVUsR0FBRztRQUNqQix5QkFBeUI7UUFDekIsMEJBQTBCO1FBQzFCLHdCQUF3QjtRQUN4Qix5QkFBeUI7S0FDakIsQ0FBQztJQUVYLE1BQU0sUUFBUSxHQUFHLFVBQVU7U0FDeEIsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEIsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUF1QixFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7SUFFckUsTUFBTSxRQUFRLEdBQUcsUUFBUSxJQUFJ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QU8sVUFBVSxDQUFDO0lBRXhDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM3QixnRUFBZ0U7SUFDaEUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLEtBQUssR0FBRyxxQkFBcUIsRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUN0RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0SW5pdENhcHRjaGFGbiwgZ2V0U2lhcmFTaGllbGRHbG9iYWxzIH0gZnJvbSAnLi9zaWFyYS1zaGllbGQuZ2xvYmFscyc7XG5pbXBvcnQgeyBpbnN0YWxsVmVuZG9yUnVudGltZUVycm9yU3VwcHJlc3Npb24sIHN1cHByZXNzVmVuZG9yQ29uc29sZVdpbmRvdyB9IGZyb20gJy4vc2lhcmEtc2hpZWxkLWxvZy11dGlscyc7XG5pbXBvcnQgeyBsb2FkU2NyaXB0LCBwcmVwYXJlU2NyaXB0Tm9uY2UgfSBmcm9tICcuL3NpYXJhLXNoaWVsZC1zY3JpcHQtdXRpbHMnO1xuaW1wb3J0IHsgaW5zdGFsbENhcHRjaGFTdWJtaXRHdWFyZCB9IGZyb20gJy4vc2lhcmEtc2hpZWxkLXN1Ym1pdC1ndWFyZCc7XG5cbmNvbnN0IEpRVUVSWV9GQUxMQkFDS19TUkMgPSAnaHR0cHM6Ly9lbWJlZGNkbi5teWN5YmVyc2lhcmEuY29tL2NhcGNoYS10ZW1wbGUvanMvanF1ZXJ5Lm1pbi5qcyc7XG5jb25zdCBDQVBUQ0hBX1NDUklQVF9TUkMgPSAnaHR0cHM6Ly9lbWJlZGNkbi5teWN5YmVyc2lhcmEuY29tL0NhcHRjaGFGb3JtYXRlL0NhcHRjaGFSZXNvdXJjZXMuanMnO1xuY29uc3QgVkFMSURBVElPTl9TQ1JJUFRfU1JDID0gJ2h0dHBzOi8vZW1iZWQubXljeWJlcnNpYXJhLmNvbS9DYXB0Y2hhRm9ybWF0ZS9TaWFyYVNoaWVsZF9WYWxpZGF0aW9uLmpzJztcbmNvbnN0IENBUFRDSEFfUkVBRFlfVElNRU9VVF9NUyA9IDgwMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5pdFNpYXJhU2hpZWxkT3B0aW9ucyB7XG4gIC8qKiBTaWFyYVNoaWVsZCBwdWJsaWMga2V5LiBVc2UgXCJURVNULUNZQkVSU0lBUkFcIiBmb3Igc3RhZ2luZy9kZXZlbG9wbWVudC4gKi9cbiAgcHVibGljS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMb2FkcyBqUXVlcnkgYmVmb3JlIFNpYXJhU2hpZWxkIHNjcmlwdC5cbiAgICogRGVmYXVsdCBpcyB0cnVlIGZvciBlYXNpZXIgaW50ZWdyYXRpb24uXG4gICAqIFNldCB0byBmYWxzZSBvbmx5IGlmIHlvdXIgc2l0ZS9hcHAgYWxyZWFkeSBsb2FkcyBqUXVlcnkuXG4gICAqL1xuICBsb2FkSlF1ZXJ5PzogYm9vbGVhbjtcbiAgLyoqIENTUCBub25jZSBmb3Igc3RyaWN0IHBvbGljaWVzIChgc2NyaXB0LXNyYyAnbm9uY2UtLi4uJ2ApLiBQYWlyIHdpdGggYGdldFNpYXJhU2hpZWxkQ3NwUG9saWN5KClgLiAqL1xuICBjc3BOb25jZT86IHN0cmluZztcbiAgLyoqIFNldCB0cnVlIG9ubHkgd2hlbiBhY3RpdmVseSBkZWJ1Z2dpbmcgdmVuZG9yL3J1bnRpbWUgaW50ZXJuYWxzIGluIGJyb3dzZXIgY29uc29sZS4gKi9cbiAgYWxsb3dWZW5kb3JDb25zb2xlTG9ncz86IGJvb2xlYW47XG59XG5cbmxldCBwZW5kaW5nOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5sZXQgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gZW5zdXJlQWNjZXNzaWJpbGl0eVBvcHVwQWxpYXNlcygpOiB2b2lkIHtcbiAgY29uc3QgZyA9IGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgYWxpYXNOYW1lcyA9IFtcbiAgICAnUmVtb3ZlQWNjZXNpYmlsaXR5UG9wdXAnLFxuICAgICdfUmVtb3ZlQWNjZXNpYmlsaXR5UG9wdXAnLFxuICAgICdSZW1vdmVBY2Nlc2libGl0eVBvcHVwJyxcbiAgICAnX1JlbW92ZUFjY2VzaWJsaXR5UG9wdXAnLFxuICBdIGFzIGNvbnN0O1xuXG4gIGNvbnN0IGV4aXN0aW5nID0gYWxpYXNOYW1lc1xuICAgIC5tYXAoKG5hbWUpID0+IGdbbmFtZV0pXG4gICAgLmZpbmQoKHZhbHVlKTogdmFsdWUgaXMgKCkgPT4gdm9pZCA9PiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpO1xuXG4gIGNvbnN0IHN0YWJsZUZuID0gZXhpc3RpbmcgPz8gKCgpID0+IHVuZGVmaW5lZCk7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBhbGlhc05hbWVzKSB7XG4gICAgZ1tuYW1lXSA9IHN0YWJsZUZuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSlF1ZXJ5QWxyZWFkeUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgY29uc3QgZyA9IGdldFNpYXJhU2hpZWxkR2xvYmFscygpO1xuICBpZiAodHlwZW9mIGcualF1ZXJ5ID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBnLiQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGV4aXN0aW5nSnF1ZXJ5U2NyaXB0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MU2NyaXB0RWxlbWVudD4oJ3NjcmlwdFtzcmMqPVwianF1ZXJ5XCJdJyk7XG4gIHJldHVybiBCb29sZWFuKGV4aXN0aW5nSnF1ZXJ5U2NyaXB0KTtcbn1cblxuZnVuY3Rpb24gcnVuSW5Sb290Wm9uZTxUPihmbjogKCkgPT4gVCk6IFQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHsgWm9uZT86IHsgcm9vdD86IHsgcnVuPzogPFU+KGNiOiAoKSA9PiBVKSA9PiBVIH0gfSB9O1xuICBjb25zdCB6b25lUm9vdFJ1biA9IGcuWm9uZT8ucm9vdD8ucnVuO1xuICBpZiAodHlwZW9mIHpvbmVSb290UnVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHpvbmVSb290UnVuLmNhbGwoZy5ab25lPy5yb290LCBmbikgYXMgVDtcbiAgfVxuICByZXR1cm4gZm4oKTtcbn1cblxuZnVuY3Rpb24gcHJldmVudER1cGxpY2F0ZVZhbGlkYXRpb25Cb290c3RyYXAoZzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2lhcmFTaGllbGRHbG9iYWxzPik6IHZvaWQge1xuICBjb25zdCBvcmlnaW5hbEFwcGVuZFZhbGlkYXRpb24gPSBnLkFwcGVuZFZhbGlkYXRpb25KUztcbiAgaWYgKHR5cGVvZiBvcmlnaW5hbEFwcGVuZFZhbGlkYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBnLkFwcGVuZFZhbGlkYXRpb25KUyA9ICgpID0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTFNjcmlwdEVsZW1lbnQ+KGBzY3JpcHRbc3JjPVwiJHtWQUxJREFUSU9OX1NDUklQVF9TUkN9XCJdYCk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3JpZ2luYWxBcHBlbmRWYWxpZGF0aW9uKCk7XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDaGVja0NhcHRjaGFBcGkodGltZW91dE1zID0gQ0FQVENIQV9SRUFEWV9USU1FT1VUX01TKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRlZEF0IDwgdGltZW91dE1zKSB7XG4gICAgaWYgKGdldFNpYXJhU2hpZWxkR2xvYmFscygpLkNoZWNrQ2FwdGNoYSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1NpYXJhU2hpZWxkOiBDaGVja0NhcHRjaGEoKSB3YXMgbm90IGF2YWlsYWJsZSB3aXRoaW4gdGltZW91dC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gQ1NQIGJsb2NrcyB0aGUgY2FwdGNoYSBydW50aW1lLicpO1xufVxuXG4vKipcbiAqIERyb3AtaW4gaW5pdGlhbGl6ZXIgZm9yIFNpYXJhU2hpZWxkLlxuICogLSBMb2FkcyByZXF1aXJlZCBzY3JpcHRzIChvcHRpb25hbGx5IGpRdWVyeSlcbiAqIC0gQ2FsbHMgZ2xvYmFsIGBpbml0Q2FwdGNoYShwdWJsaWNLZXkpYFxuICpcbiAqIFJlcXVpcmVtZW50cyBpbiB5b3VyIEhUTUwvdGVtcGxhdGU6XG4gKiAtIFlvdSBtdXN0IHJlbmRlcjogYDxkaXYgY2xhc3M9XCJTaWFyYVNoaWVsZFwiPjwvZGl2PmBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRTaWFyYVNoaWVsZChvcHRpb25zOiBJbml0U2lhcmFTaGllbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChpbml0aWFsaXplZCkgcmV0dXJuO1xuICBpZiAocGVuZGluZykgcmV0dXJuIHBlbmRpbmc7XG5cbiAgaWYgKCFvcHRpb25zPy5wdWJsaWNLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2luaXRTaWFyYVNoaWVsZDogcHVibGljS2V5IGlzIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgcGVuZGluZyA9IChhc3luYyAoKSA9PiB7XG4gICAgaW5zdGFsbENhcHRjaGFTdWJtaXRHdWFyZCgpO1xuICAgIGNvbnN0IGNzcE5vbmNlID0gcHJlcGFyZVNjcmlwdE5vbmNlKGRvY3VtZW50LCBvcHRpb25zLmNzcE5vbmNlKTtcblxuICAgIGlmICgob3B0aW9ucy5sb2FkSlF1ZXJ5ID8/IHRydWUpICYmICFpc0pRdWVyeUFscmVhZHlBdmFpbGFibGUoKSkge1xuICAgICAgYXdhaXQgbG9hZFNjcmlwdChkb2N1bWVudCwgSlFVRVJZX0ZBTExCQUNLX1NSQywgeyBub25jZTogY3NwTm9uY2UgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgbG9hZFNjcmlwdChkb2N1bWVudCwgQ0FQVENIQV9TQ1JJUFRfU1JDLCB7XG4gICAgICBub25jZTogY3NwTm9uY2UsXG4gICAgfSk7XG4gICAgYXdhaXQgbG9hZFNjcmlwdChkb2N1bWVudCwgVkFMSURBVElPTl9TQ1JJUFRfU1JDLCB7XG4gICAgICBub25jZTogY3NwTm9uY2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBnID0gZ2V0U2lhcmFTaGllbGRHbG9iYWxzKCk7XG4gICAgZW5zdXJlQWNjZXNzaWJpbGl0eVBvcHVwQWxpYXNlcygpO1xuICAgIHByZXZlbnREdXBsaWNhdGVWYWxpZGF0aW9uQm9vdHN0cmFwKGcpO1xuICAgIGNvbnN0IGluaXRDYXB0Y2hhRm4gPSBnZXRJbml0Q2FwdGNoYUZuKGcpO1xuICAgIGlmICghaW5pdENhcHRjaGFGbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnU2lhcmFTaGllbGQ6IEluaXRDYXB0Y2hhKCkgaXMgbm90IGF2YWlsYWJsZSBhZnRlciBsb2FkaW5nIHNjcmlwdHMuIENoZWNrIHdoZXRoZXIgQ1NQIGJsb2NrZWQgdmVuZG9yIHNjcmlwdHMgb3IgaW5saW5lIGV4ZWN1dGlvbi4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxsb3dWZW5kb3JDb25zb2xlTG9ncykge1xuICAgICAgc3VwcHJlc3NWZW5kb3JDb25zb2xlV2luZG93KCk7XG4gICAgICBpbnN0YWxsVmVuZG9yUnVudGltZUVycm9yU3VwcHJlc3Npb24oKTtcbiAgICB9XG4gICAgcnVuSW5Sb290Wm9uZSgoKSA9PiBpbml0Q2FwdGNoYUZuKG9wdGlvbnMucHVibGljS2V5KSk7XG4gICAgYXdhaXQgd2FpdEZvckNoZWNrQ2FwdGNoYUFwaSgpO1xuICAgIGluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfSkoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHBlbmRpbmc7XG4gIH0gZmluYWxseSB7XG4gICAgLy8ga2VlcCBgcGVuZGluZ2AgY2FjaGVkIGZvciBzdWJzZXF1ZW50IGNhbGxlcnNcbiAgfVxufVxuXG4vKipcbiAqIENhbGxzIGdsb2JhbCBgQ2hlY2tDYXB0Y2hhKClgIGFuZCByZXR1cm5zIGl0cyBib29sZWFuIHJlc3VsdC5cbiAqIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgYHsgb2s6IHRydWUsIHRva2VuPzogc3RyaW5nIH1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTaWFyYVNoaWVsZENhcHRjaGEob3B0aW9ucz86IHsgYWxsb3dWZW5kb3JDb25zb2xlTG9ncz86IGJvb2xlYW4gfSk6IHsgb2s6IGJvb2xlYW47IHRva2VuPzogc3RyaW5nIH0ge1xuICBjb25zdCBnID0gZ2V0U2lhcmFTaGllbGRHbG9iYWxzKCk7XG4gIGlmICghZy5DaGVja0NhcHRjaGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpYXJhU2hpZWxkOiBDaGVja0NhcHRjaGEoKSBpcyBub3QgYXZhaWxhYmxlLiBEaWQgaW5pdFNpYXJhU2hpZWxkKCkgcnVuLCBhbmQgaXMgQ1NQIGFsbG93aW5nIHRoZSBjYXB0Y2hhIHNjcmlwdHM/Jyk7XG4gIH1cblxuICBpZiAoIW9wdGlvbnM/LmFsbG93VmVuZG9yQ29uc29sZUxvZ3MpIHtcbiAgICBzdXBwcmVzc1ZlbmRvckNvbnNvbGVXaW5kb3coKTtcbiAgfVxuICBjb25zdCBvayA9IGcuQ2hlY2tDYXB0Y2hhKCk7XG4gIGNvbnN0IHRva2VuID0gdHlwZW9mIGcuQ3liZXJTaWFyYVRva2VuID09PSAnc3RyaW5nJyA/IGcuQ3liZXJTaWFyYVRva2VuIDogdW5kZWZpbmVkO1xuICByZXR1cm4gb2sgPyB7IG9rOiB0cnVlLCB0b2tlbiB9IDogeyBvazogZmFsc2UgfTtcbn1cblxuLyoqXG4gKiBBc3luYy1mcmllbmRseSBjYXB0Y2hhIGNoZWNrIHRvIGhhbmRsZSBkZWxheWVkIHRva2VuIHBvcHVsYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja1NpYXJhU2hpZWxkQ2FwdGNoYUFzeW5jKG9wdGlvbnM/OiB7XG4gIHRpbWVvdXRNcz86IG51bWJlcjtcbiAgcG9sbEludGVydmFsTXM/OiBudW1iZXI7XG4gIGJlZm9yZUNoZWNrRGVsYXlNcz86IG51bWJlcjtcbn0pOiBQcm9taXNlPHsgb2s6IGJvb2xlYW47IHRva2VuPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zID8/IDEyMDA7XG4gIGNvbnN0IHBvbGxJbnRlcnZhbE1zID0gb3B0aW9ucz8ucG9sbEludGVydmFsTXMgPz8gMTIwO1xuICBjb25zdCBiZWZvcmVDaGVja0RlbGF5TXMgPSBvcHRpb25zPy5iZWZvcmVDaGVja0RlbGF5TXMgPz8gMTQwO1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBiZWZvcmVDaGVja0RlbGF5TXMpKTtcbiAgY29uc3QgZmlyc3RDaGVjayA9IGNoZWNrU2lhcmFTaGllbGRDYXB0Y2hhKCk7IC8vIG9uZSBBUEkgY2FsbCBvbmx5XG4gIGlmICghZmlyc3RDaGVjay5vaykgcmV0dXJuIGZpcnN0Q2hlY2s7XG4gIGlmIChmaXJzdENoZWNrLnRva2VuKSByZXR1cm4gZmlyc3RDaGVjaztcblxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAvLyBUb2tlbiBjYW4gYmUgYXNzaWduZWQgc2xpZ2h0bHkgYWZ0ZXIgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb24uXG4gIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRlZEF0IDwgdGltZW91dE1zKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgcG9sbEludGVydmFsTXMpKTtcbiAgICBjb25zdCB0b2tlbiA9IGdldFNpYXJhU2hpZWxkR2xvYmFscygpLkN5YmVyU2lhcmFUb2tlbjtcbiAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJyAmJiB0b2tlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdG9rZW4gfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBvazogdHJ1ZSB9O1xufVxuXG4iXX0=
@@ -0,0 +1,4 @@
1
+ export { SiaraShieldComponent } from './siara-shield.component';
2
+ export { SiaraShieldLoaderService } from './siara-shield-loader.service';
3
+ export { getSiaraShieldGlobals } from './siara-shield.globals';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmFzaGllbGQtd29ya3NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lhcmFzaGllbGQtd29ya3NwYWNlL3NyYy9saWIvc2lhcmFzaGllbGQtd29ya3NwYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgU2lhcmFTaGllbGRDb21wb25lbnQgfSBmcm9tICcuL3NpYXJhLXNoaWVsZC5jb21wb25lbnQnO1xuZXhwb3J0IHsgU2lhcmFTaGllbGRMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi9zaWFyYS1zaGllbGQtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgZ2V0U2lhcmFTaGllbGRHbG9iYWxzIH0gZnJvbSAnLi9zaWFyYS1zaGllbGQuZ2xvYmFscyc7XG4iXX0=
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Public API Surface of siarashield-workspace
3
+ */
4
+ export * from './lib/siarashield-workspace';
5
+ export * from './lib/siara-shield.component';
6
+ export * from './lib/siara-shield-loader.service';
7
+ export * from './lib/siara-shield.globals';
8
+ export * from './lib/siara-shield';
9
+ export * from './lib/siara-shield-csp';
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NpYXJhc2hpZWxkLXdvcmtzcGFjZS9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBzaWFyYXNoaWVsZC13b3Jrc3BhY2VcbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaWFyYXNoaWVsZC13b3Jrc3BhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lhcmEtc2hpZWxkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaWFyYS1zaGllbGQtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lhcmEtc2hpZWxkLmdsb2JhbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lhcmEtc2hpZWxkJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NpYXJhLXNoaWVsZC1jc3AnO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lhcmFzaGllbGRfd29ya3NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvc2lhcmFzaGllbGQtd29ya3NwYWNlL3NyYy9zaWFyYXNoaWVsZF93b3Jrc3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -83,8 +83,12 @@ function isLikelyVendorScriptRuntimeError(message, source) {
83
83
  const normalizedMessage = String(message ?? '').trim().toLowerCase();
84
84
  const normalizedSource = String(source ?? '').trim().toLowerCase();
85
85
  const fromSiaraHost = normalizedSource.includes('embed.mycybersiara.com') || normalizedSource.includes('embedcdn.mycybersiara.com');
86
+ const isKnownVendorDomError = normalizedMessage.includes("cannot read properties of null (reading 'removechild')") &&
87
+ (normalizedSource.includes('jquery') || normalizedSource.includes('captcharesources'));
86
88
  if (fromSiaraHost)
87
89
  return true;
90
+ if (isKnownVendorDomError)
91
+ return true;
88
92
  return normalizedMessage === 'script error.' || normalizedMessage === 'script error';
89
93
  }
90
94
  /**
@@ -282,8 +286,9 @@ function resolveCspNonce(documentRef, explicitNonce) {
282
286
  function prepareScriptNonce(documentRef, explicitNonce) {
283
287
  const resolvedNonce = resolveCspNonce(documentRef, explicitNonce);
284
288
  const patchState = getDynamicScriptNoncePatchState();
285
- patchDynamicScriptInsertion();
286
289
  if (resolvedNonce) {
290
+ // DOM patching is only needed when a CSP nonce must be propagated.
291
+ patchDynamicScriptInsertion();
287
292
  patchState.nonceByDocument.set(documentRef, resolvedNonce);
288
293
  ensureNonceMutationObserver(documentRef);
289
294
  }
@@ -333,12 +338,12 @@ function loadScript(documentRef, src, options) {
333
338
  }
334
339
 
335
340
  const SUBMIT_GUARD_STATE_KEY = '__siaraShieldSubmitGuardInstalled__';
336
- const TRUSTED_CLICK_GUARD_WINDOW_MS = 1000;
341
+ const SYNTHETIC_CLICK_GUARD_WINDOW_MS = 1200;
337
342
  function installCaptchaSubmitGuard() {
338
343
  const globalState = globalThis;
339
344
  if (globalState[SUBMIT_GUARD_STATE_KEY])
340
345
  return;
341
- const lastTrustedClickByButton = new WeakMap();
346
+ const lastSyntheticClickByButton = new WeakMap();
342
347
  document.addEventListener('click', (event) => {
343
348
  const target = event.target;
344
349
  if (!(target instanceof Element))
@@ -347,20 +352,17 @@ function installCaptchaSubmitGuard() {
347
352
  if (!submitButton)
348
353
  return;
349
354
  // Vendor runtime can emit synthetic clicks on .CaptchaSubmit.
350
- // Always block synthetic clicks so a real user click maps to one app handler call.
355
+ // Allow one synthetic click (needed for vendor auto-submit) but block rapid duplicates.
351
356
  if (!event.isTrusted) {
352
- event.preventDefault();
353
- event.stopImmediatePropagation();
354
- return;
355
- }
356
- const now = Date.now();
357
- const lastTrustedClickAt = lastTrustedClickByButton.get(submitButton) ?? 0;
358
- if (now - lastTrustedClickAt < TRUSTED_CLICK_GUARD_WINDOW_MS) {
359
- event.preventDefault();
360
- event.stopImmediatePropagation();
361
- return;
357
+ const now = Date.now();
358
+ const lastSyntheticClickAt = lastSyntheticClickByButton.get(submitButton) ?? 0;
359
+ if (now - lastSyntheticClickAt < SYNTHETIC_CLICK_GUARD_WINDOW_MS) {
360
+ event.preventDefault();
361
+ event.stopImmediatePropagation();
362
+ return;
363
+ }
364
+ lastSyntheticClickByButton.set(submitButton, now);
362
365
  }
363
- lastTrustedClickByButton.set(submitButton, now);
364
366
  }, true);
365
367
  globalState[SUBMIT_GUARD_STATE_KEY] = true;
366
368
  }
@@ -373,10 +375,10 @@ class SiaraShieldLoaderService {
373
375
  loadScript(src, options) {
374
376
  return loadScript(this.document, src, options);
375
377
  }
376
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SiaraShieldLoaderService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
377
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SiaraShieldLoaderService, providedIn: 'root' });
378
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiaraShieldLoaderService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
379
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiaraShieldLoaderService, providedIn: 'root' });
378
380
  }
379
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SiaraShieldLoaderService, decorators: [{
381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiaraShieldLoaderService, decorators: [{
380
382
  type: Injectable,
381
383
  args: [{ providedIn: 'root' }]
382
384
  }], ctorParameters: () => [{ type: Document, decorators: [{
@@ -408,7 +410,7 @@ function runInRootZone$1(fn) {
408
410
  const g = globalThis;
409
411
  const zoneRootRun = g.Zone?.root?.run;
410
412
  if (typeof zoneRootRun === 'function') {
411
- return zoneRootRun(fn);
413
+ return zoneRootRun.call(g.Zone?.root, fn);
412
414
  }
413
415
  return fn();
414
416
  }
@@ -549,10 +551,10 @@ class SiaraShieldComponent {
549
551
  }
550
552
  return true;
551
553
  }
552
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SiaraShieldComponent, deps: [{ token: i0.ElementRef }, { token: SiaraShieldLoaderService }], target: i0.ɵɵFactoryTarget.Component });
553
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.5", type: SiaraShieldComponent, isStandalone: true, selector: "siara-shield", inputs: { publicKey: "publicKey", loadJQuery: "loadJQuery", cspNonce: "cspNonce", allowVendorConsoleLogs: "allowVendorConsoleLogs" }, outputs: { token: "token" }, ngImport: i0, template: `<div class="SiaraShield"></div>`, isInline: true, encapsulation: i0.ViewEncapsulation.None });
554
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiaraShieldComponent, deps: [{ token: i0.ElementRef }, { token: SiaraShieldLoaderService }], target: i0.ɵɵFactoryTarget.Component });
555
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SiaraShieldComponent, isStandalone: true, selector: "siara-shield", inputs: { publicKey: "publicKey", loadJQuery: "loadJQuery", cspNonce: "cspNonce", allowVendorConsoleLogs: "allowVendorConsoleLogs" }, outputs: { token: "token" }, ngImport: i0, template: `<div class="SiaraShield"></div>`, isInline: true, encapsulation: i0.ViewEncapsulation.None });
554
556
  }
555
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: SiaraShieldComponent, decorators: [{
557
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SiaraShieldComponent, decorators: [{
556
558
  type: Component,
557
559
  args: [{
558
560
  selector: 'siara-shield',
@@ -607,7 +609,7 @@ function runInRootZone(fn) {
607
609
  const g = globalThis;
608
610
  const zoneRootRun = g.Zone?.root?.run;
609
611
  if (typeof zoneRootRun === 'function') {
610
- return zoneRootRun(fn);
612
+ return zoneRootRun.call(g.Zone?.root, fn);
611
613
  }
612
614
  return fn();
613
615
  }