Browse Source

Plan 9 from Bell Labs 2008-01-29

David du Colombier 16 years ago
parent
commit
b8cbf33384

+ 9 - 9
dist/replica/_plan9.db

@@ -344,10 +344,10 @@
 386/bin/ndb - 20000000775 sys sys 985743147 0
 386/bin/ndb/cs - 775 sys sys 1188530160 148982
 386/bin/ndb/csquery - 775 sys sys 1176488418 61652
-386/bin/ndb/dns - 775 sys sys 1200774206 296663
-386/bin/ndb/dnsdebug - 775 sys sys 1200774212 270683
+386/bin/ndb/dns - 775 sys sys 1201551691 296647
+386/bin/ndb/dnsdebug - 775 sys sys 1201551695 270667
 386/bin/ndb/dnsquery - 775 sys sys 1185334136 64350
-386/bin/ndb/dnstcp - 775 sys sys 1200774217 268564
+386/bin/ndb/dnstcp - 775 sys sys 1201551700 268548
 386/bin/ndb/ipquery - 775 sys sys 1178568296 95524
 386/bin/ndb/mkdb - 775 sys sys 1168402340 64211
 386/bin/ndb/mkhash - 775 sys sys 1178568296 83312
@@ -475,7 +475,7 @@
 386/bin/upas/scanmail - 775 sys sys 1200262789 128213
 386/bin/upas/send - 775 sys sys 1200262792 192180
 386/bin/upas/smtp - 775 sys sys 1188530218 275629
-386/bin/upas/smtpd - 775 sys sys 1201321515 332115
+386/bin/upas/smtpd - 775 sys sys 1201551707 332410
 386/bin/upas/spam - 775 sys sys 1064598366 36
 386/bin/upas/testscan - 775 sys sys 1200262795 83864
 386/bin/upas/token - 775 sys sys 1188447329 73042
@@ -7875,7 +7875,7 @@ sys/man/8/scuzz - 664 sys sys 1196638948 8701
 sys/man/8/secstore - 664 sys sys 1196638948 1954
 sys/man/8/securenet - 664 sys sys 1196638948 3160
 sys/man/8/send - 664 sys sys 1196638948 2168
-sys/man/8/smtp - 664 sys sys 1200091729 5401
+sys/man/8/smtp - 664 sys sys 1201502316 5493
 sys/man/8/snoopy - 664 sys sys 1196638948 4442
 sys/man/8/stats - 664 sys sys 1196638948 4336
 sys/man/8/statusbar - 664 sys sys 1196638948 1254
@@ -12821,7 +12821,7 @@ sys/src/cmd/ndb/dblookup.c - 664 sys sys 1193284932 25375
 sys/src/cmd/ndb/dn.c - 664 sys sys 1200424507 37507
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1197930912 3278
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1200511964 35530
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1201499792 35562
 sys/src/cmd/ndb/dns.c - 664 sys sys 1200429502 17583
 sys/src/cmd/ndb/dns.h - 664 sys sys 1194216527 11889
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1194216583 8790
@@ -14235,15 +14235,15 @@ sys/src/cmd/upas/send/skipequiv.c - 664 sys sys 944961322 1747
 sys/src/cmd/upas/send/translate.c - 664 sys sys 944961322 804
 sys/src/cmd/upas/send/tryit - 664 sys sys 944961322 584
 sys/src/cmd/upas/smtp - 20000000775 sys sys 1067741333 0
-sys/src/cmd/upas/smtp/greylist.c - 664 sys sys 1201288520 6935
+sys/src/cmd/upas/smtp/greylist.c - 664 sys sys 1201502212 7114
 sys/src/cmd/upas/smtp/mkfile - 664 sys sys 1108910002 801
 sys/src/cmd/upas/smtp/mxdial.c - 664 sys sys 1188509395 6813
 sys/src/cmd/upas/smtp/rfc822.y - 664 sys sys 1064589606 13417
 sys/src/cmd/upas/smtp/rmtdns.c - 664 sys sys 1188509396 1075
 sys/src/cmd/upas/smtp/smtp.c - 664 sys sys 1188509396 20717
 sys/src/cmd/upas/smtp/smtp.h - 664 sys sys 1188509396 1356
-sys/src/cmd/upas/smtp/smtpd.c - 664 sys sys 1188509398 32887
-sys/src/cmd/upas/smtp/smtpd.h - 664 sys sys 1067722781 1111
+sys/src/cmd/upas/smtp/smtpd.c - 664 sys sys 1201499389 33282
+sys/src/cmd/upas/smtp/smtpd.h - 664 sys sys 1201499389 1134
 sys/src/cmd/upas/smtp/smtpd.y - 664 sys sys 1181508390 6924
 sys/src/cmd/upas/smtp/spam.c - 664 sys sys 1139699502 10238
 sys/src/cmd/upas/unesc - 20000000775 sys sys 1075080255 0

+ 9 - 9
dist/replica/plan9.db

@@ -344,10 +344,10 @@
 386/bin/ndb - 20000000775 sys sys 985743147 0
 386/bin/ndb/cs - 775 sys sys 1188530160 148982
 386/bin/ndb/csquery - 775 sys sys 1176488418 61652
-386/bin/ndb/dns - 775 sys sys 1200774206 296663
-386/bin/ndb/dnsdebug - 775 sys sys 1200774212 270683
+386/bin/ndb/dns - 775 sys sys 1201551691 296647
+386/bin/ndb/dnsdebug - 775 sys sys 1201551695 270667
 386/bin/ndb/dnsquery - 775 sys sys 1185334136 64350
-386/bin/ndb/dnstcp - 775 sys sys 1200774217 268564
+386/bin/ndb/dnstcp - 775 sys sys 1201551700 268548
 386/bin/ndb/ipquery - 775 sys sys 1178568296 95524
 386/bin/ndb/mkdb - 775 sys sys 1168402340 64211
 386/bin/ndb/mkhash - 775 sys sys 1178568296 83312
@@ -475,7 +475,7 @@
 386/bin/upas/scanmail - 775 sys sys 1200262789 128213
 386/bin/upas/send - 775 sys sys 1200262792 192180
 386/bin/upas/smtp - 775 sys sys 1188530218 275629
-386/bin/upas/smtpd - 775 sys sys 1201321515 332115
+386/bin/upas/smtpd - 775 sys sys 1201551707 332410
 386/bin/upas/spam - 775 sys sys 1064598366 36
 386/bin/upas/testscan - 775 sys sys 1200262795 83864
 386/bin/upas/token - 775 sys sys 1188447329 73042
@@ -7875,7 +7875,7 @@ sys/man/8/scuzz - 664 sys sys 1196638948 8701
 sys/man/8/secstore - 664 sys sys 1196638948 1954
 sys/man/8/securenet - 664 sys sys 1196638948 3160
 sys/man/8/send - 664 sys sys 1196638948 2168
-sys/man/8/smtp - 664 sys sys 1200091729 5401
+sys/man/8/smtp - 664 sys sys 1201502316 5493
 sys/man/8/snoopy - 664 sys sys 1196638948 4442
 sys/man/8/stats - 664 sys sys 1196638948 4336
 sys/man/8/statusbar - 664 sys sys 1196638948 1254
@@ -12821,7 +12821,7 @@ sys/src/cmd/ndb/dblookup.c - 664 sys sys 1193284932 25375
 sys/src/cmd/ndb/dn.c - 664 sys sys 1200424507 37507
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1197930912 3278
-sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1200511964 35530
+sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1201499792 35562
 sys/src/cmd/ndb/dns.c - 664 sys sys 1200429502 17583
 sys/src/cmd/ndb/dns.h - 664 sys sys 1194216527 11889
 sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1194216583 8790
@@ -14235,15 +14235,15 @@ sys/src/cmd/upas/send/skipequiv.c - 664 sys sys 944961322 1747
 sys/src/cmd/upas/send/translate.c - 664 sys sys 944961322 804
 sys/src/cmd/upas/send/tryit - 664 sys sys 944961322 584
 sys/src/cmd/upas/smtp - 20000000775 sys sys 1067741333 0
