OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Ralf S. Engelschall
  Root:   /v/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-src                      Date:   22-Sep-2008 21:50:56
  Branch: HEAD                             Handle: 2008092220505600

  Added files:
    openpkg-src/dbmail      dbmail-folders.pl
  Modified files:
    openpkg-src/dbmail      dbmail.spec

  Log:
    add my dbmail-folders utility

  Summary:
    Revision    Changes     Path
    1.1         +180 -0     openpkg-src/dbmail/dbmail-folders.pl
    1.39        +7  -2      openpkg-src/dbmail/dbmail.spec
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-src/dbmail/dbmail-folders.pl
  ============================================================================
  $ cvs diff -u -r0 -r1.1 dbmail-folders.pl
  --- /dev/null 2008-09-22 21:50:41 +0200
  +++ dbmail-folders.pl 2008-09-22 21:50:56 +0200
  @@ -0,0 +1,180 @@
  [EMAIL PROTECTED]@/bin/perl
  +##
  +##  dbmail-folders -- DBMail Folders Creation Utility 
  +##  Copyright (c) 2007-2008 Ralf S. Engelschall <[EMAIL PROTECTED]>
  +##
  +##  See also:
  +##  http://www.dbmail.org/dokuwiki/doku.php?id=shared-mbox
  +##  http://library.mobrien.com/dbmailadministrator/DBMA_ACLs.htm
  +##
  +
  +#   language requirements
  +require 5.008;
  +use strict;
  +use warnings;
  +
  +#   load extensions
  +use Getopt::Long;
  +use DBI;
  +use DBD::Pg;
  +use DBIx::Simple;
  +
  +#   command line argument parsing
  +my $opt = {
  +    -help     => 0,
  +    -hostname => ($ENV{"PGHOST"}     || "localhost"),
  +    -database => ($ENV{"PGDATABASE"} || "dbmail"   ),
  +    -username => ($ENV{"PGUSER"}     || "dbmail"   ),
  +    -password => ($ENV{"PGPASSWORD"} || "dbmail"   ),
  +};
  +my $p = new Getopt::Long::Parser;
  +$p->configure("bundling");
  +$p->getoptions(
  +    'h|help'       => \$opt->{-help},
  +    'H|hostname=s' => \$opt->{-hostname},
  +    'D|database=s' => \$opt->{-database},
  +    'U|username=s' => \$opt->{-username},
  +    'P|password=s' => \$opt->{-password},
  +) || die "option parsing failed";
  +undef $p;
  +if ($opt->{-help} or @ARGV < 2) {
  +    printf(STDERR "USAGE: dbmail-folders [-h|--help]\n");
  +    printf(STDERR "       [-H|--hostname <db-hostname>] [-D|--database 
<db-name>]\n");
  +    printf(STDERR "       [-U|--username <db-username>] [-P|--password 
<db-password>]\n");
  +    printf(STDERR "       <owner> <folder> [[{ro,rw}:]<user> ...]\n");
  +    printf(STDERR "EXAMPLES:\n");
  +    printf(STDERR "1. # create public folder #Public/<folder> (fully 
shared)\n");
  +    printf(STDERR "   \$ dbmail-folders __public__ <folder> anyone\n");
  +    printf(STDERR "2. # create personal shared folder 
#Users/<owner>/<folder> (fully shared)\n");
  +    printf(STDERR "   \$ dbmail-folders <owner> <folder> anyone\n");
  +    printf(STDERR "3. # create personal shared folder 
#Users/<owner>/<folder> (fully shared, different access)\n");
  +    printf(STDERR "   \$ dbmail-folders <owner> <folder> ro:anyone 
rw:<proxy>\n");
  +    printf(STDERR "4. # create personal shared folder 
#Users/<owner>/<folder> (partly shared)\n");
  +    printf(STDERR "   \$ dbmail-folders <owner> <folder> <user1> <user2> 
...\n");
  +    printf(STDERR "5. # create personal private folder 
#Users/<owner>/<folder> (not shared)\n");
  +    printf(STDERR "   \$ dbmail-folders <owner> <folder>\n");
  +    exit($opt->{-help} ? 0 : 1);
  +}
  +my $owner  = shift(@ARGV);
  +my $folder = shift(@ARGV);
  +my @users  = @ARGV;
  +
  +#   connect to DBMail's PostgreSQL-based backend RDBMS
  +my $db = DBIx::Simple->connect(
  +    sprintf("dbi:Pg:host=%s;dbname=%s", $opt->{-hostname}, 
$opt->{-database}),
  +    $opt->{-username}, $opt->{-password},
  +    { RaiseError => 1, AutoCommit => 1 }
  +);
  +die "failed to connect to database"
  +    if (not defined($db));
  +
  +#   ensure that the folder owner exists
  +my ($owner_id) = $db->query(q{
  +    SELECT user_idnr
  +    FROM   dbmail_users 
  +    WHERE  userid = ?;
  +}, $owner)->flat();
  +if (not defined $owner_id) {
  +    printf(STDERR "dbmail-folders:ERROR: folder owner \"%s\" not 
existing\n", $owner); 
  +    exit(1);
  +}
  +
  +#   check whether folder already exists
  +my ($mailbox_id) = $db->query(q{
  +    SELECT mailbox_idnr 
  +    FROM   dbmail_mailboxes 
  +    WHERE  owner_idnr = ? AND name = ?;
  +}, $owner_id, $folder)->flat();
  +if (not defined $mailbox_id) {
  +    #   create it if still not existing
  +    $db->query(q{
  +        INSERT
  +        INTO    dbmail_mailboxes 
  +                ( owner_idnr, name, 
  +                  seen_flag, answered_flag, deleted_flag, flagged_flag, 
recent_flag, draft_flag,
  +                  no_inferiors, no_select, permission )
  +        VALUES  ( ?, ?,
  +                  1, 1, 1, 1, 1, 1,
  +                  0, 0, 2 );
  +    }, $owner_id, $folder)
  +        or printf(STDERR "dbmail-folders:ERROR: unable to create folder 
\"%s/%s\": %s\n", $owner, $folder, $db->error()), exit(1);
  +    ($mailbox_id) = $db->query(q{
  +        SELECT mailbox_idnr 
  +        FROM   dbmail_mailboxes 
  +        WHERE  owner_idnr = ? AND name = ?;
  +    }, $owner_id, $folder)->flat();
  +    if (not defined $mailbox_id) {
  +        printf(STDERR "dbmail-folders:ERROR: unable to determine id of newly 
created folder\n"); 
  +        exit(1);
  +    }
  +}
  +
  +#   optionally grant access to folder for additional users (beside folder 
owner)
  +$db->query(q{
  +    DELETE 
  +    FROM   dbmail_acl 
  +    WHERE  mailbox_id = ?;
  +}, $mailbox_id);
  +foreach my $user (@ARGV) {
  +    my $mode = "rw";
  +    if ($user =~ m/^(r[ow]):(.+)$/) {
  +        $mode = $1;
  +        $user = $2;
  +    } 
  +    my ($user_id) = $db->query(q{
  +        SELECT user_idnr
  +        FROM   dbmail_users 
  +        WHERE  userid = ?;
  +    }, $user)->flat();
  +    if (not defined $user_id) {
  +        printf(STDERR "dbmail-folders:WARNING: user \"%s\" not existing\n", 
$user); 
  +        next;
  +    }
  +    if ($mode eq "rw") {
  +        $db->query(q{
  +            INSERT 
  +            INTO   dbmail_acl 
  +                   ( user_id, mailbox_id, 
  +                     lookup_flag, read_flag, seen_flag, write_flag, 
insert_flag,
  +                     post_flag, create_flag, delete_flag, administer_flag )
  +            VALUES ( ?, ?,
  +                     1, 1, 1, 1, 1,
  +                     1, 1, 1, 1 );
  +        }, $user_id, $mailbox_id);
  +    }
  +    else {
  +        $db->query(q{
  +            INSERT 
  +            INTO   dbmail_acl 
  +                   ( user_id, mailbox_id, 
  +                     lookup_flag, read_flag, seen_flag, write_flag, 
insert_flag,
  +                     post_flag, create_flag, delete_flag, administer_flag )
  +            VALUES ( ?, ?,
  +                     1, 1, 0, 0, 0,
  +                     0, 0, 0, 0 );
  +        }, $user_id, $mailbox_id);
  +    }
  +}
  +
  +#   make sure at least owner is subscribed to folder
  +my ($exists) = $db->query(q{
  +    SELECT 1
  +    FROM   dbmail_subscription 
  +    WHERE  user_id = ? AND mailbox_id = ?;
  +}, $owner_id, $mailbox_id)->flat();
  +if (not (defined $exists and $exists)) {
  +    $db->query(q{
  +        INSERT 
  +        INTO   dbmail_subscription 
  +               ( user_id, mailbox_id )
  +        VALUES ( ?, ? );
  +    }, $owner_id, $mailbox_id);
  +}
  +
  +#   disconnect from DBMail's PostgreSQL-based backend RDBMS
  +$db->disconnect();
  +undef $db;
  +
  +#   die gracefully
  +exit(0);
  +
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/dbmail/dbmail.spec
  ============================================================================
  $ cvs diff -u -r1.38 -r1.39 dbmail.spec
  --- openpkg-src/dbmail/dbmail.spec    25 Mar 2008 07:28:42 -0000      1.38
  +++ openpkg-src/dbmail/dbmail.spec    22 Sep 2008 19:50:56 -0000      1.39
  @@ -36,7 +36,7 @@
   Group:        Mail
   License:      GPL
   Version:      %{V_major}.%{V_minor}
  -Release:      20080325
  +Release:      20080922
   
   #   package options
   %option       with_fsl    yes
  @@ -56,13 +56,14 @@
   Source1:      fsl.dbmail
   Source2:      rc.dbmail
   Source3:      dbmail-setup.sh
  +Source4:      dbmail-folders.pl
   Patch0:       dbmail.patch
   
   #   build information
   Prefix:       %{l_prefix}
   BuildRoot:    %{l_buildroot}
   BuildPreReq:  OpenPKG, openpkg >= 20060823, make, gcc, pkgconfig
  -PreReq:       OpenPKG, openpkg >= 20060823, MTA
  +PreReq:       OpenPKG, openpkg >= 20060823, MTA, perl
   BuildPreReq:  libiconv, gettext, gc, glib2, gmime
   PreReq:       libiconv, gettext, gc, glib2, gmime
   %if "%{with_fsl}" == "yes"
  @@ -208,6 +209,10 @@
           -e "s;@db_type@;$db_type;g" \
           %{SOURCE dbmail-setup.sh} 
$RPM_BUILD_ROOT%{l_prefix}/sbin/dbmail-setup
   
  +    #   install folder creation utility
  +    %{l_shtool} install -c -m 755 %{l_value -s -a} \
  +        %{SOURCE dbmail-folders.pl} 
$RPM_BUILD_ROOT%{l_prefix}/sbin/dbmail-folders
  +
       #   install default configuration file
       %{l_shtool} install%{l_nil} -c -m 600 %{l_value -s -a} \
           -e 's;[      ]*$;;' \
  @@ .
______________________________________________________________________
OpenPKG                                             http://openpkg.org
CVS Repository Commit List                     openpkg-cvs@openpkg.org

Reply via email to