diff --git a/exec/listserver.js b/exec/listserver.js index 9b5ec36befb501e7959788b50ad37b216e3f2b54..e10a7be7929375ea2d37e05ef042bc6a6fdf9a23 100644 --- a/exec/listserver.js +++ b/exec/listserver.js @@ -15,7 +15,7 @@ var ini_fname = system.ctrl_dir + "listserver.ini"; ini_file = new File(ini_fname); if(!ini_file.open("r")) { - log(LOG_ERR,format("!ERROR %s opening ini_file: %s" + log(LOG_ERR,format("!ERROR %d opening ini_file: %s" ,ini_file.error, ini_fname)); exit(); } @@ -31,29 +31,32 @@ if(!list_array.length) { } for(var l in list_array) { + + var list = list_array[l]; + /* Set default list addresses */ - if(!list_array[l].address) - list_array[l].address = format("%s@%s", list_array[l].name, system.inet_addr); - if(!msg_area.sub[list_array[l].sub]) { - log(LOG_WARNING,"!Unrecognized sub-board internal code: " + list_array[l].sub); - list_array[l].disabled=true; + if(!list.address) + list.address = format("%s@%s", list.name, system.inet_addr); + if(!msg_area.sub[list.sub]) { + log(LOG_WARNING,"!Unrecognized sub-board internal code: " + list.sub); + list.disabled=true; continue; } - if(!list_array[l].description) - list_array[l].description = msg_area.sub[list_array[l].sub].description; - if(list_array[l].confirm==undefined) - list_array[l].confirm=true; + if(!list.description) + list.description = msg_area.sub[list.sub].description; + if(list.confirm==undefined) + list.confirm=true; - var msgbase = new MsgBase(list_array[l].sub); + var msgbase = new MsgBase(list.sub); if(msgbase.open()==false) { log(LOG_ERR,format("%s !ERROR %s opening msgbase: %s" - ,list_array[l].name, msgbase.error, list_array[l].sub)); + ,list.name, msgbase.error, list.sub)); continue; } - list_array[l].msgbase_file = msgbase.file; + list.msgbase_file = msgbase.file; /* Create the user list file if it doesn't exist */ - var user_fname = list_array[l].msgbase_file + user_list_ext; + var user_fname = list.msgbase_file + user_list_ext; if(!file_exists(user_fname)) file_touch(user_fname); } @@ -69,14 +72,14 @@ if(this.recipient_list_filename!=undefined) { var error_file = new File(processing_error_filename); if(!error_file.open("w")) { - log(LOG_ERR,format("!ERROR %s opening processing error file: %s" + log(LOG_ERR,format("!ERROR %d opening processing error file: %s" ,error_file.error, processing_error_filename)); exit(); } var rcptlst_file = new File(recipient_list_filename); if(!rcptlst_file.open("r")) { - error_file.writeln(log(LOG_ERR,format("!ERROR %s opening recipient list: %s" + error_file.writeln(log(LOG_ERR,format("!ERROR %d opening recipient list: %s" ,rcptlst_file.error, recipient_list_filename))); exit(); } @@ -85,7 +88,7 @@ if(this.recipient_list_filename!=undefined) { var msgtxt_file = new File(message_text_filename); if(!msgtxt_file.open("r")) { - error_file.writeln(log(LOG_ERR,format("!ERROR %s opening message text: %s" + error_file.writeln(log(LOG_ERR,format("!ERROR %d opening message text: %s" ,msgtxt_file.error, message_text_filename))); exit(); } @@ -123,7 +126,7 @@ if(this.recipient_list_filename!=undefined) { var response = process_control_msg(body); var resp_hdr = {}; - resp_hdr.subject = "Synchronet ListServer Results"; + resp_hdr.subject = listserver_name + " Response"; resp_hdr.to = header.from; resp_hdr.to_net_addr = header.from_net_addr; resp_hdr.to_net_type = NET_INTERNET; @@ -147,20 +150,21 @@ if(this.recipient_list_filename!=undefined) { for(r=0;r<rcpt_list.length;r++) { var l; for(l=0;l<list_array.length;l++) { + var list = list_array[l]; /** DEBUG - for(var p in list_array[l]) - log("list_array["+l+"]."+p+" = "+list_array[l][p]); + for(var p in list) + log("list_array["+l+"]."+p+" = "+list[p]); **/ - if(rcpt_list[r].Recipient.toLowerCase()==list_array[l].address.toLowerCase() - && !list_array[l].disabled - && !list_array[l].readonly) + if(rcpt_list[r].Recipient.toLowerCase()==list.address.toLowerCase() + && !list.disabled + && !list.readonly) break; } if(l<list_array.length) { /* match found */ log(LOG_INFO,format("ListServer Contribution message from %s to %s: %s" ,header.from, rcpt_list[r].Recipient, header.subject)); - if(!process_contribution(header, body, list_array[l])) + if(!process_contribution(header, body, list)) break; } } @@ -175,21 +179,21 @@ for(var l in list_array) { break; } - if(list_array[l].disabled) - continue; + var list = list_array[l]; - list_name = list_array[l].name; + if(list.disabled) + continue; - msgbase = new MsgBase(list_array[l].sub); + msgbase = new MsgBase(list.sub); if(msgbase.open()==false) { log(LOG_ERR,format("%s !ERROR %s opening msgbase: %s" - ,list_name, msgbase.error, list_array[l].sub)); + ,list.name, msgbase.error, list.sub)); delete msgbase; continue; } /* Get subscriber list */ - var user_list = get_user_list(list_array[l]); + var user_list = get_user_list(list); if(!user_list.length) { delete msgbase; continue; @@ -197,18 +201,18 @@ for(var l in list_array) { /*** if(!user_list.length) { - log(LOG_NOTICE,"No subscribers to list: " + list_name); + log(LOG_NOTICE,"No subscribers to list: " + list.name); delete msgbase; continue; } ***/ /* Get export message pointer */ - ptr_fname = list_array[l].msgbase_file + ".list.ptr"; + ptr_fname = list.msgbase_file + ".list.ptr"; ptr_file = new File(ptr_fname); if(!ptr_file.open("w+")) { - log(LOG_ERR,format("%s !ERROR %s opening/creating file: %s" - ,list_name, ptr_file.error, ptr_fname)); + log(LOG_ERR,format("%s !ERROR %d opening/creating file: %s" + ,list.name, ptr_file.error, ptr_fname)); delete msgbase; continue; } @@ -224,25 +228,24 @@ for(var l in list_array) { for(;ptr<=last_msg && !js.terminated; ptr++) { hdr = msgbase.get_msg_header( /* retrieve by offset? */ false, - /* message number */ ptr, - /* regenerate msg-id? */ false + /* message number */ ptr ); if(hdr == null) { /** log(LOG_WARNING,format("%s !ERROR %s getting msg header #%lu" - ,list_name, msgbase.error, ptr)); + ,list.name, msgbase.error, ptr)); **/ continue; } if(hdr.attr&(MSG_DELETE|MSG_PRIVATE)) { /* marked for deletion */ log(LOG_NOTICE,format("%s Skipping %s message #%lu from %s: %s" - ,list_name, hdr.attr&MSG_DELETE ? "deleted":"private" + ,list.name, hdr.attr&MSG_DELETE ? "deleted":"private" ,ptr, hdr.from, hdr.subject)); continue; } if(hdr.attr&MSG_MODERATED && !(hdr.attr&MSG_VALIDATED)) { log(LOG_NOTICE,format("%s Stopping at unvalidated moderated message #%lu from %s: %s" - ,list_name, ptr, hdr.from, hdr.subject)); + ,list.name, ptr, hdr.from, hdr.subject)); ptr--; break; } @@ -256,7 +259,7 @@ for(var l in list_array) { ); if(body == null) { log(LOG_ERR,format("%s !ERROR %s reading text of message #%lu" - ,list_name, msgbase.error, ptr)); + ,list.name, msgbase.error, ptr)); continue; } @@ -267,7 +270,7 @@ for(var l in list_array) { if(user_list[u].disabled || !user_list[u].address) continue; log(LOG_DEBUG,format("%s Enqueing message #%lu for %s <%s>" - ,list_name, ptr, user_list[u].name, user_list[u].address)); + ,list.name, ptr, user_list[u].name, user_list[u].address)); rcpt_list.push( { to: user_list[u].name, to_net_addr: user_list[u].address, to_net_type: NET_INTERNET @@ -278,18 +281,18 @@ for(var l in list_array) { break; } if(rcpt_list.length < 1) { - log(LOG_NOTICE,format("%s No active subscriptions", list_name)); + log(LOG_NOTICE,format("%s No active subscriptions", list.name)); continue; } log(LOG_INFO,format("%s Sending message #%lu from %s to %lu recipients: %s" - ,list_name, ptr, hdr.from, rcpt_list.length, hdr.subject)); + ,list.name, ptr, hdr.from, rcpt_list.length, hdr.subject)); hdr.replyto_net_type = NET_INTERNET; - hdr.replyto_net_addr = list_array[l].address; + hdr.replyto_net_addr = list.address; if(!mailbase.save_msg(hdr,body,rcpt_list)) log(LOG_ERR,format("%s !ERROR %s saving mail message" - ,list_name, mailbase.error)); + ,list.name, mailbase.error)); } if(ptr > last_msg) @@ -311,7 +314,7 @@ function process_control_msg(cmd_list) { var response = { body: new Array(), subject: "" }; - response.body.push("Synchronet ListServer " +REVISION+ " Response:\r\n"); + response.body.push(listserver_name + " " +REVISION+ " Response:\r\n"); for(var c in cmd_list) { var cmd=cmd_list[c]; @@ -321,19 +324,22 @@ function process_control_msg(cmd_list) switch(token[0].toLowerCase()) { case "lists": response.body.push("List of lists:"); - for(var l in list_array) - if(!list_array[l].disabled) - response.body.push("\t"+list_array[l].name.toUpperCase() - +"\t\t"+list_array[l].description); + for(var l in list_array) { + var list = list_array[l]; + if(!list.disabled) + response.body.push("\t"+list.name.toUpperCase() + +"\t\t"+list.description); + } break; case "subscribe": case "unsubscribe": for(var l in list_array) { - if(list_array[l].disabled || list_array[l].closed) + var list = list_array[l]; + if(list.disabled || list.closed) continue; - if(list_array[l].name.toLowerCase()==token[1].toLowerCase() - || list_array[l].address.toLowerCase()==token[1].toLowerCase()) { - response.body.push(subscription_control(token[0], list_array[l], token[2])); + if(list.name.toLowerCase()==token[1].toLowerCase() + || list.address.toLowerCase()==token[1].toLowerCase()) { + response.body.push(subscription_control(token[0], list, token[2])); return(response); } } @@ -357,16 +363,29 @@ function process_control_msg(cmd_list) return(response); } -function get_user_list(list) +function open_user_list(list, mode) { - var user_list = new Array(); var user_fname = list.msgbase_file + user_list_ext; var user_file = new File(user_fname); - if(!user_file.open("r")) { + if(!user_file.open(mode)) { log(LOG_ERR,format("%s !ERROR %d opening file: %s" ,list.name, user_file.error, user_fname)); - } else { - user_list = user_file.iniGetAllObjects(); + return(null); + } + + return(user_file); +} + +function read_user_list(user_file) +{ + return user_file.iniGetAllObjects("address"); +} + +function get_user_list(list) +{ + var user_list = new Array(); + if((user_file = open_user_list("r")) != null) { + user_list = read_user_list(user_file); user_file.close(); } return user_list; @@ -393,9 +412,10 @@ function write_user_list(user_list, user_file) user_file.rewind(); user_file.length = 0; for(var u in user_list) { - user_file.writeln("[" + user_list[u].name + "]"); + user_file.writeln("[" + user_list[u].address + "]"); for(var p in user_list[u]) - user_file.writeln(p + " = " + user_list[u][p]); + if(p!="address") + user_file.writeln(format("%-25s",p) + " = " + user_list[u][p]); user_file.writeln(); } } @@ -409,13 +429,10 @@ function subscription_control(cmd, list, address) ,list.name,cmd,address)); /* Get subscriber list */ - var user_fname = list.msgbase_file + user_list_ext; - var user_file = new File(user_fname); - if(!user_file.open("r+")) - return log(LOG_ERR,format("%s !ERROR %d opening file: %s" - ,list.name, user_file.error, user_fname)); + if((user_file=open_user_list(list,"r+"))==null) + return log(LOG_ERR,format("%s !ERROR opening subscriber list",list.name)); - user_list = user_file.iniGetAllObjects(); + user_list = read_user_list(user_file); switch(cmd.toLowerCase()) { case "unsubscribe": @@ -436,7 +453,7 @@ function subscription_control(cmd, list, address) ,address: address ,created: system.timestr(now) ,last_activity: system.timestr(now) - ,last_activity_time: format("%08lxh",now) + ,last_activity_time: format("%08lx",now) }); write_user_list(user_list, user_file); return log(LOG_INFO,format("%s %s subscription successful" @@ -456,6 +473,10 @@ function process_contribution(header, body, list) if(find_user(user_list, sender_address)==-1) { error_file.writeln(log(LOG_WARNING,format("%s !ERROR %s is not a subscriber" ,list.name, sender_address))); +// error_file.writeln(); +// error_file.writeln("To subscribe to this list, send an e-mail to " +// + listserver_address); +// error_file.writeln("with \"subscribe " + list.name + "\" in the message body."); return(false); }