Cyrus APIs ?
Bron Gondwana
brong at fastmail.fm
Thu May 28 20:58:55 EDT 2009
On Fri, May 29, 2009 at 12:27:27AM +0200, Thomas Cataldo wrote:
> Hi,
>
> We are building webmail & groupware software using cyrus for the mail
> storage part. I'm wondering if any programming interface existed to
> extend cyrus parts ?
Yeah, it's called the C language. Compile your own.
Personally I use git these days. Used to keep all the
patches with quilt, and before that we just fiddled around
in a CVS checkout and hoped nobody messed up. That's not
so clever. Version control good.
> Interesting things for us would be :
> - extending sieve (for exemple to implement "in my organisation" /
> "out of my organisation" vacation messages)
That's just a matter of writing the correct sieve script. No
extention needed.
> - IMAP protocol extensions (most needed thing would be to "idle" on
> every folders, not just inbox)
Yeah, good luck with that one. It's a pretty major "protocol extention",
and everything's very folder centric. It would be a rather large SMOP
(small matter of programming) for this.
> - custom authentification mechanism (for single sign-on purpose,
> because kerberos doesn't fit everywhere)
BYO saslauthd protocol daemon. We have one written in Perl that does
all sorts of clever. Just put this in your imapd.conf
sasl_pwcheck_method: saslauthd
And have your daemon listen on a unix socket at:
/var/state/saslauthd/mux
You need to speak the saslauthd protocol, which is a packed string
format. We parse it in Perl like this:
my $LoginName = get_counted_string($Self->{server}{client});
my $Password = get_counted_string($Self->{server}{client});
my $Service = lc get_counted_string($Self->{server}{client});
my $Realm = get_counted_string($Self->{server}{client});
And return one of:
use constant SASL_SUCC_RESP => pack("nA3", 2, "OK\000");
use constant SASL_FAIL_RESP => pack("nA3", 2, "NO\000");
(with this function - slightly ugly code, but it works)
sub get_counted_string {
my $fh = shift;
my ($rd, $data);
($rd = sysread($fh, $data, 2) ) == 2
or die "Unable to read counted string size ($rd != 2) ($!)";
my $size = unpack("n", $data);
$data = ''; $rd = 0; my $this_data = ''; my $rem_size = $size;
while (my $this_rd = sysread($fh, $this_data, $rem_size)) {
$rd += $this_rd;
$rem_size -= $this_rd;
$data .= $this_data;
}
die "Unable to read counted string data ($rd != $size) ($!)"
unless ($rd == $size);
return unpack("A$size", $data);
}
Bron.
More information about the Info-cyrus
mailing list