Hi, >>>>> On Mon, 12 Dec 2005 10:38:54 -0500 >>>>> Ken Murchison <[EMAIL PROTECTED]> said:
murch> I am pleased to announce the release of Cyrus IMAPd 2.3.0. This is an murch> BETA-quality release, reflecting that it has significant numbers of new murch> features that have not been tested on a wide-scale basis, although murch> earlier versions of this code have been running at two sites for quite murch> some time. Some of the new features include mailspool replication murch> (based on David Carter's work), "unified" Murder code, separate murch> meta-data partitions, several new IMAP and Sieve extensions, and many murch> more visible and invisible changes. It fails at link with --enable-replication. The patch is attached. And, drac_auth.patch is not applicable anymore. So, I re-made it and attached it, too. Sincerely,
Index: imap/Makefile.in diff -u imap/Makefile.in.orig imap/Makefile.in --- imap/Makefile.in.orig Fri Nov 18 00:46:14 2005 +++ imap/Makefile.in Sat Dec 10 16:46:31 2005 @@ -247,10 +247,11 @@ $(DEPLIBS) $(LIBS) $(LIB_WRAP) sync_server: sync_server.o sync_support.o sync_commit.o \ - imapparse.o tls.o libimap.a mutex_fake.o $(DEPLIBS) $(SERVICE) + imapparse.o tls.o libimap.a mutex_fake.o mboxkey.o \ + $(DEPLIBS) $(SERVICE) $(CC) $(LDFLAGS) -o \ sync_server sync_server.o sync_support.o sync_commit.o \ - imapparse.o tls.o $(SERVICE) libimap.a mutex_fake.o \ + imapparse.o tls.o $(SERVICE) libimap.a mutex_fake.o mboxkey.o \ $(DEPLIBS) $(LIBS) $(LIB_WRAP) ### Command Line Utilities @@ -336,10 +337,10 @@ backend.o tls.o imapparse.o libimap.a mutex_fake.o $(DEPLIBS) $(LIBS) sync_reset: sync_reset.o sync_support.o sync_commit.o \ - libimap.a mutex_fake.o $(DEPLIBS) + libimap.a mutex_fake.o mboxkey.o $(DEPLIBS) $(CC) $(LDFLAGS) -o \ sync_reset sync_reset.o sync_support.o sync_commit.o \ - libimap.a mutex_fake.o $(DEPLIBS) $(LIBS) + libimap.a mutex_fake.o mboxkey.o $(DEPLIBS) $(LIBS) ### Other Misc Targets
$Id: drac_auth.patch,v 1.17.2.1 2004/01/15 20:24:23 ken3 Exp $ Patch to add support for Dynamic Relay Authorization Control For more information about DRAC, see: http://mail.cc.umanitoba.ca/drac/index.html Installation ------------ 1. Apply this patch in the toplevel directory using the following command: # patch -p0 < contrib/drac_auth.patch 2. Cleanup any previous builds: # make distclean 3a. If you DO NOT have 'smake' and 'autoconf' installed on your system, goto step 3b. Perform the following to reconfigure your build: # rm configure # sh SMakefile # ./configure ... --with-drac=<location of libdrac> NOTE: you can find your original configure command in config.status Proceed to step 4. 3b. Edit imap/Makefile and modify the following three variables: DEFS = ... -DDRAC_AUTH LIBS = ... -ldrac LDFLAGS = ... -L<location of libdrac> 4. Build and install the software: # make # make install 5. If dracd is not running on the same system as Cyrus (localhost), use the 'drachost' option in imapd.conf(5) to specify the hostname of the dracd server. 6. Installation is complete! Operation --------- The behavior of DRAC is controlled by the value of the 'dracinterval' option in imapd.conf(5). If 'dracinterval' is 0 (zero), DRAC support is disabled. Otherwise, DRAC support is enabled and has the following behavior: pop3d: Whenever a client opens a user's INBOX, drac_auth() is called. imapd: Once a client is logged in (via LOGIN or AUTHENTICATE), drac_send() will be called once every 'dracinterval' minutes. Index: configure.in diff -u configure.in.orig configure.in --- configure.in.orig Wed Apr 13 05:05:20 2005 +++ configure.in Sat Dec 10 16:16:15 2005 @@ -1003,6 +1003,19 @@ SNMP_SUBDIRS="" AC_SUBST(SNMP_SUBDIRS) +dnl +dnl Test for DRAC +dnl +DRACLIBS= +AC_ARG_WITH(drac, [ --with-drac=DIR use DRAC library in <DIR> [no] ], + if test -d "$withval"; then + LDFLAGS="$LDFLAGS -L${withval}" + AC_CHECK_LIB(drac, dracauth, + AC_DEFINE(DRAC_AUTH,[],[Build DRAC support?]) + DRACLIBS="-ldrac") + fi) +AC_SUBST(DRACLIBS) + CMU_LIBWRAP CMU_UCDSNMP Index: imap/Makefile.in diff -u imap/Makefile.in.orig imap/Makefile.in --- imap/Makefile.in.orig Fri Nov 18 00:46:14 2005 +++ imap/Makefile.in Sat Dec 10 16:17:44 2005 @@ -66,6 +66,7 @@ SIEVE_LIBS = @SIEVE_LIBS@ IMAP_COM_ERR_LIBS = @IMAP_COM_ERR_LIBS@ LIB_WRAP = @LIB_WRAP@ +DRAC_LIBS = @DRACLIBS@ LIBS = $(IMAP_LIBS) $(IMAP_COM_ERR_LIBS) DEPLIBS = ../lib/libcyrus.a ../lib/libcyrus_min.a @DEPLIBS@ @@ -202,17 +203,17 @@ imapd: xversion $(IMAPDOBJS) mutex_fake.o libimap.a $(DEPLIBS) $(SERVICE) $(CC) $(LDFLAGS) -o imapd \ $(SERVICE) $(IMAPDOBJS) mutex_fake.o \ - libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) + libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) $(DRAC_LIBS) imapd.pure: $(IMAPDOBJS) mutex_fake.o libimap.a $(DEPLIBS) $(SERVICE) $(PURIFY) $(PUREOPT) $(CC) $(LDFLAGS) -o imapd.pure \ $(SERVICE) $(IMAPDOBJS) mutex_fake.o libimap.a \ - $(DEPLIBS) $(LIBS) $(LIB_WRAP) + $(DEPLIBS) $(LIBS) $(LIB_WRAP) $(DRAC_LIBS) imapd.quant: $(IMAPDOBJS) mutex_fake.o libimap.a $(DEPLIBS) $(SERVICE) $(QUANTIFY) $(QUANTOPT) $(CC) $(LDFLAGS) -o imapd.quant \ $(SERVICE) $(IMAPDOBJS) mutex_fake.o libimap.a \ - $(DEPLIBS) $(LIBS) $(LIB_WRAP) + $(DEPLIBS) $(LIBS) $(LIB_WRAP) $(DRAC_LIBS) $(DRAC_LIBS) mupdate: mupdate.o mupdate-slave.o mupdate-client.o mutex_pthread.o tls.o \ libimap.a $(DEPLIBS) @@ -230,7 +231,7 @@ pop3d: pop3d.o proxy.o backend.o tls.o mutex_fake.o libimap.a \ $(DEPLIBS) $(SERVICE) $(CC) $(LDFLAGS) -o pop3d pop3d.o proxy.o backend.o tls.o $(SERVICE) \ - mutex_fake.o libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) + mutex_fake.o libimap.a $(DEPLIBS) $(LIBS) $(LIB_WRAP) $(DRAC_LIBS) nntpd: nntpd.o proxy.o backend.o index.o smtpclient.o spool.o tls.o \ mutex_fake.o nntp_err.o libimap.a $(DEPLIBS) $(SERVICE) Index: imap/imapd.c diff -u -p imap/imapd.c.orig imap/imapd.c --- imap/imapd.c.orig Tue Nov 22 04:48:36 2005 +++ imap/imapd.c Sat Dec 10 16:16:16 2005 @@ -172,6 +172,18 @@ static struct proxy_context imapd_proxyc 1, 1, &imapd_authstate, &imapd_userisadmin, &imapd_userisproxyadmin }; +#ifdef DRAC_AUTH +static struct { + int interval; /* dracd "ping" interval; 0 = disabled */ + unsigned long clientaddr; + struct prot_waitevent *event; +} drac; + +extern int dracconn(char *server, char **errmsg); +extern int dracsend(unsigned long userip, char **errmsg); +extern int dracdisc(char **errmsg); +#endif /* DRAC_AUTH */ + /* current sub-user state */ static struct mailbox mboxstruct; static struct mailbox *imapd_mailbox; @@ -637,6 +649,23 @@ int service_init(int argc, char **argv, idle_init(); } +#ifdef DRAC_AUTH + /* setup for sending DRAC "pings" */ + drac.event = NULL; + drac.interval = config_getint(IMAPOPT_DRACINTERVAL); + if (drac.interval < 0) drac.interval = 0; + if (drac.interval) { + char *err; + + if (dracconn((char*) config_getstring(IMAPOPT_DRACHOST), &err) != 0) { + /* disable DRAC */ + drac.interval = 0; + syslog(LOG_ERR, "dracconn: %s", err); + syslog(LOG_ERR, "DRAC notifications disabled"); + } + } +#endif /* DRAC_AUTH */ + /* create connection to the SNMP listener, if available. */ snmp_connect(); /* ignore return code */ snmp_set_str(SERVER_NAME_VERSION,CYRUS_VERSION); @@ -741,6 +770,15 @@ int service_main(int argc __attribute__( imapd_haveaddr = 1; } } + +#ifdef DRAC_AUTH + if (((struct sockaddr *)&imapd_remoteaddr)->sa_family == AF_INET) + drac.clientaddr = ((struct sockaddr_in *)&imapd_remoteaddr)->sin_addr.s_addr; + else + drac.clientaddr = 0; + } else { + drac.clientaddr = 0; +#endif /* DRAC_AUTH */ } /* create the SASL connection */ @@ -783,6 +821,11 @@ int service_main(int argc __attribute__( prot_flush(imapd_out); snmp_increment(ACTIVE_CONNECTIONS, -1); +#ifdef DRAC_AUTH + if (drac.event) prot_removewaitevent(imapd_in, drac.event); + drac.event = NULL; +#endif /* DRAC_AUTH */ + /* cleanup */ imapd_reset(); @@ -873,6 +916,10 @@ void shut_down(int code) cyrus_done(); +#ifdef DRAC_AUTH + if (drac.interval) (void) dracdisc((char **)NULL); +#endif /* DRAC_AUTH */ + exit(code); } @@ -932,6 +979,35 @@ static void imapd_check(struct backend * } } +#ifdef DRAC_AUTH +/* + * Ping dracd every 'drac.interval' minutes + * to let it know that we are still connected + */ +struct prot_waitevent *drac_ping(struct protstream *s, + struct prot_waitevent *ev, void *rock) +{ + char *err; + static int nfailure = 0; + + if (dracsend(drac.clientaddr, &err) != 0) { + syslog(LOG_ERR, "dracsend: %s", err); + if (++nfailure >= 3) { + /* can't contact dracd for 3 consecutive tries - disable DRAC */ + prot_removewaitevent(s, ev); + drac.event = NULL; + syslog(LOG_ERR, "DRAC notifications disabled"); + return NULL; + } + } + else + nfailure = 0; + + ev->mark = time(NULL) + (drac.interval * 60); + return ev; +} +#endif /* DRAC_AUTH */ + /* * Top-level command loop parsing */ @@ -2030,6 +2106,11 @@ void cmd_login(char *tag, char *user) prot_printf(imapd_out, "%s OK %s\r\n", tag, reply); +#ifdef DRAC_AUTH + if (drac.interval && drac.clientaddr) + drac.event = prot_addwaitevent(imapd_in, 0 /* now */, drac_ping, NULL); +#endif /* DRAC_AUTH */ + /* Create telemetry log */ imapd_logfd = telemetry_log(imapd_userid, imapd_in, imapd_out, 0); @@ -2178,6 +2259,11 @@ cmd_authenticate(char *tag, char *authty prot_setsasl(imapd_in, imapd_saslconn); prot_setsasl(imapd_out, imapd_saslconn); + +#ifdef DRAC_AUTH + if (drac.interval && drac.clientaddr) + drac.event = prot_addwaitevent(imapd_in, 0 /* now */, drac_ping, NULL); +#endif /* DRAC_AUTH */ /* Create telemetry log */ imapd_logfd = telemetry_log(imapd_userid, imapd_in, imapd_out, 0); Index: imap/pop3d.c diff -u -p imap/pop3d.c.orig imap/pop3d.c --- imap/pop3d.c.orig Sat Jun 4 08:07:46 2005 +++ imap/pop3d.c Sat Dec 10 16:16:16 2005 @@ -103,6 +103,10 @@ extern char *optarg; extern int opterr; +#ifdef DRAC_AUTH +static int drac_enabled; +extern int dracauth(char *server, unsigned long userip, char **errmsg); +#endif /* DRAC_AUTH */ #ifdef HAVE_SSL static SSL *tls_conn; @@ -507,6 +511,10 @@ int service_main(int argc __attribute__( prot_settimeout(popd_in, timeout*60); prot_setflushonread(popd_in, popd_out); +#ifdef DRAC_AUTH + drac_enabled = (config_getint(IMAPOPT_DRACINTERVAL) > 0); +#endif /* DRAC_AUTH */ + if (kflag) kpop(); /* we were connected on pop3s port so we should do @@ -1636,6 +1644,21 @@ int openinbox(void) popd_mailbox = &mboxstruct; proc_register("pop3d", popd_clienthost, popd_userid, popd_mailbox->name); + +#ifdef DRAC_AUTH + if (drac_enabled && + ((struct sockaddr *)&popd_remoteaddr)->sa_family == AF_INET) { + char *err; + + if (dracauth((char*) config_getstring(IMAPOPT_DRACHOST), + ((struct sockaddr_in *)&popd_remoteaddr)->sin_addr.s_addr, &err) != 0) { + /* disable DRAC */ + drac_enabled = 0; + syslog(LOG_ERR, "dracauth: %s", err); + syslog(LOG_ERR, "DRAC notifications disabled"); + } + } +#endif /* DRAC_AUTH */ } /* Create telemetry log */ Index: imap/version.c diff -u -p imap/version.c.orig imap/version.c --- imap/version.c.orig Thu Feb 17 06:06:19 2005 +++ imap/version.c Sat Dec 10 16:16:16 2005 @@ -151,6 +151,10 @@ void id_response(struct protstream *pout snprintf(env_buf + strlen(env_buf), MAXIDVALUELEN - strlen(env_buf), "; %s", SIEVE_VERSION); #endif +#ifdef DRAC_AUTH + snprintf(env_buf + strlen(env_buf), MAXIDVALUELEN - strlen(env_buf), + "; DRAC"); +#endif #ifdef HAVE_LIBWRAP snprintf(env_buf + strlen(env_buf), MAXIDVALUELEN - strlen(env_buf), "; TCP Wrappers"); Index: lib/imapoptions diff -u lib/imapoptions.orig lib/imapoptions --- lib/imapoptions.orig Fri Nov 18 00:46:29 2005 +++ lib/imapoptions Sat Dec 10 16:19:44 2005 @@ -195,6 +195,14 @@ { "deleteright", "c", STRING } /* The right that a user needs to delete a mailbox. */ +{ "dracinterval", 5, INT } +/* If nonzero, enables the use of DRAC (Dynamic Relay Authorization + Control) by the pop3d and imapd daemons. Also sets the interval + (in minutes) between re-authorization requests made by imapd. */ + +{ "drachost", "localhost", STRING } +/* Hostname of the RPC dracd server. */ + { "duplicate_db", "berkeley-nosync", STRINGLIST("berkeley", "berkeley-nosync", "skiplist") } /* The cyrusdb backend to use for the duplicate delivery suppression and sieve. */
-- Hajimu UMEMOTO @ Internet Mutual Aid Society Yokohama, Japan [EMAIL PROTECTED] [EMAIL PROTECTED],jp.}FreeBSD.org http://www.imasy.org/~ume/
---- Cyrus Home Page: http://asg.web.cmu.edu/cyrus Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html