#!/usr/bin/perl -Tw # # $Id: signup.cgi,v 1.8 2000-08-24 07:26:50 ivan Exp $ use strict; use vars qw( @payby $cgi $locales $packages $pops $r $error $last $first $ss $company $address1 $address2 $city $state $county $country $zip $daytime $night $fax $invoicing_list $payby $payinfo $paydate $payname $pkgpart $username $password $popnum $ieak_file $ieak_template $cck_file $cck_template $ac $exch $loc ); use subs qw( print_form print_okay expselect ); use CGI; use CGI::Carp qw(fatalsToBrowser); use HTTP::Headers::UserAgent 2.00; use FS::SignupClient qw( signup_info new_customer ); use Text::Template; #acceptable payment methods # #@payby = qw( CARD BILL COMP ); #@payby = qw( CARD BILL ); #@payby = qw( CARD ); @payby = qw( CARD PREPAY ); $ieak_file = '/usr/local/freeside/ieak.template'; $cck_file = '/usr/local/freeside/cck.template'; 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_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 = ''; } ( $locales, $packages, $pops ) = signup_info(); $cgi = new CGI; 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; $payby = $cgi->param('payby'); $payinfo = $cgi->param( $payby. '_payinfo' ); $paydate = $cgi->param( $payby. '_month' ). '-'. $cgi->param( $payby. '_year' ); $payname = $cgi->param( $payby. '_payname' ); if ( $invoicing_list = $cgi->param('invoicing_list') ) { $invoicing_list .= ', POST' if $cgi->param('invoicing_list_POST'); } else { $invoicing_list = 'POST'; } ( $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, 'pkgpart' => $pkgpart = $cgi->param('pkgpart'), 'username' => $username = $cgi->param('username'), '_password' => $password = $cgi->param('_password'), 'popnum' => $popnum = $cgi->param('popnum'), } ) ) ? print_form() : print_okay(); } else { die "unrecognized magic: ". $cgi->param('magic'); } } else { $error = ''; $last = ''; $first = ''; $ss = ''; $company = ''; $address1 = ''; $address2 = ''; $city = ''; $state = ''; $county = ''; $country = ''; $zip = ''; $daytime = ''; $night = ''; $fax = ''; $invoicing_list = ''; $payby = ''; $payinfo = ''; $paydate = ''; $payname = ''; $pkgpart = ''; $username = ''; $password = ''; $popnum = ''; print_form; } sub print_form { my $r = qq!*!; my $self_url = $cgi->self_url; print $cgi->header( '-expires' => 'now' ), <ISP Signup form ISP Signup form

END print qq!Error: $error! if $error; print < Contact Information
${r}Contact name
(last, first)
, SS#
Company
${r}Address
 
${r}City ${r}State/Country ${r}Zip
Day Phone
Night Phone
Fax
$r required fields

Billing information!; print <
END print qq!Postal mail invoice
Email invoice ', qq!
Billing type
END my %payby = ( 'CARD' => qq!Credit card
${r}
${r}Exp !. expselect("CARD"). qq!
${r}Name on card
!, 'BILL' => qq!Billing
P.O.
${r}Exp !. expselect("BILL", "12-2037"). qq!
${r}Attention
!, 'COMP' => qq!Complimentary
${r}Approved by
${r}Exp !. expselect("COMP"), 'PREPAY' => qq!Prepaid card
${r}!, ); my %paybychecked = ( 'CARD' => qq!Credit card
${r}
${r}Exp !. expselect("CARD", $paydate). qq!
${r}Name on card
!, 'BILL' => qq!Billing
P.O.
${r}Exp !. expselect("BILL", $paydate). qq!
${r}Attention
!, 'COMP' => qq!Complimentary
${r}Approved by
${r}Exp !. expselect("COMP", $paydate), 'PREPAY' => qq!Prepaid card
${r}!, ); for (@payby) { print qq!!; } else { print qq!> $payby{$_}!; } } print <
$paybychecked{$_}
$r required fields for each billing type

First package
Username
Password (blank to generate)
POP


END } sub print_okay { my $user_agent = new HTTP::Headers::UserAgent $ENV{HTTP_USER_AGENT}; $cgi->param('username') =~ /^(.+)$/ or die "fatal: invalid username got past FS::SignupClient::new_customer"; my $username = $1; $cgi->param('_password') =~ /^(.+)$/ or die "fatal: invalid password got past FS::SignupClient::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"; my ( $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 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' ), <Signup successful Signup successful

blah blah blah END } } sub pop_info { my $popnum = shift; my $pop; foreach $pop ( @{$pops} ) { if ( $pop->{'popnum'} == $popnum ) { return $pop; } } ''; } 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 ( 1999 .. 2037 ) { $return .= "