lib/config.js (108 lines of code) (raw):

const fs = require('fs'); const os = require('os'); const path = require('path'); const convict = require('convict'); const config = convict({ email: { host: { 'default': 'restmail.net', doc: 'Host/Domain name for receiving email.', env: 'EMAIL_HOST', format: String }, port: { // Note: in production, 25 is iptables nat'd to 9025. 'default': 9025, doc: 'Port number to listen on.', env: 'EMAIL_PORT', format: 'port' } }, enableSTS: { 'default': true, doc: 'Send "strict-transport-security" header.', env: 'ENABLE_STS', format: Boolean }, env: { 'default': '', doc: 'Node environment.', env: 'NODE_ENV', format: String }, // Interval in seconds after which to automatically delete mail. // Set to 0 for no auto-delete, and keep an eye on the size of // your redis db. expireAfter: { 'default': 60 * 60 * 24, doc: 'Interval in seconds after which to automatically delete mail. 0 for never.', env: 'EXPIRE_AFTER', format: 'int' }, loadtest: { debug: { 'default': false, doc: 'Debug logging while running loadtest', env: 'LOADTEST_DEBUG', format: Boolean }, logToConsole: { 'default': false, doc: 'Very verbose detail during loadtest', env: 'LOADTEST_LOG_TO_CONSOLE', format: Boolean } }, // Maximum number of RCPT TO on one connection dialogue. If there are more // than this limit, an error will returned and the connection terminated. // Note: SES for one will exceed the limit of 5 as it batch reuses // connections to deliver multiple emails, so you cannot practically use // this in production. maximumRcptTo: { 'default': 5, doc: 'Maximum number of RCPT TO on one connection dialogue.', env: 'MAXIMUM_RCPT_TO', format: 'int' }, // Domain whitelist. RCPT TO addresses must match one of the domains on this // list. (Strict matching, no subdomains). rcptToDomainWhitelist: { 'default': [ 'localhost', 'restmail.net', 'restmail.com', 'example.com' ], doc: 'RCPT TO addresses must match one of the domains on this list.', env: 'RCPT_TO_DOMAIN_WHITELIST', format: Array }, redis: { host: { 'default': '127.0.0.1', doc: 'Redis host.', env: 'REDIS_HOST', format: String }, port: { 'default': 6379, doc: 'Redis port.', env: 'REDIS_PORT', format: 'port' } }, specialUserDir: { 'default': os.tmpdir(), doc: 'Location of directory in which to store webmaster, etc. email.', env: 'SPECIAL_USER_DIR', format: String }, // For initial deployment, since I don't control all the clients, I'll start // with a low value. Enough to break someone temporarily and know about it, // but undoable. stsMaxAge: { 'default': '120', doc: 'Strict-Transport-Security max-age value (in seconds).', env: 'STS_MAX_AGE', format: String }, webPort: { 'default': 8080, doc: 'Port number for web server to listen on.', env: 'WEB_PORT', format: 'port' } }); // handle configuration files. you can specify a CSV list of configuration // files to process, which will be overlayed in order, in the CONFIG_FILES // environment variable. const envConfig = path.join(__dirname, config.get('env') + '.json') + ',' + (process.env.CONFIG_FILES || ''); const files = envConfig.split(',').filter(fs.existsSync); config.loadFile(files); config.validate({ allowed: 'strict' }); const properties = config.getProperties(); module.exports = properties;