Index: trunk/DNSDB.pm
===================================================================
--- trunk/DNSDB.pm	(revision 310)
+++ trunk/DNSDB.pm	(revision 311)
@@ -2494,5 +2494,4 @@
   my $rev = shift;
   my $id = shift;
-  my %ret;
 
   # (ab)use distance and weight columns to store SOA data?  can't for default_rev_records...
@@ -2501,24 +2500,14 @@
   my $sql = "SELECT record_id,host,val,ttl from "._rectable($def,$rev).
 	" WHERE "._recparent($def,$rev)." = ? AND type=$reverse_typemap{SOA}";
-
-  my $sth = $dbh->prepare($sql);
-  $sth->execute($id);
+  my $ret = $dbh->selectrow_hashref($sql, undef, ($id) );
+  return if !$ret;
 ##fixme:  stick a flag somewhere if the record doesn't exist.  by the API, this is an impossible case, but...
 
-  my ($recid,$host,$val,$ttl) = $sth->fetchrow_array() or return;
-  my ($contact,$prins) = split /:/, $host;
-  my ($refresh,$retry,$expire,$minttl) = split /:/, $val;
-
-  $ret{recid}	= $recid;
-  $ret{ttl}	= $ttl;
-#  $ret{serial}	= $serial;	# ca't use distance for serial with default_rev_records
-  $ret{prins}	= $prins;
-  $ret{contact}	= $contact;
-  $ret{refresh}	= $refresh;
-  $ret{retry}	= $retry;
-  $ret{expire}	= $expire;
-  $ret{minttl}	= $minttl;
-
-  return %ret;
+  ($ret->{contact},$ret->{prins}) = split /:/, $ret->{host};
+  delete $ret->{host};
+  ($ret->{refresh},$ret->{retry},$ret->{expire},$ret->{minttl}) = split /:/, $ret->{val};
+  delete $ret->{val};
+
+  return $ret;
 } # end getSOA()
 
@@ -2535,5 +2524,18 @@
   my %soa = @_;
 
-  my %oldsoa = getSOA($dbh, $defrec, $revrec, $soa{recid});
+  my $oldsoa = getSOA($dbh, $defrec, $revrec, $soa{id});
+
+  my $msg;
+  my %logdata;
+  if ($defrec eq 'n') {
+    $logdata{domain_id} = $soa{id} if $revrec eq 'n';
+    $logdata{rdns_id} = $soa{id} if $revrec eq 'y';
+    $logdata{group_id} = parentID($dbh, (id => $soa{id}, revrec => $revrec,
+	type => ($revrec eq 'n' ? 'domain' : 'revzone') ) );
+  } else {
+    $logdata{group_id} = $soa{id};
+  }
+  my $parname = ($defrec eq 'y' ? groupName($dbh, $soa{id}) :
+		($revrec eq 'n' ? domainName($dbh, $soa{id}) : revName($dbh, $soa{id})) );
 
   # Allow transactions, and raise an exception on errors so we can catch it later.
@@ -2542,22 +2544,17 @@
   local $dbh->{RaiseError} = 1;
 
-  my $msg;
-
   eval {
-##fixme: data validation: make sure {recid} is really the SOA for {parent}
     my $sql = "UPDATE "._rectable($defrec, $revrec)." SET host=?, val=?, ttl=? WHERE record_id=? AND type=6";
     $dbh->do($sql, undef, ("$soa{contact}:$soa{prins}", "$soa{refresh}:$soa{retry}:$soa{expire}:$soa{minttl}",
-        $soa{ttl}, $soa{recid}) );
-
-    $msg = "Updated ".($defrec eq 'y' ? 'default ' : '')."SOA for ".
-	($defrec eq 'y' ? groupName($dbh, $soa{recid}) : 
-		($revrec eq 'n' ? domainName($dbh, $soa{recid}) : revName($dbh, $soa{recid}) ) ).
-	": (ns $oldsoa{prins}, contact $oldsoa{contact}, refresh $oldsoa{refresh},".
-	" retry $oldsoa{retry}, expire $oldsoa{expire}, minTTL $oldsoa{minttl}, TTL $oldsoa{ttl}) to ".
+        $soa{ttl}, $oldsoa->{record_id}) );
+    $msg = "Updated ".($defrec eq 'y' ? ($revrec eq 'y' ? 'default reverse ' : 'default ') : '').
+	"SOA for $parname: ".
+	"(ns $oldsoa->{prins}, contact $oldsoa->{contact}, refresh $oldsoa->{refresh},".
+	" retry $oldsoa->{retry}, expire $oldsoa->{expire}, minTTL $oldsoa->{minttl}, TTL $oldsoa->{ttl}) to ".
 	"(ns $soa{prins}, contact $soa{contact}, refresh $soa{refresh},".
 	" retry $soa{retry}, expire $soa{expire}, minTTL $soa{minttl}, TTL $soa{ttl})";
 