-sys/src/cmd/upas/smtp/greylist.c - 664 sys sys 1201288520 6935
+sys/src/cmd/upas/smtp/greylist.c - 664 sys sys 1201502212 7114
 sys/src/cmd/upas/smtp/mkfile - 664 sys sys 1108910002 801
 sys/src/cmd/upas/smtp/mxdial.c - 664 sys sys 1188509395 6813
 sys/src/cmd/upas/smtp/rfc822.y - 664 sys sys 1064589606 13417
 sys/src/cmd/upas/smtp/rmtdns.c - 664 sys sys 1188509396 1075
 sys/src/cmd/upas/smtp/smtp.c - 664 sys sys 1188509396 20717
 sys/src/cmd/upas/smtp/smtp.h - 664 sys sys 1188509396 1356
-sys/src/cmd/upas/smtp/smtpd.c - 664 sys sys 1188509398 32887
-sys/src/cmd/upas/smtp/smtpd.h - 664 sys sys 1067722781 1111
+sys/src/cmd/upas/smtp/smtpd.c - 664 sys sys 1201499389 33282
+sys/src/cmd/upas/smtp/smtpd.h - 664 sys sys 1201499389 1134
 sys/src/cmd/upas/smtp/smtpd.y - 664 sys sys 1181508390 6924
 sys/src/cmd/upas/smtp/spam.c - 664 sys sys 1139699502 10238
 sys/src/cmd/upas/unesc - 20000000775 sys sys 1075080255 0

+ 10 - 0
dist/replica/plan9.log

@@ -18353,3 +18353,13 @@
 1201298403 0 c sys/src/9/pc/etherigbe.c - 664 sys sys 1201296869 45773
 1201298403 1 c sys/src/9/pc/ethervt6102.c - 664 sys sys 1201296945 22600
 1201321804 0 c 386/bin/upas/smtpd - 775 sys sys 1201321515 332115
+1201500003 0 c sys/src/cmd/ndb/dnresolve.c - 664 sys sys 1201499792 35562
+1201500003 1 c sys/src/cmd/upas/smtp/greylist.c - 664 sys sys 1201499389 6810
+1201500003 2 c sys/src/cmd/upas/smtp/smtpd.c - 664 sys sys 1201499389 33282
+1201500003 3 c sys/src/cmd/upas/smtp/smtpd.h - 664 sys sys 1201499389 1134
+1201503605 0 c sys/man/8/smtp - 664 sys sys 1201502316 5493
+1201503605 1 c sys/src/cmd/upas/smtp/greylist.c - 664 sys sys 1201502212 7114
+1201552204 0 c 386/bin/ndb/dns - 775 sys sys 1201551691 296647
+1201552204 1 c 386/bin/ndb/dnsdebug - 775 sys sys 1201551695 270667
+1201552204 2 c 386/bin/ndb/dnstcp - 775 sys sys 1201551700 268548
+1201552204 3 c 386/bin/upas/smtpd - 775 sys sys 1201551707 332410

+ 3 - 1
sys/man/8/smtp

@@ -153,8 +153,10 @@ option, the capability to start TLS will not be advertised.
 turns on debugging output to standard error.
 .TP
 .B -D
-sleeps for 15 seconds at the start of the SMTP dialogue;
+sleeps for 15 seconds usually at the start of the SMTP dialogue;
 this deters some spammers.
+Connections from Class A networks frequented by spammers will incur
+a longer delay.
 .TP
 .B -f
 prevents relaying from non-trusted networks.

+ 6 - 5
sys/src/cmd/ndb/dnresolve.c

@@ -296,11 +296,11 @@ noteinmem(void)
 }
 
 static RR*
