need to untaint the command line
[freeside.git] / fs_signup / fs_signupd
1 #!/usr/bin/perl -Tw
2 #
3 # fs_signupd
4 #
5 # This is run REMOTELY over ssh by fs_signup_server.
6 #
7
8 use strict;
9 use Socket;
10
11 my($fs_passwdd_socket)="/usr/local/freeside/fs_signupd_socket";
12
13 $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';
14 $ENV{'SHELL'} = '/bin/sh';
15 $ENV{'IFS'} = " \t\n";
16 $ENV{'CDPATH'} = '';
17 $ENV{'ENV'} = '';
18 $ENV{'BASH_ENV'} = '';
19
20 $|=1;
21
22 chomp( my $n_cust_main_county = <STDIN> );
23 my @cust_main_county = map {
24   chomp( my $taxnum = <STDIN> );
25   chomp( my $state = <STDIN> );
26   chomp( my $county = <STDIN> );
27   chomp( my $country = <STDIN> );
28   {
29     'taxnum'  => $taxnum,
30     'state'   => $state,
31     'county'  => $county,
32     'country' => $country,
33   };
34 } ( 1 .. $n_cust_main_county );
35
36 chomp( my $n_part_pkg = <STDIN> );
37 my @part_pkg = map {
38   chomp( my $pkgpart = <STDIN> );
39   chomp( my $pkg = <STDIN> );
40   {
41     'pkgpart' => $pkgpart,
42     'pkg'     => $pkg,
43   };
44 } ( 1 .. $n_part_pkg );
45
46 chomp( my $n_svc_acct_pop = <STDIN> );
47 my @svc_acct_pop = map {
48   chomp( my $popnum = <STDIN> );
49   chomp( my $city = <STDIN> );
50   chomp( my $state = <STDIN> );
51   chomp( my $ac = <STDIN> );
52   chomp( my $exch = <STDIN> );
53   {
54     'popnum' => $popnum,
55     'city'   => $city,
56     'state'  => $state,
57     'ac'     => $ac,
58     'exch'   => $exch,
59   };
60 } ( 1 .. $n_svc_acct_pop );
61
62 my $uaddr = sockaddr_un($fs_passwdd_socket);
63 my $proto = getprotobyname('tcp');
64
65 socket(Server,PF_UNIX,SOCK_STREAM,0) or die "socket: $!";
66 unlink($fs_passwdd_socket);
67 bind(Server, $uaddr) or die "bind: $!";
68 listen(Server,SOMAXCONN) or die "listen: $!";
69
70 my $paddr;
71
72 for ( ; $paddr = accept(Client,Server); close Client) {
73
74   chop( my $command = <Client> );
75
76   if ( $command eq "signup_info" ) {
77
78     print Client join("\n", $n_cust_main_county,
79       map {
80         $_->{taxnum},
81         $_->{state},
82         $_->{county},
83         $_->{country},
84       } @cust_main_county
85     ), "\n";
86
87     print Client join("\n", $n_part_pkg,
88       map {
89         $_->{pkgpart},
90         $_->{pkg},
91       } @part_pkg
92     ), "\n";
93
94     print Client join("\n", $n_svc_acct_pop,
95       map {
96         $_->{popnum},
97         $_->{city},
98         $_->{state},
99         $_->{ac},
100         $_->{exch},
101       } @svc_acct_pop
102     ), "\n";
103
104   } elsif ( $operation eq "new_customer" ) {
105
106     my(
107       $first, $last, $ss, $company, $address1, $address2, $city, $county,
108       $state, $zip, $country, $daytime, $night, $fax, $payby, $payinfo,
109       $paydate, $payname, $invoicing_list, $pkgpart, $username, $password,
110       $popnum,
111     ) = <Client>;
112
113     print 
114       $first, $last, $ss, $company, $address1, $address2, $city, $county,
115       $state, $zip, $country, $daytime, $night, $fax, $payby, $payinfo,
116       $paydate, $payname, $invoicing_list, $pkgpart, $username, $password,
117       $popnum,
118     ;
119
120     my $error = <STDIN>;
121
122     print Client $error;
123
124   } else {
125     die "unexpected command from client: $command";
126   }
127
128 }
129