X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=fs_signup%2FFS-SignupClient%2Fcgi%2Fsignup.cgi;h=aae3fb84a5b88f5b96dc92cf6cc7fd5de040b8c3;hp=d44782f9c6a6dbc6cef57fd294a5f05d296638c2;hb=55a68e4aabe10db4d9c3ab1bb8befd2f9f4b9008;hpb=8fc4118f1f055195d280b3250b39a3b5fcdf13dc diff --git a/fs_signup/FS-SignupClient/cgi/signup.cgi b/fs_signup/FS-SignupClient/cgi/signup.cgi index d44782f9c..aae3fb84a 100755 --- a/fs_signup/FS-SignupClient/cgi/signup.cgi +++ b/fs_signup/FS-SignupClient/cgi/signup.cgi @@ -1,24 +1,42 @@ +#!/usr/bin/perl -T #!/usr/bin/perl -Tw # -# $Id: signup.cgi,v 1.16 2002-04-06 20:37:38 ivan Exp $ +# $Id: signup.cgi,v 1.55 2005-01-29 12:34:11 ivan Exp $ use strict; -use vars qw( @payby $cgi $locales $packages $pops $error - $last $first $ss $company $address1 $address2 $city $state $county - $country $zip $daytime $night $fax $invoicing_list $payby $payinfo - $paydate $payname $referral_custnum - $pkgpart $username $password $password2 $popnum - $ieak_file $ieak_template $cck_file $cck_template - $signup_html $signup_template $success_html $success_template +use vars qw( @payby $cgi $locales $packages + $pops %pop %popnum2pop + $init_data $error + + $last $first $ss $company $address1 + $address2 $city $state $county + $country $zip $daytime $night $fax + + $ship_last $ship_first $ship_ss $ship_company $ship_address1 + $ship_address2 $ship_city $ship_state $ship_county + $ship_country $ship_zip $ship_daytime $ship_night $ship_fax + + $invoicing_list $payby $payinfo + $paycvv $paydate $payname $referral_custnum $init_popstate + $pkgpart $username $password $password2 $sec_phrase $popnum + $agentnum $refnum + $ieak_file $ieak_template + $signup_html $signup_template + $success_html $success_template + $decline_html $decline_template $ac $exch $loc + $email_name $pkg $self_url ); -use subs qw( print_form print_okay expselect signup_default success_default ); +use subs qw( print_form print_okay print_decline + success_default decline_default + ); use CGI; -use CGI::Carp qw(fatalsToBrowser); -use HTTP::Headers::UserAgent 2.00; -use FS::SignupClient 0.02 qw( signup_info new_customer ); +#use CGI::Carp qw(fatalsToBrowser); use Text::Template; +use Business::CreditCard; +use HTTP::BrowserDetect; +use FS::SelfService qw( signup_info new_customer expselect ); #acceptable payment methods # @@ -28,32 +46,31 @@ use Text::Template; @payby = qw( CARD PREPAY ); $ieak_file = '/usr/local/freeside/ieak.template'; -$cck_file = '/usr/local/freeside/cck.template'; -$signup_html = '/usr/local/freeside/signup.html'; -$success_html = '/usr/local/freeside/success.html'; +$signup_html = -e 'signup.html' + ? 'signup.html' + : '/usr/local/freeside/signup.html'; +$success_html = -e 'success.html' + ? 'success.html' + : '/usr/local/freeside/success.html'; +$decline_html = -e 'decline.html' + ? 'decline.html' + : '/usr/local/freeside/decline.html'; + if ( -e $ieak_file ) { my $ieak_txt = Text::Template::_load_text($ieak_file) or die $Text::Template::ERROR; $ieak_txt =~ /^(.*)$/s; #untaint the template source - it's trusted $ieak_txt = $1; + $ieak_txt =~ s/\r//g; # don't double \r on old templates + $ieak_txt =~ s/\n/\r\n/g; $ieak_template = new Text::Template ( TYPE => 'STRING', SOURCE => $ieak_txt ) or die $Text::Template::ERROR; } else { $ieak_template = ''; } -if ( -e $cck_file ) { - my $cck_txt = Text::Template::_load_text($cck_file) - or die $Text::Template::ERROR; - $cck_txt =~ /^(.*)$/s; #untaint the template source - it's trusted - $cck_txt = $1; - $cck_template = new Text::Template ( TYPE => 'STRING', SOURCE => $cck_txt ) - or die $Text::Template::ERROR; -} else { - $cck_template = ''; -} - +$agentnum = ''; if ( -e $signup_html ) { my $signup_txt = Text::Template::_load_text($signup_html) or die $Text::Template::ERROR; @@ -64,12 +81,19 @@ if ( -e $signup_html ) { DELIMITERS => [ '<%=', '%>' ] ) or die $Text::Template::ERROR; + if ( $signup_txt =~ + /<\s*INPUT TYPE="?hidden"?\s+NAME="?agentnum"?\s+VALUE="?(\d+)"?\s*>/si + ) { + $agentnum = $1; + } } else { - $signup_template = new Text::Template ( TYPE => 'STRING', - SOURCE => &signup_default, - DELIMITERS => [ '<%=', '%>' ] - ) - or die $Text::Template::ERROR; + #too much maintenance hassle to keep in this file + die "can't find ./signup.html or /usr/local/freeside/signup.html"; + #$signup_template = new Text::Template ( TYPE => 'STRING', + # SOURCE => &signup_default, + # DELIMITERS => [ '<%=', '%>' ] + # ) + # or die $Text::Template::ERROR; } if ( -e $success_html ) { @@ -90,24 +114,92 @@ if ( -e $success_html ) { or die $Text::Template::ERROR; } -( $locales, $packages, $pops ) = signup_info(); +if ( -e $decline_html ) { + my $decline_txt = Text::Template::_load_text($decline_html) + or die $Text::Template::ERROR; + $decline_txt =~ /^(.*)$/s; #untaint the template source - it's trusted + $decline_txt = $1; + $decline_template = new Text::Template ( TYPE => 'STRING', + SOURCE => $decline_txt, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} else { + $decline_template = new Text::Template ( TYPE => 'STRING', + SOURCE => &decline_default, + DELIMITERS => [ '<%=', '%>' ], + ) + or die $Text::Template::ERROR; +} $cgi = new CGI; +$init_data = signup_info( 'agentnum' => $agentnum, + 'promo_code' => scalar($cgi->param('promo_code')), + 'reg_code' => uc(scalar($cgi->param('reg_code'))), + ); +$error = $init_data->{'error'}; +$locales = $init_data->{'cust_main_county'}; +$packages = $init_data->{'part_pkg'}; +$pops = $init_data->{'svc_acct_pop'}; +@payby = @{$init_data->{'payby'}} if @{$init_data->{'payby'}}; +$packages = $init_data->{agentnum2part_pkg}{$agentnum} if $agentnum; +%pop = (); +%popnum2pop = (); +foreach (@$pops) { + push @{ $pop{ $_->{state} }->{ $_->{ac} } }, $_; + $popnum2pop{$_->{popnum}} = $_; +} + if ( defined $cgi->param('magic') ) { if ( $cgi->param('magic') eq 'process' ) { - $cgi->param('state') =~ /^(\w*)( \(([\w ]+)\))? ?\/ ?(\w+)$/ - or die "Oops, illegal \"state\" param: ". $cgi->param('state'); - $state = $1; - $county = $3 || ''; - $country = $4; + if ( $cgi->param('state') =~ /^(\w*)( \(([\w ]+)\))? ?\/ ?(\w+)$/ ) { + $state = $1; + $county = $3 || ''; + $country = $4; + } elsif ( $cgi->param('state') =~ /^(\w*)$/ ) { + $state = $1; + $cgi->param('county') =~ /^([\w ]*)$/ + or die "illegal county: ". $cgi->param('county'); + $county = $1; + $cgi->param('country') =~ /^(\w+)$/ + or die "illegal country: ". $cgi->param('country'); + $country = $1; + } else { + die "illegal state: ". $cgi->param('state'); + } + if ( $cgi->param('ship_state') =~ /^(\w*)( \(([\w ]+)\))? ?\/ ?(\w+)$/ ) { + $ship_state = $1; + $ship_county = $3 || ''; + $ship_country = $4; + } elsif ( $cgi->param('ship_state') =~ /^(\w*)$/ ) { + $ship_state = $1; + $cgi->param('ship_county') =~ /^([\w ]*)$/ + or die "illegal county: ". $cgi->param('ship_county'); + $ship_county = $1; + #$cgi->param('ship_country') =~ /^(\w+)$/ + $cgi->param('ship_country') =~ /^(\w*)$/ + or die "illegal ship_country: ". $cgi->param('ship_country'); + $ship_country = $1; + #} else { + # die "illegal ship_state: ". $cgi->param('ship_state'); + } $payby = $cgi->param('payby'); - $payinfo = $cgi->param( $payby. '_payinfo' ); + if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) { + #$payinfo = join('@', map { $cgi->param( $payby. "_payinfo$_" ) } (1,2) ); + $payinfo = $cgi->param($payby. '_payinfo1'). '@'. + $cgi->param($payby. '_payinfo2'); + } else { + $payinfo = $cgi->param( $payby. '_payinfo' ); + } $paydate = $cgi->param( $payby. '_month' ). '-'. $cgi->param( $payby. '_year' ); $payname = $cgi->param( $payby. '_payname' ); + $paycvv = defined $cgi->param( $payby. '_paycvv' ) + ? $cgi->param( $payby. '_paycvv' ) + : ''; if ( $invoicing_list = $cgi->param('invoicing_list') ) { $invoicing_list .= ', POST' if $cgi->param('invoicing_list_POST'); @@ -117,43 +209,131 @@ if ( defined $cgi->param('magic') ) { $error = ''; + $last = $cgi->param('last'); + $first = $cgi->param('first'); + $ss = $cgi->param('ss'); + $company = $cgi->param('company'); + $address1 = $cgi->param('address1'); + $address2 = $cgi->param('address2'); + $city = $cgi->param('city'); + #$county, + #$state, + $zip = $cgi->param('zip'); + #$country, + $daytime = $cgi->param('daytime'); + $night = $cgi->param('night'); + $fax = $cgi->param('fax'); + + $ship_last = $cgi->param('ship_last'); + $ship_first = $cgi->param('ship_first'); + $ship_ss = $cgi->param('ship_ss'); + $ship_company = $cgi->param('ship_company'); + $ship_address1 = $cgi->param('ship_address1'); + $ship_address2 = $cgi->param('ship_address2'); + $ship_city = $cgi->param('ship_city'); + #$ship_county, + #$ship_state, + $ship_zip = $cgi->param('ship_zip'); + #$ship_country, + $ship_daytime = $cgi->param('ship_daytime'); + $ship_night = $cgi->param('ship_night'); + $ship_fax = $cgi->param('ship_fax'); + + #$payby, + #$payinfo, + #$paydate, + #$payname, + #$invoicing_list, + $referral_custnum = $cgi->param('ref'); + $pkgpart = $cgi->param('pkgpart'); + $username = $cgi->param('username'); + $sec_phrase = $cgi->param('sec_phrase'); + $password = $cgi->param('_password'); + $popnum = $cgi->param('popnum'); + #$agentnum, # = $cgi->param('agentnum'), + $agentnum ||= $cgi->param('agentnum'); + $init_popstate = $cgi->param('init_popstate'); + $refnum = $cgi->param('refnum'); + if ( $cgi->param('_password') ne $cgi->param('_password2') ) { - $error = "Passwords don't match"; + $error = $init_data->{msgcat}{passwords_dont_match}; #msgcat $password = ''; $password2 = ''; } else { $password2 = $cgi->param('_password2'); - $error = new_customer ( { - 'last' => $last = $cgi->param('last'), - 'first' => $first = $cgi->param('first'), - 'ss' => $ss = $cgi->param('ss'), - 'company' => $company = $cgi->param('company'), - 'address1' => $address1 = $cgi->param('address1'), - 'address2' => $address2 = $cgi->param('address2'), - 'city' => $city = $cgi->param('city'), - 'county' => $county, - 'state' => $state, - 'zip' => $zip = $cgi->param('zip'), - 'country' => $country, - 'daytime' => $daytime = $cgi->param('daytime'), - 'night' => $night = $cgi->param('night'), - 'fax' => $fax = $cgi->param('fax'), - 'payby' => $payby, - 'payinfo' => $payinfo, - 'paydate' => $paydate, - 'payname' => $payname, - 'invoicing_list' => $invoicing_list, - 'referral_custnum' => $referral_custnum = $cgi->param('ref'), - 'pkgpart' => $pkgpart = $cgi->param('pkgpart'), - 'username' => $username = $cgi->param('username'), - '_password' => $password = $cgi->param('_password'), - 'popnum' => $popnum = $cgi->param('popnum'), - } ); + if ( $payby =~ /^(CARD|DCRD)$/ && $cgi->param('CARD_type') ) { + $payinfo =~ s/\D//g; + + $payinfo =~ /^(\d{13,16})$/ + or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + $payinfo = $1; + validate($payinfo) + or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo; + cardtype($payinfo) eq $cgi->param('CARD_type') + or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type'); + } + + unless ( $error ) { + + my $r = new_customer ( { + 'last' => $last, + 'first' => $first, + 'ss' => $ss, + 'company' => $company, + 'address1' => $address1, + 'address2' => $address2, + 'city' => $city, + 'county' => $county, + 'state' => $state, + 'zip' => $zip, + 'country' => $country, + 'daytime' => $daytime, + 'night' => $night, + 'fax' => $fax, + 'ship_last' => $ship_last, + 'ship_first' => $ship_first, + 'ship_company' => $ship_company, + 'ship_address1' => $ship_address1, + 'ship_address2' => $ship_address2, + 'ship_city' => $ship_city, + 'ship_county' => $ship_county, + 'ship_state' => $ship_state, + 'ship_zip' => $ship_zip, + 'ship_country' => $ship_country, + 'ship_daytime' => $ship_daytime, + 'ship_night' => $ship_night, + 'ship_fax' => $ship_fax, + 'payby' => $payby, + 'payinfo' => $payinfo, + 'paycvv' => $paycvv, + 'paydate' => $paydate, + 'payname' => $payname, + 'invoicing_list' => $invoicing_list, + 'referral_custnum' => $referral_custnum, + 'promo_code' => scalar($cgi->param('promo_code')), + 'reg_code' => uc(scalar($cgi->param('reg_code'))), + 'pkgpart' => $pkgpart, + 'username' => $username, + 'sec_phrase' => $sec_phrase, + '_password' => $password, + 'popnum' => $popnum, + 'agentnum' => $agentnum, + 'refnum' => $refnum, + map { $_ => $cgi->param($_) } grep { /^snarf_/ } $cgi->param + } ); + $error ||= $r->{'error'}; + + } } - if ( $error ) { + if ( $error eq '_decline' ) { + print_decline(); + } elsif ( $error ) { + #fudge the snarf info + no strict 'refs'; + ${$_} = $cgi->param($_) foreach grep { /^snarf_/ } $cgi->param; print_form(); } else { print_okay(); @@ -163,7 +343,7 @@ if ( defined $cgi->param('magic') ) { die "unrecognized magic: ". $cgi->param('magic'); } } else { - $error = ''; + #$error = ''; $last = ''; $first = ''; $ss = ''; @@ -171,13 +351,26 @@ if ( defined $cgi->param('magic') ) { $address1 = ''; $address2 = ''; $city = ''; - $state = ''; + $state = $init_data->{statedefault}; $county = ''; - $country = ''; + $country = $init_data->{countrydefault}; $zip = ''; $daytime = ''; $night = ''; $fax = ''; + $ship_last = ''; + $ship_first = ''; + $ship_company = ''; + $ship_address1 = ''; + $ship_address2 = ''; + $ship_city = ''; + $ship_state = $init_data->{statedefault}; + $ship_county = ''; + $ship_country = $init_data->{countrydefault}; + $ship_zip = ''; + $ship_daytime = ''; + $ship_night = ''; + $ship_fax = ''; $invoicing_list = ''; $payby = ''; $payinfo = ''; @@ -187,14 +380,18 @@ if ( defined $cgi->param('magic') ) { $username = ''; $password = ''; $password2 = ''; + $sec_phrase = ''; $popnum = ''; $referral_custnum = $cgi->param('ref') || ''; + $init_popstate = $cgi->param('init_popstate') || ''; + $refnum = $init_data->{'refnum'}; print_form; } sub print_form { $cgi->delete('ref'); + $cgi->delete('init_popstate'); $self_url = $cgi->self_url; $error = "Error: $error" if $error; @@ -204,293 +401,105 @@ sub print_form { } +sub print_decline { + print $cgi->header( '-expires' => 'now' ), + $decline_template->fill_in(); +} + sub print_okay { - my $user_agent = new HTTP::Headers::UserAgent $ENV{HTTP_USER_AGENT}; + my $user_agent = new HTTP::BrowserDetect $ENV{HTTP_USER_AGENT}; $cgi->param('username') =~ /^(.+)$/ - or die "fatal: invalid username got past FS::SignupClient::new_customer"; + or die "fatal: invalid username got past FS::SelfService::new_customer"; my $username = $1; $cgi->param('_password') =~ /^(.+)$/ - or die "fatal: invalid password got past FS::SignupClient::new_customer"; + or die "fatal: invalid password got past FS::SelfService::new_customer"; my $password = $1; ( $cgi->param('first'). ' '. $cgi->param('last') ) =~ /^(.*)$/ - or die "fatal: invalid email_name got past FS::SignupCLient::new_customer"; - my $email_name = $1; - - my $pop = pop_info($cgi->param('popnum')) - or die "fatal: invalid popnum got past FS::SignupClient::new_customer"; - ( $ac, $exch, $loc ) = ( $pop->{'ac'}, $pop->{'exch'}, $pop->{'loc'} ); - - if ( $ieak_template - && $user_agent->platform eq 'ia32' - && $user_agent->os =~ /^win/ - && ($user_agent->browser)[0] eq 'IE' - ) - { #send an IEAK config + or die "fatal: invalid email_name got past FS::SelfService::new_customer"; + $email_name = $1; #global for template + + my $pop = $popnum2pop{$cgi->param('popnum')}; + #or die "fatal: invalid popnum got past FS::SelfService::new_customer"; + if ( $pop ) { + ( $ac, $exch, $loc ) = ( $pop->{'ac'}, $pop->{'exch'}, $pop->{'loc'} ); + } else { + ( $ac, $exch, $loc ) = ( '', '', ''); #presumably you're not using them. + } + + #global for template + $pkg = ( grep { $_->{'pkgpart'} eq $pkgpart } @$packages )[0]->{'pkg'}; + + if ( $ieak_template && $user_agent->windows && $user_agent->ie ) { + #send an IEAK config print $cgi->header('application/x-Internet-signup'), $ieak_template->fill_in(); - } elsif ( $cck_template - && $user_agent->platform eq 'ia32' - && $user_agent->os =~ /^win/ - && ($user_agent->browser)[0] eq 'Netscape' - ) - { #send a Netscape config - my $cck_data = $cck_template->fill_in(); - print $cgi->header('application/x-netscape-autoconfigure-dialer-v2'), - map { - m/(.*)\s+(.*)$/; - pack("N", length($1)). $1. pack("N", length($2)). $2; - } split(/\n/, $cck_data); - } else { #send a simple confirmation print $cgi->header( '-expires' => 'now' ), $success_template->fill_in(); } } -sub pop_info { - my $popnum = shift; - my $pop; - foreach $pop ( @{$pops} ) { - if ( $pop->{'popnum'} == $popnum ) { return $pop; } - } - ''; -} - -#horrible false laziness with FS/FS/svc_acct_pop.pm::popselector -sub popselector { - my( $popnum, $state ) = @_; - - my %pop = (); - push @{ $pop{$_->{state}} }, $_ foreach @$pops; - - my $text = < - function opt(what,href,text) { - var optionName = new Option(text, href, false, false) - var length = what.length; - what.options[length] = optionName; - } - - function popstate_changed(what) { - state = what.options[what.selectedIndex].text; - for (var i = what.form.popnum.length;i > 0;i--) - what.form.popnum.options[i] = null; - what.form.popnum.options[0] = new Option("", "", false, true); -END - - foreach my $popstate ( sort { $a cmp $b } keys %pop ) { - $text .= "\nif ( state == \"$popstate\" ) {\n"; - - foreach my $pop ( @{$pop{$popstate}}) { - my $o_popnum = $pop->{popnum}; - my $poptext = $pop->{city}. ', '. $pop->{state}. - ' ('. $pop->{ac}. ')/'. $pop->{exch}; - - $text .= "opt(what.form.popnum, \"$o_popnum\", \"$poptext\");\n" - } - $text .= "}\n"; - } - - $text .= "}\n\n"; - - $text .= - qq!'; #callback? return 3 html pieces? #''; - - $text .= qq!'; - - $text; -} - -sub expselect { - my $prefix = shift; - my $date = shift || ''; - my( $m, $y ) = ( 0, 0 ); - if ( $date =~ /^(\d{4})-(\d{2})-\d{2}$/ ) { #PostgreSQL date format - ( $m, $y ) = ( $2, $1 ); - } elsif ( $date =~ /^(\d{1,2})-(\d{1,2}-)?(\d{4}$)/ ) { - ( $m, $y ) = ( $1, $3 ); - } - my $return = qq!!; - for ( 2001 .. 2037 ) { - $return .= "Signup successful Signup successful

