From 999461003a84603f188d69a2281c0aa6071fafeb Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Fri, 31 Dec 2010 00:09:41 +0100 Subject: Automatic password generation for new users --- fripost-adduser.pl | 41 +++++++++++++++++++++--------- fripost-mkpass.pl | 43 ++++++++++++++++++++++++++++++++ lib/Fripost/Password.pm | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 11 deletions(-) create mode 100755 fripost-mkpass.pl create mode 100755 lib/Fripost/Password.pm diff --git a/fripost-adduser.pl b/fripost-adduser.pl index d6ebe53..b0f107e 100755 --- a/fripost-adduser.pl +++ b/fripost-adduser.pl @@ -25,9 +25,11 @@ our $VERSION = '0.01'; use Data::Dumper; use DateTime; use Email::Valid; +use Fripost::Password; use Fripost::Schema; use IO::Prompt; use Getopt::Long; +use String::MkPasswd qw/mkpasswd/; use YAML::Syck; ## Get command line options @@ -46,12 +48,14 @@ my $schema = Fripost::Schema->connect( my %user; +say "Adding a new virtual user."; + # Get the full e-mail of the user (aka e-mail) while (not defined $user{username}) { - $user{username} = prompt "Enter the full e-mail: "; + $user{username} = prompt "New username: "; if (!Email::Valid->address($user{username})) { undef $user{username}; - say "This is not a vaild e-mail address. Try again." + say "This is not a valid e-mail address. Try again." } } @@ -63,10 +67,6 @@ my @parts = split /\@/, $user{username}; my $username = $parts[0]; my $domain = $parts[1]; -print "Username: $username\nDomain:$domain\n"; - -die; - # Set domain name $user{domain} = $domain; @@ -80,10 +80,29 @@ $user{change_date} = $now; $user{active} = 1; -my $user = $schema->resultset('Mailbox')->new(\%user); - -# Make the insert into database -$user->insert; +# Generate password +my $password = mkpasswd( + -length => 20, + -minnum => 5, + -minspecial => 3 +); +$user{password} = smd5($password); + +# Show the information that will be inserted +say Dumper \%user; +say "Generated password: "; +say $password; + +# Make the insert after a prompt +my $ok = prompt "Is this OK? ", -yn; + +if (!$ok) { + say "Aborted by user." +} else { + my $user = $schema->resultset('Mailbox')->new(\%user); + $user->insert; + say "New account added." +} =head1 AUTHOR @@ -91,7 +110,7 @@ Stefan Kangas C<< >> =head1 COPYRIGHT -Copyright 2010 Stefan Kangas, all rights reserved. +Copyright 2010 Stefan Kangas. =head1 LICENSE diff --git a/fripost-mkpass.pl b/fripost-mkpass.pl new file mode 100755 index 0000000..4740f5b --- /dev/null +++ b/fripost-mkpass.pl @@ -0,0 +1,43 @@ +#!/usr/bin/perl + +use 5.010_000; +use warnings; +use strict; + +=head1 NAME + +fripost-mkpass.pl - Create a random new password + +=cut + +our $VERSION = '0.01'; + +use Fripost::Password; +use String::MkPasswd qw/mkpasswd/; + +# Generate password +my $password = mkpasswd( + -length => 20, + -minnum => 5, + -minspecial => 3 +); +$user{password} = smd5($password); + +# Show the information that will be inserted +say "Generated password: $password"; +say "Salted MD5: " . smd5($password); + +=head1 AUTHOR + +Stefan Kangas C<< >> + +=head1 COPYRIGHT + +Copyright 2010 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 diff --git a/lib/Fripost/Password.pm b/lib/Fripost/Password.pm new file mode 100755 index 0000000..eb5ad7e --- /dev/null +++ b/lib/Fripost/Password.pm @@ -0,0 +1,66 @@ +#!/usr/bin/perl + +use 5.010_000; +use warnings; +use strict; + +=head1 NAME + +Password.pm - Generate passwords + +=cut + +our $VERSION = '0.01'; + +use Data::Dumper; +use Digest::MD5; +use Exporter; +use MIME::Base64; + +our @EXPORT = qw/smd5 make_salt/ + +sub smd5 { + my $pw = shift; + my $salt = shift || &make_salt(); + return "{SMD5}" . pad_base64( MIME::Base64::encode( Digest::MD5::md5( $pw . $salt ) . $salt, '' ) ); +} + + +sub make_salt { + my $len = 8 + int( rand(8) ); + my @bytes = (); + for my $i ( 1 .. $len ) { + push( @bytes, rand(255) ); + } + return pack( 'C*', @bytes ); +} + +=head1 AUTHOR + +Stefan Kangas C<< >> + +=head1 BUGS + +Please report any bugs to C<< >> + +=head1 COPYRIGHT + +Copyright (c) 2010 Dominik Schulz (dominik.schulz@gauner.org). All rights reserved. + +Copyright 2010 Stefan Kangas, all rights reserved. + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +=cut + +1; # End of Password.pm + +__END__ + -- cgit v1.2.3