Admin Panel - User Control

<& SELF:error &> % if ($cmd eq 'Delete' and !$confirm) { <& SELF:confirm_del &> % } elsif ($cmd eq 'Edit' and !$err) { <& SELF:add_user, action => 'Change' &> % } else { <& SELF:list_users &> <& SELF:add_user &> %} <%args> $cmd => undef $user => undef $port => 0 $admin => 0 $ldap => 0 $confirm => 0 $pw => undef $fullname => undef $note => undef <%shared> my ($this_user,$users,%user_hash,$arg_user); my $odd = 0; my $err = ''; my $userip = $r->connection->client_ip; <%init> # Enforce secure + admin $m->comp('admin.html:force_secure_admin'); $this_user = $m->session->{user}; $arg_user = $user; # Fetch users from db. $m->comp('SELF:load_users'); # Add if ($cmd eq 'Add'){ $user = lc($user); $user =~ s/^\s*//; $user =~ s/\s+.*//; unless ($user){ $err .= "Select a user name.\n"; } unless ($pw || $ldap){ $err .= "Enter a password for this user.\n"; } if (defined $user_hash{$user}) { $err .= "There is already a user by that name.\n"; } unless ($err){ # Add my $rv = netdisco::user_add($user,( 'pw' => $pw, 'admin' => $admin eq '1' ? 1 : 0, 'port' => $port eq '1' ? 1 : 0, 'ldap' => $ldap eq '1' ? 1 : 0, 'fullname' => $fullname, 'note' => $note, )); $err = $rv ? "User $user added.\n" : "Could not Add user!\n"; # Log addition insert_or_update('user_log',{}, {'username'=>$m->session->{user},'event'=>'user_add', 'userip'=>$userip,'details'=>"User: $user - $err"}); # Reload hash $m->comp('SELF:load_users'); } } if ($cmd eq 'Change'){ unless (defined $user_hash{$user}){ $err .= "User $user not found.\n"; } my %user_change; unless ($err){ # Check for PW if (defined $pw and length($pw)){ $user_change{pw}=$pw; } # Check for Admin Change if ($admin != $user_hash{$user}->{admin}) { $user_change{admin} = $admin; } # Check for Port Change if ($port != $user_hash{$user}->{port_control}) { $user_change{port} = $port; } # Check for Ldap Change if ($ldap != $user_hash{$user}->{ldap}) { $user_change{ldap} = $ldap; } # Check for Note Change if ($note ne $user_hash{$user}->{note}) { $user_change{note} = $note; } # Check for Full Name Change if ($fullname ne $user_hash{$user}->{fullname}) { $user_change{fullname} = $fullname; } if (scalar keys %user_change){ my $rv = netdisco::user_add($user,%user_change); $err .= $rv ? "Could not modify user! $rv\n" : "Changed ".join(',',keys %user_change)." for user $user.\n"; # Log Change insert_or_update('user_log',{}, {'username'=>$m->session->{user},'event'=>'user_change', 'userip'=>$userip,'details'=>"User: $user - $err"}); $m->comp('SELF:load_users'); } } } if ($cmd eq 'Edit'){ unless (defined $user_hash{$user}){ $err .= "User $user not found.\n"; } } if ($cmd eq 'Delete'){ unless (defined $user_hash{$user}){ $err .= "User $user not found.\n"; } if ($user eq $this_user) { $err .= "You cannot delete yourself.\n"; } if (!$err and $confirm){ my $rv = netdisco::user_del($user); if (defined $rv){ $err .= "Deleted user $user.\n"; } else { $err .= "Could not delete user $user.\n"; } # Log Change insert_or_update('user_log',{}, {'username'=>$m->session->{user},'event'=>'user_del', 'userip'=>$userip,'details'=> "User: $user - $err"}); # Reload hash $m->comp('SELF:load_users'); } } <%method list_users>

Existing Users

% foreach my $user_entry (sort { $a->{username} cmp $b->{username} } @$users){ % my $last_on = $user_entry->{last_on} ? % scalar(localtime($user_entry->{last_on})) % : 'Never logged in'; % $odd++; % }
User Port
Control
Admin
Control
LDAP Full Name Note Created /
Last Login
 
<%$user_entry->{username}%> <%$user_entry->{port_control} ? 'Yes' : 'No'%> <%$user_entry->{admin} ? 'Yes' : 'No'%> <%$user_entry->{ldap} ? 'Yes' : 'No'%> <%$user_entry->{fullname} |h%> <%$user_entry->{note} |h%> <%scalar localtime($user_entry->{creation})%>
<%$last_on%>
<%scalar @$users%> Users. <%method add_user> % my $user = ($action eq 'Change') ? $user_hash{$arg_user} : undef;

<%$action%> User

% if ($action eq 'Add') { % } else { % }
<%args> $action => 'Add' <%method confirm_del>
Confirm Deletion of <%$arg_user |h%> :
Cancel
<%method load_users> <%perl> $users = sql_rows('users',['username','password','extract(epoch from creation) as creation', 'extract(epoch from last_on) as last_on','port_control','admin', 'note','fullname','ldap'] ); %user_hash = map {$_->{username} => $_} @$users; <%method error> % return unless $err;

<%$err%>

<%method title> - Admin Panel - Users \ %# $Id$ %# vim:syntax=mason