@kya-os/consent 0.1.13 → 0.1.14
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/bundle/inline.d.ts.map +1 -1
- package/dist/bundle/inline.js +2 -2
- package/dist/bundle/inline.js.map +1 -1
- package/dist/bundle/shell.d.ts +5 -0
- package/dist/bundle/shell.d.ts.map +1 -1
- package/dist/bundle/shell.js +3 -1
- package/dist/bundle/shell.js.map +1 -1
- package/dist/cjs/bundle/index.js +57 -0
- package/dist/cjs/bundle/index.js.map +1 -0
- package/dist/cjs/bundle/inline.js +22 -0
- package/dist/cjs/bundle/inline.js.map +1 -0
- package/dist/cjs/bundle/shell.js +291 -0
- package/dist/cjs/bundle/shell.js.map +1 -0
- package/dist/cjs/components/consent-button.js +180 -0
- package/dist/cjs/components/consent-button.js.map +1 -0
- package/dist/cjs/components/consent-checkbox.js +223 -0
- package/dist/cjs/components/consent-checkbox.js.map +1 -0
- package/dist/cjs/components/consent-input.js +335 -0
- package/dist/cjs/components/consent-input.js.map +1 -0
- package/dist/cjs/components/consent-oauth-button.js +392 -0
- package/dist/cjs/components/consent-oauth-button.js.map +1 -0
- package/dist/cjs/components/consent-otp-input.js +388 -0
- package/dist/cjs/components/consent-otp-input.js.map +1 -0
- package/dist/cjs/components/consent-permissions.js +433 -0
- package/dist/cjs/components/consent-permissions.js.map +1 -0
- package/dist/cjs/components/consent-shell.js +234 -0
- package/dist/cjs/components/consent-shell.js.map +1 -0
- package/dist/cjs/components/consent-terms.js +287 -0
- package/dist/cjs/components/consent-terms.js.map +1 -0
- package/dist/cjs/components/index.js +37 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/components/mcp-consent.js +1034 -0
- package/dist/cjs/components/mcp-consent.js.map +1 -0
- package/dist/cjs/constants/auth-modes.js +128 -0
- package/dist/cjs/constants/auth-modes.js.map +1 -0
- package/dist/cjs/constants/colors.js +40 -0
- package/dist/cjs/constants/colors.js.map +1 -0
- package/dist/cjs/constants/defaults.js +146 -0
- package/dist/cjs/constants/defaults.js.map +1 -0
- package/dist/cjs/constants/index.js +40 -0
- package/dist/cjs/constants/index.js.map +1 -0
- package/dist/cjs/index.js +49 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/react/index.js +190 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/resolution/index.js +28 -0
- package/dist/cjs/resolution/index.js.map +1 -0
- package/dist/cjs/resolution/resolve-branding.js +159 -0
- package/dist/cjs/resolution/resolve-branding.js.map +1 -0
- package/dist/cjs/resolution/resolve-config.js +270 -0
- package/dist/cjs/resolution/resolve-config.js.map +1 -0
- package/dist/cjs/resolution/resolve-copy.js +136 -0
- package/dist/cjs/resolution/resolve-copy.js.map +1 -0
- package/dist/cjs/schemas/api.schemas.js +156 -0
- package/dist/cjs/schemas/api.schemas.js.map +1 -0
- package/dist/cjs/schemas/branding.schemas.js +57 -0
- package/dist/cjs/schemas/branding.schemas.js.map +1 -0
- package/dist/cjs/schemas/config.schemas.js +147 -0
- package/dist/cjs/schemas/config.schemas.js.map +1 -0
- package/dist/cjs/schemas/index.js +29 -0
- package/dist/cjs/schemas/index.js.map +1 -0
- package/dist/cjs/schemas/modes.schemas.js +107 -0
- package/dist/cjs/schemas/modes.schemas.js.map +1 -0
- package/dist/cjs/security/escape.js +206 -0
- package/dist/cjs/security/escape.js.map +1 -0
- package/dist/cjs/security/index.js +26 -0
- package/dist/cjs/security/index.js.map +1 -0
- package/dist/cjs/security/validators.js +210 -0
- package/dist/cjs/security/validators.js.map +1 -0
- package/dist/cjs/styles/css-variables.js +129 -0
- package/dist/cjs/styles/css-variables.js.map +1 -0
- package/dist/cjs/styles/index.js +28 -0
- package/dist/cjs/styles/index.js.map +1 -0
- package/dist/cjs/styles/stylesheet.js +204 -0
- package/dist/cjs/styles/stylesheet.js.map +1 -0
- package/dist/cjs/styles/tokens.js +183 -0
- package/dist/cjs/styles/tokens.js.map +1 -0
- package/dist/cjs/templates/base/base-template.js +282 -0
- package/dist/cjs/templates/base/base-template.js.map +1 -0
- package/dist/cjs/templates/base/components.js +295 -0
- package/dist/cjs/templates/base/components.js.map +1 -0
- package/dist/cjs/templates/base/index.js +26 -0
- package/dist/cjs/templates/base/index.js.map +1 -0
- package/dist/cjs/templates/index.js +34 -0
- package/dist/cjs/templates/index.js.map +1 -0
- package/dist/cjs/templates/modes/consent-only.template.js +74 -0
- package/dist/cjs/templates/modes/consent-only.template.js.map +1 -0
- package/dist/cjs/templates/modes/credentials.template.js +414 -0
- package/dist/cjs/templates/modes/credentials.template.js.map +1 -0
- package/dist/cjs/templates/modes/index.js +24 -0
- package/dist/cjs/templates/modes/index.js.map +1 -0
- package/dist/cjs/templates/modes/magic-link.template.js +196 -0
- package/dist/cjs/templates/modes/magic-link.template.js.map +1 -0
- package/dist/cjs/templates/modes/oauth.template.js +153 -0
- package/dist/cjs/templates/modes/oauth.template.js.map +1 -0
- package/dist/cjs/templates/modes/otp.template.js +316 -0
- package/dist/cjs/templates/modes/otp.template.js.map +1 -0
- package/dist/cjs/templates/modes/success.template.js +140 -0
- package/dist/cjs/templates/modes/success.template.js.map +1 -0
- package/dist/cjs/templates/registry.js +133 -0
- package/dist/cjs/templates/registry.js.map +1 -0
- package/dist/cjs/types/api.types.js +10 -0
- package/dist/cjs/types/api.types.js.map +1 -0
- package/dist/cjs/types/branding.types.js +10 -0
- package/dist/cjs/types/branding.types.js.map +1 -0
- package/dist/cjs/types/config.types.js +10 -0
- package/dist/cjs/types/config.types.js.map +1 -0
- package/dist/cjs/types/copy.types.js +10 -0
- package/dist/cjs/types/copy.types.js.map +1 -0
- package/dist/cjs/types/index.js +31 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/modes.types.js +140 -0
- package/dist/cjs/types/modes.types.js.map +1 -0
- package/dist/cjs/types/page.types.js +10 -0
- package/dist/cjs/types/page.types.js.map +1 -0
- package/dist/components/mcp-consent.d.ts +6 -0
- package/dist/components/mcp-consent.d.ts.map +1 -1
- package/dist/components/mcp-consent.js +14 -0
- package/dist/components/mcp-consent.js.map +1 -1
- package/dist/consent.js +7 -0
- package/dist/consent.min.js +2 -2
- package/dist/schemas/api.schemas.d.ts +116 -116
- package/dist/schemas/config.schemas.d.ts +116 -116
- package/dist/schemas/modes.schemas.d.ts +28 -28
- package/package.json +29 -15
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTML/JS Escape Utilities
|
|
4
|
+
*
|
|
5
|
+
* XSS prevention utilities for rendering user content safely.
|
|
6
|
+
*
|
|
7
|
+
* @module @kya-os/consent/security/escape
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.escapeHtml = escapeHtml;
|
|
11
|
+
exports.escapeAttr = escapeAttr;
|
|
12
|
+
exports.escapeJs = escapeJs;
|
|
13
|
+
exports.escapeJsValue = escapeJsValue;
|
|
14
|
+
exports.escapeUrl = escapeUrl;
|
|
15
|
+
exports.safeHtml = safeHtml;
|
|
16
|
+
exports.safeAttr = safeAttr;
|
|
17
|
+
/**
|
|
18
|
+
* HTML entities to escape
|
|
19
|
+
*/
|
|
20
|
+
const HTML_ESCAPE_MAP = {
|
|
21
|
+
"&": "&",
|
|
22
|
+
"<": "<",
|
|
23
|
+
">": ">",
|
|
24
|
+
'"': """,
|
|
25
|
+
"'": "'",
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Additional characters to escape in attributes
|
|
29
|
+
*/
|
|
30
|
+
const ATTR_ESCAPE_MAP = {
|
|
31
|
+
...HTML_ESCAPE_MAP,
|
|
32
|
+
"`": "`",
|
|
33
|
+
"=": "=",
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Escape HTML special characters to prevent XSS
|
|
37
|
+
*
|
|
38
|
+
* Converts characters that have special meaning in HTML to their
|
|
39
|
+
* entity equivalents, making them safe to insert into HTML content.
|
|
40
|
+
*
|
|
41
|
+
* @param text - The text to escape
|
|
42
|
+
* @returns HTML-safe string
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* escapeHtml('<script>alert("xss")</script>')
|
|
47
|
+
* // Returns: '<script>alert("xss")</script>'
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
function escapeHtml(text) {
|
|
51
|
+
if (!text)
|
|
52
|
+
return "";
|
|
53
|
+
return text.replace(/[&<>"']/g, (char) => HTML_ESCAPE_MAP[char] ?? char);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Escape text for use in HTML attributes
|
|
57
|
+
*
|
|
58
|
+
* More comprehensive escaping than escapeHtml, including backticks
|
|
59
|
+
* and equals signs which can be dangerous in attribute contexts.
|
|
60
|
+
*
|
|
61
|
+
* @param value - The value to escape
|
|
62
|
+
* @returns Attribute-safe string
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* escapeAttr('value" onclick="alert(1)')
|
|
67
|
+
* // Returns: 'value" onclick="alert(1)'
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
function escapeAttr(value) {
|
|
71
|
+
if (!value)
|
|
72
|
+
return "";
|
|
73
|
+
return value.replace(/[&<>"'`=]/g, (char) => ATTR_ESCAPE_MAP[char] ?? char);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Escape text for use in JavaScript strings
|
|
77
|
+
*
|
|
78
|
+
* Uses JSON.stringify to properly escape all special characters
|
|
79
|
+
* that could break out of a JavaScript string context.
|
|
80
|
+
*
|
|
81
|
+
* @param text - The text to escape
|
|
82
|
+
* @returns JS-safe string (without surrounding quotes)
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* escapeJs('hello\nworld')
|
|
87
|
+
* // Returns: '"hello\\nworld"' (with quotes from JSON.stringify)
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
function escapeJs(text) {
|
|
91
|
+
if (!text)
|
|
92
|
+
return '""';
|
|
93
|
+
return JSON.stringify(text);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Escape text for use in JavaScript, returning value without quotes
|
|
97
|
+
*
|
|
98
|
+
* @param text - The text to escape
|
|
99
|
+
* @returns JS-safe string content (without surrounding quotes)
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* escapeJsValue('hello\nworld')
|
|
104
|
+
* // Returns: 'hello\\nworld'
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
function escapeJsValue(text) {
|
|
108
|
+
if (!text)
|
|
109
|
+
return "";
|
|
110
|
+
// JSON.stringify adds quotes, remove them
|
|
111
|
+
const escaped = JSON.stringify(text);
|
|
112
|
+
return escaped.slice(1, -1);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Escape URL for use in href or src attributes
|
|
116
|
+
*
|
|
117
|
+
* Only allows http, https, and mailto protocols. Returns empty
|
|
118
|
+
* string for dangerous protocols like javascript:.
|
|
119
|
+
*
|
|
120
|
+
* @param url - The URL to escape
|
|
121
|
+
* @returns Safe URL or empty string
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```typescript
|
|
125
|
+
* escapeUrl('javascript:alert(1)')
|
|
126
|
+
* // Returns: ''
|
|
127
|
+
*
|
|
128
|
+
* escapeUrl('https://example.com/?q=test')
|
|
129
|
+
* // Returns: 'https://example.com/?q=test'
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
function escapeUrl(url) {
|
|
133
|
+
if (!url)
|
|
134
|
+
return "";
|
|
135
|
+
// Check for dangerous protocols
|
|
136
|
+
const lowerUrl = url.toLowerCase().trim();
|
|
137
|
+
if (lowerUrl.startsWith("javascript:") ||
|
|
138
|
+
lowerUrl.startsWith("data:") ||
|
|
139
|
+
lowerUrl.startsWith("vbscript:") ||
|
|
140
|
+
lowerUrl.startsWith("file:")) {
|
|
141
|
+
return "";
|
|
142
|
+
}
|
|
143
|
+
// Try to parse as URL to validate
|
|
144
|
+
try {
|
|
145
|
+
const parsed = new URL(url);
|
|
146
|
+
if (!["http:", "https:", "mailto:"].includes(parsed.protocol)) {
|
|
147
|
+
return "";
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Block protocol-relative URLs (//evil.com) which bypass protocol checks
|
|
152
|
+
if (url.startsWith("//")) {
|
|
153
|
+
return "";
|
|
154
|
+
}
|
|
155
|
+
// If it's a relative URL (single slash, hash, or query), that's okay
|
|
156
|
+
if (!url.startsWith("/") && !url.startsWith("#") && !url.startsWith("?")) {
|
|
157
|
+
// Absolute URL that failed to parse - unsafe
|
|
158
|
+
return "";
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Escape any HTML characters in the URL (but not = or ` which are safe in URLs)
|
|
162
|
+
return escapeHtml(url);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Create a safe HTML string from template literals
|
|
166
|
+
*
|
|
167
|
+
* Automatically escapes interpolated values while preserving
|
|
168
|
+
* the template structure.
|
|
169
|
+
*
|
|
170
|
+
* @param strings - Template literal strings
|
|
171
|
+
* @param values - Interpolated values to escape
|
|
172
|
+
* @returns Safe HTML string
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const userInput = '<script>alert("xss")</script>';
|
|
177
|
+
* const html = safeHtml`<div>${userInput}</div>`;
|
|
178
|
+
* // Returns: '<div><script>alert("xss")</script></div>'
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
function safeHtml(strings, ...values) {
|
|
182
|
+
let result = strings[0] ?? "";
|
|
183
|
+
for (let i = 0; i < values.length; i++) {
|
|
184
|
+
const value = values[i];
|
|
185
|
+
const escaped = value === null || value === undefined ? "" : escapeHtml(String(value));
|
|
186
|
+
result += escaped + (strings[i + 1] ?? "");
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Create a safe attribute value from template literals
|
|
192
|
+
*
|
|
193
|
+
* @param strings - Template literal strings
|
|
194
|
+
* @param values - Interpolated values to escape
|
|
195
|
+
* @returns Safe attribute string
|
|
196
|
+
*/
|
|
197
|
+
function safeAttr(strings, ...values) {
|
|
198
|
+
let result = strings[0] ?? "";
|
|
199
|
+
for (let i = 0; i < values.length; i++) {
|
|
200
|
+
const value = values[i];
|
|
201
|
+
const escaped = value === null || value === undefined ? "" : escapeAttr(String(value));
|
|
202
|
+
result += escaped + (strings[i + 1] ?? "");
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=escape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../../src/security/escape.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Consent Security Utilities
|
|
4
|
+
*
|
|
5
|
+
* XSS prevention and input validation utilities.
|
|
6
|
+
*
|
|
7
|
+
* @module @kya-os/consent/security
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
__exportStar(require("./escape.js"), exports);
|
|
25
|
+
__exportStar(require("./validators.js"), exports);
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/security/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,kDAAgC"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security Validators
|
|
4
|
+
*
|
|
5
|
+
* Input validation utilities for secure rendering.
|
|
6
|
+
*
|
|
7
|
+
* @module @kya-os/consent/security/validators
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.validateColor = validateColor;
|
|
11
|
+
exports.validateUrl = validateUrl;
|
|
12
|
+
exports.validateEmail = validateEmail;
|
|
13
|
+
exports.validateDid = validateDid;
|
|
14
|
+
exports.validateNoControlChars = validateNoControlChars;
|
|
15
|
+
exports.sanitizeDisplayText = sanitizeDisplayText;
|
|
16
|
+
exports.validateIdentifier = validateIdentifier;
|
|
17
|
+
exports.isValidInteger = isValidInteger;
|
|
18
|
+
exports.validateCSRFToken = validateCSRFToken;
|
|
19
|
+
/**
|
|
20
|
+
* Validate that a string is a valid hex color
|
|
21
|
+
*
|
|
22
|
+
* Only accepts 6-digit hex colors with # prefix.
|
|
23
|
+
*
|
|
24
|
+
* @param color - Color string to validate
|
|
25
|
+
* @returns The color if valid, undefined otherwise
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* validateColor('#2563EB') // Returns '#2563EB'
|
|
30
|
+
* validateColor('2563EB') // Returns undefined
|
|
31
|
+
* validateColor('#fff') // Returns undefined (3-digit not allowed)
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
function validateColor(color) {
|
|
35
|
+
if (!color)
|
|
36
|
+
return undefined;
|
|
37
|
+
const hex6Pattern = /^#[0-9A-Fa-f]{6}$/;
|
|
38
|
+
if (hex6Pattern.test(color)) {
|
|
39
|
+
return color;
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Validate that a string is a valid URL
|
|
45
|
+
*
|
|
46
|
+
* Only accepts http and https protocols.
|
|
47
|
+
*
|
|
48
|
+
* @param url - URL string to validate
|
|
49
|
+
* @returns The URL if valid, undefined otherwise
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* validateUrl('https://example.com') // Returns 'https://example.com'
|
|
54
|
+
* validateUrl('javascript:alert(1)') // Returns undefined
|
|
55
|
+
* validateUrl('ftp://files.example.com') // Returns undefined
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
function validateUrl(url) {
|
|
59
|
+
if (!url)
|
|
60
|
+
return undefined;
|
|
61
|
+
try {
|
|
62
|
+
const parsed = new URL(url);
|
|
63
|
+
if (parsed.protocol === "http:" || parsed.protocol === "https:") {
|
|
64
|
+
return url;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Invalid URL
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate that a string is a valid email address
|
|
74
|
+
*
|
|
75
|
+
* Uses a simple but effective email pattern.
|
|
76
|
+
*
|
|
77
|
+
* @param email - Email string to validate
|
|
78
|
+
* @returns The email if valid, undefined otherwise
|
|
79
|
+
*/
|
|
80
|
+
function validateEmail(email) {
|
|
81
|
+
if (!email)
|
|
82
|
+
return undefined;
|
|
83
|
+
// Simple email pattern - not exhaustive but catches most issues
|
|
84
|
+
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
85
|
+
if (emailPattern.test(email) && email.length <= 255) {
|
|
86
|
+
return email;
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validate that a string is a valid DID
|
|
92
|
+
*
|
|
93
|
+
* @param did - DID string to validate
|
|
94
|
+
* @returns The DID if valid, undefined otherwise
|
|
95
|
+
*/
|
|
96
|
+
function validateDid(did) {
|
|
97
|
+
if (!did)
|
|
98
|
+
return undefined;
|
|
99
|
+
// DID must start with did:
|
|
100
|
+
if (!did.startsWith("did:")) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
// Must have at least method and identifier (did:method:identifier)
|
|
104
|
+
const parts = did.split(":");
|
|
105
|
+
if (parts.length < 3) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
// Method must be alphanumeric
|
|
109
|
+
const method = parts[1];
|
|
110
|
+
if (!method || !/^[a-z0-9]+$/.test(method)) {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
// Reasonable length limit
|
|
114
|
+
if (did.length > 500) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
return did;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate that a string contains no control characters
|
|
121
|
+
*
|
|
122
|
+
* @param text - Text to validate
|
|
123
|
+
* @returns The text if valid, undefined otherwise
|
|
124
|
+
*/
|
|
125
|
+
function validateNoControlChars(text) {
|
|
126
|
+
if (!text)
|
|
127
|
+
return undefined;
|
|
128
|
+
// Allow only printable ASCII and common whitespace
|
|
129
|
+
// eslint-disable-next-line no-control-regex
|
|
130
|
+
const controlPattern = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/;
|
|
131
|
+
if (controlPattern.test(text)) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
return text;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Validate and sanitize a string for display
|
|
138
|
+
*
|
|
139
|
+
* Removes control characters and trims whitespace.
|
|
140
|
+
*
|
|
141
|
+
* @param text - Text to sanitize
|
|
142
|
+
* @param maxLength - Maximum allowed length
|
|
143
|
+
* @returns Sanitized text or undefined if invalid
|
|
144
|
+
*/
|
|
145
|
+
function sanitizeDisplayText(text, maxLength = 500) {
|
|
146
|
+
if (!text)
|
|
147
|
+
return undefined;
|
|
148
|
+
// Remove control characters
|
|
149
|
+
// eslint-disable-next-line no-control-regex
|
|
150
|
+
const cleaned = text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, "");
|
|
151
|
+
// Trim and check length
|
|
152
|
+
const trimmed = cleaned.trim();
|
|
153
|
+
if (trimmed.length === 0 || trimmed.length > maxLength) {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
return trimmed;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Validate that a string is alphanumeric with underscores only
|
|
160
|
+
*
|
|
161
|
+
* Useful for field names and identifiers.
|
|
162
|
+
*
|
|
163
|
+
* @param text - Text to validate
|
|
164
|
+
* @returns The text if valid, undefined otherwise
|
|
165
|
+
*/
|
|
166
|
+
function validateIdentifier(text) {
|
|
167
|
+
if (!text)
|
|
168
|
+
return undefined;
|
|
169
|
+
if (/^[a-zA-Z0-9_]+$/.test(text)) {
|
|
170
|
+
return text;
|
|
171
|
+
}
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Check if a value is a safe integer within range
|
|
176
|
+
*
|
|
177
|
+
* @param value - Value to check
|
|
178
|
+
* @param min - Minimum value (inclusive)
|
|
179
|
+
* @param max - Maximum value (inclusive)
|
|
180
|
+
* @returns True if valid
|
|
181
|
+
*/
|
|
182
|
+
function isValidInteger(value, min = Number.MIN_SAFE_INTEGER, max = Number.MAX_SAFE_INTEGER) {
|
|
183
|
+
if (typeof value !== "number")
|
|
184
|
+
return false;
|
|
185
|
+
if (!Number.isFinite(value))
|
|
186
|
+
return false;
|
|
187
|
+
if (!Number.isInteger(value))
|
|
188
|
+
return false;
|
|
189
|
+
return value >= min && value <= max;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Validate a CSRF token format
|
|
193
|
+
*
|
|
194
|
+
* @param token - Token to validate
|
|
195
|
+
* @returns The token if valid, undefined otherwise
|
|
196
|
+
*/
|
|
197
|
+
function validateCSRFToken(token) {
|
|
198
|
+
if (!token)
|
|
199
|
+
return undefined;
|
|
200
|
+
// CSRF tokens should be reasonably long random strings
|
|
201
|
+
if (token.length < 16 || token.length > 256) {
|
|
202
|
+
return undefined;
|
|
203
|
+
}
|
|
204
|
+
// Should only contain safe characters
|
|
205
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(token)) {
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
return token;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../../src/security/validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CSS Variable Generation
|
|
4
|
+
*
|
|
5
|
+
* Generates CSS custom properties for theming consent pages.
|
|
6
|
+
*
|
|
7
|
+
* @module @kya-os/consent/styles/css-variables
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.CSS_VAR_NAMES = void 0;
|
|
11
|
+
exports.hexToRgb = hexToRgb;
|
|
12
|
+
exports.generateCSSVariables = generateCSSVariables;
|
|
13
|
+
exports.generateCSSVariableString = generateCSSVariableString;
|
|
14
|
+
exports.generateFullCSSVariables = generateFullCSSVariables;
|
|
15
|
+
exports.generateStyleAttribute = generateStyleAttribute;
|
|
16
|
+
exports.generateRootCSSBlock = generateRootCSSBlock;
|
|
17
|
+
const colors_js_1 = require("../constants/colors.js");
|
|
18
|
+
/**
|
|
19
|
+
* CSS variable names used in consent pages
|
|
20
|
+
*/
|
|
21
|
+
exports.CSS_VAR_NAMES = {
|
|
22
|
+
PRIMARY: "--consent-primary",
|
|
23
|
+
SECONDARY: "--consent-secondary",
|
|
24
|
+
PRIMARY_RGB: "--consent-primary-rgb",
|
|
25
|
+
SECONDARY_RGB: "--consent-secondary-rgb",
|
|
26
|
+
BACKGROUND: "--consent-background",
|
|
27
|
+
TEXT_PRIMARY: "--consent-text-primary",
|
|
28
|
+
TEXT_SECONDARY: "--consent-text-secondary",
|
|
29
|
+
BORDER: "--consent-border",
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Convert hex color to RGB string
|
|
33
|
+
*
|
|
34
|
+
* @param hex - Hex color string (e.g., '#2563EB')
|
|
35
|
+
* @returns RGB string (e.g., '37, 99, 235')
|
|
36
|
+
*/
|
|
37
|
+
function hexToRgb(hex) {
|
|
38
|
+
// Remove # if present
|
|
39
|
+
const cleanHex = hex.replace(/^#/, '');
|
|
40
|
+
// Parse hex to RGB
|
|
41
|
+
const r = parseInt(cleanHex.slice(0, 2), 16);
|
|
42
|
+
const g = parseInt(cleanHex.slice(2, 4), 16);
|
|
43
|
+
const b = parseInt(cleanHex.slice(4, 6), 16);
|
|
44
|
+
return `${r}, ${g}, ${b}`;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate CSS variables from branding configuration
|
|
48
|
+
*
|
|
49
|
+
* @param branding - Branding config (optional fields)
|
|
50
|
+
* @returns CSS variable object with resolved values
|
|
51
|
+
*/
|
|
52
|
+
function generateCSSVariables(branding) {
|
|
53
|
+
const primary = branding?.primaryColor ?? colors_js_1.DEFAULT_COLORS.PRIMARY;
|
|
54
|
+
const secondary = branding?.secondaryColor ?? colors_js_1.DEFAULT_COLORS.SECONDARY;
|
|
55
|
+
return {
|
|
56
|
+
"--consent-primary": primary,
|
|
57
|
+
"--consent-secondary": secondary,
|
|
58
|
+
"--consent-primary-rgb": hexToRgb(primary),
|
|
59
|
+
"--consent-secondary-rgb": hexToRgb(secondary),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generate CSS variable declarations as a style string
|
|
64
|
+
*
|
|
65
|
+
* @param branding - Branding config
|
|
66
|
+
* @returns CSS style string (e.g., "--consent-primary: #2563EB;")
|
|
67
|
+
*/
|
|
68
|
+
function generateCSSVariableString(branding) {
|
|
69
|
+
const vars = generateCSSVariables(branding);
|
|
70
|
+
return Object.entries(vars)
|
|
71
|
+
.map(([name, value]) => `${name}: ${value};`)
|
|
72
|
+
.join(" ");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Generate CSS variable declarations with all theme colors
|
|
76
|
+
*
|
|
77
|
+
* @param branding - Branding config
|
|
78
|
+
* @returns Complete CSS variable declarations including derived colors
|
|
79
|
+
*/
|
|
80
|
+
function generateFullCSSVariables(branding) {
|
|
81
|
+
const primary = branding?.primaryColor ?? colors_js_1.DEFAULT_COLORS.PRIMARY;
|
|
82
|
+
const secondary = branding?.secondaryColor ?? colors_js_1.DEFAULT_COLORS.SECONDARY;
|
|
83
|
+
return {
|
|
84
|
+
// Core branding colors
|
|
85
|
+
[exports.CSS_VAR_NAMES.PRIMARY]: primary,
|
|
86
|
+
[exports.CSS_VAR_NAMES.SECONDARY]: secondary,
|
|
87
|
+
// Additional theme colors
|
|
88
|
+
[exports.CSS_VAR_NAMES.BACKGROUND]: colors_js_1.DEFAULT_COLORS.BACKGROUND,
|
|
89
|
+
[exports.CSS_VAR_NAMES.TEXT_PRIMARY]: colors_js_1.DEFAULT_COLORS.TEXT_PRIMARY,
|
|
90
|
+
[exports.CSS_VAR_NAMES.TEXT_SECONDARY]: colors_js_1.DEFAULT_COLORS.TEXT_SECONDARY,
|
|
91
|
+
[exports.CSS_VAR_NAMES.BORDER]: colors_js_1.DEFAULT_COLORS.BORDER,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Generate a style attribute value with CSS variables
|
|
96
|
+
*
|
|
97
|
+
* @param branding - Branding config
|
|
98
|
+
* @returns Style attribute value for inline styling
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```html
|
|
102
|
+
* <div style="${generateStyleAttribute(branding)}">...</div>
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
function generateStyleAttribute(branding) {
|
|
106
|
+
return generateCSSVariableString(branding);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Generate a :root CSS block with all variables
|
|
110
|
+
*
|
|
111
|
+
* @param branding - Branding config
|
|
112
|
+
* @returns CSS :root block
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```css
|
|
116
|
+
* :root {
|
|
117
|
+
* --consent-primary: #2563EB;
|
|
118
|
+
* --consent-secondary: #DBEAFE;
|
|
119
|
+
* }
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
function generateRootCSSBlock(branding) {
|
|
123
|
+
const vars = generateFullCSSVariables(branding);
|
|
124
|
+
const declarations = Object.entries(vars)
|
|
125
|
+
.map(([name, value]) => ` ${name}: ${value};`)
|
|
126
|
+
.join("\n");
|
|
127
|
+
return `:root {\n${declarations}\n}`;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=css-variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-variables.js","sourceRoot":"","sources":["../../../src/styles/css-variables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Consent Styles
|
|
4
|
+
*
|
|
5
|
+
* CSS tokens and generators for consent page styling.
|
|
6
|
+
* Matches AgentShield preview components exactly for pixel-perfect parity.
|
|
7
|
+
*
|
|
8
|
+
* @module @kya-os/consent/styles
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
22
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
__exportStar(require("./tokens.js"), exports);
|
|
26
|
+
__exportStar(require("./css-variables.js"), exports);
|
|
27
|
+
__exportStar(require("./stylesheet.js"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/styles/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;AAEH,8CAA4B;AAC5B,qDAAmC;AACnC,kDAAgC"}
|