Handle hostnames with upper-case letters
[webmin.git] / samba / swat.cgi
1 #!/usr/local/bin/perl
2 # swat.cgi
3 # Pass everything to samba's SWAT tool
4
5 require './samba-lib.pl';
6 &ReadParse();
7
8 # check acls
9
10 &error_setup("<blink><font color=red>$text{'eacl_aviol'}</font></blink>");
11 &error("$text{'eacl_np'} $text{'eacl_pcswat'}") unless $access{'swat'};
12
13 # Check is hosts allow is in force
14 &get_share("global");
15 if (&getval('allow hosts')) {
16         &ui_print_header(undef, $text{'error'}, "");
17         print &text('swat_msg3', $text{'sec_onlyallow'}), "<p>\n";
18         &foreign_require("inetd", "inetd-lib.pl");
19         local @inets = &foreign_call("inetd", "list_inets");
20         foreach $i (@inets) {
21                 if ($i->[3] eq 'swat' && $i->[1]) {
22                         # swat is configured in inetd!
23                         local $p = getservbyname('swat', 'tcp');
24                         $url = "http://$ENV{'SERVER_NAME'}:$p/";
25                         print &text('swat_msg4', "<a href='$url'>$url</a>"), "<p>\n";
26                         }
27                 }
28         &ui_print_footer("", $text{'index_sharelist'});
29         exit;
30         }
31
32 # Check if we have the password
33 &read_file("$module_config_directory/swat", \%swat) || &ask_password();
34
35 # Execute SWAT process
36 pipe(OUTr, OUTw);
37 pipe(INr, INw);
38 local $pid = fork();
39 if (!$pid) {
40         untie(*STDIN);
41         untie(*STDOUT);
42         untie(*STDERR);
43         open(STDIN, "<&INr");
44         open(STDOUT, ">&OUTw");
45         open(STDERR, ">&OUTw");
46         close(OUTr); close(INw);
47         undef %ENV;
48         exec($config{'swat_path'});
49         print "Exec failed : $!\n";
50         exit 1;
51         }
52 close(OUTw); close(INr);
53
54 # Feed HTTP request and read output
55 $auth = &encode_base64("$swat{'user'}:$swat{'pass'}");
56 $auth =~ s/\n//g;
57 select(INw); $| = 1; select(STDOUT);
58 $path = $ENV{'PATH_INFO'} || "/";
59 if ($ENV{'REQUEST_METHOD'} eq 'GET') {
60         print INw "GET $path?$in HTTP/1.0\n";
61         print INw "Authorization: basic $auth\n";
62         print INw "\n";
63         }
64 else {
65         print INw "POST $path HTTP/1.0\r\n";
66         print INw "Authorization: basic $auth\r\n";
67         print INw "Content-length: ",length($in),"\r\n";
68         print INw "Content-type: application/x-www-form-urlencoded\r\n";
69         print INw "\r\n",$in;
70         }
71 close(INw);
72 $reply = <OUTr>;
73 if ($reply =~ /\s401\s/) {
74         &ask_password();
75         }
76 if ($ENV{'PATH_INFO'} =~ /\.(gif|jpg|jpeg|png)$/i) {
77         # An image .. just output it
78         while(<OUTr>) { print; }
79         }
80 else {
81         # An HTML page .. fix up links
82         $url = "$gconfig{'webprefix'}/$module_name/swat.cgi";
83         while(<OUTr>) {
84                 s/src="(\/[^"]*)"/src="$url$1"/gi;
85                 s/href="(\/[^"]*)"/href="$url$1"/gi;
86                 s/action="(\/[^"]*)"/action="$url$1"/gi;
87                 s/"(\/status?[^"]*)"/"$url$1"/gi;
88                 print $_ if (!/<\/body>/i && !/<\/html>/i);
89                 }
90         print "<table width=100% cellpadding=0 cellspacing=0><tr><td>\n";
91         &ui_print_footer("/$module_name/", $text{'index_sharelist'}, 1);
92         print "</td> <td align=right><a href='/$module_name/logout.cgi'>",
93               "$text{'swat_logout'}</a></td> </tr></table></body></html>\n";
94         }
95
96 sub ask_password
97 {
98 &ui_print_header(undef, $text{'swat_title'}, "");
99 if (%swat) {
100         print $text{'swat_msg1'}, " <br>\n";
101         }
102 else {
103         print $text{'swat_msg2'}, " <br>\n";
104         }
105 print "<form action=swat_save.cgi>\n";
106 print "<center><table border>\n";
107 print "<tr $tb> <td><b>$text{'swat_list'}</b></td> </tr>\n";
108 print "<tr $cb> <td><table cellpadding=2>\n";
109 print "<tr> <td><b>$text{'swat_username'}</b></td>\n";
110 print "<td><input name=user size=20 value='$swat{'user'}'></td> </tr>\n";
111 print "<tr> <td><b>$text{'swat_password'}</b></td>\n";
112 print "<td><input name=pass size=20 type=password></td> </tr>\n";
113 print "</table></td></tr></table>\n";
114 print "<input type=submit value=\"", $text{'swat_login'},
115       "\"> <input type=reset value=\"", $text{'swat_clear'}, "\">\n";
116 print "</center></form>\n";
117 &ui_print_footer("", $text{'index_sharelist'});
118 exit;
119 }
120