aboutsummaryrefslogtreecommitdiffstats
path: root/fripost-newalias
diff options
context:
space:
mode:
Diffstat (limited to 'fripost-newalias')
-rwxr-xr-xfripost-newalias295
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