website/lib/unix_dog/Controller/Account.pm

158 lines
5.0 KiB
Perl

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;