164 lines
5.1 KiB
Perl
164 lines
5.1 KiB
Perl
package unix_dog::Controller::Account;
|
|
use strict;
|
|
use warnings FATAL => 'all';
|
|
use experimental 'signatures';
|
|
|
|
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,8192);
|
|
|
|
$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 = $self->param('sshKeys');
|
|
$sshKeys =~ s/\r//;
|
|
my @sshKeys = split "\n", $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;
|