-#    _log($dbh, (rdns_id => $rdns_id, user_id => $userinfo{id}, group_id => $group,
-#	username => $userinfo{name}, entry => $msg) );
+    $logdata{entry} = $msg;
+    _log($dbh, %logdata);
 
     $dbh->commit;
@@ -2566,5 +2563,11 @@
     $msg = $@;
     eval { $dbh->rollback; };
-    return ('FAIL',$msg);
+    $logdata{entry} = "Error updating ".($defrec eq 'y' ? ($revrec eq 'y' ? 'default reverse zone ' : 'default ') : '').
+	"SOA record for $parname: $msg";
+    if ($config{log_failures}) {
+      _log($dbh, %logdata);
+      $dbh->commit;
+    }
+    return ('FAIL', $logdata{entry});
   } else {
     return ('OK', $msg);
Index: trunk/dns.cgi
===================================================================
--- trunk/dns.cgi	(revision 310)
+++ trunk/dns.cgi	(revision 311)
@@ -804,4 +804,5 @@
   if (!check_scope(id => $webvar{recid}, type =>
 	($webvar{defrec} eq 'y' ? ($webvar{revrec} eq 'y' ? 'defrevrec' : 'defrec') : 'record'))) {
+##fixme:  should we redirect to the requested record list page instead of the domain list?
     changepage(page => 'domlist', errmsg => "You do not have permission to edit the requested SOA record");
   }
@@ -809,7 +810,8 @@
   if (!check_scope(id => $webvar{id}, type =>
 	($webvar{defrec} eq 'y' ? 'group' : ($webvar{revrec} eq 'y' ? 'revzone' : 'domain')))) {
-    changepage(page => 'domlist', errmsg => "You do not have permission to edit the ".
+    changepage(page => ($webvar{revrec} eq 'y' ? 'revzones' : 'domlist'),
+	errmsg => "You do not have permission to edit the ".
 	($webvar{defrec} eq 'y' ? 'default ' : '')."SOA record for the requested ".
-	($webvar{defrec} eq 'y' ? 'group' : 'domain'));
+	($webvar{defrec} eq 'y' ? 'group' : ($webvar{revrec} eq 'y' ? 'reverse zone' : 'domain')) );
   }
 
@@ -817,24 +819,8 @@
 	unless ($permissions{admin} || $permissions{domain_edit});
 
-  # get old SOA for log
-  my %soa = getSOA($dbh,$webvar{defrec},$webvar{revrec},$webvar{id});
-
-#  my $sth;
-###fixme:  push SQL into DNSDB.pm
-###fixme: data validation: make sure {recid} is really the SOA for {id}
-#  # no domain ID, so we're editing the default SOA for a group (we don't care which one here)
-#  # plus a bit of magic to update the appropriate table
-#  my $sql = "UPDATE ".($webvar{defrec} eq 'y' ? "default_records" : "records").
-#	" SET host=?, val=?, ttl=? WHERE record_id=?";
-#  $sth = $dbh->prepare($sql);
-#  $sth->execute("$webvar{contact}:$webvar{prins}", 
-#	"$webvar{refresh}:$webvar{retry}:$webvar{expire}:$webvar{minttl}",
-#	$webvar{ttl},
-#	$webvar{recid});
-
   my ($code, $msg) = updateSOA($dbh, $webvar{defrec}, $webvar{revrec},
 	(contact => $webvar{contact}, prins => $webvar{prins}, refresh => $webvar{refresh},
-	retry => $webvar{retry}, expire => $webvar{expire}, minttl => $soa{minttl},
-	ttl => $webvar{ttl}, recid => $webvar{recid}) );
+	retry => $webvar{retry}, expire => $webvar{expire}, minttl => $webvar{minttl},
+	ttl => $webvar{ttl}, id => $webvar{id}) );
   if ($code eq 'OK') {
     changepage(page => "reclist", id => $webvar{id}, defrec => $webvar{defrec}, revrec => $webvar{revrec},
@@ -842,29 +828,7 @@
   } else {
     $page->param(update_failed => 1);
-    $page->param(msg => $DNSDB::errstr);
-    fillsoa($webvar{defrec},$webvar{revrec},$webvar{id});
-  }
-
-##fixme: faillog
-#  } else {
-if (0) {
-    # do this in the order of "default to most common case"
-    my $loggroup;
-    my $logdomain = $webvar{id};
-    if ($webvar{defrec} eq 'y') {
-      $loggroup = $webvar{id};
-      $logdomain = 0;
-    } else {
-      $loggroup = parentID($dbh, (id => $logdomain, type => 'domain', revrec => $webvar{revrec}));
-    }
-
-    logaction($logdomain, $session->param("username"), $loggroup,
-	"Updated ".($webvar{defrec} eq 'y' ? 'default ' : '')."SOA for ".
-	($webvar{defrec} eq 'y' ? groupName($dbh, $webvar{id}) : domainName($dbh, $webvar{id}) ).
-	": (ns $soa{prins}, contact $soa{contact}, refresh $soa{refresh},".
-	" retry $soa{retry}, expire $soa{expire}, minTTL $soa{minttl}, TTL $soa{ttl}) to ".
-	"(ns $webvar{prins}, contact $webvar{contact}, refresh $webvar{refresh},".
-	" retry $webvar{retry}, expire $webvar{expire}, minTTL $webvar{minttl}, TTL $webvar{ttl})");
-  } # if (0)
+    $page->param(msg => $msg);
+    fillsoa($webvar{defrec}, $webvar{revrec}, $webvar{id}, 'w');
+  }
 
 } elsif ($webvar{page} eq 'grpman') {
@@ -1723,4 +1687,6 @@
   my $revrec = shift;
   my $id = shift;
+  my $preserve = shift || 'd';	# Flag to use webvar fields or retrieve from database
+
   my $domname = ($defrec eq 'y' ? '' : "DOMAIN");
 
@@ -1744,16 +1710,26 @@
   $page->param(defminttl	=> $DNSDB::def{minttl});
 
-  # there are probably better ways to do this.  TMTOWTDI.
-  my %soa = getSOA($dbh,$defrec,$revrec,$id);
-
   $page->param(id	=> $id);
-  $page->param(recid	=> $soa{recid});
-  $page->param(prins	=> ($soa{prins} ? $soa{prins} : $DNSDB::def{prins}));
-  $page->param(contact	=> ($soa{contact} ? $soa{contact} : $DNSDB::def{contact}));
-  $page->param(refresh	=> ($soa{refresh} ? $soa{refresh} : $DNSDB::def{refresh}));
-  $page->param(retry	=> ($soa{retry} ? $soa{retry} : $DNSDB::def{retry}));
-  $page->param(expire	=> ($soa{expire} ? $soa{expire} : $DNSDB::def{expire}));
-  $page->param(minttl	=> ($soa{minttl} ? $soa{minttl} : $DNSDB::def{minttl}));
-  $page->param(ttl	=> ($soa{ttl} ? $soa{ttl} : $DNSDB::def{soattl}));
+
+  if ($preserve eq 'd') {
+    # there are probably better ways to do this.  TMTOWTDI.
+    my $soa = getSOA($dbh,$defrec,$revrec,$id);
+
+    $page->param(prins	=> ($soa->{prins} ? $soa->{prins} : $DNSDB::def{prins}));
+    $page->param(contact	=> ($soa->{contact} ? $soa->{contact} : $DNSDB::def{contact}));
+    $page->param(refresh	=> ($soa->{refresh} ? $soa->{refresh} : $DNSDB::def{refresh}));
+    $page->param(retry	=> ($soa->{retry} ? $soa->{retry} : $DNSDB::def{retry}));
+    $page->param(expire	=> ($soa->{expire} ? $soa->{expire} : $DNSDB::def{expire}));
+    $page->param(minttl	=> ($soa->{minttl} ? $soa->{minttl} : $DNSDB::def{minttl}));
+    $page->param(ttl	=> ($soa->{ttl} ? $soa->{ttl} : $DNSDB::def{soattl}));
+  } else {
+    $page->param(prins	=> ($webvar{prins} ? $webvar{prins} : $DNSDB::def{prins}));
+    $page->param(contact	=> ($webvar{contact} ? $webvar{contact} : $DNSDB::def{contact}));
+    $page->param(refresh	=> ($webvar{refresh} ? $webvar{refresh} : $DNSDB::def{refresh}));
+    $page->param(retry	=> ($webvar{retry} ? $webvar{retry} : $DNSDB::def{retry}));
+    $page->param(expire	=> ($webvar{expire} ? $webvar{expire} : $DNSDB::def{expire}));
+    $page->param(minttl	=> ($webvar{minttl} ? $webvar{minttl} : $DNSDB::def{minttl}));
+    $page->param(ttl	=> ($webvar{ttl} ? $webvar{ttl} : $DNSDB::def{soattl}));
+  }
 }
 
