diff options
| author | Guilhem Moulin <guilhem.moulin@fripost.org> | 2012-06-03 22:20:58 +0200 | 
|---|---|---|
| committer | Guilhem Moulin <guilhem.moulin@fripost.org> | 2012-06-03 22:20:58 +0200 | 
| commit | a3684346f4d60715512c7ca30ba9fc7bb270c38e (patch) | |
| tree | b6c4d3a5223faf5801f5e5e7860110fca5efa521 /fripost-newalias | |
| parent | 0461d89edb3f8e272697726208ab7747c30a81df (diff) | |
Merge everything into a single executable.
Diffstat (limited to 'fripost-newalias')
| -rwxr-xr-x | fripost-newalias | 295 | 
1 files changed, 0 insertions, 295 deletions
diff --git a/fripost-newalias b/fripost-newalias deleted file mode 100755 index 3fc68f8..0000000 --- a/fripost-newalias +++ /dev/null @@ -1,295 +0,0 @@ -#!/usr/bin/perl - -use 5.010_000; -use strict; -use warnings; -use utf8; - -=head1 NAME - -fripost-newalias - Add a new alias to the system - -=head1 SYNOPSIS - -B<fripost-newalias> [B<--verbose>] [B<--debug>] [B<--pretend>] -[B<--force>] [I<goto> [I<from>...]] - -=head1 DESCRIPTION - -B<fripost-newalias> adds a new virtual alias to the system, unless -B<--pretend> is set. -If I<goto> or I<from> are not given, the user is prompted for them. -If I<goto> is not fully qualified, C<fripost.org> is appended. -If I<from> is already an existing username or alias, -B<fripost-newalias> raises an error. - -Inserted aliases conform to Postfix's B<virtual>(5) alias table format, -with the restriction that I<from> has to be either in the form: - -=over 4 - -=item . - -I<user>@I<domain>, to redirect emails for I<user>@I<domain> to I<goto>, or - -=item . - -@I<domain>, to catch all emails for users in I<domain> and redirect them -to I<goto>. -This form has the lowest precedence: If there is an alias from -I<user>@I<domain> to I<goto2>, emails to I<user>@I<domain> will be -redirected to I<goto2> only. -See B<virtual>(5) for details and warnings. - -=back - -If serveral entries are matching, for instance if there are an alias from -I<user>@I<domain> to I<goto> and another for I<user>@I<domain> to -I<goto2>, emails to I<user>@I<domain> will be redirected to BOTH I<goto> -and I<goto2>. Note that B<fripost-newalias> forbids the creation of such -aliases, unless B<--force> is set. - - -=head1 OPTIONS - -=over 8 - -=item B<--pretend> - -Only simulates the insertion. (But still query the LDAP server to ensure -that the virtual domains of aliases are know, for example.) - -=item B<--force> - -Force creating the creation, even if I<from> is already an alias. Also, -disable the sending of the confirmation. - -=item B<--server_host=>I<host> - -The LDAP URI to connect to. -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<--bind_dn=>I<binddn> - -The Distinguished Name (DN) to bind to the LDAP directory. -(If not set, B<fripost-newalias> binds anonymously.) -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<--bind_pw=>I<password> - -The password to to bind with. -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<--base_dn=>I<basedn> - -The root DN for everything done by B<fripost-newalias>. -The default value is read from the configuration file, see B<CONFIGURATION>. - -=item B<-v>, B<--verbose> - -Verbose mode. - -=item B<--debug> - -Debug mode. - -=back - -=head1 CONFIGURATION - -The configuration is read from the file C<$HOME/.fripost.yml>. -Valid keys include: - -=over 4 - -=item I<server_host> - -The LDAP URI to connect to. Defaults to C<ldap://127.0.0.1:389>. - -=item I<admin_email> - -The I<From:> e-mail address to use. Defaults to C<admin@fripost.org>. - -=item I<bind_dn> - -The Distinguished Name (DN) to bind to the LDAP directory. -(If not set, B<fripost-newalias> binds anonymously.) - -=item I<bind_pw> - -The password to to bind with. - -=item I<base_dn> - -The root DN for everything done by B<fripost-newalias>. - -=back - - -=cut - -use FindBin qw($Bin); -use lib "$Bin/lib"; - -use Env qw /HOME/; -use File::Spec::Functions; - -use Encode qw(encode); -use Email::Valid; -use Fripost::Prompt; -use Fripost::Schema; -use IO::Prompter; -use Getopt::Long qw /:config noauto_abbrev no_ignore_case -                             gnu_compat bundling permute nogetopt_compat -                             auto_version auto_help/; -use Pod::Usage; -use MIME::Base64; -use MIME::Lite; -use MIME::QuotedPrint; -use Template; -use YAML::Syck; - - -## Get command line options -our $conf = LoadFile( catfile ($HOME, '.fripost.yml') ); - -GetOptions( -    'server_host=s' => \$conf->{server_host}, -    'base_dn=s'     => \$conf->{base_dn}, -    'bind_dn=s'     => \$conf->{bind_dn}, -    'bind_pw=s'     => \$conf->{bind_pw}, -    'pretend'       => \$conf->{pretend}, -    'force'         => \$conf->{force}, -    'debug'         => \$conf->{debug}, -    'v|verbose'     => \$conf->{verbose}, -    'man'           => sub { pod2usage(-exitstatus => 0, -                                       -verbose => 2) } -) or pod2usage(2); - -sub vsay { say STDERR @_ if $conf->{verbose} || $conf->{debug}; } - - -# Connect to the LDAP server -my $ldap = Fripost::Schema->new( $conf ); - - -# Get information -my $goto = fix_username(shift @ARGV); -my @addr = @ARGV; -$goto //= prompt_email("Alias goto address: ", 'is_user'); -@addr || push @addr, (split /, */, prompt "Alias from address(es): "); - -# Show goto adress -say "goto adress: $goto"; - -# Show from adresses -@addr = grep { -    if (Email::Valid->address('fake'.$_)) { -        # Warn if the domain is unknown. -        my $domain = (split /\@/, $_, 2)[1]; -        if ($ldap->domain->search({ domain => $domain })->count) { -            1; -        } -        else { -            warn "WARN: Skipping unknown domain `" .$domain. "'.\n"; -            undef; -        } -    } -    else { -        warn "WARN: Skipping invalid address `" .$_. "'.\n"; -        undef; -    } -} @addr; -if (@addr == 0) { -    warn "No valid destination adresses. Aborting...\n"; -    exit 1; -} -say "from adress(es): " . (join ", ", @addr); -confirm_or_abort(); - - -## Insert alias into database -for my $addr (@addr) { - -    my ($u,$d) = split /\@/, $addr, 2; -    my $rs; - -    # Ensure that the alias doesn't already exist. -    $rs = $ldap->alias->search({ address => $addr }); -    if ($rs->count and not (defined $conf->{force})) { -        print STDERR "Error: Alias $addr already exists. "; -        print STDERR "(Targetting to "; -        print STDERR (join ', ', map { $_->{goto} } $rs->entries); -        say STDERR ".)"; -        exit 1; -    } - -    die "Error: Username $addr exists.\n" -        if ($ldap->user->search({ username => $addr })->count); - -    if (!$conf->{pretend}) { -        $ldap->alias->add({ address => $addr, goto => $goto, -                            isActive => 'TRUE' }); -        say "New alias added from $addr to $goto."; -    } else { -        vsay "Pretending, will not add alias." -    } -} - -$ldap->unbind(); - - -### Prepare sending emails -my $tt = Template->new({ -    INCLUDE_PATH => "$Bin/templ", -    INTERPOLATE  => 1, -}) || die "$Template::ERROR\n"; - -my $admin_email = $conf->{admin_email}; -$admin_email  //= 'admin@fripost.org'; -my $msg = MIME::Lite->new( -    From    => encode('MIME-Q', 'Friposts administratörer') . ' <' .$admin_email. '>', -    Subject => encode('MIME-Q', 'Nya alias till din inkorg'), -    Encoding => 'quoted-printable', -); - -unless (defined $conf->{force}) { -    my ($vars, $data); -    $vars = { -        addrs => \@addr, -    }; - -    $tt->process('new_alias.tt', $vars, \$data) -        || die $tt->error(), '\n'; -    $msg->data($data); - -    $msg->replace(To => $goto); - -    if (!$conf->{pretend}) { -        confirm_or_abort("Send confirmation? "); -        $msg->send; -        say "Sent verification."; -    } -    else { -        vsay "Pretending, will not send verification."; -    } -} - -=head1 AUTHOR - -Stefan Kangas C<< <skangas at skangas.se> >> - -Guilhem Moulin C<< <guilhem at fripost.org> >> - -=head1 COPYRIGHT - -Copyright 2010,2011 Stefan Kangas. - -Copyright 2012 Guilhem Moulin. - -=head1 LICENSE - -This program is free software; you can redistribute it and/or modify it -under the same terms as perl itself. - -=cut  | 
