package LDV::User; use strict; use warnings; use utf8; use Mojo::Base 'Mojolicious::Controller'; use Net::LDAP; use Net::LDAP::Util qw(ldap_error_name); # is really needed? use Crypt::SaltedHash; # 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'); if (my $delay = $self->app->config->{ldap}->{auth_delay}) { sleep $delay; } $self->redirect_to('/user/login'); } sub update { my ($self) = @_; my ($data, $login); unless ($login = $self->session('useruid')) { $self->redirect_to('/user/login'); return; } eval { my ($ldap, $mesg); $ldap = Net::LDAP->new($self->app->config->{server}) or die("$@"); $mesg = $ldap->bind($self->app->config->{binddn}, password => $self->app->config->{bindpass}); if ($mesg->code) { $self->app->log->error($mesg->error); die("Can't connect to server\n"); } my $base = $self->app->config->{userbase}; my $attrs = [ @{$self->app->config->{defattrs}} ]; $mesg = $ldap->search(base => $base, scope => 'one', deref => 'never', filter => '(&(uid=$login)(class=InetOrgPerson))', attrs => $attrs); die("User not found\n") unless ($mesg->count); my $entry = $mesg->pop_entry(); 1; } or do { }; $self->stash({user_data => $data}); $self->render(); } sub create { my ($self) = @_; my ($result); $result = "Created"; eval { my ($ldap, $mesg); $ldap = Net::LDAP->new($self->app->config->{server}) or die("$@"); $mesg = $ldap->bind($self->app->config->{binddn}, password => $self->app->config->{bindpass}); if ($mesg->code) { $self->app->log->error($mesg->error); die("Can't connect to server\n"); } my $base = $self->app->config->{userbase}; my $login = $self->req->param('login'); die ("Empty username\n") unless ($login); die ("Forbidden characters in username\n") unless ($login =~ m|^[a-z]{2,36}$|oi); $mesg = $ldap->search(base => $base, scope => 'one', deref => 'never', filter => '(&(uid=$login)(class=InetOrgPerson))'); die("This user already exists\n") if ($mesg->count); my $attrs = {}; $attrs->{objectclass} = [ "top", @{$self->app->config->{defclasses}} ]; $attrs->{mail} = $self->req->param('mail'); $attrs->{displayname} = $self->req->param('displayname') || ''; if ($attrs->{displayname} =~ m|^(\S+)\s+(?:.*\s+)?(\S+)$|oi) { $attrs->{cn} = $1; $attrs->{sn} = $2; } else { $attrs->{cn} = '!not set!'; $attrs->{sn} = '!not set!'; } $attrs->{uid} = $login; my $csh = Crypt::SaltedHash->new(algorithm => 'SHA-1'); $csh->add($self->req->param('pass')); $attrs->{userpassword} = $csh->generate(); $mesg = $ldap->add("uid=$login,$base", attrs => [ %$attrs ]); if ($mesg->code) { $self->app->log->error($mesg->error); die("Can't add user\n"); } $ldap->unbind(); 1; } or do { $self->app->log->error($@); $result = "Error: $@"; }; $self->flash({result => $result}); $self->redirect_to('/user/create'); $self->rendered(); return 1; } 1;