From 47dc434cfad342af087ddb3330281b51d58c5728 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 20 Apr 2004 09:27:10 +0000
Subject: [PATCH] Uses new convert_msg_header() function from mailproc_util.js.
 Created get_user_list() utility function. Fixed bug in write_user_list() -
 wasn't rewinding the file position when truncating the file. Added more
 details to the subscription/user list. Only allow subscribers to contribute
 messages.

---
 exec/listserver.js | 58 +++++++++++++++++++++++++++++++++-------------
 1 file changed, 42 insertions(+), 16 deletions(-)

diff --git a/exec/listserver.js b/exec/listserver.js
index a65a5c5102..c4a7f29e84 100644
--- a/exec/listserver.js
+++ b/exec/listserver.js
@@ -95,6 +95,7 @@ if(this.recipient_list_filename!=undefined) {
 	load("mailproc_util.js");	// import parse_msg_header() and get_msg_body()
 
 	var header = parse_msg_header(msgtxt);
+	header = convert_msg_header(header);
 	var body = get_msg_body(msgtxt);
 
 	var r;
@@ -123,14 +124,14 @@ if(this.recipient_list_filename!=undefined) {
 		var resp_hdr = {};
 
 		resp_hdr.subject		= "Synchronet ListServer Results";
-		resp_hdr.to				= sender_name;
-		resp_hdr.to_net_addr	= sender_address;
+		resp_hdr.to				= header.from;
+		resp_hdr.to_net_addr	= header.from_net_addr;
 		resp_hdr.to_net_type	= NET_INTERNET;
 		resp_hdr.from			= listserver_name;
 		resp_hdr.from_net_addr	= listserver_address;
 		resp_hdr.from_net_type	= NET_INTERNET;
 		resp_hdr.from_agent		= AGENT_PROCESS;
-		resp_hdr.reply_id		= header["message-id"];
+		resp_hdr.reply_id		= header.id;
 
 		/* Write response to message */
 		if(mailbase.save_msg(resp_hdr, response.body.join('\r\n')))
@@ -188,15 +189,11 @@ for(var l in list_array) {
 	}
 
 	/* Get subscriber list */
-	var user_fname = list_array[l].msgbase_file + user_list_ext;
-	user_file = new File(user_fname);
-	if(!user_file.open("r")) {
-		log(LOG_ERR,format("%s !ERROR %d opening file: %s"
-			,list_name, user_file.error, user_fname));
+	var user_list = get_user_list(list_array[l]);
+	if(!user_list.length) {
 		delete msgbase;
 		continue;
 	}
-	user_list = user_file.iniGetAllObjects();
 
 /***
 	if(!user_list.length) {
@@ -359,6 +356,21 @@ function process_control_msg(cmd_list)
 	return(response);
 }
 
+function get_user_list(list)
+{
+	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")) {
+		log(LOG_ERR,format("%s !ERROR %d opening file: %s"
+			,list.name, user_file.error, user_fname));
+	} else {
+		user_list = user_file.iniGetAllObjects();
+		user_file.close();
+	}
+	return user_list;
+}
+
 function find_user(user_list, address)
 {
 	for(var u in user_list)
@@ -377,6 +389,7 @@ function remove_user(user_list, address)
 
 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 + "]");
@@ -411,8 +424,15 @@ function subscription_control(cmd, list, address)
 			return("!subscriber not found: " + address);
 		case "subscribe":
 			if(find_user(user_list, address)!=-1)
-				return log(address + " already subscribed");
-			user_list.push({ name: sender_name, address: address });
+				return log(address + " is already subscribed");
+			var now=time();
+			user_list.push({ 
+				 name:					sender_name 
+				,address:				address
+				,created:				system.timestr(now)
+				,last_activity:			system.timestr(now)
+				,last_activity_time:	format("%08lxh",now)
+			});
 			write_user_list(user_list, user_file);
 			return log(address + " subscription successful");
 	}
@@ -423,19 +443,25 @@ function process_contribution(header, body, list)
 {
 	// ToDo: apply filtering here?
 
-	var msgbase=new MsgBase(list.sub);
+	var user_list = get_user_list(list);
 
-	// ToDo: verify author/sender is a list subscriber here
+	// verify author/sender is a list subscriber here
 
+	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)));
+		return(false);
+	}
+
+	var msgbase=new MsgBase(list.sub);
 	if(!msgbase.open()) {
 		error_file.writeln(log(LOG_ERR,format("%s !ERROR %s opening msgbase: %s"
 			,list.name, msgbase.error, list.sub)));
 		return(false);
 	}
 
-	// ToDo: Split header.from into separate name/address fields here
-
-	header.id = header["message-id"]; // Convert to Synchronet-compatible
+	// Convert from RFC822 to Synchronet-compatible
+	header = convert_msg_header(header);
 
 	if(!user.compare_ars(msgbase.cfg.moderated_ars))
 		header.attr |= MSG_MODERATED;
-- 
GitLab