|
|
|
package LDV::User;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use utf8;
|
|
|
|
|
|
|
|
use Mojo::Base 'Mojolicious::Controller';
|
|
|
|
|
|
|
|
# pages
|
|
|
|
sub login { my ($self) = @_; $self->render(); }
|
|
|
|
sub register { my ($self) = @_; $self->render(); }
|
|
|
|
|
|
|
|
sub profile {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
if (my $uid = $self->session('useruid')) {
|
|
|
|
my $data = $self->app->ldap->get($uid);
|
|
|
|
$self->stash(user_data => $data);
|
|
|
|
$self->render();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$self->redirect_to('/user/login');
|
|
|
|
$self->rendered();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub logout {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
$self->session({useruid => undef});
|
|
|
|
$self->redirect_to('/user/login');
|
|
|
|
$self->rendered();
|
|
|
|
}
|
|
|
|
|
|
|
|
sub auth {
|
|
|
|
my ($self) = @_;
|
|
|
|
my $user = $self->req->param('username');
|
|
|
|
my $pass = $self->req->param('password');
|
|
|
|
|
|
|
|
eval {
|
|
|
|
my $delay = $self->app->config->{ldap}->{auth_delay};
|
|
|
|
sleep $delay if $delay;
|
|
|
|
($user and $pass)
|
|
|
|
or die("empty username or password\n");
|
|
|
|
($user =~ m|^([a-z0-9_-]){3,64}$|oia)
|
|
|
|
or die("wrong username\n");
|
|
|
|
$self->app->ldap->auth($user, $pass)
|
|
|
|
or die("wrong user or password\n");
|
|
|
|
$self->session({useruid => $user});
|
|
|
|
$self->redirect_to('/user/profile');
|
|
|
|
} or do {
|
|
|
|
$self->flash({result => "Auth failed: $@"});
|
|
|
|
$self->redirect_to('/user/login');
|
|
|
|
};
|
|
|
|
|
|
|
|
$self->rendered;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub create {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
eval {
|
|
|
|
my $error;
|
|
|
|
my $user = $self->req->param('username');
|
|
|
|
my $pass = $self->req->param('password');
|
|
|
|
my $mail = $self->req->param('mail');
|
|
|
|
($user and $pass and $mail)
|
|
|
|
or die("please fill all fields\n");
|
|
|
|
($user =~ m|^([a-z0-9_-]){3,64}$|oia)
|
|
|
|
or die("wrong username\n");
|
|
|
|
|
|
|
|
$error = $self->app->ldap->create($user);
|
|
|
|
die("$error") if $error;
|
|
|
|
$error = $self->app->ldap->update($user, {mail => $mail});
|
|
|
|
die("$error") if $error;
|
|
|
|
|
|
|
|
if ($self->app->{user}->{confirm_register}) {
|
|
|
|
my $body = $self->render_partial(template => 'email/reg_success', format => 'txt');
|
|
|
|
my $email = $self->app->email->create($mail, $self->l("Registration"), $body);
|
|
|
|
$error = $self->app->email->send($mail, $email);
|
|
|
|
die("$error") if $error;
|
|
|
|
# TODO: generate and store recover code
|
|
|
|
} else {
|
|
|
|
$error = $self->app->ldap->chpass($user, $pass);
|
|
|
|
die("$error") if $error;
|
|
|
|
}
|
|
|
|
|
|
|
|
$self->flash({result => "Success! Now you may log in."});
|
|
|
|
$self->redirect_to('/user/profile'); 1;
|
|
|
|
} or do {
|
|
|
|
$self->app->log->error($@);
|
|
|
|
$self->flash({result => "Can't create user: $@"});
|
|
|
|
$self->redirect_to('/user/register');
|
|
|
|
};
|
|
|
|
|
|
|
|
$self->rendered();
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub update {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
eval {
|
|
|
|
my $user = $self->session('useruid')
|
|
|
|
or die("not logged in\n");
|
|
|
|
my $pass = $self->req->param('password')
|
|
|
|
or die("need current password\n");
|
|
|
|
$self->app->ldap->auth($user, $pass)
|
|
|
|
or die("wrong password\n");
|
|
|
|
|
|
|
|
my %attrs = ();
|
|
|
|
foreach my $key (qw(displayName mail o mobile)) {
|
|
|
|
my $value = $self->req->param(lc($key));
|
|
|
|
$attrs{$key} = $value;
|
|
|
|
}
|
|
|
|
my $error = $self->app->ldap->update($user, \%attrs);
|
|
|
|
die("$error\n") if $error;
|
|
|
|
if ($self->app->config->{user}->{allow_chpass} and
|
|
|
|
my $newpass = $self->req->param('newpass')) {
|
|
|
|
$error = $self->app->ldap->chpass($user, $newpass);
|
|
|
|
die("$error\n") if $error;
|
|
|
|
}
|
|
|
|
$self->redirect_to('/user/profile'); 1;
|
|
|
|
} or do {
|
|
|
|
$self->flash({result => "Can't save profile: $@"});
|
|
|
|
$self->redirect_to('/user/login');
|
|
|
|
};
|
|
|
|
|
|
|
|
$self->rendered();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub eaccess {
|
|
|
|
my ($self) = @_;
|
|
|
|
|
|
|
|
$self->res->code(403);
|
|
|
|
$self->render;
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|