initial checkin
[freeside.git] / fs_webdemo / register.cgi
1 #!/usr/bin/perl -Tw
2
3 use strict;
4 use vars qw( $freeside_bin $freeside_test $freeside_conf
5              $datasrc $user $pass $x
6              @pw_set @saltset
7              $cgi $username $name $email $user_pw $crypt_pw $dbh $sth
8              $header $msg
9              );
10 use CGI;
11 #use CGI::Carp qw(fatalsToBrowser);
12 use DBI;
13 use Mail::Internet;
14 use Mail::Header;
15 use Date::Format;
16
17 $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';
18 $ENV{'SHELL'} = '/bin/sh';
19 $ENV{'IFS'} = " \t\n";
20 $ENV{'CDPATH'} = '';
21 $ENV{'ENV'} = '';
22 $ENV{'BASH_ENV'} = '';
23
24 $freeside_bin = '/home/freeside/bin/';
25 $freeside_test = '/home/freeside/test/';
26 $freeside_conf = '/usr/local/etc/freeside/';
27
28 $datasrc = 'DBI:mysql:http_auth';
29 $user = "freeside";
30 $pass = "maelcolm";
31
32 #my(@pw_set)= ( 'a'..'z', 'A'..'Z', '0'..'9', '(', ')', '#', '!', '.', ',' );
33 #my(@pw_set)= ( 'a'..'z', 'A'..'Z', '0'..'9' );
34 @pw_set = ( 'a'..'z', '0'..'9' );
35 @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
36
37 ###
38
39 $cgi = new CGI;
40
41 $username = $cgi->param('username');
42 $username =~ /^\s*([a-z][\w]{0,15})\s*$/i
43   or &idiot("Illegal username.  Please use 1-16 alphanumeric characters, and start your username with a letter.");
44 $username = lc($1);
45
46 $name = $cgi->param('name');
47 $name =~ /^([\w\-\,\. ]*)$/
48   or &idiot("Illegal name.  ".
49             "Only alphanumerics, the dash, comma and period are legal.");
50 $name = $1;
51
52 $email = $cgi->param('email');
53 $email =~ /^([\w\-\.\+]+\@[\w\-\.]+)$/
54   or &idiot("Illegal email address.");
55 $email = $1;
56
57 ###
58
59 $user_pw = join('',map($pw_set[ int(rand $#pw_set) ], (0..7) ) );
60 $crypt_pw = crypt($user_pw,$saltset[int(rand(64))].$saltset[int(rand(64))]);
61
62 ###
63
64   local $SIG{HUP} = 'IGNORE';
65   local $SIG{INT} = 'IGNORE';
66   local $SIG{QUIT} = 'IGNORE';
67   local $SIG{TERM} = 'IGNORE';
68   local $SIG{TSTP} = 'IGNORE';
69   local $SIG{PIPE} = 'IGNORE';
70
71 ###
72
73 $dbh = DBI->connect( $datasrc, $user, $pass, {
74         'AutoCommit' => 'true',
75 } ) or die "DBI->connect error: $DBI::errstr\n";
76 $x = $DBI::errstr; #silly; to avoid "used only once" warning
77
78 $sth = $dbh->prepare("INSERT INTO mysql_auth VALUES (". join(", ",
79   $dbh->quote($username),
80   $dbh->quote($crypt_pw),
81   $dbh->quote('freeside'),
82 ). ")" );
83
84 $sth->execute or &idiot($sth->errstr);
85
86 $dbh->disconnect or die $dbh->errstr;
87
88 ###
89
90 $|=1;
91 print $cgi->header;
92 print <<END;
93 <HTML>
94   <HEAD>
95     <TITLE>Freeside demo registration successful</TITLE>
96   </HEAD>
97   <BODY BGCOLOR="#FFFFFF">
98   <table>
99     <tr><td>
100     <p align=center>
101       <img border=0 alt="Silicon Interactive Software Design" src="http://www.sisd.com/freeside/small-logo.gif">
102     </td><td>
103     <center><font color="#ff0000" size=7>freeside demo registration successful</font></center>
104     </td></tr>
105   </table>
106   <P>Your sample database has been setup.  Your username, password, and URL
107     have been emailed to you.
108   </BODY>
109 </HTML>
110 END
111
112 ###
113
114 system("/usr/bin/mysqladmin --user=$user --password=$pass ".
115   "create $username >/dev/null");
116
117 open(MAPSECRETS, ">>${freeside_conf}mapsecrets")
118   or die "Can\'t open ${freeside_conf}mapsecrets: $!";
119 print MAPSECRETS "$username secrets.$username\n";
120 close MAPSECRETS;
121
122 open(SECRETS, ">${freeside_conf}secrets.$username")
123   or die "Can\'t open ${freeside_conf}secrets.$username: $!";
124 chmod 0600, "${freeside_conf}secrets.$username";
125 print SECRETS "DBI:mysql:$username\nfreeside\nmaelcolm\n";
126 close SECRETS;
127
128 mkdir "${freeside_conf}conf.DBI:mysql:$username", 0755;
129
130 open(ADDRESS, ">${freeside_conf}conf.DBI:mysql:$username/address")
131   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/address: $!";
132 print ADDRESS <<END;
133 Internet Service Provider, Inc.
134 1 Packet Blvd.
135 Router, MN  10010  
136
137 END
138 close ADDRESS;
139
140 open(DOMAIN, ">${freeside_conf}conf.DBI:mysql:$username/domain")
141   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/domain: $!";
142 print DOMAIN "this-is-an-example-domain.tld\n";
143 close DOMAIN;
144
145 open(HOME, ">${freeside_conf}conf.DBI:mysql:$username/home")
146   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/home: $!";
147 print HOME "/home\n";
148 close HOME;
149
150 open(INVOICE_FROM, ">${freeside_conf}conf.DBI:mysql:$username/invoice_from")
151   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/invoice_from: $!";
152 print INVOICE_FROM "$email\n";
153 close INVOICE_FROM;
154
155 open(LPR, ">${freeside_conf}conf.DBI:mysql:$username/lpr")
156   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/lpr: $!";
157 print LPR "cat >/dev/null\n";
158 close LPR;
159
160 mkdir "${freeside_conf}conf.DBI:mysql:$username/registries", 0755;
161 mkdir "${freeside_conf}conf.DBI:mysql:$username/registries/internic", 0755;
162 open(FROM, ">${freeside_conf}conf.DBI:mysql:$username/registries/internic/from")
163   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/registries/internic/from: $!";
164 print FROM "$email\n";
165 close FROM;
166 open(NAMESERVERS, ">${freeside_conf}conf.DBI:mysql:$username/registries/internic/nameservers")
167   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/registries/internic/nameservers: $!";
168 print NAMESERVERS <<END;
169 10.0.0.1 ns1.this-is-an-example-domain.tld
170 10.0.0.2 ns2.this-is-an-example-domain.tld
171 10.0.0.3 ns3.this-is-an-example-domain.tld
172 END
173 close NAMESERVERS;
174 open(TECH_CONTACT, ">${freeside_conf}conf.DBI:mysql:$username/registries/internic/tech_contact")
175   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/registries/internic/tech_contact: $!";
176 print TECH_CONTACT "EXAMPLE-INTERNIC-HANDLE\n";
177 close TECH_CONTACT;
178 system ("cp", "${freeside_conf}.domain-template.txt",
179         "${freeside_conf}conf.DBI:mysql:$username/registries/internic/template"
180        );
181 open(TO, ">${freeside_conf}conf.DBI:mysql:$username/registries/internic/to")
182   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/registries/internic/to: $!";
183 print TO "$email\n";
184 close TO;
185
186 open(SHELLS, ">${freeside_conf}conf.DBI:mysql:$username/shells")
187   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/shells: $!";
188 print SHELLS <<END;
189 /bin/sh
190 /bin/csh
191 /bin/bash
192 /bin/tcsh
193 /bin/ksh
194 /bin/passwd
195 /bin/true
196 /bin/false
197
198 END
199 close SHELLS;
200
201 open(SMTPMACHINE, ">${freeside_conf}conf.DBI:mysql:$username/smtpmachine")
202   or die "Can\'t open ${freeside_conf}conf.DBI:mysql:$username/smtpmachine: $!";
203 print SMTPMACHINE "localhost\n";
204 close SMTPMACHINE;
205
206 #make counter dir
207 mkdir("/usr/local/etc/freeside/counters.DBI:mysql:$username",0755)
208   or die "Can't create counter spooldir: $!";
209
210 system("${freeside_bin}fs-setup.webdemo", "$username");
211 system("${freeside_test}cgi-test",
212        "http://freeside.sisd.com/", $username, $user_pw);
213
214 ###
215
216 $ENV{SMTPHOSTS} = "localhost";
217 $ENV{MAILADDRESS} = 'ivan@sisd.com';
218 $header = Mail::Header->new( [
219   'From: ivan@sisd.com',
220   "To: $email",
221   'Cc: ivan-fsreg@sisd.com',
222   'Sender: ivan@sisd.com',
223   'Reply-To: ivan@sisd.com',
224   'Date: '. time2str("%a, %d %b %Y %X %z", time),
225   'Subject: Freeside demo information',
226 ] );
227 $msg = Mail::Internet->new(
228   'Header' => $header,
229   'Body' => [
230 "Hello $name <$email>,\n",
231 "\n",
232 "Your sample Freeside database has been setup.\n",
233 "\n",
234 "Point your web browswer at http://freeside.sisd.com/ and use the following\n",
235 "authentication information:\n",
236 "\n",
237 "Username: $username\n",
238 "Password: $user_pw\n",
239 "\n",
240 "You may wish to subscribe to the Freeside mailing list - send a blank\n",
241 "message to ivan-freeside-subscribe\@sisd.com.\n",
242 "\n",
243 "-- \n",
244 "Ivan Kohler <ivan\@sisd.com>\n",
245 "20 4,16 \* \* \* saytime\n",
246             ]
247 );
248 $msg->smtpsend or die "Can\'t send registration email!";
249
250 ###
251
252 sub idiot {
253   my($error)=@_;
254   print $cgi->header, <<END;
255 <HTML>
256   <HEAD>
257     <TITLE>Registration error</TITLE>
258   </HEAD>
259   <BODY BGCOLOR="#FFFFFF">
260     <CENTER>
261     <H4>Registration error</H4>
262     </CENTER>
263     <P><B>$error</B>
264     <P>Hit the <I>Back</I> button in your web browser, correct this mistake,
265        and submit the form again.
266   </BODY>
267 </HTML>
268 END
269   
270   exit;
271  
272 }