diff --git a/cgi/procdonate.cgi b/cgi/procdonate.cgi index eeff19b..578b529 100755 --- a/cgi/procdonate.cgi +++ b/cgi/procdonate.cgi @@ -1,1039 +1,1022 @@ #!/usr/bin/perl -T # procdonate.cgi - Donation payment processor for gnupg.org # Copyright (C) 2014 g10 Code GmbH # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY, to the extent permitted by law; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. use strict; #use CGI qw/:standard -debug/; use CGI; use Cwd qw(realpath); use IO::Socket::UNIX; realpath($0) =~ /^(.*)\/.*$/; my %config = do $1 . '/config.rc'; my $baseurl = $config{baseurl}; my $htdocs = $config{htdocs}; my $stripepubkey = $config{stripepubkey}; my $socket_name = $config{payprocd_socket}; my $error_marker = '* error'; # The form variables are accessed via Q. my $q = new CGI; # This is a multi-purpose CGI. The mode decides what to do. my $mode = $q->param("mode"); my $sessid = $q->param("sessid"); my $lang = $q->param("lang"); # Variables used in the template pages. my $amount = ""; my $paytype = ""; my $stripeamount = ""; my $euroamount = ""; my $currency = ""; my $recur = ""; my $name = ""; my $mail = ""; my $message = ""; my $separef = ""; my $errorstr = ""; # We use a dictionary to track error. Those errors will then be # inserted into the output by write_template. my %errdict = (); # Prototypes sub fail ($); sub get_paypal_approval (); sub complete_sepa (); # Write a template file. A template is a proper HTML file with # variables enclosed in HTML comments. To allow inserting data into # a value attribute of an input field, such a tag needs to be written as # # the result after processing will be # # assuming that the value of FOO is foo. Note that this substitution # rules work for all tags and thus you better take care to add an # extra space if you do not want this to happen. sub write_template ($) { my $fname = shift; my $tname; my $errorpanel = $errorstr; my $err_amount = ''; my $err_name = ''; my $err_mail = ''; my $err_paytype = ''; my $check_checked = ' checked="checked"'; my $sel_eur = ''; my $sel_usd = ''; my $sel_gbp = ''; my $sel_jpy = ''; my $chk_amt500 = ''; my $chk_amt200 = ''; my $chk_amt100 = ''; my $chk_amt50 = ''; my $chk_amt20 = ''; my $chk_amt10 = ''; my $chk_amt5 = ''; my $chk_amtx = ''; my $amt_other = ''; my $recur_none = ''; my $recur_month = ''; my $recur_quarter = ''; my $recur_year = ''; my $recur_text = ''; my $message_fmt; my $publishname; my $check_paytype = 'none'; my $stripe_data_email = ''; my $stripe_data_label_value; my $xamount; my $stripelocale; # Avoid broken HTML attributes. $amount =~ s/\x22/\x27/g; $stripeamount =~ s/\x22/\x27/g; $currency =~ s/\x22/\x27/g; $recur =~ s/\x22/\x27/g; $name =~ s/\x22/\x27/g; $mail =~ s/\x22/\x27/g; $message =~ s/\x22/\x27/g; $separef =~ s/\x22/\x27/g; $lang =~ s/\x22/\x27/g; # Clean possible user provided data $sessid =~ s//g; # Check the currency and predefined amount. if ( $currency =~ /EUR/i ) { $sel_eur = ' selected="selected"'; - $xamount = int $amount; - if ( $xamount == 5 ) { - $chk_amt5 = $check_checked; - } elsif ( $xamount == 10 ) { - $chk_amt10 = $check_checked; - } elsif ( $xamount = 20 ) { - $chk_amt20 = $check_checked; - } elsif ( $xamount == 50 ) { - $chk_amt50 = $check_checked; - } elsif ( $xamount == 100 ) { - $chk_amt100 = $check_checked; - } elsif ( $xamount == 200 ) { - $chk_amt200 = $check_checked; - } elsif ( $xamount == 500 ) { - $chk_amt500 = $check_checked; - } else { - $chk_amtx = $check_checked; - $amt_other = $amount; - } + $chk_amtx = $check_checked; + $amt_other = $amount; } elsif ( $currency =~ /USD/i ) { $sel_usd = ' selected="selected"'; $chk_amtx = $check_checked; $amt_other = $amount; } elsif ( $currency =~ /GBP/i ) { $sel_gbp = ' selected="selected"'; $chk_amtx = $check_checked; $amt_other = $amount; } elsif ( $currency =~ /JPY/i ) { $sel_jpy = ' selected="selected"'; $chk_amtx = $check_checked; $amt_other = $amount; } else { $chk_amtx = $check_checked; $amt_other = $amount; } # For non-recurring Stripe donations we do not want to send a # data-email="$mail" # line to Stripe so to enable the user to use a a different mail # address for use with them. This is implemented using a # STRIPE_DATA_EMAIL template variable. $stripe_data_email = 'data-email="' . $mail . '"'; if ( $recur =~ /0/ ) { $stripe_data_email = ''; $recur_none = ' selected="selected"'; $recur_text = ''; if ($lang eq 'de') { $stripe_data_label_value = 'Einmalig spenden'; } elsif ($lang eq 'ja') { $stripe_data_label_value = '一回の寄付する'; } else { $stripe_data_label_value = 'Make one-time donation'; } } elsif ( $recur =~ /12/ ) { $recur_month = ' selected="selected"'; if ($lang eq 'de') { $recur_text = 'monatlich'; $stripe_data_label_value = 'Monatlich spenden'; } elsif ($lang eq 'ja') { $recur_text = '毎月'; $stripe_data_label_value = '毎月寄付する'; } else { $recur_text = 'monthly'; $stripe_data_label_value = 'Donate monthly'; } } elsif ( $recur =~ /4/ ) { $recur_quarter = ' selected="selected"'; if ($lang eq 'de') { $recur_text = 'vierteljährlich'; $stripe_data_label_value = 'Vierteljährlich spenden'; } elsif ($lang eq 'ja') { $recur_text = '3ヶ月毎'; $stripe_data_label_value = '3ヶ月毎に寄付する'; } else { $recur_text = 'quarterly'; $stripe_data_label_value = 'Donate quarterly'; } } elsif ( $recur =~ /1/ ) { $recur_year = ' selected="selected"'; if ($lang eq 'de') { $recur_text = 'jährlich'; $stripe_data_label_value = 'Jährlich spenden'; } elsif ($lang eq 'ja') { $recur_text = '毎年'; $stripe_data_label_value = '毎年寄付する'; } else { $recur_text = 'yearly'; $stripe_data_label_value = 'Donate yearly'; } } else { # invalid $stripe_data_label_value = ''; } if ( $paytype eq "cc" ) { $check_paytype = "CC"; } elsif ( $paytype eq "pp" ) { $check_paytype = "PP"; } elsif ( $paytype eq "se" ) { $check_paytype = "SE"; } elsif ( $paytype eq "bc" ) { $check_paytype = "BC"; } # Set var for the paypal button if ( $name eq 'Anonymous' or $name eq '') { $publishname = 'No'; } else { $publishname = 'Yes'; } # Set a specific locale. if ($lang eq 'de') { $stripelocale = "de"; } elsif ($lang eq 'ja') { $stripelocale = "ja"; } elsif ($lang eq 'en') { $stripelocale = "en"; } else { $stripelocale = "auto"; } # Build error strings. foreach (keys %errdict) { my $fieldname; if ($lang eq 'de') { $fieldname = "Feld $_: "; } elsif ($lang eq 'ja') { $fieldname = "欄 $_: "; } else { $fieldname = "Field $_: "; } if (/amount/) { $err_amount = $error_marker; } elsif (/name/) { $err_name = $error_marker; } elsif (/mail/) { $err_mail = $error_marker; } elsif (/paytype/){ $err_paytype = $error_marker; } $errorpanel = $errorpanel . $fieldname . $errdict{$_} . "
\n" } if ( $errorpanel ne '' ) { $errorpanel = "

\n" . $errorpanel . "

\n"; } open TEMPLATE, $tname; while (