Changeset 67


Ignore:
Timestamp:
11/30/10 18:01:27 (13 years ago)
Author:
Kris Deugau
Message:

/trunk

checkpoint
Add user ACL handling nearing function
Add user/edit user pages merged; they're next to identical anyway
Group list images tweaked with proper "alpha channel", CSS fiddled again

  • final arrangement will probably be a couple of small triangles; pointing right for an expandable group, down for an expanded one

Option to add user to a different group removed

Location:
trunk
Files:
7 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/DNSDB.pm

    r66 r67  
    2525@ISA            = qw(Exporter);
    2626@EXPORT_OK      = qw(
    27         &initGlobals &initPermissions &getPermissions &changePermissions
     27        &initGlobals
     28        &initPermissions &getPermissions &changePermissions &comparePermissions
    2829        &connectDB &finish
    2930        &addDomain &delDomain &domainName
     
    3940@EXPORT         = (); # Export nothing by default.
    4041%EXPORT_TAGS    = ( ALL => [qw(
    41                 &initGlobals &initPermissions &getPermissions &changePermissions
     42                &initGlobals
     43                &initPermissions &getPermissions &changePermissions &comparePermissions
    4244                &connectDB &finish
    4345                &addDomain &delDomain &domainName
     
    294296
    295297
     298## DNSDB::comparePermissions()
     299# Compare two permission hashes
     300# Returns '>', '<', '=', '!'
     301sub comparePermissions {
     302  my $p1 = shift;
     303  my $p2 = shift;
     304
     305  my $retval = '=';     # assume equality until proven otherwise
     306
     307  no warnings "uninitialized";
     308
     309  foreach (@permtypes) {
     310    next if $p1->{$_} == $p2->{$_};     # equal is good
     311    if ($p1->{$_} && !$p2->{$_}) {
     312      if ($retval eq '<') {     # if we've already found an unequal pair where
     313        $retval = '!';          # $p2 has more access, and we now find a pair
     314        last;                   # where $p1 has more access, the overall access
     315      }                         # is neither greater or lesser, it's unequal.
     316      $retval = '>';
     317    }
     318    if (!$p1->{$_} && $p2->{$_}) {
     319      if ($retval eq '>') {     # if we've already found an unequal pair where
     320        $retval = '!';          # $p1 has more access, and we now find a pair
     321        last;                   # where $p2 has more access, the overall access
     322      }                         # is neither greater or lesser, it's unequal.
     323      $retval = '<';
     324    }
     325  }
     326  return $retval;
     327} # end comparePermissions()
     328
     329
    296330## DNSDB::_log()
    297331# Log an action
     
    640674  my $type = shift || 'u';      # create limited users by default - fwiw, not sure yet how this will interact with ACLs
    641675 
     676  my $permstring = shift || 'i';        # default is to inhert permissions from group
     677
    642678  my $fname = shift || $username;
    643679  my $lname = shift || '';
  • trunk/dns.cgi

    r66 r67  
    571571  list_users();
    572572
     573} elsif ($webvar{page} eq 'user') {
     574
     575  fill_actypelist();
     576  fill_clonemelist();
     577  my %grpperms;
     578  getPermissions($dbh, 'group', $curgroup, \%grpperms);
     579  fill_permissions($page, \%grpperms);
     580  my $grppermlist = new HTML::Template(filename => "$templatedir/permlist.tmpl");
     581  my %noaccess;
     582  fill_permissions($grppermlist, \%grpperms, \%noaccess);
     583  $grppermlist->param(info => 1);
     584  $page->param(grpperms => $grppermlist->output);
     585  $page->param(is_admin => $permissions{admin});
     586
     587#  if ($webvar{action} eq 'new') {
     588#  } els
     589  if ($webvar{action} eq 'add') {
     590
     591    my ($code,$msg);
     592
     593    my $alterperms = 0; # flag iff we need to force custom permissions due to user's current access limits
     594
     595    if ($webvar{pass1} ne $webvar{pass2}) {
     596      $code = 'FAIL';
     597      $msg = "Passwords don't match";
     598    } else {
     599# assemble a permission string - far simpler than trying to pass an
     600# indeterminate set of permission flags individually
     601
     602# ooooh.
     603# OOOOH.
     604# We have to see if the user can add any particular permissions;  otherwise we have a priviledge escalation.  Whee.
     605
     606if (!$permissions{admin}) {
     607  my %grpperms;
     608  getPermissions($dbh, 'group', $curgroup, \%grpperms);
     609  my $ret = comparePermissions(\%permissions, \%grpperms);
     610  if ($ret ne '<' && $ret ne '!') {
     611    # User's permissions are not a superset or equivalent to group.  Can't inherit
     612    # (and include access user doesn't currently have), so we force custom.
     613    $webvar{perms_type} = 'custom';
     614    $alterperms = 1;
     615  }
     616}
     617##work
     618      my $permstring;
     619      if ($webvar{perms_type} eq 'custom') {
     620        $permstring = 'C:';
     621        foreach (@permtypes) {
     622          if ($permissions{admin}) {
     623            $permstring .= ",$_" if defined($webvar{$_}) && $webvar{$_} eq 'on';
     624          } else {
     625            $permstring .= ",$_" if $permissions{$_} && defined($webvar{$_}) && $webvar{$_} eq 'on';
     626          }
     627        }
     628        $page->param(perm_custom => 1);
     629      } elsif ($permissions{admin} && $webvar{perms_type} eq 'clone') {
     630        $permstring = "c:$webvar{clonesrc}";
     631        $page->param(perm_clone => 1);
     632      } else {
     633        $permstring = 'i';
     634      }
     635      ($code,$msg) = addUser($dbh,$webvar{uname}, $curgroup, $webvar{pass1},
     636        ($webvar{makeactive} eq 'on' ? 1 : 0), $webvar{accttype}, $permstring,
     637        $webvar{fname}, $webvar{lname}, $webvar{phone});
     638    }
     639
     640# hokay, a bit of magic to decide which page we hit.
     641    if ($code eq 'OK') {
     642##log
     643      logaction(0, $session->param("username"), $webvar{group},
     644        "Added user $webvar{uname} ($webvar{fname} $webvar{lname})");
     645      if ($alterperms) {
     646        changepage(page => "useradmin", warnmsg =>
     647                "You can only grant permissions you hold.  $webvar{uname} added with reduced access.");
     648      } else {
     649        changepage(page => "useradmin");
     650      }
     651id => $webvar{id}, defrec => $webvar{defrec}
     652    } else {
     653# oddity - apparently, xhtml 1.0 strict swallows username as an HTML::Template var.  O_o
     654      $page->param(add_failed => 1);
     655      $page->param(uname => $webvar{uname});
     656      $page->param(fname => $webvar{fname});
     657      $page->param(lname => $webvar{lname});
     658      $page->param(pass1 => $webvar{pass1});
     659      $page->param(pass2 => $webvar{pass2});
     660      $page->param(errmsg => $msg);
     661      fill_actypelist();
     662      fill_clonemelist();
     663    }
     664
     665  } elsif ($webvar{action} eq 'edit') {
     666  } elsif ($webvar{action} eq 'update') {
     667  } else {
     668    # default is "new"
     669  }
     670
    573671} elsif ($webvar{page} eq 'newuser') {
    574672
     
    576674  fill_actypelist();
    577675  fill_clonemelist();
     676
     677  my %grpperms;
     678  getPermissions($dbh, 'group', $curgroup, \%grpperms);
     679  fill_permissions($page, \%grpperms);
     680
     681  my $grppermlist = new HTML::Template(filename => "$templatedir/permlist.tmpl");
     682  my %noaccess;
     683  fill_permissions($grppermlist, \%grpperms, \%noaccess);
     684  $grppermlist->param(info => 1);
     685  $page->param(grpperms => $grppermlist->output);
    578686
    579687} elsif ($webvar{page} eq 'adduser') {
     
    14511559  my $template = shift; # may need to do several sets on a single page
    14521560  my $permset = shift;  # hashref to permissions on object
     1561  my $usercan = shift || \%permissions; # allow alternate user-is-allowed permission block
    14531562
    14541563  foreach (@permtypes) {
    1455     $template->param("may_$_" => ($permissions{admin} || $permissions{$_}));
     1564    $template->param("may_$_" => ($usercan->{admin} || $usercan->{$_}));
    14561565    $template->param($_ => $permset->{$_});
    14571566  }
  • trunk/templates/permlist.tmpl

    r66 r67  
    11<tr>
    22        <td align="right">Group:</td>
    3         <td<TMPL_UNLESS may_group_edit> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="group_edit"<TMPL_IF group_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_group_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
    4         <td<TMPL_UNLESS may_group_create> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="group_create"<TMPL_IF group_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_group_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
    5         <td<TMPL_UNLESS may_group_delete> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="group_delete"<TMPL_IF group_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_group_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td> </tr>
     3        <td<TMPL_UNLESS may_group_edit> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="group_edit"</TMPL_UNLESS><TMPL_IF group_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_group_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
     4        <td<TMPL_UNLESS may_group_create> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="group_create"</TMPL_UNLESS><TMPL_IF group_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_group_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
     5        <td<TMPL_UNLESS may_group_delete> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="group_delete"</TMPL_UNLESS><TMPL_IF group_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_group_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td> </tr>
    66<tr>
    77        <td align="right">User:</td>
    8         <td<TMPL_UNLESS may_user_edit> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="user_edit"<TMPL_IF user_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_user_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
    9         <td<TMPL_UNLESS may_user_create> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="user_create"<TMPL_IF user_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_user_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
    10         <td<TMPL_UNLESS may_user_delete> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="user_delete"<TMPL_IF user_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_user_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td>
     8        <td<TMPL_UNLESS may_user_edit> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="user_edit"</TMPL_UNLESS><TMPL_IF user_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_user_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
     9        <td<TMPL_UNLESS may_user_create> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="user_create"</TMPL_UNLESS><TMPL_IF user_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_user_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
     10        <td<TMPL_UNLESS may_user_delete> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="user_delete"</TMPL_UNLESS><TMPL_IF user_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_user_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td>
    1111</tr>
    1212<tr>
    1313        <td align="right">Domain:</td>
    14         <td<TMPL_UNLESS may_domain_edit> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="domain_edit"<TMPL_IF domain_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_domain_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
    15         <td<TMPL_UNLESS may_domain_create> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="domain_create"<TMPL_IF domain_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_domain_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
    16         <td<TMPL_UNLESS may_domain_delete> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="domain_delete"<TMPL_IF domain_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_domain_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td>
     14        <td<TMPL_UNLESS may_domain_edit> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="domain_edit"</TMPL_UNLESS><TMPL_IF domain_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_domain_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
     15        <td<TMPL_UNLESS may_domain_create> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="domain_create"</TMPL_UNLESS><TMPL_IF domain_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_domain_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
     16        <td<TMPL_UNLESS may_domain_delete> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="domain_delete"</TMPL_UNLESS><TMPL_IF domain_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_domain_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td>
    1717        <!-- td class="noaccess"> - Delegate [fixme: WTF?]</td -->
    1818</tr>
    1919<tr>
    2020        <td align="right">Domain Record:</td>
    21         <td<TMPL_UNLESS may_record_edit> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="record_edit"<TMPL_IF record_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_record_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
    22         <td<TMPL_UNLESS may_record_create> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="record_create"<TMPL_IF record_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_record_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
    23         <td<TMPL_UNLESS may_record_delete> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="record_delete"<TMPL_IF record_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_record_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td>
     21        <td<TMPL_UNLESS may_record_edit> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="record_edit"</TMPL_UNLESS><TMPL_IF record_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_record_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
     22        <td<TMPL_UNLESS may_record_create> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="record_create"</TMPL_UNLESS><TMPL_IF record_create> checked="checked"</TMPL_IF><TMPL_UNLESS may_record_create> disabled="disabled"</TMPL_UNLESS> /> Create</td>
     23        <td<TMPL_UNLESS may_record_delete> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="record_delete"</TMPL_UNLESS><TMPL_IF record_delete> checked="checked"</TMPL_IF><TMPL_UNLESS may_record_delete> disabled="disabled"</TMPL_UNLESS> /> Delete</td>
    2424        <!-- td class="noaccess"> - Delegate</td -->
    2525</tr>
    2626<tr>
    2727        <td align="right">Self:</td>
    28         <td<TMPL_UNLESS may_self_edit> class="noaccess"</TMPL_UNLESS>><input type="checkbox" name="self_edit"<TMPL_IF self_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_self_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
     28        <td<TMPL_UNLESS may_self_edit> class="<TMPL_UNLESS info>noaccess<TMPL_ELSE>info</TMPL_UNLESS>"</TMPL_UNLESS>><input type="checkbox"<TMPL_UNLESS info> name="self_edit"</TMPL_UNLESS><TMPL_IF self_edit> checked="checked"</TMPL_IF><TMPL_UNLESS may_self_edit> disabled="disabled"</TMPL_UNLESS> /> Edit</td>
    2929<!-- <TMPL_IF may_admin><TMPL_VAR NAME=admin></TMPL_IF> -->
    3030</tr>
  • trunk/templates/user.tmpl

    r66 r67  
    99
    1010<input type="hidden" name="sid" value="<TMPL_VAR NAME=sid>" />
    11 <input type="hidden" name="page" value="adduser" />
    12 <input type="hidden" name="newuser" value="yes" />
     11<input type="hidden" name="page" value="user" />
     12<input type="hidden" name="action" value="<TMPL_VAR NAME=action>" />
    1313
    1414<table border="0" cellspacing="2" cellpadding="2" width="450">
    1515<TMPL_IF add_failed>    <tr>
    16                 <td class="errhead" colspan="2">Error adding user <TMPL_VAR NAME=uname>: <TMPL_VAR NAME=errmsg></td>
     16                <td class="errhead" colspan="2">Error <TMPL_IF add>adding<TMPL_ELSE>updating</TMPL_IF> user <TMPL_VAR NAME=uname>: <TMPL_VAR NAME=errmsg></td>
    1717        </tr></TMPL_IF>
    1818        <tr class="darkrowheader"><td colspan="2" align="center">Add User</td></tr>
     
    4040        <tr class="datalinelight">
    4141                <td>Account Type:</td>
     42<TMPL_IF is_admin>
    4243                <td align="left"><select name="accttype">
    4344<TMPL_LOOP name=actypelist>             <option value="<TMPL_VAR NAME=actypeval>"<TMPL_IF typesel> selected="selected"</TMPL_IF>><TMPL_VAR NAME=actypename></option>
    4445</TMPL_LOOP>            </select></td>
    45         </tr>
    46         <tr class="datalinelight">
    47                 <td>Add user in group:</td>
    48                 <td><select name="group">
    49 <TMPL_LOOP name=grouplist>              <option value="<TMPL_VAR NAME=groupval>"<TMPL_IF groupactive> selected="selected"</TMPL_IF>><TMPL_VAR name=groupname></option>
    50 </TMPL_LOOP>            </select></td>
     46<TMPL_ELSE>
     47                <td>User</td>
     48</TMPL_IF>
    5149        </tr>
    5250        <tr class="datalinelight">
     
    6361        </td>
    6462</tr>
    65 <tr>
    66         <td align="right">Group:</td>
    67         <td><input type="checkbox"<TMPL_IF i_grped> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
    68         <td><input type="checkbox"<TMPL_IF i_grpcreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
    69         <td><input type="checkbox"<TMPL_IF i_grpdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
    70 </tr>
    71 <tr>
    72         <td align="right">User:</td>
    73         <td><input type="checkbox"<TMPL_IF i_usered> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
    74         <td><input type="checkbox"<TMPL_IF i_usercreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
    75         <td><input type="checkbox"<TMPL_IF i_userdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
    76 </tr>
    77 <tr>
    78         <td align="right">Domain:</td>
    79         <td><input type="checkbox"<TMPL_IF i_domed> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
    80         <td><input type="checkbox"<TMPL_IF i_domcreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
    81         <td><input type="checkbox"<TMPL_IF i_domdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
    82         <!-- td>+ Delegate</td -->
    83 </tr>
    84 <tr>
    85         <td align="right">Domain Record:</td>
    86         <td><input type="checkbox"<TMPL_IF i_reced> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
    87         <td><input type="checkbox"<TMPL_IF i_reccreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
    88         <td><input type="checkbox"<TMPL_IF i_recdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
    89         <!-- td>+ Delegate</td -->
    90 </tr>
    91 <tr>
    92         <td align="right">Self:</td>
    93         <td><input type="checkbox"<TMPL_IF i_edself> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
    94 </tr>
     63<TMPL_VAR NAME=grpperms>
    9564
     65<TMPL_IF is_admin>
    9666<tr class="tableheader">
    9767        <td align="center" colspan="5">
     
    10878        </td>
    10979</tr>
     80</TMPL_IF>
     81
    11082<tr class="tableheader">
    11183        <td align="center" colspan="5">
     
    11385        </td>
    11486</tr>
    115 <TMPL_INCLUDE name="permlist_enabled.tmpl">
     87<TMPL_INCLUDE name="permlist.tmpl">
    11688
    11789</table>
  • trunk/templates/useradmin.tmpl

    r65 r67  
    55<td align="center">
    66
     7<TMPL_IF warnmsg>
     8<div class="warning">Warning: <TMPL_VAR NAME=warnmsg></div>
     9</TMPL_IF>
    710 <TMPL_IF del_failed>
    811  <div class='errmsg'>Error deleting user <TMPL_VAR NAME=delusername>: <TMPL_VAR NAME=errmsg></div>
     
    1922</tr>
    2023<tr><td colspan="3" align="center"><TMPL_INCLUDE NAME="lettsearch.tmpl"></td></tr>
    21 <tr><td colspan="3" align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=newuser">New User</a></td></tr>
     24<tr><td colspan="3" align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=user">New User</a></td></tr>
    2225</table>
    2326
     
    3134<TMPL_LOOP name=usertable>
    3235<tr class="row<TMPL_VAR name=bg>">
    33         <td align="left"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=edituser&amp;user=<TMPL_VAR NAME=userid>"><TMPL_VAR NAME=username></a></td>
     36        <td align="left"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=user&amp;action=edit&amp;user=<TMPL_VAR NAME=userid>"><TMPL_VAR NAME=username></a></td>
    3437        <td class="data_nowrap"><TMPL_VAR name=userfull></td>
    3538        <td><TMPL_VAR name=usertype></td>
Note: See TracChangeset for help on using the changeset viewer.