Skip to content

Commit

Permalink
crossdomain: new listing mode that supports folders across domains
Browse files Browse the repository at this point in the history
NOTE: this is very much recommended only for unixhierarchysep: yes,
otherwise you can't work with domains with dots in them!

Usage:

crossdomains: yes
unixhierarchysep: yes
virtdomains: userid

There's still no way to support shared folders in other domains.
  • Loading branch information
brong committed Nov 16, 2015
1 parent 9e69a22 commit d46db86
Show file tree
Hide file tree
Showing 4 changed files with 255 additions and 128 deletions.
61 changes: 55 additions & 6 deletions cunit/mboxname.testc
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ static struct
int isadmin;
int altnamespace;
int virtdomains;
int crossdomains;
const char *defdomain;
const char *userprefix;
const char *sharedprefix;
Expand All @@ -301,6 +302,7 @@ static void toexternal_helper(const char *intname,
config_virtdomains = conf.virtdomains;
config_defdomain = conf.defdomain;
imapopts[IMAPOPT_UNIXHIERARCHYSEP].val.b = conf.unixhierarchysep;
imapopts[IMAPOPT_CROSSDOMAINS].val.b = conf.crossdomains;
imapopts[IMAPOPT_ALTNAMESPACE].val.b = conf.altnamespace;
imapopts[IMAPOPT_USERPREFIX].val.s = conf.userprefix;
imapopts[IMAPOPT_SHAREDPREFIX].val.s = conf.sharedprefix;
Expand All @@ -312,9 +314,11 @@ static void toexternal_helper(const char *intname,
CU_ASSERT_STRING_EQUAL(extname, extname_expected);
free(extname);

char *intname_reversed = mboxname_from_external(extname_expected, &ns, conf.userid);
CU_ASSERT_STRING_EQUAL(intname, intname_reversed);
free(intname_reversed);
if (extname_expected) {
char *intname_reversed = mboxname_from_external(extname_expected, &ns, conf.userid);
CU_ASSERT_STRING_EQUAL(intname, intname_reversed);
free(intname_reversed);
}
}

static void test_toexternal_admin(void)
Expand Down Expand Up @@ -513,9 +517,54 @@ static void test_toexternal_domains(void)
toexternal_helper("bloggs.com!user.jane", "user.jane");
toexternal_helper("bloggs.com!user.jane.baz", "user.jane.baz");
toexternal_helper("bloggs.com!shared.quux", "shared.quux");
/* disabled while cross domain sharing is not allowed */
//toexternal_helper("boop.com!user.betty", "user.betty@boop.com");
//toexternal_helper("boop.com!shared.quux", "shared.quux@boop.com");
/* cross domain sharing is not allowed */
toexternal_helper("boop.com!user.betty", NULL);
toexternal_helper("boop.com!shared.quux", NULL);
}

static void test_toexternal_crossdomains(void)
{
memset(&conf, 0, sizeof(conf));
conf.virtdomains = 1;
conf.crossdomains = 1;
conf.unixhierarchysep = 1;
conf.userid = "fred@bloggs.com";

toexternal_helper("bloggs.com!user.fred", "INBOX");
toexternal_helper("bloggs.com!user.fred.foo", "INBOX/foo");
toexternal_helper("bloggs.com!user.fred.foo.barracuda", "INBOX/foo/barracuda");
toexternal_helper("bloggs.com!user.jane", "user/jane@bloggs.com");
toexternal_helper("bloggs.com!user.jane.baz", "user/jane@bloggs.com/baz");
// no domains in shared folders in crossdomain
toexternal_helper("bloggs.com!shared.quux", "shared/quux");

toexternal_helper("boop.com!user.betty", "user/betty@boop.com");
toexternal_helper("boop.com!user.betty.foo.bar", "user/betty@boop.com/foo/bar");
// shared folders in other domains can't be seen
toexternal_helper("boop.com!shared.quux", NULL);
}

static void test_toexternal_crossdomains_alt(void)
{
memset(&conf, 0, sizeof(conf));
conf.altnamespace = 1;
conf.virtdomains = 1;
conf.crossdomains = 1;
conf.unixhierarchysep = 1;
conf.userprefix = "User Magic";
conf.sharedprefix = "Shared Magic";
conf.userid = "fred@bloggs.com";

toexternal_helper("bloggs.com!user.fred", "INBOX");
toexternal_helper("bloggs.com!user.fred.foo", "foo");
toexternal_helper("bloggs.com!user.fred.foo.barracuda", "foo/barracuda");
toexternal_helper("bloggs.com!user.jane", "User Magic/jane@bloggs.com");
toexternal_helper("bloggs.com!user.jane.baz", "User Magic/jane@bloggs.com/baz");
// no domains in shared folders in crossdomain
toexternal_helper("bloggs.com!shared.quux", "Shared Magic/shared/quux");

toexternal_helper("boop.com!user.betty", "User Magic/betty@boop.com");
toexternal_helper("boop.com!user.betty.foo.bar", "User Magic/betty@boop.com/foo/bar");
}

static void test_toexternal_unixhier(void)
Expand Down
Loading

0 comments on commit d46db86

Please sign in to comment.