]> the.earth.li Git - autodns.git/blobdiff - autodns.pl
Trailing whitespace cleanup
[autodns.git] / autodns.pl
index d017e600f23695d0a3af9209e015939632dbf2dd..ab5859cb22c42bc636b3e54e55b6be59bb86c521 100755 (executable)
@@ -5,10 +5,11 @@
 # http://www.earth.li/projectpurple/progs/autodns.html
 # Released under the GPL.
 #
-# $Id: autodns.pl,v 1.13 2005/05/31 17:17:46 noodles Exp $
+# $Id: autodns.pl,v 1.15 2005/06/15 10:26:25 noodles Exp $
 #
 
 use strict;
+use Date::Parse;
 use Fcntl qw(:flock);
 use File::Temp qw(tempfile);
 use IPC::Open3;
@@ -21,7 +22,7 @@ my ($user, $server, $inprocess, $delcount, $addcount);
 my ($domain, @MAIL, @GPGERROR, @COMMANDS, %zones, $VERSION);
 
 use vars qw($me $ccreply $conffile $domainlistroot @cfgfiles $usersfile
-       $lockfile $reload_command);
+       $lockfile $reload_command $expiry);
 
 $VERSION="0.0.8";
 
@@ -73,7 +74,7 @@ sub valid_domain($) {
        my $domain = shift;
        $domain = lc $domain;
 
-       if ($domain =~ /^(?:[a-z0-9-]+\.)+[a-z]{2,4}$/) {
+       if ($domain =~ /^(?:[a-z0-9-]+\.)+[a-z]{2,6}$/) {
                return 1;
        } elsif ($domain =~ /^(?:[0-9\/-]+\.)+in-addr.arpa$/) {
                return 1;
@@ -251,7 +252,7 @@ if ($entity->parts) {
 } else {
        # Clear text.
 
-       my $pid = open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch");
+       my $pid = open3(\*GPGIN, \*GPGOUT, \*GPGERR, "gpg --batch --verify");
 
        # Feed it the mail.
        print GPGIN $entity->bodyhandle->as_string;
@@ -267,10 +268,12 @@ if ($entity->parts) {
 
 # Check who it's from and if the signature was a good one.
 $gpggood=1;
+my $sigtime = 0;
 foreach (@GPGERROR) {
        chomp;
-       if (/Signature made.* (.*)$/) {
-               $gpguser=$1; 
+       if (/Signature made (.*) using.*ID (.*)$/) {
+               $sigtime = str2time($1);
+               $gpguser=$2;
        } elsif (/error/) {
                $gpggood = 0;
                print REPLY "Some errors ocurred\n";
@@ -299,6 +302,21 @@ if ($gpggood) {
        exit;
 }
 
+# Check if the signature is outside our acceptable range.
+if (!defined($sigtime)) {
+       print REPLY "Couldn't parse signature time.\n";
+       close REPLY;
+       exit;
+} elsif ($sigtime > (time + $expiry)) {
+       print REPLY "Signature too far into the future.\n";
+       close REPLY;
+       exit;
+} elsif ($sigtime < (time - $expiry)) {
+       print REPLY "Signature too far into the past.\n";
+       close REPLY;
+       exit;
+}
+
 # Now let's check if we know this person.
 ($user, $priv, $server) = getuserinfo($gpguser);
 
@@ -483,6 +501,10 @@ zone \"$domain\" {
                print REPLY "LIST - show all the zones currently held by you.\n";
                print REPLY "ADD <domain> - adds the domain <domain> for processing.\n";
                print REPLY "DEL <domain> - removes the domain <domain> if you own it.\n";
+               if (($priv & 1) == 1) {
+                       print REPLY "MASTER <ip address> - set the nameserver".
+                       " we should slave off for subsequent ADD commands.\n";
+               }
        } elsif ($inprocess) {
                print REPLY "Unknown command!\n";
        }