[Debian-l10n-commits] [SCM] DDTP - Debian Descriptions Translation Project branch, master, updated. 20080812.0-116-g9d06ac3

Martijn van Oosterhout kleptog at svana.org
Sat Jun 16 16:48:27 UTC 2012


The following commit has been merged in the master branch:
commit 9d06ac3deb0793e0614439be692d47cfbcce447d
Author: Martijn van Oosterhout <kleptog at svana.org>
Date:   Fri Jun 15 19:23:18 2012 +0200

    Add more updates to ddtss-cgi, mainly adding admin support.

diff --git a/ddtss/ddtss-cgi b/ddtss/ddtss-cgi
index a52adb1..492aae0 100755
--- a/ddtss/ddtss-cgi
+++ b/ddtss/ddtss-cgi
@@ -1,4 +1,4 @@
-#!/usr/bin/perl 
+#!/usr/bin/perl
 
 use strict;
 
@@ -41,16 +41,30 @@ if( defined $user )
     if( not validate_user($user) )
     { undef $user }
     else
-    { $logged_in = 1 }
+    { 
+      $logged_in = 1;
+      if( admin_user($user) ) {
+        $is_admin = 1;
+      }
+    }
   }
 }
 
 if( not defined $user )
 {
   $user = $ENV{REMOTE_ADDR} || 'local';
+  $is_admin = 0;
 }
 $lang ||= 'xx';
 
+#if ( $ENV{REMOTE_ADDR} ne "86.93.96.92" )
+#{
+#  print $q->header( -type =>'text/html', -charset => "UTF-8", -expires => '+1h' ),
+#        $q->start_html( -title => "DDTSS is down", @html_headers ),
+#        $q->h1("DDTSS is in scheduled downtime, come back later.");
+#  exit(0);
+#}
+
 my $path = $ENV{PATH_INFO} || '/';
 # Later $self is overwritten for the per language page, so keep a copy of the real thing
 my $self = $ENV{SCRIPT_NAME} || 'local';
@@ -98,14 +112,34 @@ elsif( $path =~ m,^/messageto/([\w+.]+)$, )
 {
   messageto_display($1);
 }
+elsif( $path =~ m,^/messagetoteam/([\w+.]+)$, )
+{
+  messagetoteam_display($1);
+}
+elsif( $path =~ m,^/messagetoproject$, )
+{
+  messagetoproject_display();
+}
 elsif( $path =~ m,^/delmessage/([\d]+)$, )
 {
   delmessage_display($1);
 }
+elsif( $path =~ m,^/delteammessage/([\d]+)$, )
+{
+  delteammessage_display($1);
+}
+elsif( $path =~ m,^/delprojectmessage/([\d]+)$, )
+{
+  delprojectmessage_display($1);
+}
 elsif( $path eq "/createlogin" )
 {
   display_createlogin();
 }
