Hi. I want to set up a Cyrus IMAPd so that every domain is virtual, yet still allowing unqualified usernames to log in - in that case, they should be mapped into some default virtual domain.
This isn't currently possible, is it? I couldn't figure out how, anyway.. So I thought I'd implement a little something to make it possible. Being lazy and all, I'd like to do it in a way that you'd be inclined to commit to the main distribution, so that I can simply use vendor-provided binaries from the next version on. So I've hacked together an example patch which seems to work for me, at least. Comments solicited.. -- Tore Anderson
diff -ruN cyrus-imapd-2.2.5/imap/global.c cyrus-imapd-2.2.5-hack/imap/global.c --- cyrus-imapd-2.2.5/imap/global.c 2004-05-22 05:45:49.000000000 +0200 +++ cyrus-imapd-2.2.5-hack/imap/global.c 2004-06-15 23:18:36.000000000 +0200 @@ -367,6 +367,12 @@ } if (config_virtdomains) { + if (!domain && config_virt_defdomain) { + snprintf(buf, sizeof(buf), "[EMAIL PROTECTED]", user, config_virt_defdomain); + user = buf; + domain = user + len; + len = strlen(user); + } if (domain) { if (config_defdomain && !strcasecmp(config_defdomain, domain+1)) { *domain = '\0'; /* trim the default domain */ diff -ruN cyrus-imapd-2.2.5/lib/imapoptions cyrus-imapd-2.2.5-hack/lib/imapoptions --- cyrus-imapd-2.2.5/lib/imapoptions 2004-05-25 02:03:05.000000000 +0200 +++ cyrus-imapd-2.2.5-hack/lib/imapoptions 2004-06-15 22:47:17.000000000 +0200 @@ -180,7 +180,10 @@ mailbox that does not have a parent mailbox. */ { "defaultdomain", NULL, STRING } -/* The default domain for virtual domain support */ +/* The default domain for virtual domain support. Messages to users in this + domain will be mapped outside of the virtual domain hierarchy, just as if + virtual domain support was turned off. Unqualified users are also mapped + into the default domain, unless "virtual_defaultdomain" is set. */ { "defaultpartition", "default", STRING } /* The partition name used by default for new mailboxes. */ @@ -832,6 +835,14 @@ interface, otherwise the user is assumed to be in the default domain (if set). */ +{ "virtual_defaultdomain", NULL, STRING } +/* Automatically map unqualified users into this virtual domain. This happens + before the user is mapped according to the setting of "defaultdomain", so + if they are both set to the same value, the user will in the end be mapped + into the (non-virtual) "defaultdomain", effectively making + "virtual_defaultdomain" a no-op. In other words, it makes no sense to do + so. */ + /* .SH SEE ALSO .PP diff -ruN cyrus-imapd-2.2.5/lib/libconfig.c cyrus-imapd-2.2.5-hack/lib/libconfig.c --- cyrus-imapd-2.2.5/lib/libconfig.c 2004-05-22 05:45:54.000000000 +0200 +++ cyrus-imapd-2.2.5-hack/lib/libconfig.c 2004-06-15 22:30:58.000000000 +0200 @@ -71,6 +71,7 @@ const char *config_servername= NULL; /* gethostname() */ const char *config_mupdate_server = NULL;/* NULL */ const char *config_defdomain = NULL; /* NULL */ +const char *config_virt_defdomain = NULL;/* NULL */ const char *config_ident = NULL; /* the service name */ int config_hashimapspool; /* f */ enum enum_value config_virtdomains; /* f */ @@ -238,6 +239,7 @@ /* are we supporting virtual domains? */ config_virtdomains = config_getenum(IMAPOPT_VIRTDOMAINS); config_defdomain = config_getstring(IMAPOPT_DEFAULTDOMAIN); + config_virt_defdomain = config_getstring(IMAPOPT_VIRTUAL_DEFAULTDOMAIN); /* look up the hostname we should present to the user */ config_servername = config_getstring(IMAPOPT_SERVERNAME); diff -ruN cyrus-imapd-2.2.5/lib/libconfig.h cyrus-imapd-2.2.5-hack/lib/libconfig.h --- cyrus-imapd-2.2.5/lib/libconfig.h 2003-12-29 21:22:55.000000000 +0100 +++ cyrus-imapd-2.2.5-hack/lib/libconfig.h 2004-06-15 23:09:28.000000000 +0200 @@ -66,6 +66,7 @@ extern const char *config_servername; extern const char *config_mupdate_server; extern const char *config_defdomain; +extern const char *config_virt_defdomain; extern const char *config_ident; extern int config_hashimapspool; extern int config_implicitrights;