Skip to content
Snippets Groups Projects
Commit 52d7db25 authored by Michael Long's avatar Michael Long
Browse files

Merge remote-tracking branch 'origin/master' into xtrnexecmodules

parents 6d9a6ec0 83465f65
No related branches found
No related tags found
1 merge request!24External Program Pre/Post Loadable Modules
Pipeline #556 passed
#!/sbbs/exec/jsexec -x -c /sbbs/ctrl
load("gnatslib.js");
var logmsg='----- CVS Commit Message -----\n';
var name=argv[0];
var gnats_user="guest";
var password=undefined;
if(argc>1)
gnats_user=argv[1];
if(argc>2)
password=argv[2];
var gnats = new GNATS("bugs.synchro.net",gnats_user,password);
if(!gnats.connect())
handle_error();
while((line=readln()) != undefined)
logmsg += line+"\n";
logmsg+='--- End CVS Commit Message ---\n\n';
auditprs=new Object;
stateprs=new Object;
myRe=/PR:\s?([0-9]+)/g;
while((pr=myRe.exec(logmsg))!=undefined) {
auditprs[pr[1]]=pr[1];
}
myRe=/PR:\s?([0-9]+)-\>([a-z]*)/g;
while((pr=myRe.exec(logmsg))!=undefined) {
stateprs[pr[1]]=pr[2];
}
for(pr in stateprs) {
var oldstate = gnats.get_field(pr,"State");
oldstate = oldstate.replace(/[\r\n]/g,'');
if(stateprs[pr] != oldstate) {
log("Changeing state of PR: "+pr+" to "+stateprs[pr]);
if(!gnats.replace(pr, "State", stateprs[pr], logmsg))
handle_error();
else
delete auditprs[pr];
}
}
for(pr in auditprs) {
var oldname = gnats.get_field(pr,"Responsible");
oldname = oldname.replace(/[\r\n]/g,'');
if(name != oldname) {
log("Changeing responsible to "+name+" for PR: "+pr);
if(!gnats.replace(pr, "Responsible", name, logmsg))
handle_error();
}
else {
log("Sending followup to PR: "+pr);
if(!gnats.send_followup(pr, name, name, logmsg))
handle_error();
}
}
function handle_error()
{
log(gnats.error);
gnats.close();
exit(1);
}
...@@ -47,13 +47,13 @@ struct.xedit_t={ ...@@ -47,13 +47,13 @@ struct.xedit_t={
settings: {bytes:UINT32_T, type:"int"}, // was misc settings: {bytes:UINT32_T, type:"int"}, // was misc
ars: {bytes:LEN_ARSTR+1, type:"str"}, // was arstr ars: {bytes:LEN_ARSTR+1, type:"str"}, // was arstr
type: {bytes:UCHAR, type:"int"}, type: {bytes:UCHAR, type:"int"},
__PADDING__:15 __PADDING__:{bytes:15}
}; };
struct.xtrnsec_t={ struct.xtrnsec_t={
name: {bytes:41, type:"str"}, name: {bytes:41, type:"str"},
code: {bytes:LEN_CODE+1, type:"str"}, code: {bytes:LEN_CODE+1, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, // was arstr ars: {bytes:LEN_ARSTR+1, type:"str"}, // was arstr
__PADDING__:16 __PADDING__:{bytes:16}
}; };
struct.xtrn_t={ struct.xtrn_t={
sec: {bytes:UINT16_T, type:"int"}, sec: {bytes:UINT16_T, type:"int"},
...@@ -70,7 +70,7 @@ struct.xtrn_t={ ...@@ -70,7 +70,7 @@ struct.xtrn_t={
startup_dir: {bytes:LEN_DIR+1, type:"str"}, // was path startup_dir: {bytes:LEN_DIR+1, type:"str"}, // was path
textra: {bytes:UCHAR, type:"int"}, textra: {bytes:UCHAR, type:"int"},
max_time: {bytes:UCHAR, type:"int"}, // was maxtime max_time: {bytes:UCHAR, type:"int"}, // was maxtime
__PADDING__:14 __PADDING__:{bytes:14}
}; };
struct.event_t={ struct.event_t={
code: {bytes:LEN_CODE+1, type:"str"}, code: {bytes:LEN_CODE+1, type:"str"},
...@@ -83,7 +83,7 @@ struct.event_t={ ...@@ -83,7 +83,7 @@ struct.event_t={
freq: {bytes:UINT16_T, type:"int"}, freq: {bytes:UINT16_T, type:"int"},
mdays: {bytes:UINT32_T, type:"int"}, mdays: {bytes:UINT32_T, type:"int"},
months: {bytes:UINT16_T, type:"int"}, months: {bytes:UINT16_T, type:"int"},
__PADDING__:8 __PADDING__:{bytes:8}
}; };
struct.natvpgm_t={ struct.natvpgm_t={
name: {bytes:13, type:"str"}, name: {bytes:13, type:"str"},
...@@ -92,7 +92,7 @@ struct.natvpgm_t={ ...@@ -92,7 +92,7 @@ struct.natvpgm_t={
struct.hotkey_t={ struct.hotkey_t={
key: {bytes:UCHAR, type:"int"}, key: {bytes:UCHAR, type:"int"},
cmd: {bytes:LEN_CMD+1, type:"str"}, cmd: {bytes:LEN_CMD+1, type:"str"},
__PADDING__:16 __PADDING__:{bytes:16}
}; };
/* message group/sub record structures */ /* message group/sub record structures */
...@@ -130,7 +130,7 @@ struct.sub_t={ ...@@ -130,7 +130,7 @@ struct.sub_t={
moderated_ars: {bytes:LEN_ARSTR+1, type:"str"}, // was mod_arstr moderated_ars: {bytes:LEN_ARSTR+1, type:"str"}, // was mod_arstr
// *mod_ar; // *mod_ar;
qwk_conf: {bytes:UINT16_T, type:"int"}, // was qwkconf qwk_conf: {bytes:UINT16_T, type:"int"}, // was qwkconf
__PADDING__:53 __PADDING__:{bytes:53}
}; };
struct.grp_t={ struct.grp_t={
description: {bytes:LEN_GLNAME+1, type:"str"}, // was lname description: {bytes:LEN_GLNAME+1, type:"str"}, // was lname
...@@ -138,7 +138,7 @@ struct.grp_t={ ...@@ -138,7 +138,7 @@ struct.grp_t={
ars: {bytes:LEN_ARSTR+1, type:"str"}, // was arstr ars: {bytes:LEN_ARSTR+1, type:"str"}, // was arstr
code_prefix: {bytes:LEN_CODE+1, type:"str"}, code_prefix: {bytes:LEN_CODE+1, type:"str"},
// uchar *ar; // uchar *ar;
__PADDING__:87 __PADDING__:{bytes:87}
}; };
struct.qhubsub_t={ struct.qhubsub_t={
conf: {bytes:UINT16_T, type:"int"}, conf: {bytes:UINT16_T, type:"int"},
...@@ -159,7 +159,7 @@ struct.qhub_t={ ...@@ -159,7 +159,7 @@ struct.qhub_t={
// *conf; /* Conference number of ea. */ // *conf; /* Conference number of ea. */
// ulong *sub; /* Number of local sub-board for ea. */ // ulong *sub; /* Number of local sub-board for ea. */
// time32_t last; /* Last network attempt */ // time32_t last; /* Last network attempt */
__PADDING__:64 __PADDING__:{bytes:64}
}; };
struct.phub_t={ struct.phub_t={
days: {bytes:1, type:"str"}, days: {bytes:1, type:"str"},
...@@ -169,7 +169,7 @@ struct.phub_t={ ...@@ -169,7 +169,7 @@ struct.phub_t={
node: {bytes:UINT16_T, type:"str"}, node: {bytes:UINT16_T, type:"str"},
freq: {bytes:UINT16_T, type:"str"}, freq: {bytes:UINT16_T, type:"str"},
// time32_t last; /* Last network attempt */ // time32_t last; /* Last network attempt */
__PADDING__:64 __PADDING__:{bytes:64}
}; };
struct.node_dir_t={ struct.node_dir_t={
...@@ -186,7 +186,7 @@ struct.validation_set_t={ ...@@ -186,7 +186,7 @@ struct.validation_set_t={
cdt: {bytes:UINT32_T, type:"int"}, cdt: {bytes:UINT32_T, type:"int"},
exempt: {bytes:UINT32_T, type:"int"}, exempt: {bytes:UINT32_T, type:"int"},
rest: {bytes:UINT32_T, type:"int"}, rest: {bytes:UINT32_T, type:"int"},
__PADDING__:16 __PADDING__:{bytes:16}
}; };
struct.sec_level_t={ struct.sec_level_t={
...@@ -199,7 +199,7 @@ struct.sec_level_t={ ...@@ -199,7 +199,7 @@ struct.sec_level_t={
emailperday:{bytes:UINT16_T, type:"int"}, emailperday:{bytes:UINT16_T, type:"int"},
misc: {bytes:UINT32_T, type:"int"}, misc: {bytes:UINT32_T, type:"int"},
expireto: {bytes:UCHAR, type:"int"}, expireto: {bytes:UCHAR, type:"int"},
__PADDING__:11 __PADDING__:{bytes:11}
}; };
struct.cmd_shell_t={ struct.cmd_shell_t={
...@@ -207,7 +207,7 @@ struct.cmd_shell_t={ ...@@ -207,7 +207,7 @@ struct.cmd_shell_t={
code: {bytes:LEN_CODE+1, type:"str"}, code: {bytes:LEN_CODE+1, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
misc: {bytes:UINT32_T, type:"int"}, misc: {bytes:UINT32_T, type:"int"},
__PADDING__:16 __PADDING__:{bytes:16}
}; };
/* NOTE: top-level data structures only below this point /* NOTE: top-level data structures only below this point
...@@ -238,7 +238,7 @@ struct.main={ ...@@ -238,7 +238,7 @@ struct.main={
sys_deldays: {bytes:UINT16_T, type:"int"}, sys_deldays: {bytes:UINT16_T, type:"int"},
sys_exp_warn: {bytes:UCHAR, type:"int"}, sys_exp_warn: {bytes:UCHAR, type:"int"},
sys_autodel: {bytes:UINT16_T, type:"int"}, sys_autodel: {bytes:UINT16_T, type:"int"},
__PADDING__:1, __PADDING__: {bytes:1},
sys_chat_ars: {bytes:LEN_ARSTR+1, type:"str"}, // sys_chat_ar sys_chat_ars: {bytes:LEN_ARSTR+1, type:"str"}, // sys_chat_ar
cdt_min_value: {bytes:UINT16_T, type:"int"}, cdt_min_value: {bytes:UINT16_T, type:"int"},
max_minutes: {bytes:UINT32_T, type:"int"}, max_minutes: {bytes:UINT32_T, type:"int"},
...@@ -264,7 +264,8 @@ struct.main={ ...@@ -264,7 +264,8 @@ struct.main={
new_install: {bytes:UCHAR, type:"int"}, new_install: {bytes:UCHAR, type:"int"},
newuser_msgscan_init: {bytes:UINT16_T, type:"int"}, // new_msgcan_init newuser_msgscan_init: {bytes:UINT16_T, type:"int"}, // new_msgcan_init
guest_msgscan_init: {bytes:UINT16_T, type:"int"}, guest_msgscan_init: {bytes:UINT16_T, type:"int"},
__PADDING1__:10, min_pwlen: {bytes:UCHAR, type:"int"},
__PADDING1__: {bytes:9},
expired_level: {bytes:UCHAR, type:"int"}, expired_level: {bytes:UCHAR, type:"int"},
expired_flags1: {bytes:UINT32_T, type:"int"}, expired_flags1: {bytes:UINT32_T, type:"int"},
expired_flags2: {bytes:UINT32_T, type:"int"}, expired_flags2: {bytes:UINT32_T, type:"int"},
...@@ -286,7 +287,15 @@ struct.main={ ...@@ -286,7 +287,15 @@ struct.main={
scanposts_mod: {bytes:LEN_CMD+1, type:"str"}, scanposts_mod: {bytes:LEN_CMD+1, type:"str"},
scansubs_mod: {bytes:LEN_CMD+1, type:"str"}, scansubs_mod: {bytes:LEN_CMD+1, type:"str"},
listmsgs_mod: {bytes:LEN_CMD+1, type:"str"}, listmsgs_mod: {bytes:LEN_CMD+1, type:"str"},
__PADDING2__:569, textsec_mod: {bytes:LEN_MODNAME+1, type:"str"},
automsg_mod: {bytes:LEN_MODNAME+1, type:"str"},
xtrnsec_mod: {bytes:LEN_MODNAME+1, type:"str"},
__PADDING2__: {bytes:34},
nodelist_mod: {bytes:LEN_CMD+1, type:"str"},
whosonline_mod: {bytes:LEN_CMD+1, type:"str"},
privatemsg_mod: {bytes:LEN_CMD+1, type:"str"},
logonlist_mod: {bytes:LEN_CMD+1, type:"str"},
__PADDING3__: {bytes:252},
user_backup_level: {bytes:UINT16_T, type:"int"}, user_backup_level: {bytes:UINT16_T, type:"int"},
mail_backup_level: {bytes:UINT16_T, type:"int"}, mail_backup_level: {bytes:UINT16_T, type:"int"},
validation_set: {bytes:struct.validation_set_t, type:"lst", length: 10}, validation_set: {bytes:struct.validation_set_t, type:"lst", length: 10},
...@@ -314,9 +323,9 @@ struct.msg={ ...@@ -314,9 +323,9 @@ struct.msg={
preqwk_ars: {bytes:LEN_ARSTR+1, type:"str"}, // preqwk_ar preqwk_ars: {bytes:LEN_ARSTR+1, type:"str"}, // preqwk_ar
smb_retry_time: {bytes:UCHAR, type:"int"}, smb_retry_time: {bytes:UCHAR, type:"int"},
max_qwkmsgage: {bytes:UINT16_T, type:"int"}, max_qwkmsgage: {bytes:UINT16_T, type:"int"},
__PADDING1__:466, __PADDING1__: {bytes:466},
settings: {bytes:UINT32_T, type:"int"}, // was msg_misc settings: {bytes:UINT32_T, type:"int"}, // was msg_misc
__PADDING2__:510, __PADDING2__: {bytes:510},
grp: {bytes:struct.grp_t, type:"lst"}, grp: {bytes:struct.grp_t, type:"lst"},
sub: {bytes:struct.sub_t, type:"lst"}, sub: {bytes:struct.sub_t, type:"lst"},
fido_addr_list: {bytes:struct.faddr_t, type:"lst"}, fido_addr_list: {bytes:struct.faddr_t, type:"lst"},
...@@ -329,15 +338,15 @@ struct.msg={ ...@@ -329,15 +338,15 @@ struct.msg={
fido_netmail_misc: {bytes:UINT16_T, type:"int"}, fido_netmail_misc: {bytes:UINT16_T, type:"int"},
fido_netmail_cost: {bytes:UINT32_T, type:"int"}, fido_netmail_cost: {bytes:UINT32_T, type:"int"},
fido_default_addr: {bytes:struct.faddr_t, type:"obj"}, fido_default_addr: {bytes:struct.faddr_t, type:"obj"},
__PADDING3__:56, __PADDING3__: {bytes:56},
qwknet_default_tagline:{bytes:128, type:"str"}, qwknet_default_tagline:{bytes:128, type:"str"},
qwknet_hub: {bytes:struct.qhub_t, type:"lst"}, qwknet_hub: {bytes:struct.qhub_t, type:"lst"},
__PADDING4__:64, __PADDING4__: {bytes:64},
__PADDING5__:11, __PADDING5__: {bytes:11},
postlink_num: {bytes:UINT32_T, type:"int"}, postlink_num: {bytes:UINT32_T, type:"int"},
postlink_hub: {bytes:struct.phub_t, type:"lst"}, postlink_hub: {bytes:struct.phub_t, type:"lst"},
postlink_name: {bytes:13, type:"str"}, postlink_name: {bytes:13, type:"str"},
__PADDING6__:64, __PADDING6__: {bytes:64},
sys_inetaddr: {bytes:128, type:"str"}, sys_inetaddr: {bytes:128, type:"str"},
inetmail_sem: {bytes:LEN_DIR+1, type:"str"}, inetmail_sem: {bytes:LEN_DIR+1, type:"str"},
inetmail_misc: {bytes:UINT32_T, type:"str"}, inetmail_misc: {bytes:UINT32_T, type:"str"},
...@@ -369,7 +378,7 @@ struct.dir_t={ ...@@ -369,7 +378,7 @@ struct.dir_t={
max_age: {bytes:UINT16_T, type:"int"}, max_age: {bytes:UINT16_T, type:"int"},
upload_pct: {bytes:UINT16_T, type:"int"}, upload_pct: {bytes:UINT16_T, type:"int"},
download_pct: {bytes:UINT16_T, type:"int"}, download_pct: {bytes:UINT16_T, type:"int"},
__PADDING__:49 __PADDING__: {bytes:49}
}; };
struct.lib_t={ struct.lib_t={
description: {bytes:LEN_GLNAME+1, type:"str"}, description: {bytes:LEN_GLNAME+1, type:"str"},
...@@ -379,7 +388,7 @@ struct.lib_t={ ...@@ -379,7 +388,7 @@ struct.lib_t={
code_prefix: {bytes:LEN_CODE+1, type:"str"}, code_prefix: {bytes:LEN_CODE+1, type:"str"},
sort: {bytes:1, type:"int"}, sort: {bytes:1, type:"int"},
settings: {bytes:UINT32_T, type:"int"}, settings: {bytes:UINT32_T, type:"int"},
__PADDING__:34 __PADDING__: {bytes:34}
}; };
/* Extractable File Types */ /* Extractable File Types */
...@@ -387,7 +396,7 @@ struct.fextr_t={ ...@@ -387,7 +396,7 @@ struct.fextr_t={
extension: {bytes:4, type:"str"}, extension: {bytes:4, type:"str"},
cmd: {bytes:LEN_CMD+1, type:"str"}, cmd: {bytes:LEN_CMD+1, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
/* Compressable File Types */ /* Compressable File Types */
...@@ -395,7 +404,7 @@ struct.fcomp_t={ ...@@ -395,7 +404,7 @@ struct.fcomp_t={
extension: {bytes:4, type:"str"}, extension: {bytes:4, type:"str"},
cmd: {bytes:LEN_CMD+1, type:"str"}, cmd: {bytes:LEN_CMD+1, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
/* Viewable File Types */ /* Viewable File Types */
...@@ -403,7 +412,7 @@ struct.fview_t={ ...@@ -403,7 +412,7 @@ struct.fview_t={
extension: {bytes:4, type:"str"}, extension: {bytes:4, type:"str"},
cmd: {bytes:LEN_CMD+1, type:"str"}, cmd: {bytes:LEN_CMD+1, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
/* Testable File Types */ /* Testable File Types */
...@@ -412,7 +421,7 @@ struct.ftest_t={ ...@@ -412,7 +421,7 @@ struct.ftest_t={
cmd: {bytes:LEN_CMD+1, type:"str"}, cmd: {bytes:LEN_CMD+1, type:"str"},
working: {bytes:41, type:"str"}, working: {bytes:41, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
/* Download Events */ /* Download Events */
...@@ -421,7 +430,7 @@ struct.dlevent_t={ ...@@ -421,7 +430,7 @@ struct.dlevent_t={
cmd: {bytes:LEN_CMD+1, type:"str"}, cmd: {bytes:LEN_CMD+1, type:"str"},
working: {bytes:41, type:"str"}, working: {bytes:41, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
/* File Transfer Protocol (drivers) */ /* File Transfer Protocol (drivers) */
...@@ -436,19 +445,19 @@ struct.prot_t={ ...@@ -436,19 +445,19 @@ struct.prot_t={
bicmd: {bytes:LEN_CMD+1, type:"str"}, bicmd: {bytes:LEN_CMD+1, type:"str"},
settings: {bytes:UINT32_T, type:"int"}, // misc settings: {bytes:UINT32_T, type:"int"}, // misc
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
struct.altpath_t={ struct.altpath_t={
path: {bytes:LEN_DIR+1, type:"str"}, path: {bytes:LEN_DIR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
struct.txtsec_t={ struct.txtsec_t={
name: {bytes:41, type:"str"}, name: {bytes:41, type:"str"},
code: {bytes:LEN_CODE+1, type:"str"}, code: {bytes:LEN_CODE+1, type:"str"},
ars: {bytes:LEN_ARSTR+1, type:"str"}, ars: {bytes:LEN_ARSTR+1, type:"str"},
__PADDING__:16 __PADDING__: {bytes:16}
}; };
/* file transfer configuration (file.cnf) */ /* file transfer configuration (file.cnf) */
...@@ -457,14 +466,14 @@ struct.file={ ...@@ -457,14 +466,14 @@ struct.file={
max_batup: {bytes:UINT16_T, type:"int"}, max_batup: {bytes:UINT16_T, type:"int"},
max_batdn: {bytes:UINT16_T, type:"int"}, max_batdn: {bytes:UINT16_T, type:"int"},
max_userxfer: {bytes:UINT16_T, type:"int"}, max_userxfer: {bytes:UINT16_T, type:"int"},
__PADDING1__:4, __PADDING1__: {bytes:4},
cdt_up_pct: {bytes:UINT16_T, type:"int"}, cdt_up_pct: {bytes:UINT16_T, type:"int"},
cdt_dn_pct: {bytes:UINT16_T, type:"int"}, cdt_dn_pct: {bytes:UINT16_T, type:"int"},
__PADDING2__:68, __PADDING2__: {bytes:68},
leech_pct: {bytes:UINT16_T, type:"int"}, leech_pct: {bytes:UINT16_T, type:"int"},
leech_sec: {bytes:UINT16_T, type:"int"}, leech_sec: {bytes:UINT16_T, type:"int"},
settings: {bytes:UINT32_T, type:"int"}, settings: {bytes:UINT32_T, type:"int"},
__PADDING3__:60, __PADDING3__: {bytes:60},
fextr: {bytes:struct.fextr_t, type:"lst"}, fextr: {bytes:struct.fextr_t, type:"lst"},
fcomp: {bytes:struct.fcomp_t, type:"lst"}, fcomp: {bytes:struct.fcomp_t, type:"lst"},
fview: {bytes:struct.fview_t, type:"lst"}, fview: {bytes:struct.fview_t, type:"lst"},
......
...@@ -42,13 +42,12 @@ var CNF = new (function() { ...@@ -42,13 +42,12 @@ var CNF = new (function() {
/* get record padding */ /* get record padding */
function getPadding(file,bytes) { function getPadding(file,bytes) {
file.position += bytes; return file.read(bytes);
return false;
} }
/* set record padding */ /* set record padding */
function setPadding(file,bytes) { function setPadding(file,struct) {
setStr(file,bytes,""); file.write(struct.data,struct.bytes);
} }
/* read a set of records from *.cnf */ /* read a set of records from *.cnf */
...@@ -70,7 +69,7 @@ var CNF = new (function() { ...@@ -70,7 +69,7 @@ var CNF = new (function() {
if(file.eof) if(file.eof)
break; break;
if(p.match(/__PADDING\d*__/)) if(p.match(/__PADDING\d*__/))
getPadding(file,struct[p]); struct[p].data = getPadding(file,struct[p].bytes);
else { else {
switch(struct[p].type) { switch(struct[p].type) {
case "int": case "int":
......
...@@ -53,6 +53,8 @@ var impose_limit = true; ...@@ -53,6 +53,8 @@ var impose_limit = true;
var sysop_login = false; var sysop_login = false;
var add_tag = true; var add_tag = true;
var ex_ascii = true; var ex_ascii = true;
var force_newsgroups = false;
var filter_newsgroups = false;
// Parse arguments // Parse arguments
for(i=0;i<argc;i++) { for(i=0;i<argc;i++) {
...@@ -70,6 +72,10 @@ for(i=0;i<argc;i++) { ...@@ -70,6 +72,10 @@ for(i=0;i<argc;i++) {
add_tag = false; add_tag = false;
else if(argv[i].toLowerCase()=="-ascii") else if(argv[i].toLowerCase()=="-ascii")
ex_ascii = false; ex_ascii = false;
else if(argv[i].toLowerCase()=="-force")
force_newsgroups = true;
else if(argv[i].toLowerCase()=="-filter")
filter_newsgroups = true;
else if(argv[i].toLowerCase()=="-auto") { else if(argv[i].toLowerCase()=="-auto") {
no_anonymous = true; no_anonymous = true;
auto_login = true; auto_login = true;
...@@ -142,6 +148,21 @@ function count_msgs(msgbase) ...@@ -142,6 +148,21 @@ function count_msgs(msgbase)
return { total: count, first: first, last: last }; return { total: count, first: first, last: last };
} }
function get_newsgroup_list()
{
// list of newsgroup names the logged-in user has access to
var newsgroup_list = [];
if(include_mail) {
newsgroup_list.push("mail");
}
for(var g in msg_area.grp_list) {
for(var s in msg_area.grp_list[g].sub_list) {
newsgroup_list.push(msg_area.grp_list[g].sub_list[s].newsgroup);
}
}
return newsgroup_list;
}
function bogus_cmd(cmdline) function bogus_cmd(cmdline)
{ {
log(LOG_DEBUG, "Received bogus command: '" + cmdline + "'"); log(LOG_DEBUG, "Received bogus command: '" + cmdline + "'");
...@@ -758,18 +779,20 @@ while(client.socket.is_connected && !quit) { ...@@ -758,18 +779,20 @@ while(client.socket.is_connected && !quit) {
if(hdr.path==undefined) if(hdr.path==undefined)
hdr.path="not-for-mail"; hdr.path="not-for-mail";
if(hdr.newsgroups==undefined) if(hdr.newsgroups==undefined || force_newsgroups)
hdr.newsgroups = selected.newsgroup; hdr.newsgroups = selected.newsgroup;
else { /* Tracker1's mod for adding the correct newsgroup name */ else {
var ng_found = false; /* Requires sbbs v3.13 */ var nghdr_list = hdr.newsgroups.split(',');
var ng_list = hdr.newsgroups.split(','); var newsgroup_list = get_newsgroup_list();
for(n in ng_list) var filtered_list = [];
if(ng_list[n].toLowerCase() == selected.newsgroup.toLowerCase()) { for(var n in nghdr_list) {
ng_found = true; if(filter_newsgroups && newsgroup_list.indexOf(nghdr_list[n]) < 0)
break; continue;
filtered_list.push(nghdr_list[n]);
} }
if(!ng_found) if(filtered_list.indexOf(selected.newsgroup) < 0)
hdr.newsgroups = selected.newsgroup + ',' + hdr.newsgroups; filtered_list.push(selected.newsgroup);
hdr.newsgroups = filtered_list.join(',');
} }
if(hdr.from_org==undefined && !hdr.from_net_type) if(hdr.from_org==undefined && !hdr.from_net_type)
......
...@@ -160,13 +160,19 @@ char sbbs_t::putmsgfrag(const char* buf, long* mode, long org_cols, JSObject* ob ...@@ -160,13 +160,19 @@ char sbbs_t::putmsgfrag(const char* buf, long* mode, long org_cols, JSObject* ob
break; break;
} }
if((*mode) & P_MARKUP) { if((*mode) & P_MARKUP) {
if(((mark == 0) && (str[l] == '*' || str[l] == '/' || str[l] == '_' || str[l] == '#')) || str[l] == mark) { const char* marks = "*/_#";
if(((mark == 0) && strchr(marks, str[l]) != NULL) || str[l] == mark) {
char* next = NULL; char* next = NULL;
if(mark == 0) char following = '\0';
if(mark == 0) {
next = strchr(str + l + 1, str[l]); next = strchr(str + l + 1, str[l]);
if(next != NULL)
following = *(next + 1);
}
char *blank = strstr(str + l + 1, "\n\r"); char *blank = strstr(str + l + 1, "\n\r");
if(((l < 1 || IS_WHITESPACE(str[l - 1]) || IS_PUNCTUATION(str[l - 1])) if(((l < 1 || ((IS_WHITESPACE(str[l - 1]) || IS_PUNCTUATION(str[l - 1])) && strchr(marks, str[l - 1]) == NULL))
&& IS_ALPHANUMERIC(str[l + 1]) && mark == 0 && next != NULL && (*(next + 1) == '\0' || IS_WHITESPACE(*(next + 1)) || IS_PUNCTUATION(*(next+1))) && IS_ALPHANUMERIC(str[l + 1]) && mark == 0 && next != NULL
&& (following == '\0' || IS_WHITESPACE(following) || (IS_PUNCTUATION(following) && strchr(marks, following) == NULL))
&& (blank == NULL || next < blank)) && (blank == NULL || next < blank))
|| str[l] == mark) { || str[l] == mark) {
if(mark == 0) if(mark == 0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment