Index: /trunk/dns.cgi
===================================================================
--- /trunk/dns.cgi	(revision 94)
+++ /trunk/dns.cgi	(revision 95)
@@ -22,6 +22,16 @@
 use Data::Dumper;
 
+#sub is_tainted {
+#  # from perldoc perlsec
+#  return ! eval { eval("#" . substr(join("", @_), 0, 0)); 1 };
+#}
+#use Cwd 'abs_path';
+#use File::Basename;
+#use lib dirname( abs_path $0 );
+#die "argh!  tainted!" if is_tainted($0);
+#die "argh! \@INC got tainted!" if is_tainted(@INC);
+
+# custom modules
 use lib '.';
-# custom modules
 use DNSDB qw(:ALL);
 
@@ -185,12 +195,16 @@
 
   $page->param(curpage => $webvar{page});
-  if ($webvar{del_failed}) {
-    $page->param(del_failed => 1);
-    $page->param(errmsg => $webvar{errmsg});
-  }
+  $page->param(errmsg => $webvar{errmsg}) if $webvar{errmsg};
+#  if ($webvar{del_failed}) {
+#    $page->param(del_failed => 1);
+#    $page->param(errmsg => $webvar{errmsg});
+#  }
 
   listdomains();
 
 } elsif ($webvar{page} eq 'newdomain') {
+
+  changepage(page => "domlist", errmsg => "You are not permitted to add domains")
+	unless ($permissions{admin} || $permissions{domain_create});
 
   # hmm.  nothing to do here?
@@ -204,4 +218,7 @@
 } elsif ($webvar{page} eq 'adddomain') {
 
+  changepage(page => "domlist", errmsg => "You are not permitted to add domains")
+	unless ($permissions{admin} || $permissions{domain_create});
+
   my ($code,$msg) = addDomain($dbh,$webvar{domain},$webvar{group},($webvar{makeactive} eq 'on' ? 1 : 0));
 
@@ -216,4 +233,7 @@
 } elsif ($webvar{page} eq 'deldom') {
 
+  changepage(page => "domlist", errmsg => "You are not permitted to delete domains")
+	unless ($permissions{admin} || $permissions{domain_delete});
+
   $page->param(id => $webvar{id});
 
@@ -232,5 +252,5 @@
 # need to find failure mode
       logaction($webvar{id}, $session->param("username"), $pargroup, "Failed to delete domain $dom ($msg)");
-      changepage(page => "domlist", del_failed => 1, errmsg => $msg);
+      changepage(page => "domlist", errmsg => "Error deleting domain $dom: $msg");
     } else {
       logaction($webvar{id}, $session->param("username"), $pargroup, "Deleted domain $dom");
@@ -244,4 +264,11 @@
 
 } elsif ($webvar{page} eq 'reclist') {
+
+##fixme:  ACL needs pondering.  Does "edit domain" interact with record add/remove/etc?
+# Note this seems to be answered "no" in Vega.
+# ACLs
+  $page->param(record_create	=> ($permissions{admin} || $permissions{record_create}) );
+#  $page->param(record_edit	=> ($permissions{admin} || $permissions{record_edit}) );
+  $page->param(record_delete	=> ($permissions{admin} || $permissions{record_delete}) );
 
   # Handle record list for both default records (per-group) and live domain records
@@ -280,12 +307,12 @@
   }
 
