initial checkin of signup server
authorivan <ivan>
Tue, 24 Aug 1999 07:40:45 +0000 (07:40 +0000)
committerivan <ivan>
Tue, 24 Aug 1999 07:40:45 +0000 (07:40 +0000)
fs_signup/FS-SignupClient/Changes [new file with mode: 0644]
fs_signup/FS-SignupClient/MANIFEST [new file with mode: 0644]
fs_signup/FS-SignupClient/MANIFEST.SKIP [new file with mode: 0644]
fs_signup/FS-SignupClient/Makefile.PL [new file with mode: 0644]
fs_signup/FS-SignupClient/cgi/signup.cgi [new file with mode: 0755]
fs_signup/FS-SignupClient/fs_signupd [new file with mode: 0755]
fs_signup/FS-SignupClient/test.pl [new file with mode: 0644]
fs_signup/README [new file with mode: 0644]
fs_signup/Signup.pm [deleted file]
fs_signup/fs_signup_server
fs_signup/fs_signupd [deleted file]

diff --git a/fs_signup/FS-SignupClient/Changes b/fs_signup/FS-SignupClient/Changes
new file mode 100644 (file)
index 0000000..e750a82
--- /dev/null
@@ -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 (file)
index 0000000..b4a9900
--- /dev/null
@@ -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 (file)
index 0000000..ae335e7
--- /dev/null
@@ -0,0 +1 @@
+CVS/
diff --git a/fs_signup/FS-SignupClient/Makefile.PL b/fs_signup/FS-SignupClient/Makefile.PL
new file mode 100644 (file)
index 0000000..859d757
--- /dev/null
@@ -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 (executable)
index 0000000..7131ad2
--- /dev/null
@@ -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">&nbsp;</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-SignupClient/fs_signupd b/fs_signup/FS-SignupClient/fs_signupd
new file mode 100755 (executable)
index 0000000..972e3c7
--- /dev/null
@@ -0,0 +1,139 @@
+#!/usr/bin/perl -Tw
+#
+# fs_signupd
+#
+# This is run REMOTELY over ssh by fs_signup_server.
+#
+
+use strict;
+use 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';
+$ENV{'IFS'} = " \t\n";
+$ENV{'CDPATH'} = '';
+$ENV{'ENV'} = '';
+$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> );
+  chomp( my $state = <STDIN> );
+  chomp( my $county = <STDIN> );
+  chomp( my $country = <STDIN> );
+  {
+    'taxnum'  => $taxnum,
+    'state'   => $state,
+    'county'  => $county,
+    'country' => $country,
+  };
+} ( 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> );
+  chomp( my $pkg = <STDIN> );
+  {
+    'pkgpart' => $pkgpart,
+    'pkg'     => $pkg,
+  };
+} ( 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> );
+  chomp( my $city = <STDIN> );
+  chomp( my $state = <STDIN> );
+  chomp( my $ac = <STDIN> );
+  chomp( my $exch = <STDIN> );
+  {
+    'popnum' => $popnum,
+    'city'   => $city,
+    'state'  => $state,
+    'ac'     => $ac,
+    'exch'   => $exch,
+  };
+} ( 1 .. $n_svc_acct_pop );
+
+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_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},
+        $_->{state},
+        $_->{county},
+        $_->{country},
+      } @cust_main_county
+    ), "\n";
+
+    print Client join("\n", $n_part_pkg,
+      map {
+        $_->{pkgpart},
+        $_->{pkg},
+      } @part_pkg
+    ), "\n";
+
+    print Client join("\n", $n_svc_acct_pop,
+      map {
+        $_->{popnum},
+        $_->{city},
+        $_->{state},
+        $_->{ac},
+        $_->{exch},
+      } @svc_acct_pop
+    ), "\n";
+
+  } 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,
+    ) = 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,
+      $paydate, $payname, $invoicing_list, $pkgpart, $username, $password,
+      $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 {
+    die "unexpected command from client: $command";
+  }
+
+}
+
diff --git a/fs_signup/FS-SignupClient/test.pl b/fs_signup/FS-SignupClient/test.pl
new file mode 100644 (file)
index 0000000..690f584
--- /dev/null
@@ -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 (file)
index 0000000..631c223
--- /dev/null
@@ -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 (executable)
index bcf09f1..0000000
+++ /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";
-}
index cf2519e..e1c9b35 100755 (executable)
@@ -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";
 }
