[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