-  if ($webvar{del_failed}) {
-    $page->param(del_failed => 1);
-    $page->param(errmsg => $webvar{errmsg});
-  }
+  $page->param(errmsg => $webvar{errmsg}) if $webvar{errmsg};
 
 } elsif ($webvar{page} eq 'record') {
 
   if ($webvar{recact} eq 'new') {
+
+    changepage(page => "reclist", errmsg => "You are not permitted to add records", id => $webvar{parentid})
+	unless ($permissions{admin} || $permissions{record_create});
 
     $page->param(todo => "Add record");
@@ -297,4 +324,7 @@
 
   } elsif ($webvar{recact} eq 'add') {
+
+    changepage(page => "reclist", errmsg => "You are not permitted to add records", id => $webvar{parentid})
+	unless ($permissions{admin} || $permissions{record_create});
 
     my @recargs = ($dbh,$webvar{defrec},$webvar{parentid},$webvar{name},$webvar{type},$webvar{address},$webvar{ttl});
@@ -339,4 +369,7 @@
   } elsif ($webvar{recact} eq 'edit') {
 
+    changepage(page => "reclist", errmsg => "You are not permitted to edit records", id => $webvar{parentid})
+	unless ($permissions{admin} || $permissions{record_edit});
+
     $page->param(todo		=> "Update record");
     $page->param(recact		=> "update");
@@ -354,4 +387,7 @@
 
   } elsif ($webvar{recact} eq 'update') {
+
+    changepage(page => "reclist", errmsg => "You are not permitted to edit records", id => $webvar{parentid})
+	unless ($permissions{admin} || $permissions{record_edit});
 
     my ($code,$msg) = updateRec($dbh,$webvar{defrec},$webvar{id},
@@ -402,4 +438,7 @@
 
 } elsif ($webvar{page} eq 'delrec') {
+
+  changepage(page => "reclist", errmsg => "You are not permitted to delete records", id => $webvar{parentid})
+	unless ($permissions{admin} || $permissions{record_delete});
 
   $page->param(id => $webvar{id});
@@ -427,8 +466,8 @@
       }
       changepage(page => "reclist", id => $webvar{parentid}, defrec => $webvar{defrec},
-		del_failed => 1, errmsg => $msg);
-      $page->param(del_failed => 1);
-      $page->param(errmsg => $msg);
-      showdomain($webvar{defrec}, $webvar{parentid});
+		errmsg => "Error deleting record: $msg");
+#      $page->param(del_failed => 1);
+#      $page->param(errmsg => $msg);
+#      showdomain($webvar{defrec}, $webvar{parentid});
     } else {
       if ($webvar{defrec} eq 'y') {
@@ -1195,4 +1234,7 @@
     $rec->{port} = 'n/a' unless ($rec->{type} eq 'SRV');
     $row++;
+# ACLs
+    $rec->{record_edit} = ($permissions{admin} || $permissions{record_edit});
+    $rec->{record_delete} = ($permissions{admin} || $permissions{record_delete});
   }
   $page->param(reclist => $foo2);
@@ -1319,4 +1361,9 @@
   $filter = $session->param($webvar{page}.'filter');
   $searchsubs = $session->param($webvar{page}.'searchsubs');
+
+# ACLs
+  $page->param(domain_create	=> ($permissions{admin} || $permissions{domain_create}) );
+  $page->param(domain_edit	=> ($permissions{admin} || $permissions{domain_edit}) );
+  $page->param(domain_delete	=> ($permissions{admin} || $permissions{domain_delete}) );
 
 ##fixme:  $logingroup or $curgroup?
@@ -1387,4 +1434,7 @@
     $row{sid} = $sid;
     $row{offset} = $offset;
+# ACLs
+    $row{domain_edit} = ($permissions{admin} || $permissions{domain_edit});
+    $row{domain_delete} = ($permissions{admin} || $permissions{domain_delete});
 ##fixme:  need to clean up status indicator/usage/inversion
     push @domlist, \%row;
Index: /trunk/templates/domlist.tmpl
===================================================================
--- /trunk/templates/domlist.tmpl	(revision 94)
+++ /trunk/templates/domlist.tmpl	(revision 95)
@@ -5,6 +5,6 @@
 <td align="center">
 
- <TMPL_IF del_failed>
-  <div class='errmsg'>Error deleting domain <TMPL_VAR NAME=domain>: <TMPL_VAR NAME=errmsg></div>
+ <TMPL_IF errmsg>
+  <div class='errmsg'><TMPL_VAR NAME=errmsg></div>
  </TMPL_IF>
 
@@ -19,5 +19,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=newdomain">New Domain</a></td></tr>
+<tr><td colspan="3" align="right"><TMPL_IF domain_create><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=newdomain">New Domain</a></TMPL_IF></td></tr>
 </table>
 
@@ -31,6 +31,6 @@
 src="images/<TMPL_VAR NAME=sortorder>.png" /></TMPL_IF></td>
 </TMPL_LOOP>
-	<td class="datahead_s">Change Status</td>
-	<td class="datahead_s">Delete</td>
+<TMPL_IF domain_edit>	<td class="datahead_s">Change Status</td></TMPL_IF>
+<TMPL_IF domain_delete>	<td class="datahead_s">Delete</td></TMPL_IF>
 </tr>
 <TMPL_IF name=domtable>
@@ -40,6 +40,6 @@
 	<td><TMPL_VAR name=status></td>
 	<td><TMPL_VAR name=group></td>
-	<td align="center"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=domlist<TMPL_IF NAME=offset>&amp;offset=<TMPL_VAR NAME=offset></TMPL_IF>&amp;id=<TMPL_VAR NAME=domainid>&amp;action=<TMPL_IF NAME=mkactive>domon<TMPL_ELSE>domoff</TMPL_IF>"><TMPL_IF NAME=mkactive>activate<TMPL_ELSE>deactivate</TMPL_IF></a></td>
-	<td align="center"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=deldom&amp;id=<TMPL_VAR NAME=domainid>"><img src="images/trash2.png" alt="[ Delete ]" /></a></td>
+<TMPL_IF domain_edit>	<td align="center"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=domlist<TMPL_IF NAME=offset>&amp;offset=<TMPL_VAR NAME=offset></TMPL_IF>&amp;id=<TMPL_VAR NAME=domainid>&amp;action=<TMPL_IF NAME=mkactive>domon<TMPL_ELSE>domoff</TMPL_IF>"><TMPL_IF NAME=mkactive>activate<TMPL_ELSE>deactivate</TMPL_IF></a></td></TMPL_IF>
+<TMPL_IF domain_delete>	<td align="center"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=deldom&amp;id=<TMPL_VAR NAME=domainid>"><img src="images/trash2.png" alt="[ Delete ]" /></a></td></TMPL_IF>
 </tr>
 </TMPL_LOOP>
Index: /trunk/templates/reclist.tmpl
===================================================================
--- /trunk/templates/reclist.tmpl	(revision 94)
+++ /trunk/templates/reclist.tmpl	(revision 95)
@@ -5,6 +5,6 @@
 <td align="center" valign="top">
 
- <TMPL_IF del_failed>
-  <div class='errmsg'>Error deleting record: <TMPL_VAR NAME=errmsg></div>
+ <TMPL_IF errmsg>
+  <div class='errmsg'><TMPL_VAR NAME=errmsg></div>
  </TMPL_IF>
 
@@ -41,5 +41,5 @@
 <tr class="darkrowheader">
 	<td colspan="4">Records</td>
-	<td align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=record&amp;parentid=<TMPL_VAR NAME=id>&amp;defrec=<TMPL_VAR NAME=defrec>&amp;recact=new">Add record</a></td>
+<TMPL_IF record_create>	<td align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=record&amp;parentid=<TMPL_VAR NAME=id>&amp;defrec=<TMPL_VAR NAME=defrec>&amp;recact=new">Add record</a></td></TMPL_IF>
 	<td align="right"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=log&amp;id=<TMPL_VAR NAME=id><TMPL_IF logdom>&amp;ltype=dom</TMPL_IF>">View log</a></td>
 </tr>
@@ -56,9 +56,9 @@
  NAME=defrec>"><TMPL_VAR NAME=colname></a><TMPL_IF NAME=sortorder>&nbsp;<img alt="<TMPL_VAR
  NAME=sortorder>" src="images/<TMPL_VAR NAME=sortorder>.png" /></TMPL_IF></td></TMPL_LOOP>
-	<td>Delete</td>
+<TMPL_IF record_delete>	<td>Delete</td></TMPL_IF>
 </tr>
 <TMPL_LOOP NAME=reclist>
 <tr class="row<TMPL_VAR NAME=row>">
-	<td><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=record&amp;parentid=<TMPL_VAR NAME=id>&amp;defrec=<TMPL_VAR NAME=defrec>&amp;recact=edit&amp;id=<TMPL_VAR NAME=record_id>"><TMPL_VAR NAME=host></a></td>
+	<td><TMPL_IF record_edit><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=record&amp;parentid=<TMPL_VAR NAME=id>&amp;defrec=<TMPL_VAR NAME=defrec>&amp;recact=edit&amp;id=<TMPL_VAR NAME=record_id>"><TMPL_VAR NAME=host></a><TMPL_ELSE><TMPL_VAR NAME=host></TMPL_IF></td>
 	<td><TMPL_VAR NAME=type></td>
 	<td><TMPL_VAR NAME=val></td>
@@ -67,5 +67,5 @@
 	<td><TMPL_VAR NAME=port></td>
 	<td><TMPL_VAR NAME=ttl></td>
-	<td align="center"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=delrec&amp;id=<TMPL_VAR NAME=record_id>&amp;defrec=<TMPL_VAR NAME=defrec>&amp;parentid=<TMPL_VAR NAME=id>"><img src="images/trash2.png" alt="[ Delete ]" /></a></td>
+<TMPL_IF record_delete>	<td align="center"><a href="dns.cgi?sid=<TMPL_VAR NAME=sid>&amp;page=delrec&amp;id=<TMPL_VAR NAME=record_id>&amp;defrec=<TMPL_VAR NAME=defrec>&amp;parentid=<TMPL_VAR NAME=id>"><img src="images/trash2.png" alt="[ Delete ]" /></a></td></TMPL_IF>
 </tr>
 </TMPL_LOOP>
