hastebin/config.js

95 lines
3.5 KiB
JavaScript

// Modern Hastebin configuration with KeyDB as default storage
const config = {
// Server settings
host: process.env.HASTEBIN_HOST || "0.0.0.0",
port: parseInt(process.env.HASTEBIN_PORT, 10) || 7777,
// Document settings
keyLength: parseInt(process.env.HASTEBIN_KEY_LENGTH, 10) || 10,
maxLength: parseInt(process.env.HASTEBIN_MAX_LENGTH, 10) || 400000,
// Static file settings
staticMaxAge: parseInt(process.env.HASTEBIN_STATIC_MAX_AGE, 10) || 86400,
recompressStaticAssets: process.env.HASTEBIN_RECOMPRESS_ASSETS ?
(process.env.HASTEBIN_RECOMPRESS_ASSETS.toLowerCase() === 'true') : true,
// Security settings
security: {
// Enable Content Security Policy
csp: process.env.HASTEBIN_ENABLE_CSP ?
(process.env.HASTEBIN_ENABLE_CSP.toLowerCase() === 'true') : true,
// Enable HTTP Strict Transport Security (only enable in production with HTTPS)
hsts: process.env.HASTEBIN_ENABLE_HSTS ?
(process.env.HASTEBIN_ENABLE_HSTS.toLowerCase() === 'true') : false,
// Additional script sources (empty by default since we now host jQuery locally)
scriptSources: process.env.HASTEBIN_SCRIPT_SOURCES ?
process.env.HASTEBIN_SCRIPT_SOURCES.split(',') : [],
// Allow bypassing strict CSP in development mode for testing (default: false)
// This adds unsafe-inline to the policy when NODE_ENV=development
bypassCSPInDev: process.env.HASTEBIN_BYPASS_CSP_IN_DEV ?
(process.env.HASTEBIN_BYPASS_CSP_IN_DEV.toLowerCase() === 'true') : false,
// Allow unsafe-hashes in production for event handlers (default: true)
// This adds 'unsafe-hashes' to the policy for DOM event handlers
allowUnsafeHashes: process.env.HASTEBIN_ALLOW_UNSAFE_HASHES ?
(process.env.HASTEBIN_ALLOW_UNSAFE_HASHES.toLowerCase() === 'true') : true
},
// Logging configuration
logging: [
{
level: process.env.HASTEBIN_LOG_LEVEL || "verbose",
type: process.env.HASTEBIN_LOG_TYPE || "Console",
colorize: process.env.HASTEBIN_LOG_COLORIZE ?
(process.env.HASTEBIN_LOG_COLORIZE.toLowerCase() === 'true') : true,
json: process.env.HASTEBIN_LOG_JSON ?
(process.env.HASTEBIN_LOG_JSON.toLowerCase() === 'true') : false
}
],
// Key generator configuration
keyGenerator: {
type: process.env.HASTEBIN_KEY_GENERATOR_TYPE || "phonetic"
},
// Rate limiting configuration
rateLimits: {
categories: {
normal: {
totalRequests: parseInt(process.env.HASTEBIN_RATE_LIMIT_REQUESTS, 10) || 500,
every: parseInt(process.env.HASTEBIN_RATE_LIMIT_WINDOW, 10) || 60000
}
}
},
// Storage configuration - KeyDB as default
storage: {
type: process.env.HASTEBIN_STORAGE_TYPE || "redis",
host: process.env.HASTEBIN_STORAGE_HOST || "redis",
port: parseInt(process.env.HASTEBIN_STORAGE_PORT, 10) || 6379,
password: process.env.HASTEBIN_STORAGE_PASSWORD || "",
db: parseInt(process.env.HASTEBIN_STORAGE_DB, 10) || 0,
expire: parseInt(process.env.HASTEBIN_STORAGE_EXPIRE, 10) || 7776000,
connectionTimeout: parseInt(process.env.HASTEBIN_STORAGE_TIMEOUT, 10) || 5000
},
// Static documents
documents: {
about: process.env.HASTEBIN_ABOUT_DOCUMENT || "./about.md"
},
// CORS settings
allowedOrigins: process.env.HASTEBIN_ALLOWED_ORIGINS ?
process.env.HASTEBIN_ALLOWED_ORIGINS.split(',') : ['*']
};
// Support for backwards compatibility
if (process.env.REDIS_URL || process.env.REDISTOGO_URL) {
config.storage.url = process.env.REDIS_URL || process.env.REDISTOGO_URL;
}
module.exports = config;