Skip to content
Snippets Groups Projects
Commit 66c623a3 authored by deuce's avatar deuce
Browse files

Split out the config parsing stuff into a separate load() file and generally

clean up the code.

Add a new (and non-functional) tickitcfg jsexec script for setting up the
configuration.
parent 7816e46c
No related branches found
No related tags found
No related merge requests found
function SBBSEchoCfg ()
{
var ecfg = new File(system.ctrl_dir+'sbbsecho.cfg');
var line;
var m;
this.inb = [];
this.pktpass = {};
this.is_flo = false;
this.outboud = undefined;
if (!ecfg.open("r"))
throw("Unable to open '"+ecfg.name+"'");
while ((line=ecfg.readln(65535)) != undefined) {
m = line.match(/^\s*(?:secure_)?inbound\s+(.*)$/i);
if (m !== null)
this.inb.push(backslash(m[1]));
m = line.match(/^\s*pktpwd\s+(.*?)\s+(.*)\s*$/i);
if (m !== null)
this.pktpass[m[1].toUpperCase()] = m[2].toUpperCase();
m = line.match(/^\s*outbound\s+(.*?)\s*$/i);
if (m !== null)
this.outbound = m[1];
m = line.match(/^\s*flo_mailer\s*$/i);
if (m !== null)
this.is_flo = true;
}
ecfg.close();
}
SBBSEchoCfg.prototype.get_pw = function(node)
{
var n = node;
while(n) {
if (this.pktpass[n] !== undefined)
return this.pktpass[n];
if (n === 'ALL')
break;
if (n.indexOf('ALL') !== -1)
n = n.replace(/[0-9]+[^0-9]ALL$/, 'ALL');
else
n = n.replace(/[0-9]+$/, 'ALL');
}
return undefined;
};
SBBSEchoCfg.prototype.match_pw = function(node, pw)
{
var pktpw = this.get_pw(node);
if (pktpw === undefined || pktpw == '') {
if (pw === '' || pw === undefined)
return true;
}
if (pw.toUpperCase() === pktpw.toUpperCase())
return true;
log(LOG_WARNING, "Incorrect password "+pw+" (expected "+pktpw+")");
return false;
};
function TickITCfg() {
this.gcfg = undefined;
this.acfg = {};
var tcfg = new File(system.ctrl_dir+'tickit.ini');
var sects;
var i;
function lcprops(obj)
{
var i;
for (i in obj) {
if (i.toLowerCase() !== i) {
if (obj[i.toLowerCase()] === undefined)
obj[i.toLowerCase()] = obj[i];
if (typeof(obj[i]) == 'Object')
lcprops(obj[i]);
}
}
}
if (!tcfg.open("r")) {
tcfg.close();
throw("Unable to open '"+tcfg.name+"'");
}
this.gcfg = tcfg.iniGetObject();
lcprops(this.gcfg);
sects = tcfg.iniGetSections();
for (i=0; i<sects.length; i++) {
this.acfg[sects[i].toLowerCase()] = tcfg.iniGetObject(sects[i]);
lcprops(this.acfg[sects[i].toLowerCase()]);
}
tcfg.close();
}
TickITCfg.prototype.cset = '0123456789abcdefghijklmnopqrstuvwxyz0123456789-_';
TickITCfg.prototype.basefn_to_num = function(num)
{
var base = this.cset.length;
var part;
var ret=0;
var i;
for (i=0; i<num.length; i++) {
ret *= base;
ret += this.cset.indexOf(num[i]);
}
return ret;
};
TickITCfg.prototype.num_to_basefn = function(num)
{
var base = this.cset.length;
var part;
var ret='';
while(num) {
part = num % base;
ret = this.cset.charAt(part) + ret;
num = parseInt((num/base), 10);
}
return ret;
};
/*
* Returns a filename in the format "ti_XXXXX.tic" where
* XXXXX is replaced by an incrementing base-48 number.
* This provides 254,803,967 unique filenames.
*/
TickITCfg.prototype.get_next_tic_filename = function()
{
var f;
var val;
var ret;
// Get previous value or -1 if there is no previous value.
f = new File(system.data_dir+'tickit.seq');
if (f.open("r+b")) {
val = f.readBin();
}
else {
if (!f.open("web+")) {
log(LOG_ERROR, "Unable to open file "+f.name+"!");
return undefined;
}
val = -1;
}
// Increment by 1...
val++;
// Check for wrap...
if (val > this.basefn_to_num('_____'))
val = 0;
// Write back new value.
f.truncate();
f.writeBin(val);
f.close();
// Left-pad to five digits.
ret = ('00000'+this.num_to_basefn(val)).substr(-5);
// Add pre/suf-fix
return 'ti_'+ret+'.tic';
};
load("sbbsdefs.js"); load("sbbsdefs.js");
load("tickit_objs.js");
var inb=[]; var sbbsecho = new SBBSEchoCfg();
var pktpass = {}; var tickit = new TickITCfg();
var files_bbs={}; var files_bbs={};
var outbound;
var gcfg;
var acfg={};
var is_flo=false;
const cset='0123456789abcdefghijklmnopqrstuvwxyz0123456789-_';
function basefn_to_num(num)
{
var base = cset.length;
var part;
var ret=0;
var i;
for (i=0; i<num.length; i++) {
ret *= base;
ret += cset.indexOf(num[i]);
}
return ret;
}
function num_to_basefn(num)
{
var base = cset.length;
var part;
var ret='';
while(num) {
part = num % base;
ret = cset.charAt(part) + ret;
num = parseInt((num/base), 10);
}
return ret;
}
/*
* Returns a filename in the format "ti_XXXXX.tic" where
* XXXXX is replaced by an incrementing base-48 number.
* This provides 254,803,967 unique filenames.
*/
function get_next_tic_filename()
{
var f;
var val;
var ret;
// Get previous value or -1 if there is no previous value.
f = new File(system.data_dir+'tickit.seq');
if (f.open("r+b")) {
val = f.readBin();
}
else {
if (!f.open("web+")) {
log(LOG_ERROR, "Unable to open file "+f.name+"!");
return undefined;
}
val = -1;
}
// Increment by 1...
val++;
// Check for wrap...
if (val > basefn_to_num('_____'))
val = 0;
// Write back new value.
f.truncate();
f.writeBin(val);
f.close();
// Left-pad to five digits.
ret = ('00000'+num_to_basefn(val)).substr(-5);
// Add pre/suf-fix
return 'ti_'+ret+'.tic';
}
function get_pw(node)
{
var n = node;
while(n) {
if (pktpass[n] !== undefined)
return pktpass[n];
if (n === 'ALL')
break;
if (n.indexOf('ALL') !== -1)
n = n.replace(/[0-9]+[^0-9]ALL$/, 'ALL');
else
n = n.replace(/[0-9]+$/, 'ALL');
}
return undefined;
}
function match_pw(node, pw)
{
var pktpw = get_pw(node);
if (pktpw === undefined || pktpw == '') {
if (pw === '' || pw === undefined)
return true;
}
if (pw.toUpperCase() === pktpw.toUpperCase())
return true;
log(LOG_WARNING, "Incorrect password "+pw+" (expected "+pktpw+")");
return false;
}
function process_tic(tic) function process_tic(tic)
{ {
...@@ -122,12 +13,12 @@ function process_tic(tic) ...@@ -122,12 +13,12 @@ function process_tic(tic)
var i; var i;
var cfg; var cfg;
if (gcfg.path !== undefined) if (tickit.gcfg.path !== undefined)
path = backslash(gcfg.path); path = backslash(tickit.gcfg.path);
if (gcfg.dir !== undefined) if (tickit.gcfg.dir !== undefined)
dir = gcfg.dir.toLowerCase(); dir = tickit.gcfg.dir.toLowerCase();
cfg = acfg[tic.area.toLowerCase()]; cfg = tickit.acfg[tic.area.toLowerCase()];
if (cfg !== undefined) { if (cfg !== undefined) {
if (cfg.path !== undefined) { if (cfg.path !== undefined) {
path = backslash(cfg.path); path = backslash(cfg.path);
...@@ -193,7 +84,7 @@ function process_tic(tic) ...@@ -193,7 +84,7 @@ function process_tic(tic)
return true; return true;
} }
function add_links(seenbys, list) function add_links(seenbys, links, list)
{ {
var l; var l;
var i; var i;
...@@ -276,11 +167,11 @@ function forward_tic(tic) ...@@ -276,11 +167,11 @@ function forward_tic(tic)
seenbys[tic.seenby[i]]=''; seenbys[tic.seenby[i]]='';
// Calculate links // Calculate links
if (gcfg.links !== undefined) if (tickit.gcfg.links !== undefined)
add_links(seenbys, gcfg.links); add_links(seenbys, links, tickit.gcfg.links);
cfg = acfg[tic.area.toLowerCase()]; cfg = tickit.acfg[tic.area.toLowerCase()];
if (cfg !== undefined && cfg.links !== undefined) if (cfg !== undefined && cfg.links !== undefined)
add_links(seenbys, cfg.links); add_links(seenbys, links, cfg.links);
// Add links to seenbys // Add links to seenbys
for (i in links) for (i in links)
...@@ -288,12 +179,12 @@ function forward_tic(tic) ...@@ -288,12 +179,12 @@ function forward_tic(tic)
// Now, start generating the TIC/FLO files... // Now, start generating the TIC/FLO files...
for (link in links) { for (link in links) {
if (!is_flo) { if (!sbbsecho.is_flo) {
log(LOG_ERROR, "TickIT doesn't support non-FLO mailers."); log(LOG_ERROR, "TickIT doesn't support non-FLO mailers.");
return false; return false;
} }
pw = get_pw(link); pw = sbbsecho.get_pw(link);
if (pw===undefined) if (pw===undefined)
pw = ''; pw = '';
...@@ -307,14 +198,14 @@ function forward_tic(tic) ...@@ -307,14 +198,14 @@ function forward_tic(tic)
continue; continue;
} }
outb = outbound.replace(/[\\\/]+$/g, '');; outb = sbbsecho.outbound.replace(/[\\\/]+$/g, '');
if (addr.zone !== defzone) if (addr.zone !== defzone)
outb += format(".%03x", addr.zone); outb += format(".%03x", addr.zone);
outb = file_getcase(outb); outb = file_getcase(outb);
backslash(outb); backslash(outb);
// Create TIC file first... // Create TIC file first...
tf = new File(outb+get_next_tic_filename()); tf = new File(outb+tickit.get_next_tic_filename());
if(!tf.open("wb")) { if(!tf.open("wb")) {
log(LOG_ERROR, "Unable to create TIC file for "+link+". He will not get file '"+tic.file+"'!"); log(LOG_ERROR, "Unable to create TIC file for "+link+". He will not get file '"+tic.file+"'!");
continue; continue;
...@@ -328,7 +219,7 @@ function forward_tic(tic) ...@@ -328,7 +219,7 @@ function forward_tic(tic)
tf.write('Path '+tic.path[i]+'\r\n'); tf.write('Path '+tic.path[i]+'\r\n');
for (i=0; i<tic.seenby.length; i++) for (i=0; i<tic.seenby.length; i++)
tf.write('Path '+tic.seenby[i]+'\r\n'); tf.write('Path '+tic.seenby[i]+'\r\n');
tf.close; tf.close();
// Create bsy file... // Create bsy file...
flobase = outb+format("%04x%04x", addr.net, addr.node); flobase = outb+format("%04x%04x", addr.net, addr.node);
...@@ -351,7 +242,7 @@ function forward_tic(tic) ...@@ -351,7 +242,7 @@ function forward_tic(tic)
ff.writeln('^'+tf.name); ff.writeln('^'+tf.name);
ff.close(); ff.close();
bf.close(); bf.close();
bg.remove(); bf.remove();
} }
return true; return true;
...@@ -375,7 +266,7 @@ function parse_ticfile(fname) ...@@ -375,7 +266,7 @@ function parse_ticfile(fname)
log(LOG_ERROR, "Unable to open '"+f.name+"'"); log(LOG_ERROR, "Unable to open '"+f.name+"'");
return false; return false;
} }
while (line = f.readln(65535)) { while ((line = f.readln(65535)) != undefined) {
m = line.match(/^\s*([^\s]+)\s+(.*)$/); m = line.match(/^\s*([^\s]+)\s+(.*)$/);
if (m !== null) { if (m !== null) {
key = m[1].toLowerCase(); key = m[1].toLowerCase();
...@@ -423,15 +314,15 @@ function parse_ticfile(fname) ...@@ -423,15 +314,15 @@ function parse_ticfile(fname)
tic[key] = val; tic[key] = val;
break; break;
case 'filename': case 'fullname':
outtic.push(line); outtic.push(line);
tic[lfile] = val; tic.lfile = val;
break; break;
// Multi-line values // Multi-line values
case 'ldesc': case 'ldesc':
outtic.push(line); outtic.push(line);
tic[key] += val+"\r\n" tic[key] += val+"\r\n";
break; break;
default: default:
...@@ -471,7 +362,7 @@ function parse_ticfile(fname) ...@@ -471,7 +362,7 @@ function parse_ticfile(fname)
return false; return false;
} }
} }
if (!match_pw(tic.from, tic.pw)) if (!sbbsecho.match_pw(tic.from, tic.pw))
return false; return false;
tic[' forward'] = outtic; tic[' forward'] = outtic;
...@@ -479,75 +370,6 @@ function parse_ticfile(fname) ...@@ -479,75 +370,6 @@ function parse_ticfile(fname)
return tic; return tic;
} }
function parse_ecfg()
{
var ecfg = new File(system.ctrl_dir+'sbbsecho.cfg');
var line;
var m;
if (!ecfg.open("r")) {
log(LOG_ERROR, "Unable to open '"+ecfg.name+"'");
return false;
}
while (line=ecfg.readln(65535)) {
m = line.match(/^\s*(?:secure_)?inbound\s+(.*)$/i);
if (m !== null) {
inb.push(backslash(m[1]));
}
m = line.match(/^\s*pktpwd\s+(.*?)\s+(.*)\s*$/i);
if (m !== null) {
pktpass[m[1].toUpperCase()] = m[2].toUpperCase();
}
m = line.match(/^\s*outbound\s+(.*?)\s*$/i);
if (m !== null) {
outbound = m[1];
}
m = line.match(/^\s*flo_mailer\s*$/i);
if (m !== null) {
is_flo = true;
}
}
ecfg.close();
return true;
}
function lcprops(obj)
{
var i;
for (i in obj) {
if (i.toLowerCase() !== i) {
if (obj[i.toLowerCase()] === undefined)
obj[i.toLowerCase()] = obj[i];
if (typeof(obj[i]) == 'Object')
lcprops(obj[i]);
}
}
}
function parse_tcfg()
{
var tcfg = new File(system.ctrl_dir+'tickit.ini');
var sects;
var i;
if (!tcfg.open("r")) {
log(LOG_ERROR, "Unable to open '"+tcfg.name+"'");
tcfg.close();
return false;
}
gcfg = tcfg.iniGetObject();
lcprops(gcfg);
sects = tcfg.iniGetSections();
for (i=0; i<sects.length; i++) {
acfg[sects[i].toLowerCase()] = tcfg.iniGetObject(sects[i]);
lcprops(acfg[sects[i].toLowerCase()]);
}
tcfg.close();
return true;
}
function import_files() function import_files()
{ {
var i; var i;
...@@ -579,16 +401,11 @@ function main() { ...@@ -579,16 +401,11 @@ function main() {
var tic; var tic;
var processed = 0; var processed = 0;
if (!parse_ecfg()) for (i=0; i<sbbsecho.inb.length; i++) {
return false;
if (!parse_tcfg())
return false;
for (i=0; i<inb.length; i++) {
if (system.platform === 'Win32') if (system.platform === 'Win32')
ticfiles = directory(inb[i]+'/*.tic'); ticfiles = directory(sbbsecho.inb[i]+'/*.tic');
else else
ticfiles = directory(inb[i]+'/*.[Tt][Ii][Cc]'); ticfiles = directory(sbbsecho.inb[i]+'/*.[Tt][Ii][Cc]');
for (j=0; j<ticfiles.length; j++) { for (j=0; j<ticfiles.length; j++) {
tic = parse_ticfile(ticfiles[j]); tic = parse_ticfile(ticfiles[j]);
......
load("sbbsdefs.js");
load("uifcdefs.js");
load("tickit_objs.js");
var tickit = new TickITCfg();
// Backward compatability hack.
if (typeof uifc.list.CTX === "undefined") {
uifc.list.CTX = function () {
this.cur = 0;
this.bar = 0;
}
}
function pick_dir(obj)
{
var cmd = 0;
var libs = Object.keys(file_area.lib);
var dirs;
var dircodes;
var dir;
var ctx = new uifc.list.CTX();
var dctx;
var i;
if (obj.dir !== undefined && file_area.lib[obj.dir.toLowerCase()] !== undefined) {
for (i=0; i<libs.length; i++) {
if (file_area.lib[obj.dir.toLowerCase()].dir_name.toLowerCase() === libs[i].toLowerCase()) {
ctx.cur = i;
ctx.bar = i;
break;
}
}
}
while (cmd >= 0) {
cmd = uifc.list(WIN_SAV|WIN_ACT|WIN_RHT, "Select Group" , libs, ctx);
if (cmd >= 0) {
dctx = new uifc.list.CTX();
dircodes = file_area.lib[libs[cmd]].dir_list.map(function(v){return v.code;});
dirs = dircodes.map(function(v){return file_area.dir[v].name;});
if (obj.dir !== undefined) {
for (i=0; i<dircodes.length; i++) {
if (dircodes[i].toLowerCase() === obj.dir.toLowerCase()) {
dctx.cur = i;
dctx.bar = i;
}
}
}
dir = uifc.list(WIN_SAV|WIN_ACT|WIN_BOT, "Select Dir", dirs, dctx);
if (dir >= 0) {
return dirs[dir];
}
}
}
return undefined;
}
function set_location(obj)
{
var cmd = 0;
var dir;
var ctx = new uifc.list.CTX();
var opts;
while (cmd >= 0) {
opts = ["Synchronet File Directory", "System Path"];
opts[0] = ((obj.dir === undefined) ? ' ' : '* ')+opts[0];
opts[1] = ((obj.path === undefined) ? ' ' : '* ')+opts[1];
cmd = uifc.list(WIN_SAV|WIN_ACT, "Location Type", opts, ctx);
switch(cmd) {
case 0:
dir = pick_dir(obj);
if (dir !== undefined) {
obj.dir = dir;
delete obj.path;
return;
}
cmd = 0;
break;
case 1:
dir = null;
while(dir !== undefined) {
dir = uifc.input(WIN_SAV|WIN_MID, "Path", tickit.gcfg.path === undefined ? '' : tickit.gcfg.path, 1024, K_EDIT);
if (dir != undefined) {
if (file_isdir(dir)) {
delete obj.dir;
obj.path = dir;
return;
}
else {
uifc.msg("Invalid path!");
}
}
}
break;
}
}
}
function edit_links(links)
{
var tmp;
var link = 0;
var ctx = new uifc.list.CTX();
while (link >= 0) {
link = uifc.list(WIN_SAV|WIN_ACT|WIN_DEL|WIN_INS|WIN_DELACT|WIN_XTR, "Links", links, ctx);
if (link == -1) {
break;
}
if (link == links.length || (link & MSK_INS) == MSK_INS) {
link &= MSK_OFF;
tmp = uifc.input(WIN_SAV|WIN_MID, "Address", 30);
if (tmp !== undefined)
links.splice(link, 0, tmp);
}
if (link & MSK_DEL) {
link &= MSK_OFF;
links.splice(link, 1);
}
}
return links;
}
function edit_area(obj, name)
{
var cmd = 0;
var link = 0;
var links;
var menu = ["Location", "Links"];
var tmp;
var tmp2;
var ctx = new uifc.list.CTX();
while(cmd >= 0) {
cmd = uifc.list(WIN_SAV|WIN_ACT|WIN_BOT|WIN_RHT, name+" Options", menu, ctx);
switch(cmd) {
case 0:
set_location(obj);
break;
case 1:
if (obj.links === undefined)
links = [];
else
links = obj.links.split(/,/);
tmp = edit_links(links);
if (tmp.length === 0)
delete obj.links;
else
obj.links = tmp.join(',');
break;
case -1:
// Save changes?
break;
default:
uifc.msg("Unhandled Return: "+cmd);
break;
}
}
}
function edit_areas()
{
var areas;
var area = 0;
var tmp;
var ctx = new uifc.list.CTX();
while(area >= 0) {
areas = Object.keys(tickit.acfg).sort();
area = uifc.list(WIN_SAV|WIN_BOT|WIN_ACT|WIN_DEL|WIN_INS|WIN_DELACT|WIN_XTR, "Select Area", areas, ctx);
if (area == -1) {
break;
}
else if (area == areas.length || (area & MSK_INS) == MSK_INS) {
area &= MSK_OFF;
tmp = uifc.input(WIN_SAV|WIN_MID, "Area", 30);
if (tmp !== undefined) {
if (tickit.acfg[tmp.toLowerCase()] === undefined) {
tickit.acfg[tmp.toLowerCase()] = {};
edit_area(tickit.acfg[areas[area]], tmp.toLowerCase());
}
else {
uifc.msg("Area already in config!");
}
}
}
else if (area & MSK_DEL) {
area &= MSK_OFF;
delete tickit.acfg[areas[area]];
}
else {
edit_area(tickit.acfg[areas[area]], areas[area]);
}
}
}
function main()
{
uifc.init("TickIT Config Program");
var cmd = 0;
var link = 0;
var links;
var menu = ["Global Location", "Global Links", "Areas..."];
var tmp;
var tmp2;
var ctx = new uifc.list.CTX();
while(cmd >= 0) {
cmd = uifc.list(WIN_ORG|WIN_ACT|WIN_MID, "Global Options", menu, ctx);
switch(cmd) {
case 0:
set_location(tickit.gcfg);
break;
case 1:
if (tickit.gcfg.links === undefined)
links = [];
else
links = tickit.gcfg.links.split(/,/);
tmp = edit_links(links);
if (tmp.length === 0)
delete tickit.gcfg.links;
else
tickit.gcfg.links = tmp.join(',');
break;
case 2:
edit_areas();
uifc.bail();
break;
case -1:
// TODO: Save changes?
break;
default:
uifc.msg("Unhandled Return: "+cmd);
break;
}
}
}
main();
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment