From e72e6a6ce7c61873cf48b8931567e2ceaced7070 Mon Sep 17 00:00:00 2001 From: Matt Simerson Date: Sun, 26 Jan 2025 19:36:13 -0800 Subject: [PATCH] style(prettier) --- .codeclimate.yml | 6 +- .github/dependabot.yml | 6 +- .github/workflows/codeql.yml | 4 +- README.md | 4 +- eslint.config.mjs | 23 +- index.js | 548 ++++++++++++------------ test/access.js | 808 +++++++++++++++++------------------ 7 files changed, 679 insertions(+), 720 deletions(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index 49b1e89..b08b36a 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -1,16 +1,16 @@ engines: eslint: enabled: true - channel: "eslint-9" + channel: 'eslint-9' config: - config: "eslint.config.mjs" + config: 'eslint.config.mjs' checks: complexity: enabled: false ratings: paths: - - "**.js" + - '**.js' checks: file-lines: diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0449e4a..d450132 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -2,9 +2,9 @@ version: 2 updates: - - package-ecosystem: "npm" - directory: "/" + - package-ecosystem: 'npm' + directory: '/' schedule: - interval: "weekly" + interval: 'weekly' allow: - dependency-type: production diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 2b614e3..816e8c3 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,4 +1,4 @@ -name: "CodeQL" +name: 'CodeQL' on: push: @@ -6,7 +6,7 @@ on: pull_request: branches: [master] schedule: - - cron: "18 7 * * 4" + - cron: '18 7 * * 4' jobs: codeql: diff --git a/README.md b/README.md index 8f9a861..cdb7598 100644 --- a/README.md +++ b/README.md @@ -83,12 +83,12 @@ To check access results from other plugins, use the standard _results_ methods. ```js -const ar = connection.results.get("access"); +const ar = connection.results.get('access') if (ar.pass.length > 2) { // they passed the connection and helo checks } -const ar = connection.transaction.results.get("access"); +const ar = connection.transaction.results.get('access') if (ar.pass.length > 2) { // they passed the mail and rcpt checks } diff --git a/eslint.config.mjs b/eslint.config.mjs index 0136ea9..dff6d3e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,19 +1,19 @@ -import globals from "globals"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import js from "@eslint/js"; -import { FlatCompat } from "@eslint/eslintrc"; +import globals from 'globals' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import js from '@eslint/js' +import { FlatCompat } from '@eslint/eslintrc' -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) const compat = new FlatCompat({ baseDirectory: __dirname, recommendedConfig: js.configs.recommended, allConfig: js.configs.all, -}); +}) export default [ - ...compat.extends("@haraka"), + ...compat.extends('@haraka'), { languageOptions: { globals: { @@ -21,5 +21,8 @@ export default [ ...globals.mocha, }, }, + "rules": { + 'no-unused-vars': ['warn', { caughtErrorsIgnorePattern: '^ignore' }], + } }, -]; +] diff --git a/index.js b/index.js index 8677c92..c2727a2 100644 --- a/index.js +++ b/index.js @@ -1,158 +1,158 @@ // access plugin -const tlds = require("haraka-tld"); -const haddr = require("address-rfc2822"); -const net_utils = require("haraka-net-utils"); -const utils = require("haraka-utils"); +const tlds = require('haraka-tld') +const haddr = require('address-rfc2822') +const net_utils = require('haraka-net-utils') +const utils = require('haraka-utils') exports.register = function () { - this.init_config(); // init this.cfg - this.init_lists(); - this.load_access_ini(); // update with *.ini settings + this.init_config() // init this.cfg + this.init_lists() + this.load_access_ini() // update with *.ini settings - for (const c of ["black", "white"]) { + for (const c of ['black', 'white']) { for (const p in this.cfg[c]) { - this.load_file(c, p); + this.load_file(c, p) } for (const p in this.cfg.re[c]) { - this.load_re_file(c, p); + this.load_re_file(c, p) } } if (this.cfg.check.conn) { - this.register_hook("connect", "rdns_access"); + this.register_hook('connect', 'rdns_access') } if (this.cfg.check.helo) { - this.register_hook("helo", "helo_access"); - this.register_hook("ehlo", "helo_access"); + this.register_hook('helo', 'helo_access') + this.register_hook('ehlo', 'helo_access') } if (this.cfg.check.mail) { - this.register_hook("mail", "mail_from_access"); + this.register_hook('mail', 'mail_from_access') } if (this.cfg.check.rcpt) { - this.register_hook("rcpt", "rcpt_to_access"); + this.register_hook('rcpt', 'rcpt_to_access') } if (this.cfg.check.any) { - this.load_domain_file("domain", "any"); - for (const hook of ["connect", "helo", "ehlo", "mail", "rcpt"]) { - this.register_hook(hook, "any"); + this.load_domain_file('domain', 'any') + for (const hook of ['connect', 'helo', 'ehlo', 'mail', 'rcpt']) { + this.register_hook(hook, 'any') } - this.register_hook("data_post", "data_any"); + this.register_hook('data_post', 'data_any') } -}; +} exports.init_config = function () { this.cfg = { deny_msg: { - conn: "You are not allowed to connect", - helo: "That HELO is not allowed to connect", - mail: "That sender cannot send mail here", - rcpt: "That recipient is not allowed", + conn: 'You are not allowed to connect', + helo: 'That HELO is not allowed to connect', + mail: 'That sender cannot send mail here', + rcpt: 'That recipient is not allowed', }, domain: { - any: "access.domains", + any: 'access.domains', }, white: { - conn: "connect.rdns_access.whitelist", - mail: "mail_from.access.whitelist", - rcpt: "rcpt_to.access.whitelist", + conn: 'connect.rdns_access.whitelist', + mail: 'mail_from.access.whitelist', + rcpt: 'rcpt_to.access.whitelist', }, black: { - conn: "connect.rdns_access.blacklist", - mail: "mail_from.access.blacklist", - rcpt: "rcpt_to.access.blacklist", + conn: 'connect.rdns_access.blacklist', + mail: 'mail_from.access.blacklist', + rcpt: 'rcpt_to.access.blacklist', }, re: { black: { - conn: "connect.rdns_access.blacklist_regex", - mail: "mail_from.access.blacklist_regex", - rcpt: "rcpt_to.access.blacklist_regex", - helo: "helo.checks.regexps", + conn: 'connect.rdns_access.blacklist_regex', + mail: 'mail_from.access.blacklist_regex', + rcpt: 'rcpt_to.access.blacklist_regex', + helo: 'helo.checks.regexps', }, white: { - conn: "connect.rdns_access.whitelist_regex", - mail: "mail_from.access.whitelist_regex", - rcpt: "rcpt_to.access.whitelist_regex", + conn: 'connect.rdns_access.whitelist_regex', + mail: 'mail_from.access.whitelist_regex', + rcpt: 'rcpt_to.access.whitelist_regex', }, }, - }; -}; + } +} exports.load_access_ini = function () { const cfg = this.config.get( - "access.ini", + 'access.ini', { booleans: [ - "+check.any", - "+check.conn", - "-check.helo", - "+check.mail", - "+check.rcpt", - "-rcpt.accept", + '+check.any', + '+check.conn', + '-check.helo', + '+check.mail', + '+check.rcpt', + '-rcpt.accept', ], }, () => { - this.load_access_ini(); + this.load_access_ini() }, - ); + ) - this.cfg.check = cfg.check; + this.cfg.check = cfg.check if (cfg.deny_msg) { - let p; + let p for (p in this.cfg.deny_msg) { if (cfg.deny_msg[p]) { - this.cfg.deny_msg[p] = cfg.deny_msg[p]; + this.cfg.deny_msg[p] = cfg.deny_msg[p] } } } - this.cfg.rcpt = cfg.rcpt; + this.cfg.rcpt = cfg.rcpt // backwards compatibility - const mf_cfg = this.config.get("mail_from.access.ini"); + const mf_cfg = this.config.get('mail_from.access.ini') if (mf_cfg && mf_cfg.general && mf_cfg.general.deny_msg) { - this.cfg.deny_msg.mail = mf_cfg.general.deny_msg; + this.cfg.deny_msg.mail = mf_cfg.general.deny_msg } - const rcpt_cfg = this.config.get("rcpt_to.access.ini"); + const rcpt_cfg = this.config.get('rcpt_to.access.ini') if (rcpt_cfg && rcpt_cfg.general && rcpt_cfg.general.deny_msg) { - this.cfg.deny_msg.rcpt = rcpt_cfg.general.deny_msg; + this.cfg.deny_msg.rcpt = rcpt_cfg.general.deny_msg } - const rdns_cfg = this.config.get("connect.rdns_access.ini"); + const rdns_cfg = this.config.get('connect.rdns_access.ini') if (rdns_cfg && rdns_cfg.general && rdns_cfg.general.deny_msg) { - this.cfg.deny_msg.conn = rdns_cfg.general.deny_msg; + this.cfg.deny_msg.conn = rdns_cfg.general.deny_msg } -}; +} exports.init_lists = function () { this.list = { black: { conn: {}, helo: {}, mail: {}, rcpt: {} }, white: { conn: {}, helo: {}, mail: {}, rcpt: {} }, domain: { any: {} }, - }; + } this.list_re = { black: {}, white: {}, - }; -}; + } +} exports.get_domain = function (hook, connection, params) { switch (hook) { - case "connect": - if (!connection.remote.host) return; - if (connection.remote.host === "DNSERROR") return; - if (connection.remote.host === "Unknown") return; - return connection.remote.host; - case "helo": - case "ehlo": - if (net_utils.is_ip_literal(params)) return; - return params; - case "mail": - case "rcpt": - if (params && params[0]) return params[0].host; - } - return; -}; + case 'connect': + if (!connection.remote.host) return + if (connection.remote.host === 'DNSERROR') return + if (connection.remote.host === 'Unknown') return + return connection.remote.host + case 'helo': + case 'ehlo': + if (net_utils.is_ip_literal(params)) return + return params + case 'mail': + case 'rcpt': + if (params && params[0]) return params[0].host + } + return +} exports.any_whitelist = function ( connection, @@ -161,47 +161,47 @@ exports.any_whitelist = function ( domain, org_domain, ) { - if (hook === "mail" || hook === "rcpt") { - const email = params[0].address(); - if (email && this.in_list("domain", "any", `!${email}`)) return true; + if (hook === 'mail' || hook === 'rcpt') { + const email = params[0].address() + if (email && this.in_list('domain', 'any', `!${email}`)) return true } - if (this.in_list("domain", "any", `!${org_domain}`)) return true; - if (this.in_list("domain", "any", `!${domain}`)) return true; + if (this.in_list('domain', 'any', `!${org_domain}`)) return true + if (this.in_list('domain', 'any', `!${domain}`)) return true - return false; -}; + return false +} exports.any = function (next, connection, params) { - if (!this.cfg.check.any) return next(); + if (!this.cfg.check.any) return next() - const hook = connection.hook; + const hook = connection.hook if (!hook) { - connection.logerror(this, "hook detection failed"); - return next(); + connection.logerror(this, 'hook detection failed') + return next() } // step 1: get a domain name from whatever info is available - const domain = this.get_domain(hook, connection, params); + const domain = this.get_domain(hook, connection, params) if (!domain) { - connection.logdebug(this, `domain detect failed on hook: ${hook}`); - return next(); + connection.logdebug(this, `domain detect failed on hook: ${hook}`) + return next() } if (!/\./.test(domain)) { connection.results.add(this, { fail: `invalid domain: ${domain}`, emit: true, - }); - return next(); + }) + return next() } - const org_domain = tlds.get_organizational_domain(domain); + const org_domain = tlds.get_organizational_domain(domain) if (!org_domain) { - connection.loginfo(this, `no org domain from ${domain}`); - return next(); + connection.loginfo(this, `no org domain from ${domain}`) + return next() } - const file = this.cfg.domain.any; + const file = this.cfg.domain.any // step 2: check for whitelist if (this.any_whitelist(connection, hook, params, domain, org_domain)) { @@ -209,340 +209,340 @@ exports.any = function (next, connection, params) { pass: `${hook}:${file}`, whitelist: true, emit: true, - }; - connection.results.add(this, whiteResults); - return next(); + } + connection.results.add(this, whiteResults) + return next() } // step 3: check for blacklist - if (this.in_list("domain", "any", org_domain)) { + if (this.in_list('domain', 'any', org_domain)) { connection.results.add(this, { fail: `${file}(${org_domain})`, blacklist: true, emit: true, - }); - return next(DENY, "You are not welcome here."); + }) + return next(DENY, 'You are not welcome here.') } - const umsg = hook ? `${hook}:any` : "any"; - connection.results.add(this, { msg: `unlisted(${umsg})` }); - next(); -}; + const umsg = hook ? `${hook}:any` : 'any' + connection.results.add(this, { msg: `unlisted(${umsg})` }) + next() +} exports.rdns_store_results = function (connection, color, file) { switch (color) { - case "white": - connection.results.add(this, { whitelist: true, pass: file, emit: true }); - break; - case "black": - connection.results.add(this, { fail: file, emit: true }); - break; + case 'white': + connection.results.add(this, { whitelist: true, pass: file, emit: true }) + break + case 'black': + connection.results.add(this, { fail: file, emit: true }) + break } -}; +} exports.rdns_is_listed = function (connection, color) { - const addrs = [connection.remote.ip, connection.remote.host]; + const addrs = [connection.remote.ip, connection.remote.host] for (let addr of addrs) { - if (!addr) continue; // empty rDNS host - if (/[\w]/.test(addr)) addr = addr.toLowerCase(); + if (!addr) continue // empty rDNS host + if (/[\w]/.test(addr)) addr = addr.toLowerCase() - let file = this.cfg[color].conn; - connection.logdebug(this, `checking ${addr} against ${file}`); + let file = this.cfg[color].conn + connection.logdebug(this, `checking ${addr} against ${file}`) - if (this.in_list(color, "conn", addr)) { - this.rdns_store_results(connection, color, file); - return true; + if (this.in_list(color, 'conn', addr)) { + this.rdns_store_results(connection, color, file) + return true } - file = this.cfg.re[color].conn; - connection.logdebug(this, `checking ${addr} against ${file}`); - if (this.in_re_list(color, "conn", addr)) { - this.rdns_store_results(connection, color, file); - return true; + file = this.cfg.re[color].conn + connection.logdebug(this, `checking ${addr} against ${file}`) + if (this.in_re_list(color, 'conn', addr)) { + this.rdns_store_results(connection, color, file) + return true } } - return false; -}; + return false +} exports.rdns_access = function (next, connection) { - if (!this.cfg.check.conn) return next(); + if (!this.cfg.check.conn) return next() - if (this.rdns_is_listed(connection, "white")) return next(); + if (this.rdns_is_listed(connection, 'white')) return next() - const deny_msg = `${connection.remote.host} [${connection.remote.ip}] ${this.cfg.deny_msg.conn}`; - if (this.rdns_is_listed(connection, "black")) - return next(DENYDISCONNECT, deny_msg); + const deny_msg = `${connection.remote.host} [${connection.remote.ip}] ${this.cfg.deny_msg.conn}` + if (this.rdns_is_listed(connection, 'black')) + return next(DENYDISCONNECT, deny_msg) - connection.results.add(this, { msg: "unlisted(conn)" }); - next(); -}; + connection.results.add(this, { msg: 'unlisted(conn)' }) + next() +} exports.helo_access = function (next, connection, helo) { - if (!this.cfg.check.helo) return next(); + if (!this.cfg.check.helo) return next() - const file = this.cfg.re.black.helo; - if (this.in_re_list("black", "helo", helo)) { - connection.results.add(this, { fail: file, emit: true }); - return next(DENY, `${helo} ${this.cfg.deny_msg.helo}`); + const file = this.cfg.re.black.helo + if (this.in_re_list('black', 'helo', helo)) { + connection.results.add(this, { fail: file, emit: true }) + return next(DENY, `${helo} ${this.cfg.deny_msg.helo}`) } - connection.results.add(this, { msg: "unlisted(helo)" }); - next(); -}; + connection.results.add(this, { msg: 'unlisted(helo)' }) + next() +} exports.mail_from_access = function (next, connection, params) { - if (!this.cfg.check.mail) return next(); + if (!this.cfg.check.mail) return next() - const mail_from = params[0].address(); + const mail_from = params[0].address() if (!mail_from) { connection.transaction.results.add(this, { - skip: "null sender", + skip: 'null sender', emit: true, - }); - return next(); + }) + return next() } // address whitelist checks - let file = this.cfg.white.mail; - connection.logdebug(this, `checking ${mail_from} against ${file}`); - if (this.in_list("white", "mail", mail_from)) { - connection.transaction.results.add(this, { pass: file, emit: true }); - return next(); + let file = this.cfg.white.mail + connection.logdebug(this, `checking ${mail_from} against ${file}`) + if (this.in_list('white', 'mail', mail_from)) { + connection.transaction.results.add(this, { pass: file, emit: true }) + return next() } - file = this.cfg.re.white.mail; - connection.logdebug(this, `checking ${mail_from} against ${file}`); - if (this.in_re_list("white", "mail", mail_from)) { - connection.transaction.results.add(this, { pass: file, emit: true }); - return next(); + file = this.cfg.re.white.mail + connection.logdebug(this, `checking ${mail_from} against ${file}`) + if (this.in_re_list('white', 'mail', mail_from)) { + connection.transaction.results.add(this, { pass: file, emit: true }) + return next() } // address blacklist checks - file = this.cfg.black.mail; - if (this.in_list("black", "mail", mail_from)) { - connection.transaction.results.add(this, { fail: file, emit: true }); - return next(DENY, `${mail_from} ${this.cfg.deny_msg.mail}`); + file = this.cfg.black.mail + if (this.in_list('black', 'mail', mail_from)) { + connection.transaction.results.add(this, { fail: file, emit: true }) + return next(DENY, `${mail_from} ${this.cfg.deny_msg.mail}`) } - file = this.cfg.re.black.mail; - connection.logdebug(this, `checking ${mail_from} against ${file}`); - if (this.in_re_list("black", "mail", mail_from)) { - connection.transaction.results.add(this, { fail: file, emit: true }); - return next(DENY, `${mail_from} ${this.cfg.deny_msg.mail}`); + file = this.cfg.re.black.mail + connection.logdebug(this, `checking ${mail_from} against ${file}`) + if (this.in_re_list('black', 'mail', mail_from)) { + connection.transaction.results.add(this, { fail: file, emit: true }) + return next(DENY, `${mail_from} ${this.cfg.deny_msg.mail}`) } - connection.transaction.results.add(this, { msg: "unlisted(mail)" }); - next(); -}; + connection.transaction.results.add(this, { msg: 'unlisted(mail)' }) + next() +} exports.rcpt_to_access = function (next, connection, params) { - if (!this.cfg.check.rcpt) return next(); + if (!this.cfg.check.rcpt) return next() - let pass_status = undefined; + let pass_status = undefined if (this.cfg.rcpt.accept) { - pass_status = OK; + pass_status = OK } - const rcpt_to = params[0].address(); + const rcpt_to = params[0].address() // address whitelist checks if (!rcpt_to) { connection.transaction.results.add(this, { - skip: "null rcpt", + skip: 'null rcpt', emit: true, - }); - return next(); + }) + return next() } - let file = this.cfg.white.rcpt; - if (this.in_list("white", "rcpt", rcpt_to)) { - connection.transaction.results.add(this, { pass: file, emit: true }); - return next(pass_status); + let file = this.cfg.white.rcpt + if (this.in_list('white', 'rcpt', rcpt_to)) { + connection.transaction.results.add(this, { pass: file, emit: true }) + return next(pass_status) } - file = this.cfg.re.white.rcpt; - if (this.in_re_list("white", "rcpt", rcpt_to)) { - connection.transaction.results.add(this, { pass: file, emit: true }); - return next(pass_status); + file = this.cfg.re.white.rcpt + if (this.in_re_list('white', 'rcpt', rcpt_to)) { + connection.transaction.results.add(this, { pass: file, emit: true }) + return next(pass_status) } // address blacklist checks - file = this.cfg.black.rcpt; - if (this.in_list("black", "rcpt", rcpt_to)) { - connection.transaction.results.add(this, { fail: file, emit: true }); - return next(DENY, `${rcpt_to} ${this.cfg.deny_msg.rcpt}`); + file = this.cfg.black.rcpt + if (this.in_list('black', 'rcpt', rcpt_to)) { + connection.transaction.results.add(this, { fail: file, emit: true }) + return next(DENY, `${rcpt_to} ${this.cfg.deny_msg.rcpt}`) } - file = this.cfg.re.black.rcpt; - if (this.in_re_list("black", "rcpt", rcpt_to)) { - connection.transaction.results.add(this, { fail: file, emit: true }); - return next(DENY, `${rcpt_to} ${this.cfg.deny_msg.rcpt}`); + file = this.cfg.re.black.rcpt + if (this.in_re_list('black', 'rcpt', rcpt_to)) { + connection.transaction.results.add(this, { fail: file, emit: true }) + return next(DENY, `${rcpt_to} ${this.cfg.deny_msg.rcpt}`) } - connection.transaction.results.add(this, { msg: "unlisted(rcpt)" }); - next(); -}; + connection.transaction.results.add(this, { msg: 'unlisted(rcpt)' }) + next() +} exports.data_any = function (next, connection) { if (!this.cfg.check.data && !this.cfg.check.any) { - connection.transaction.results.add(this, { skip: "data(disabled)" }); - return next(); + connection.transaction.results.add(this, { skip: 'data(disabled)' }) + return next() } - const hdr_from = connection.transaction.header.get_decoded("From"); + const hdr_from = connection.transaction.header.get_decoded('From') if (!hdr_from) { - connection.transaction.results.add(this, { fail: "data(missing_from)" }); - return next(); + connection.transaction.results.add(this, { fail: 'data(missing_from)' }) + return next() } - let hdr_addr; + let hdr_addr try { - hdr_addr = haddr.parse(hdr_from)[0]; - } catch (e) { + hdr_addr = haddr.parse(hdr_from)[0] + } catch (ignore) { connection.transaction.results.add(this, { fail: `data(unparsable_from:${hdr_from})`, - }); - return next(); + }) + return next() } if (!hdr_addr) { connection.transaction.results.add(this, { fail: `data(unparsable_from:${hdr_from})`, - }); - return next(); + }) + return next() } - const hdr_dom = tlds.get_organizational_domain(hdr_addr.host()); + const hdr_dom = tlds.get_organizational_domain(hdr_addr.host()) if (!hdr_dom) { connection.transaction.results.add(this, { fail: `data(no_od_from:${hdr_addr})`, - }); - return next(); + }) + return next() } - const file = this.cfg.domain.any; - if (this.in_list("domain", "any", `!${hdr_dom}`)) { - connection.results.add(this, { pass: file, whitelist: true, emit: true }); - return next(); + const file = this.cfg.domain.any + if (this.in_list('domain', 'any', `!${hdr_dom}`)) { + connection.results.add(this, { pass: file, whitelist: true, emit: true }) + return next() } - if (this.in_list("domain", "any", hdr_dom)) { + if (this.in_list('domain', 'any', hdr_dom)) { connection.results.add(this, { fail: `${file}(${hdr_dom})`, blacklist: true, emit: true, - }); - return next(DENY, "Email from that domain is not accepted here."); + }) + return next(DENY, 'Email from that domain is not accepted here.') } - connection.results.add(this, { msg: "unlisted(any)" }); - next(); -}; + connection.results.add(this, { msg: 'unlisted(any)' }) + next() +} exports.in_list = function (type, phase, address) { if (this.list[type][phase] === undefined) { - console.log(`phase not defined: ${phase}`); - return false; + console.log(`phase not defined: ${phase}`) + return false } - if (!address) return false; - if (this.list[type][phase][address.toLowerCase()]) return true; - return false; -}; + if (!address) return false + if (this.list[type][phase][address.toLowerCase()]) return true + return false +} exports.in_re_list = function (type, phase, address) { if (!this.list_re[type][phase]) { - return false; + return false } if (!this.cfg.re[type][phase].source) { - this.logdebug(`empty file: ${this.cfg.re[type][phase]}`); + this.logdebug(`empty file: ${this.cfg.re[type][phase]}`) } else { this.logdebug( `checking ${address} against ` + `${this.cfg.re[type][phase].source}`, - ); + ) } - return this.list_re[type][phase].test(address); -}; + return this.list_re[type][phase].test(address) +} exports.load_file = function (type, phase) { if (!this.cfg.check[phase]) { - this.logdebug(`skipping ${this.cfg[type][phase]}`); - return; + this.logdebug(`skipping ${this.cfg[type][phase]}`) + return } - const file_name = this.cfg[type][phase]; + const file_name = this.cfg[type][phase] // load config with a self-referential callback - const list = this.config.get(file_name, "list", () => { - this.load_file(type, phase); - }); + const list = this.config.get(file_name, 'list', () => { + this.load_file(type, phase) + }) // init the list store, type is white or black - if (!this.list) this.list = { type: {} }; - if (!this.list[type]) this.list[type] = {}; + if (!this.list) this.list = { type: {} } + if (!this.list[type]) this.list[type] = {} // toLower when loading spends a fraction of a second at load time // to save millions of seconds during run time. - const listAsHash = {}; // store as hash for speedy lookups + const listAsHash = {} // store as hash for speedy lookups for (const entry of list) { - listAsHash[entry.toLowerCase()] = true; + listAsHash[entry.toLowerCase()] = true } - this.list[type][phase] = listAsHash; -}; + this.list[type][phase] = listAsHash +} exports.load_re_file = function (type, phase) { if (!this.cfg.check[phase]) { - this.logdebug(`skipping ${this.cfg.re[type][phase]}`); - return; + this.logdebug(`skipping ${this.cfg.re[type][phase]}`) + return } - const plugin = this; + const plugin = this const regex_list = utils.valid_regexes( - plugin.config.get(plugin.cfg.re[type][phase], "list", () => { - plugin.load_re_file(type, phase); + plugin.config.get(plugin.cfg.re[type][phase], 'list', () => { + plugin.load_re_file(type, phase) }), - ); + ) // initialize the list store - if (!this.list_re) this.list_re = { type: {} }; - if (!this.list_re[type]) this.list_re[type] = {}; + if (!this.list_re) this.list_re = { type: {} } + if (!this.list_re[type]) this.list_re[type] = {} // compile the regexes at the designated location - this.list_re[type][phase] = new RegExp(`^(${regex_list.join("|")})$`, "i"); -}; + this.list_re[type][phase] = new RegExp(`^(${regex_list.join('|')})$`, 'i') +} exports.load_domain_file = function (type, phase) { if (!this.cfg.check[phase]) { - this.logdebug(`skipping ${this.cfg[type][phase]}`); - return; + this.logdebug(`skipping ${this.cfg[type][phase]}`) + return } - const file_name = this.cfg[type][phase]; - const list = this.config.get(file_name, "list", () => { - this.load_domain_file(type, phase); - }); + const file_name = this.cfg[type][phase] + const list = this.config.get(file_name, 'list', () => { + this.load_domain_file(type, phase) + }) // init the list store, if needed - if (!this.list) this.list = { type: {} }; - if (!this.list[type]) this.list[type] = {}; + if (!this.list) this.list = { type: {} } + if (!this.list[type]) this.list[type] = {} // lowercase list items at load (much faster than at run time) for (const entry of list) { - if (entry[0] === "!") { + if (entry[0] === '!') { // whitelist entry - this.list[type][phase][entry.toLowerCase()] = true; - continue; + this.list[type][phase][entry.toLowerCase()] = true + continue } if (/@/.test(entry[0])) { // email address - this.list[type][phase][entry.toLowerCase()] = true; - continue; + this.list[type][phase][entry.toLowerCase()] = true + continue } - const d = tlds.get_organizational_domain(entry); - if (!d) continue; - this.list[type][phase][d.toLowerCase()] = true; + const d = tlds.get_organizational_domain(entry) + if (!d) continue + this.list[type][phase][d.toLowerCase()] = true } -}; +} diff --git a/test/access.js b/test/access.js index cd894d3..0aca53b 100644 --- a/test/access.js +++ b/test/access.js @@ -1,573 +1,529 @@ -"use strict"; +'use strict' -const assert = require("assert"); -const path = require("path"); +const assert = require('assert') +const path = require('path') -const Address = require("address-rfc2821").Address; -const fixtures = require("haraka-test-fixtures"); +const Address = require('address-rfc2821').Address +const fixtures = require('haraka-test-fixtures') -describe("in_list", function () { +describe('in_list', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("../index"); - }); - - it("white, mail", function () { - const list = { "matt@exam.ple": true, "matt@example.com": true }; - this.plugin.cfg = { white: { mail: "test no file" } }; - this.plugin.list = { white: { mail: list } }; - assert.equal(true, this.plugin.in_list("white", "mail", "matt@exam.ple")); - assert.equal( - true, - this.plugin.in_list("white", "mail", "matt@example.com"), - ); - assert.equal(false, this.plugin.in_list("white", "mail", "matt@non-exist")); - }); - - it("white, mail, case", function () { - const list = { "matt@exam.ple": true, "matt@example.com": true }; - this.plugin.cfg = { white: { mail: "test no file" } }; - this.plugin.list = { white: { mail: list } }; - assert.equal(true, this.plugin.in_list("white", "mail", "MATT@exam.ple")); - }); - - it("white, rcpt", function () { - const list = { "matt@exam.ple": true, "matt@example.com": true }; - this.plugin.cfg = { re: { white: { rcpt: "test file name" } } }; - this.plugin.list = { white: { rcpt: list } }; - assert.equal(true, this.plugin.in_list("white", "rcpt", "matt@exam.ple")); - assert.equal( - true, - this.plugin.in_list("white", "rcpt", "matt@example.com"), - ); - assert.equal(false, this.plugin.in_list("white", "rcpt", "matt@non-exist")); - }); - - it("white, helo", function () { - const list = { "matt@exam.ple": true, "matt@example.com": true }; - this.plugin.cfg = { re: { white: { helo: "test file name" } } }; - this.plugin.list = { white: { helo: list } }; - assert.equal(true, this.plugin.in_list("white", "helo", "matt@exam.ple")); - assert.equal( - true, - this.plugin.in_list("white", "helo", "matt@example.com"), - ); - assert.equal(false, this.plugin.in_list("white", "helo", "matt@non-exist")); - }); - - it("black, mail", function () { - const list = { "matt@exam.ple": true, "matt@example.com": true }; - this.plugin.cfg = { re: { black: { mail: "test file name" } } }; - this.plugin.list = { black: { mail: list } }; - assert.equal(true, this.plugin.in_list("black", "mail", "matt@exam.ple")); - assert.equal( - true, - this.plugin.in_list("black", "mail", "matt@example.com"), - ); - assert.equal(false, this.plugin.in_list("black", "mail", "matt@non-exist")); - }); - - it("black, rcpt", function () { - const list = { "matt@exam.ple": true, "matt@example.com": true }; - this.plugin.cfg = { re: { black: { rcpt: "test file name" } } }; - this.plugin.list = { black: { rcpt: list } }; - assert.equal(true, this.plugin.in_list("black", "rcpt", "matt@exam.ple")); - assert.equal( - true, - this.plugin.in_list("black", "rcpt", "matt@example.com"), - ); - assert.equal(false, this.plugin.in_list("black", "rcpt", "matt@non-exist")); - }); - - it("black, helo", function () { - const list = { "matt@exam.ple": true, "matt@example.com": true }; - this.plugin.cfg = { re: { black: { helo: "test file name" } } }; - this.plugin.list = { black: { helo: list } }; - assert.equal(true, this.plugin.in_list("black", "helo", "matt@exam.ple")); - assert.equal( - true, - this.plugin.in_list("black", "helo", "matt@example.com"), - ); - assert.equal(false, this.plugin.in_list("black", "helo", "matt@non-exist")); - }); -}); - -describe("in_re_list", function () { + this.plugin = new fixtures.plugin('../index') + }) + + it('white, mail', function () { + const list = { 'matt@exam.ple': true, 'matt@example.com': true } + this.plugin.cfg = { white: { mail: 'test no file' } } + this.plugin.list = { white: { mail: list } } + assert.equal(true, this.plugin.in_list('white', 'mail', 'matt@exam.ple')) + assert.equal(true, this.plugin.in_list('white', 'mail', 'matt@example.com')) + assert.equal(false, this.plugin.in_list('white', 'mail', 'matt@non-exist')) + }) + + it('white, mail, case', function () { + const list = { 'matt@exam.ple': true, 'matt@example.com': true } + this.plugin.cfg = { white: { mail: 'test no file' } } + this.plugin.list = { white: { mail: list } } + assert.equal(true, this.plugin.in_list('white', 'mail', 'MATT@exam.ple')) + }) + + it('white, rcpt', function () { + const list = { 'matt@exam.ple': true, 'matt@example.com': true } + this.plugin.cfg = { re: { white: { rcpt: 'test file name' } } } + this.plugin.list = { white: { rcpt: list } } + assert.equal(true, this.plugin.in_list('white', 'rcpt', 'matt@exam.ple')) + assert.equal(true, this.plugin.in_list('white', 'rcpt', 'matt@example.com')) + assert.equal(false, this.plugin.in_list('white', 'rcpt', 'matt@non-exist')) + }) + + it('white, helo', function () { + const list = { 'matt@exam.ple': true, 'matt@example.com': true } + this.plugin.cfg = { re: { white: { helo: 'test file name' } } } + this.plugin.list = { white: { helo: list } } + assert.equal(true, this.plugin.in_list('white', 'helo', 'matt@exam.ple')) + assert.equal(true, this.plugin.in_list('white', 'helo', 'matt@example.com')) + assert.equal(false, this.plugin.in_list('white', 'helo', 'matt@non-exist')) + }) + + it('black, mail', function () { + const list = { 'matt@exam.ple': true, 'matt@example.com': true } + this.plugin.cfg = { re: { black: { mail: 'test file name' } } } + this.plugin.list = { black: { mail: list } } + assert.equal(true, this.plugin.in_list('black', 'mail', 'matt@exam.ple')) + assert.equal(true, this.plugin.in_list('black', 'mail', 'matt@example.com')) + assert.equal(false, this.plugin.in_list('black', 'mail', 'matt@non-exist')) + }) + + it('black, rcpt', function () { + const list = { 'matt@exam.ple': true, 'matt@example.com': true } + this.plugin.cfg = { re: { black: { rcpt: 'test file name' } } } + this.plugin.list = { black: { rcpt: list } } + assert.equal(true, this.plugin.in_list('black', 'rcpt', 'matt@exam.ple')) + assert.equal(true, this.plugin.in_list('black', 'rcpt', 'matt@example.com')) + assert.equal(false, this.plugin.in_list('black', 'rcpt', 'matt@non-exist')) + }) + + it('black, helo', function () { + const list = { 'matt@exam.ple': true, 'matt@example.com': true } + this.plugin.cfg = { re: { black: { helo: 'test file name' } } } + this.plugin.list = { black: { helo: list } } + assert.equal(true, this.plugin.in_list('black', 'helo', 'matt@exam.ple')) + assert.equal(true, this.plugin.in_list('black', 'helo', 'matt@example.com')) + assert.equal(false, this.plugin.in_list('black', 'helo', 'matt@non-exist')) + }) +}) + +describe('in_re_list', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("access"); - }); + this.plugin = new fixtures.plugin('access') + }) - it("white, mail", function () { - const list = [".*exam.ple", ".*example.com"]; - this.plugin.cfg = { re: { white: { mail: "test file name" } } }; + it('white, mail', function () { + const list = ['.*exam.ple', '.*example.com'] + this.plugin.cfg = { re: { white: { mail: 'test file name' } } } this.plugin.list_re = { - white: { mail: new RegExp(`^(${list.join("|")})$`, "i") }, - }; + white: { mail: new RegExp(`^(${list.join('|')})$`, 'i') }, + } + assert.equal(true, this.plugin.in_re_list('white', 'mail', 'matt@exam.ple')) assert.equal( true, - this.plugin.in_re_list("white", "mail", "matt@exam.ple"), - ); - assert.equal( - true, - this.plugin.in_re_list("white", "mail", "matt@example.com"), - ); + this.plugin.in_re_list('white', 'mail', 'matt@example.com'), + ) assert.equal( false, - this.plugin.in_re_list("white", "mail", "matt@non-exist"), - ); - }); + this.plugin.in_re_list('white', 'mail', 'matt@non-exist'), + ) + }) - it("white, rcpt", function () { - const list = [".*exam.ple", ".*example.com"]; - this.plugin.cfg = { re: { white: { rcpt: "test file name" } } }; + it('white, rcpt', function () { + const list = ['.*exam.ple', '.*example.com'] + this.plugin.cfg = { re: { white: { rcpt: 'test file name' } } } this.plugin.list_re = { - white: { rcpt: new RegExp(`^(${list.join("|")})$`, "i") }, - }; - assert.equal( - true, - this.plugin.in_re_list("white", "rcpt", "matt@exam.ple"), - ); + white: { rcpt: new RegExp(`^(${list.join('|')})$`, 'i') }, + } + assert.equal(true, this.plugin.in_re_list('white', 'rcpt', 'matt@exam.ple')) assert.equal( true, - this.plugin.in_re_list("white", "rcpt", "matt@example.com"), - ); + this.plugin.in_re_list('white', 'rcpt', 'matt@example.com'), + ) assert.equal( false, - this.plugin.in_re_list("white", "rcpt", "matt@non-exist"), - ); - }); + this.plugin.in_re_list('white', 'rcpt', 'matt@non-exist'), + ) + }) - it("white, helo", function () { - const list = [".*exam.ple", ".*example.com"]; - this.plugin.cfg = { re: { white: { helo: "test file name" } } }; + it('white, helo', function () { + const list = ['.*exam.ple', '.*example.com'] + this.plugin.cfg = { re: { white: { helo: 'test file name' } } } this.plugin.list_re = { - white: { helo: new RegExp(`^(${list.join("|")})$`, "i") }, - }; - assert.equal( - true, - this.plugin.in_re_list("white", "helo", "matt@exam.ple"), - ); + white: { helo: new RegExp(`^(${list.join('|')})$`, 'i') }, + } + assert.equal(true, this.plugin.in_re_list('white', 'helo', 'matt@exam.ple')) assert.equal( true, - this.plugin.in_re_list("white", "helo", "matt@example.com"), - ); + this.plugin.in_re_list('white', 'helo', 'matt@example.com'), + ) assert.equal( false, - this.plugin.in_re_list("white", "helo", "matt@non-exist"), - ); - }); + this.plugin.in_re_list('white', 'helo', 'matt@non-exist'), + ) + }) - it("black, mail", function () { - const list = [".*exam.ple", ".*example.com"]; - this.plugin.cfg = { re: { black: { mail: "test file name" } } }; + it('black, mail', function () { + const list = ['.*exam.ple', '.*example.com'] + this.plugin.cfg = { re: { black: { mail: 'test file name' } } } this.plugin.list_re = { - black: { mail: new RegExp(`^(${list.join("|")})$`, "i") }, - }; + black: { mail: new RegExp(`^(${list.join('|')})$`, 'i') }, + } + assert.equal(true, this.plugin.in_re_list('black', 'mail', 'matt@exam.ple')) assert.equal( true, - this.plugin.in_re_list("black", "mail", "matt@exam.ple"), - ); - assert.equal( - true, - this.plugin.in_re_list("black", "mail", "matt@example.com"), - ); + this.plugin.in_re_list('black', 'mail', 'matt@example.com'), + ) assert.equal( false, - this.plugin.in_re_list("black", "mail", "matt@non-exist"), - ); - }); + this.plugin.in_re_list('black', 'mail', 'matt@non-exist'), + ) + }) - it("black, rcpt", function () { - const list = [".*exam.ple", ".*example.com"]; - this.plugin.cfg = { re: { black: { rcpt: "test file name" } } }; + it('black, rcpt', function () { + const list = ['.*exam.ple', '.*example.com'] + this.plugin.cfg = { re: { black: { rcpt: 'test file name' } } } this.plugin.list_re = { - black: { rcpt: new RegExp(`^(${list.join("|")})$`, "i") }, - }; - assert.equal( - true, - this.plugin.in_re_list("black", "rcpt", "matt@exam.ple"), - ); + black: { rcpt: new RegExp(`^(${list.join('|')})$`, 'i') }, + } + assert.equal(true, this.plugin.in_re_list('black', 'rcpt', 'matt@exam.ple')) assert.equal( true, - this.plugin.in_re_list("black", "rcpt", "matt@example.com"), - ); + this.plugin.in_re_list('black', 'rcpt', 'matt@example.com'), + ) assert.equal( false, - this.plugin.in_re_list("black", "rcpt", "matt@non-exist"), - ); - }); + this.plugin.in_re_list('black', 'rcpt', 'matt@non-exist'), + ) + }) - it("black, helo", function () { - const list = [".*exam.ple", ".*example.com"]; - this.plugin.cfg = { re: { black: { helo: "test file name" } } }; + it('black, helo', function () { + const list = ['.*exam.ple', '.*example.com'] + this.plugin.cfg = { re: { black: { helo: 'test file name' } } } this.plugin.list_re = { - black: { helo: new RegExp(`^(${list.join("|")})$`, "i") }, - }; - assert.equal( - true, - this.plugin.in_re_list("black", "helo", "matt@exam.ple"), - ); + black: { helo: new RegExp(`^(${list.join('|')})$`, 'i') }, + } + assert.equal(true, this.plugin.in_re_list('black', 'helo', 'matt@exam.ple')) assert.equal( true, - this.plugin.in_re_list("black", "helo", "matt@example.com"), - ); + this.plugin.in_re_list('black', 'helo', 'matt@example.com'), + ) assert.equal( false, - this.plugin.in_re_list("black", "helo", "matt@non-exist"), - ); - }); -}); + this.plugin.in_re_list('black', 'helo', 'matt@non-exist'), + ) + }) +}) -describe("load_file", function () { +describe('load_file', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("access"); + this.plugin = new fixtures.plugin('access') this.plugin.config = this.plugin.config.module_config( path.resolve(__dirname), - ); - this.plugin.register(); - }); + ) + this.plugin.register() + }) - it("case normalizing", function () { + it('case normalizing', function () { // console.log(this.plugin.config.root_path); - this.plugin.load_file("white", "rcpt"); + this.plugin.load_file('white', 'rcpt') assert.equal( true, - this.plugin.in_list("white", "rcpt", "admin2@example.com"), - ); + this.plugin.in_list('white', 'rcpt', 'admin2@example.com'), + ) assert.equal( true, - this.plugin.in_list("white", "rcpt", "admin2@example.com"), - ); // was ADMIN2@EXAMPLE.com + this.plugin.in_list('white', 'rcpt', 'admin2@example.com'), + ) // was ADMIN2@EXAMPLE.com assert.equal( true, - this.plugin.in_list("white", "rcpt", "admin1@example.com"), - ); // was admin3@EXAMPLE.com - }); -}); + this.plugin.in_list('white', 'rcpt', 'admin1@example.com'), + ) // was admin3@EXAMPLE.com + }) +}) -describe("load_re_file", function () { +describe('load_re_file', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("access"); + this.plugin = new fixtures.plugin('access') this.plugin.config = this.plugin.config.module_config( path.resolve(__dirname), - ); - this.plugin.register(); - }); + ) + this.plugin.register() + }) - it("whitelist", function () { - this.plugin.load_re_file("white", "mail"); - assert.ok(this.plugin.list_re); + it('whitelist', function () { + this.plugin.load_re_file('white', 'mail') + assert.ok(this.plugin.list_re) // console.log(this.plugin.temp); assert.equal( true, - this.plugin.in_re_list("white", "mail", "list@harakamail.com"), - ); + this.plugin.in_re_list('white', 'mail', 'list@harakamail.com'), + ) assert.equal( false, - this.plugin.in_re_list("white", "mail", "list@harail.com"), - ); + this.plugin.in_re_list('white', 'mail', 'list@harail.com'), + ) assert.equal( false, - this.plugin.in_re_list("white", "mail", "LIST@harail.com"), - ); - }); -}); + this.plugin.in_re_list('white', 'mail', 'LIST@harail.com'), + ) + }) +}) -describe("rdns_access", function () { +describe('rdns_access', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("access"); + this.plugin = new fixtures.plugin('access') this.plugin.config = this.plugin.config.module_config( path.resolve(__dirname), - ); - this.plugin.register(); - this.connection = fixtures.connection.createConnection(); - this.connection.init_transaction(); - }); - - it("no list", function (done) { - this.connection.remote.ip = "1.1.1.1"; - this.connection.remote.host = "host.example.com"; + ) + this.plugin.register() + this.connection = fixtures.connection.createConnection() + this.connection.init_transaction() + }) + + it('no list', function (done) { + this.connection.remote.ip = '1.1.1.1' + this.connection.remote.host = 'host.example.com' this.plugin.rdns_access((rc) => { // console.log(this.connection.results.get('access')); - assert.equal(undefined, rc); - assert.ok(this.connection.results.get("access").msg.length); - done(); - }, this.connection); - }); - - it("whitelist", function (done) { - this.connection.remote.ip = "1.1.1.1"; - this.connection.remote.host = "host.example.com"; - this.plugin.list.white.conn["host.example.com"] = true; + assert.equal(undefined, rc) + assert.ok(this.connection.results.get('access').msg.length) + done() + }, this.connection) + }) + + it('whitelist', function (done) { + this.connection.remote.ip = '1.1.1.1' + this.connection.remote.host = 'host.example.com' + this.plugin.list.white.conn['host.example.com'] = true this.plugin.rdns_access((rc) => { - assert.equal(undefined, rc); - assert.ok(this.connection.results.get("access").pass.length); + assert.equal(undefined, rc) + assert.ok(this.connection.results.get('access').pass.length) // assert.ok(this.connection.results.has('access', 'pass', /white/)); - done(); - }, this.connection); - }); - - it("blacklist", function (done) { - this.connection.remote.ip = "1.1.1.1"; - this.connection.remote.host = "host.example.com"; - this.plugin.list.black.conn["host.example.com"] = true; + done() + }, this.connection) + }) + + it('blacklist', function (done) { + this.connection.remote.ip = '1.1.1.1' + this.connection.remote.host = 'host.example.com' + this.plugin.list.black.conn['host.example.com'] = true this.plugin.rdns_access((rc, msg) => { - assert.equal(DENYDISCONNECT, rc); + assert.equal(DENYDISCONNECT, rc) assert.equal( - "host.example.com [1.1.1.1] You are not allowed to connect", + 'host.example.com [1.1.1.1] You are not allowed to connect', msg, - ); - assert.ok(this.connection.results.get("access").fail.length); - done(); - }, this.connection); - }); - - it("blacklist regex", function (done) { - this.connection.remote.ip = "1.1.1.1"; - this.connection.remote.host = "host.antispam.com"; - const black = [".*spam.com"]; - this.plugin.list_re.black.conn = new RegExp(`^(${black.join("|")})$`, "i"); + ) + assert.ok(this.connection.results.get('access').fail.length) + done() + }, this.connection) + }) + + it('blacklist regex', function (done) { + this.connection.remote.ip = '1.1.1.1' + this.connection.remote.host = 'host.antispam.com' + const black = ['.*spam.com'] + this.plugin.list_re.black.conn = new RegExp(`^(${black.join('|')})$`, 'i') this.plugin.rdns_access((rc, msg) => { - assert.equal(DENYDISCONNECT, rc); + assert.equal(DENYDISCONNECT, rc) assert.equal( - "host.antispam.com [1.1.1.1] You are not allowed to connect", + 'host.antispam.com [1.1.1.1] You are not allowed to connect', msg, - ); - assert.ok(this.connection.results.get("access").fail.length); - done(); - }, this.connection); - }); -}); - -describe("helo_access", function () { + ) + assert.ok(this.connection.results.get('access').fail.length) + done() + }, this.connection) + }) +}) + +describe('helo_access', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("access"); + this.plugin = new fixtures.plugin('access') this.plugin.config = this.plugin.config.module_config( path.resolve(__dirname), - ); - this.plugin.register(); - this.connection = fixtures.connection.createConnection(); - }); + ) + this.plugin.register() + this.connection = fixtures.connection.createConnection() + }) - it("no list", function (done) { - this.plugin.cfg.check.helo = true; + it('no list', function (done) { + this.plugin.cfg.check.helo = true this.plugin.helo_access( (rc) => { - const r = this.connection.results.get("access"); - assert.equal(undefined, rc); - assert.ok(r && r.msg && r.msg.length); - done(); + const r = this.connection.results.get('access') + assert.equal(undefined, rc) + assert.ok(r && r.msg && r.msg.length) + done() }, this.connection, - "host.example.com", - ); - }); - - it("blacklisted regex", function (done) { - const black = [".*spam.com"]; - this.plugin.list_re.black.helo = new RegExp(`^(${black.join("|")})$`, "i"); - this.plugin.cfg.check.helo = true; + 'host.example.com', + ) + }) + + it('blacklisted regex', function (done) { + const black = ['.*spam.com'] + this.plugin.list_re.black.helo = new RegExp(`^(${black.join('|')})$`, 'i') + this.plugin.cfg.check.helo = true this.plugin.helo_access( (rc) => { - assert.equal(DENY, rc); - const r = this.connection.results.get("access"); - assert.ok(r && r.fail && r.fail.length); - done(); + assert.equal(DENY, rc) + const r = this.connection.results.get('access') + assert.ok(r && r.fail && r.fail.length) + done() }, this.connection, - "bad.spam.com", - ); - }); -}); + 'bad.spam.com', + ) + }) +}) -describe("mail_from_access", function () { +describe('mail_from_access', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("access"); + this.plugin = new fixtures.plugin('access') this.plugin.config = this.plugin.config.module_config( path.resolve(__dirname), - ); - this.plugin.register(); - this.connection = fixtures.connection.createConnection(); - this.connection.init_transaction(); - }); + ) + this.plugin.register() + this.connection = fixtures.connection.createConnection() + this.connection.init_transaction() + }) - it("no lists populated", function (done) { + it('no lists populated', function (done) { this.plugin.mail_from_access( (rc) => { - assert.equal(undefined, rc); - assert.ok(this.connection.transaction.results.get("access").msg.length); - done(); + assert.equal(undefined, rc) + assert.ok(this.connection.transaction.results.get('access').msg.length) + done() }, this.connection, - [new Address("")], - ); - }); + [new Address('')], + ) + }) - it("whitelisted addr", function (done) { - this.plugin.list.white.mail["list@harakamail.com"] = true; + it('whitelisted addr', function (done) { + this.plugin.list.white.mail['list@harakamail.com'] = true this.plugin.mail_from_access( (rc) => { - assert.equal(undefined, rc); - assert.ok( - this.connection.transaction.results.get("access").pass.length, - ); - done(); + assert.equal(undefined, rc) + assert.ok(this.connection.transaction.results.get('access').pass.length) + done() }, this.connection, - [new Address("")], - ); - }); + [new Address('')], + ) + }) - it("blacklisted addr", function (done) { - this.plugin.list.black.mail["list@badmail.com"] = true; + it('blacklisted addr', function (done) { + this.plugin.list.black.mail['list@badmail.com'] = true this.plugin.mail_from_access( (rc) => { - assert.equal(DENY, rc); - assert.ok( - this.connection.transaction.results.get("access").fail.length, - ); - done(); + assert.equal(DENY, rc) + assert.ok(this.connection.transaction.results.get('access').fail.length) + done() }, this.connection, - [new Address("")], - ); - }); + [new Address('')], + ) + }) - it("blacklisted domain", function (done) { - const black = [".*@spam.com"]; - this.plugin.list_re.black.mail = new RegExp(`^(${black.join("|")})$`, "i"); + it('blacklisted domain', function (done) { + const black = ['.*@spam.com'] + this.plugin.list_re.black.mail = new RegExp(`^(${black.join('|')})$`, 'i') this.plugin.mail_from_access( (rc) => { - assert.equal(DENY, rc); - assert.ok( - this.connection.transaction.results.get("access").fail.length, - ); - done(); + assert.equal(DENY, rc) + assert.ok(this.connection.transaction.results.get('access').fail.length) + done() }, this.connection, - [new Address("")], - ); - }); - - it("blacklisted domain, white addr", function (done) { - this.plugin.list.white.mail["special@spam.com"] = true; - const black = [".*@spam.com"]; - this.plugin.list_re.black.mail = new RegExp(`^(${black.join("|")})$`, "i"); + [new Address('')], + ) + }) + + it('blacklisted domain, white addr', function (done) { + this.plugin.list.white.mail['special@spam.com'] = true + const black = ['.*@spam.com'] + this.plugin.list_re.black.mail = new RegExp(`^(${black.join('|')})$`, 'i') this.plugin.mail_from_access( (rc) => { - assert.equal(undefined, rc); - assert.ok( - this.connection.transaction.results.get("access").pass.length, - ); - done(); + assert.equal(undefined, rc) + assert.ok(this.connection.transaction.results.get('access').pass.length) + done() }, this.connection, - [new Address("")], - ); - }); -}); + [new Address('')], + ) + }) +}) -describe("rcpt_to_access", function () { +describe('rcpt_to_access', function () { beforeEach(function () { - this.plugin = new fixtures.plugin("access"); + this.plugin = new fixtures.plugin('access') this.plugin.config = this.plugin.config.module_config( path.resolve(__dirname), - ); - this.plugin.register(); - this.connection = fixtures.connection.createConnection(); - this.connection.init_transaction(); - }); + ) + this.plugin.register() + this.connection = fixtures.connection.createConnection() + this.connection.init_transaction() + }) - it("no lists populated", function (done) { + it('no lists populated', function (done) { const cb = function (rc) { - assert.equal(undefined, rc); - assert.ok(this.connection.transaction.results.get("access").msg.length); - done(); - }.bind(this); + assert.equal(undefined, rc) + assert.ok(this.connection.transaction.results.get('access').msg.length) + done() + }.bind(this) this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); - }); + new Address(''), + ]) + }) - it("whitelisted addr", function (done) { - let calls = 0; + it('whitelisted addr', function (done) { + let calls = 0 const cb = function (rc) { - assert.equal(undefined, rc); - assert.ok(this.connection.transaction.results.get("access").pass.length); + assert.equal(undefined, rc) + assert.ok(this.connection.transaction.results.get('access').pass.length) if (++calls == 2) { - done(); + done() } - }.bind(this); - this.plugin.list.white.rcpt["user@example.com"] = true; + }.bind(this) + this.plugin.list.white.rcpt['user@example.com'] = true this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); + new Address(''), + ]) this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); - }); + new Address(''), + ]) + }) - it("whitelisted addr, accept enabled", function (done) { + it('whitelisted addr, accept enabled', function (done) { const cb = function (rc) { - assert.equal(OK, rc); - assert.ok(this.connection.transaction.results.get("access").pass.length); - done(); - }.bind(this); - this.plugin.cfg.rcpt.accept = true; - this.plugin.list.white.rcpt["user@example.com"] = true; + assert.equal(OK, rc) + assert.ok(this.connection.transaction.results.get('access').pass.length) + done() + }.bind(this) + this.plugin.cfg.rcpt.accept = true + this.plugin.list.white.rcpt['user@example.com'] = true this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); - }); + new Address(''), + ]) + }) - it("regex whitelisted addr, accept enabled", function (done) { + it('regex whitelisted addr, accept enabled', function (done) { const cb = function (rc) { - assert.equal(OK, rc); - assert.ok(this.connection.transaction.results.get("access").pass.length); - done(); - }.bind(this); - this.plugin.cfg.rcpt.accept = true; - this.plugin.list_re.white.rcpt = new RegExp(`^user@example.com$`, "i"); + assert.equal(OK, rc) + assert.ok(this.connection.transaction.results.get('access').pass.length) + done() + }.bind(this) + this.plugin.cfg.rcpt.accept = true + this.plugin.list_re.white.rcpt = new RegExp(`^user@example.com$`, 'i') this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); - }); + new Address(''), + ]) + }) - it("blacklisted addr", function (done) { + it('blacklisted addr', function (done) { const cb = function (rc) { - assert.equal(DENY, rc); - assert.ok(this.connection.transaction.results.get("access").fail.length); - done(); - }.bind(this); - this.plugin.list.black.rcpt["user@badmail.com"] = true; + assert.equal(DENY, rc) + assert.ok(this.connection.transaction.results.get('access').fail.length) + done() + }.bind(this) + this.plugin.list.black.rcpt['user@badmail.com'] = true this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); - }); + new Address(''), + ]) + }) - it("blacklisted domain", function (done) { + it('blacklisted domain', function (done) { const cb = function (rc) { - assert.equal(DENY, rc); - assert.ok(this.connection.transaction.results.get("access").fail.length); - done(); - }.bind(this); - const black = [".*@spam.com"]; - this.plugin.list_re.black.rcpt = new RegExp(`^(${black.join("|")})$`, "i"); + assert.equal(DENY, rc) + assert.ok(this.connection.transaction.results.get('access').fail.length) + done() + }.bind(this) + const black = ['.*@spam.com'] + this.plugin.list_re.black.rcpt = new RegExp(`^(${black.join('|')})$`, 'i') this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); - }); + new Address(''), + ]) + }) - it("blacklisted domain, white addr", function (done) { + it('blacklisted domain, white addr', function (done) { const cb = function (rc) { - assert.equal(undefined, rc); - assert.ok(this.connection.transaction.results.get("access").pass.length); - done(); - }.bind(this); - this.plugin.list.white.rcpt["special@spam.com"] = true; - const black = [".*@spam.com"]; - this.plugin.list_re.black.rcpt = new RegExp(`^(${black.join("|")})$`, "i"); + assert.equal(undefined, rc) + assert.ok(this.connection.transaction.results.get('access').pass.length) + done() + }.bind(this) + this.plugin.list.white.rcpt['special@spam.com'] = true + const black = ['.*@spam.com'] + this.plugin.list_re.black.rcpt = new RegExp(`^(${black.join('|')})$`, 'i') this.plugin.rcpt_to_access(cb, this.connection, [ - new Address(""), - ]); - }); -}); + new Address(''), + ]) + }) +})