@@ -1764,13 +1740,13 @@
 
   # get the SOA first
-  my %soa = getSOA($dbh,$def,$rev,$id);
-
-  $page->param(contact	=> $soa{contact});
-  $page->param(prins	=> $soa{prins});
-  $page->param(refresh	=> $soa{refresh});
-  $page->param(retry	=> $soa{retry});
-  $page->param(expire	=> $soa{expire});
-  $page->param(minttl	=> $soa{minttl});
-  $page->param(ttl	=> $soa{ttl});
+  my $soa = getSOA($dbh,$def,$rev,$id);
+
+  $page->param(contact	=> $soa->{contact});
+  $page->param(prins	=> $soa->{prins});
+  $page->param(refresh	=> $soa->{refresh});
+  $page->param(retry	=> $soa->{retry});
+  $page->param(expire	=> $soa->{expire});
+  $page->param(minttl	=> $soa->{minttl});
+  $page->param(ttl	=> $soa->{ttl});
 
   my $foo2 = getDomRecs($dbh,$def,$rev,$id,$perpage,$webvar{offset},$sortby,$sortorder,$filter);
@@ -1820,6 +1796,6 @@
   }
 # retrieve the right ttl instead of falling (way) back to the hardcoded system default
-  my %soa = getSOA($dbh,$webvar{defrec},$webvar{revrec},$webvar{parentid});
-  $page->param(ttl	=> ($webvar{ttl} ? $webvar{ttl} : $soa{minttl}));
+  my $soa = getSOA($dbh,$webvar{defrec},$webvar{revrec},$webvar{parentid});
+  $page->param(ttl	=> ($webvar{ttl} ? $webvar{ttl} : $soa->{minttl}));
 }
 
Index: trunk/templates/editsoa.tmpl
===================================================================
--- trunk/templates/editsoa.tmpl	(revision 310)
+++ trunk/templates/editsoa.tmpl	(revision 311)
@@ -16,5 +16,4 @@
 <input type="hidden" name="page" value="updatesoa" />
 <input type="hidden" name="id" value="<TMPL_VAR NAME=id>" />
-<input type="hidden" name="recid" value="<TMPL_VAR NAME=recid>" />
 <input type="hidden" name="defrec" value="<TMPL_VAR NAME=defrec>" />
 <input type="hidden" name="revrec" value="<TMPL_VAR NAME=revrec>" />
