UNPKG

@usehall/bot-gate

Version:

React/Vue/Svelte components for conditionally rendering content based on bot detection with IP validation

1 lines 34.9 kB
{"version":3,"file":"index.cjs","sources":["../../../src/core/utils.js","../../../src/core/detector.js","../../../src/core/validator.js","../../../src/core/shared-validation.js","../../../src/components/react/index.js"],"sourcesContent":["export function isServerSide() {\n return typeof window === 'undefined' && typeof process !== 'undefined' && process.versions && process.versions.node;\n}\n\nexport function warnIfClientSide() {\n if (!isServerSide()) {\n console.warn('bot-gate: This library is designed for server-side use only. Bot detection requires access to request headers and IP addresses that are not available in the browser.');\n }\n}\n\nexport function sanitizeIpAddress(ipAddress) {\n if (!ipAddress || typeof ipAddress !== 'string') return null;\n \n let sanitized = ipAddress.trim()\n .split(',')[0]\n .trim();\n \n // Remove IPv4-mapped IPv6 prefix if present\n if (sanitized.startsWith('::ffff:')) {\n sanitized = sanitized.replace(/^::ffff:/, '');\n }\n \n // Handle IPv6 addresses enclosed in brackets (common in HTTP headers)\n if (sanitized.startsWith('[') && sanitized.endsWith(']')) {\n sanitized = sanitized.slice(1, -1);\n }\n \n return sanitized;\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nlet userAgentPatterns = null;\nlet compiledPatterns = null;\n\nfunction loadUserAgentPatterns() {\n if (!userAgentPatterns) {\n try {\n const dataPath = path.join(__dirname, '../../data/user-agents.json');\n \n if (!fs.existsSync(dataPath)) {\n console.warn('bot-gate: User agent patterns file not found. Bot detection will be disabled.');\n userAgentPatterns = { bots: [] };\n return userAgentPatterns;\n }\n \n const data = fs.readFileSync(dataPath, 'utf8');\n const parsed = JSON.parse(data);\n \n // Validate structure\n if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.bots)) {\n console.warn('bot-gate: Invalid user agent patterns format. Expected { bots: [...] }');\n userAgentPatterns = { bots: [] };\n return userAgentPatterns;\n }\n \n // Validate each bot entry\n const validBots = parsed.bots.filter(bot => {\n if (!bot || typeof bot !== 'object' || !bot.name || !Array.isArray(bot.patterns)) {\n console.warn(`bot-gate: Invalid bot entry skipped:`, bot);\n return false;\n }\n return true;\n });\n \n userAgentPatterns = { bots: validBots };\n \n if (validBots.length === 0) {\n console.warn('bot-gate: No valid bot patterns found. Bot detection will be disabled.');\n }\n \n // Pre-compile regex patterns for better performance\n compilePatterns();\n \n } catch (error) {\n console.warn('bot-gate: Failed to load user agent patterns:', error.message);\n userAgentPatterns = { bots: [] };\n }\n }\n return userAgentPatterns;\n}\n\nfunction compilePatterns() {\n if (!userAgentPatterns || !userAgentPatterns.bots) {\n compiledPatterns = [];\n return;\n }\n \n compiledPatterns = userAgentPatterns.bots.map(bot => {\n const regexPatterns = bot.patterns.map(pattern => {\n try {\n return new RegExp(pattern, 'i');\n } catch (error) {\n console.warn(`bot-gate: Invalid regex pattern \"${pattern}\" for bot ${bot.name}:`, error.message);\n return null;\n }\n }).filter(Boolean);\n \n return {\n name: bot.name,\n type: bot.type,\n regexPatterns\n };\n }).filter(bot => bot.regexPatterns.length > 0);\n}\n\nexport function detectBot(userAgent) {\n if (!userAgent || typeof userAgent !== 'string') {\n return null;\n }\n\n // Ensure patterns are loaded and compiled\n if (!compiledPatterns) {\n loadUserAgentPatterns();\n if (!compiledPatterns) {\n compilePatterns();\n }\n }\n\n if (!compiledPatterns || compiledPatterns.length === 0) {\n return null;\n }\n\n for (const bot of compiledPatterns) {\n for (const regex of bot.regexPatterns) {\n if (regex.test(userAgent)) {\n return {\n name: bot.name,\n type: bot.type,\n detected: true,\n pattern: regex.source\n };\n }\n }\n }\n\n return null;\n}\n\nexport function getSupportedBots() {\n const patterns = loadUserAgentPatterns();\n return patterns.bots.map(bot => ({\n name: bot.name,\n type: bot.type\n }));\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { detectBot } from './detector.js';\nimport { sanitizeIpAddress } from './utils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst ipRangeCache = new Map();\n\n// Cache configuration\nconst CACHE_TTL = 60 * 60 * 1000; // 1 hour in milliseconds\nconst MAX_CACHE_SIZE = 50; // Maximum number of cached bot entries\n\nfunction cleanupCache() {\n const now = Date.now();\n const entries = Array.from(ipRangeCache.entries());\n \n // Remove expired entries\n for (const [botName, data] of entries) {\n if (data.loadedAt && (now - data.loadedAt) > CACHE_TTL) {\n ipRangeCache.delete(botName);\n }\n }\n \n // If still over size limit, remove oldest entries\n if (ipRangeCache.size > MAX_CACHE_SIZE) {\n const sortedEntries = Array.from(ipRangeCache.entries())\n .sort(([,a], [,b]) => (a.loadedAt || 0) - (b.loadedAt || 0));\n \n const toRemove = sortedEntries.slice(0, ipRangeCache.size - MAX_CACHE_SIZE);\n for (const [botName] of toRemove) {\n ipRangeCache.delete(botName);\n }\n }\n}\n\n// Periodic cleanup every 10 minutes\nlet cleanupInterval;\nif (typeof setInterval !== 'undefined') {\n cleanupInterval = setInterval(cleanupCache, 10 * 60 * 1000);\n}\n\nfunction loadBotIpRanges(botName) {\n if (!ipRangeCache.has(botName)) {\n // Cleanup cache before adding new entries\n cleanupCache();\n try {\n // Handle applebot-extended using the same IP ranges as applebot\n let actualBotName = botName.toLowerCase();\n if (actualBotName === 'applebot-extended') {\n actualBotName = 'applebot';\n }\n \n const dataPath = path.join(__dirname, `../../data/bots/${actualBotName}.json`);\n \n if (!fs.existsSync(dataPath)) {\n console.warn(`bot-gate: IP ranges file not found for ${botName}. Bot validation will fail for this bot.`);\n ipRangeCache.set(botName, { ranges: [], error: 'file_not_found' });\n return ipRangeCache.get(botName);\n }\n \n const data = fs.readFileSync(dataPath, 'utf8');\n let rawData;\n \n try {\n rawData = JSON.parse(data);\n } catch (parseError) {\n console.warn(`bot-gate: Invalid JSON in IP ranges file for ${botName}:`, parseError.message);\n ipRangeCache.set(botName, { ranges: [], error: 'invalid_json' });\n return ipRangeCache.get(botName);\n }\n \n // Validate structure\n if (!rawData || typeof rawData !== 'object') {\n console.warn(`bot-gate: Invalid IP ranges data structure for ${botName}. Expected object.`);\n ipRangeCache.set(botName, { ranges: [], error: 'invalid_structure' });\n return ipRangeCache.get(botName);\n }\n \n // Official API format: { creationTime, prefixes: [{ ipv4Prefix: \"...\" }] }\n const ranges = rawData.prefixes && Array.isArray(rawData.prefixes)\n ? rawData.prefixes.map(prefix => prefix.ipv4Prefix || prefix.ipv6Prefix).filter(Boolean)\n : [];\n \n if (ranges.length === 0) {\n console.warn(`bot-gate: No valid IP ranges found for ${botName}. Bot validation will fail for this bot.`);\n }\n \n ipRangeCache.set(botName, { \n ranges, \n loadedAt: Date.now(),\n error: ranges.length === 0 ? 'no_ranges' : null \n });\n \n } catch (error) {\n console.warn(`bot-gate: Failed to load IP ranges for ${botName}:`, error.message);\n ipRangeCache.set(botName, { ranges: [], error: 'load_failed', errorMessage: error.message });\n }\n }\n return ipRangeCache.get(botName);\n}\n\nfunction ipToInt(ip) {\n return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;\n}\n\nfunction cidrToRange(cidr) {\n const [ip, prefixLength] = cidr.split('/');\n const ipInt = ipToInt(ip);\n const mask = (-1 << (32 - parseInt(prefixLength, 10))) >>> 0;\n const networkInt = ipInt & mask;\n const broadcastInt = networkInt | (~mask >>> 0);\n \n return {\n start: networkInt,\n end: broadcastInt\n };\n}\n\nfunction expandIpv6(ip) {\n // Expand IPv6 address to full form\n if (ip.includes('::')) {\n const parts = ip.split('::');\n const left = parts[0] ? parts[0].split(':') : [];\n const right = parts[1] ? parts[1].split(':') : [];\n const missing = 8 - left.length - right.length;\n const middle = Array(missing).fill('0000');\n return [...left, ...middle, ...right].map(part => part.padStart(4, '0')).join(':');\n }\n return ip.split(':').map(part => part.padStart(4, '0')).join(':');\n}\n\nfunction ipv6ToInts(ip) {\n const expanded = expandIpv6(ip);\n const parts = expanded.split(':');\n return parts.map(part => parseInt(part, 16));\n}\n\nfunction isIpv6InRange(ip, range) {\n if (!ip.includes(':')) return false;\n \n if (range.includes('/')) {\n const [rangeIp, prefixLength] = range.split('/');\n const prefix = parseInt(prefixLength, 10);\n \n if (!rangeIp.includes(':')) return false;\n \n const ipParts = ipv6ToInts(ip);\n const rangeParts = ipv6ToInts(rangeIp);\n \n // Check how many complete 16-bit blocks we need to compare\n const completeBlocks = Math.floor(prefix / 16);\n const remainingBits = prefix % 16;\n \n // Compare complete blocks\n for (let i = 0; i < completeBlocks; i++) {\n if (ipParts[i] !== rangeParts[i]) {\n return false;\n }\n }\n \n // Compare remaining bits in the partial block\n if (remainingBits > 0 && completeBlocks < 8) {\n const mask = (0xFFFF << (16 - remainingBits)) & 0xFFFF;\n if ((ipParts[completeBlocks] & mask) !== (rangeParts[completeBlocks] & mask)) {\n return false;\n }\n }\n \n return true;\n }\n \n // Direct IPv6 comparison\n if (range.includes(':')) {\n return expandIpv6(ip) === expandIpv6(range);\n }\n \n return false;\n}\n\nfunction isIpInRange(ip, range) {\n // Handle IPv6 ranges\n if (ip.includes(':') || range.includes(':')) {\n return isIpv6InRange(ip, range);\n }\n \n // Handle IPv4 ranges\n const ipInt = ipToInt(ip);\n \n if (range.includes('/')) {\n const { start, end } = cidrToRange(range);\n return ipInt >= start && ipInt <= end;\n }\n \n if (range.includes('-')) {\n const [startIp, endIp] = range.split('-');\n const startInt = ipToInt(startIp.trim());\n const endInt = ipToInt(endIp.trim());\n return ipInt >= startInt && ipInt <= endInt;\n }\n \n return ipInt === ipToInt(range);\n}\n\nfunction isValidIpAddress(ip) {\n const ipv4Regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::([0-9a-fA-F]{1,4}:)+[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)+::([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)+::[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)*::([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$|^::$|^([0-9a-fA-F]{1,4}:){1,7}:$|^:(:([0-9a-fA-F]{1,4})){1,7}$|^([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$|^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$|^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$|^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})$/;\n \n return ipv4Regex.test(ip) || ipv6Regex.test(ip);\n}\n\nfunction validateBotByName(botName, ipAddress) {\n if (!botName || !ipAddress) {\n return false;\n }\n\n const cleanIp = sanitizeIpAddress(ipAddress);\n if (!cleanIp || !isValidIpAddress(cleanIp)) {\n return false;\n }\n\n const botData = loadBotIpRanges(botName);\n \n if (!botData.ranges || botData.ranges.length === 0) {\n return false;\n }\n\n return botData.ranges.some(range => isIpInRange(cleanIp, range));\n}\n\nexport function validateBot(userAgent, ipAddress) {\n if (!userAgent || !ipAddress) {\n return false;\n }\n\n const cleanIp = sanitizeIpAddress(ipAddress);\n if (!cleanIp) {\n console.warn(`bot-gate: Failed to sanitize IP address: ${ipAddress}`);\n return false;\n }\n\n const botInfo = detectBot(userAgent);\n \n if (!botInfo) {\n return false;\n }\n\n const isValid = validateBotByName(botInfo.name, cleanIp);\n if (!isValid) {\n console.warn(`bot-gate: Bot validation failed for ${botInfo.name} with IP ${cleanIp}. This may indicate a spoofed bot or outdated IP ranges.`);\n }\n\n return isValid;\n}\n\n// Export cache management functions for testing and manual cleanup\nexport function clearCache() {\n ipRangeCache.clear();\n}\n\nexport function getCacheSize() {\n return ipRangeCache.size;\n}\n\nexport function stopCacheCleanup() {\n if (cleanupInterval) {\n clearInterval(cleanupInterval);\n cleanupInterval = null;\n }\n}\n\n// Debugging utilities\nexport function debugBotValidation(userAgent, ipAddress) {\n console.log('bot-gate: Debug validation starting...');\n console.log(`User-Agent: ${userAgent}`);\n console.log(`IP Address: ${ipAddress}`);\n \n if (!userAgent || !ipAddress) {\n console.log('❌ Missing required parameters');\n return { valid: false, reason: 'missing_params' };\n }\n\n const cleanIp = sanitizeIpAddress(ipAddress);\n console.log(`Sanitized IP: ${cleanIp}`);\n \n if (!cleanIp) {\n console.log('❌ IP sanitization failed');\n return { valid: false, reason: 'ip_sanitization_failed' };\n }\n\n if (!isValidIpAddress(cleanIp)) {\n console.log('❌ Invalid IP address format');\n return { valid: false, reason: 'invalid_ip_format' };\n }\n\n const botInfo = detectBot(userAgent);\n console.log(`Bot detection result:`, botInfo);\n \n if (!botInfo) {\n console.log('❌ No bot detected in user agent');\n return { valid: false, reason: 'bot_not_detected' };\n }\n\n const botData = loadBotIpRanges(botInfo.name);\n console.log(`Bot IP ranges loaded: ${botData.ranges.length} ranges`);\n \n if (botData.error) {\n console.log(`❌ Bot data error: ${botData.error}`);\n return { valid: false, reason: 'bot_data_error', botError: botData.error };\n }\n\n const isInRange = botData.ranges.some(range => {\n const inRange = isIpInRange(cleanIp, range);\n if (inRange) {\n console.log(`✅ IP ${cleanIp} matches range: ${range}`);\n }\n return inRange;\n });\n\n if (!isInRange) {\n console.log(`❌ IP ${cleanIp} not in any valid ranges for ${botInfo.name}`);\n console.log('Available ranges:', botData.ranges.slice(0, 5)); // Show first 5 ranges\n }\n\n const result = { \n valid: isInRange, \n reason: isInRange ? 'valid_bot' : 'ip_not_in_range',\n botInfo,\n cleanIp,\n availableRanges: botData.ranges.length\n };\n \n console.log('bot-gate: Debug validation complete:', result);\n return result;\n}\n\nexport function getBotValidationInfo(botName) {\n const botData = loadBotIpRanges(botName);\n return {\n botName,\n rangeCount: botData.ranges.length,\n error: botData.error,\n errorMessage: botData.errorMessage,\n loadedAt: botData.loadedAt,\n ranges: botData.ranges.slice(0, 10) // First 10 ranges for inspection\n };\n}\n\nexport function listCachedBots() {\n return Array.from(ipRangeCache.keys());\n}","import { detectBot } from './detector.js';\nimport { validateBot } from './validator.js';\nimport { sanitizeIpAddress } from './utils.js';\n\nexport function validateBotGateProps(userAgent, ipAddress, display, role) {\n if (!userAgent || !ipAddress) {\n console.warn(`bot-gate: Missing required props. userAgent: ${userAgent ? 'provided' : 'missing'}, ipAddress: ${ipAddress ? 'provided' : 'missing'}. Both are required for bot detection.`);\n return { isValid: false, error: 'missing_required_props' };\n }\n\n if (!display) {\n console.warn('bot-gate: display prop is required. Must be either \"show\" or \"hide\" to control content visibility.');\n return { isValid: false, error: 'missing_display' };\n }\n\n if (!role) {\n console.warn('bot-gate: role prop is required. Must be either \"bot\" or \"user\" to specify the target audience.');\n return { isValid: false, error: 'missing_role' };\n }\n\n if (!['show', 'hide'].includes(display)) {\n console.warn(`bot-gate: Invalid display value \"${display}\". Must be either \"show\" (to display content) or \"hide\" (to hide content).`);\n return { isValid: false, error: 'invalid_display' };\n }\n\n if (!['bot', 'user'].includes(role)) {\n console.warn(`bot-gate: Invalid role value \"${role}\". Must be either \"bot\" (for search engines/crawlers) or \"user\" (for human visitors).`);\n return { isValid: false, error: 'invalid_role' };\n }\n\n return { isValid: true };\n}\n\n\nexport function isValidBot(userAgent, ipAddress, bots = null) {\n const cleanIp = sanitizeIpAddress(ipAddress);\n const isValid = validateBot(userAgent, cleanIp);\n \n if (!isValid) {\n return false;\n }\n \n // If specific bots are requested, check if this bot is in the list\n if (bots && Array.isArray(bots) && bots.length > 0) {\n const botInfo = detectBot(userAgent);\n return botInfo ? bots.includes(botInfo.name) : false;\n }\n \n return true;\n}","import React from 'react';\nimport { warnIfClientSide } from '../../core/index.js';\nimport { validateBotGateProps, isValidBot } from '../../core/shared-validation.js';\n\nexport function BotGate({ \n userAgent,\n ipAddress,\n display,\n role,\n bots = null,\n children\n}) {\n React.useEffect(() => {\n warnIfClientSide();\n }, []);\n\n const validation = validateBotGateProps(userAgent, ipAddress, display, role);\n if (!validation.isValid) {\n return null;\n }\n\n const isBot = isValidBot(userAgent, ipAddress, bots);\n const shouldShow = (display === 'show') ? \n (role === 'bot' ? isBot : !isBot) : \n (role === 'bot' ? !isBot : isBot);\n\n return shouldShow ? children : null;\n}\n\n\n"],"names":["isServerSide","window","process","versions","node","warnIfClientSide","console","warn","sanitizeIpAddress","ipAddress","sanitized","trim","split","startsWith","replace","endsWith","slice","__dirname","path","dirname","fileURLToPath","import","userAgentPatterns","compiledPatterns","loadUserAgentPatterns","dataPath","join","fs","existsSync","bots","data","readFileSync","parsed","JSON","parse","Array","isArray","validBots","filter","bot","name","patterns","length","compilePatterns","error","message","map","regexPatterns","pattern","RegExp","Boolean","type","detectBot","userAgent","regex","test","detected","source","ipRangeCache","Map","CACHE_TTL","MAX_CACHE_SIZE","cleanupCache","now","Date","entries","from","botName","loadedAt","delete","size","sortedEntries","sort","a","b","toRemove","setInterval","loadBotIpRanges","has","actualBotName","toLowerCase","set","ranges","get","rawData","parseError","prefixes","prefix","ipv4Prefix","ipv6Prefix","errorMessage","ipToInt","ip","reduce","acc","octet","parseInt","cidrToRange","cidr","prefixLength","ipInt","mask","networkInt","broadcastInt","start","end","expandIpv6","includes","parts","left","right","missing","middle","fill","part","padStart","ipv6ToInts","expanded","isIpv6InRange","range","rangeIp","ipParts","rangeParts","completeBlocks","Math","floor","remainingBits","i","isIpInRange","startIp","endIp","startInt","endInt","isValidIpAddress","ipv4Regex","ipv6Regex","validateBotByName","cleanIp","botData","some","validateBot","botInfo","isValid","validateBotGateProps","display","role","isValidBot","BotGate","children","React","useEffect","validation","isBot","shouldShow"],"mappings":"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"}