package unix_dog::Controller::Account; use Mojo::Base 'Mojolicious::Controller', -signatures; use Net::LDAPS; use Net::LDAP::Extension::SetPassword; sub update_account($self) { my $v = $self->validation; $v->optional('gecos'); $v->optional('givenName'); $v->optional('surname'); $v->required('loginShell')->size(1,64); $v->optional('roomNumber'); $v->optional('telNum'); $v->required('sshKeys')->size(1,4096); $v->optional('newPasswd'); $v->required('curPasswd')->size(1,512); $v->required('username', 'trim')->size(1,32)->like(qr/^([a-z_][a-z0-9_-]*[\$]?)$/); my $gecos = $self->param('gecos'); my $givenName = $self->param('givenName'); my $surname = $self->param('surname'); my $loginShell = $self->param('loginShell'); my $roomNumber = $self->param('roomNumber'); my $telNum = $self->param('telNum'); my @sshKeys = split "\n", $self->param('sshKeys'); my $curPasswd = $self->param('curPasswd'); my $newPasswd = $self->param('newPasswd'); my $username = $self->param('username'); $self->stash( gecos => $gecos, givenName => $givenName, surname => $surname, loginShell => $loginShell, roomNumber => $roomNumber, telNum => $telNum, sshKeys => join("\n", @sshKeys), username => $username, ); 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('account/accountManage'); } my $config = $self->config; my $connStr = $config->{'ldap'}->{'uri'}; my $userDN ='CN='.$username.',OU=Dogs,DC=unix,DC=dog'; return Mojo::IOLoop->subprocess->run_p(sub { my $ldap = Net::LDAPS->new($connStr, verify=>'none', version=>3) or die "$@"; my $mesg = $ldap->bind($userDN, password=>$curPasswd); $mesg->code and die $mesg->error; $mesg = $ldap->modify( $userDN, replace => { gecos => $gecos || [], givenName => $givenName || [], sn => $surname || [], loginShell => $loginShell, roomNumber => $roomNumber || [], telephoneNumber => $telNum || [], sshPublicKey => @sshKeys, } ); $mesg->code and die $mesg->error; if (defined $newPasswd and $newPasswd) { $mesg = $ldap->set_password( user => $userDN, oldpasswd => $curPasswd, newpasswd => $newPasswd ); $mesg->code and die $mesg->error; } })->then(sub (@results) { return $self->render('account/success'); })->catch(sub ($err) { $self->stash(err => $err); return $self->render('account/accountManage'); }); } sub account($self) { my $v = $self->validation; $v->optional('username', 'trim')->size(1,32)->like(qr/^([a-z_][a-z0-9_-]*[\$]?)$/); if ($v->has_error) { $self->stash(err => 'Username is invalid.'); return $self->render('account/accountPage'); } if ($v->has_data) { my $username = $self->param('username'); my $config = $self->config; my $connStr = $config->{'ldap'}->{'uri'}; return Mojo::IOLoop->subprocess->run_p(sub { my $ldap = Net::LDAPS->new($connStr, verify=>'none', version=>3) or die "$@"; my $mesg = $ldap->bind(); $mesg->code and die $mesg->error; $mesg = $ldap->search( base => 'OU=Dogs,DC=unix,DC=dog', filter => '(uid='.$username.')', ); $mesg->code and die $mesg->error; my $userEntry = $mesg->first_entry; $userEntry or die 'User not found'; my $gecos = $userEntry->get_value('gecos'); my $givenName = $userEntry->get_value('givenname'); my $surname = $userEntry->get_value('sn'); my $loginShell = $userEntry->get_value('loginshell'); my $roomNumber = $userEntry->get_value('roomnumber'); my $telNum = $userEntry->get_value('telephonenumber'); my @sshKeys = $userEntry->get_value('sshPublicKey'); return ( gecos => $gecos, givenName => $givenName, surname => $surname, loginShell => $loginShell, roomNumber => $roomNumber, telNum => $telNum, sshKeys => join("\n", @sshKeys), username => $username, ) })->then(sub (@results) { $self->stash(@results); $self->render('account/accountManage'); })->catch(sub ($err) { $self->stash(err => $err); $self->render('account/accountPage'); }); } return $self->render('account/accountPage'); } 1;