#!/usr/bin/perl -w use CGI::Carp qw(fatalsToBrowser); use strict; use lib "/var/www/vhosts/athanor.es/private/athanor"; use lib "/var/www/vhosts/athanor.es/private/lib"; use constant DFLT_RETURN => "http://athanor.es/suscripciones/cgi-bin/allforms.cgi"; use constant DFLT_CUST_PHONE => "00 34 933 425302"; use constant DFLT_CUST_FAXNO => "00 34 933 025097"; use constant EXECNM => "allforms"; use constant LOGDIR => "/var/www/vhosts/athanor.es/private/athanor/DATA"; use AppConfig; # to load form-specific configuration files use Template; # to assemble form-specific page components use CGI; # to handle HTTP-transmitted parameters, etc use Mail::Mailer; # to send email use Fcntl qw(:DEFAULT :flock); # to handle locks use AthanorError; # to handle errors sub datetime() { my $DELTA = 1; my @tm = gmtime(time + 3600 * $DELTA); my $sec = $tm[0]; my $min = $tm[1]; my $hour = $tm[2]; my $day = $tm[3]; my $month = 1 + $tm[4]; my $year = 1900 + $tm[5]; return (sprintf("%4d%02d%02d%02d%02d%02d",$year,$month,$day,$hour,$min,$sec)); } sub write_log($$$) { my ($user, $form, $msg) = @_; # substitute any '|' characters in the incoming message $msg =~ s/\|/:-:/g; my $DELTA = 1; my @tm = gmtime(time + 3600 * $DELTA); my $logpath = sprintf("%s/%s_%02d%02d.log", LOGDIR, EXECNM, $tm[5]-100, $tm[4]+1); open(LOG, ">>", $logpath) or die "No puedo escribir LOGFILE '$logpath': $!"; flock(LOG, LOCK_EX) or die "No puedo obtener acceso exclusivo a LOGFILE '$logpath': $!"; print LOG sprintf("%s|%s|%s|%s\n", datetime(), $user, $form, $msg); close LOG; } sub namelist($) { my $cgi = shift; return $cgi->param; } sub datalist($) { my $cgi = shift; my @data; my @name = namelist($cgi); foreach my $n (@name) { my @values = $cgi->param($n); my $val_list=join(':', @values); $val_list =~ tr/\015\012//d; push @data, ($val_list); } return @data; } sub meta_data($) { my $cgi = shift; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time); $year += 1900; my $datetime = sprintf("%04d-%02d-%02d, %02d:%02d:%02d", $year,$mon,$mday,$hour,$min,$sec); return ($datetime, $cgi->cookie('referer')); } sub save_data($$$$) { my ($cgi, $form, $config, $template) = @_; my @name = namelist($cgi); my @meta_names = ('fecha', 'origen'); push(@name, @meta_names); my @data = datalist($cgi); my @meta_data = meta_data($cgi); push(@data, @meta_data); # set file and mode my $file = "/var/www/vhosts/athanor.es/private/athanor" . "/DATA/" . $form . ".csv"; my $first_time = ( ! -e $file ); # open open(SLH, ">>", $file) or die "No puedo abrir fichero '$file': $!"; # set autoflush on handle my $slh = select(SLH); $| = 1; select ($slh); # lock exclusive flock(SLH, LOCK_EX) or die "No puedo bloquear cambios en el fichero '$file': $!"; # if first_time print data headers as CSV printf SLH ("\"%s\"\n", join('","', @name)) if ($first_time); # print data as CSV printf SLH ("\"%s\"\n", join('","', @data)); # close advert file, releasing lock close SLH or die "No puedo cerrar fichero '$file': $!"; } sub display_form($$$$) { my ($cgi, $form, $config, $template) = @_; my $file = "form_" . $form . ".htmlf"; # referer handling my $referer = (defined($ENV{'HTTP_REFERER'}))?$ENV{'HTTP_REFERER'}:DFLT_RETURN; my $cookie = $cgi->cookie( -name => 'referer', -value => $referer ); # passing variables my $vars = { # para todos los formularios 'CUST_PHONE' => $config->get('CUST_PHONE'), 'CUST_FAXNO' => $config->get('CUST_FAXNO'), # formulario 'subscr' 'CUENTA_TRIODOS' => $config->get('CUENTA_TRIODOS'), 'CUENTA_BBVA' => $config->get('CUENTA_BBVA'), 'SUBSCR_HEAD' => $config->get('SUBSCR_HEAD'), 'SUBSCR_CODE' => $config->get('SUBSCR_CODE'), 'SUBSCR_TEXT' => $config->get('SUBSCR_TEXT'), 'SUBSCR_COND' => $config->get('SUBSCR_COND'), 'SUBSCR_Z0' => $config->get('SUBSCR_Z0'), 'SUBSCR_Z1S' => $config->get('SUBSCR_Z1S'), 'SUBSCR_Z1A' => $config->get('SUBSCR_Z1A'), 'SUBSCR_Z2S' => $config->get('SUBSCR_Z2S'), 'SUBSCR_Z2A' => $config->get('SUBSCR_Z2A'), 'BANNER_FLAG' => $config->get('BANNER_FLAG'), 'BANNER_COLR' => $config->get('BANNER_COLR'), 'BANNER_IMGE' => $config->get('BANNER_IMGE'), 'BANNER_TEXT' => $config->get('BANNER_TEXT'), 'BANNER_LINK' => $config->get('BANNER_LINK'), # parametros para otros formularios # formulario prueba 'TEST_TITLE' => $config->get('TEST_TITLE'), 'TEST_CONTENT' => $config->get('TEST_CONTENT'), }; $| = 1; print $cgi->header ( -cookie => $cookie ); $template->process($file, $vars) || die "Error: '$template->error()'"; print $cgi->end_html; } sub send_ourselves($$$$) { my ($cgi, $form, $config, $template) = @_; my $destin = $config->get('DESTIN_ADDR'); my $sender = $config->get('SENDER_ADDR'); my $title = sprintf("%s (%s)",$config->get('MAIL_TITLE_OUR'), $form); my $msg = new Mail::Mailer("sendmail"); my @meta_name = ('datetime', 'referer_url'); my @meta_data = meta_data($cgi); # prepare message $msg->open( { To => $destin, From => $sender, Subject => $title, } ); # form data here foreach my $name ($cgi->param) { printf $msg "%s: ",$name; my $sep = ''; foreach my $val ($cgi->param($name)) { printf $msg ("%s'%s'", $sep, $val); $sep = ','; } printf $msg "\n"; } # meta data here for ( my $i = 0; $i <= $#meta_data; $i++ ) { printf $msg ("(%s): '%s'\n", $meta_name[$i], $meta_data[$i]); } # send message close $msg; } sub send_visitor($$$$) { my ($cgi, $form, $config, $template) = @_; my $addr = $cgi->param('email'); my $file = sprintf("mail_%s.txt", $form); my $sender = $config->get('SENDER_ADDR'); my $title = $config->get('MAIL_TITLE_VIS'); my $vars = { form => $form, 'SENDER_NAME' => $config->get('SENDER_NAME'), }; # prepare message my $msg = new Mail::Mailer("sendmail"); $msg->open( { To => $addr, From => $sender, Subject => $title, } ); my $mtext = ""; $template->process($file, $vars, \$mtext) or die "$template->error()"; print $msg $mtext; # send message close $msg; } sub print_thanks($$$$){ my ($cgi,$form,$config,$template) = @_; my $file = "thanks_common.htmlf"; my $vars = { form => $form, 'THANKS_TITLE' => $config->get('THANKS_TITLE'), 'THANKS_TEXT' => $config->get('THANKS_TEXT'), }; $| = 1; print $cgi->header; $template->process($file, $vars) || die "Error: '$template->error()'"; print $cgi->end_html; } ## MAIN ## $::DEBUG = 0; $ENV{PATH} = "/bin:/usr/bin"; delete @ENV{ qw ( IFS CDPATH ENV BASH_ENV ) }; # determine form parameter my $cgi = CGI->new(); my $form = $cgi->param('form'); $form = 'allfrm' if (!defined($form)); # retrieve form configuration use AppConfig qw/:argcount :expand/; my $config = AppConfig->new( { CASE => 1, CREATE => 1, GLOBAL => { DEFAULT => "", ARGCOUNT => ARGCOUNT_ONE, EXPAND => EXPAND_ALL, }, } ); # parameters that may be configured, and their default values $config->define ( "DESTIN_ADDR", { DEFAULT => "josepagustin\@athanor.es" } ); $config->define ( "SENDER_ADDR", { DEFAULT => "josepagustin\@athanor.es" } ); $config->define ( "SENDER_NAME", { DEFAULT => "Josep Agustin" } ); $config->define ( "CUST_PHONE", { DEFAULT => DFLT_CUST_PHONE } ); $config->define ( "CUST_FAXNO", { DEFAULT => DFLT_CUST_FAXNO } ); $config->define ( "MAIL_TITLE_OUR", { DEFAULT => "Datos Recibidos" } ); $config->define ( "MAIL_TITLE_VIS", { DEFAULT => "Gracias por sus datos" } ); # read section configuration my $cfg_file = "/var/www/vhosts/athanor.es/private/athanor/" . $form . ".cfg"; $config->file($cfg_file) if ( -s $cfg_file ); # prepare template processing my $include_path = "."; $include_path .= ":/var/www/vhosts/athanor.es/private/athanor/INCL"; $include_path .= ":/var/www/vhosts/athanor.es/private/athanor/TMPL"; my $template = Template->new ( { START_TAG => quotemeta('<+'), END_TAG => quotemeta('+>'), INCLUDE_PATH => $include_path, } ); # decide processing path if (!defined $cgi->param('submit')) { # first display, just assemble the form if ($::DEBUG) { write_log('visitor',$form,"display form"); } display_form($cgi, $form, $config, $template); } else { # process form data if ($::DEBUG) { write_log('visitor',$form,"process form data"); } # step 1: save data as csv save_data($cgi, $form, $config, $template); # step 2: send email send_ourselves($cgi, $form, $config, $template); send_visitor($cgi, $form, $config, $template); # step 3: print thanks page print_thanks($cgi, $form, $config, $template); }