changeset 127:b525c4f78ef7

Use listdir/moderation for the mails up for moderation and use moderation/queue as temporary queue for the mails to the moderators. Send the From: info to listcontrol. Adapt to the fact that we now get info from all headers matching token. Remove basename use, since mybasename does not modify variable.
author mmj
date Sat, 29 May 2004 23:53:16 +1000
parents 50b140434da4
children fc7dabe4ba65
files src/listcontrol.c src/mlmmj-process.c
diffstat 2 files changed, 43 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/src/listcontrol.c	Sat May 29 23:48:09 2004 +1000
+++ b/src/listcontrol.c	Sat May 29 23:53:16 2004 +1000
@@ -211,8 +211,7 @@
 
 	case CTRL_MODERATE:
 		/* TODO Add accept/reject parameter to moderate */
-		moderatefilename = concatstr(3, listdir, "/moderation/queue/",
-						       param);
+		moderatefilename = concatstr(3, listdir, "/moderation/", param);
 		free(param);
 		if(stat(moderatefilename, &stbuf) < 0) {
 			free(moderatefilename);
--- a/src/mlmmj-process.c	Sat May 29 23:48:09 2004 +1000
+++ b/src/mlmmj-process.c	Sat May 29 23:53:16 2004 +1000
@@ -50,8 +50,7 @@
 		free(moderatorfilename);
 		exit(EXIT_FAILURE);
 	}
-	queuefilename = concatstr(4, listdir, "/queue/", randomstr,
-				  ".moderaterequest");
+	queuefilename = concatstr(3, listdir, "/moderation/queue", randomstr);
 	printf("%s\n", queuefilename);
 	
 	if((queuefile = fopen(queuefilename, "w")) == NULL) {
@@ -150,20 +149,22 @@
 
 int main(int argc, char **argv)
 {
-	int fd, opt, noprocess = 0, moderated = 0;
+	int i, fd, opt, noprocess = 0, moderated = 0;
 	char *listdir = NULL, *mailfile = NULL, *headerfilename = NULL;
 	char *footerfilename = NULL, *donemailname = NULL;
-	char *randomstr = random_str(), *basename, *mqueuename;
+	char *randomstr = random_str(), *mqueuename;
 	char *mlmmjsend, *mlmmjsub, *mlmmjunsub, *mlmmjbounce;
-	char *bindir, *subjectprefix;
+	char *bindir, *subjectprefix, *discardname;
 	FILE *headerfile, *footerfile, *rawmailfile, *donemailfile;
+	struct email_container fromemails = { 0, NULL };
 	struct email_container toemails = { 0, NULL };
+/*	struct email_container ccemails = { 0, NULL };*/
 	const char *badheaders[] = { "From ", "Return-Path:", NULL };
 	struct mailhdr readhdrs[] = {
-		{ "To:", NULL },
-		{ "Cc:", NULL },
-		{ "From:", NULL },
-		{ NULL, NULL }
+		{ "From:", 0, NULL },
+		{ "To:", 0, NULL },
+/*		{ "Cc:", 0, NULL },*/
+		{ NULL, 0, NULL }
 	};
 
 	log_set_name(argv[0]);
@@ -200,15 +201,12 @@
 		exit(EXIT_FAILURE);
 	}
 
-	basename = strdup(randomstr);
-	free(randomstr);
-	donemailname = concatstr(3, listdir, "/queue/", basename);
+	donemailname = concatstr(3, listdir, "/queue/", randomstr);
 	fd = open(donemailname, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
 	while(fd == -1 && errno == EEXIST) {
 		free(donemailname);
 		randomstr = random_str();
 		donemailname = concatstr(3, listdir, "/queue/", randomstr);
-		free(randomstr);
 		fd = open(donemailname, O_RDWR|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR);
 	}
 	
@@ -258,27 +256,39 @@
 	if(footerfile)
 		fclose(footerfile);
 
-	if(readhdrs[0].value) {
-		find_email_adr(readhdrs[0].value, &toemails);
-#if 0
-		for(i = 0; i < toemails.emailcount; i++)
-			printf("toemails.emaillist[%d] = %s\n", i,
-					toemails.emaillist[i]);
+	if(readhdrs[0].token) { /* From: addresses */
+		for(i = 0; i < readhdrs[0].valuecount; i++) {
+			find_email_adr(readhdrs[0].values[i], &fromemails);
 	}
-	if(readhdrs[1].value) {
-		find_email_adr(readhdrs[1].value, &ccemails);
-		for(i = 0; i < ccemails.emailcount; i++)
-			printf("ccemails.emaillist[%d] = %s\n", i,
-					ccemails.emaillist[i]);
-#endif
+		if(fromemails.emailcount != 1) { /* discard malformed mail */
+			discardname = concatstr(3, listdir,
+						"/queue/discarded/",
+						randomstr);
+			rename(donemailname, discardname);
+			free(donemailname);
+			free(discardname);
+			/* TODO: free emailstructs */
+			exit(EXIT_SUCCESS);
+		}
 	}
 
-
+	if(readhdrs[1].token) { /* To: addresses */
+		for(i = 0; i < readhdrs[1].valuecount; i++) {
+			find_email_adr(readhdrs[1].values[i], &toemails);
+		}
+	}
+#if 0
+	if(readhdrs[2].token) { /* Cc: addresses */
+		for(j = 0; j < readhdrs[1].valuecount; j++) {
+			find_email_adr(readhdrs[1].values[j], &ccemails);
+		}
+	}
+#endif
 	if(strchr(toemails.emaillist[0], RECIPDELIM)) {
 #if 0
-		log_error(LOG_ARGS, "listcontrol(%s, %s, %s, %s, %s, %s, %s)\n", donemailname, listdir, toemails.emaillist[0], mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce);
+		log_error(LOG_ARGS, "listcontrol(from, %s, %s, %s, %s, %s, %s)\n", listdir, toemails.emaillist[0], mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce);
 #endif
-		listcontrol(donemailname, listdir, toemails.emaillist[0],
+		listcontrol(&fromemails, listdir, toemails.emaillist[0],
 			    mlmmjsub, mlmmjunsub, mlmmjsend, mlmmjbounce);
 		return EXIT_SUCCESS;
 	}
@@ -286,11 +296,11 @@
 	moderated = statctrl(listdir, "moderated");
 
 	if(moderated) {
-		mqueuename = concatstr(3, listdir, "/moderation/queue/",
-				       basename);
+		mqueuename = concatstr(3, listdir, "/moderation/",
+				       randomstr);
 		printf("Going into moderatemode, mqueuename = [%s]\n",
 				mqueuename);
-		free(basename);
+		free(randomstr);
 		if(rename(donemailname, mqueuename) < 0) {
 			printf("could not rename(%s,%s)\n", 
 					    donemailname, mqueuename);