On Monday, 6 March 2006 23:23, Ed Cates wrote: > Scott, > > Does this patch exibit the no-relaying bug you posted on the > qmail-spp-general list at sourceforge? I had this problem earlier getting > qmail-spp to work with qmail-ldap.
My apologies... Yes it does. Here is the fixed version <snip> -- slr, ISP Systems Specialist Telkom Internet #qmail, #qmail-ldap & #mandriva@ irc.freenode.net "Windows?? You mean the thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition? Oh, that..." -- Lee Clarke This message has been made from 100% recycled bits. ----BEGIN GEEK CODE BLOCK----- Version: 3.12 GIT/MU/E d? s+:+ a- C++++>+++++ USL++++$ P++++ !E(---)W+@ !N o?(--) K? !w(---) O- M+ V PS+@ PE Y-- PGP++>+++ !t(---) !5 !X R-- !tv b(++) DI++ !D(----) G+++>++++ e++>* h----(*) r+++ y++++ -----END GEEK CODE BLOCK------
diff -Naur Makefile Makefile
--- Makefile 2005-06-23 07:43:18.000000000 -0300
+++ Makefile 2005-06-23 09:58:35.000000000 -0300
@@ -2056,20 +2056,27 @@
auto_split.h
./compile qmail-showctl.c
+qmail-spp.o: \
+compile qmail-spp.c readwrite.h stralloc.h substdio.h control.h str.h \
+byte.h env.h exit.h wait.h fork.h fd.h fmt.h getln.h
+ ./compile qmail-spp.c
+
qmail-smtpd: \
load qmail-smtpd.o rcpthosts.o commands.o timeoutread.o rbl.o \
timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o received.o \
date822fmt.o now.o qmail.o execcheck.o cdb.a smtpcall.o coe.o fd.a \
seek.a wait.a datetime.a getln.a open.a sig.a case.a env.a stralloc.a \
-alloc.a substdio.a error.a str.a fs.a auto_qmail.o auto_break.o \
-dns.lib socket.lib
+alloc.a substdio.a error.a str.a fs.a auto_qmail.o dns.lib socket.lib \
+auto_break.o str.a qmail-spp.o env.a
./load qmail-smtpd rcpthosts.o commands.o timeoutread.o rbl.o \
timeoutwrite.o ip.o ipme.o ipalloc.o control.o constmap.o \
received.o date822fmt.o now.o qmail.o execcheck.o cdb.a \
smtpcall.o coe.o fd.a seek.a wait.a datetime.a getln.a \
open.a sig.a case.a env.a stralloc.a alloc.a substdio.a \
error.a fs.a auto_qmail.o dns.o str.a auto_break.o \
- `cat dns.lib` `cat socket.lib` $(TLSLIBS) $(ZLIB)
+ `cat dns.lib` `cat socket.lib` $(TLSLIBS) $(ZLIB) \
+ qmail-spp.o env.a stralloc.a str.a `cat socket.lib`
+
qmail-smtpd.0: \
qmail-smtpd.8
@@ -2079,8 +2087,8 @@
substdio.h alloc.h auto_qmail.h control.h received.h constmap.h \
error.h ipme.h ip.h ipalloc.h ip.h gen_alloc.h ip.h qmail.h \
substdio.h str.h fmt.h scan.h byte.h case.h env.h now.h datetime.h \
-exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h rbl.h \
-qmail-ldap.h auto_break.h
+exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h rbl.h \
+qmail-ldap.h auto_break.h qmail-spp.h
./compile $(LDAPFLAGS) $(TLS) $(TLSINCLUDES) $(ZINCLUDES) \
qmail-smtpd.c
diff -Naur qmail-smtpd.c qmail-smtpd.c
--- qmail-smtpd.c 2005-06-23 07:43:19.000000000 -0300
+++ qmail-smtpd.c 2005-06-23 09:58:41.000000000 -0300
@@ -26,6 +26,7 @@
#include "timeoutread.h"
#include "timeoutwrite.h"
#include "commands.h"
+#include "qmail-spp.h"
#include "dns.h"
#include "smtpcall.h"
#include "limit.h"
@@ -41,6 +42,8 @@
#include <zlib.h>
#endif
+int spp_val;
+
#define MAXHOPS 100
#define MAXLINELEN 10000
unsigned long databytes = 0;
@@ -346,6 +349,7 @@
if (x) { scan_ulong(x,&u); maxrcptcount = u >= UINT_MAX ? UINT_MAX - 1 : u; };
if (rcpthosts_init() == -1) die_control();
+ if (spp_init() == -1) die_control();
bmfok = control_readfile(&bmf,"control/badmailfrom",0);
if (bmfok == -1) die_control();
@@ -660,6 +664,7 @@
}
int seenmail = 0;
+int allowed;
stralloc mailfrom = {0};
stralloc rcptto = {0};
unsigned int rcptcount;
@@ -785,6 +790,7 @@
void smtp_helo(char *arg)
{
+ if(!spp_helo(arg)) return;
smtp_line("250 ");
seenmail = 0; dohelo(arg);
logline2(4, "remote helo: ", arg);
@@ -792,6 +798,7 @@
void smtp_ehlo(char *arg)
{
+ if(!spp_helo(arg)) return;
smtp_line("250-");
out("250-PIPELINING\r\n");
if (databytes != 0) {
@@ -818,6 +825,7 @@
void smtp_rset(char *arg)
{
+ spp_rset();
seenmail = 0;
relayclient = relayok; /* restore original relayclient setting */
out("250 flushed\r\n");
@@ -841,6 +849,9 @@
return;
}
+ if (!(spp_val = spp_mail())) return;
+ if (spp_val == 1)
+
logline2(4,"mail from: ",addr.s);
if (needauth && !flagauthok) {
@@ -932,6 +943,7 @@
/* relay mail from check (allow relaying based on evelope sender address) */
if (!relayclient) {
+ allowed = addrallowed();
if (rmfcheck()) {
relayclient = "";
logline(4,"relaying allowed via relaymailfrom");
@@ -1075,11 +1087,17 @@
return;
}
+ if (!(spp_val = spp_rcpt(allowed))) return;
+
/* is sender ip allowed to relay */
if (relayclient) {
--addr.len;
if (!stralloc_cats(&addr,relayclient)) die_nomem();
if (!stralloc_0(&addr)) die_nomem();
} else {
+ if (spp_val == 1) {
+// if (!allowed) { err_nogateway(); return; }
+ spp_rcpt_accepted();
+ }
if (!addrallowed()) {
err_nogateway();
@@ -1379,6 +1397,7 @@
if (errdisconnect) err_quit();
return;
}
+ if (!spp_data()) return;
seenmail = 0;
if (databytes) bytestooverflow = databytes + 1;
#ifdef SMTPEXECCHECK
@@ -1423,6 +1442,9 @@
received(&qqt,"SMTP",local,remoteip,remotehost,remoteinfo,fakehelo,mailfrom.s,&rcptto.s[1]);
#endif
+ qmail_put(&qqt,sppheaders.s,sppheaders.len); /* set in qmail-spp.c */
+ spp_rset();
+
#ifdef DATA_COMPRESS
if (wantcomp) { if (compression_init() != 0) return; }
#endif
@@ -1697,6 +1719,7 @@
if (chdir(auto_qmail) == -1) die_control();
setup();
if (ipme_init() != 1) die_ipme();
+ if (spp_connect()) {
if (greeting550 || greeting421) {
if (!stralloc_copys(&greeting,greeting550 ? greeting550 : greeting421))
die_nomem();
@@ -1714,6 +1737,7 @@
die_nomem();
}
smtp_greet("220 ");
+ }
if (commands(&ssin,smtpcommands) == 0) die_read();
die_nomem();
/* NOTREACHED */
diff -Naur qmail-spp.c qmail-spp.c
--- qmail-spp.c 1969-12-31 21:00:00.000000000 -0300
+++ qmail-spp.c 2005-06-23 09:58:28.000000000 -0300
@@ -0,0 +1,248 @@
+/*
+ * Copyright (C) 2004-2005 Pawel Foremski <[EMAIL PROTECTED]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *** Note
+ *
+ * This is the core of qmail-spp patch for qmail
+ *
+ * Why I made it a separate file? Because I wanted qmail-spp to apply more
+ * cleanly on heavily patched qmail sources and to make it bit simpler to
+ * maintain, so don't treat it as a library.
+ *
+ * "..." comments marks places where code for other SMTP commands should be
+ * added, if needed.
+ *
+ */
+
+#include "readwrite.h"
+#include "stralloc.h"
+#include "substdio.h"
+#include "control.h"
+#include "str.h"
+#include "byte.h"
+#include "env.h"
+#include "exit.h"
+#include "wait.h"
+#include "fork.h"
+#include "fd.h"
+#include "fmt.h"
+#include "getln.h"
+
+/* stuff needed from qmail-smtpd */
+extern void flush();
+extern void out();
+extern void die_nomem();
+extern stralloc addr;
+/* *** */
+
+stralloc sppheaders = {0};
+static int spprun = 0;
+static int sppfok = 0;
+static int sppret;
+static stralloc sppf = {0};
+static stralloc plugins_dummy = {0}, plugins_connect = {0}, plugins_helo = {0}, plugins_mail = {0},
+ plugins_rcpt = {0}, plugins_data = {0}; /* ... */
+static stralloc error_mail = {0}, error_rcpt = {0}, error_data = {0}; /* ... */
+static stralloc sppmsg = {0};
+static char rcptcountstr[FMT_ULONG];
+static unsigned long rcptcount;
+static substdio ssdown;
+static char downbuf[128];
+
+static void err_spp(s1, s2) char *s1, *s2; { out("451 qmail-spp failure: "); out(s1); out(": "); out(s2); out(" (#4.3.0)\r\n"); }
+
+int spp_init()
+{
+ int i, len = 0;
+ stralloc *plugins_to;
+ char *x, *conffile = "control/smtpplugins";
+
+ if (!env_get("NOSPP")) {
+ spprun = 1;
+ plugins_to = &plugins_dummy;
+ x = env_get("SPPCONFFILE");
+ if (x && *x) conffile = x;
+ sppfok = control_readfile(&sppf, conffile, 0);
+ if (sppfok != 1) return -1;
+ for (i = 0; i < sppf.len; i += len) {
+ len = str_len(sppf.s + i) + 1;
+ if (sppf.s[i] == '[')
+ switch (sppf.s[i + 1]) {
+ case 'c': plugins_to = &plugins_connect; break;
+ case 'h': plugins_to = &plugins_helo; break;
+ case 'm': plugins_to = &plugins_mail; break;
+ case 'r': plugins_to = &plugins_rcpt; break;
+ case 'd': plugins_to = &plugins_data; break;
+ /* ... */
+ default: plugins_to = &plugins_dummy;
+ }
+ else
+ if (!stralloc_catb(plugins_to, sppf.s + i, len)) die_nomem();
+ }
+ }
+
+ return 0;
+}
+
+void sppout() { if (sppmsg.len) out(sppmsg.s); out("\r\n"); }
+
+int spp(plugins, addrenv) stralloc *plugins; char *addrenv;
+{
+ static int pipes[2];
+ static int i, pid, wstat, match, last;
+ static stralloc data = {0};
+ static char *(args[4]);
+ static stralloc *errors_to;
+
+ if (!spprun) return 1;
+ if (addrenv) if (!env_put2(addrenv, addr.s)) die_nomem();
+ last = 0;
+
+ for (i = 0; i < plugins->len; i += str_len(plugins->s + i) + 1) {
+ if (plugins->s[i] == ':')
+ { args[0] = "/bin/sh"; args[1] = "-c"; args[2] = plugins->s + i + 1; args[3] = 0; }
+ else
+ { args[0] = plugins->s + i; args[1] = 0; }
+
+ if (pipe(pipes) == -1)
+ { err_spp(plugins->s + i, "can't pipe()"); return 0; }
+
+ switch (pid = vfork()) {
+ case -1:
+ err_spp(plugins->s + i, "vfork() failed");
+ return 0;
+ case 0:
+ close(0); close(pipes[0]); fd_move(1, pipes[1]);
+ execv(*args, args);
+ _exit(120);
+ }
+
+ close(pipes[1]);
+ substdio_fdbuf(&ssdown, read, pipes[0], downbuf, sizeof(downbuf));
+ do {
+ if (getln(&ssdown, &data, &match, '\n') == -1) die_nomem();
+ if (data.len > 1) {
+ data.s[data.len - 1] = 0;
+ switch (data.s[0]) {
+ case 'H':
+ if (!stralloc_catb(&sppheaders, data.s + 1, data.len - 2)) die_nomem();
+ if (!stralloc_append(&sppheaders, "\n")) die_nomem();
+ break;
+ case 'C':
+ if (addrenv) {
+ if (!stralloc_copyb(&addr, data.s + 1, data.len - 1)) die_nomem();
+ if (!env_put2(addrenv, addr.s)) die_nomem();
+ }
+ break;
+ case 'S': if (!env_put(data.s + 1)) die_nomem(); break;
+ case 'U': if (!env_unset(data.s + 1)) die_nomem(); break;
+ case 'A': spprun = 0;
+ case 'O':
+ case 'N':
+ case 'D': last = 1; match = 0; break;
+ case 'E':
+ case 'R': last = 1; match = 0;
+ case 'P': out(data.s + 1); out("\r\n"); break;
+ case 'L':
+ switch (data.s[1]) {
+ case 'M': errors_to = &error_mail; break;
+ case 'R': errors_to = &error_rcpt; break;
+ case 'D': errors_to = &error_data; break;
+ /* ... */
+ default: errors_to = 0;
+ }
+ if (errors_to) {
+ if (!stralloc_catb(errors_to, data.s + 2, data.len - 3)) die_nomem();
+ if (!stralloc_catb(errors_to, "\r\n", 2)) die_nomem();
+ }
+ break;
+ }
+ }
+ } while (match);
+
+ close(pipes[0]);
+ if (wait_pid(&wstat,pid) == -1) { err_spp(plugins->s + i, "wait_pid() failed"); return 0; }
+ if (wait_crashed(wstat)) { err_spp(plugins->s + i, "child crashed"); return 0; }
+ if (wait_exitcode(wstat) == 120) { err_spp(plugins->s + i, "can't execute"); return 0; }
+
+ if (last)
+ switch (*data.s) {
+ case 'E': return 0;
+ case 'A':
+ case 'N': return 1;
+ case 'O': return 2;
+ case 'R':
+ case 'D': flush(); _exit(0);
+ }
+ }
+
+ return 1;
+}
+
+int spp_errors(errors) stralloc *errors;
+{
+ if (!errors->len) return 1;
+ if (!stralloc_0(errors)) die_nomem();
+ out(errors->s);
+ return 0;
+}
+
+int spp_connect() { return spp(&plugins_connect, 0); }
+
+int spp_helo(arg) char *arg;
+{
+ if (!env_put2("SMTPHELOHOST", arg)) die_nomem();
+ return spp(&plugins_helo, 0);
+}
+
+void spp_rset()
+{
+ if (!stralloc_copys(&sppheaders, "")) die_nomem();
+ if (!stralloc_copys(&error_mail, "")) die_nomem();
+ if (!stralloc_copys(&error_rcpt, "")) die_nomem();
+ if (!stralloc_copys(&error_data, "")) die_nomem();
+ /* ... */
+ rcptcount = 0;
+}
+
+int spp_mail()
+{
+ if (!spp_errors(&error_mail)) return 0;
+ rcptcount = 0;
+ return spp(&plugins_mail, "SMTPMAILFROM");
+}
+
+int spp_rcpt(allowed) int allowed;
+{
+ if (!spp_errors(&error_rcpt)) return 0;
+ rcptcountstr[fmt_ulong(rcptcountstr, rcptcount)] = 0;
+ if (!env_put2("SMTPRCPTCOUNT", rcptcountstr)) die_nomem();
+ if (!env_put2("SMTPRCPTHOSTSOK", allowed ? "1" : "0")) die_nomem();
+ sppret = spp(&plugins_rcpt, "SMTPRCPTTO");
+ return sppret;
+}
+
+void spp_rcpt_accepted() { rcptcount++; }
+
+int spp_data()
+{
+ if (!spp_errors(&error_data)) return 0;
+ return spp(&plugins_data, 0);
+}
+
+/* ... */
diff -Naur qmail-spp.h qmail-spp.h
--- qmail-spp.h 1969-12-31 21:00:00.000000000 -0300
+++ qmail-spp.h 2005-06-23 09:58:30.000000000 -0300
@@ -0,0 +1,14 @@
+#ifndef QMAIL_SPP_H
+#define QMAIL_SPP_H
+
+extern stralloc sppheaders;
+extern int spp_init();
+extern int spp_connect();
+extern int spp_helo();
+extern void spp_rset();
+extern int spp_mail();
+extern int spp_rcpt();
+extern int spp_rcpt_accepted();
+extern int spp_data();
+
+#endif
pgpjuGDaRVrTK.pgp
Description: PGP signature
