Index: /trunk/DNSDB.pm
===================================================================
--- /trunk/DNSDB.pm	(revision 66)
+++ /trunk/DNSDB.pm	(revision 67)
@@ -25,5 +25,6 @@
 @ISA		= qw(Exporter);
 @EXPORT_OK	= qw(
-	&initGlobals &initPermissions &getPermissions &changePermissions
+	&initGlobals
+	&initPermissions &getPermissions &changePermissions &comparePermissions
 	&connectDB &finish
 	&addDomain &delDomain &domainName
@@ -39,5 +40,6 @@
 @EXPORT		= (); # Export nothing by default.
 %EXPORT_TAGS	= ( ALL => [qw(
-		&initGlobals &initPermissions &getPermissions &changePermissions
+		&initGlobals
+		&initPermissions &getPermissions &changePermissions &comparePermissions
 		&connectDB &finish
 		&addDomain &delDomain &domainName
@@ -294,4 +296,36 @@
 
 
+## DNSDB::comparePermissions()
+# Compare two permission hashes
+# Returns '>', '<', '=', '!'
+sub comparePermissions {
+  my $p1 = shift;
+  my $p2 = shift;
+
+  my $retval = '=';	# assume equality until proven otherwise
+
+  no warnings "uninitialized";
+
+  foreach (@permtypes) {
+    next if $p1->{$_} == $p2->{$_};	# equal is good
+    if ($p1->{$_} && !$p2->{$_}) {
+      if ($retval eq '<') {	# if we've already found an unequal pair where
+        $retval = '!';		# $p2 has more access, and we now find a pair
+        last;			# where $p1 has more access, the overall access
+      }				# is neither greater or lesser, it's unequal.
+      $retval = '>';
+    }
+    if (!$p1->{$_} && $p2->{$_}) {
+      if ($retval eq '>') {	# if we've already found an unequal pair where
+        $retval = '!';		# $p1 has more access, and we now find a pair
+        last;			# where $p2 has more access, the overall access
+      }				# is neither greater or lesser, it's unequal.
+      $retval = '<';
+    }
+  }
+  return $retval;
+} # end comparePermissions()
+
+
 ## DNSDB::_log()
 # Log an action
@@ -640,4 +674,6 @@
   my $type = shift || 'u';	# create limited users by default - fwiw, not sure yet how this will interact with ACLs
   
+  my $permstring = shift || 'i';	# default is to inhert permissions from group
+
   my $fname = shift || $username;
   my $lname = shift || '';
Index: /trunk/dns.cgi
===================================================================
--- /trunk/dns.cgi	(revision 66)
+++ /trunk/dns.cgi	(revision 67)
@@ -571,4 +571,102 @@
   list_users();
 
+} elsif ($webvar{page} eq 'user') {
+
+  fill_actypelist();
+  fill_clonemelist();
+  my %grpperms;
+  getPermissions($dbh, 'group', $curgroup, \%grpperms);
+  fill_permissions($page, \%grpperms);
+  my $grppermlist = new HTML::Template(filename => "$templatedir/permlist.tmpl");
+  my %noaccess;
+  fill_permissions($grppermlist, \%grpperms, \%noaccess);
+  $grppermlist->param(info => 1);
+  $page->param(grpperms => $grppermlist->output);
+  $page->param(is_admin => $permissions{admin});
+
+#  if ($webvar{action} eq 'new') {
+#  } els
+  if ($webvar{action} eq 'add') {
+
+    my ($code,$msg);
+
+    my $alterperms = 0;	# flag iff we need to force custom permissions due to user's current access limits
+
+    if ($webvar{pass1} ne $webvar{pass2}) {
+      $code = 'FAIL';
+      $msg = "Passwords don't match";
+    } else {
+# assemble a permission string - far simpler than trying to pass an
+# indeterminate set of permission flags individually
+
+# ooooh.
+# OOOOH.
+# We have to see if the user can add any particular permissions;  otherwise we have a priviledge escalation.  Whee.
+
+if (!$permissions{admin}) {
+  my %grpperms;
+  getPermissions($dbh, 'group', $curgroup, \%grpperms);
+  my $ret = comparePermissions(\%permissions, \%grpperms);
+  if ($ret ne '<' && $ret ne '!') {
+    # User's permissions are not a superset or equivalent to group.  Can't inherit
+    # (and include access user doesn't currently have), so we force custom.
+    $webvar{perms_type} = 'custom';
+    $alterperms = 1;
+  }
+}
+##work
+      my $permstring;
+      if ($webvar{perms_type} eq 'custom') {
+	$permstring = 'C:';
+	foreach (@permtypes) {
+	  if ($permissions{admin}) {
+	    $permstring .= ",$_" if defined($webvar{$_}) && $webvar{$_} eq 'on';
+	  } else {
+	    $permstring .= ",$_" if $permissions{$_} && defined($webvar{$_}) && $webvar{$_} eq 'on';
+	  }
+	}
+	$page->param(perm_custom => 1);
+      } elsif ($permissions{admin} && $webvar{perms_type} eq 'clone') {
+	$permstring = "c:$webvar{clonesrc}";
+	$page->param(perm_clone => 1);
+      } else {
+	$permstring = 'i';
+      }
+      ($code,$msg) = addUser($dbh,$webvar{uname}, $curgroup, $webvar{pass1},
+	($webvar{makeactive} eq 'on' ? 1 : 0), $webvar{accttype}, $permstring,
+	$webvar{fname}, $webvar{lname}, $webvar{phone});
+    }
+
+# hokay, a bit of magic to decide which page we hit.
+    if ($code eq 'OK') {
+##log
+      logaction(0, $session->param("username"), $webvar{group},
+	"Added user $webvar{uname} ($webvar{fname} $webvar{lname})");
+      if ($alterperms) {
+	changepage(page => "useradmin", warnmsg =>
+		"You can only grant permissions you hold.  $webvar{uname} added with reduced access.");
+      } else {
+	changepage(page => "useradmin");
+      }
+id => $webvar{id}, defrec => $webvar{defrec}
+    } else {
+# oddity - apparently, xhtml 1.0 strict swallows username as an HTML::Template var.  O_o
+      $page->param(add_failed => 1);
+      $page->param(uname => $webvar{uname});
+      $page->param(fname => $webvar{fname});
+      $page->param(lname => $webvar{lname});
+      $page->param(pass1 => $webvar{pass1});
+      $page->param(pass2 => $webvar{pass2});
+      $page->param(errmsg => $msg);
+      fill_actypelist();
+      fill_clonemelist();
+    }
+
+  } elsif ($webvar{action} eq 'edit') {
+  } elsif ($webvar{action} eq 'update') {
+  } else {
+    # default is "new"
+  }
+
 } elsif ($webvar{page} eq 'newuser') {
 
@@ -576,4 +674,14 @@
   fill_actypelist();
   fill_clonemelist();
+
+  my %grpperms;
+  getPermissions($dbh, 'group', $curgroup, \%grpperms);
+  fill_permissions($page, \%grpperms);
+
+  my $grppermlist = new HTML::Template(filename => "$templatedir/permlist.tmpl");
+  my %noaccess;
+  fill_permissions($grppermlist, \%grpperms, \%noaccess);
+  $grppermlist->param(info => 1);
+  $page->param(grpperms => $grppermlist->output);
 
 } elsif ($webvar{page} eq 'adduser') {
@@ -1451,7 +1559,8 @@
   my $template = shift;	# may need to do several sets on a single page
   my $permset = shift;	# hashref to permissions on object
+  my $usercan = shift || \%permissions;	# allow alternate user-is-allowed permission block
 
   foreach (@permtypes) {
-    $template->param("may_$_" => ($permissions{admin} || $permissions{$_}));
+    $template->param("may_$_" => ($usercan->{admin} || $usercan->{$_}));
     $template->param($_ => $permset->{$_});
   }
Index: unk/templates/newuser.tmpl
===================================================================
--- /trunk/templates/newuser.tmpl	(revision 66)
+++ 	(revision )
@@ -1,131 +1,0 @@
-<!-- <TMPL_VAR NAME=sid> -->
-<table class="wholepage"><tr>
-<TMPL_INCLUDE NAME="menu.tmpl">
-
-<td align="center">
-
-<form action="dns.cgi" method="post">
-<fieldset>
-
-<input type="hidden" name="sid" value="<TMPL_VAR NAME=sid>" />
-<input type="hidden" name="page" value="adduser" />
-<input type="hidden" name="newuser" value="yes" />
-
-<table border="0" cellspacing="2" cellpadding="2" width="450">
-<TMPL_IF add_failed>	<tr>
-		<td class="errhead" colspan="2">Error adding user <TMPL_VAR NAME=uname>: <TMPL_VAR NAME=errmsg></td>
-	</tr></TMPL_IF>
-	<tr class="darkrowheader"><td colspan="2" align="center">Add User</td></tr>
-
-	<tr class="datalinelight">
-		<td>Username:</td>
-		<td align="left"><input type="text" name="uname" value="<TMPL_VAR NAME=uname>" /></td>
-	</tr>
-	<tr class="datalinelight">
-		<td>First Name:</td>
-		<td align="left"><input type="text" name="fname" value="<TMPL_VAR NAME=fname>" /></td>
-	</tr>
-	<tr class="datalinelight">
-		<td>Last Name:</td>
-		<td align="left"><input type="text" name="lname" value="<TMPL_VAR NAME=lname>" /></td>
-	</tr>
-	<tr class="datalinelight">
-		<td>Password:</td>
-		<td align="left"><input type="password" name="pass1" value="<TMPL_VAR NAME=pass1>" /></td>
-	</tr>
-	<tr class="datalinelight">
-		<td>Confirm Password:</td>
-		<td align="left"><input type="password" name="pass2" value="<TMPL_VAR NAME=pass2>" /></td>
-	</tr>
-	<tr class="datalinelight">
-		<td>Account Type:</td>
-		<td align="left"><select name="accttype">
-<TMPL_LOOP name=actypelist>		<option value="<TMPL_VAR NAME=actypeval>"<TMPL_IF typesel> selected="selected"</TMPL_IF>><TMPL_VAR NAME=actypename></option>
-</TMPL_LOOP>		</select></td>
-	</tr>
-	<tr class="datalinelight">
-		<td>Add user in group:</td>
-		<td><select name="group">
-<TMPL_LOOP name=grouplist>		<option value="<TMPL_VAR NAME=groupval>"<TMPL_IF groupactive> selected="selected"</TMPL_IF>><TMPL_VAR name=groupname></option>
-</TMPL_LOOP>		</select></td>
-	</tr>
-	<tr class="datalinelight">
-		<td>Create as active user</td><td><input type="checkbox" name="makeactive" checked="checked" /></td>
-	</tr>
-
-	<tr>
-		<td colspan="2">
-
-<table style="border: thin solid #000000;" border="0" cellspacing="5" cellpadding="0" width="100%">
-<tr class="tableheader">
-	<td align="center" colspan="5">
-	<input type="radio" name="perms_type" value="inherit" <TMPL_IF add_failed><TMPL_IF perm_inherit>checked="checked"</TMPL_IF><TMPL_ELSE>checked="checked"</TMPL_IF>/> Inherit permissions from group
-	</td>
-</tr>
-<tr>
-	<td align="right">Group:</td>
-	<td><input type="checkbox"<TMPL_IF i_grped> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
-	<td><input type="checkbox"<TMPL_IF i_grpcreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
-	<td><input type="checkbox"<TMPL_IF i_grpdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
-</tr>
-<tr>
-	<td align="right">User:</td>
-	<td><input type="checkbox"<TMPL_IF i_usered> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
-	<td><input type="checkbox"<TMPL_IF i_usercreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
-	<td><input type="checkbox"<TMPL_IF i_userdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
-</tr>
-<tr>
-	<td align="right">Domain:</td>
-	<td><input type="checkbox"<TMPL_IF i_domed> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
-	<td><input type="checkbox"<TMPL_IF i_domcreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
-	<td><input type="checkbox"<TMPL_IF i_domdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
-	<!-- td>+ Delegate</td -->
-</tr>
-<tr>
-	<td align="right">Domain Record:</td>
-	<td><input type="checkbox"<TMPL_IF i_reced> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
-	<td><input type="checkbox"<TMPL_IF i_reccreate> checked="checked"</TMPL_IF> disabled="disabled" /> Create</td>
-	<td><input type="checkbox"<TMPL_IF i_recdel> checked="checked"</TMPL_IF> disabled="disabled" /> Delete</td>
-	<!-- td>+ Delegate</td -->
-</tr>
-<tr>
-	<td align="right">Self:</td>
-	<td><input type="checkbox"<TMPL_IF i_edself> checked="checked"</TMPL_IF> disabled="disabled" /> Edit</td>
-</tr>
-
-<tr class="tableheader">
-	<td align="center" colspan="5">
-	<input type="radio" name="perms_type" value="clone" <TMPL_IF add_failed><TMPL_IF perm_clone> checked="checked"</TMPL_IF></TMPL_IF>/> Clone permissions from an existing user
-	</td>
-</tr>
-<tr>
-	<td align="center" colspan="5">
-	Note: Only users in the current group may be cloned<br>
-	<select name="clonesrc">
-	<option>-</option>
-	<TMPL_LOOP name=clonesrc><option value="<TMPL_VAR NAME=uid>"<TMPL_IF selected> selected</TMPL_IF>><TMPL_VAR NAME=username></option>
-	</TMPL_LOOP></select>
-	</td>
-</tr>
-<tr class="tableheader">
-	<td align="center" colspan="5">
-		<input type="radio" name="perms_type" value="custom" <TMPL_IF add_failed><TMPL_IF perm_custom> checked="checked"</TMPL_IF></TMPL_IF>/> Specify permissions
-	</td>
-</tr>
-<TMPL_INCLUDE name="permlist_enabled.tmpl">
-
-</table>
-
-		</td>
-	</tr>
-
-	<tr><td colspan="2" class="tblsubmit"><input type="submit" value="Add user" /></td></tr>
-
-<tr><td colspan="2">tmp note:  radio button select "group template" vs "clone user"?</td></tr>
-    </table>
-
-</fieldset>
-</form>
-
-</td></tr>
-</table>
Index: /trunk/templates/permlist.tmpl
===================================================================
--- /trunk/templates/permlist.tmpl	(revision 66)
+++ /trunk/templates/permlist.tmpl	(revision 67)
@@ -1,30 +1,30 @@
 <tr>
 	<td align="right">Group:</td>
-	<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>
-	<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>
-	<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>
+	<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>
+	<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>
+	<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>
 <tr>
 	<td align="right">User:</td>
-	<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>
-	<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>
-	<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>
+	<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>
+	<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>
+	<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>
 </tr>
 <tr>
 	<td align="right">Domain:</td>
-	<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>
-	<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>
-	<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>
+	<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>
+	<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>
+	<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>
 	<!-- td class="noaccess"> - Delegate [fixme: WTF?]</td -->
 </tr>
 <tr>
 	<td align="right">Domain Record:</td>
-	<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>
-	<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>
-	<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>
+	<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>
+	<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>
+	<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>
 	<!-- td class="noaccess"> - Delegate</td -->
 </tr>
 <tr>
 	<td align="right">Self:</td>
-	<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>
+	<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>
 <!-- <TMPL_IF may_admin><TMPL_VAR NAME=admin></TMPL_IF> -->
 </tr>
Index: /trunk/templates/user.tmpl
===================================================================
--- /trunk/templates/user.tmpl	(revision 67)
+++ /trunk/templates/user.tmpl	(revision 67)
@@ -0,0 +1,103 @@
+<!-- <TMPL_VAR NAME=sid> -->
+<table class="wholepage"><tr>
+<TMPL_INCLUDE NAME="menu.tmpl">
+
+<td align="center">
+
+<form action="dns.cgi" method="post">
+<fieldset>
+
+<input type="hidden" name="sid" value="<TMPL_VAR NAME=sid>" />
+<input type="hidden" name="page" value="user" />
+<input type="hidden" name="action" value="<TMPL_VAR NAME=action>" />
+
+<table border="0" cellspacing="2" cellpadding="2" width="450">
+<TMPL_IF add_failed>	<tr>
+		<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>
+	</tr></TMPL_IF>
+	<tr class="darkrowheader"><td colspan="2" align="center">Add User</td></tr>
+
+	<tr class="datalinelight">
+		<td>Username:</td>
+		<td align="left"><input type="text" name="uname" value="<TMPL_VAR NAME=uname>" /></td>
+	</tr>
+	<tr class="datalinelight">
+		<td>First Name:</td>
+		<td align="left"><input type="text" name="fname" value="<TMPL_VAR NAME=fname>" /></td>
+	</tr>
+	<tr class="datalinelight">
+		<td>Last Name:</td>
+		<td align="left"><input type="text" name="lname" value="<TMPL_VAR NAME=lname>" /></td>
+	</tr>
+	<tr class="datalinelight">
+		<td>Password:</td>
+		<td align="left"><input type="password" name="pass1" value="<TMPL_VAR NAME=pass1>" /></td>
+	</tr>
+	<tr class="datalinelight">
+		<td>Confirm Password:</td>
+		<td align="left"><input type="password" name="pass2" value="<TMPL_VAR NAME=pass2>" /></td>
+	</tr>
+	<tr class="datalinelight">
+		<td>Account Type:</td>
+<TMPL_IF is_admin>
+		<td align="left"><select name="accttype">
+<TMPL_LOOP name=actypelist>		<option value="<TMPL_VAR NAME=actypeval>"<TMPL_IF typesel> selected="selected"</TMPL_IF>><TMPL_VAR NAME=actypename></option>
+</TMPL_LOOP>		</select></td>
+<TMPL_ELSE>
+		<td>User</td>
+</TMPL_IF>
+	</tr>
+	<tr class="datalinelight">
+		<td>Create as active user</td><td><input type="checkbox" name="makeactive" checked="checked" /></td>
+	</tr>
+
+	<tr>
+		<td colspan="2">
+
+<table style="border: thin solid #000000;" border="0" cellspacing="5" cellpadding="0" width="100%">
+<tr class="tableheader">
+	<td align="center" colspan="5">
+	<input type="radio" name="perms_type" value="inherit" <TMPL_IF add_failed><TMPL_IF perm_inherit>checked="checked"</TMPL_IF><TMPL_ELSE>checked="checked"</TMPL_IF>/> Inherit permissions from group
+	</td>
+</tr>
+<TMPL_VAR NAME=grpperms>
+
+<TMPL_IF is_admin>
+<tr class="tableheader">
+	<td align="center" colspan="5">
+	<input type="radio" name="perms_type" value="clone" <TMPL_IF add_failed><TMPL_IF perm_clone> checked="checked"</TMPL_IF></TMPL_IF>/> Clone permissions from an existing user
+	</td>
+</tr>
+<tr>
+	<td align="center" colspan="5">
+	Note: Only users in the current group may be cloned<br>
+	<select name="clonesrc">
+	<option>-</option>
+	<TMPL_LOOP name=clonesrc><option value="<TMPL_VAR NAME=uid>"<TMPL_IF selected> selected</TMPL_IF>><TMPL_VAR NAME=username></option>
+	</TMPL_LOOP></select>
+	</td>
+</tr>
+</TMPL_IF>
+
+<tr class="tableheader">
+	<td align="center" colspan="5">
+		<input type="radio" name="perms_type" value="custom" <TMPL_IF add_failed><TMPL_IF perm_custom> checked="checked"</TMPL_IF></TMPL_IF>/> Specify permissions
+	</td>
+</tr>
+<TMPL_INCLUDE name="permlist.tmpl">
+
+</table>
+
+		</td>
+	</tr>
+
+	<tr><td colspan="2" class="tblsubmit"><input type="submit" value="Add user" /></td></tr>
+
+<tr><td colspan="2">tmp note:  radio button select "group template" vs "clone user"?</td></tr>
+    </table>
+
+</fieldset>
+</form>
+
+</td></tr>
+</table>
Index: /trunk/templates/useradmin.tmpl
===================================================================
--- /trunk/templates/useradmin.tmpl	(revision 66)
+++ /trunk/templates/useradmin.tmpl	(revision 67)
@@ -5,4 +5,7 @@
 <td align="center">
 
+<TMPL_IF warnmsg>
+<div class="warning">Warning: <TMPL_VAR NAME=warnmsg></div>
+</TMPL_IF>
  <TMPL_IF del_failed>
   <div class='errmsg'>Error deleting user <TMPL_VAR NAME=delusername>: <TMPL_VAR NAME=errmsg></div>
@@ -19,5 +22,5 @@
 </tr>
 <tr><td colspan="3" align="center"><TMPL_INCLUDE NAME="lettsearch.tmpl"></td></tr>
-<tr><td colspan="3" align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=newuser">New User</a></td></tr>
+<tr><td colspan="3" align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=user">New User</a></td></tr>
 </table>
 
@@ -31,5 +34,5 @@
 <TMPL_LOOP name=usertable>
 <tr class="row<TMPL_VAR name=bg>">
-	<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>
+	<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>
 	<td class="data_nowrap"><TMPL_VAR name=userfull></td>
 	<td><TMPL_VAR name=usertype></td>