+elsif( $path =~ m,^/userlist(/([\w]+))?$, )
+{
+  display_userlist($2);
+}
 elsif( $path eq "/verifylogin" )
 {
   display_verifylogin();
@@ -114,7 +148,7 @@ elsif( $path =~ m:^/(\w{2,5})(/.*)?$: )
 {
   $lang = $1;
   $path = $2 || '/';
-  $usercookie = [$q->cookie( -name => 'id', -value => "$user,$lang", -expires => '+7d', -path => $cookiepath )
+  $usercookie = [$q->cookie( -name => 'id', -value => "$user,$lang", -expires => '+70d', -path => $cookiepath )
                  ];  
 
   $self = $self."/".$lang;
@@ -195,14 +229,14 @@ sub delmessage_display
 {
   my $msg_count = $1;
 
-  my $db = DDTSS_Open_Write();
-  
   if( not $logged_in )
   {
     display_error("You must logged in for this action!");
     exit;
   }
   
+  my $db = DDTSS_Open_Write();
+  
   $user =~ s/:.*//;  
   my $s_messages="";
   $db->get("aliases/$user/messages", $s_messages );
@@ -216,6 +250,66 @@ sub delmessage_display
   exit;
 }
 
+sub delteammessage_display 
+{
+  my $msg_count = $1;
+
+  if( not $logged_in )
+  {
+    display_error("You must logged in for this action!");
+    exit;
+  }
+  
+  if( not $is_admin )
+  {
+    display_error("You must be a admin for this action!");
+    exit;
+  }
+
+  my $db = DDTSS_Open_Write();
+  
+  my $s_messages="";
+  $db->get("$lang/messages", $s_messages );
+  my @messages=split /~,~/,$s_messages;
+  my $del_msg=splice(@messages,$msg_count,1);
+  $s_messages=join ("~,~", at messages);
+  $db->put("$lang/messages", $s_messages );
+  DDTSS_Close($db);
+
+  goto_main_display("Message was removed");
+  exit;
+}
+
+sub delprojectmessage_display 
+{
+  my $msg_count = $1;
+  
+  if( not $logged_in )
+  {
+    display_error("You must logged in for this action!");
+    exit;
+  }
+  
+  if( not $is_admin )
+  {
+    display_error("You must be a admin for this action!");
+    exit;
+  }
+
+  my $db = DDTSS_Open_Write();
+  
+  my $s_messages="";
+  $db->get("messages", $s_messages );
+  my @messages=split /~,~/,$s_messages;
+  my $del_msg=splice(@messages,$msg_count,1);
+  $s_messages=join ("~,~", at messages);
+  $db->put("messages", $s_messages );
+  DDTSS_Close($db);
+
+  goto_main_display("Message was removed");
+  exit;
+}
+
 sub suggestion_display
 {
   my $suggestion_id = $1;
@@ -388,6 +482,108 @@ sub messageto_display
   print $q->end_html();
 }
 
+sub messagetoteam_display
+{
+  my $to_team = $1;
+  
+  my $db = DDTSS_Open_Write();
+  
+  if( not $logged_in )
+  {
+    $q->delete('submit','message');
+  }
+  
+  if( not $is_admin )
+  {
+    $q->delete('submit','message');
+  }
+  
+  if( defined $q->param("submit") and defined $q->param("message"))
+  {
+    my $s_messages="";
+    $db->get("$to_team/messages", $s_messages );
+    $s_messages.="~,~" if $s_messages;
+    $user =~ s/:.*//;  
+    $s_messages.="($user,".time()."):".$q->param("message");
+    $db->put("$to_team/messages", $s_messages );
+ 
+    print $q->header( -type =>'text/html', -charset => "UTF-8", -expires => '+1h' ),
+          $q->start_html( -title => "Write a message to team $to_team", @html_headers ),
+          $q->h1("Message was sent to team $to_team"),
+	  "<form action=\"\">
+	  <input type=\"button\" value=\"close window\" onclick=\"self.close()\">
+	  </form>";
+    print $q->end_html();
+ 
+    DDTSS_Close($db);
+    exit;
+  }
+
+  DDTSS_Close($db);
+
+  print $q->header( -type =>'text/html', -charset => "UTF-8", -expires => '+1h' ),
+        $q->start_html( -title => "Write a message to team $to_team", @html_headers ),
+        $q->h1("Message to team $to_team");
+
+  print $q->start_form( { -method => 'post' } ),
+        $q->textarea(-name => "message", -columns => 45, -rows => 4),
+	$q->br,
+        $q->submit( {-name => "submit", -label => 'send message' } ),
+        $q->end_form();
+
+  print $q->end_html();
+}
+
+sub messagetoproject_display
+{
+  my $db = DDTSS_Open_Write();
+  
+  if( not $logged_in )
+  {
+    $q->delete('submit','message');
+  }
+  
+  if( not $is_admin )
+  {
+    $q->delete('submit','message');
+  }
+  
+  if( defined $q->param("submit") and defined $q->param("message"))
+  {
+    my $s_messages="";
+    $db->get("messages", $s_messages );
+    $s_messages.="~,~" if $s_messages;
+    $user =~ s/:.*//;  
+    $s_messages.="($user,".time()."):".$q->param("message");
+    $db->put("messages", $s_messages );
+ 
+    print $q->header( -type =>'text/html', -charset => "UTF-8", -expires => '+1h' ),
+          $q->start_html( -title => "Write a message to the project", @html_headers ),
+          $q->h1("Message to project"),
+	  "<form action=\"\">
+	  <input type=\"button\" value=\"close window\" onclick=\"self.close()\">
+	  </form>";
+    print $q->end_html();
+ 
+    DDTSS_Close($db);
+    exit;
+  }
+
+  DDTSS_Close($db);
+
+  print $q->header( -type =>'text/html', -charset => "UTF-8", -expires => '+1h' ),
+        $q->start_html( -title => "Write a message to project", @html_headers ),
+        $q->h1("Message to project");
+
+  print $q->start_form( { -method => 'post' } ),
+        $q->textarea(-name => "message", -columns => 45, -rows => 4),
+	$q->br,
+        $q->submit( {-name => "submit", -label => 'send message' } ),
+        $q->end_form();
+
+  print $q->end_html();
+}
+
 sub display_langlist
 {
   my $db = DDTSS_Open_Read();
@@ -414,7 +610,8 @@ sub display_langlist
         $q->start_html( -title => "DDTSS", @html_headers ),
         $q->h1("DDTSS"),
         $q->p("The DDTSS (DDTS Satellite or Debian Distributed Translation Server Satellite) is a web frontend to the DDTS email server. It provides facilities to request translations, enter a translation and review other peoples translations. Afterwards the updated translation can be sent via email to the DDTS server."),
-        $q->p({-style=>'color: #ff0000'}, "Scheduled downtime: 08:00-10:00 UTC on 5 June 2011"),
+#        $q->p({-style=>'color: #ff0000'}, "Scheduled downtime: 08:00-10:00 UTC on 5 June 2011"),
+        #$q->p({-style=>'color: #ff0000'}, "The DDTSS has been moved to real database to improve reliability. If you experience any problems please email the Debian-I18n mailing list <debian-i18n\@lists.debian.org>"),
         $q->p("The DDTSS was created by Martijn van Oosterhout <kleptog (at) svana.org>.\n"),
         $q->p("More information about the DDTP and the DDTSS can be found ", $q->a({-href => 'http://www.debian.org/international/l10n/ddtp'},"here")."." );
   print $q->h1("Select a language:"),
@@ -502,21 +699,23 @@ sub main_display
         $q->start_html( -title => "DDTSS ($lang)", @html_headers, -xbase => "http://$http_host$self/" );
 
   print $q->h1("DDTSS for $lang");
-  print $q->p({-style=>'color: #ff0000'}, "Scheduled downtime: 08:00-10:00 UTC on 5 June 2011");
+#  print $q->p({-style=>'color: #ff0000'}, "Scheduled downtime: 08:00-10:00 UTC on 5 June 2011");
+  #print $q->p({-style=>'color: #ff0000'}, "The DDTSS has been moved to real database to improve reliability. If you experience any problems please email the Debian-I18n mailing list <debian-i18n\@lists.debian.org>");
 
-#  print "<div class=messages>\n",
-#        $q->h3("Project-Messages (".scalar(@projectmessages)."):", help("Messages for the DDTP"));
-#  @projectmessages=reverse (@projectmessages);
+  print "<div class=messages>\n",$q->h3("Project-Messages (".scalar(@projectmessages)."):", help("Messages for the DDTP"));
+  print $q->a( {href=>"$realself/messagetoproject", onclick=>"return popup(this.href)"}, "(Write a new project message)" ),'<br>' if ($is_admin);
+  @projectmessages=reverse (@projectmessages);
   my $msg_count=scalar(@projectmessages);
-#  @projectmessages=(splice (@projectmessages,0,5));
-#  print (scalar(@projectmessages)
-#          ? $q->ul(map { 
-#              my ($userfrom,$timestamp,$message) = ($_ =~ /\(([\w]+)(?:,([0-9]+))?\):(.*)/); 
-#	      $msg_count--;
-#              $q->li( "(".$q->a( {href=>"$realself/messageto/$userfrom", onclick=>"return popup(this.href)"}, "$userfrom" )."): ".localtime($timestamp)." ",(($is_admin) ? $q->a( {href=>"$realself/delprojectmessage/$msg_count"}, "DEL" ) : "" ),"<br>",$q->b($message));
-#            } (@projectmessages) )
-#          : "None"),
-#        "</div>\n";
+  @projectmessages=(splice (@projectmessages,0,5));
+  print (scalar(@projectmessages)
+          ? $q->ul(map { 
+              my ($userfrom,$timestamp,$message) = ($_ =~ /\(([\w]+)(?:,([0-9]+))?\):(.*)/); 
+	      $msg_count--;
+              $q->li( "(".$q->a( {href=>"$realself/messageto/$userfrom", onclick=>"return popup(this.href)"}, "$userfrom" )."): ".localtime($timestamp)." ",(($is_admin) ? $q->a( {href=>"$realself/delprojectmessage/$msg_count"}, "DEL" ) : "" ),"<br>",$q->b($message));
+            } (@projectmessages) )
+          : "None"),
+        "</div>\n";
+
 
   if( not $logged_in ) 
   { 
@@ -528,20 +727,21 @@ sub main_display
   print $q->p("The rate of getting new descriptions to translate is not automatic. If you find you keep running low on things to translate, ask me to increase it.");
   print $q->p( $q->a({-href => 'http://www.debian.org/international/l10n/ddtp#rules'}, "Common translation rules") );
 
-#  print "<div class=messages>\n",
-#        $q->h3("$lang-Team-Messages (".scalar(@teammessages)."):", help("Messages from your language team"));
-#  @teammessages=reverse (@teammessages);
-#  $msg_count=scalar(@teammessages);
-#  @teammessages=(splice (@teammessages,0,5));
-#  print (scalar(@teammessages)
-#          ? $q->ul(map { 
-#              my ($userfrom,$timestamp,$message) = ($_ =~ /\((\w+)(?:,([0-9]+))?\):(.*)/); 
-#	      $msg_count--;
-#              $q->li( "(".$q->a( {href=>"$realself/messageto/$userfrom", onclick=>"return popup(this.href)"}, "$userfrom" )."): ".localtime($timestamp)." ",(($is_admin)
-#	      ? $q->a( {href=>"$realself/delteammessage/$msg_count"}, "DEL" ) : "" ),"<br>",$q->b($message));
-#            } (@teammessages) )
-#          : "None"),
-#        "</div>\n";
+  print "<div class=messages>\n",
+        $q->h3("$lang-Team-Messages (".scalar(@teammessages)."):", help("Messages from your language team"));
+  print $q->a( {href=>"$realself/messagetoteam/$lang", onclick=>"return popup(this.href)"}, "(Write a new team message)" ),'<br>' if ($is_admin);
+  @teammessages=reverse (@teammessages);
+  $msg_count=scalar(@teammessages);
+  @teammessages=(splice (@teammessages,0,5));
+  print (scalar(@teammessages)
+          ? $q->ul(map { 
+              my ($userfrom,$timestamp,$message) = ($_ =~ /\((\w+)(?:,([0-9]+))?\):(.*)/); 
+	      $msg_count--;
+              $q->li( "(".$q->a( {href=>"$realself/messageto/$userfrom", onclick=>"return popup(this.href)"}, "$userfrom" )."): ".localtime($timestamp)." ",(($is_admin)
+	      ? $q->a( {href=>"$realself/delteammessage/$msg_count"}, "DEL" ) : "" ),"<br>",$q->b($message));
+            } (@teammessages) )
+          : "None"),
+        "</div>\n";
 
   if( $requirelogin )
   {
@@ -589,6 +789,7 @@ sub main_display
   print	$q->li( "Account: ".$user);
   print	$q->li( "logged_in (" . $q->a({-href => "$realself/logout"}, "Logout") . ")") if ($logged_in);
   print	$q->li( "not logged in (" . $q->a({-href => "$realself/login"}, "Login") . ")") if (not $logged_in);
+  print	$q->li( $q->a({-href => "$realself/userlist/$lang"}, "Teamlist") ) if ($is_admin);
   print	$q->li( "Translations: $counttranslations");
   print	$q->li( "Reviews: $countreviews");
   print	"</ul>\n",
@@ -1423,8 +1624,14 @@ sub display_error
 {
   print $q->header('text/html'),
         $q->start_html( -title => "DDTSS", @html_headers ),
-        $q->h1(shift),
-        $q->a( {-href => $self}, "Goto main screen" ),
+        $q->h1(shift);
+  if( not $logged_in )
+  {
+       print $q->p($q->b("Please login... Only with a login, you can use all features! Go to " . 
+             $q->a({-href => "$realself/login"}, "Login")
+             ));
+  }
+  print $q->a( {-href => $self}, "Goto main screen" ),
         $q->end_html;
   exit;
 }
@@ -1665,7 +1872,8 @@ sub display_createlogin
     my $key = generate_random_string(16);
     $db->put( "users/$email", $alias );
     $db->put( "aliases/$alias", $email );
-    $db->put( "aliases/$alias/password", $password );
+    $db->put( "aliases/$alias/md5password", md5_hex($key.$password) );
+    #$db->put( "aliases/$alias/password", $password );
     $db->put( "aliases/$alias/timestamp", time() );
     $db->put( "aliases/$alias/lastlanguage", $lang );
     $db->put( "aliases/$alias/realname", $realname );
@@ -1734,9 +1942,9 @@ sub display_verifylogin
   
   # Now verified
   
-  $key = generate_random_string(12);
+  #$key = generate_random_string(12);
   $db->put( "aliases/$alias/active", 1 );
-  $db->put( "aliases/$alias/key", $key );
+  #$db->put( "aliases/$alias/key", $key );
   
   DDTSS_Close($db);
   
@@ -1744,9 +1952,103 @@ sub display_verifylogin
   return;
 }
 
+sub display_userlist
+{
+  my $langsel = shift;
+
+  if( not $logged_in )
+  {
+    display_error("You must logged in for this action!");
+    exit;
+  }
+  
+  if( not $is_admin )
+  {
+    display_error("You must be a admin for this action!");
+    exit;
+  }
+
+  my $db = DDTSS_Open_Write();
+
+  my $users = DDTSS_Get_Users($db);
+
+  my $count_ip=0;
+  my $count_ip_trans=0;
+  my $count_ip_review=0;
+  my $count_login=0;
+  my $count_login_trans=0;
+  my $count_login_review=0;
+  
+  DDTSS_Close($db);
+
+  my %userinfo;
+  my $oldusername="";
+
+  print $q->header('text/html'),
+        $q->start_html( -title => "DDTSS -- userlist", @html_headers ),
+        $q->h1("userlist for $langsel") ;
+
+  sub output_userinfo ()
+  {
+    if ($userinfo{'name'}) {
+      if (not $langsel or $userinfo{'lastlanguage'}  eq $langsel) {
+        print "<tr>". $q->td("$userinfo{'name'}");
+        foreach my $key ('email','counttranslations','countreviews','lastlanguage','realname','isadmin','active') {
+          print $q->td("$userinfo{$key} ");
+        }
+        my $time=localtime($userinfo{'timestamp'});
+        print $q->td($time);
+        print "</tr>";
+        if ($userinfo{'name'} =~ /\d{1,3}\.\d{1,3}.\d{1,3}.\d{1,3}/ ) {
+          $count_ip++;
+          $count_ip_trans+=$userinfo{'counttranslations'};
+          $count_ip_review+=$userinfo{'countreviews'};
+        } else {
+          $count_login++;
+          $count_login_trans+=$userinfo{'counttranslations'};
+          $count_login_review+=$userinfo{'countreviews'};
+        }
+      }
+    }
+  }
+
+  print $q->start_table(),$q->TR( $q->th("name"), $q->th("email"), $q->th("#trans"), $q->th("#reviews"), $q->th("lastlang"), $q->th("realname"), $q->th("isadmin"), $q->th("active"), $q->th("timestamp") );;
+  foreach my $item (@$users) {
+    if( $item->[0] =~ /aliases\/([^\/]+)$/ ) { 
+      if (not $1 eq $oldusername) {
+        #print "new user $1<br>";
+        output_userinfo();
+        %userinfo=undef;
+        $userinfo{'name'}=$1;
+      }
+      $oldusername=$1;
+      $userinfo{'email'}=$item->[1]
+    }
+    if( $item->[0] =~ /aliases\/([^\/]+)\/(.+)$/ ) { 
+      if (not $1 eq $oldusername) {
+        #print "new user $1<br>";
+        output_userinfo();
+        %userinfo=undef;
+        $userinfo{'name'}=$1;
+      }
+      $oldusername=$1;
+      $userinfo{$2}=$item->[1];
+    }
+    #print $item->[0].":".$item->[1]."<br>";
+  }
+  print $q->TR( $q->th("IP-User"), $q->th($count_ip), $q->th($count_ip_trans), $q->th($count_ip_review), $q->th(), $q->th(), $q->th(), $q->th(), $q->th() );;
+  print $q->TR( $q->th("login-User"), $q->th($count_login), $q->th($count_login_trans), $q->th($count_login_review), $q->th(), $q->th(), $q->th(), $q->th(), $q->th() );;
+  print $q->end_table();
+
+  print $q->a( {-href => $self}, "Goto main screen" ),
+        $q->end_html;
+  
+  return;
+}
+
 sub display_logout
 {
-  my $usercookie = $q->cookie( -name => 'id', -value => "$ENV{REMOTE_ADDR},$lang", -expires => '+3d', -path => $cookiepath );
+  my $usercookie = $q->cookie( -name => 'id', -value => "$ENV{REMOTE_ADDR},$lang", -expires => '+70d', -path => $cookiepath );
 
   print $q->header( -type =>'text/html', -charset => "UTF-8", -refresh => "5; url=$self", -expires => '+10s', 
                     -cookie => $usercookie ),
@@ -1777,16 +2079,19 @@ sub display_login
     
     my $db = DDTSS_Open_Write();
     
-    my $pwd;
-    if( $db->get( "aliases/$alias/password", $pwd ) or ($pwd ne $password) )
+    my $key;
+    my $md5pwd;
+    if( $db->get( "aliases/$alias/md5password", $md5pwd ) or $db->get( "aliases/$alias/key", $key ) )
+    { display_error( "Invalid username/password" ) }
+
+    # Use key as salt for md5 hash    
+    if( md5_hex($key.$password) ne $md5pwd )
     { display_error( "Invalid username/password" ) }
     
     my $active;
     if( $db->get( "aliases/$alias/active", $active) or not $active )
     { display_error( "Account not active yet" ) }
     
-    my $key;
-    $db->get( "aliases/$alias/key", $key );
     
     if( $user =~ /^(\d+\.\d+\.\d+\.\d+|local)$/ )
     {
@@ -1794,7 +2099,7 @@ sub display_login
     }
     $user = "$alias:$key";
     $lang ||= 'xx';
-    my $usercookie = $q->cookie( -name => 'id', -value => "$user,$lang", -expires => '+3d', -path => $cookiepath );
+    my $usercookie = $q->cookie( -name => 'id', -value => "$user,$lang", -expires => '+70d', -path => $cookiepath );
 
     DDTSS_Close($db);
     print $q->header( -type =>'text/html', -charset => "UTF-8", -refresh => "5; url=$self", -expires => '+10s', 
@@ -1832,7 +2137,7 @@ sub display_login
 sub validate_user
 {
   my $user = shift;
-  return 0 unless $user =~ /^(\w+):(\w{12})$/;
+  return 0 unless $user =~ /^(\w+):(\w{12,16})$/;
   my($alias,$key) = ($1,$2);
   
   my $db = DDTSS_Open_Read();
@@ -1849,6 +2154,23 @@ sub validate_user
   return 1;
 }
 
+sub admin_user
+{
+  my $user = shift;
+  return 0 unless $user =~ /^(\w+):(\w{12,16})$/;
+  my($alias,$key) = ($1,$2);
+  
+  my $db = DDTSS_Open_Read();
+  
+  my $isadmin=0;
+  my $res = $db->get("aliases/$alias/isadmin", $isadmin);
+  DDTSS_Close($db);
+  
+  return 0 if $res;
+  return 1 if $isadmin;
+  return 0;
+}
+
 sub generate_random_string
 {
   my $length_of_randomstring=shift;# the length of 

-- 
DDTP - Debian Descriptions Translation Project



More information about the Debian-l10n-commits mailing list