#!/usr/bin/perl use strict; use IO::File; use Apache2::RequestUtil (); use Email::Valid; use PlantOntologyPage; use CGI; use CGI qw(:standard *table *TR *th *td *ul *ol); use Captcha::reCAPTCHA; use constant SITE_ADJECTIVE => ($ENV{'DevelopmentSite'} ? 'Development' : 'Live'); use constant EMAIL_FROM => 'po-workshop@'; #use constant EMAIL_SUBJECT => 'Feedback Submission from Plant Ontology ' # . SITE_ADJECTIVE .' Site'; use constant EMAIL_SUBJECT => 'Feedback on POC'; use constant SENDMAIL => -e '/bin/sendmail' && '/bin/sendmail' || '/usr/sbin/sendmail'; use constant SENDMAIL_FLAGS => ' -t -oi'; # Location of public and private keys for reCAPTCHA my $pubpath = "/data/www/captcha/public.key"; my $privpath = "/data/www/captcha/private.key"; open INP,"<$pubpath" or die "Unable to open $pubpath"; my $pubkey = ; chomp $pubkey; close INP; open INP,"<$privpath" or die "Unable to open $privpath"; my $privkey = ; chomp $privkey; close INP; $| = 1; my @EMAIL_RECIPIENTS = ( "po-workshop ", #"Shuly Avraham ", #"Justin Elser " ); my $page_title = "Workshop Application"; my $q = CGI->new(); my $page = PlantOntologyPage->new(Apache2::RequestUtil->request); #my $c = Captcha::reCAPTCHA->new; my $c = Captcha::reCAPTCHA->new(); my $error = undef; my $captcha_html = $c->get_html( $pubkey, $error ); print $q->header(); print $q->start_html( -title=>$page_title, -style=>{'src'=>$page->stylesheet} ); print $page->start_body(); #print "inc = @INC"; ######################################################################## my $refer_to = $q->param("refer_to") || $q->param("refer_to_url"); #my $refer_to = $q->param("refer_to_url") || "/index.html"; unless( $q->param("comments") ) { print $q->start_form(); print $q->start_table( {-border=>'0', -cellspacing=>'10', -cellpadding=>'5', -width=>'90%', -align=>'CENTER'} ); print $q->Tr( {-align=>'CENTER', -nowrap=>'nowrap'}, $q->td( {-align=>'CENTER', -valign=>'CENTER', -colspan=>'2'}, "

Plant Ontology & Gramene database sponsored workshop

" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchtitle'}, $q->td( {-align=>'CENTER', -valign=>'CENTER'}," "), $q->td( {-align=>'LEFT', -valign=>'LEFT', -colspan=>'2'}, "
Note: Please provide a ", "valid", " email address so that we may respond. Thanks!" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchtitle'}, $q->td( {-align=>'CENTER', -valign=>'CENTER'}," "), $q->td( {-align=>'LEFT', -valign=>'LEFT', -colspan=>'2'}, "", "** ", " required field

" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "PI Name:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'pi_name', -size=>60, -maxlength=>300 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "PI Email:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'pi_email', -size=>60, -maxlength=>300 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Your Name:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'your_name', -size=>60, -maxlength=>300 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Your Email:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'your_email', -size=>60, -maxlength=>300 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Confirm Your Email:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'confirm_email', -size=>60, -maxlength=>300 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Gender:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->radio_group( -name => 'sex', -values => ['Male', 'Female'] ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Belong to a minority/underrepresented group?:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->radio_group( -name=>'minority', -values => ['Yes', 'No'], -default => 'No' ), "**" ) ); my @type_value = ('University', 'For Profit', 'NOT For Profit', 'College', 'Other'); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Institution Type:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->popup_menu( -name=>'type', -values => \@type_value, -default => 'University' ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Institution Name:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'inst_name', -size=>60, -maxlength=>300 ), "**" ) ); my @cat_values = ('Minority', 'Underrepresented', 'N/A'); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Institution Status:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->popup_menu( -name=>'category', -values => \@cat_values, -default => 'Minority' ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Institution address (line 1):", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'inst_address_1', -size=>60, -maxlength=>300 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Institution address (line 2):", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'inst_address_2', -size=>60, -maxlength=>300 ), ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Institution city:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'inst_city', -size=>60, -maxlength=>300 ), "**" ) ); my @state_values = ('Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming' ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "State:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->popup_menu( -name=>'inst_state', -values => \@state_values, -default => 'Alabama' ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Zip Code:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'inst_zip', -size=>10, -maxlength=>10 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Phone number:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'phone', -size=>12, -maxlength=>12 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Fax number:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'fax', -size=>12, -maxlength=>12 ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Attending ASPB?:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->radio_group( -name => 'attend', -values => ['Yes', 'No'] ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Registered for ASPB?:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->radio_group( -name => 'register', -values => ['Yes', 'No'] ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Member of ASPB?:", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->radio_group( -name => 'member', -values => ['Yes', 'No'] ), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Membership number: Lookup your ID", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textfield( -name=>'member_id', -size=>12, -maxlength=>12 ) ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "Abstract (limit 5000 characters):
This is not your meeting abstract,
explain how this workshop will
enhance your research.", "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $q->textarea( -name=>'comments', -rows=>10, -columns=>60, -maxlength=>5000), "**" ) ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, ); # Generate the form print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'RIGHT', -valign=>'CENTER'}, "   " ), $q->td( {-align=>'LEFT', -valign=>'CENTER'}, $captcha_html) ); #print ""; #print $c->get_html( $pubkey, $error ); print $q->Tr( {-align=>'CENTER', -valign=>'CENTER', -nowrap=>'nowrap'}, # -class=>'searchbody'}, $q->td( {-align=>'CENTER', -colspan=>'2'}, $q->submit( -name=>'submit', -value=>'Submit' ), "   ", $q->reset(-name=>'Clear') ), ); print $q->end_table(); print $q->end_form(); } # End unless( $q->param("comments") ) if(param("your_email") ne param("confirm_email")) { print("Email did not match. Please go back and reenter your email address"); } ################################## if( $q->param("comments") ) { my %nice_hash; $nice_hash{pi_name} = "PI name"; $nice_hash{pi_email} = "PI Email address"; $nice_hash{your_name} = "Your name"; $nice_hash{your_email} = "Your Email address"; $nice_hash{confirm_your_email} = "Email verification"; $nice_hash{sex} = "Gender"; $nice_hash{minority} = "Member of a minority/underrepresented group"; $nice_hash{type} = "Institution type"; $nice_hash{inst_name} = "Institution name"; $nice_hash{category} = "Institution status"; $nice_hash{inst_address_1} = "Institution address"; $nice_hash{inst_address_2} = "Institution address"; $nice_hash{inst_city} = "Institution city"; $nice_hash{inst_state} = "Institution state"; $nice_hash{inst_country} = "Institution country"; $nice_hash{inst_zip} = "Zip code"; $nice_hash{phone} = "Phone number"; $nice_hash{fax} = "Fax number"; $nice_hash{attend} = "Attending ASPB?"; $nice_hash{register} = "Registered for ASPB?"; $nice_hash{comments} = "Abstract"; $nice_hash{member} = "ASPB Member?"; $nice_hash{member_id} = "ASPB member ID"; # my $name = $q->param("name"); my @param_names = $q->param; # get rid of params that are not needed @param_names = grep { $_ ne 'recaptcha_response_field' } @param_names; @param_names = grep { $_ ne 'recaptcha_challenge_field' } @param_names; @param_names = grep { $_ ne 'submit'} @param_names; @param_names = grep { $_ ne 'confirm_email'} @param_names; my $message = " *** Plantontology & Gramene database workshop ".SITE_ADJECTIVE." Site ***\n\n"; foreach my $pn ( @param_names ) { my $nice_name = $nice_hash{$pn}; $message = $message.$nice_name.": ".$q->param( $pn )."\n"; } my $is_complete = 1; my $missing_field; foreach my $field (@param_names) { next if $field eq 'inst_address_2'; next if ($field eq 'member_id' && param("member") eq 'No'); my $value = param($field); if($value eq "") { $missing_field = $field; $is_complete = 0; } } my $abstract = param("comments"); my $abstract_len = length($abstract); # my $subject = $q->param('subject'); my $subject = "ASPB Workshop application"; die "sendmail binary not present" unless -e SENDMAIL; die "sendmail binary not executable" unless -x _; my $user_email = $q->param("your_email"); my $pi_email = $q->param("pi_email"); my $is_valid = Email::Valid->address( -address => $user_email, -mxcheck => 1 ) ? 'yes' : 'no'; if( $is_valid eq "yes" && $is_complete && ($abstract_len <= 5000)) { #if( $is_valid eq "yes" && $is_complete) { if ( $q->param( 'recaptcha_response_field' ) ) { my $result = $c->check_answer( $privkey, $ENV{'REMOTE_ADDR'}, $q->param( 'recaptcha_challenge_field' ), $q->param( 'recaptcha_response_field' ) ); if ( $result->{is_valid} ) { for my $address ( @EMAIL_RECIPIENTS ) { my $fh = IO::File->new( '|'.SENDMAIL.SENDMAIL_FLAGS ) or die "Can't open pipe to sendmail (".SENDMAIL."): $!"; #print $fh 'Subject: ', EMAIL_SUBJECT, "\n"; print $fh 'Subject: ', $subject, "\n"; print $fh "To: $user_email\n"; print $fh "Cc: $address\n"; print $fh "Cc: $pi_email\n"; print $fh "From: $address\n"; print $fh "Content-type: text/plain\n\n"; print $fh $message; $fh->close or die "Can't close sendmail pipe: $!"; } my $filename = $user_email; $filename =~ s/\@/_/g; my $filepath = "/data/scratch/po_workshop_apps/$filename"; open(out_file, ">$filepath"); print out_file "$message"; close out_file; print ( "

Thanks for applying for the workshop!

Your application has been sent to the Plant Ontology team for review.

" ); foreach my $pn ( @param_names ) { my $nice_name = $nice_hash{$pn}; my $value = param($pn); print( "$nice_name = $value
"); } } else { $error = $result->{error}; print ( "

Captcha did not match, Please go back and try again.

No message sent.

" ); } } }elsif (!$is_complete) { print( "The required field \"$nice_hash{$missing_field}\" is empty. Please go back and fill all required fields"); }elsif ($abstract_len > 5000) { print( "Your abstract is too long. Please shorten your abstract"); }else { print ( "

Invalid email address.

No message sent.

" ); } } print $page->end_body;