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.
- package/esm2022/lib/siara-shield-csp.mjs +80 -0
- package/esm2022/lib/siara-shield-loader.service.mjs +23 -0
- package/esm2022/lib/siara-shield-log-utils.mjs +103 -0
- package/esm2022/lib/siara-shield-script-utils.mjs +225 -0
- package/esm2022/lib/siara-shield-submit-guard.mjs +30 -0
- package/esm2022/lib/siara-shield.component.mjs +196 -0
- package/esm2022/lib/siara-shield.globals.mjs +7 -0
- package/esm2022/lib/siara-shield.mjs +156 -0
- package/esm2022/lib/siarashield-workspace.mjs +4 -0
- package/esm2022/public-api.mjs +10 -0
- package/esm2022/siarashield_workspace.mjs +5 -0
- package/fesm2022/siarashield_workspace.mjs +25 -23
- package/fesm2022/siarashield_workspace.mjs.map +1 -1
- package/index.d.ts +5 -0
- package/lib/siara-shield-csp.d.ts +14 -0
- package/lib/siara-shield-loader.service.d.ts +9 -0
- package/lib/siara-shield-log-utils.d.ts +6 -0
- package/lib/siara-shield-script-utils.d.ts +7 -0
- package/lib/siara-shield-submit-guard.d.ts +1 -0
- package/lib/siara-shield.component.d.ts +51 -0
- package/lib/siara-shield.d.ts +44 -0
- package/lib/siara-shield.globals.d.ts +13 -0
- package/lib/siarashield-workspace.d.ts +3 -0
- package/package.json +5 -3
- package/public-api.d.ts +6 -0
- package/siarashield_workspace-0.0.32.tgz +0 -0
- package/siarashield_workspace-0.0.30.tgz +0 -0
- package/types/siarashield_workspace.d.ts +0 -140
|
@@ -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
|
|
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
|
|
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
|
-
//
|
|
355
|
+
// Allow one synthetic click (needed for vendor auto-submit) but block rapid duplicates.
|
|
351
356
|
if (!event.isTrusted) {
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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: "
|
|
377
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
553
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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
|
}
|