Thanks for signing up! +

+Signup information for <%= $email_name %>: +

+Username: <%= $username %>
+Password: <%= $password %>
+Access number: (<%= $ac %>) / <%= $exch %> - <%= $local %>
+Package: <%= $pkg %>
END } -sub signup_default { #html to use if you don't specify a template file +sub decline_default { #html to use if there is a decline <<'END'; -ISP Signup form -ISP Signup form

-<%= $error %> -
- - - -Contact Information - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*Contact name
(last, first)
, -
Company
*Address
 
*City*State/Country*Zip
Day Phone
Night Phone
Fax
* required fields
-
Billing information - - -
- - <%= - $OUT .= ' - - Postal mail invoice -
Email invoice -
Billing type
- - - - <%= - my %payby = ( - 'CARD' => qq!Credit card
*
*Exp !. expselect("CARD"). qq!
*Name on card
!, - 'BILL' => qq!Billing
P.O.
*Exp !. expselect("BILL", "12-2037"). qq!
*Attention
!, - 'COMP' => qq!Complimentary
*Approved by
*Exp !. expselect("COMP"), - 'PREPAY' => qq!Prepaid card
*!, - ); - - my %paybychecked = ( - 'CARD' => qq!Credit card
*
*Exp !. expselect("CARD", $paydate). qq!
*Name on card
!, - 'BILL' => qq!Billing
P.O.
*Exp !. expselect("BILL", $paydate). qq!
*Attention
!, - 'COMP' => qq!Complimentary
*Approved by
*Exp !. expselect("COMP", $paydate), - 'PREPAY' => qq!Prepaid card
*!, - ); - - for (@payby) { - $OUT .= qq!!; - } else { - $OUT .= qq!> $payby{$_}!; - } - } - %> - -
$paybychecked{$_}
* required fields for each billing type -

First package - - - - - - - - - - - - - - - - - - - - -
Username
Password - (blank to generate)
Re-enter Password -
Access number<%= popselector($popnum) %>
-

-
+Processing error +Processing error

+There has been an error processing your account. Please contact customer +support. + END } + +# subs for the templates... + +=item regionselector SELECTED_COUNTY, SELECTED_STATE, SELECTED_COUNTRY, PREFIX, ONCHANGE + +=cut + +sub regionselector { + my ( $selected_county, $selected_state, $selected_country, + $prefix, $onchange ) = @_; + signup_info() unless $init_data; + FS::SelfService::regionselector({ + selected_county => $selected_county, + selected_state => $selected_state, + selected_country => $selected_country, + prefix => $prefix, + onchange => $onchange, + default_country => $init_data->{countrydefault}, + locales => $init_data->{cust_main_county}, + }); + #default_state => $init_data->{statedefault}, +} + +=item popselector + +=cut + +sub popselector { + my( $popnum ) = @_; + signup_info() unless $init_data; + FS::SelfService::popselector({ + popnum => $popnum, + pops => $init_data->{svc_acct_pop}, + }); + #popac => + #acstate => +} +