{"version":3,"file":"useSecurityContext.mjs","sources":["../../../../src/lib/security/hooks/useSecurityContext.ts"],"sourcesContent":["/**\n * @fileoverview useSecurityContext Hook\n * @module @/lib/security/hooks/useSecurityContext\n *\n * React hook for accessing the global security context.\n * Provides access to security state, configuration, and actions.\n *\n * @author Harbor Security Team\n * @version 1.0.0\n */\n\nimport { useContext, useCallback, useMemo } from 'react';\nimport type { SecurityContextValue, SecurityViolation, SecurityConfiguration } from '../types';\nimport { SecurityContext } from '../../contexts/SecurityContext';\n\n/**\n * Hook for accessing the security context\n *\n * Provides access to security state, CSP nonces, CSRF tokens,\n * violation reporting, and security configuration.\n *\n * @returns Security context value\n * @throws Error if used outside SecurityProvider\n *\n * @example\n * ```tsx\n * function SecureComponent() {\n *   const {\n *     cspNonce,\n *     csrfToken,\n *     isInitialized,\n *     violations,\n *     reportViolation,\n *   } = useSecurityContext();\n *\n *   if (!isInitialized) {\n *     return <Loading />;\n *   }\n *\n *   return (\n *     <div>\n *       <p>Security violations: {violations.length}</p>\n *       <script nonce={cspNonce}>\n *         // inline script\n *       </script>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useSecurityContext(): SecurityContextValue {\n  const context = useContext(SecurityContext);\n\n  if (!context) {\n    throw new Error(\n      'useSecurityContext must be used within a SecurityProvider. ' +\n        'Ensure your component is wrapped with <SecurityProvider>.'\n    );\n  }\n\n  return context as unknown as SecurityContextValue;\n}\n\n/**\n * Hook for security state only (no actions)\n *\n * Useful when you only need to read security state.\n *\n * @example\n * ```tsx\n * function SecurityStatus() {\n *   const { isInitialized, violations } = useSecurityState();\n *\n *   return (\n *     <div>\n *       Status: {isInitialized ? 'Ready' : 'Initializing'}\n *       Violations: {violations.length}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useSecurityState(): {\n  cspNonce: string;\n  csrfToken: string;\n  isInitialized: boolean;\n  secureStorageAvailable: boolean;\n  violations: readonly SecurityViolation[];\n  lastEventAt: number;\n} {\n  const context = useSecurityContext();\n\n  return useMemo(\n    () => ({\n      cspNonce: context.cspNonce,\n      csrfToken: context.csrfToken,\n      isInitialized: context.isInitialized,\n      secureStorageAvailable: context.secureStorageAvailable,\n      violations: context.violations,\n      lastEventAt: context.lastEventAt,\n    }),\n    [\n      context.cspNonce,\n      context.csrfToken,\n      context.isInitialized,\n      context.secureStorageAvailable,\n      context.violations,\n      context.lastEventAt,\n    ]\n  );\n}\n\n/**\n * Hook for security actions only\n *\n * Useful when you only need security actions without state.\n *\n * @example\n * ```tsx\n * function SecurityControls() {\n *   const {\n *     regenerateNonce,\n *     regenerateCsrfToken,\n *     clearViolations,\n *   } = useSecurityActions();\n *\n *   return (\n *     <div>\n *       <button onClick={regenerateNonce}>Regenerate Nonce</button>\n *       <button onClick={() => regenerateCsrfToken()}>\n *         Regenerate CSRF Token\n *       </button>\n *       <button onClick={clearViolations}>Clear Violations</button>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useSecurityActions(): {\n  regenerateNonce: () => string;\n  regenerateCsrfToken: () => Promise<string>;\n  reportViolation: (violation: Omit<SecurityViolation, 'id' | 'timestamp'>) => void;\n  clearViolations: () => void;\n  updateConfig: (partial: Partial<SecurityConfiguration>) => void;\n} {\n  const context = useSecurityContext();\n\n  return useMemo(\n    () => ({\n      regenerateNonce: context.regenerateNonce,\n      regenerateCsrfToken: context.regenerateCsrfToken,\n      reportViolation: context.reportViolation,\n      clearViolations: context.clearViolations,\n      updateConfig: context.updateConfig,\n    }),\n    [\n      context.regenerateNonce,\n      context.regenerateCsrfToken,\n      context.reportViolation,\n      context.clearViolations,\n      context.updateConfig,\n    ]\n  );\n}\n\n/**\n * Hook for security configuration\n *\n * @example\n * ```tsx\n * function SecuritySettings() {\n *   const config = useSecurityConfig();\n *\n *   return (\n *     <pre>{JSON.stringify(config, null, 2)}</pre>\n *   );\n * }\n * ```\n */\nexport function useSecurityConfig(): SecurityConfiguration {\n  const context = useSecurityContext();\n  return context.config;\n}\n\n/**\n * Hook for violation reporting\n *\n * @example\n * ```tsx\n * function SecureInput() {\n *   const reportViolation = useViolationReporter();\n *\n *   const handleSuspiciousInput = (input: string) => {\n *     reportViolation({\n *       type: 'xss',\n *       details: `Suspicious input detected: ${input.slice(0, 50)}`,\n *       severity: 'medium',\n *       blocked: true,\n *     });\n *   };\n *\n *   // ...\n * }\n * ```\n */\nexport function useViolationReporter(): (\n  violation: Omit<SecurityViolation, 'id' | 'timestamp'>\n) => void {\n  const context = useSecurityContext();\n  return context.reportViolation;\n}\n\n/**\n * Hook for monitoring violations\n *\n * @example\n * ```tsx\n * function ViolationMonitor() {\n *   const { violations, hasViolations, criticalCount } = useViolations();\n *\n *   useEffect(() => {\n *     if (criticalCount > 0) {\n *       notifySecurityTeam(violations);\n *     }\n *   }, [criticalCount, violations]);\n *\n *   return (\n *     <div>\n *       {hasViolations && (\n *         <Alert severity=\"warning\">\n *           {violations.length} security violations detected\n *         </Alert>\n *       )}\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useViolations(): {\n  violations: readonly SecurityViolation[];\n  hasViolations: boolean;\n  criticalCount: number;\n  highCount: number;\n  clearViolations: () => void;\n} {\n  const context = useSecurityContext();\n\n  const criticalCount = useMemo(\n    () => context.violations.filter((v) => v.severity === 'critical').length,\n    [context.violations]\n  );\n\n  const highCount = useMemo(\n    () => context.violations.filter((v) => v.severity === 'high').length,\n    [context.violations]\n  );\n\n  return {\n    violations: context.violations,\n    hasViolations: context.violations.length > 0,\n    criticalCount,\n    highCount,\n    clearViolations: context.clearViolations,\n  };\n}\n\n/**\n * Hook for security initialization status\n *\n * @example\n * ```tsx\n * function App() {\n *   const { isReady, isSecureStorageAvailable } = useSecurityStatus();\n *\n *   if (!isReady) {\n *     return <SplashScreen />;\n *   }\n *\n *   return <MainApp />;\n * }\n * ```\n */\nexport function useSecurityStatus(): {\n  isReady: boolean;\n  isSecureStorageAvailable: boolean;\n} {\n  const context = useSecurityContext();\n\n  return {\n    isReady: context.isInitialized,\n    isSecureStorageAvailable: context.secureStorageAvailable,\n  };\n}\n\n/**\n * Hook that waits for security initialization\n *\n * Returns null until security is initialized, then returns the context.\n * Useful for conditional rendering.\n *\n * @example\n * ```tsx\n * function SecureFeature() {\n *   const security = useSecurityReady();\n *\n *   if (!security) {\n *     return <Loading message=\"Initializing security...\" />;\n *   }\n *\n *   return <SecureContent nonce={security.cspNonce} />;\n * }\n * ```\n */\nexport function useSecurityReady(): SecurityContextValue | null {\n  const context = useSecurityContext();\n\n  if (!context.isInitialized) {\n    return null;\n  }\n\n  return context;\n}\n\n/**\n * Hook for creating secure event handlers\n *\n * Wraps event handlers with security checks.\n *\n * @example\n * ```tsx\n * function SecureForm() {\n *   const createSecureHandler = useSecureHandler();\n *\n *   const handleSubmit = createSecureHandler(async (data: FormData) => {\n *     await submitForm(data);\n *   });\n *\n *   return <form onSubmit={handleSubmit}>...</form>;\n * }\n * ```\n */\nexport function useSecureHandler(): <T extends (...args: unknown[]) => unknown>(\n  handler: T,\n  options?: {\n    validateCsrf?: boolean;\n    reportOnError?: boolean;\n  }\n) => T {\n  const { csrfToken, reportViolation } = useSecurityContext();\n\n  return useCallback(\n    <T extends (...args: unknown[]) => unknown>(\n      handler: T,\n      options: {\n        validateCsrf?: boolean;\n        reportOnError?: boolean;\n      } = {}\n    ): T => {\n      const { validateCsrf = false, reportOnError = true } = options;\n\n      return ((...args: unknown[]) => {\n        try {\n          // CSRF validation would typically be done server-side,\n          // but we can check if the token is available\n          if (validateCsrf && !csrfToken) {\n            throw new Error('CSRF token not available');\n          }\n\n          return handler(...args);\n        } catch (error) {\n          if (reportOnError) {\n            reportViolation({\n              type: 'other',\n              details: error instanceof Error ? error.message : 'Unknown error in secure handler',\n              severity: 'medium',\n              blocked: true,\n            });\n          }\n          throw error;\n        }\n      }) as T;\n    },\n    [csrfToken, reportViolation]\n  );\n}\n"],"names":["useSecurityContext","context","useContext","SecurityContext","useSecurityState","useMemo","useSecurityActions","useSecurityConfig","useViolationReporter","useViolations","criticalCount","v","highCount","useSecurityStatus","useSecurityReady","useSecureHandler","csrfToken","reportViolation","useCallback","handler","options","validateCsrf","reportOnError","args","error"],"mappings":";;AAkDO,SAASA,IAA2C;AACzD,QAAMC,IAAUC,EAAWC,CAAe;AAE1C,MAAI,CAACF;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAKJ,SAAOA;AACT;AAqBO,SAASG,IAOd;AACA,QAAMH,IAAUD,EAAA;AAEhB,SAAOK;AAAA,IACL,OAAO;AAAA,MACL,UAAUJ,EAAQ;AAAA,MAClB,WAAWA,EAAQ;AAAA,MACnB,eAAeA,EAAQ;AAAA,MACvB,wBAAwBA,EAAQ;AAAA,MAChC,YAAYA,EAAQ;AAAA,MACpB,aAAaA,EAAQ;AAAA,IAAA;AAAA,IAEvB;AAAA,MACEA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,IAAA;AAAA,EACV;AAEJ;AA4BO,SAASK,IAMd;AACA,QAAML,IAAUD,EAAA;AAEhB,SAAOK;AAAA,IACL,OAAO;AAAA,MACL,iBAAiBJ,EAAQ;AAAA,MACzB,qBAAqBA,EAAQ;AAAA,MAC7B,iBAAiBA,EAAQ;AAAA,MACzB,iBAAiBA,EAAQ;AAAA,MACzB,cAAcA,EAAQ;AAAA,IAAA;AAAA,IAExB;AAAA,MACEA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,MACRA,EAAQ;AAAA,IAAA;AAAA,EACV;AAEJ;AAgBO,SAASM,IAA2C;AAEzD,SADgBP,EAAA,EACD;AACjB;AAuBO,SAASQ,IAEN;AAER,SADgBR,EAAA,EACD;AACjB;AA4BO,SAASS,IAMd;AACA,QAAMR,IAAUD,EAAA,GAEVU,IAAgBL;AAAA,IACpB,MAAMJ,EAAQ,WAAW,OAAO,CAACU,MAAMA,EAAE,aAAa,UAAU,EAAE;AAAA,IAClE,CAACV,EAAQ,UAAU;AAAA,EAAA,GAGfW,IAAYP;AAAA,IAChB,MAAMJ,EAAQ,WAAW,OAAO,CAACU,MAAMA,EAAE,aAAa,MAAM,EAAE;AAAA,IAC9D,CAACV,EAAQ,UAAU;AAAA,EAAA;AAGrB,SAAO;AAAA,IACL,YAAYA,EAAQ;AAAA,IACpB,eAAeA,EAAQ,WAAW,SAAS;AAAA,IAC3C,eAAAS;AAAA,IACA,WAAAE;AAAA,IACA,iBAAiBX,EAAQ;AAAA,EAAA;AAE7B;AAkBO,SAASY,IAGd;AACA,QAAMZ,IAAUD,EAAA;AAEhB,SAAO;AAAA,IACL,SAASC,EAAQ;AAAA,IACjB,0BAA0BA,EAAQ;AAAA,EAAA;AAEtC;AAqBO,SAASa,IAAgD;AAC9D,QAAMb,IAAUD,EAAA;AAEhB,SAAKC,EAAQ,gBAINA,IAHE;AAIX;AAoBO,SAASc,IAMT;AACL,QAAM,EAAE,WAAAC,GAAW,iBAAAC,EAAA,IAAoBjB,EAAA;AAEvC,SAAOkB;AAAA,IACL,CACEC,GACAC,IAGI,OACE;AACN,YAAM,EAAE,cAAAC,IAAe,IAAO,eAAAC,IAAgB,OAASF;AAEvD,cAAQ,IAAIG,MAAoB;AAC9B,YAAI;AAGF,cAAIF,KAAgB,CAACL;AACnB,kBAAM,IAAI,MAAM,0BAA0B;AAG5C,iBAAOG,EAAQ,GAAGI,CAAI;AAAA,QACxB,SAASC,GAAO;AACd,gBAAIF,KACFL,EAAgB;AAAA,YACd,MAAM;AAAA,YACN,SAASO,aAAiB,QAAQA,EAAM,UAAU;AAAA,YAClD,UAAU;AAAA,YACV,SAAS;AAAA,UAAA,CACV,GAEGA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAACR,GAAWC,CAAe;AAAA,EAAA;AAE/B;"}