hazo_auth 4.4.1 → 4.5.1

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 (94) hide show
  1. package/README.md +207 -5
  2. package/SETUP_CHECKLIST.md +1 -1
  3. package/cli-src/lib/auth/auth_types.ts +22 -0
  4. package/cli-src/lib/auth/hazo_get_auth.server.ts +25 -1
  5. package/cli-src/lib/auth/session_token_validator.edge.ts +1 -0
  6. package/cli-src/lib/config/default_config.ts +36 -0
  7. package/cli-src/lib/navbar_config.server.ts +129 -0
  8. package/cli-src/lib/scope_hierarchy_config.server.ts +3 -14
  9. package/cli-src/lib/services/registration_service.ts +12 -0
  10. package/cli-src/lib/services/scope_labels_service.ts +21 -21
  11. package/cli-src/lib/services/scope_service.ts +15 -11
  12. package/cli-src/lib/services/session_token_service.ts +1 -0
  13. package/cli-src/lib/ui_shell_config.server.ts +15 -0
  14. package/cli-src/lib/user_types_config.server.ts +178 -0
  15. package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -1
  16. package/dist/app/api/hazo_auth/me/route.js +17 -0
  17. package/dist/app/api/hazo_auth/org_management/orgs/route.d.ts +26 -0
  18. package/dist/app/api/hazo_auth/org_management/orgs/route.d.ts.map +1 -0
  19. package/dist/app/api/hazo_auth/org_management/orgs/route.js +315 -0
  20. package/dist/app/api/hazo_auth/user_management/users/route.d.ts +11 -1
  21. package/dist/app/api/hazo_auth/user_management/users/route.d.ts.map +1 -1
  22. package/dist/app/api/hazo_auth/user_management/users/route.js +121 -16
  23. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.d.ts.map +1 -1
  24. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.js +8 -14
  25. package/dist/components/layouts/rbac_test/index.d.ts +1 -3
  26. package/dist/components/layouts/rbac_test/index.d.ts.map +1 -1
  27. package/dist/components/layouts/rbac_test/index.js +2 -2
  28. package/dist/components/layouts/shared/components/auth_navbar.d.ts +26 -0
  29. package/dist/components/layouts/shared/components/auth_navbar.d.ts.map +1 -0
  30. package/dist/components/layouts/shared/components/auth_navbar.js +14 -0
  31. package/dist/components/layouts/shared/components/auth_page_shell.d.ts +3 -1
  32. package/dist/components/layouts/shared/components/auth_page_shell.d.ts.map +1 -1
  33. package/dist/components/layouts/shared/components/auth_page_shell.js +17 -2
  34. package/dist/components/layouts/shared/components/standalone_layout_wrapper.d.ts +6 -1
  35. package/dist/components/layouts/shared/components/standalone_layout_wrapper.d.ts.map +1 -1
  36. package/dist/components/layouts/shared/components/standalone_layout_wrapper.js +7 -2
  37. package/dist/components/layouts/shared/index.d.ts +2 -0
  38. package/dist/components/layouts/shared/index.d.ts.map +1 -1
  39. package/dist/components/layouts/shared/index.js +1 -0
  40. package/dist/components/layouts/user_management/components/scope_hierarchy_tab.d.ts +3 -2
  41. package/dist/components/layouts/user_management/components/scope_hierarchy_tab.d.ts.map +1 -1
  42. package/dist/components/layouts/user_management/components/scope_hierarchy_tab.js +45 -18
  43. package/dist/components/layouts/user_management/components/scope_labels_tab.d.ts +3 -2
  44. package/dist/components/layouts/user_management/components/scope_labels_tab.d.ts.map +1 -1
  45. package/dist/components/layouts/user_management/components/scope_labels_tab.js +48 -20
  46. package/dist/components/layouts/user_management/components/user_scopes_tab.d.ts.map +1 -1
  47. package/dist/components/layouts/user_management/components/user_scopes_tab.js +1 -1
  48. package/dist/components/layouts/user_management/index.d.ts +11 -3
  49. package/dist/components/layouts/user_management/index.d.ts.map +1 -1
  50. package/dist/components/layouts/user_management/index.js +52 -5
  51. package/dist/components/ui/user-type-badge.d.ts +23 -0
  52. package/dist/components/ui/user-type-badge.d.ts.map +1 -0
  53. package/dist/components/ui/user-type-badge.js +42 -0
  54. package/dist/lib/auth/auth_types.d.ts +17 -0
  55. package/dist/lib/auth/auth_types.d.ts.map +1 -1
  56. package/dist/lib/auth/auth_types.js +11 -0
  57. package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
  58. package/dist/lib/auth/hazo_get_auth.server.js +21 -1
  59. package/dist/lib/config/default_config.d.ts +60 -0
  60. package/dist/lib/config/default_config.d.ts.map +1 -1
  61. package/dist/lib/config/default_config.js +34 -0
  62. package/dist/lib/navbar_config.server.d.ts +36 -0
  63. package/dist/lib/navbar_config.server.d.ts.map +1 -0
  64. package/dist/lib/navbar_config.server.js +45 -0
  65. package/dist/lib/scope_hierarchy_config.server.d.ts +3 -7
  66. package/dist/lib/scope_hierarchy_config.server.d.ts.map +1 -1
  67. package/dist/lib/scope_hierarchy_config.server.js +1 -10
  68. package/dist/lib/services/registration_service.d.ts.map +1 -1
  69. package/dist/lib/services/registration_service.js +8 -0
  70. package/dist/lib/services/scope_labels_service.d.ts +7 -7
  71. package/dist/lib/services/scope_labels_service.d.ts.map +1 -1
  72. package/dist/lib/services/scope_labels_service.js +20 -20
  73. package/dist/lib/services/scope_service.d.ts +8 -5
  74. package/dist/lib/services/scope_service.d.ts.map +1 -1
  75. package/dist/lib/services/scope_service.js +9 -8
  76. package/dist/lib/ui_shell_config.server.d.ts +5 -0
  77. package/dist/lib/ui_shell_config.server.d.ts.map +1 -1
  78. package/dist/lib/ui_shell_config.server.js +5 -0
  79. package/dist/lib/user_types_config.server.d.ts +56 -0
  80. package/dist/lib/user_types_config.server.d.ts.map +1 -0
  81. package/dist/lib/user_types_config.server.js +100 -0
  82. package/dist/server/routes/index.d.ts +1 -0
  83. package/dist/server/routes/index.d.ts.map +1 -1
  84. package/dist/server/routes/index.js +2 -0
  85. package/dist/server/routes/org_management_orgs.d.ts +2 -0
  86. package/dist/server/routes/org_management_orgs.d.ts.map +1 -0
  87. package/dist/server/routes/org_management_orgs.js +2 -0
  88. package/hazo_auth_config.example.ini +9 -0
  89. package/package.json +1 -1
  90. package/cli-src/server/logging/logger_service.ts +0 -56
  91. /package/public/profile_pictures/library/Cars/{050 - citroe/314/210n_c3.jpeg" → 050 - citro/303/253n_c3.jpeg"} +0 -0
  92. /package/public/profile_pictures/library/Cars/{064 - lamborghini_huraca/314/201n.jpeg" → 064 - lamborghini_hurac/303/241n.jpeg"} +0 -0
  93. /package/public/profile_pictures/library/Cars/{099 - citroe/314/210n_2cv_(classic).jpeg" → 099 - citro/303/253n_2cv_(classic).jpeg"} +0 -0
  94. /package/public/profile_pictures/library/Cars/{131 - lamborghini_huraca/314/201n_sto.jpeg" → 131 - lamborghini_hurac/303/241n_sto.jpeg"} +0 -0
