diff --git a/lib/unix_dog/Controller/Register.pm b/lib/unix_dog/Controller/Register.pm index 6cede98..e5eae8e 100644 --- a/lib/unix_dog/Controller/Register.pm +++ b/lib/unix_dog/Controller/Register.pm @@ -2,6 +2,7 @@ package unix_dog::Controller::Register; use Mojo::Base 'Mojolicious::Controller', -signatures; use Net::LDAPS; use Net::LDAP::Extension::SetPassword; +use Net::LDAP::Constant qw(LDAP_NO_SUCH_OBJECT); use Email::Simple; use Email::Sender::Simple; use Email::Sender::Transport::Sendmail; @@ -16,24 +17,29 @@ sub register($self) { $v->required('username', 'trim')->size(1,32)->like(qr/^([a-z_][a-z0-9_-]*[\$]?)$/); $v->required('password')->size(8, 256); $v->required('email')->size(1, 512); - $v->required('pub-key')->size(1,4096); + $v->required('pubkey')->size(1,4096); $v->required('bio')->size(1, 2048); - if ($v->has_error) { - $self->stash(err => 'Your input was invalid. Please try again.'); - return $self->render('register/registerPage'); - } - my $username = $self->param('username'); my $password = $self->param('password'); my $email = $self->param('email'); - my $pubkeys = $self->param('pub-key'); + my $pubkeys = $self->param('pubkey'); my $bio = $self->param('bio'); my $fromIP = $self->tx->remote_address; - - $self->stash(email => $email); $self->stash(username => $username); + $self->stash(email => $email); + $self->stash(pubkeys => $pubkeys); + $self->stash(bio => $bio); + + if ($v->has_error) { + my $err = "Your input was invalid. Please try again."; + my @failed = $v->failed; + $self->stash(err => $err); + $self->stash(failed => @failed); + $self->stash(v => $v); + return $self->render('register/registerPage'); + } my $config = $self->config; return Mojo::IOLoop->subprocess->run_p(sub { @@ -59,6 +65,20 @@ sub register($self) { my $nextUID = int($uidEntry->get_value('uidnumber')); my $nextGID = int($uidEntry->get_value('gidnumber')); + $mesg = $ldap->search( + base => 'ou=Dogs,dc=unix,dc=dog', + filter => '(uid=' .$username. ')', + ); + $mesg->code and die $mesg->error; + $mesg->count == 0 or die 'That username is already in use.'; + + $mesg = $ldap->search( + base => 'ou=Dogs,ou=Unverified,dc=unix,dc=dog', + filter => '(uid='. $username .')', + ); + $mesg->code and die $mesg->error; + $mesg->count == 0 or die 'That username is already in use.'; + $mesg = $ldap->modify( $uidEntry, replace => { @@ -74,7 +94,7 @@ sub register($self) { $userDN, attrs => [ cn => $username, - mail => $email, + mail => $username . '@unix.dog', sshPublicKey => (split "\n", $pubkeys), objectClass => [ 'top', diff --git a/public/css/main.css b/public/css/main.css index 39624f8..8e9218c 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -151,3 +151,7 @@ textarea { #header-content a:hover { text-decoration: underline; } + +label.field-with-error { + color: red; +} diff --git a/templates/register/registerPage.html.ep b/templates/register/registerPage.html.ep index c83f437..116c891 100644 --- a/templates/register/registerPage.html.ep +++ b/templates/register/registerPage.html.ep @@ -5,6 +5,14 @@

<%= $err %>

+ <% if (my $failed = stash 'failed' and my $v = stash 'v') { %> + + <% } %> <% } %>

Before registering for UNIX.dog, please be sure you agree @@ -24,34 +32,28 @@ information over LDAP under cn=username,ou=Dogs,dc=unix,dc=dog.

-
+%= form_for register => (method => 'POST') => begin

- - + %= label_for username => 'Username:' + %= text_field 'username', id=>'username'

- - + %= label_for password => 'Password:' + %= password_field 'password', id=>'password'

- - + %= label_for email => 'EMail:' + %= email_field 'email', id=>'email'

- + %= label_for pubkey => 'Put your SSH keys here. Separate them by a newline if you have multiple.'
- + %= text_area 'pubkey', id=>'pubkey'

- + %= label_for bio => 'Tell us a bit about yourself here. Feel free to put some links, too :)'
- + %= text_area 'bio', id=>'bio'

- -
+ %= submit_button +% end