diff options
| -rw-r--r-- | fs_signup/FS-SignupClient/Changes | 5 | ||||
| -rw-r--r-- | fs_signup/FS-SignupClient/MANIFEST | 8 | ||||
| -rw-r--r-- | fs_signup/FS-SignupClient/MANIFEST.SKIP | 1 | ||||
| -rw-r--r-- | fs_signup/FS-SignupClient/Makefile.PL | 10 | ||||
| -rwxr-xr-x | fs_signup/FS-SignupClient/cgi/signup.cgi | 302 | ||||
| -rwxr-xr-x | fs_signup/FS-SignupClient/fs_signupd (renamed from fs_signup/fs_signupd) | 28 | ||||
| -rw-r--r-- | fs_signup/FS-SignupClient/test.pl | 20 | ||||
| -rw-r--r-- | fs_signup/README | 18 | ||||
| -rwxr-xr-x | fs_signup/Signup.pm | 129 | ||||
| -rwxr-xr-x | fs_signup/fs_signup_server | 61 | 
10 files changed, 423 insertions, 159 deletions
| diff --git a/fs_signup/FS-SignupClient/Changes b/fs_signup/FS-SignupClient/Changes new file mode 100644 index 000000000..e750a82bc --- /dev/null +++ b/fs_signup/FS-SignupClient/Changes @@ -0,0 +1,5 @@ +Revision history for Perl extension FS::SignupClient. + +0.01  Mon Aug 23 01:12:46 1999 +	- original version; created by h2xs 1.19 + diff --git a/fs_signup/FS-SignupClient/MANIFEST b/fs_signup/FS-SignupClient/MANIFEST new file mode 100644 index 000000000..b4a9900c8 --- /dev/null +++ b/fs_signup/FS-SignupClient/MANIFEST @@ -0,0 +1,8 @@ +Changes +MANIFEST +MANIFEST.SKIP +Makefile.PL +SignupClient.pm +test.pl +fs_signupd +cgi/signup.cgi diff --git a/fs_signup/FS-SignupClient/MANIFEST.SKIP b/fs_signup/FS-SignupClient/MANIFEST.SKIP new file mode 100644 index 000000000..ae335e78a --- /dev/null +++ b/fs_signup/FS-SignupClient/MANIFEST.SKIP @@ -0,0 +1 @@ +CVS/ diff --git a/fs_signup/FS-SignupClient/Makefile.PL b/fs_signup/FS-SignupClient/Makefile.PL new file mode 100644 index 000000000..859d757c3 --- /dev/null +++ b/fs_signup/FS-SignupClient/Makefile.PL @@ -0,0 +1,10 @@ +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( +    'NAME'	    => 'FS::SignupClient', +    'VERSION_FROM'  => 'SignupClient.pm', # finds $VERSION +    'EXE_FILES'     => [ 'fs_signupd' ], +    'INSTALLSCRIPT' => '/usr/local/sbin', +    'PERM_RWX'      => '750', +); diff --git a/fs_signup/FS-SignupClient/cgi/signup.cgi b/fs_signup/FS-SignupClient/cgi/signup.cgi new file mode 100755 index 000000000..7131ad2e8 --- /dev/null +++ b/fs_signup/FS-SignupClient/cgi/signup.cgi @@ -0,0 +1,302 @@ +#!/usr/bin/perl -Tw +# +# $Id: signup.cgi,v 1.1 1999-08-24 07:40:45 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 ); +use subs qw( print_form print_okay expselect ); + +use CGI; +use CGI::Carp qw(fatalsToBrowser); +use FS::SignupClient qw( signup_info new_customer ); + +#@payby = qw( CARD BILL COMP ); +#@payby = qw( CARD BILL ); +@payby = qw( CARD ); + +( $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!<font color="#ff0000">*</font>!; +  my $self_url = $cgi->self_url; + +  print $cgi->header( '-expires' => 'now' ), <<END; +<HTML><HEAD><TITLE>ISP Signup form</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>ISP Signup form</FONT><BR><BR> +END + +  print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT>! if $error; + +  print <<END; +<FORM ACTION="$self_url" METHOD=POST> +<INPUT TYPE="hidden" NAME="magic" VALUE="process"> +Contact Information +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> +  <TH ALIGN="right">${r}Contact name<BR>(last, first)</TH> +  <TD COLSPAN=3><INPUT TYPE="text" NAME="last" VALUE="$last">, +                <INPUT TYPE="text" NAME="first" VALUE="$first"></TD> +  <TD ALIGN="right">SS#</TD> +  <TD><INPUT TYPE="text" NAME="ss" SIZE=11 VALUE="$ss"></TD> +</TR> +<TR> +  <TD ALIGN="right">Company</TD> +  <TD COLSPAN=5><INPUT TYPE="text" NAME="company" SIZE=70 VALUE="$company"></TD> +</TR> +<TR> +  <TH ALIGN="right">${r}Address</TH> +  <TD COLSPAN=5><INPUT TYPE="text" NAME="address1" SIZE=70 VALUE="$address1"></TD> +</TR> +<TR> +  <TD ALIGN="right"> </TD> +  <TD COLSPAN=5><INPUT TYPE="text" NAME="address2" SIZE=70 VALUE="$address2"></TD> +</TR> +<TR> +  <TH ALIGN="right">${r}City</TH> +  <TD><INPUT TYPE="text" NAME="city" VALUE="$city"></TD> +  <TH ALIGN="right">${r}State/Country</TH> +  <TD><SELECT NAME="state" SIZE="1"> +END + +  foreach ( @{$locales} ) { +    print "<OPTION"; +    print " SELECTED" if ( $state eq $_->{'state'} +                           && $county eq $_->{'county'} +                           && $country eq $_->{'country'} +                         ); +    print ">", $_->{'state'}; +    print " (",$_->{'county'},")" if $_->{'county'}; +    print " / ", $_->{'country'}; +  } + +  print <<END; +  </SELECT></TD> +  <TH>${r}Zip</TH> +  <TD><INPUT TYPE="text" NAME="zip" SIZE=10 VALUE="$zip"></TD> +</TR> +<TR> +  <TD ALIGN="right">Day Phone</TD> +  <TD COLSPAN=5><INPUT TYPE="text" NAME="daytime" VALUE="$daytime" SIZE=18></TD> +</TR> +<TR> +  <TD ALIGN="right">Night Phone</TD> +  <TD COLSPAN=5><INPUT TYPE="text" NAME="night" VALUE="$night" SIZE=18></TD> +</TR> +<TR> +  <TD ALIGN="right">Fax</TD> +  <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="$fax" SIZE=12></TD> +</TR> +</TABLE>$r required fields<BR> +<BR>Billing information<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR><TD> +END + +  print qq!<INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST"!; +  my @invoicing_list = split(', ', $invoicing_list ); +  print ' CHECKED' +    if ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list; +  print '>Postal mail invoice</TD></TR><TR><TD>Email invoice ', +         qq!<INPUT TYPE="text" NAME="invoicing_list" VALUE="!, +         join(', ', grep { $_ ne 'POST' } @invoicing_list ), +         qq!"></TD></TR>!; + +  print <<END; +<TR><TD>Billing type</TD></TR></TABLE> +<TABLE BGCOLOR="#c0c0c0" BORDER=1 WIDTH="100%"> +<TR> +END + +  my %payby = ( +    'CARD' => qq!Credit card<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD"). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!, +    'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR>${r}Exp !. expselect("BILL", "12-2037"). qq!<BR>${r}Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="Accounts Payable">!, +    'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR>${r}Exp !. expselect("COMP"), +  ); + +  my %paybychecked = ( +    'CARD' => qq!Credit card<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD", $paydate). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!, +    'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR>${r}Exp !. expselect("BILL", $paydate). qq!<BR>${r}Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!, +    'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR>${r}Exp !. expselect("COMP", $paydate), +  ); + +  for (@payby) { +    print qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!; +    if ($payby eq $_) { +      print qq! CHECKED> $paybychecked{$_}</TD>!; +    } else { +      print qq!> $payby{$_}</TD>!; +    } +  } + +  print <<END; +</TR></TABLE>$r required fields for each billing type +<BR><BR>First package +<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"> +<TR> +  <TD COLSPAN=2><SELECT NAME="pkgpart"><OPTION VALUE="">(none) +END + +  foreach my $package ( @{$packages} ) { +    print qq!<OPTION VALUE="!, $package->{'pkgpart'}, '"'; +    print " SELECTED" if $pkgpart && ( $package->{'pkgpart'} == $pkgpart ); +    print ">", $package->{'pkg'}; +  } + +  print <<END; +  </SELECT></TD> +</TR> +<TR> +  <TD ALIGN="right">Username</TD> +  <TD><INPUT TYPE="text" NAME="username" VALUE="$username"></TD> +</TR> +<TR> +  <TD ALIGN="right">Password</TD> +  <TD><INPUT TYPE="text" NAME="_password" VALUE="$password"> +  (blank to generate)</TD> +</TR> +<TR> +  <TD ALIGN="right">POP</TD> +  <TD><SELECT NAME="popnum" SIZE=1><OPTION>  +END + +  foreach my $pop ( @{$pops} ) { +    print qq!<OPTION VALUE="!, $pop->{'popnum'}, '"', +          ( $popnum && $pop->{'popnum'} == $popnum ) ? ' SELECTED' : '', ">",  +          $pop->{'popnum'}, ": ",  +          $pop->{'city'}, ", ", +          $pop->{'state'}, +          " (", $pop->{'ac'}, ")/", +          $pop->{'exch'}, "\n" +        ; +  } +  print <<END; +  </SELECT></TD> +</TR> +</TABLE> +<BR><BR><INPUT TYPE="submit" VALUE="Signup"> +</FORM></BODY></HTML> +END + +} + +sub print_okay { +  print $cgi->header( '-expires' => 'now' ), <<END; +<HTML><HEAD><TITLE>Signup successful</TITLE></HEAD> +<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Signup successful</FONT><BR><BR> +blah blah blah +</BODY> +</HTML> +END +} + +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!<SELECT NAME="$prefix!. qq!_month" SIZE="1">!; +  for ( 1 .. 12 ) { +    $return .= "<OPTION"; +    $return .= " SELECTED" if $_ == $m; +    $return .= ">$_"; +  } +  $return .= qq!</SELECT>/<SELECT NAME="$prefix!. qq!_year" SIZE="1">!; +  for ( 1999 .. 2037 ) { +    $return .= "<OPTION"; +    $return .= " SELECTED" if $_ == $y; +    $return .= ">$_"; +  } +  $return .= "</SELECT>"; + +  $return; +} + diff --git a/fs_signup/fs_signupd b/fs_signup/FS-SignupClient/fs_signupd index 71fd1540d..972e3c7b4 100755 --- a/fs_signup/fs_signupd +++ b/fs_signup/FS-SignupClient/fs_signupd @@ -8,7 +8,11 @@  use strict;  use Socket; -my($fs_passwdd_socket)="/usr/local/freeside/fs_signupd_socket"; +use vars qw( $Debug ); + +$Debug = 0; + +my($fs_signupd_socket)="/usr/local/freeside/fs_signupd_socket";  $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';  $ENV{'SHELL'} = '/bin/sh'; @@ -19,6 +23,7 @@ $ENV{'BASH_ENV'} = '';  $|=1; +warn "[fs_signupd] Reading locales...\n" if $Debug;  chomp( my $n_cust_main_county = <STDIN> );  my @cust_main_county = map {    chomp( my $taxnum = <STDIN> ); @@ -33,6 +38,7 @@ my @cust_main_county = map {    };  } ( 1 .. $n_cust_main_county ); +warn "[fs_signupd] Reading package definitions...\n" if $Debug;  chomp( my $n_part_pkg = <STDIN> );  my @part_pkg = map {    chomp( my $pkgpart = <STDIN> ); @@ -43,6 +49,7 @@ my @part_pkg = map {    };  } ( 1 .. $n_part_pkg ); +warn "[fs_signupd] Reading POPs...\n" if $Debug;  chomp( my $n_svc_acct_pop = <STDIN> );  my @svc_acct_pop = map {    chomp( my $popnum = <STDIN> ); @@ -59,22 +66,22 @@ my @svc_acct_pop = map {    };  } ( 1 .. $n_svc_acct_pop ); -my $uaddr = sockaddr_un($fs_passwdd_socket); +warn "[fs_signupd] Creating $fs_signupd_socket\n" if $Debug; +my $uaddr = sockaddr_un($fs_signupd_socket);  my $proto = getprotobyname('tcp'); -  socket(Server,PF_UNIX,SOCK_STREAM,0) or die "socket: $!"; -unlink($fs_passwdd_socket); +unlink($fs_signupd_socket);  bind(Server, $uaddr) or die "bind: $!";  listen(Server,SOMAXCONN) or die "listen: $!"; +warn "[fs_signupd] Entering main loop...\n" if $Debug;  my $paddr; -  for ( ; $paddr = accept(Client,Server); close Client) {    chop( my $command = <Client> );    if ( $command eq "signup_info" ) { - +    warn "[fs_signupd] sending signup info...\n" if $Debug;       print Client join("\n", $n_cust_main_county,        map {          $_->{taxnum}, @@ -101,15 +108,16 @@ for ( ; $paddr = accept(Client,Server); close Client) {        } @svc_acct_pop      ), "\n"; -  } elsif ( $operation eq "new_customer" ) { - +  } elsif ( $command eq "new_customer" ) { +    warn "[fs_signupd] reading customer signup...\n" if $Debug;      my(        $first, $last, $ss, $company, $address1, $address2, $city, $county,        $state, $zip, $country, $daytime, $night, $fax, $payby, $payinfo,        $paydate, $payname, $invoicing_list, $pkgpart, $username, $password,        $popnum, -    ) = <Client>; +    ) = map { scalar(<Client>) } ( 1 .. 23 ); +    warn "[fs_signupd] sending customer data to remote server...\n" if $Debug;      print         $first, $last, $ss, $company, $address1, $address2, $city, $county,        $state, $zip, $country, $daytime, $night, $fax, $payby, $payinfo, @@ -117,8 +125,10 @@ for ( ; $paddr = accept(Client,Server); close Client) {        $popnum,      ; +    warn "[fs_signupd] reading error from remote server...\n" if $Debug;      my $error = <STDIN>; +    warn "[fs_signupd] sending error to local client...\n" if $Debug;      print Client $error;    } else { diff --git a/fs_signup/FS-SignupClient/test.pl b/fs_signup/FS-SignupClient/test.pl new file mode 100644 index 000000000..690f5840e --- /dev/null +++ b/fs_signup/FS-SignupClient/test.pl @@ -0,0 +1,20 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### We start with some black magic to print on failure. + +# Change 1..1 below to 1..last_test_to_print . +# (It may become useful if the test is moved to ./t subdirectory.) + +BEGIN { $| = 1; print "1..1\n"; } +END {print "not ok 1\n" unless $loaded;} +use FS::SignupClient; +$loaded = 1; +print "ok 1\n"; + +######################### End of black magic. + +# Insert your test code below (better if it prints "ok 13" +# (correspondingly "not ok 13") depending on the success of chunk 13 +# of the test code): + diff --git a/fs_signup/README b/fs_signup/README new file mode 100644 index 000000000..631c22364 --- /dev/null +++ b/fs_signup/README @@ -0,0 +1,18 @@ +this should become better docs soon + +on client machine (public webserver): + +install perl, ssh, CGI.pm +cd FS-SignupClient; perl Makefile.PL; make; su; make install +copy or symlink FS-SignupClient/cgi/signup.cgi into the web server's view +use suExec or setuid to run cgi/signup.cgi as the freeside user +(chmod /usr/local/freeside/fs_signupd_socket 600, chown freeside) + +on server machine (Freeside machine): + +run fs_signup_server user machine agentnum refnum + +  user is a freeside user from mapsecrets +  machine is the client machine +  agentnum and refnum are the fixed values for this signup server + diff --git a/fs_signup/Signup.pm b/fs_signup/Signup.pm deleted file mode 100755 index bcf09f1fe..000000000 --- a/fs_signup/Signup.pm +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/perl -Tw -# -# fs_passwd -# -# portions of this script are copied from the `passwd' script in the original -# (perl 4) camel book, now archived at  -# http://www.perl.com/CPAN/scripts/nutshell/ch6/passwd -# -# ivan@sisd.com 98-mar-8 -# -# password lengths 0,255 instead of 6,8 - we'll let the server process -# check the data ivan@sisd.com 98-jul-17 - -use strict; -use Getopt::Std; -use Socket; -use IO::Handle; -use vars qw($opt_f $opt_s); - -my($fs_passwdd_socket)="/usr/local/freeside/fs_passwdd_socket"; -my($freeside_uid)=scalar(getpwnam('freeside')); - -$ENV{'PATH'} ='/usr/bin:/usr/ucb:/bin'; -$ENV{'SHELL'} = '/bin/sh'; -$ENV{'IFS'} = " \t\n"; -$ENV{'CDPATH'} = ''; -$ENV{'ENV'} = ''; -$ENV{'BASH_ENV'} = ''; - -$SIG{__DIE__}= sub { system '/bin/stty', 'echo'; }; - -die "passwd program isn't running setuid to freeside\n" if $> != $freeside_uid; - -unshift @ARGV, "-f" if $0 =~ /chfn$/; -unshift @ARGV, "-s" if $0 =~ /chsh$/; - -getopts('fs'); - -my($me)=''; -if ( $_ = shift(@ARGV) ) { -  /^(\w{2,8})$/; -  $me = $1;  -} -die "You can't change the password for $me." if $me && $<; -$me = (getpwuid($<))[0] unless $me; - -my($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell)= -  getpwnam $me; - -my($old_password,$new_password,$new_gecos,$new_shell); - -if ( $opt_f || $opt_s ) { -  system '/bin/stty', '-echo'; -  print "Password:"; -  $old_password=<STDIN>; -  system '/bin/stty', 'echo';  -  chop($old_password); -  #$old_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; -  $old_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; -  $old_password = $1; - -  $new_password = ''; - -  if ( $opt_f ) { -    print "\nChanging gecos for $me.\n"; -    print "Gecos [", $gcos, "]: "; -    $new_gecos=<STDIN>; -    chop($new_gecos); -    $new_gecos ||= $gcos; -    $new_gecos =~ /^(.{0,255})$/ or die "\nIllegal gecos.\n"; -  } else { -    $new_gecos = ''; -  }  - -  if ( $opt_s ) { -    print "\nChanging shell for $me.\n"; -    print "Shell [", $shell, "]: "; -    $new_shell=<STDIN>; -    chop($new_shell); -    $new_shell ||= $shell; -    $new_shell =~ /^(.{0,255})$/ or die "\nIllegal shell.\n"; -  } else { -    $new_shell = ''; -  } - -} else { - -  print "Changing password for $me.\n"; -  print "Old password:"; -  system '/bin/stty', '-echo'; -  $old_password=<STDIN>; -  chop $old_password; -  #$old_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; -  $old_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; -  $old_password = $1; -  print "\nEnter the new password (minimum of 6, maximum of 8 characters)\n"; -  print "Please use a combination of upper and lowercase letters and numbers.\n"; -  print "New password:"; -  $new_password=<STDIN>; -  chop($new_password); -  #$new_password =~ /^(.{6,8})$/ or die "\nIllegal password.\n"; -  $new_password =~ /^(.{0,255})$/ or die "\nIllegal password.\n"; -  $new_password = $1; -  print "\nRe-enter new password:"; -  my($check_new_password); -  $check_new_password=<STDIN>; -  chop($check_new_password); -  die "\nThey don't match; try again.\n" unless $check_new_password eq $new_password; - -  $new_gecos=''; -  $new_shell=''; -} -print "\n"; - -system '/bin/stty', 'echo';  - -socket(SOCK, PF_UNIX, SOCK_STREAM, 0) or die "socket: $!"; -connect(SOCK, sockaddr_un($fs_passwdd_socket)) or die "connect: $!"; -print SOCK join("\n",$me,$old_password,$new_password,$new_gecos,$new_shell),"\n"; -SOCK->flush; -my($error); -$error = <SOCK>; -chop $error; - -if ($error) { -  print "\nUpdate error: $error\n"; -} else { -  print "\nUpdate sucessful.\n"; -} diff --git a/fs_signup/fs_signup_server b/fs_signup/fs_signup_server index cf2519ec0..e1c9b3517 100755 --- a/fs_signup/fs_signup_server +++ b/fs_signup/fs_signup_server @@ -7,14 +7,18 @@ use strict;  use IO::Handle;  use FS::SSH qw(sshopen2);  use FS::UID qw(adminsuidsetup); -use FS::Record qw(qsearchs); +use FS::Record qw( qsearch qsearchs );  use FS::cust_main_county;  use FS::cust_main; -use vars qw( $opt ); +use vars qw( $opt $Debug ); + +$Debug = 0; + +my @payby = qw(CARD);  my $user = shift or die &usage; -adminsuidsetup $user;  +&adminsuidsetup( $user );   my $machine = shift or die &usage; @@ -31,12 +35,15 @@ my($fs_signupd)="/usr/local/sbin/fs_signupd";  while (1) {    my($reader,$writer)=(new IO::Handle, new IO::Handle);    $writer->autoflush(1); -  sshopen2($shellmachine,$reader,$writer,$fs_signupd); +  warn "[fs_signup_server] Connecting to $machine...\n" if $Debug; +  sshopen2($machine,$reader,$writer,$fs_signupd); + +  my $data; -  #send fs_signupd state/county/country -  @my cust_main_county = qsearch('cust_main_county', {} ); -  print $writer join("\n", -    scalar(@cust_main_county) || die "no tax rates (cust_main_county records)", +  warn "[fs_signup_server] Sending locales...\n" if $Debug; +  my @cust_main_county = qsearch('cust_main_county', {} ); +  print $writer $data = join("\n", +    ( scalar(@cust_main_county) || die "no tax rates (cust_main_county records)" ),      map {        $_->taxnum,        $_->state, @@ -44,22 +51,24 @@ while (1) {        $_->country,      } @cust_main_county    ),"\n"; +  warn "[fs_signup_server] $data\n" if $Debug > 2; -  #send fs_signupd package definitions +  warn "[fs_signup_server] Sending package definitions...\n" if $Debug;    my @part_pkg = grep { $_->svcpart('svc_acct') && $pkgpart->{ $_->pkgpart } }      qsearch( 'part_pkg', {} ); -  print $writer join("\n", -    scalar(@part_pkg) || die "no usable package definitions, agent $agentnum", +  print $writer $data = join("\n", +    ( scalar(@part_pkg) || die "no usable package definitions, agent $agentnum" ),      map {        $_->pkgpart,        $_->pkg,      } @part_pkg    ), "\n"; +  warn "[fs_signup_server] $data\n" if $Debug > 2; -  #send fs_signupd POPs +  warn "[fs_signup_server] Sending POPs...\n" if $Debug;    my @svc_acct_pop = qsearch ('svc_acct_pop',{} ); -  print $writer join("\n", -    scalar(@svc_acct_pop) || die "No points of presence (svc_acct_pop records)", +  print $writer $data = join("\n", +    ( scalar(@svc_acct_pop) || die "No points of presence (svc_acct_pop records)" ),      map {        $_->popnum,        $_->city, @@ -68,14 +77,19 @@ while (1) {        $_->exch,      } @svc_acct_pop    ), "\n"; +  warn "[fs_signup_server] $data\n" if $Debug > 2; +  warn "[fs_signup_server] Entering main loop...\n" if $Debug;    while (1) { +    warn "[fs_signup_server] Reading (waiting for) signup data...\n" if $Debug;      chop( my(        $first, $last, $ss, $company, $address1, $address2, $city, $county,        $state, $zip, $country, $daytime, $night, $fax, $payby, $payinfo,        $paydate, $payname, $invoicing_list, $pkgpart, $username, $password,        $popnum, -    ) = <$reader> ); +    ) = map { scalar(<$reader>) } ( 1 .. 23 ) ); + +    warn "[fs_signup_server] Processing signup...\n" if $Debug;      my $error = ''; @@ -105,17 +119,21 @@ while (1) {        'payname'  => $payname,      } ); +    $error = "Illegal payment type" unless grep { $_ eq $payby } @payby; +      my @invoicing_list = split( /\s*\,\s*/, $invoicing_list );      $error ||= $cust_main->check_invoicing_list( \@invoicing_list );      my $part_pkg = qsearchs( 'part_pkg', { 'pkgpart' => $pkgpart } ) -      or die "unknown pkgpart $pkgpart"; +      or $error ||= "WARNING: unknown pkgpart $pkgpart";      my $svcpart = $part_pkg->svcpart;      # this should wind up in FS::cust_pkg! -    die "agent $agentnum can't purchase pkgpart $pkgpart" -      unless $pkgpart->{ $pkgpart }; +    my $agent = qsearchs( 'agent', { 'agentnum' => $agentnum } ); +    my $pkgpart_href = $agent->pkgpart_hashref; +    $error ||= "WARNING: agent $agentnum can't purchase pkgpart $pkgpart" +      unless $pkgpart_href->{ $pkgpart };      my $cust_pkg = new FS::cust_pkg ( {        #later#'custnum' => $custnum, @@ -123,7 +141,7 @@ while (1) {      } );      $error ||= $cust_pkg->check; -    $svc_acct = new FS::svc_acct ( { +    my $svc_acct = new FS::svc_acct ( {        'svcpart'   => $svcpart,        'username'  => $username,        '_password' => $password, @@ -143,7 +161,7 @@ while (1) {      $error ||= $cust_main->insert;      if ( $cust_pkg && ! $error ) { #in this case, $cust_pkg should always                                     #be definied, but.... -      $cust_pkg->custnum( $new->custnum ); +      $cust_pkg->custnum( $cust_main->custnum );        $error ||= $cust_pkg->insert;         warn "WARNING: $error on pre-checked cust_pkg record!" if $error;        $svc_acct->pkgnum( $cust_pkg->pkgnum ); @@ -151,6 +169,7 @@ while (1) {        warn "WARNING: $error on pre-checked svc_acct record!" if $error;      } +    warn "[fs_signup_server] Sending results...\n" if $Debug;      print $writer $error, "\n";      $cust_main->invoicing_list( \@invoicing_list ) unless $error; @@ -158,7 +177,7 @@ while (1) {    }    close $writer;    close $reader; -  warn "connection to $shellmachine lost!  waiting 60 seconds...\n"; +  warn "connection to $machine lost!  waiting 60 seconds...\n";    sleep 60;    warn "reconnecting...\n";  } | 
