Fix return from sqrllogin, added msgbase handling and finding a tagged message
This commit is contained in:
parent
aa8aadfae7
commit
18d1313eef
@ -1,4 +1,10 @@
|
||||
log(LOG_DEBUG,'- INIT: ANSITEX');
|
||||
/**
|
||||
* This will go through our videotex and ansitex frames and check for inconsistencies.
|
||||
*
|
||||
* We'll check for:
|
||||
* + Mismatched metadata items
|
||||
* + Out of sync content
|
||||
*/
|
||||
|
||||
// Load many SBBS definitions
|
||||
require('sbbsdefs.js','SS_USERON');
|
||||
@ -90,8 +96,8 @@ if (! ans.content) {
|
||||
|
||||
if (x !== y) {
|
||||
// Check Content
|
||||
writeln(' - Page Content :'+md5_calc(x));
|
||||
writeln(' - Source Content :'+md5_calc(y));
|
||||
writeln(' - Page Content :'+md5_calc(x,true));
|
||||
writeln(' - Source Content :'+md5_calc(y,true));
|
||||
writeln('- ! WARNING: Content Differs.'+base64_decode(vtx.content));
|
||||
errors = true;
|
||||
}
|
||||
|
20
frames_tag.js
Normal file
20
frames_tag.js
Normal file
@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Go through our messages and tag a frame id for messages without one.
|
||||
*/
|
||||
|
||||
load('load/string.js');
|
||||
load('ansitex/load/msgbases.js');
|
||||
|
||||
ma = new MsgAreas()
|
||||
for (var i=0;i<ma.areas.length;i++) {
|
||||
writeln('Area: '+ma.areas[i].full_name);
|
||||
writeln('Total Messages: '+ma.areas[i].list.length);
|
||||
|
||||
writeln('Tagged Messages: '+ma.areas[i].list_tagged.length);
|
||||
writeln(' '+ma.areas[i].list_tagged.map(function(x) { return x.tags; }).sort().join('|'));
|
||||
|
||||
writeln('Untagged Messages: '+ma.areas[i].list_untagged.length);
|
||||
writeln(' '+ma.areas[i].list_untagged.map(function(x) { return x.number; }).sort().join('|'));
|
||||
|
||||
ma.areas[i].tag_msgs();
|
||||
}
|
@ -164,6 +164,8 @@ function sqrllogin() {
|
||||
}
|
||||
}
|
||||
|
||||
complete = true;
|
||||
|
||||
} catch (err) {
|
||||
log(LOG_INFO,'SQRL Error: '+err+' '+JSON.stringify(sqrl));
|
||||
cancel = true;
|
||||
|
@ -70,6 +70,10 @@ function ans2bin(ansi,frame) {
|
||||
}
|
||||
}
|
||||
|
||||
function compare(a,b) {
|
||||
return (a.prefix < b.prefix) ? 1 : ((b.prefix < a.prefix) ? -1 : 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a message base by code
|
||||
*
|
||||
@ -294,8 +298,20 @@ function renderfield(field,length) {
|
||||
return result;
|
||||
}
|
||||
|
||||
function compare(a,b) {
|
||||
return (a.prefix < b.prefix) ? 1 : ((b.prefix < a.prefix) ? -1 : 0);
|
||||
/**
|
||||
* This function returns a list of zones used by this system.
|
||||
*/
|
||||
function zones() {
|
||||
var z = [];
|
||||
var ftn = /([0-9]+):([0-9]+)\/([0-9]+)(\.([0-9]+))?/;
|
||||
|
||||
for(var g=0;g<system.fido_addr_list.length;g++) {
|
||||
z.push(parseInt(system.fido_addr_list[g].match(ftn)[1]));
|
||||
}
|
||||
|
||||
return z.sort(function(a,b) {
|
||||
return (a>b);
|
||||
});
|
||||
}
|
||||
|
||||
this;
|
||||
|
233
load/msgbases.js
Normal file
233
load/msgbases.js
Normal file
@ -0,0 +1,233 @@
|
||||
// Our message bases
|
||||
function MsgAreas() {
|
||||
'use strict';
|
||||
|
||||
this.areas = [];
|
||||
this.areas_excluded = [];
|
||||
var zone_id;
|
||||
var zone_name;
|
||||
var ma;
|
||||
|
||||
for(var g in msg_area.grp_list) {
|
||||
if (msg_area.grp_list[g].name.indexOf(':') !== -1) {
|
||||
zone_id = msg_area.grp_list[g].name.split(':')[0];
|
||||
zone_name = msg_area.grp_list[g].name.split(':')[1];
|
||||
|
||||
for (var a in msg_area.grp_list[g].sub_list) {
|
||||
if (msg_area.grp_list[g].sub_list[a].name.indexOf(':') !== -1) {
|
||||
ma = new MsgArea();
|
||||
ma.zone_id = zone_id;
|
||||
ma.zone_name = zone_name;
|
||||
ma.area_id = msg_area.grp_list[g].sub_list[a].name.split(':')[0];
|
||||
ma.area_name = msg_area.grp_list[g].sub_list[a].name.split(':')[1];
|
||||
ma.code = msg_area.grp_list[g].sub_list[a].code;
|
||||
|
||||
this.areas.push(ma);
|
||||
} else {
|
||||
this.areas_excluded.push(zone_name+':'+msg_area.grp_list[g].sub_list[a].name);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
zone_name = msg_area.grp_list[g].name;
|
||||
|
||||
for (var a in msg_area.grp_list[g].sub_list) {
|
||||
this.areas_excluded.push(zone_name+':'+msg_area.grp_list[g].sub_list[a].name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function MsgArea() {
|
||||
this.zone_id = undefined;
|
||||
this.zone_name = undefined;
|
||||
this.area_id = undefined;
|
||||
this.area_name = undefined;
|
||||
this.msgbase = undefined;
|
||||
this.headers = undefined;
|
||||
this.tagged_list = undefined;
|
||||
this.untagged_list = undefined;
|
||||
|
||||
const PAGE_LENGTH = 4; // The size of our page tag.
|
||||
const PAGE_LAST_KEY = 'last_page';
|
||||
|
||||
Object.defineProperty(this,'code',{
|
||||
set: function(code) {
|
||||
this.msgbase = new MsgBase(code);
|
||||
|
||||
if (! this.msgbase.open()) {
|
||||
writeln(code+' cannot be opened:'+this.msgbase.error);
|
||||
exit(2);
|
||||
}
|
||||
|
||||
this.headers = this.msgbase.get_all_msg_headers(false,false);
|
||||
this.msgbase.close();
|
||||
}
|
||||
});
|
||||
|
||||
// Get Area's full name
|
||||
Object.defineProperty(this,'full_name',{
|
||||
get: function() {
|
||||
return this.zone_name+':'+this.area_name;
|
||||
}
|
||||
});
|
||||
|
||||
// Total Messages
|
||||
Object.defineProperty(this,'list',{
|
||||
get: function() {
|
||||
return this.headers ? Object.keys(this.headers) : [];
|
||||
}
|
||||
});
|
||||
|
||||
// Total tagged messages
|
||||
Object.defineProperty(this,'list_tagged',{
|
||||
get: function() {
|
||||
if (this.tagged_list === undefined) {
|
||||
this.tagged_list = [];
|
||||
|
||||
if (! this.headers)
|
||||
return this.tagged_list;
|
||||
|
||||
for(var x in this.headers) {
|
||||
if (this.headers[x].tags && (this.headers[x].tags.length === PAGE_LENGTH)) {
|
||||
this.tagged_list.push(this.headers[x]);
|
||||
write(); // @todo This is needed for this to work?
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this.tagged_list;
|
||||
}
|
||||
});
|
||||
|
||||
// List untagged messages
|
||||
Object.defineProperty(this,'list_untagged',{
|
||||
get: function() {
|
||||
if (this.untagged_list === undefined) {
|
||||
this.untagged_list = [];
|
||||
|
||||
if (! this.headers)
|
||||
return this.untagged_list;
|
||||
|
||||
for(var x in this.headers) {
|
||||
if ((! this.headers[x].tags) || (this.headers[x].tags.length !== PAGE_LENGTH)) {
|
||||
this.untagged_list.push(this.headers[x]);
|
||||
write(); // @todo This is needed for this to work?
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return this.untagged_list.sort(function(x) { return x.when_written_time-(x.when_written_zone_offset*60); });
|
||||
}
|
||||
});
|
||||
|
||||
// Get first untagged message
|
||||
// Get specific tagged message
|
||||
|
||||
// Get Next page number
|
||||
Object.defineProperty(this,'page_next',{
|
||||
get: function() {
|
||||
var f = new File(file_cfgname(system.mods_dir,'ansitex/ctrl/videotex.ini'));
|
||||
if (! f.open('r')) {
|
||||
writeln('Unable to open ini file');
|
||||
exit(2);
|
||||
}
|
||||
|
||||
var page = f.iniGetValue('zone:'+this.page_prefix,PAGE_LAST_KEY)
|
||||
f.close();
|
||||
|
||||
return page ? page : '0'.repeat(PAGE_LENGTH);
|
||||
},
|
||||
|
||||
set: function(page) {
|
||||
var f = new File(file_cfgname(system.mods_dir,'ansitex/ctrl/videotex.ini'));
|
||||
if (! f.open('r+')) {
|
||||
writeln('Unable to open ini file');
|
||||
exit(2);
|
||||
}
|
||||
|
||||
f.iniSetValue('zone:'+this.page_prefix,PAGE_LAST_KEY,(''+page).padStart(4,'0'));
|
||||
f.close();
|
||||
}
|
||||
});
|
||||
|
||||
// Our page prefix for this msg area
|
||||
Object.defineProperty(this,'page_prefix',{
|
||||
get: function() {
|
||||
return ''+this.zone_id+this.area_id;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a specific message with a tag
|
||||
*/
|
||||
MsgArea.prototype.getMessage = function(page) {
|
||||
var msg = undefined;
|
||||
|
||||
for(var x in this.headers) {
|
||||
if (this.headers[x].tags === page) {
|
||||
msg = this.headers[x];
|
||||
break;
|
||||
}
|
||||
write(); // @todo This is needed for this to work?
|
||||
}
|
||||
|
||||
if (! msg)
|
||||
return undefined;
|
||||
|
||||
this.msgbase.open();
|
||||
msg.content = this.msgbase.get_msg_body(false,msg.number,false,false,true,true);
|
||||
this.msgbase.close();
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tag messages with a frame number
|
||||
*
|
||||
* @returns {boolean}
|
||||
*/
|
||||
MsgArea.prototype.tag_msgs = function() {
|
||||
var msgs = this.list_untagged;
|
||||
|
||||
// See if we need to something
|
||||
if (! msgs.length)
|
||||
return;
|
||||
|
||||
if (! this.msgbase.open('r+')) {
|
||||
writeln(ma.areas[i].code+' cannot be opened?');
|
||||
return false;
|
||||
}
|
||||
|
||||
var page_next = this.page_next;
|
||||
for(var x in msgs) {
|
||||
var msg = this.msgbase.get_msg_header(msgs[x].number, /* expand: */false)
|
||||
writeln('Setting page:'+(''+(page_next)).padStart(4,'0')+', for:'+msg.number);
|
||||
msg.tags = (''+(page_next)).padStart(4,'0');
|
||||
if(! this.msgbase.put_msg_header(msg.number,msg)) {
|
||||
writeln('ERROR:'+this.msgbase.error);
|
||||
|
||||
} else {
|
||||
page_next++;
|
||||
}
|
||||
}
|
||||
|
||||
this.msgbase.close();
|
||||
|
||||
this.page_next = page_next;
|
||||
return true;
|
||||
}
|
||||
|
||||
MsgAreas.prototype.getMessage = function(page) {
|
||||
var zone = page.substr(0,4);
|
||||
var echo = page.substr(4,2);
|
||||
var page = page.substr(6);
|
||||
|
||||
area = this.areas.filter(function(x) {
|
||||
return x.zone_id === zone && x.area_id === echo;
|
||||
})[0]
|
||||
|
||||
return area ? area.getMessage(page) : undefined;
|
||||
}
|
21
main.js
21
main.js
@ -9,6 +9,7 @@ require('key_defs.js','KEY_ESC');
|
||||
|
||||
ansi = load({},'ansiterm_lib.js');
|
||||
load('ansitex/load/funcs.js');
|
||||
load('ansitex/load/msgbases.js');
|
||||
|
||||
// Ansitex specific includes
|
||||
require('ansitex/load/defs.js','ACTION_EXIT');
|
||||
@ -895,11 +896,20 @@ while(bbs.online) {
|
||||
log(LOG_DEBUG,'- ACTION_GOTO: ['+(next_page ? pageStr(next_page) : '')+']');
|
||||
var current = null;
|
||||
|
||||
// Check if this is a mail prefix.
|
||||
// For logged in users, we'll see if this is a mail page.
|
||||
// @todo consider how we do mail security.
|
||||
// 1zzzzEEnnnn
|
||||
if (user.number && /^1[0-9]{10}/.test(next_page.frame)) {
|
||||
fo.sendBaseline('INVALID_EMAIL',false);
|
||||
mode = action = false;
|
||||
var ma = new MsgAreas();
|
||||
if (x=ma.getMessage((''+next_page.frame).substr(1))) {
|
||||
current = fo;
|
||||
fo = viewdata ? new FrameViewdata() : new FrameAnsi();
|
||||
fo.loadMessage(x);
|
||||
writeln(x.content);
|
||||
} else {
|
||||
fo.sendBaseline('ERR_ROUTE',false);
|
||||
mode = action = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1045,7 +1055,10 @@ while(bbs.online) {
|
||||
require('ansitex/load/control-'+fo.key[1]+'.js','CONTROL_SQRL');
|
||||
control.push(eval("new "+fo.key[1]+'();'));
|
||||
|
||||
break;
|
||||
} else if (fo.key[1] && (fo.type === FRAME_TYPE_RESPONSE) && (typeof(fo.key[1]) !== 'number')) {
|
||||
log(LOG_DEBUG,'Adding METHOD to control stack: '+fo.key[1]);
|
||||
require('ansitex/load/control-'+fo.key[1]+'.js','CONTROL_'+fo.key[1].toUpperCase());
|
||||
control.push(eval("new "+fo.key[1]+'();'));
|
||||
}
|
||||
|
||||
action = false;
|
||||
|
Loading…
Reference in New Issue
Block a user