diff --git a/fs_signup/fs_signupd b/fs_signup/fs_signupd
deleted file mode 100755 (executable)
index 71fd154..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-#!/usr/bin/perl -Tw
-#
-# fs_signupd
-#
-# This is run REMOTELY over ssh by fs_signup_server.
-#
-
-use strict;
-use Socket;
-
-my($fs_passwdd_socket)="/usr/local/freeside/fs_signupd_socket";
-
-$ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';
-$ENV{'SHELL'} = '/bin/sh';
-$ENV{'IFS'} = " \t\n";
-$ENV{'CDPATH'} = '';
-$ENV{'ENV'} = '';
-$ENV{'BASH_ENV'} = '';
-
-$|=1;
-
-chomp( my $n_cust_main_county = <STDIN> );
-my @cust_main_county = map {
-  chomp( my $taxnum = <STDIN> );
-  chomp( my $state = <STDIN> );
-  chomp( my $county = <STDIN> );
-  chomp( my $country = <STDIN> );
-  {
-    'taxnum'  => $taxnum,
-    'state'   => $state,
-    'county'  => $county,
-    'country' => $country,
-  };
-} ( 1 .. $n_cust_main_county );
-
-chomp( my $n_part_pkg = <STDIN> );
-my @part_pkg = map {
-  chomp( my $pkgpart = <STDIN> );
-  chomp( my $pkg = <STDIN> );
-  {
-    'pkgpart' => $pkgpart,
-    'pkg'     => $pkg,
-  };
-} ( 1 .. $n_part_pkg );
-
-chomp( my $n_svc_acct_pop = <STDIN> );
-my @svc_acct_pop = map {
-  chomp( my $popnum = <STDIN> );
-  chomp( my $city = <STDIN> );
-  chomp( my $state = <STDIN> );
-  chomp( my $ac = <STDIN> );
-  chomp( my $exch = <STDIN> );
-  {
-    'popnum' => $popnum,
-    'city'   => $city,
-    'state'  => $state,
-    'ac'     => $ac,
-    'exch'   => $exch,
-  };
-} ( 1 .. $n_svc_acct_pop );
-
-my $uaddr = sockaddr_un($fs_passwdd_socket);
-my $proto = getprotobyname('tcp');
-
-socket(Server,PF_UNIX,SOCK_STREAM,0) or die "socket: $!";
-unlink($fs_passwdd_socket);
-bind(Server, $uaddr) or die "bind: $!";
-listen(Server,SOMAXCONN) or die "listen: $!";
-
-my $paddr;
-
-for ( ; $paddr = accept(Client,Server); close Client) {
-
-  chop( my $command = <Client> );
-
-  if ( $command eq "signup_info" ) {
-
-    print Client join("\n", $n_cust_main_county,
-      map {
-        $_->{taxnum},
-        $_->{state},
-        $_->{county},
-        $_->{country},
-      } @cust_main_county
-    ), "\n";
-
-    print Client join("\n", $n_part_pkg,
-      map {
-        $_->{pkgpart},
-        $_->{pkg},
-      } @part_pkg
-    ), "\n";
-
-    print Client join("\n", $n_svc_acct_pop,
-      map {
-        $_->{popnum},
-        $_->{city},
-        $_->{state},
-        $_->{ac},
-        $_->{exch},
-      } @svc_acct_pop
-    ), "\n";
-
-  } elsif ( $operation eq "new_customer" ) {
-
-    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>;
-
-    print 
-      $first, $last, $ss, $company, $address1, $address2, $city, $county,
-      $state, $zip, $country, $daytime, $night, $fax, $payby, $payinfo,
-      $paydate, $payname, $invoicing_list, $pkgpart, $username, $password,
-      $popnum,
-    ;
-
-    my $error = <STDIN>;
-
-    print Client $error;
-
-  } else {
-    die "unexpected command from client: $command";
-  }
-
-}
-