@kya-os/mcp-i-cloudflare 1.6.62 → 1.7.0
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/dist/agent.d.ts +4 -2
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +121 -94
- package/dist/agent.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +9 -95
- package/dist/app.js.map +1 -1
- package/dist/services/consent-config.service.d.ts +9 -3
- package/dist/services/consent-config.service.d.ts.map +1 -1
- package/dist/services/consent-config.service.js +90 -100
- package/dist/services/consent-config.service.js.map +1 -1
- package/dist/services/consent-page-renderer.d.ts.map +1 -1
- package/dist/services/consent-page-renderer.js +0 -5
- package/dist/services/consent-page-renderer.js.map +1 -1
- package/dist/services/consent-templates/base/base-template.d.ts +79 -0
- package/dist/services/consent-templates/base/base-template.d.ts.map +1 -0
- package/dist/services/consent-templates/base/base-template.js +283 -0
- package/dist/services/consent-templates/base/base-template.js.map +1 -0
- package/dist/services/consent-templates/base/components.d.ts +120 -0
- package/dist/services/consent-templates/base/components.d.ts.map +1 -0
- package/dist/services/consent-templates/base/components.js +278 -0
- package/dist/services/consent-templates/base/components.js.map +1 -0
- package/dist/services/consent-templates/base/escape.d.ts +53 -0
- package/dist/services/consent-templates/base/escape.d.ts.map +1 -0
- package/dist/services/consent-templates/base/escape.js +115 -0
- package/dist/services/consent-templates/base/escape.js.map +1 -0
- package/dist/services/consent-templates/base/index.d.ts +10 -0
- package/dist/services/consent-templates/base/index.d.ts.map +1 -0
- package/dist/services/consent-templates/base/index.js +10 -0
- package/dist/services/consent-templates/base/index.js.map +1 -0
- package/dist/services/consent-templates/base/styles.d.ts +80 -0
- package/dist/services/consent-templates/base/styles.d.ts.map +1 -0
- package/dist/services/consent-templates/base/styles.js +226 -0
- package/dist/services/consent-templates/base/styles.js.map +1 -0
- package/dist/services/consent-templates/helpers.d.ts +60 -0
- package/dist/services/consent-templates/helpers.d.ts.map +1 -0
- package/dist/services/consent-templates/helpers.js +121 -0
- package/dist/services/consent-templates/helpers.js.map +1 -0
- package/dist/services/consent-templates/index.d.ts +28 -0
- package/dist/services/consent-templates/index.d.ts.map +1 -0
- package/dist/services/consent-templates/index.js +36 -0
- package/dist/services/consent-templates/index.js.map +1 -0
- package/dist/services/consent-templates/modes/consent-only.template.d.ts +36 -0
- package/dist/services/consent-templates/modes/consent-only.template.d.ts.map +1 -0
- package/dist/services/consent-templates/modes/consent-only.template.js +69 -0
- package/dist/services/consent-templates/modes/consent-only.template.js.map +1 -0
- package/dist/services/consent-templates/modes/credentials.template.d.ts +59 -0
- package/dist/services/consent-templates/modes/credentials.template.d.ts.map +1 -0
- package/dist/services/consent-templates/modes/credentials.template.js +393 -0
- package/dist/services/consent-templates/modes/credentials.template.js.map +1 -0
- package/dist/services/consent-templates/modes/index.d.ts +13 -0
- package/dist/services/consent-templates/modes/index.d.ts.map +1 -0
- package/dist/services/consent-templates/modes/index.js +13 -0
- package/dist/services/consent-templates/modes/index.js.map +1 -0
- package/dist/services/consent-templates/modes/magic-link.template.d.ts +33 -0
- package/dist/services/consent-templates/modes/magic-link.template.d.ts.map +1 -0
- package/dist/services/consent-templates/modes/magic-link.template.js +191 -0
- package/dist/services/consent-templates/modes/magic-link.template.js.map +1 -0
- package/dist/services/consent-templates/modes/oauth.template.d.ts +40 -0
- package/dist/services/consent-templates/modes/oauth.template.d.ts.map +1 -0
- package/dist/services/consent-templates/modes/oauth.template.js +151 -0
- package/dist/services/consent-templates/modes/oauth.template.js.map +1 -0
- package/dist/services/consent-templates/modes/otp.template.d.ts +35 -0
- package/dist/services/consent-templates/modes/otp.template.d.ts.map +1 -0
- package/dist/services/consent-templates/modes/otp.template.js +311 -0
- package/dist/services/consent-templates/modes/otp.template.js.map +1 -0
- package/dist/services/consent-templates/registry.d.ts +61 -0
- package/dist/services/consent-templates/registry.d.ts.map +1 -0
- package/dist/services/consent-templates/registry.js +136 -0
- package/dist/services/consent-templates/registry.js.map +1 -0
- package/dist/services/consent-templates/template-renderer.d.ts +118 -0
- package/dist/services/consent-templates/template-renderer.d.ts.map +1 -0
- package/dist/services/consent-templates/template-renderer.js +334 -0
- package/dist/services/consent-templates/template-renderer.js.map +1 -0
- package/dist/services/consent-templates/types.d.ts +194 -0
- package/dist/services/consent-templates/types.d.ts.map +1 -0
- package/dist/services/consent-templates/types.js +23 -0
- package/dist/services/consent-templates/types.js.map +1 -0
- package/dist/services/consent.service.d.ts +9 -0
- package/dist/services/consent.service.d.ts.map +1 -1
- package/dist/services/consent.service.js +50 -6
- package/dist/services/consent.service.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credentials Template
|
|
3
|
+
*
|
|
4
|
+
* Username/password authentication flow.
|
|
5
|
+
* HTML structure matches AgentShield's CredentialsPreview.tsx EXACTLY.
|
|
6
|
+
*
|
|
7
|
+
* This is a pixel-perfect port of the React component to static HTML.
|
|
8
|
+
* Any changes here MUST be synchronized with AgentShield.
|
|
9
|
+
*
|
|
10
|
+
* @module consent-templates/modes/credentials
|
|
11
|
+
*/
|
|
12
|
+
import { BaseConsentTemplate } from "../base/base-template";
|
|
13
|
+
import type { AuthMode, CredentialsConfig, ResolvedConsentConfig, ExtendedConsentPageConfig } from "../types";
|
|
14
|
+
/**
|
|
15
|
+
* Credentials Template
|
|
16
|
+
*
|
|
17
|
+
* Renders a login form matching AgentShield's CredentialsPreview exactly:
|
|
18
|
+
* - PreviewShell wrapper with branding
|
|
19
|
+
* - PreviewHeader with title
|
|
20
|
+
* - PreviewContent with spacing
|
|
21
|
+
* - PreviewAgentInfo with icon + description
|
|
22
|
+
* - Username/email field (shadcn Input style)
|
|
23
|
+
* - Password field with show/hide toggle
|
|
24
|
+
* - Remember me checkbox (label toggles checkbox)
|
|
25
|
+
* - Forgot password link
|
|
26
|
+
* - Cancel + Sign in buttons (PreviewButtonGroup)
|
|
27
|
+
*/
|
|
28
|
+
export declare class CredentialsTemplate extends BaseConsentTemplate {
|
|
29
|
+
private remoteCredentialsConfig?;
|
|
30
|
+
constructor(config: ExtendedConsentPageConfig, resolved: ResolvedConsentConfig, remoteCredentials?: CredentialsConfig);
|
|
31
|
+
get authMode(): AuthMode;
|
|
32
|
+
private get credentialsConfig();
|
|
33
|
+
/**
|
|
34
|
+
* Override the main render method to match AgentShield's exact structure.
|
|
35
|
+
* This bypasses the base template's structure to ensure pixel-perfect match.
|
|
36
|
+
*/
|
|
37
|
+
render(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Render agent icon SVG (matches AgentIconPlaceholder in AgentShield)
|
|
40
|
+
*/
|
|
41
|
+
private renderAgentIcon;
|
|
42
|
+
/**
|
|
43
|
+
* Render remember me checkbox and forgot password link.
|
|
44
|
+
* The checkbox uses a <label> that wraps everything so clicking toggles.
|
|
45
|
+
*/
|
|
46
|
+
private renderRememberAndForgot;
|
|
47
|
+
/**
|
|
48
|
+
* These methods are overridden to prevent base template rendering
|
|
49
|
+
* since we completely override render()
|
|
50
|
+
*/
|
|
51
|
+
renderAuthContent(): string;
|
|
52
|
+
protected renderActionButtons(): string;
|
|
53
|
+
protected renderTermsSection(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Render mode-specific scripts for password toggle and checkbox
|
|
56
|
+
*/
|
|
57
|
+
protected renderModeScript(): string;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=credentials.template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.template.d.ts","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/credentials.template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EACV,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAElB;;;;;;;;;;;;;GAaG;AACH,qBAAa,mBAAoB,SAAQ,mBAAmB;IAC1D,OAAO,CAAC,uBAAuB,CAAC,CAAoB;gBAGlD,MAAM,EAAE,yBAAyB,EACjC,QAAQ,EAAE,qBAAqB,EAC/B,iBAAiB,CAAC,EAAE,iBAAiB;IAMvC,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,OAAO,KAAK,iBAAiB,GAoB5B;IAED;;;OAGG;IACH,MAAM,IAAI,MAAM;IAyHhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAmD/B;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAI3B,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAIvC,SAAS,CAAC,kBAAkB,IAAI,MAAM;IAItC;;OAEG;IACH,SAAS,CAAC,gBAAgB,IAAI,MAAM;CAuIrC"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credentials Template
|
|
3
|
+
*
|
|
4
|
+
* Username/password authentication flow.
|
|
5
|
+
* HTML structure matches AgentShield's CredentialsPreview.tsx EXACTLY.
|
|
6
|
+
*
|
|
7
|
+
* This is a pixel-perfect port of the React component to static HTML.
|
|
8
|
+
* Any changes here MUST be synchronized with AgentShield.
|
|
9
|
+
*
|
|
10
|
+
* @module consent-templates/modes/credentials
|
|
11
|
+
*/
|
|
12
|
+
import { BaseConsentTemplate } from "../base/base-template";
|
|
13
|
+
import { escapeHtml, escapeJs, escapeAttr, validateUrl } from "../base/escape";
|
|
14
|
+
/**
|
|
15
|
+
* Credentials Template
|
|
16
|
+
*
|
|
17
|
+
* Renders a login form matching AgentShield's CredentialsPreview exactly:
|
|
18
|
+
* - PreviewShell wrapper with branding
|
|
19
|
+
* - PreviewHeader with title
|
|
20
|
+
* - PreviewContent with spacing
|
|
21
|
+
* - PreviewAgentInfo with icon + description
|
|
22
|
+
* - Username/email field (shadcn Input style)
|
|
23
|
+
* - Password field with show/hide toggle
|
|
24
|
+
* - Remember me checkbox (label toggles checkbox)
|
|
25
|
+
* - Forgot password link
|
|
26
|
+
* - Cancel + Sign in buttons (PreviewButtonGroup)
|
|
27
|
+
*/
|
|
28
|
+
export class CredentialsTemplate extends BaseConsentTemplate {
|
|
29
|
+
remoteCredentialsConfig;
|
|
30
|
+
constructor(config, resolved, remoteCredentials) {
|
|
31
|
+
super(config, resolved);
|
|
32
|
+
this.remoteCredentialsConfig = remoteCredentials;
|
|
33
|
+
}
|
|
34
|
+
get authMode() {
|
|
35
|
+
return "credentials";
|
|
36
|
+
}
|
|
37
|
+
get credentialsConfig() {
|
|
38
|
+
// Merge remote config with modeConfig, preferring modeConfig for overrides
|
|
39
|
+
const remote = this.remoteCredentialsConfig || {};
|
|
40
|
+
const local = this.config.modeConfig?.credentials || {};
|
|
41
|
+
return {
|
|
42
|
+
usernameLabel: local.usernameLabel || remote.usernameLabel || "Username",
|
|
43
|
+
usernamePlaceholder: local.usernamePlaceholder ||
|
|
44
|
+
remote.usernamePlaceholder ||
|
|
45
|
+
"Enter your username",
|
|
46
|
+
passwordLabel: local.passwordLabel || remote.passwordLabel || "Password",
|
|
47
|
+
passwordPlaceholder: local.passwordPlaceholder ||
|
|
48
|
+
remote.passwordPlaceholder ||
|
|
49
|
+
"Enter your password",
|
|
50
|
+
showRememberMe: local.showRememberMe ?? remote.showRememberMe ?? true,
|
|
51
|
+
showForgotPassword: local.showForgotPassword ?? remote.showForgotPassword ?? true,
|
|
52
|
+
forgotPasswordUrl: local.forgotPasswordUrl || remote.forgotPasswordUrl,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Override the main render method to match AgentShield's exact structure.
|
|
57
|
+
* This bypasses the base template's structure to ensure pixel-perfect match.
|
|
58
|
+
*/
|
|
59
|
+
render() {
|
|
60
|
+
const { branding, copy } = this.resolved;
|
|
61
|
+
const config = this.credentialsConfig;
|
|
62
|
+
const primaryColor = branding.primaryColor;
|
|
63
|
+
return `<!DOCTYPE html>
|
|
64
|
+
<html lang="en">
|
|
65
|
+
<head>
|
|
66
|
+
${this.renderHead()}
|
|
67
|
+
</head>
|
|
68
|
+
<body class="bg-gray-50 min-h-screen flex items-center justify-center p-4">
|
|
69
|
+
<!-- PreviewShell: bg-white rounded-[20px] border border-black/10 shadow-xl w-full overflow-hidden max-w-[512px] -->
|
|
70
|
+
<div
|
|
71
|
+
class="bg-white rounded-[20px] border border-black/10 shadow-xl w-full overflow-hidden"
|
|
72
|
+
style="max-width: 512px; --consent-primary: ${escapeAttr(primaryColor)}; --consent-secondary: ${escapeAttr(branding.secondaryColor)};"
|
|
73
|
+
>
|
|
74
|
+
<!-- PreviewHeader: px-8 pt-5 -->
|
|
75
|
+
<div class="px-8 pt-5">
|
|
76
|
+
<h2 class="text-2xl font-bold text-[#333333]">${escapeHtml(copy.title)}</h2>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<!-- PreviewContent: p-8 pt-4 space-y-6 -->
|
|
80
|
+
<div class="p-8 pt-4 space-y-6">
|
|
81
|
+
<!-- PreviewAgentInfo: flex gap-4 items-start -->
|
|
82
|
+
<div class="flex gap-4 items-start">
|
|
83
|
+
<!-- Icon: w-[54px] h-[54px] rounded-[10px] border border-gray-300 -->
|
|
84
|
+
<div class="w-[54px] h-[54px] rounded-[10px] border border-gray-300 flex items-center justify-center flex-shrink-0 overflow-hidden bg-white">
|
|
85
|
+
${this.renderAgentIcon()}
|
|
86
|
+
</div>
|
|
87
|
+
<!-- Description: text-base text-black leading-[1.4] flex-1 -->
|
|
88
|
+
<p class="text-base text-black leading-[1.4] flex-1">${escapeHtml(copy.resolvedDescription)}</p>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<!-- Login Form: space-y-4 -->
|
|
92
|
+
<form id="credential-form" class="space-y-4">
|
|
93
|
+
<!-- Username Field: space-y-2 -->
|
|
94
|
+
<div class="space-y-2">
|
|
95
|
+
<label for="username" class="text-sm font-medium text-gray-700">
|
|
96
|
+
${escapeHtml(config.usernameLabel || "Username")}
|
|
97
|
+
</label>
|
|
98
|
+
<input
|
|
99
|
+
type="text"
|
|
100
|
+
id="username"
|
|
101
|
+
name="username"
|
|
102
|
+
placeholder="${escapeAttr(config.usernamePlaceholder || "Enter your username")}"
|
|
103
|
+
required
|
|
104
|
+
autocomplete="username"
|
|
105
|
+
class="flex h-11 w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:cursor-not-allowed disabled:opacity-50"
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<!-- Password Field: space-y-2 -->
|
|
110
|
+
<div class="space-y-2">
|
|
111
|
+
<label for="password" class="text-sm font-medium text-gray-700">
|
|
112
|
+
${escapeHtml(config.passwordLabel || "Password")}
|
|
113
|
+
</label>
|
|
114
|
+
<div class="relative">
|
|
115
|
+
<input
|
|
116
|
+
type="password"
|
|
117
|
+
id="password"
|
|
118
|
+
name="password"
|
|
119
|
+
placeholder="${escapeAttr(config.passwordPlaceholder || "Enter your password")}"
|
|
120
|
+
required
|
|
121
|
+
autocomplete="current-password"
|
|
122
|
+
class="flex h-11 w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:cursor-not-allowed disabled:opacity-50 pr-10"
|
|
123
|
+
/>
|
|
124
|
+
<button
|
|
125
|
+
type="button"
|
|
126
|
+
id="toggle-password"
|
|
127
|
+
class="absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600"
|
|
128
|
+
aria-label="Toggle password visibility"
|
|
129
|
+
>
|
|
130
|
+
<!-- Eye icon (visible when password is hidden) -->
|
|
131
|
+
<svg id="eye-icon" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
132
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
|
133
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"></path>
|
|
134
|
+
</svg>
|
|
135
|
+
<!-- Eye-off icon (visible when password is shown) -->
|
|
136
|
+
<svg id="eye-off-icon" class="w-4 h-4 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
137
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"></path>
|
|
138
|
+
</svg>
|
|
139
|
+
</button>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<!-- Remember Me & Forgot Password: flex items-center justify-between -->
|
|
144
|
+
${this.renderRememberAndForgot(config, primaryColor)}
|
|
145
|
+
|
|
146
|
+
<!-- Error Container (hidden by default) -->
|
|
147
|
+
<div id="error-container" class="hidden">
|
|
148
|
+
<div class="p-3 bg-red-50 border border-red-200 rounded-lg text-red-700 text-sm"></div>
|
|
149
|
+
</div>
|
|
150
|
+
</form>
|
|
151
|
+
|
|
152
|
+
<!-- PreviewButtonGroup: flex gap-3 justify-end -->
|
|
153
|
+
<div class="flex gap-3 justify-end">
|
|
154
|
+
<button
|
|
155
|
+
type="button"
|
|
156
|
+
onclick="window.close()"
|
|
157
|
+
class="font-medium text-sm rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed px-4 py-2.5 h-10 border-[1.5px] bg-transparent"
|
|
158
|
+
style="border-color: ${escapeAttr(primaryColor)}; color: ${escapeAttr(primaryColor)};"
|
|
159
|
+
>
|
|
160
|
+
${escapeHtml(copy.cancelButtonText)}
|
|
161
|
+
</button>
|
|
162
|
+
<button
|
|
163
|
+
type="submit"
|
|
164
|
+
form="credential-form"
|
|
165
|
+
class="font-medium text-sm rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed px-4 py-3 h-11 text-white"
|
|
166
|
+
style="background-color: ${escapeAttr(primaryColor)};"
|
|
167
|
+
>
|
|
168
|
+
Sign in
|
|
169
|
+
</button>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
${this.renderModeScript()}
|
|
175
|
+
</body>
|
|
176
|
+
</html>`;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Render agent icon SVG (matches AgentIconPlaceholder in AgentShield)
|
|
180
|
+
*/
|
|
181
|
+
renderAgentIcon() {
|
|
182
|
+
const logoUrl = this.resolved.branding.logoUrl;
|
|
183
|
+
if (logoUrl) {
|
|
184
|
+
return `<img src="${escapeAttr(logoUrl)}" alt="Agent" class="w-full h-full object-contain" />`;
|
|
185
|
+
}
|
|
186
|
+
// Default placeholder icon matching AgentShield exactly
|
|
187
|
+
return `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" class="text-gray-400">
|
|
188
|
+
<rect x="3" y="3" width="18" height="18" rx="2" stroke="currentColor" stroke-width="2" />
|
|
189
|
+
<circle cx="8" cy="8" r="1.5" fill="currentColor" />
|
|
190
|
+
<circle cx="16" cy="8" r="1.5" fill="currentColor" />
|
|
191
|
+
<path d="M8 14s1.5 2 4 2 4-2 4-2" stroke="currentColor" stroke-width="2" stroke-linecap="round" />
|
|
192
|
+
</svg>`;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Render remember me checkbox and forgot password link.
|
|
196
|
+
* The checkbox uses a <label> that wraps everything so clicking toggles.
|
|
197
|
+
*/
|
|
198
|
+
renderRememberAndForgot(config, primaryColor) {
|
|
199
|
+
const showRemember = config.showRememberMe !== false;
|
|
200
|
+
const showForgot = config.showForgotPassword === true;
|
|
201
|
+
if (!showRemember && !showForgot)
|
|
202
|
+
return "";
|
|
203
|
+
// Match PreviewCheckbox exactly: custom div with border-2 border-gray-300 bg-white when unchecked
|
|
204
|
+
// When checked: backgroundColor and borderColor set to primaryColor, with white Check icon
|
|
205
|
+
const rememberHtml = showRemember
|
|
206
|
+
? `
|
|
207
|
+
<div id="remember-label" class="flex items-center gap-3 cursor-pointer select-none" role="button" tabindex="0">
|
|
208
|
+
<div
|
|
209
|
+
id="remember-checkbox"
|
|
210
|
+
class="w-4 h-4 rounded flex items-center justify-center transition-colors border-2 border-gray-300 bg-white"
|
|
211
|
+
role="checkbox"
|
|
212
|
+
aria-checked="false"
|
|
213
|
+
>
|
|
214
|
+
<!-- Checkmark (hidden by default, shown when checked) -->
|
|
215
|
+
<svg id="remember-check" class="w-3 h-3 text-white hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2.5">
|
|
216
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"></path>
|
|
217
|
+
</svg>
|
|
218
|
+
</div>
|
|
219
|
+
<span class="text-base text-black">Remember me</span>
|
|
220
|
+
<input type="hidden" name="rememberMe" id="rememberMe-input" value="false" />
|
|
221
|
+
</div>
|
|
222
|
+
`
|
|
223
|
+
: "<span></span>";
|
|
224
|
+
// Validate URL to prevent javascript: and other dangerous protocols
|
|
225
|
+
const validatedUrl = config.forgotPasswordUrl ? validateUrl(config.forgotPasswordUrl) : undefined;
|
|
226
|
+
const forgotHtml = showForgot
|
|
227
|
+
? `
|
|
228
|
+
<a href="${escapeAttr(validatedUrl || "#")}"
|
|
229
|
+
class="text-sm hover:underline"
|
|
230
|
+
style="color: ${escapeAttr(primaryColor)}">
|
|
231
|
+
Forgot password?
|
|
232
|
+
</a>
|
|
233
|
+
`
|
|
234
|
+
: "";
|
|
235
|
+
return `
|
|
236
|
+
<div class="flex items-center justify-between">
|
|
237
|
+
${rememberHtml}
|
|
238
|
+
${forgotHtml}
|
|
239
|
+
</div>
|
|
240
|
+
`;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* These methods are overridden to prevent base template rendering
|
|
244
|
+
* since we completely override render()
|
|
245
|
+
*/
|
|
246
|
+
renderAuthContent() {
|
|
247
|
+
return "";
|
|
248
|
+
}
|
|
249
|
+
renderActionButtons() {
|
|
250
|
+
return "";
|
|
251
|
+
}
|
|
252
|
+
renderTermsSection() {
|
|
253
|
+
return "";
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Render mode-specific scripts for password toggle and checkbox
|
|
257
|
+
*/
|
|
258
|
+
renderModeScript() {
|
|
259
|
+
// Use escapeJs which properly escapes via JSON.stringify (returns quoted string)
|
|
260
|
+
const serverUrl = escapeJs(this.config.serverUrl);
|
|
261
|
+
const projectId = escapeJs(this.config.projectId);
|
|
262
|
+
const sessionId = escapeJs(this.config.sessionId);
|
|
263
|
+
const agentDid = escapeJs(this.config.agentDid);
|
|
264
|
+
const tool = escapeJs(this.config.tool);
|
|
265
|
+
const scopes = JSON.stringify(this.config.scopes);
|
|
266
|
+
const provider = escapeJs(this.config.provider || "credentials");
|
|
267
|
+
const primaryColor = escapeJs(this.resolved.branding.primaryColor);
|
|
268
|
+
return `
|
|
269
|
+
<script>
|
|
270
|
+
(function() {
|
|
271
|
+
// Password visibility toggle
|
|
272
|
+
var toggleBtn = document.getElementById('toggle-password');
|
|
273
|
+
var passwordInput = document.getElementById('password');
|
|
274
|
+
var eyeIcon = document.getElementById('eye-icon');
|
|
275
|
+
var eyeOffIcon = document.getElementById('eye-off-icon');
|
|
276
|
+
|
|
277
|
+
if (toggleBtn && passwordInput) {
|
|
278
|
+
toggleBtn.addEventListener('click', function() {
|
|
279
|
+
var isPassword = passwordInput.type === 'password';
|
|
280
|
+
passwordInput.type = isPassword ? 'text' : 'password';
|
|
281
|
+
eyeIcon.classList.toggle('hidden', isPassword);
|
|
282
|
+
eyeOffIcon.classList.toggle('hidden', !isPassword);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Remember me checkbox toggle
|
|
287
|
+
var rememberLabel = document.getElementById('remember-label');
|
|
288
|
+
var rememberCheckbox = document.getElementById('remember-checkbox');
|
|
289
|
+
var rememberCheck = document.getElementById('remember-check');
|
|
290
|
+
var rememberInput = document.getElementById('rememberMe-input');
|
|
291
|
+
var checkboxColor = ${primaryColor};
|
|
292
|
+
|
|
293
|
+
if (rememberLabel && rememberCheckbox && rememberCheck) {
|
|
294
|
+
var isChecked = false;
|
|
295
|
+
|
|
296
|
+
rememberLabel.onclick = function() {
|
|
297
|
+
isChecked = !isChecked;
|
|
298
|
+
|
|
299
|
+
if (isChecked) {
|
|
300
|
+
rememberCheckbox.style.backgroundColor = checkboxColor;
|
|
301
|
+
rememberCheckbox.style.borderColor = checkboxColor;
|
|
302
|
+
rememberCheck.classList.remove('hidden');
|
|
303
|
+
} else {
|
|
304
|
+
rememberCheckbox.style.backgroundColor = 'white';
|
|
305
|
+
rememberCheckbox.style.borderColor = '#d1d5db';
|
|
306
|
+
rememberCheck.classList.add('hidden');
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
rememberCheckbox.setAttribute('aria-checked', isChecked.toString());
|
|
310
|
+
if (rememberInput) rememberInput.value = isChecked ? 'true' : 'false';
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Form submission
|
|
315
|
+
var form = document.getElementById('credential-form');
|
|
316
|
+
if (!form) return;
|
|
317
|
+
|
|
318
|
+
var formServerUrl = ${serverUrl};
|
|
319
|
+
var formProjectId = ${projectId};
|
|
320
|
+
var errorContainer = document.getElementById('error-container');
|
|
321
|
+
var errorDiv = errorContainer ? errorContainer.querySelector('div') : null;
|
|
322
|
+
|
|
323
|
+
form.addEventListener('submit', function(e) {
|
|
324
|
+
e.preventDefault();
|
|
325
|
+
|
|
326
|
+
var submitBtn = document.querySelector('button[type="submit"]');
|
|
327
|
+
var originalText = submitBtn.textContent;
|
|
328
|
+
|
|
329
|
+
if (errorContainer) errorContainer.classList.add('hidden');
|
|
330
|
+
|
|
331
|
+
submitBtn.disabled = true;
|
|
332
|
+
submitBtn.textContent = 'Signing in...';
|
|
333
|
+
submitBtn.style.opacity = '0.7';
|
|
334
|
+
|
|
335
|
+
var formData = new FormData(form);
|
|
336
|
+
|
|
337
|
+
var data = {
|
|
338
|
+
auth_mode: 'credentials',
|
|
339
|
+
provider_type: 'credential',
|
|
340
|
+
provider: ${provider},
|
|
341
|
+
username: formData.get('username'),
|
|
342
|
+
password: formData.get('password'),
|
|
343
|
+
rememberMe: formData.get('rememberMe') === 'true',
|
|
344
|
+
tool: ${tool},
|
|
345
|
+
scopes: ${scopes},
|
|
346
|
+
agent_did: ${agentDid},
|
|
347
|
+
session_id: ${sessionId},
|
|
348
|
+
project_id: ${projectId}
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
fetch(formServerUrl + '/consent/approve', {
|
|
352
|
+
method: 'POST',
|
|
353
|
+
headers: { 'Content-Type': 'application/json' },
|
|
354
|
+
body: JSON.stringify(data)
|
|
355
|
+
})
|
|
356
|
+
.then(function(response) { return response.json(); })
|
|
357
|
+
.then(function(result) {
|
|
358
|
+
if (result.success) {
|
|
359
|
+
submitBtn.textContent = 'Success! Redirecting...';
|
|
360
|
+
submitBtn.style.backgroundColor = '#10B981';
|
|
361
|
+
|
|
362
|
+
if (result.redirectUrl) {
|
|
363
|
+
window.location.href = result.redirectUrl;
|
|
364
|
+
} else if (result.delegation_id) {
|
|
365
|
+
window.location.href = formServerUrl + '/consent/success?delegation_id=' +
|
|
366
|
+
encodeURIComponent(result.delegation_id) +
|
|
367
|
+
'&project_id=' + encodeURIComponent(formProjectId);
|
|
368
|
+
}
|
|
369
|
+
} else {
|
|
370
|
+
if (errorDiv) {
|
|
371
|
+
errorDiv.textContent = result.error || 'Authentication failed. Please check your credentials.';
|
|
372
|
+
errorContainer.classList.remove('hidden');
|
|
373
|
+
}
|
|
374
|
+
submitBtn.disabled = false;
|
|
375
|
+
submitBtn.textContent = originalText;
|
|
376
|
+
submitBtn.style.opacity = '1';
|
|
377
|
+
}
|
|
378
|
+
})
|
|
379
|
+
.catch(function(err) {
|
|
380
|
+
if (errorDiv) {
|
|
381
|
+
errorDiv.textContent = 'Network error. Please try again.';
|
|
382
|
+
errorContainer.classList.remove('hidden');
|
|
383
|
+
}
|
|
384
|
+
submitBtn.disabled = false;
|
|
385
|
+
submitBtn.textContent = originalText;
|
|
386
|
+
submitBtn.style.opacity = '1';
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
})();
|
|
390
|
+
</script>`;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=credentials.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.template.js","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/credentials.template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Mode Templates Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all auth mode template classes.
|
|
5
|
+
*
|
|
6
|
+
* @module consent-templates/modes
|
|
7
|
+
*/
|
|
8
|
+
export { ConsentOnlyTemplate } from "./consent-only.template";
|
|
9
|
+
export { CredentialsTemplate } from "./credentials.template";
|
|
10
|
+
export { OAuthTemplate } from "./oauth.template";
|
|
11
|
+
export { MagicLinkTemplate } from "./magic-link.template";
|
|
12
|
+
export { OTPTemplate } from "./otp.template";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Mode Templates Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all auth mode template classes.
|
|
5
|
+
*
|
|
6
|
+
* @module consent-templates/modes
|
|
7
|
+
*/
|
|
8
|
+
export { ConsentOnlyTemplate } from "./consent-only.template";
|
|
9
|
+
export { CredentialsTemplate } from "./credentials.template";
|
|
10
|
+
export { OAuthTemplate } from "./oauth.template";
|
|
11
|
+
export { MagicLinkTemplate } from "./magic-link.template";
|
|
12
|
+
export { OTPTemplate } from "./otp.template";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic Link Template
|
|
3
|
+
*
|
|
4
|
+
* Passwordless authentication via email link.
|
|
5
|
+
*
|
|
6
|
+
* @module consent-templates/modes/magic-link
|
|
7
|
+
*/
|
|
8
|
+
import { BaseConsentTemplate } from "../base/base-template";
|
|
9
|
+
import type { AuthMode } from "../types";
|
|
10
|
+
/**
|
|
11
|
+
* Magic Link Template
|
|
12
|
+
*
|
|
13
|
+
* Renders an email-based passwordless login:
|
|
14
|
+
* - Email input field
|
|
15
|
+
* - Submit button
|
|
16
|
+
* - Success/waiting state
|
|
17
|
+
* - Resend link functionality
|
|
18
|
+
*/
|
|
19
|
+
export declare class MagicLinkTemplate extends BaseConsentTemplate {
|
|
20
|
+
get authMode(): AuthMode;
|
|
21
|
+
private get magicLinkConfig();
|
|
22
|
+
renderAuthContent(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Render email input field.
|
|
25
|
+
*/
|
|
26
|
+
private renderEmailField;
|
|
27
|
+
/**
|
|
28
|
+
* Override action buttons - form has its own submit.
|
|
29
|
+
*/
|
|
30
|
+
protected renderActionButtons(): string;
|
|
31
|
+
protected renderModeScript(): string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=magic-link.template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magic-link.template.d.ts","sourceRoot":"","sources":["../../../../src/services/consent-templates/modes/magic-link.template.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAO5D,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AAE1D;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,SAAQ,mBAAmB;IACxD,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,OAAO,KAAK,eAAe,GAE1B;IAED,iBAAiB,IAAI,MAAM;IA6B3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,SAAS,CAAC,mBAAmB,IAAI,MAAM;IAIvC,SAAS,CAAC,gBAAgB,IAAI,MAAM;CA6HrC"}
|