working textradius export
[freeside.git] / FS / FS / part_export / cyrus.pm
1 package FS::part_export::cyrus;
2
3 use vars qw(@ISA);
4 use FS::part_export;
5
6 @ISA = qw(FS::part_export);
7
8 sub rebless { shift; }
9
10 sub _export_insert {
11   my($self, $svc_acct) = (shift, shift);
12   $self->cyrus_queue( $svc_acct->svcnum, 'insert',
13     $svc_acct->username, $svc_acct->quota );
14 }
15
16 sub _export_replace {
17   my( $self, $new, $old ) = (shift, shift, shift);
18   return "can't change username using Cyrus"
19     if $old->username ne $new->username;
20   return '';
21 #  #return '' unless $old->_password ne $new->_password;
22 #  $self->cyrus_queue( $new->svcnum,
23 #    'replace', $new->username, $new->_password );
24 }
25
26 sub _export_delete {
27   my( $self, $svc_acct ) = (shift, shift);
28   $self->cyrus_queue( $svc_acct->svcnum, 'delete',
29     $svc_acct->username );
30 }
31
32 #a good idea to queue anything that could fail or take any time
33 sub cyrus_queue {
34   my( $self, $svcnum, $method ) = (shift, shift, shift);
35   my $queue = new FS::queue {
36     'svcnum' => $svcnum,
37     'job'    => "FS::part_export::cyrus::cyrus_$method",
38   };
39   $queue->insert(
40     $self->option('server'),
41     $self->option('username'),
42     $self->option('password'),
43     @_
44   );
45 }
46
47 sub cyrus_insert { #subroutine, not method
48   my $client = cyrus_connect(shift, shift, shift);
49   my( $username, $quota ) = @_;
50   my $rc = $client->create("user.$username");
51   my $error = $client->error;
52   die "creating user.$username: $error" if $error;
53
54   $rc = $client->setacl("user.$username", $username => 'all' );
55   $error = $client->error;
56   die "setacl user.$username: $error" if $error;
57
58   if ( $quota ) {
59     $rc = $client->setquota("user.$username", 'STORAGE' => $quota );
60     $error = $client->error;
61     die "setquota user.$username: $error" if $error;
62   }
63
64 }
65
66 sub cyrus_delete { #subroutine, not method
67   my ( $server, $admin_username, $password_username, $username ) = @_;
68   my $client = cyrus_connect($server, $admin_username, $password_username);
69
70   my $rc = $client->setacl("user.$username", $admin_username => 'all' );
71   my $error = $client->error;
72   die $error if $error;
73
74   $rc = $client->delete("user.$username");
75   $error = $client->error;
76   die $error if $error;
77 }
78
79 sub cyrus_connect {
80
81   my( $server, $admin_username, $admin_password ) = @_;
82
83   eval "use Cyrus::IMAP::Admin;";
84
85   my $client = Cyrus::IMAP::Admin->new($server);
86   $client->authenticate(
87     -user      => $admin_username,
88     -mechanism => "login",       
89     -password  => $admin_password,
90   );
91   $client;
92
93 }
94
95 #sub cyrus_replace { #subroutine, not method
96 #}
97
98