Tweaked class comments in containerPanel
[ganymede.git] / webforms / gany_query.pl
blob8de5ea1f8c47911b8a209cdc93965cb2faa03a36
1 #!<##PERLEXE##>
2 #####################################################################
4 # Ganymede Query
6 # This script is used to make a query on the Ganymede server.
8 #####################################################################
9 use IPC::Open2;
10 use CGI;
11 use CGI::Carp qw/fatalsToBrowser/;
12 #####################################################################
14 # create the query with whatever CGI info we get from our environment
15 $query = new CGI;
17 $my_url = $query->url();
18 $tmpdir = "/tmp";
19 $xml_path = "<#XMLPATH#>";
20 $xmlclient = $xml_path . "/xmlclient";
22 # Yes, the software is smarter than you, if you didn't include bin
23 # when installWeb asked you for the location of the client utils.
25 if (!-f $xmlclient) {
26 $xmlclient = $xml_path . "/bin/xmlclient";
29 $query_label = "Submit Query";
30 $schema_label = "Retrieve Schema";
32 # write out the CGI header
34 if (!$query->param) {
35 print_headers();
36 print_default();
37 print_footers();
38 print $query->end_html;
39 exit 0;
40 } else {
41 if (!-f $xmlclient) {
42 print_headers();
43 print "<center><p>Error, can't find xmlclient</p></center>\n";
44 print_footers();
45 print $query->end_html;
46 exit 0;
49 $user = $query->param('user');
50 $password = $query->param('password');
51 $querystr = $query->param('querystr');
52 $submit = $query->param('submit');
54 if ($submit eq "") {
55 $submit = $query_label;
58 if ($submit eq $query_label) {
59 make_queryfile();
62 # we know that we can trust $filename, because we created that,
63 # and we know that the $password is safe, because we're passing
64 # that in via STDIN, but we need to be careful to make sure that
65 # they haven't slipped us a mickey on the username $user.
67 # we do have to allow colons and whitespace thereafter for admin
68 # persona names, though.
70 # absolutely no single quotes or back slash characters allowed,
71 # thankyouverymuch!
73 if ($user !~ /^[a-z]([a-z]|[0-9])*(:([a-z]|[0-9]|\s)+)?$/i) {
74 $user = "invalid_web_query_user";
77 # if they have any spaces in their name, convert to url escape
79 $user =~ s/ /%20/;
81 if ($submit eq $schema_label) {
82 $program = "$xmlclient 'username=$user' -dumpSchema 2>&1";
83 } elsif ($submit eq $query_label) {
84 $program = "$xmlclient 'username=$user' -queryfile $filename 2>&1";
87 eval {
88 open2(*README, *WRITEME, $program);
91 if ($@) {
92 if ($@ =~ /^open2/) {
93 $xml_output = "open2 failed: $!\n$@\n";
96 $xml_status = 1; # fail
97 } else {
98 print WRITEME "$password\n";
99 close(WRITEME);
101 $xml_output = "";
103 while (<README>) {
104 $xml_output .= $_;
107 close(README);
109 $xml_status = $? >> 8;
111 unlink($filename);
113 # cut out the interactive password prompt from xmlclient
115 $xml_output =~ s/^Password for.*\n//m;
118 if (($xml_status == 0)) {
119 print_success($xml_output);
120 } else {
122 print_headers();
124 # Couldn't login to server... the server is going down for some reason?
125 # Can't login to the Ganymede server.. semaphore disabled: schema edit
126 # Error, couldn't log in to server.. bad username or password?
128 # XML submission failed.
130 if ($xml_output =~ /semaphore disabled/) {
131 $xml_output = "The Ganymede server is not currently accepting logins.\nPlease try again later.";
134 # Couldn't login to server... bad username/password?
135 # Error, couldn't log in to server.. bad username or password?
136 # XML submission failed.
138 if ($xml_output =~ /bad username/) {
139 $xml_output = "You did not enter your current username and/or password correctly.\n\nPlease try again.";
142 print <<ERRORS;
143 <pre>
144 $xml_output
145 </pre>
146 ERRORS
148 print_footers();
149 print $query->end_html;
153 ######################################################################
155 # make_queryfile
157 ######################################################################
159 sub make_queryfile
161 # we want a really random filename
163 $randnum = int(rand 4096);
165 $filename = "$tmpdir/gany_query.$randnum.$$.txt"; #give temp query file random name
167 if (-f $filename) {
168 die "Error, $filename already exists!";
171 open(XMLF, ">$filename") || die "Couldn't write to $filename";
172 chmod 0600, $filename;
174 select XMLF;
175 print $querystr;
176 close(XMLF);
178 chmod 0600, $filename;
179 select STDOUT;
183 ######################################################################
185 # print_headers
187 ######################################################################
189 sub print_headers {
190 print $query->header;
192 print <<ENDSTARTHEAD;
193 <html>
194 <head>
195 <title>Ganymede Query</title>
197 <!-- Insert your CSS here -->
198 </head>
199 <body bgcolor="#FFFFFF">
200 ENDSTARTHEAD
202 print <<CUSTOMHEAD;
203 <!-- Insert your site-specific header here -->
204 CUSTOMHEAD
207 ######################################################################
209 # print_footers
211 ######################################################################
213 sub print_footers {
214 print <<FOOTER;
215 <!-- your custom footer goes here -->
216 FOOTER
219 ######################################################################
221 # print_default
223 ######################################################################
225 sub print_default {
227 print <<ENDDEFAULT;
228 <table border="0">
229 <tr>
230 <td align="left">
231 <a href="http://www.arlut.utexas.edu/gash2/"><img src="/images/ganymede_title2_sm.gif" border="0"></a>
232 </td>
233 <td width="100%" align="center">
234 <h1>Ganymede Query Utility</h1>
235 </td>
236 </tr>
238 <tr>
239 <td align="center">
240 <a href="http://www.arlut.utexas.edu/gash2/"><small>[Ganymede Home]</small></a>
241 </td>
242 <td width="100%" align="center">
243 <small><a href="http://tools.arlut.utexas.edu/gash2/doc/querylanguage/">Ganymede Query Language Guide</a></small>
244 </td>
245 </tr>
246 </table>
248 <hr noshade/>
249 <center>
251 <center>
252 <form method="post" action="$my_url" name="former">
253 <table width="60%" bgcolor="#ccffcc" border="1" cellpadding="2">
254 <tr bgcolor="#663366">
255 <td colspan="2" align="center">
256 <big><font color="ffffcc">Ganymede Query Utility</font></big>
257 </td>
258 </tr>
260 <tr>
261 <td align="right"><b>Query:</b></td>
262 <td><input type="text" size="120" name="querystr"></td>
263 </tr>
265 <tr>
266 <td align="right"><b>Username</b></td>
267 <td><input type="text" name="user"></td>
268 </tr>
270 <tr>
271 <td align=right><b>Password</b></td>
272 <td><input type="password" name="password"></td>
273 </tr>
275 <tr>
276 <td colspan="2" align="right"><input type="submit" name="submit" value="$query_label"><input type="submit" name="submit" value="$schema_label"></td>
277 </tr>
279 <tr bgcolor="#663366">
280 <td colspan="2">&nbsp;</td>
281 </tr>
283 </table>
284 </form>
285 </center>
287 ENDDEFAULT
290 ######################################################################
292 # print_success
294 # Outputs the $xml_output to the user with an appropriate MIME header
296 ######################################################################
298 sub print_success {
299 print $query->header("-type"=>"application/xml",
300 "-attachment"=>"ganymede_results.xml");
301 print $xml_output;