#!/usr/bin/perl use 5.010_000; use warnings; use strict; =head1 NAME fripost-adduser - Add a new mailbox to the system =cut our $VERSION = '0.02'; use FindBin qw($Bin); use lib "$Bin/lib"; use Data::Dumper; use Encode qw(encode); use File::Slurp qw(slurp); use Fripost::Password; use Fripost::Prompt; use Fripost::Schema; use Getopt::Long; use IO::Prompt; use MIME::Base64; use MIME::Lite; use MIME::QuotedPrint; use Template; use YAML::Syck; ## Get command line options our $conf = LoadFile('default.yml'); GetOptions( 'dbi_dsn' => \$conf->{dbi_dsn}, 'admuser=s' => \$conf->{admuser}, 'admpass=s' => \$conf->{admpass}, 'pretend' => \$conf->{pretend}, ) or die "Unable to get command line options."; # Connect to the database my $schema = Fripost::Schema->connect( $conf->{dbi_dsn}, $conf->{admuser}, $conf->{admpass}, {} #\%dbi_params ); say "Adding a new virtual user."; my $user; { my $username = prompt_email("New username: ", 'is_user'); my $name = prompt "Full (real) name: "; my $domain = (split /\@/, $username)[1]; my $maildir = "$domain/". (split /\@/, $username)[0] . "/Maildir/"; # trailing slash important my $active = 1; my $password = prompt_password(); $user = { username => $username, name => $name, domain => $domain, maildir => $maildir, active => $active, password => $password, }; say "Username: $user->{username}"; say "Real name: $user->{name}"; say "Password: (hidden)"; confirm_or_abort(); } die "User already exists" if ($schema->resultset('Mailbox')->search({ username => $user->{username} })->count); ## Insert user into database if ($conf->{pretend}) { say "Did not create user since we are pretending." } else { $schema->resultset('Mailbox')->new($user)->insert; say "New account $user->{username} added."; } ### Prepare sending emails my $tt = Template->new({ INCLUDE_PATH => "$Bin/templ", INTERPOLATE => 1, }) || die "$Template::ERROR\n"; my $msg = MIME::Lite->new( From => 'Friposts administratörer ', Subject => "=?UTF-8?B?" . encode_base64(encode("utf8", 'Välkommen till Fripost!'), "") . "?=", Encoding => 'quoted-printable', ); $msg->attr('content-type.charset' => 'utf-8'); ### Send welcome email to new user { my ($vars, $data); $vars = {}; $tt->process('new_user_mail.tt', $vars, \$data) || die $tt->error(), '\n'; $msg->replace(To => $user->{username}); $msg->data($data); unless ($conf->{pretend}) { $msg->send() unless $conf->{pretend};; say "Sent welcome message."; } say "----------------------------------- Welcome"; say decode_qp($msg->as_string); say "-----------------------------------"; } ### Send login credentials to new user { my ($vars, $data); $vars = { user => $user->{username}, pass => $user->{password}, real => $user->{name}, }; $tt->process('user_info.tt', $vars, \$data) || die $tt->error(), '\n'; $msg->data($data); say "Login information mail:"; say "----------------------------------- Credentials"; say decode_qp($msg->as_string); say "-----------------------------------"; confirm_or_abort("Send email with login information? "); my $to = prompt_email("Where should the email be sent? "); $msg->replace(To => $to); if (!$conf->{pretend}) { $msg->send; say "Credentials sent."; } else { say "Pretending, will not send credentials."; } } =head1 AUTHOR Stefan Kangas C<< >> =head1 COPYRIGHT Copyright 2010,2011 Stefan Kangas. =head1 LICENSE This program is free software; you can redistribute it and/or modify it under the same terms as perl itself. =cut