- Timestamp:
- 11/30/10 18:01:27 (14 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/DNSDB.pm
r66 r67 25 25 @ISA = qw(Exporter); 26 26 @EXPORT_OK = qw( 27 &initGlobals &initPermissions &getPermissions &changePermissions 27 &initGlobals 28 &initPermissions &getPermissions &changePermissions &comparePermissions 28 29 &connectDB &finish 29 30 &addDomain &delDomain &domainName … … 39 40 @EXPORT = (); # Export nothing by default. 40 41 %EXPORT_TAGS = ( ALL => [qw( 41 &initGlobals &initPermissions &getPermissions &changePermissions 42 &initGlobals 43 &initPermissions &getPermissions &changePermissions &comparePermissions 42 44 &connectDB &finish 43 45 &addDomain &delDomain &domainName … … 294 296 295 297 298 ## DNSDB::comparePermissions() 299 # Compare two permission hashes 300 # Returns '>', '<', '=', '!' 301 sub 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 296 330 ## DNSDB::_log() 297 331 # Log an action … … 640 674 my $type = shift || 'u'; # create limited users by default - fwiw, not sure yet how this will interact with ACLs 641 675 676 my $permstring = shift || 'i'; # default is to inhert permissions from group 677 642 678 my $fname = shift || $username; 643 679 my $lname = shift || ''; -
trunk/dns.cgi
r66 r67 571 571 list_users(); 572 572 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 606 if (!$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 } 651 id => $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 573 671 } elsif ($webvar{page} eq 'newuser') { 574 672 … … 576 674 fill_actypelist(); 577 675 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); 578 686 579 687 } elsif ($webvar{page} eq 'adduser') { … … 1451 1559 my $template = shift; # may need to do several sets on a single page 1452 1560 my $permset = shift; # hashref to permissions on object 1561 my $usercan = shift || \%permissions; # allow alternate user-is-allowed permission block 1453 1562 1454 1563 foreach (@permtypes) { 1455 $template->param("may_$_" => ($ permissions{admin} || $permissions{$_}));1564 $template->param("may_$_" => ($usercan->{admin} || $usercan->{$_})); 1456 1565 $template->param($_ => $permset->{$_}); 1457 1566 } -
trunk/templates/permlist.tmpl
r66 r67 1 1 <tr> 2 2 <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> 6 6 <tr> 7 7 <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> 11 11 </tr> 12 12 <tr> 13 13 <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> 17 17 <!-- td class="noaccess"> - Delegate [fixme: WTF?]</td --> 18 18 </tr> 19 19 <tr> 20 20 <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> 24 24 <!-- td class="noaccess"> - Delegate</td --> 25 25 </tr> 26 26 <tr> 27 27 <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> 29 29 <!-- <TMPL_IF may_admin><TMPL_VAR NAME=admin></TMPL_IF> --> 30 30 </tr> -
trunk/templates/user.tmpl
r66 r67 9 9 10 10 <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>" /> 13 13 14 14 <table border="0" cellspacing="2" cellpadding="2" width="450"> 15 15 <TMPL_IF add_failed> <tr> 16 <td class="errhead" colspan="2">Error addinguser <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> 17 17 </tr></TMPL_IF> 18 18 <tr class="darkrowheader"><td colspan="2" align="center">Add User</td></tr> … … 40 40 <tr class="datalinelight"> 41 41 <td>Account Type:</td> 42 <TMPL_IF is_admin> 42 43 <td align="left"><select name="accttype"> 43 44 <TMPL_LOOP name=actypelist> <option value="<TMPL_VAR NAME=actypeval>"<TMPL_IF typesel> selected="selected"</TMPL_IF>><TMPL_VAR NAME=actypename></option> 44 45 </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> 51 49 </tr> 52 50 <tr class="datalinelight"> … … 63 61 </td> 64 62 </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> 95 64 65 <TMPL_IF is_admin> 96 66 <tr class="tableheader"> 97 67 <td align="center" colspan="5"> … … 108 78 </td> 109 79 </tr> 80 </TMPL_IF> 81 110 82 <tr class="tableheader"> 111 83 <td align="center" colspan="5"> … … 113 85 </td> 114 86 </tr> 115 <TMPL_INCLUDE name="permlist _enabled.tmpl">87 <TMPL_INCLUDE name="permlist.tmpl"> 116 88 117 89 </table> -
trunk/templates/useradmin.tmpl
r65 r67 5 5 <td align="center"> 6 6 7 <TMPL_IF warnmsg> 8 <div class="warning">Warning: <TMPL_VAR NAME=warnmsg></div> 9 </TMPL_IF> 7 10 <TMPL_IF del_failed> 8 11 <div class='errmsg'>Error deleting user <TMPL_VAR NAME=delusername>: <TMPL_VAR NAME=errmsg></div> … … 19 22 </tr> 20 23 <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>&page= newuser">New User</a></td></tr>24 <tr><td colspan="3" align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&page=user">New User</a></td></tr> 22 25 </table> 23 26 … … 31 34 <TMPL_LOOP name=usertable> 32 35 <tr class="row<TMPL_VAR name=bg>"> 33 <td align="left"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&page= edituser&user=<TMPL_VAR NAME=userid>"><TMPL_VAR NAME=username></a></td>36 <td align="left"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&page=user&action=edit&user=<TMPL_VAR NAME=userid>"><TMPL_VAR NAME=username></a></td> 34 37 <td class="data_nowrap"><TMPL_VAR name=userfull></td> 35 38 <td><TMPL_VAR name=usertype></td>
Note:
See TracChangeset
for help on using the changeset viewer.