New version number
[mirror/userdir-ldap-cgi.git] / update.cgi
index 4db9464..d109bf7 100755 (executable)
@@ -10,10 +10,13 @@ use strict vars;
 use CGI;
 use Data::UUID;
 use Digest::HMAC_SHA1 qw(hmac_sha1_hex);
+use Digest::MD5 qw(md5_hex);
 use Util;
 use English;
 use URI::Escape;
+use Crypt::PasswdMD5;
 use Net::LDAP qw(LDAP_SUCCESS LDAP_PROTOCOL_ERROR);
+use Net::LDAP::Util qw(ldap_explode_dn);
 
 my %config = &Util::ReadConfigFile;
 
@@ -22,8 +25,16 @@ my $proto = ($ENV{HTTPS} ? "https" : "http");
 
 my $id = $query->param('id');
 my $authtoken = $query->param('authtoken');
-my $password = &Util::CheckAuthToken($authtoken);
-my $editdn = $query->param('editdn');
+
+my $password = undef;
+
+if ($authtoken || $id) {
+  $password = Util::TouchAuthToken($authtoken, $id);
+} else {
+  $password = '';
+  $id = '';
+  $authtoken = '';
+}
 
 if ($proto eq "http" || !($id && $password)) {
   print "Location: https://$ENV{SERVER_NAME}/$config{webloginhtml}\n\n";
@@ -41,7 +52,8 @@ sub DieHandler {
   $ldap->unbind if (defined($ldap));
 }
 
-$SIG{__DIE__} = \&DieHandler;
+#$SIG{__DIE__} = \&DieHandler;
+my $editdn = "uid=$id,$config{basedn}";
 
 $ldap = Net::LDAP->new($config{ldaphost});
 &Util::UpgradeConnection($ldap) unless $config{usessl} eq 'False';
@@ -143,7 +155,7 @@ if (!($query->param('doupdate'))) {
   my $confirmstring = '';
   my $sudopassword = '';
   for my $e(@{$entry->{'sudopassword'}}) {
-    my ($uuid, $status, $hosts, $crypted) = ($e =~ /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}) (confirmed:[0-9a-f]{40}|unconfirmed) ([a-z0-9.,*]+) ([^ ]+)$/);
+    my ($uuid, $status, $hosts, $crypted) = ($e =~ /^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}) (confirmed:[0-9a-f]{40}|unconfirmed) ([a-z0-9.,*-]+) ([^ ]+)$/);
     unless (defined $uuid) {
       $sudopassword .= "<tr><td>Unparseable line!</td></tr>\n";
       next;
@@ -206,7 +218,7 @@ if (!($query->param('doupdate'))) {
 
 
   # Actually update stuff...
-  my ($newpassword, $newstaddress, $newwebpassword);
+  my ($newpassword, $newstaddress, $newwebpassword, $newrtcpassword);
   
   # Good god, why would we want to do that here?  it breaks password setting
   # etc, and it doesn't prevent people from setting eveil stuff in ldap
@@ -239,19 +251,34 @@ if (!($query->param('doupdate'))) {
   if ($query->param('newwebpass') && $query->param('newwebpassvrfy')) {
     if ($query->param('newwebpass') ne $query->param('newwebpassvrfy')) {
       # passwords don't match...
-      &Util::HTMLError("The passwords you specified do not match. Please go back and try again.");
+      &Util::HTMLError("The web-passwords you specified do not match. Please go back and try again.");
     }
 
     my ($r, $msg) = &Util::checkPasswordQuality($query->param('newwebpass'), undef, [@ldapinfo_for_pwcheck]);
     if ($r) {
-      &Util::HTMLError("Password check failed: $msg.  Please go back and try again.");
+      &Util::HTMLError("Password check failed for web-password: $msg.  Please go back and try again.");
     }
 
     # create a md5 crypted password
-    $newwebpassword = crypt($query->param('newwebpass'), &Util::CreateCryptSalt(1));
+    $newwebpassword = apache_md5_crypt($query->param('newwebpass'), &Util::CreateCryptSalt(1, 1));
     
     &Util::LDAPUpdate($ldap, $editdn, 'webPassword', $newwebpassword);
   }  
+  if ($query->param('newrtcpass') && $query->param('newrtcpassvrfy')) {
+    if ($query->param('newrtcpass') ne $query->param('newrtcpassvrfy')) {
+      # passwords don't match...
+      &Util::HTMLError("The rtc-passwords you specified do not match. Please go back and try again.");
+    }
+
+    my ($r, $msg) = &Util::checkPasswordQuality($query->param('newrtcpass'), undef, [@ldapinfo_for_pwcheck]);
+    if ($r) {
+      &Util::HTMLError("Password check failed for rtc-password: $msg.  Please go back and try again.");
+    }
+    # create a md5 crypted password
+    $newrtcpassword = &md5_hex( ldap_explode_dn($editdn)->[0]{UID} . '@debian.org:rtc.debian.org:' . $query->param('newrtcpass') );
+
+    &Util::LDAPUpdate($ldap, $editdn, 'rtcPassword', $newrtcpassword);
+  }  
 
   $newstaddress = $query->param('staddress');
   $newstaddress =~ s/\n/\$/m;
@@ -381,8 +408,7 @@ if (!($query->param('doupdate'))) {
   &Util::LDAPUpdate($ldap, $editdn, 'sudoPassword', \@keepsudo);
 
   # when we are done, reload the page with the updated details.
-  my $url = "https://$ENV{SERVER_NAME}/$config{webupdateurl}?id=$id&authtoken=$authtoken&editdn=";
-  $url .= uri_escape($editdn, "\x00-\x40\x7f-\xff");
+  my $url = "https://$ENV{SERVER_NAME}/$config{webupdateurl}?id=$id;authtoken=$authtoken";
   print "Location: $url\n\n";  
 }