{"version":3,"file":"SecurityProvider.mjs","sources":["../../../src/lib/security/SecurityProvider.tsx"],"sourcesContent":["/**\n * @fileoverview Security Provider Component\n * @module @/lib/security/SecurityProvider\n *\n * Global security context provider for the Harbor React Framework.\n * Initializes and manages all security subsystems including CSP,\n * CSRF protection, XSS prevention, and secure storage.\n *\n * @author Harbor Security Team\n * @version 1.0.0\n */\n\n/* eslint-disable react-refresh/only-export-components */\nimport React, { createContext, type ReactNode, useCallback, useEffect, useMemo, useRef, useState, } from 'react';\nimport type {\n  SecureStorageInterface,\n  SecurityConfiguration,\n  SecurityContextState,\n  SecurityContextValue,\n  SecurityEvent,\n  SecurityEventType,\n  SecurityViolation,\n} from './types';\nimport { securityConfig } from '@/config/security.config';\nimport { CSPManager } from './csp-manager';\nimport { CSRFProtection } from './csrf-protection';\nimport {\n  generateEncryptionKey,\n  getSecureStorage,\n  initSecureStorage,\n  isSecureStorageAvailable,\n} from './secure-storage';\nimport { ContentSanitizer } from '@/lib/vdom/security-sandbox';\n\n/**\n * Security context for React components\n */\nconst SecurityContext = createContext<SecurityContextValue | null>(null);\n\n// ============================================================================\n// Context\n// ============================================================================\n\n/**\n * Security context for React components\n */\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Security Provider props\n */\nexport interface SecurityProviderProps {\n  /** Child components */\n  children: ReactNode;\n  /** Override default configuration */\n  config?: Partial<SecurityConfiguration>;\n  /** Encryption key for secure storage (auto-generated if not provided) */\n  encryptionKey?: string;\n  /** Callback when security is initialized */\n  onInitialized?: () => void;\n  /** Callback for security events */\n  onSecurityEvent?: (event: SecurityEvent) => void;\n  /** Callback for security violations */\n  onViolation?: (violation: SecurityViolation) => void;\n  /** Skip initialization (for testing) */\n  skipInitialization?: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Generate a unique violation ID\n */\nfunction generateViolationId(): string {\n  return `viol_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Get or generate encryption key\n */\nfunction getEncryptionKey(providedKey?: string): string {\n  if (providedKey != null && providedKey !== '') {\n    return providedKey;\n  }\n\n  // Try to get from sessionStorage\n  const storedKey = sessionStorage.getItem('__security_key__');\n  if (storedKey != null && storedKey !== '') {\n    return storedKey;\n  }\n\n  // Generate new key\n  const newKey = generateEncryptionKey();\n  sessionStorage.setItem('__security_key__', newKey);\n  return newKey;\n}\n\n// ============================================================================\n// Security Provider Component\n// ============================================================================\n\n/**\n * Security Provider component\n *\n * Provides global security context to the application including:\n * - CSP nonce management\n * - CSRF token management\n * - Secure storage access\n * - Violation tracking and reporting\n *\n * @example\n * ```tsx\n * // Basic usage\n * function App() {\n *   return (\n *     <SecurityProvider>\n *       <MainApp />\n *     </SecurityProvider>\n *   );\n * }\n *\n * // With configuration\n * function App() {\n *   return (\n *     <SecurityProvider\n *       config={{\n *         reportToServer: true,\n *         reportEndpoint: '/api/security/report',\n *       }}\n *       onViolation={(v) => analytics.track('security_violation', v)}\n *     >\n *       <MainApp />\n *     </SecurityProvider>\n *   );\n * }\n * ```\n */\nexport function SecurityProvider({\n  children,\n  config: configOverride,\n  encryptionKey: providedEncryptionKey,\n  onInitialized,\n  onSecurityEvent,\n  onViolation,\n  skipInitialization = false,\n}: SecurityProviderProps): React.ReactElement {\n  // Merge configuration\n  const config = useMemo<SecurityConfiguration>(\n    () => ({\n      ...securityConfig,\n      ...configOverride,\n      csp: {\n        ...securityConfig.csp,\n        ...configOverride?.csp,\n      },\n      csrf: {\n        ...securityConfig.csrf,\n        ...configOverride?.csrf,\n      },\n      storage: {\n        ...securityConfig.storage,\n        ...configOverride?.storage,\n      },\n    }),\n    [configOverride]\n  );\n\n  // State\n  const [state, setState] = useState<SecurityContextState>({\n    cspNonce: '',\n    isInitialized: false,\n    csrfToken: '',\n    secureStorageAvailable: false,\n    config,\n    violations: [],\n    lastEventAt: Date.now(),\n  });\n\n  // Refs\n  const mountedRef = useRef(true);\n  const initializingRef = useRef(false);\n  const eventCallbackRef = useRef(onSecurityEvent);\n  const violationCallbackRef = useRef(onViolation);\n\n  // Keep callbacks updated\n  useEffect(() => {\n    eventCallbackRef.current = onSecurityEvent;\n    violationCallbackRef.current = onViolation;\n  }, [onSecurityEvent, onViolation]);\n\n  // Emit security event\n  const emitEvent = useCallback((type: SecurityEventType, payload: unknown) => {\n    const event: SecurityEvent = {\n      type,\n      payload,\n      timestamp: Date.now(),\n      source: 'SecurityProvider',\n    };\n\n    eventCallbackRef.current?.(event);\n\n    setState((prev) => ({\n      ...prev,\n      lastEventAt: event.timestamp,\n    }));\n  }, []);\n\n  // ==========================================================================\n  // Initialization\n  // ==========================================================================\n\n  useEffect(() => {\n    if (skipInitialization || initializingRef.current) {\n      return;\n    }\n\n    initializingRef.current = true;\n\n    const initialize = (): void => {\n      try {\n        // Initialize CSP Manager\n        CSPManager.initialize();\n        const nonce = CSPManager.getCurrentNonce();\n\n        // Initialize CSRF Protection\n        CSRFProtection.initialize();\n        const csrfToken = CSRFProtection.getToken();\n\n        // Initialize Secure Storage\n        let storageAvailable = false;\n        if (isSecureStorageAvailable()) {\n          try {\n            const encryptionKey = getEncryptionKey(providedEncryptionKey);\n            initSecureStorage(encryptionKey);\n            storageAvailable = true;\n          } catch (error) {\n            console.warn('[Security] Secure storage initialization failed:', error);\n          }\n        }\n\n        if (!mountedRef.current) return;\n\n        setState((prev) => ({\n          ...prev,\n          cspNonce: nonce,\n          csrfToken,\n          secureStorageAvailable: storageAvailable,\n          isInitialized: true,\n        }));\n\n        emitEvent('initialization-complete', {\n          cspEnabled: true,\n          csrfEnabled: true,\n          secureStorageEnabled: storageAvailable,\n        });\n\n        onInitialized?.();\n      } catch (error) {\n        console.error('[Security] Initialization error:', error);\n\n        if (!mountedRef.current) return;\n\n        // Partial initialization with what succeeded\n        setState((prev) => ({\n          ...prev,\n          isInitialized: true,\n        }));\n      }\n    };\n\n    void initialize();\n\n    return () => {\n      mountedRef.current = false;\n    };\n  }, [skipInitialization, providedEncryptionKey, emitEvent, onInitialized]);\n\n  // ==========================================================================\n  // CSP Violation Listener\n  // ==========================================================================\n\n  useEffect(() => {\n    if (!config.csp.reportViolations) {\n      return;\n    }\n\n\n\n\n    return CSPManager.addViolationHandler((violation) => {\n      const securityViolation: SecurityViolation = {\n        id: generateViolationId(),\n        type: 'csp',\n        details: `${violation.violatedDirective}: ${violation.blockedUri}`,\n        timestamp: Date.now(),\n        severity: 'high',\n        blocked: violation.disposition === 'enforce',\n        source: violation.sourceFile,\n      };\n\n      handleViolation(securityViolation);\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [config.csp.reportViolations]);\n\n  // ==========================================================================\n  // Actions\n  // ==========================================================================\n\n  /**\n   * Handle a security violation\n   */\n  const handleViolation = useCallback(\n    (violation: SecurityViolation) => {\n      setState((prev) => {\n        const violations = [...prev.violations, violation];\n\n        // Trim to max history\n        while (violations.length > config.maxViolationHistory) {\n          violations.shift();\n        }\n\n        return { ...prev, violations };\n      });\n\n      // Notify callback\n      violationCallbackRef.current?.(violation);\n\n      // Log if enabled\n      if (config.enableLogging) {\n        console.warn('[Security] Violation detected:', violation);\n      }\n\n      // Report to server if enabled\n      // Note: Raw fetch is intentional - security reporting must be independent\n      // and use keepalive for reliability when page is unloading\n      if (config.reportToServer && config.reportEndpoint != null && config.reportEndpoint !== '') {\n        void fetch(config.reportEndpoint, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify(violation),\n          keepalive: true,\n        }).catch((error) => {\n          console.error('[Security] Failed to report violation:', error);\n        });\n      }\n    },\n    [config.maxViolationHistory, config.enableLogging, config.reportToServer, config.reportEndpoint]\n  );\n\n  /**\n   * Regenerate CSP nonce\n   */\n  const regenerateNonce = useCallback((): string => {\n    const nonceObj = CSPManager.regenerateNonce();\n    const newNonce = nonceObj.value;\n\n    setState((prev) => ({ ...prev, cspNonce: newNonce }));\n    emitEvent('nonce-regenerated', { nonce: newNonce });\n\n    return newNonce;\n  }, [emitEvent]);\n\n  /**\n   * Regenerate CSRF token\n   */\n  const regenerateCsrfToken = useCallback(async (): Promise<string> => {\n    const newToken = CSRFProtection.regenerateToken();\n\n    setState((prev) => ({ ...prev, csrfToken: newToken }));\n    emitEvent('token-rotated', { tokenType: 'csrf' });\n\n    return newToken;\n  }, [emitEvent]);\n\n  /**\n   * Report a security violation\n   */\n  const reportViolation = useCallback(\n    (violation: Omit<SecurityViolation, 'id' | 'timestamp'>) => {\n      const fullViolation: SecurityViolation = {\n        ...violation,\n        id: generateViolationId(),\n        timestamp: Date.now(),\n      };\n\n      handleViolation(fullViolation);\n    },\n    [handleViolation]\n  );\n\n  /**\n   * Clear violation history\n   */\n  const clearViolations = useCallback(() => {\n    setState((prev) => ({ ...prev, violations: [] }));\n  }, []);\n\n  /**\n   * Get secure storage instance\n   */\n  const getSecureStorageInstance = useCallback((): SecureStorageInterface => {\n    if (!state.secureStorageAvailable) {\n      throw new Error('Secure storage is not available');\n    }\n    return getSecureStorage();\n  }, [state.secureStorageAvailable]);\n\n  /**\n   * Update security configuration\n   */\n  const updateConfig = useCallback(\n    (partial: Partial<SecurityConfiguration>) => {\n      setState((prev) => ({\n        ...prev,\n        config: {\n          ...prev.config,\n          ...partial,\n        },\n      }));\n\n      emitEvent('config-updated', partial);\n    },\n    [emitEvent]\n  );\n\n  // ==========================================================================\n  // Context Value\n  // ==========================================================================\n\n  const sanitizer = useMemo(() => new ContentSanitizer(), []);\n  const sanitize = useCallback((html: string) => sanitizer.sanitize(html), [sanitizer]);\n  const validateUrl = useCallback((url: string) => {\n    try {\n      new URL(url);\n      return true;\n    } catch {\n      return false;\n    }\n  }, []);\n\n  const contextValue = useMemo<SecurityContextValue>(\n    () => ({\n      ...state,\n      sanitize,\n      validateUrl,\n      regenerateNonce,\n      regenerateCsrfToken,\n      reportViolation,\n      clearViolations,\n      getSecureStorage: getSecureStorageInstance,\n      updateConfig,\n    }),\n    [\n      state,\n      sanitize,\n      validateUrl,\n      regenerateNonce,\n      regenerateCsrfToken,\n      reportViolation,\n      clearViolations,\n      getSecureStorageInstance,\n      updateConfig,\n    ]\n  );\n\n  // ==========================================================================\n  // Render\n  // ==========================================================================\n\n  return (\n    <SecurityContext.Provider value={contextValue}>\n      {children}\n    </SecurityContext.Provider>\n  );\n}\n\n// ============================================================================\n// Higher-Order Component\n// ============================================================================\n\n/**\n * Higher-order component that provides security context\n *\n * @example\n * ```tsx\n * const SecureApp = withSecurityProvider(App);\n *\n * // Or with config\n * const SecureApp = withSecurityProvider(App, {\n *   config: { reportToServer: true },\n * });\n * ```\n */\nexport function withSecurityProvider<P extends object>(\n  Component: React.ComponentType<P>,\n  providerProps?: Omit<SecurityProviderProps, 'children'>\n): React.FC<P> {\n  const WrappedComponent: React.FC<P> = (props) => (\n    <SecurityProvider {...providerProps}>\n      <Component {...props} />\n    </SecurityProvider>\n  );\n\n  WrappedComponent.displayName = `withSecurityProvider(${\n    Component.displayName ?? Component.name ?? 'Component'\n  })`;\n\n  return WrappedComponent;\n}\n\n// ============================================================================\n// Render Props Component\n// ============================================================================\n\n/**\n * Render props component for security context\n *\n * @example\n * ```tsx\n * function App() {\n *   return (\n *     <SecurityConsumer>\n *       {(security) => (\n *         <div>\n *           <p>CSRF Token: {security.csrfToken}</p>\n *           <p>CSP Nonce: {security.cspNonce}</p>\n *         </div>\n *       )}\n *     </SecurityConsumer>\n *   );\n * }\n * ```\n */\nexport function SecurityConsumer({\n  children,\n}: {\n  children: (security: SecurityContextValue) => ReactNode;\n}): React.ReactElement | null {\n  return (\n    <SecurityContext.Consumer>\n      {(context) => {\n        if (!context) {\n          throw new Error(\n            'SecurityConsumer must be used within a SecurityProvider'\n          );\n        }\n        return <>{children(context)}</>;\n      }}\n    </SecurityContext.Consumer>\n  );\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n"],"names":["SecurityContext","createContext","generateViolationId","getEncryptionKey","providedKey","storedKey","newKey","generateEncryptionKey","SecurityProvider","children","configOverride","providedEncryptionKey","onInitialized","onSecurityEvent","onViolation","skipInitialization","config","useMemo","securityConfig","state","setState","useState","mountedRef","useRef","initializingRef","eventCallbackRef","violationCallbackRef","useEffect","emitEvent","useCallback","type","payload","event","prev","CSPManager","nonce","CSRFProtection","csrfToken","storageAvailable","isSecureStorageAvailable","encryptionKey","initSecureStorage","error","violation","securityViolation","handleViolation","violations","regenerateNonce","newNonce","regenerateCsrfToken","newToken","reportViolation","fullViolation","clearViolations","getSecureStorageInstance","getSecureStorage","updateConfig","partial","sanitizer","ContentSanitizer","sanitize","html","validateUrl","url","contextValue","withSecurityProvider","Component","providerProps","WrappedComponent","props","jsx","SecurityConsumer","context","Fragment"],"mappings":"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"}