From 88b28270c5885701b81a3e5e088c88c324e20735 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Thu, 28 Jul 2016 05:13:38 +0000
Subject: [PATCH] Add nodelist support.  Addresses and port numbers will now be
 pulled from the nodelist if specified in the ftn_domains.ini file via the
 NodeList key.

---
 exec/binkit.js           | 15 +++++--------
 exec/load/binkp.js       |  2 +-
 exec/load/fido.js        | 48 ++++++++++++++++++++++++++++++++++------
 exec/load/fido_syscfg.js |  3 +++
 4 files changed, 51 insertions(+), 17 deletions(-)

diff --git a/exec/binkit.js b/exec/binkit.js
index 50a002694f..0e6150d9a2 100644
--- a/exec/binkit.js
+++ b/exec/binkit.js
@@ -116,7 +116,7 @@ function outbound_root(addr, scfg, ftnd)
 function add_outbound_files(addrs, bp)
 {
 	function has_lock(addr) {
-		var bsy = outbound_root(addr, bp.cb_data.binkit_scfg, bp.cb_data.binkit_ftnd)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'bsy';
+		var bsy = outbound_root(addr, bp.cb_data.binkit_scfg, FIDO.FTNDomains)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'bsy';
 		var i;
 
 		for (i=0; i<bp.cb_data.binkit_locks.length; i++) {
@@ -131,11 +131,11 @@ function add_outbound_files(addrs, bp)
 
 		log(LOG_DEBUG, "Adding outbound files for "+addr);
 		// Find all possible flow files for the remote.
-		var allfiles = directory(outbound_root(addr, bp.cb_data.binkit_scfg, bp.cb_data.binkit_ftnd)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'*');
+		var allfiles = directory(outbound_root(addr, bp.cb_data.binkit_scfg, FIDO.FTNDomains)+addr.flo_outbound(bp.default_zone, bp.default_domain)+'*');
 		// Parse flow files and call addFile() tracking what to do on success.
 		if (allfiles.length > 0) {
 			if (!has_lock(addr)) {
-				lock_files = lock_flow(outbound_root(addr, bp.cb_data.binkit_scfg, bp.cb_data.binkit_ftnd)+addr.flo_outbound(bp.default_zone, bp.default_domain));
+				lock_files = lock_flow(outbound_root(addr, bp.cb_data.binkit_scfg, FIDO.FTNDomains)+addr.flo_outbound(bp.default_zone, bp.default_domain));
 				if (lock_files === undefined)
 					return;
 				bp.cb_data.binkit_locks.push(lock_files);
@@ -501,7 +501,6 @@ function callout(addr, scfg, ftnd, semaphores, locks, bicfg)
 		binkitcfg:bicfg,
 		binkit_to_addr:addr,
 		binkit_scfg:scfg,
-		binkit_ftnd:ftnd,
 		binkit_file_actions:{},
 		binkit_flow_contents:{},
 		binkit_create_semaphores:semaphores,
@@ -714,15 +713,14 @@ function run_outbound(ran)
 
 	log(LOG_INFO, "Running outbound");
 	scfg = new SBBSEchoCfg();
-	ftnd = new FTNDomains();
 
 	if (!scfg.is_flo) {
 		log(LOG_ERROR, "sbbsecho not configured for FLO-style mailers.");
 		return false;
 	}
 	outbound_roots.push(scfg.outbound.replace(/[\\\/]$/, ''));
-	Object.keys(ftnd.outboundMap).forEach(function(key) {
-		outbound_roots.push(ftnd.outboundMap[key]);
+	Object.keys(FIDO.FTNDomains.outboundMap).forEach(function(key) {
+		outbound_roots.push(FIDO.FTNDomains.outboundMap[key]);
 	});
 	outbound_roots.forEach(function(oroot) {
 		var dirs;
@@ -760,7 +758,7 @@ function run_outbound(ran)
 		});
 	});
 	outbound_dirs.forEach(function(dir) {
-		run_one_outbound_dir(dir, scfg, ftnd, semaphores, ran);
+		run_one_outbound_dir(dir, scfg, FIDO.FTNDomains, semaphores, ran);
 	});
 
 	semaphores.forEach(function(semname) {
@@ -846,7 +844,6 @@ function run_inbound(sock)
 	bp.cb_data = {
 		binkitcfg:new BinkITCfg(),
 		binkit_scfg:new SBBSEchoCfg(),
-		binkit_ftnd:new FTNDomains(),
 		binkit_file_actions:{},
 		binkit_flow_contents:{},
 		binkit_create_semaphores:semaphores,
diff --git a/exec/load/binkp.js b/exec/load/binkp.js
index 235388605c..833eb0477e 100644
--- a/exec/load/binkp.js
+++ b/exec/load/binkp.js
@@ -384,7 +384,7 @@ BinkP.prototype.connect = function(addr, password, auth_cb, port, inet_host)
 	if (password === '-')
 		this.require_md5 = false;
 	if (port === undefined)
-		port = 24554;
+		port = addr.binkp_port;
 	if (inet_host === undefined)
 		inet_host = addr.inet_host;
 
diff --git a/exec/load/fido.js b/exec/load/fido.js
index aa744072a2..8a8b2626fc 100644
--- a/exec/load/fido.js
+++ b/exec/load/fido.js
@@ -13,7 +13,8 @@ require('fido_syscfg.js', 'FTNDomains');
  * 		These are type and value checked when assigned and throw an
  * 		exception when illegal.
  * 
- * 		inet_host	- Internet hostname at the binkp.net domain
+ * 		inet_host	- Internet hostname at the binkp.net domain or listed
+ * 					  in nodelist.
  * 		str			- Address as a string in the most possible dimensions
  * 		toString()	- Overrides the default... same as str
  * 		flo_outbound(default_zone, default_domain)
@@ -30,9 +31,10 @@ require('fido_syscfg.js', 'FTNDomains');
  * FIDO.parse_flo_file_path(path, default_zone, domain)
  * 		Parses a flo filename and path into the returned FIDO.Addr object.
  * 
- * FIDO.parse_nodelist(path, warn)
+ * FIDO.parse_nodelist(path, warn[, domain])
  * 		Parses a nodelist and returns an object with an entries object in
- * 		it containing all the nodelist entries (3D address is the key).
+ * 		it containing all the nodelist entries (4D address is the key
+ * 		unless domain is specified in which case 5D address is the key).
  * 		If warn is true, will warn on "illegal" values (per FTS-0005).
  */
 
@@ -209,13 +211,15 @@ var FIDO = {
 		this.hub = hub.str;
 		this.private = this.hold = this.down = false;
 	},
-	parse_nodelist:function(filename, warn)
+	parse_nodelist:function(filename, warn, domain)
 	{
 		var f = new File(filename);
 		var ret = {};
 
 		if (warn === undefined)
 			warn = false;
+		if (domain === undefined)
+			domain = '';
 
 		if (!f.open("r"))
 			throw("Unable to open '"+f.name+"'.");
@@ -248,6 +252,7 @@ var FIDO = {
 		var flags;
 		var flag;
 		var value;
+		node.domain = domain;
 		ret.entries = {};
 
 		while ((line = f.readln(2048))) {
@@ -448,12 +453,41 @@ Object.defineProperties(FIDO.Addr.prototype, {
 			if (this.zone === undefined)
 				throw('zone is undefined');
 
+			// TODO: These don't need to be loaded into different objects since we're doing 5D
+			if (FIDO.FTNDomains.nodeListFN[this.domain] !== undefined && file_exists(FIDO.FTNDomains.nodeListFN[this.domain])) {
+				if (FIDO.FTNDomains.nodeList[this.domain] === undefined)
+					FIDO.FTNDomains.nodeList[this.domain] = FIDO.parse_nodelist(FIDO.FTNDomains.nodeListFN[this.domain], false, this.domain);
+				if (FIDO.FTNDomains.nodeList[this.str] !== undefined) {
+					// TODO: Maybe support non-IBN stuff as well...
+					ret = FIDO.FTNDomains.nodeList[this.str].binkp_host;
+					if (ret !== undefined)
+						return ret;
+				}
+			}
+
 			if (this.point !== undefined)
 				ret += format("p%d", this.point);
 			ret += format("f%d.n%d.z%d.%s", this.node, this.net, this.zone, FIDO.FTNDomains.domainDNSMap[this.domain] === undefined ? '.example.com' : FIDO.FTNDomains.domainDNSMap[this.domain]);
 			return ret;
 		}
-	}
+	},
+	'binkp_port': {
+		get: function() {
+			// TODO: Use default zone from system.fido_addr_list[0]?
+			if (this.zone === undefined)
+				throw('zone is undefined');
+
+			// TODO: These don't need to be loaded into different objects since we're doing 5D
+			if (FIDO.FTNDomains.nodeListFN[this.domain] !== undefined && file_exists(FIDO.FTNDomains.nodeListFN[this.domain])) {
+				if (FIDO.FTNDomains.nodeList[this.domain] === undefined)
+					FIDO.FTNDomains.nodeList[this.domain] = FIDO.parse_nodelist(FIDO.FTNDomains.nodeListFN[this.domain], false, this.domain);
+				if (FIDO.FTNDomains.nodeList[this.str] !== undefined)
+					return FIDO.FTNDomains.nodeList[this.str].binkp_port;
+			}
+
+			return 24554;
+		}
+	},
 });
 FIDO.Packet.type = {
 	TWO:0,		// FTS-0001
@@ -503,7 +537,7 @@ Object.defineProperties(FIDO.Node.prototype, {
 				if (this.flags.IBN.search(/^[0-9]+$/) == -1) {
 					if (this.flags.IBN.indexOf(':' !== -1))
 						return this.flags.IBN.replace(/:.*$/,'');
-					return this.flags.IBN;
+					return this.flags.IBN.replace(/\.$/,'');
 				}
 			}
 			for (i in iflags) {
@@ -515,7 +549,7 @@ Object.defineProperties(FIDO.Node.prototype, {
 					continue;
 				if (this.flags[iflags[i]].indexOf(':') !== -1)
 					return this.flags[iflags[i]].replace(/:.*$/,'');
-				return this.flags[iflags[i]];
+				return this.flags[iflags[i]].replace(/\.$/,'');
 			}
 			if (this.name.indexOf('.') !== -1)
 				return this.name.replace(/ /, '_');
diff --git a/exec/load/fido_syscfg.js b/exec/load/fido_syscfg.js
index 0c3001691f..c76bceeef5 100644
--- a/exec/load/fido_syscfg.js
+++ b/exec/load/fido_syscfg.js
@@ -115,6 +115,8 @@ function FTNDomains()
 		this.domainMap = {};
 		this.domainDNSMap = {};
 		this.outboundMap = {};
+		this.nodeListFN = {};
+		this.nodeList = {};
 		var domains = f.iniGetSections().forEach(function(domain) {
 			var d = domain.toLowerCase().substr(0,8);
 			var zones = f.iniGetValue(domain, 'Zones', '');
@@ -134,6 +136,7 @@ function FTNDomains()
 				}, this);
 			}
 			this.domainDNSMap[d] = f.iniGetValue(domain, 'DNSSuffix', 'example.com');
+			this.nodeListFN[d] = f.iniGetValue(domain, 'NodeList', undefined);
 			this.outboundMap[d] = f.iniGetValue(domain, 'OutboundRoot', ecfg.outbound.replace(/[\\\/]$/, '')).replace(/[\\\/]$/, '');
 		}, this);
 		f.close();
-- 
GitLab