-issuequery(Query *qp, RR *rp, char *name, int class, int depth, int recurse)
+issuequery(Query *qp, char *name, int class, int depth, int recurse)
 {
 	char *cp;
 	DN *nsdp;
-	RR *nsrp, *dbnsrp;
+	RR *rp, *nsrp, *dbnsrp;
 
 	/*
 	 *  if we're running as just a resolver, query our
@@ -381,7 +381,7 @@ issuequery(Query *qp, RR *rp, char *name, int class, int depth, int recurse)
 			rrfreelist(dbnsrp);
 		}
 	}
-	return rp;
+	return nil;
 }
 
 static RR*
@@ -422,7 +422,8 @@ dnresolve1(char *name, int class, int type, Request *req, int depth,
 					return rp;
 				}
 	rrfreelist(rp);
-	rp = nil;
+	rp = nil;		/* accident prevention */
+	USED(rp);
 
 	/*
 	 * try the cache for a canonical name. if found punt
@@ -451,7 +452,7 @@ dnresolve1(char *name, int class, int type, Request *req, int depth,
 
 	qp = emalloc(sizeof *qp);
 	queryinit(qp, dp, type, req);
-	rp = issuequery(qp, rp, name, class, depth, recurse);
+	rp = issuequery(qp, name, class, depth, recurse);
 	querydestroy(qp);
 	free(qp);
 	if(rp)

+ 24 - 16
sys/src/cmd/upas/smtp/greylist.c

@@ -36,19 +36,12 @@ onwhitelist(void)
 	int lnlen;
 	char *line, *parse, *p;
 	char input[128];
-	uchar ip[IPaddrlen], ipmasked[IPaddrlen];
+	uchar ipmasked[IPaddrlen];
 	uchar mask4[IPaddrlen], addr4[IPaddrlen];
 	uchar mask[IPaddrlen], addr[IPaddrlen], addrmasked[IPaddrlen];
 	Biobuf *wl;
-	static int beenhere;
 	static allzero[IPaddrlen];
 
-	if (!beenhere) {
-		beenhere = 1;
-		fmtinstall('I', eipfmt);
-	}
-
-	parseip(ip, nci->rsys);
 	wl = Bopen(whitelist, OREAD);
 	if (wl == nil)
 		return 1;
@@ -61,7 +54,7 @@ onwhitelist(void)
 			*p = 0;
 		if (line[0] == '#' || line[0] == 0)
 			continue;
-		
+
 		/* default mask is /32 (v4) or /128 (v6) for bare IP */
 		parse = line;
 		if (strchr(line, '/') == nil) {
@@ -78,7 +71,7 @@ onwhitelist(void)
 		v4tov6(mask, mask4);
 
 		maskip(addr, mask, addrmasked);
-		maskip(ip, mask, ipmasked);
+		maskip(rsysip, mask, ipmasked);
 		if (memcmp(ipmasked, addrmasked, IPaddrlen) == 0)
 			break;
 	}
@@ -137,9 +130,14 @@ mkdirs(char *path)
 static long
 getmtime(char *file)
 {
+	int fd;
 	long mtime = -1;
-	Dir *ds = dirstat(file);
+	Dir *ds;
 
+	fd = open(file, ORDWR);
+	if (fd < 0)
+		return mtime;
+	ds = dirfstat(fd);
 	if (ds != nil) {
 		mtime = ds->mtime;
 		/*
@@ -149,17 +147,27 @@ getmtime(char *file)
 		 * us lose, but just pausing for a few minutes and retrying
 		 * will succeed.
 		 */
-		ds->mtime = time(0);
-		dirwstat(file, ds);
+		if (0) {
+			/*
+			 * apparently none can't do this wstat
+			 * (permission denied);
+			 * more undocumented whacky none behaviour.
+			 */
+			ds->mtime = time(0);
+			if (dirfwstat(fd, ds) < 0)
+				syslog(0, "smtpd", "dirfwstat %s: %r", file);
+		}
 		free(ds);
+		write(fd, "x", 1);
 	}
+	close(fd);
 	return mtime;
 }
 
 static void
 tryaddgrey(char *file, Greysts *gsp)
 {
-	int fd = create(file, OWRITE|OEXCL, 0444|DMEXCL);
+	int fd = create(file, OWRITE|OEXCL, 0666);
 
 	gsp->created = (fd >= 0);
 	if (fd >= 0) {
@@ -245,8 +253,8 @@ isrcptrecent(char *rcpt)
 			"%s/%s was grey; adding IP to white", nci->rsys, rcpt);
 		return 1;
 	} else if (gsp->existed)
-		syslog(0, "smtpd", "call for %s/%s was seconds ago or long ago",
-			nci->rsys, rcpt);
+		syslog(0, "smtpd", "call for %s/%s was just minutes ago "
+			"or long ago", nci->rsys, rcpt);
 	else
 		syslog(0, "smtpd", "no call registered for %s/%s; registering",
 			nci->rsys, rcpt);

+ 47 - 9
sys/src/cmd/upas/smtp/smtpd.c

@@ -37,6 +37,8 @@ int	authenticated;
 int	passwordinclear;
 char	*tlscert;
 
+uchar	rsysip[IPaddrlen];
+
 List	senders;
 List	rcvers;
 
@@ -105,6 +107,7 @@ main(int argc, char **argv)
 
 	netdir = nil;
 	quotefmtinstall();
+	fmtinstall('I', eipfmt);
 	ARGBEGIN{
 	case 'a':
 		authenticate = 1;
@@ -157,6 +160,7 @@ main(int argc, char **argv)
 	nci = getnetconninfo(netdir, 0);
 	if(nci == nil)
 		sysfatal("can't get remote system's address");
+	parseip(rsysip, nci->rsys);
 
 	if(mailer == nil)
 		mailer = mailerpath("send");
@@ -260,6 +264,44 @@ sayhi(void)
 	reply("220 %s ESMTP\r\n", dom);
 }
 
+/*
+ * make callers from class A networks infested by spammers
+ * wait longer.
+ */
+
+static char netaspam[256] = {
+	[58]	1,
+	[66]	1,
+	[71]	1,
+
+	[76]	1,
+	[77]	1,
+	[78]	1,
+	[79]	1,
+	[80]	1,
+	[81]	1,
+	[82]	1,
+	[83]	1,
+	[84]	1,
+	[85]	1,
+	[86]	1,
+	[87]	1,
+	[88]	1,
+	[89]	1,
+
+	[190]	1,
+	[201]	1,
+	[217]	1,
+};
+
+static int
+delaysecs(void)
+{
+	if (netaspam[rsysip[0]])
+		return 60;
+	return 15;
+}
+
 void
 hello(String *himp, int extended)
 {
@@ -355,7 +397,7 @@ Liarliar:
 		him = nci->rsys;
 
 	if(Dflag)
-		sleep(15*1000);
+		sleep(delaysecs()*1000);
 	reply("250%c%s you are %s\r\n", extended ? '-' : ' ', dom, him);
 	if (extended) {
 		reply("250-ENHANCEDSTATUSCODES\r\n");	/* RFCs 2034 and 3463 */
@@ -440,7 +482,6 @@ struct Sender {
 	char	*domain;
 };
 static Sender *sendlist, *sendlast;
-static uchar rsysip[IPaddrlen];
 
 static int
 rdsenders(void)
@@ -456,14 +497,11 @@ rdsenders(void)
 		return 1;
 	beenhere = 1;
 
-	fmtinstall('I', eipfmt);
-	parseip(rsysip, nci->rsys);
-
 	/*
 	 * we're sticking with a system-wide sender list because
 	 * per-user lists would require fully resolving recipient
 	 * addresses to determine which users they correspond to
-	 * (barring syntactic conventions).
+	 * (barring exploiting syntactic conventions).
 	 */
 	senderfile = smprint("%s/senders", UPASLIB);
 	sf = Bopen(senderfile, OREAD);
@@ -1004,13 +1042,13 @@ pipemsg(int *byteswritten)
 	}
 
 	/*
- 	 *  parse header
+	 *  parse header
 	 */
 	yyinit(s_to_c(hdr), s_len(hdr));
 	yyparse();
 
 	/*
- 	 *  Look for masquerades.  Let Sender: trump From: to allow mailing list
+	 *  Look for masquerades.  Let Sender: trump From: to allow mailing list
 	 *  forwarded messages.
 	 */
 	if(fflag)
@@ -1442,7 +1480,7 @@ auth(String *mech, String *resp)
 	if (rejectcheck())
 		goto bomb_out;
 
- 	syslog(0, "smtpd", "auth(%s, %s) from %s", s_to_c(mech),
+	syslog(0, "smtpd", "auth(%s, %s) from %s", s_to_c(mech),
 		"(protected)", him);
 
 	if (authenticated) {

+ 1 - 0
sys/src/cmd/upas/smtp/smtpd.h

@@ -36,6 +36,7 @@ extern	char*	me;
 extern	int	trusted;
 extern	List	senders;
 extern	List	rcvers;
+extern	uchar	rsysip[];
 
 void	addbadguy(char*);
 void	auth(String *, String *);