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.
Files changed (136) hide show
  1. package/bin/hazo_auth.mjs +35 -0
  2. package/cli-src/assets/images/forgot_password_default.jpg +0 -0
  3. package/cli-src/assets/images/login_default.jpg +0 -0
  4. package/cli-src/assets/images/register_default.jpg +0 -0
  5. package/cli-src/assets/images/reset_password_default.jpg +0 -0
  6. package/cli-src/assets/images/verify_email_default.jpg +0 -0
  7. package/cli-src/cli/generate.ts +276 -0
  8. package/cli-src/cli/index.ts +207 -0
  9. package/cli-src/cli/init.ts +254 -0
  10. package/cli-src/cli/init_users.ts +376 -0
  11. package/cli-src/cli/validate.ts +581 -0
  12. package/cli-src/lib/already_logged_in_config.server.ts +46 -0
  13. package/cli-src/lib/app_logger.ts +24 -0
  14. package/cli-src/lib/auth/auth_cache.ts +220 -0
  15. package/cli-src/lib/auth/auth_rate_limiter.ts +121 -0
  16. package/cli-src/lib/auth/auth_types.ts +117 -0
  17. package/cli-src/lib/auth/auth_utils.server.ts +196 -0
  18. package/cli-src/lib/auth/dev_lock_validator.edge.ts +171 -0
  19. package/cli-src/lib/auth/hazo_get_auth.server.ts +583 -0
  20. package/cli-src/lib/auth/index.ts +23 -0
  21. package/cli-src/lib/auth/nextauth_config.ts +227 -0
  22. package/cli-src/lib/auth/org_cache.ts +148 -0
  23. package/cli-src/lib/auth/scope_cache.ts +233 -0
  24. package/cli-src/lib/auth/server_auth.ts +88 -0
  25. package/cli-src/lib/auth/session_token_validator.edge.ts +92 -0
  26. package/cli-src/lib/auth_utility_config.server.ts +136 -0
  27. package/cli-src/lib/config/config_loader.server.ts +164 -0
  28. package/cli-src/lib/config/default_config.ts +243 -0
  29. package/cli-src/lib/dev_lock_config.server.ts +148 -0
  30. package/cli-src/lib/email_verification_config.server.ts +63 -0
  31. package/cli-src/lib/file_types_config.server.ts +25 -0
  32. package/cli-src/lib/forgot_password_config.server.ts +63 -0
  33. package/cli-src/lib/hazo_connect_instance.server.ts +101 -0
  34. package/cli-src/lib/hazo_connect_setup.server.ts +194 -0
  35. package/cli-src/lib/hazo_connect_setup.ts +54 -0
  36. package/cli-src/lib/index.ts +46 -0
  37. package/cli-src/lib/login_config.server.ts +106 -0
  38. package/cli-src/lib/messages_config.server.ts +45 -0
  39. package/cli-src/lib/migrations/apply_migration.ts +105 -0
  40. package/cli-src/lib/multi_tenancy_config.server.ts +94 -0
  41. package/cli-src/lib/my_settings_config.server.ts +135 -0
  42. package/cli-src/lib/oauth_config.server.ts +87 -0
  43. package/cli-src/lib/password_requirements_config.server.ts +40 -0
  44. package/cli-src/lib/profile_pic_menu_config.server.ts +138 -0
  45. package/cli-src/lib/profile_picture_config.server.ts +56 -0
  46. package/cli-src/lib/register_config.server.ts +101 -0
  47. package/cli-src/lib/reset_password_config.server.ts +103 -0
  48. package/cli-src/lib/scope_hierarchy_config.server.ts +151 -0
  49. package/cli-src/lib/services/email_service.ts +587 -0
  50. package/cli-src/lib/services/email_verification_service.ts +270 -0
  51. package/cli-src/lib/services/index.ts +16 -0
  52. package/cli-src/lib/services/login_service.ts +150 -0
  53. package/cli-src/lib/services/oauth_service.ts +494 -0
  54. package/cli-src/lib/services/org_service.ts +965 -0
  55. package/cli-src/lib/services/password_change_service.ts +154 -0
  56. package/cli-src/lib/services/password_reset_service.ts +418 -0
  57. package/cli-src/lib/services/profile_picture_remove_service.ts +120 -0
  58. package/cli-src/lib/services/profile_picture_service.ts +451 -0
  59. package/cli-src/lib/services/profile_picture_source_mapper.ts +62 -0
  60. package/cli-src/lib/services/registration_service.ts +185 -0
  61. package/cli-src/lib/services/scope_labels_service.ts +348 -0
  62. package/cli-src/lib/services/scope_service.ts +778 -0
  63. package/cli-src/lib/services/session_token_service.ts +178 -0
  64. package/cli-src/lib/services/token_service.ts +240 -0
  65. package/cli-src/lib/services/user_profiles_cache.ts +189 -0
  66. package/cli-src/lib/services/user_profiles_service.ts +264 -0
  67. package/cli-src/lib/services/user_scope_service.ts +554 -0
  68. package/cli-src/lib/services/user_update_service.ts +141 -0
  69. package/cli-src/lib/ui_shell_config.server.ts +73 -0
  70. package/cli-src/lib/ui_sizes_config.server.ts +37 -0
  71. package/cli-src/lib/user_fields_config.server.ts +31 -0
  72. package/cli-src/lib/user_management_config.server.ts +39 -0
  73. package/cli-src/lib/user_profiles_config.server.ts +55 -0
  74. package/cli-src/lib/utils/api_route_helpers.ts +60 -0
  75. package/cli-src/lib/utils/error_sanitizer.ts +75 -0
  76. package/cli-src/lib/utils/password_validator.ts +65 -0
  77. package/cli-src/lib/utils.ts +11 -0
  78. package/cli-src/server/logging/logger_service.ts +56 -0
  79. package/cli-src/server/types/app_types.ts +74 -0
  80. package/cli-src/server/types/express.d.ts +16 -0
  81. package/dist/cli/index.js +18 -0
  82. package/dist/cli/init_users.d.ts +17 -0
  83. package/dist/cli/init_users.d.ts.map +1 -0
  84. package/dist/cli/init_users.js +307 -0
  85. package/dist/components/layouts/dev_lock/index.d.ts +29 -0
  86. package/dist/components/layouts/dev_lock/index.d.ts.map +1 -0
  87. package/dist/components/layouts/dev_lock/index.js +60 -0
  88. package/dist/components/layouts/index.d.ts +2 -0
  89. package/dist/components/layouts/index.d.ts.map +1 -1
  90. package/dist/components/layouts/index.js +1 -0
  91. package/dist/components/layouts/org_management/index.d.ts +26 -0
  92. package/dist/components/layouts/org_management/index.d.ts.map +1 -0
  93. package/dist/components/layouts/org_management/index.js +75 -0
  94. package/dist/components/layouts/shared/config/layout_customization.d.ts +2 -7
  95. package/dist/components/layouts/shared/config/layout_customization.d.ts.map +1 -1
  96. package/dist/components/layouts/user_management/components/org_hierarchy_tab.d.ts +13 -0
  97. package/dist/components/layouts/user_management/components/org_hierarchy_tab.d.ts.map +1 -0
  98. package/dist/components/layouts/user_management/components/org_hierarchy_tab.js +276 -0
  99. package/dist/components/layouts/user_management/index.d.ts +3 -1
  100. package/dist/components/layouts/user_management/index.d.ts.map +1 -1
  101. package/dist/components/layouts/user_management/index.js +10 -4
  102. package/dist/lib/auth/auth_types.d.ts +6 -0
  103. package/dist/lib/auth/auth_types.d.ts.map +1 -1
  104. package/dist/lib/auth/dev_lock_validator.edge.d.ts +38 -0
  105. package/dist/lib/auth/dev_lock_validator.edge.d.ts.map +1 -0
  106. package/dist/lib/auth/dev_lock_validator.edge.js +122 -0
  107. package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
  108. package/dist/lib/auth/hazo_get_auth.server.js +61 -1
  109. package/dist/lib/auth/org_cache.d.ts +65 -0
  110. package/dist/lib/auth/org_cache.d.ts.map +1 -0
  111. package/dist/lib/auth/org_cache.js +103 -0
  112. package/dist/lib/config/default_config.d.ts +76 -0
  113. package/dist/lib/config/default_config.d.ts.map +1 -1
  114. package/dist/lib/config/default_config.js +42 -0
  115. package/dist/lib/dev_lock_config.server.d.ts +41 -0
  116. package/dist/lib/dev_lock_config.server.d.ts.map +1 -0
  117. package/dist/lib/dev_lock_config.server.js +50 -0
  118. package/dist/lib/multi_tenancy_config.server.d.ts +30 -0
  119. package/dist/lib/multi_tenancy_config.server.d.ts.map +1 -0
  120. package/dist/lib/multi_tenancy_config.server.js +41 -0
  121. package/dist/lib/services/org_service.d.ts +191 -0
  122. package/dist/lib/services/org_service.d.ts.map +1 -0
  123. package/dist/lib/services/org_service.js +746 -0
  124. package/dist/lib/utils/password_validator.d.ts +7 -1
  125. package/dist/lib/utils/password_validator.d.ts.map +1 -1
  126. package/dist/page_components/dev_lock.d.ts +11 -0
  127. package/dist/page_components/dev_lock.d.ts.map +1 -0
  128. package/dist/page_components/dev_lock.js +17 -0
  129. package/dist/page_components/index.d.ts +1 -0
  130. package/dist/page_components/index.d.ts.map +1 -1
  131. package/dist/page_components/index.js +1 -0
  132. package/dist/page_components/org_management.d.ts +27 -0
  133. package/dist/page_components/org_management.d.ts.map +1 -0
  134. package/dist/page_components/org_management.js +18 -0
  135. package/hazo_auth_config.example.ini +30 -0
  136. 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
+ }