{"version":3,"file":"useActiveDirectory.mjs","sources":["../../../../src/lib/auth/active-directory/useActiveDirectory.ts"],"sourcesContent":["/**\n * Active Directory React Hook\n *\n * Provides a comprehensive React hook for AD authentication,\n * including login, logout, token management, and group membership.\n *\n * @module auth/active-directory/useActiveDirectory\n */\n\nimport { useContext, useCallback, useMemo } from 'react';\nimport { ADContext } from './ad-provider';\nimport type {\n  ADUser,\n  ADGroup,\n  ADTokens,\n  ADAuthError,\n  ADUserAttributes,\n  TokenAcquisitionRequest,\n  ADProviderType,\n} from './types';\nimport type { Role, Permission } from '../types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Return type for the useActiveDirectory hook.\n */\nexport interface UseActiveDirectoryReturn {\n  // State\n  /** Current authenticated AD user */\n  user: ADUser | null;\n  /** Whether user is authenticated */\n  isAuthenticated: boolean;\n  /** Whether authentication is in progress */\n  isAuthenticating: boolean;\n  /** Whether token refresh is in progress */\n  isRefreshing: boolean;\n  /** Current authentication error */\n  error: ADAuthError | null;\n  /** Current AD provider type */\n  provider: ADProviderType | null;\n  /** Current tokens (use with caution) */\n  tokens: ADTokens | null;\n  /** Whether an SSO session exists */\n  hasSsoSession: boolean;\n\n  // Actions\n  /** Initialize AD authentication */\n  initialize: () => Promise<void>;\n  /** Trigger interactive login */\n  login: (options?: TokenAcquisitionRequest) => Promise<void>;\n  /** Perform silent SSO login */\n  loginSilent: (options?: TokenAcquisitionRequest) => Promise<void>;\n  /** Logout and clear session */\n  logout: () => Promise<void>;\n  /** Acquire token for specific scopes */\n  acquireToken: (request: TokenAcquisitionRequest) => Promise<ADTokens>;\n  /** Refresh current tokens */\n  refreshTokens: () => Promise<void>;\n  /** Clear authentication error */\n  clearError: () => void;\n  /** Force re-authentication */\n  forceReauth: () => Promise<void>;\n\n  // Group & Permission Helpers\n  /** User's AD groups */\n  groups: ADGroup[];\n  /** Check if user belongs to a group */\n  isInGroup: (groupId: string) => boolean;\n  /** Check if user belongs to any of the groups */\n  isInAnyGroup: (groupIds: string[]) => boolean;\n  /** Check if user belongs to all groups */\n  isInAllGroups: (groupIds: string[]) => boolean;\n  /** Get user's mapped roles */\n  roles: Role[];\n  /** Check if user has a role */\n  hasRole: (role: Role) => boolean;\n  /** Check if user has any of the roles */\n  hasAnyRole: (roles: Role[]) => boolean;\n  /** Check if user has all roles */\n  hasAllRoles: (roles: Role[]) => boolean;\n  /** Get user's effective permissions */\n  permissions: Permission[];\n  /** Check if user has a permission */\n  hasPermission: (permission: Permission) => boolean;\n  /** Check if user has any of the permissions */\n  hasAnyPermission: (permissions: Permission[]) => boolean;\n  /** Check if user has all permissions */\n  hasAllPermissions: (permissions: Permission[]) => boolean;\n\n  // User Attribute Helpers\n  /** Get AD attribute value */\n  getAttribute: <K extends keyof ADUserAttributes>(key: K) => ADUserAttributes[K] | undefined;\n  /** Check if user has specific attribute value */\n  hasAttribute: (key: keyof ADUserAttributes, value: unknown) => boolean;\n  /** Get user's UPN */\n  upn: string | null;\n  /** Get user's display name */\n  displayName: string | null;\n  /** Get user's department */\n  department: string | null;\n  /** Get user's job title */\n  jobTitle: string | null;\n  /** Whether user is a guest/external user */\n  isGuest: boolean;\n}\n\n// =============================================================================\n// Hook Implementation\n// =============================================================================\n\n/**\n * React hook for Active Directory authentication.\n *\n * Provides comprehensive AD authentication functionality including\n * login/logout, token management, group membership checking, and\n * attribute access.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const {\n *     user,\n *     isAuthenticated,\n *     login,\n *     logout,\n *     isInGroup,\n *     hasPermission,\n *   } = useActiveDirectory();\n *\n *   if (!isAuthenticated) {\n *     return <button onClick={() => login()}>Sign in with Azure AD</button>;\n *   }\n *\n *   return (\n *     <div>\n *       <h1>Welcome, {user?.displayName}</h1>\n *       {isInGroup('sg-app-admins') && (\n *         <AdminPanel />\n *       )}\n *       {hasPermission('reports:view') && (\n *         <ReportsSection />\n *       )}\n *       <button onClick={logout}>Sign out</button>\n *     </div>\n *   );\n * }\n * ```\n *\n * @returns AD authentication state and methods\n * @throws Error if used outside of ADProvider\n */\nexport function useActiveDirectory(): UseActiveDirectoryReturn {\n  const context = useContext(ADContext);\n\n  if (!context) {\n    throw new Error('useActiveDirectory must be used within an ADProvider');\n  }\n\n  // ===========================================================================\n  // State Values\n  // ===========================================================================\n\n  const { user } = context;\n  const { isAuthenticated } = context;\n  const { isAuthenticating } = context;\n  const { isRefreshing } = context;\n  const { error } = context;\n  const { provider } = context;\n  const { tokens } = context;\n  const { hasSsoSession } = context;\n  const { initialize } = context;\n  const { login } = context;\n  const { loginSilent } = context;\n  const { logout } = context;\n  const { acquireToken } = context;\n  const { refreshTokens } = context;\n  const { clearError } = context;\n  const { forceReauth } = context;\n  const { isInGroup } = context;\n  const { hasAttribute } = context;\n  const { getMappedRoles } = context;\n  const { getEffectivePermissions } = context;\n\n  // ===========================================================================\n  // Group Helpers\n  // ===========================================================================\n\n  const groups = useMemo(() => user?.adGroups ?? [], [user]);\n\n  const isInAnyGroup = useCallback(\n    (groupIds: string[]) => {\n      if (!user) return false;\n      return groupIds.some((id) => isInGroup(id));\n    },\n    [user, isInGroup]\n  );\n\n  const isInAllGroups = useCallback(\n    (groupIds: string[]) => {\n      if (!user) return false;\n      return groupIds.every((id) => isInGroup(id));\n    },\n    [user, isInGroup]\n  );\n\n  // ===========================================================================\n  // Role Helpers\n  // ===========================================================================\n\n  const roles = useMemo(() => getMappedRoles(), [getMappedRoles]);\n\n  const hasRole = useCallback((role: Role) => roles.includes(role), [roles]);\n\n  const hasAnyRole = useCallback(\n    (checkRoles: Role[]) => checkRoles.some((role) => roles.includes(role)),\n    [roles]\n  );\n\n  const hasAllRoles = useCallback(\n    (checkRoles: Role[]) => checkRoles.every((role) => roles.includes(role)),\n    [roles]\n  );\n\n  // ===========================================================================\n  // Permission Helpers\n  // ===========================================================================\n\n  const permissions = useMemo(() => getEffectivePermissions(), [getEffectivePermissions]);\n\n  const hasPermission = useCallback(\n    (permission: Permission) => {\n      // Support wildcard permissions\n      if (permissions.includes('*')) return true;\n\n      // Check exact match\n      if (permissions.includes(permission)) return true;\n\n      // Check wildcard patterns (e.g., 'admin:*' matches 'admin:users')\n      const [category] = permission.split(':');\n      return permissions.includes(`${category}:*`);\n    },\n    [permissions]\n  );\n\n  const hasAnyPermission = useCallback(\n    (checkPermissions: Permission[]) => checkPermissions.some((p) => hasPermission(p)),\n    [hasPermission]\n  );\n\n  const hasAllPermissions = useCallback(\n    (checkPermissions: Permission[]) => checkPermissions.every((p) => hasPermission(p)),\n    [hasPermission]\n  );\n\n  // ===========================================================================\n  // Attribute Helpers\n  // ===========================================================================\n\n  const getAttribute = useCallback(\n    <K extends keyof ADUserAttributes>(key: K): ADUserAttributes[K] | undefined => {\n      return user?.adAttributes[key];\n    },\n    [user]\n  );\n\n  const hasAttributeValue = useCallback(\n    (key: keyof ADUserAttributes, value: unknown) => hasAttribute(key, value),\n    [hasAttribute]\n  );\n\n  const upn = useMemo(() => user?.adAttributes.upn ?? null, [user]);\n  const displayName = useMemo(\n    () => user?.adAttributes.displayName ?? user?.displayName ?? null,\n    [user]\n  );\n  const department = useMemo(() => user?.adAttributes.department ?? null, [user]);\n  const jobTitle = useMemo(() => user?.adAttributes.jobTitle ?? null, [user]);\n  const isGuest = useMemo(() => user?.isGuest ?? false, [user]);\n\n  // ===========================================================================\n  // Actions\n  // ===========================================================================\n\n  const handleRefreshTokens = useCallback(async () => {\n    const result = await refreshTokens();\n    if (!result.success && result.error) {\n      throw new Error(result.error.message ?? 'Token refresh failed');\n    }\n  }, [refreshTokens]);\n\n  // ===========================================================================\n  // Return Value\n  // ===========================================================================\n\n  return {\n    // State\n    user,\n    isAuthenticated,\n    isAuthenticating,\n    isRefreshing,\n    error,\n    provider,\n    tokens,\n    hasSsoSession,\n\n    // Actions\n    initialize,\n    login,\n    loginSilent,\n    logout,\n    acquireToken,\n    refreshTokens: handleRefreshTokens,\n    clearError,\n    forceReauth,\n\n    // Group helpers\n    groups,\n    isInGroup,\n    isInAnyGroup,\n    isInAllGroups,\n\n    // Role helpers\n    roles,\n    hasRole,\n    hasAnyRole,\n    hasAllRoles,\n\n    // Permission helpers\n    permissions,\n    hasPermission,\n    hasAnyPermission,\n    hasAllPermissions,\n\n    // Attribute helpers\n    getAttribute,\n    hasAttribute: hasAttributeValue,\n    upn,\n    displayName,\n    department,\n    jobTitle,\n    isGuest,\n  };\n}\n\n// =============================================================================\n// Specialized Hooks\n// =============================================================================\n\n/**\n * Hook for checking AD group memberships.\n *\n * @example\n * ```tsx\n * function AdminPanel() {\n *   const { isInGroup, isInAnyGroup, groups } = useADGroups();\n *\n *   if (!isInAnyGroup(['sg-app-admins', 'sg-app-superusers'])) {\n *     return <AccessDenied />;\n *   }\n *\n *   return <div>Admin content...</div>;\n * }\n * ```\n */\nexport function useADGroups(): {\n  groups: ADGroup[];\n  isInGroup: (groupId: string) => boolean;\n  isInAnyGroup: (groupIds: string[]) => boolean;\n  isInAllGroups: (groupIds: string[]) => boolean;\n} {\n  const { groups, isInGroup, isInAnyGroup, isInAllGroups } = useActiveDirectory();\n  return { groups, isInGroup, isInAnyGroup, isInAllGroups };\n}\n\n/**\n * Hook for checking AD-based roles.\n *\n * @example\n * ```tsx\n * function ManagerDashboard() {\n *   const { hasRole, hasAnyRole, roles } = useADRoles();\n *\n *   if (!hasAnyRole(['admin', 'manager'])) {\n *     return <AccessDenied />;\n *   }\n *\n *   return <div>Manager dashboard...</div>;\n * }\n * ```\n */\nexport function useADRoles(): {\n  roles: Role[];\n  hasRole: (role: Role) => boolean;\n  hasAnyRole: (roles: Role[]) => boolean;\n  hasAllRoles: (roles: Role[]) => boolean;\n} {\n  const { roles, hasRole, hasAnyRole, hasAllRoles } = useActiveDirectory();\n  return { roles, hasRole, hasAnyRole, hasAllRoles };\n}\n\n/**\n * Hook for checking AD-based permissions.\n *\n * @example\n * ```tsx\n * function ReportsPage() {\n *   const { hasPermission, hasAllPermissions } = useADPermissions();\n *\n *   const canViewReports = hasPermission('reports:view');\n *   const canExportReports = hasPermission('reports:export');\n *\n *   return (\n *     <div>\n *       {canViewReports && <ReportViewer />}\n *       {canExportReports && <ExportButton />}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useADPermissions(): {\n  permissions: Permission[];\n  hasPermission: (permission: Permission) => boolean;\n  hasAnyPermission: (permissions: Permission[]) => boolean;\n  hasAllPermissions: (permissions: Permission[]) => boolean;\n} {\n  const { permissions, hasPermission, hasAnyPermission, hasAllPermissions } = useActiveDirectory();\n  return { permissions, hasPermission, hasAnyPermission, hasAllPermissions };\n}\n\n/**\n * Hook for accessing AD user attributes.\n *\n * @example\n * ```tsx\n * function UserProfile() {\n *   const { getAttribute, upn, department, jobTitle } = useADAttributes();\n *\n *   const employeeId = getAttribute('employeeId');\n *\n *   return (\n *     <div>\n *       <p>UPN: {upn}</p>\n *       <p>Department: {department}</p>\n *       <p>Job Title: {jobTitle}</p>\n *       <p>Employee ID: {employeeId}</p>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useADAttributes(): {\n  attributes: ADUserAttributes | null;\n  getAttribute: <K extends keyof ADUserAttributes>(key: K) => ADUserAttributes[K] | undefined;\n  hasAttribute: (key: keyof ADUserAttributes, value: unknown) => boolean;\n  upn: string | null;\n  displayName: string | null;\n  department: string | null;\n  jobTitle: string | null;\n  isGuest: boolean;\n} {\n  const { user, getAttribute, hasAttribute, upn, displayName, department, jobTitle, isGuest } =\n    useActiveDirectory();\n\n  return {\n    attributes: user?.adAttributes ?? null,\n    getAttribute,\n    hasAttribute,\n    upn,\n    displayName,\n    department,\n    jobTitle,\n    isGuest,\n  };\n}\n\n/**\n * Hook for AD authentication actions only.\n *\n * @example\n * ```tsx\n * function LoginButton() {\n *   const { login, isAuthenticating, error } = useADAuth();\n *\n *   return (\n *     <button onClick={() => login()} disabled={isAuthenticating}>\n *       {isAuthenticating ? 'Signing in...' : 'Sign in'}\n *     </button>\n *   );\n * }\n * ```\n */\nexport function useADAuth(): {\n  isAuthenticated: boolean;\n  isAuthenticating: boolean;\n  error: ADAuthError | null;\n  initialize: () => Promise<void>;\n  login: (options?: TokenAcquisitionRequest) => Promise<void>;\n  loginSilent: (options?: TokenAcquisitionRequest) => Promise<void>;\n  logout: () => Promise<void>;\n  acquireToken: (request: TokenAcquisitionRequest) => Promise<ADTokens>;\n  refreshTokens: () => Promise<void>;\n  clearError: () => void;\n  forceReauth: () => Promise<void>;\n} {\n  const {\n    isAuthenticated,\n    isAuthenticating,\n    error,\n    initialize,\n    login,\n    loginSilent,\n    logout,\n    acquireToken,\n    refreshTokens,\n    clearError,\n    forceReauth,\n  } = useActiveDirectory();\n\n  return {\n    isAuthenticated,\n    isAuthenticating,\n    error,\n    initialize,\n    login,\n    loginSilent,\n    logout,\n    acquireToken,\n    refreshTokens,\n    clearError,\n    forceReauth,\n  };\n}\n\n/**\n * Hook for accessing raw AD tokens (use with caution).\n *\n * @example\n * ```tsx\n * function ApiClient() {\n *   const { accessToken, isExpired, refreshTokens } = useADTokens();\n *\n *   const makeApiCall = async () => {\n *     if (isExpired) {\n *       await refreshTokens();\n *     }\n *\n *     const response = await fetch('/api/data', {\n *       headers: { Authorization: `Bearer ${accessToken}` },\n *     });\n *     // ...\n *   };\n *\n *   return <button onClick={makeApiCall}>Load Data</button>;\n * }\n * ```\n */\nexport function useADTokens(): {\n  accessToken: string | null;\n  idToken: string | null;\n  expiresAt: number | null;\n  scopes: string[];\n  getIsExpired: () => boolean;\n  getTimeUntilExpiry: () => number;\n  isRefreshing: boolean;\n  refreshTokens: () => Promise<void>;\n} {\n  const { tokens, isRefreshing, refreshTokens } = useActiveDirectory();\n\n  const accessToken = tokens?.accessToken ?? null;\n  const idToken = tokens?.idToken ?? null;\n  const expiresAt = tokens?.expiresAt ?? null;\n  const scopes = tokens?.scopes ?? [];\n\n  // Return functions instead of values to avoid calling impure Date.now() during render\n  const getIsExpired = useCallback((): boolean => {\n    if (expiresAt == null || expiresAt === 0) return true;\n    return Date.now() >= expiresAt - 300000; // 5 minute buffer\n  }, [expiresAt]);\n\n  const getTimeUntilExpiry = useCallback((): number => {\n    if (expiresAt == null || expiresAt === 0) return 0;\n    return Math.max(0, expiresAt - Date.now());\n  }, [expiresAt]);\n\n  return {\n    accessToken,\n    idToken,\n    expiresAt,\n    scopes,\n    getIsExpired,\n    getTimeUntilExpiry,\n    isRefreshing,\n    refreshTokens,\n  };\n}\n"],"names":["useActiveDirectory","context","useContext","ADContext","user","isAuthenticated","isAuthenticating","isRefreshing","error","provider","tokens","hasSsoSession","initialize","login","loginSilent","logout","acquireToken","refreshTokens","clearError","forceReauth","isInGroup","hasAttribute","getMappedRoles","getEffectivePermissions","groups","useMemo","isInAnyGroup","useCallback","groupIds","id","isInAllGroups","roles","hasRole","role","hasAnyRole","checkRoles","hasAllRoles","permissions","hasPermission","permission","category","hasAnyPermission","checkPermissions","p","hasAllPermissions","getAttribute","key","hasAttributeValue","value","upn","displayName","department","jobTitle","isGuest","handleRefreshTokens","result","useADGroups","useADRoles","useADPermissions","useADAttributes","useADAuth","useADTokens","accessToken","idToken","expiresAt","scopes","getIsExpired","getTimeUntilExpiry"],"mappings":"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"}