hazo_auth 4.2.0 → 4.4.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/bin/hazo_auth.mjs +35 -0
- package/cli-src/assets/images/forgot_password_default.jpg +0 -0
- package/cli-src/assets/images/login_default.jpg +0 -0
- package/cli-src/assets/images/register_default.jpg +0 -0
- package/cli-src/assets/images/reset_password_default.jpg +0 -0
- package/cli-src/assets/images/verify_email_default.jpg +0 -0
- package/cli-src/cli/generate.ts +276 -0
- package/cli-src/cli/index.ts +207 -0
- package/cli-src/cli/init.ts +254 -0
- package/cli-src/cli/init_users.ts +376 -0
- package/cli-src/cli/validate.ts +581 -0
- package/cli-src/lib/already_logged_in_config.server.ts +46 -0
- package/cli-src/lib/app_logger.ts +24 -0
- package/cli-src/lib/auth/auth_cache.ts +220 -0
- package/cli-src/lib/auth/auth_rate_limiter.ts +121 -0
- package/cli-src/lib/auth/auth_types.ts +117 -0
- package/cli-src/lib/auth/auth_utils.server.ts +196 -0
- package/cli-src/lib/auth/dev_lock_validator.edge.ts +171 -0
- package/cli-src/lib/auth/hazo_get_auth.server.ts +583 -0
- package/cli-src/lib/auth/index.ts +23 -0
- package/cli-src/lib/auth/nextauth_config.ts +227 -0
- package/cli-src/lib/auth/org_cache.ts +148 -0
- package/cli-src/lib/auth/scope_cache.ts +233 -0
- package/cli-src/lib/auth/server_auth.ts +88 -0
- package/cli-src/lib/auth/session_token_validator.edge.ts +92 -0
- package/cli-src/lib/auth_utility_config.server.ts +136 -0
- package/cli-src/lib/config/config_loader.server.ts +164 -0
- package/cli-src/lib/config/default_config.ts +243 -0
- package/cli-src/lib/dev_lock_config.server.ts +148 -0
- package/cli-src/lib/email_verification_config.server.ts +63 -0
- package/cli-src/lib/file_types_config.server.ts +25 -0
- package/cli-src/lib/forgot_password_config.server.ts +63 -0
- package/cli-src/lib/hazo_connect_instance.server.ts +101 -0
- package/cli-src/lib/hazo_connect_setup.server.ts +194 -0
- package/cli-src/lib/hazo_connect_setup.ts +54 -0
- package/cli-src/lib/index.ts +46 -0
- package/cli-src/lib/login_config.server.ts +106 -0
- package/cli-src/lib/messages_config.server.ts +45 -0
- package/cli-src/lib/migrations/apply_migration.ts +105 -0
- package/cli-src/lib/multi_tenancy_config.server.ts +94 -0
- package/cli-src/lib/my_settings_config.server.ts +135 -0
- package/cli-src/lib/oauth_config.server.ts +87 -0
- package/cli-src/lib/password_requirements_config.server.ts +40 -0
- package/cli-src/lib/profile_pic_menu_config.server.ts +138 -0
- package/cli-src/lib/profile_picture_config.server.ts +56 -0
- package/cli-src/lib/register_config.server.ts +101 -0
- package/cli-src/lib/reset_password_config.server.ts +103 -0
- package/cli-src/lib/scope_hierarchy_config.server.ts +151 -0
- package/cli-src/lib/services/email_service.ts +587 -0
- package/cli-src/lib/services/email_verification_service.ts +270 -0
- package/cli-src/lib/services/index.ts +16 -0
- package/cli-src/lib/services/login_service.ts +150 -0
- package/cli-src/lib/services/oauth_service.ts +494 -0
- package/cli-src/lib/services/org_service.ts +965 -0
- package/cli-src/lib/services/password_change_service.ts +154 -0
- package/cli-src/lib/services/password_reset_service.ts +418 -0
- package/cli-src/lib/services/profile_picture_remove_service.ts +120 -0
- package/cli-src/lib/services/profile_picture_service.ts +451 -0
- package/cli-src/lib/services/profile_picture_source_mapper.ts +62 -0
- package/cli-src/lib/services/registration_service.ts +185 -0
- package/cli-src/lib/services/scope_labels_service.ts +348 -0
- package/cli-src/lib/services/scope_service.ts +778 -0
- package/cli-src/lib/services/session_token_service.ts +178 -0
- package/cli-src/lib/services/token_service.ts +240 -0
- package/cli-src/lib/services/user_profiles_cache.ts +189 -0
- package/cli-src/lib/services/user_profiles_service.ts +264 -0
- package/cli-src/lib/services/user_scope_service.ts +554 -0
- package/cli-src/lib/services/user_update_service.ts +141 -0
- package/cli-src/lib/ui_shell_config.server.ts +73 -0
- package/cli-src/lib/ui_sizes_config.server.ts +37 -0
- package/cli-src/lib/user_fields_config.server.ts +31 -0
- package/cli-src/lib/user_management_config.server.ts +39 -0
- package/cli-src/lib/user_profiles_config.server.ts +55 -0
- package/cli-src/lib/utils/api_route_helpers.ts +60 -0
- package/cli-src/lib/utils/error_sanitizer.ts +75 -0
- package/cli-src/lib/utils/password_validator.ts +65 -0
- package/cli-src/lib/utils.ts +11 -0
- package/cli-src/server/logging/logger_service.ts +56 -0
- package/cli-src/server/types/app_types.ts +74 -0
- package/cli-src/server/types/express.d.ts +16 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/init_users.d.ts +17 -0
- package/dist/cli/init_users.d.ts.map +1 -0
- package/dist/cli/init_users.js +307 -0
- package/dist/components/layouts/dev_lock/index.d.ts +29 -0
- package/dist/components/layouts/dev_lock/index.d.ts.map +1 -0
- package/dist/components/layouts/dev_lock/index.js +60 -0
- package/dist/components/layouts/index.d.ts +2 -0
- package/dist/components/layouts/index.d.ts.map +1 -1
- package/dist/components/layouts/index.js +1 -0
- package/dist/components/layouts/org_management/index.d.ts +26 -0
- package/dist/components/layouts/org_management/index.d.ts.map +1 -0
- package/dist/components/layouts/org_management/index.js +75 -0
- package/dist/components/layouts/shared/config/layout_customization.d.ts +2 -7
- package/dist/components/layouts/shared/config/layout_customization.d.ts.map +1 -1
- package/dist/components/layouts/user_management/components/org_hierarchy_tab.d.ts +13 -0
- package/dist/components/layouts/user_management/components/org_hierarchy_tab.d.ts.map +1 -0
- package/dist/components/layouts/user_management/components/org_hierarchy_tab.js +276 -0
- package/dist/components/layouts/user_management/index.d.ts +3 -1
- package/dist/components/layouts/user_management/index.d.ts.map +1 -1
- package/dist/components/layouts/user_management/index.js +10 -4
- package/dist/lib/auth/auth_types.d.ts +6 -0
- package/dist/lib/auth/auth_types.d.ts.map +1 -1
- package/dist/lib/auth/dev_lock_validator.edge.d.ts +38 -0
- package/dist/lib/auth/dev_lock_validator.edge.d.ts.map +1 -0
- package/dist/lib/auth/dev_lock_validator.edge.js +122 -0
- package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
- package/dist/lib/auth/hazo_get_auth.server.js +61 -1
- package/dist/lib/auth/org_cache.d.ts +65 -0
- package/dist/lib/auth/org_cache.d.ts.map +1 -0
- package/dist/lib/auth/org_cache.js +103 -0
- package/dist/lib/config/default_config.d.ts +76 -0
- package/dist/lib/config/default_config.d.ts.map +1 -1
- package/dist/lib/config/default_config.js +42 -0
- package/dist/lib/dev_lock_config.server.d.ts +41 -0
- package/dist/lib/dev_lock_config.server.d.ts.map +1 -0
- package/dist/lib/dev_lock_config.server.js +50 -0
- package/dist/lib/multi_tenancy_config.server.d.ts +30 -0
- package/dist/lib/multi_tenancy_config.server.d.ts.map +1 -0
- package/dist/lib/multi_tenancy_config.server.js +41 -0
- package/dist/lib/services/org_service.d.ts +191 -0
- package/dist/lib/services/org_service.d.ts.map +1 -0
- package/dist/lib/services/org_service.js +746 -0
- package/dist/lib/utils/password_validator.d.ts +7 -1
- package/dist/lib/utils/password_validator.d.ts.map +1 -1
- package/dist/page_components/dev_lock.d.ts +11 -0
- package/dist/page_components/dev_lock.d.ts.map +1 -0
- package/dist/page_components/dev_lock.js +17 -0
- package/dist/page_components/index.d.ts +1 -0
- package/dist/page_components/index.d.ts.map +1 -1
- package/dist/page_components/index.js +1 -0
- package/dist/page_components/org_management.d.ts +27 -0
- package/dist/page_components/org_management.d.ts.map +1 -0
- package/dist/page_components/org_management.js +18 -0
- package/hazo_auth_config.example.ini +30 -0
- package/package.json +27 -3
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// file_description: Edge-compatible dev lock cookie validator for Next.js middleware
|
|
2
|
+
// Uses Web Crypto API which works in Edge Runtime (no Node.js crypto module)
|
|
3
|
+
// section: imports
|
|
4
|
+
import type { NextRequest } from "next/server";
|
|
5
|
+
|
|
6
|
+
// section: constants
|
|
7
|
+
const COOKIE_NAME = "hazo_auth_dev_lock";
|
|
8
|
+
const SEPARATOR = "|";
|
|
9
|
+
|
|
10
|
+
// section: types
|
|
11
|
+
export type DevLockValidationResult = {
|
|
12
|
+
valid: boolean;
|
|
13
|
+
expired?: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type DevLockCookieData = {
|
|
17
|
+
value: string;
|
|
18
|
+
max_age: number;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// section: helpers
|
|
22
|
+
/**
|
|
23
|
+
* Creates HMAC-SHA256 signature using Web Crypto API (Edge compatible)
|
|
24
|
+
* @param data - Data to sign
|
|
25
|
+
* @param secret - Secret key for signing
|
|
26
|
+
* @returns Hex string signature
|
|
27
|
+
*/
|
|
28
|
+
async function create_signature(data: string, secret: string): Promise<string> {
|
|
29
|
+
const encoder = new TextEncoder();
|
|
30
|
+
const key_data = encoder.encode(secret);
|
|
31
|
+
const message_data = encoder.encode(data);
|
|
32
|
+
|
|
33
|
+
const crypto_key = await crypto.subtle.importKey(
|
|
34
|
+
"raw",
|
|
35
|
+
key_data,
|
|
36
|
+
{ name: "HMAC", hash: "SHA-256" },
|
|
37
|
+
false,
|
|
38
|
+
["sign"]
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const signature = await crypto.subtle.sign("HMAC", crypto_key, message_data);
|
|
42
|
+
|
|
43
|
+
// Convert ArrayBuffer to hex string
|
|
44
|
+
return Array.from(new Uint8Array(signature))
|
|
45
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
46
|
+
.join("");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Performs constant-time comparison of two strings
|
|
51
|
+
* Prevents timing attacks
|
|
52
|
+
* @param a - First string
|
|
53
|
+
* @param b - Second string
|
|
54
|
+
* @returns true if strings are equal
|
|
55
|
+
*/
|
|
56
|
+
function constant_time_compare(a: string, b: string): boolean {
|
|
57
|
+
if (a.length !== b.length) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
let result = 0;
|
|
62
|
+
for (let i = 0; i < a.length; i++) {
|
|
63
|
+
result |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return result === 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// section: main_functions
|
|
70
|
+
/**
|
|
71
|
+
* Creates a signed dev lock cookie value
|
|
72
|
+
* Cookie format: timestamp|expiry_timestamp|signature
|
|
73
|
+
* @param password - The dev lock password (used as signing key)
|
|
74
|
+
* @param expiry_days - Number of days until cookie expires (default: 7)
|
|
75
|
+
* @returns Cookie value and max_age in seconds
|
|
76
|
+
*/
|
|
77
|
+
export async function create_dev_lock_cookie(
|
|
78
|
+
password: string,
|
|
79
|
+
expiry_days: number = 7
|
|
80
|
+
): Promise<DevLockCookieData> {
|
|
81
|
+
const timestamp = Date.now();
|
|
82
|
+
const expiry_timestamp = timestamp + expiry_days * 24 * 60 * 60 * 1000;
|
|
83
|
+
const data = `${timestamp}${SEPARATOR}${expiry_timestamp}`;
|
|
84
|
+
const signature = await create_signature(data, password);
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
value: `${data}${SEPARATOR}${signature}`,
|
|
88
|
+
max_age: expiry_days * 24 * 60 * 60, // in seconds
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Validates dev lock cookie from request (Edge-compatible)
|
|
94
|
+
* Checks signature validity and expiration
|
|
95
|
+
* @param request - NextRequest object
|
|
96
|
+
* @returns Validation result with valid flag and optional expired flag
|
|
97
|
+
*/
|
|
98
|
+
export async function validate_dev_lock_cookie(
|
|
99
|
+
request: NextRequest
|
|
100
|
+
): Promise<DevLockValidationResult> {
|
|
101
|
+
const password = process.env.HAZO_AUTH_DEV_LOCK_PASSWORD;
|
|
102
|
+
|
|
103
|
+
if (!password) {
|
|
104
|
+
// No password set - cannot validate
|
|
105
|
+
return { valid: false };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const cookie = request.cookies.get(COOKIE_NAME)?.value;
|
|
109
|
+
|
|
110
|
+
if (!cookie) {
|
|
111
|
+
return { valid: false };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
const parts = cookie.split(SEPARATOR);
|
|
116
|
+
if (parts.length !== 3) {
|
|
117
|
+
return { valid: false };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const [timestamp_str, expiry_str, signature] = parts;
|
|
121
|
+
const timestamp = parseInt(timestamp_str, 10);
|
|
122
|
+
const expiry_timestamp = parseInt(expiry_str, 10);
|
|
123
|
+
|
|
124
|
+
if (isNaN(timestamp) || isNaN(expiry_timestamp)) {
|
|
125
|
+
return { valid: false };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Check expiry
|
|
129
|
+
if (Date.now() > expiry_timestamp) {
|
|
130
|
+
return { valid: false, expired: true };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Verify signature
|
|
134
|
+
const data = `${timestamp}${SEPARATOR}${expiry_timestamp}`;
|
|
135
|
+
const expected_signature = await create_signature(data, password);
|
|
136
|
+
|
|
137
|
+
// Constant-time comparison to prevent timing attacks
|
|
138
|
+
if (!constant_time_compare(signature, expected_signature)) {
|
|
139
|
+
return { valid: false };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return { valid: true };
|
|
143
|
+
} catch {
|
|
144
|
+
return { valid: false };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Validates password against environment variable (for unlock endpoint)
|
|
150
|
+
* Uses constant-time comparison to prevent timing attacks
|
|
151
|
+
* @param password - Password to validate
|
|
152
|
+
* @returns true if password matches
|
|
153
|
+
*/
|
|
154
|
+
export function validate_dev_lock_password(password: string): boolean {
|
|
155
|
+
const expected = process.env.HAZO_AUTH_DEV_LOCK_PASSWORD;
|
|
156
|
+
|
|
157
|
+
if (!expected || !password) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return constant_time_compare(password, expected);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Gets the dev lock cookie name
|
|
166
|
+
* Exported for use in API routes when setting the cookie
|
|
167
|
+
* @returns Cookie name string
|
|
168
|
+
*/
|
|
169
|
+
export function get_dev_lock_cookie_name(): string {
|
|
170
|
+
return COOKIE_NAME;
|
|
171
|
+
}
|