@@ -0,0 +1,100 @@
1
+ // file_description: server-only helper to read user types configuration from hazo_auth_config.ini
2
+ // section: imports
3
+ import { get_config_value, get_config_boolean, read_config_section, } from "./config/config_loader.server";
4
+ import { DEFAULT_USER_TYPES } from "./config/default_config";
5
+ // section: constants
6
+ const SECTION_NAME = "hazo_auth__user_types";
7
+ const PRESET_COLORS = new Set([
8
+ "blue",
9
+ "green",
10
+ "red",
11
+ "yellow",
12
+ "purple",
13
+ "gray",
14
+ "orange",
15
+ "pink",
16
+ ]);
17
+ // section: helpers
18
+ /**
19
+ * Parses a user type definition string
20
+ * Format: key:label:color (e.g., "admin:Administrator:red" or "custom:Custom Type:#4CAF50")
21
+ * @param value - The config value string
22
+ * @returns UserTypeDefinition or null if invalid
23
+ */
24
+ function parse_user_type_definition(value) {
25
+ const parts = value.split(":").map((s) => s.trim());
26
+ if (parts.length < 2)
27
+ return null;
28
+ const key = parts[0];
29
+ const label = parts[1];
30
+ const badge_color = parts[2] || "gray";
31
+ if (!key || !label)
32
+ return null;
33
+ return {
34
+ key,
35
+ label,
36
+ badge_color,
37
+ is_preset_color: PRESET_COLORS.has(badge_color),
38
+ };
39
+ }
40
+ /**
41
+ * Reads user types configuration from hazo_auth_config.ini file
42
+ * Falls back to defaults if config file is not found or section is missing
43
+ * @returns User types configuration options
44
+ */
45
+ export function get_user_types_config() {
46
+ const enable_user_types = get_config_boolean(SECTION_NAME, "enable_user_types", DEFAULT_USER_TYPES.enable_user_types);
47
+ const default_user_type = get_config_value(SECTION_NAME, "default_user_type", DEFAULT_USER_TYPES.default_user_type);
48
+ // Parse user type definitions from config
49
+ const user_types = new Map();
50
+ const section = read_config_section(SECTION_NAME);
51
+ if (section) {
52
+ // Look for user_type_1, user_type_2, etc. (up to 50 types supported)
53
+ for (let i = 1; i <= 50; i++) {
54
+ const key = `user_type_${i}`;
55
+ const value = section[key];
56
+ if (!value)
57
+ continue;
58
+ const type_def = parse_user_type_definition(value);
59
+ if (type_def) {
60
+ user_types.set(type_def.key, type_def);
61
+ }
62
+ }
63
+ }
64
+ return {
65
+ enable_user_types,
66
+ default_user_type,
67
+ user_types,
68
+ };
69
+ }
70
+ /**
71
+ * Checks if user types feature is enabled in the configuration
72
+ * Convenience function for quick checks
73
+ */
74
+ export function is_user_types_enabled() {
75
+ return get_config_boolean(SECTION_NAME, "enable_user_types", DEFAULT_USER_TYPES.enable_user_types);
76
+ }
77
+ /**
78
+ * Gets the default user type from config
79
+ * Returns empty string if not configured
80
+ */
81
+ export function get_default_user_type() {
82
+ return get_config_value(SECTION_NAME, "default_user_type", DEFAULT_USER_TYPES.default_user_type);
83
+ }
84
+ /**
85
+ * Gets user type definition by key
86
+ * @param type_key - The user type key
87
+ * @returns UserTypeDefinition or undefined if not found
88
+ */
89
+ export function get_user_type_by_key(type_key) {
90
+ const config = get_user_types_config();
91
+ return config.user_types.get(type_key);
92
+ }
93
+ /**
94
+ * Gets all user type definitions as array (for UI dropdowns)
95
+ * @returns Array of UserTypeDefinition objects
96
+ */
97
+ export function get_all_user_types() {
98
+ const config = get_user_types_config();
99
+ return Array.from(config.user_types.values());
100
+ }
@@ -20,4 +20,5 @@ export { GET as userManagementUsersGET, PATCH as userManagementUsersPATCH, POST
20
20
  export { GET as userManagementPermissionsGET, POST as userManagementPermissionsPOST, PUT as userManagementPermissionsPUT, DELETE as userManagementPermissionsDELETE } from "./user_management_permissions.js";
21
21
  export { GET as userManagementRolesGET, POST as userManagementRolesPOST, PUT as userManagementRolesPUT } from "./user_management_roles.js";
22
22
  export { GET as userManagementUsersRolesGET, POST as userManagementUsersRolesPOST, PUT as userManagementUsersRolesPUT } from "./user_management_users_roles.js";
23
+ export { GET as orgManagementOrgsGET, POST as orgManagementOrgsPOST, PATCH as orgManagementOrgsPATCH, DELETE as orgManagementOrgsDELETE } from "./org_management_orgs.js";
23
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,GAAG,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,GAAG,IAAI,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGzE,OAAO,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,IAAI,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,MAAM,IAAI,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,GAAG,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,GAAG,IAAI,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAGjF,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,IAAI,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,GAAG,IAAI,sBAAsB,EAAE,KAAK,IAAI,wBAAwB,EAAE,IAAI,IAAI,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC/I,OAAO,EAAE,GAAG,IAAI,4BAA4B,EAAE,IAAI,IAAI,6BAA6B,EAAE,GAAG,IAAI,4BAA4B,EAAE,MAAM,IAAI,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAC9M,OAAO,EAAE,GAAG,IAAI,sBAAsB,EAAE,IAAI,IAAI,uBAAuB,EAAE,GAAG,IAAI,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAC3I,OAAO,EAAE,GAAG,IAAI,2BAA2B,EAAE,IAAI,IAAI,4BAA4B,EAAE,GAAG,IAAI,2BAA2B,EAAE,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/routes/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,GAAG,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,GAAG,IAAI,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGzE,OAAO,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,IAAI,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAG1E,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,IAAI,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,MAAM,IAAI,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,GAAG,IAAI,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,GAAG,IAAI,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAGjF,OAAO,EAAE,IAAI,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,IAAI,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,GAAG,IAAI,sBAAsB,EAAE,KAAK,IAAI,wBAAwB,EAAE,IAAI,IAAI,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC/I,OAAO,EAAE,GAAG,IAAI,4BAA4B,EAAE,IAAI,IAAI,6BAA6B,EAAE,GAAG,IAAI,4BAA4B,EAAE,MAAM,IAAI,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAC9M,OAAO,EAAE,GAAG,IAAI,sBAAsB,EAAE,IAAI,IAAI,uBAAuB,EAAE,GAAG,IAAI,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAC3I,OAAO,EAAE,GAAG,IAAI,2BAA2B,EAAE,IAAI,IAAI,4BAA4B,EAAE,GAAG,IAAI,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAGhK,OAAO,EAAE,GAAG,IAAI,oBAAoB,EAAE,IAAI,IAAI,qBAAqB,EAAE,KAAK,IAAI,sBAAsB,EAAE,MAAM,IAAI,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -28,3 +28,5 @@ export { GET as userManagementUsersGET, PATCH as userManagementUsersPATCH, POST
28
28
  export { GET as userManagementPermissionsGET, POST as userManagementPermissionsPOST, PUT as userManagementPermissionsPUT, DELETE as userManagementPermissionsDELETE } from "./user_management_permissions.js";
29
29
  export { GET as userManagementRolesGET, POST as userManagementRolesPOST, PUT as userManagementRolesPUT } from "./user_management_roles.js";
30
30
  export { GET as userManagementUsersRolesGET, POST as userManagementUsersRolesPOST, PUT as userManagementUsersRolesPUT } from "./user_management_users_roles.js";
31
+ // Organization management routes
32
+ export { GET as orgManagementOrgsGET, POST as orgManagementOrgsPOST, PATCH as orgManagementOrgsPATCH, DELETE as orgManagementOrgsDELETE } from "./org_management_orgs.js";
@@ -0,0 +1,2 @@
1
+ export { GET, POST, PATCH, DELETE } from "../../app/api/hazo_auth/org_management/orgs/route";
2
+ //# sourceMappingURL=org_management_orgs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org_management_orgs.d.ts","sourceRoot":"","sources":["../../../src/server/routes/org_management_orgs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mDAAmD,CAAC"}
@@ -0,0 +1,2 @@
1
+ // file_description: re-export org management orgs route handlers for use by consuming projects
2
+ export { GET, POST, PATCH, DELETE } from "../../app/api/hazo_auth/org_management/orgs/route";
@@ -561,6 +561,15 @@ application_permission_list_defaults = admin_user_management,admin_role_manageme
561
561
  # When enabled, users can be assigned to organizations and hazo_get_auth returns org info
562
562
  # enable_multi_tenancy = false
563
563
 
564
+ # NOTE: When multi-tenancy is enabled, org_id is OPTIONAL by default.
565
+ # Users without org_id will have null org fields in hazo_get_auth result.
566
+ #
567
+ # To REQUIRE org assignment for specific API routes, use:
568
+ # hazo_get_auth(request, { require_org: true })
569
+ #
570
+ # This will throw OrgRequiredError if the user has no org_id assigned.
571
+ # Consuming apps should catch this error and return an appropriate response.
572
+
564
573
  # Organization cache TTL in minutes (default: 15)
565
574
  # Cached org data will be refreshed after this time
566
575
  # org_cache_ttl_minutes = 15
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hazo_auth",
3
- "version": "4.4.1",
3
+ "version": "4.5.1",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -1,56 +0,0 @@
1
- // file_description: expose the logging facade used across the hazo_auth backend
2
- // section: imports
3
- import type { logger_method, logger_service } from "../types/app_types";
4
-
5
- // section: helper_functions
6
- const create_console_logger = (namespace: string): logger_service => {
7
- const write = (level: string, message: string, data?: Record<string, unknown>) => {
8
- const timestamp = new Date().toISOString();
9
- // eslint-disable-next-line no-console
10
- console.log(
11
- JSON.stringify({
12
- namespace,
13
- level,
14
- message,
15
- data,
16
- timestamp,
17
- })
18
- );
19
- };
20
-
21
- return {
22
- debug: (message, data) => write("debug", message, data),
23
- info: (message, data) => write("info", message, data),
24
- warn: (message, data) => write("warn", message, data),
25
- error: (message, data) => write("error", message, data),
26
- };
27
- };
28
-
29
- // section: factory
30
- export const create_logger_service = (
31
- namespace: string,
32
- external_logger?: Partial<logger_service>
33
- ): logger_service => {
34
- const console_logger = create_console_logger(namespace);
35
-
36
- const safe_bind = (
37
- level: keyof logger_service,
38
- fallback: logger_method
39
- ): logger_method => {
40
- const candidate = external_logger?.[level];
41
- if (typeof candidate === "function") {
42
- return (message, data) => candidate(message, data);
43
- }
44
- return fallback;
45
- };
46
-
47
- type logger_method = (message: string, data?: Record<string, unknown>) => void;
48
-
49
- return {
50
- debug: safe_bind("debug", console_logger.debug),
51
- info: safe_bind("info", console_logger.info),
52
- warn: safe_bind("warn", console_logger.warn),
53
- error: safe_bind("error", console_logger.error),
54
- };
55
- };
56
-