]> andersk Git - moira.git/blob - webmoira/mit/moira/MoiraServlet.java
Added WebMoira sources
[moira.git] / webmoira / mit / moira / MoiraServlet.java
1 package mit.moira;
2
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 import java.io.*;
6 import java.util.*;
7 import java.sql.SQLException;
8 import java.sql.ResultSet;
9 import java.sql.ResultSetMetaData;
10 import java.text.SimpleDateFormat;
11 import java.util.Date;
12 import java.util.ResourceBundle;
13
14 public class MoiraServlet extends HttpServlet {
15     static final String MOIRA_SERVER = "moira.mit.edu";
16     Object LOCK = new Object(); // Used to synchronize Moira authentication
17                                 // with the ticket fetching thread
18     Kticket kt = new Kticket("jis5", "foobar", "ATHENA.MIT.EDU", LOCK);
19     boolean ktinit = false;
20     private static final int MAXDISPLAY = 10;
21     Hashtable FileParts = new Hashtable();
22     Hashtable FileTimes = new Hashtable();
23     static final SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
24     static final int KE_RD_AP_BADD = 39525414; // This is a kludge
25
26
27     public synchronized void service(HttpServletRequest request, HttpServletResponse response) {
28         System.err.println("MoiraSerlvet: Service");
29         System.err.println("---------------------");
30
31         if (!ktinit) {          // Once only initialization
32             ktinit = true;
33             Thread t = new Thread(kt);
34             t.start();
35         }
36
37         String msg = null;
38
39         Hashtable qv = new Hashtable();
40
41         String modifier = "";
42
43         try {                   // Get Parameters
44             Enumeration e = request.getParameterNames();
45             while (e.hasMoreElements()) {
46                 String pname = (String)e.nextElement();
47                 String [] pvaluearray = request.getParameterValues(pname);
48                 String pvalue = "";
49                 if (pvaluearray.length > 1) {
50                     for (int i = 0; i < pvaluearray.length; i++)
51                         pvalue += pvaluearray[i];
52                 } else pvalue = pvaluearray[0];
53                     
54                 System.err.println(pname + " = " + pvalue);
55                 qv.put(pname, pvalue);
56             }
57
58             modifier = (String)qv.get("modifier");
59             if (modifier == null) modifier = "";
60
61             if (modifier.equals("showform")) {
62                 do_showform(qv, request, response);
63                 return;
64             } else if (modifier.equals("showurl")) {
65                 do_showurl(qv, request, response);
66                 return;
67             } else if (modifier.equals("makesession")) {
68                 request.getSession(true);
69                 return;
70             }
71
72             String operation = (String) qv.get("operation");
73             if (operation == null) {
74                 try {
75                     DataOutputStream out = new DataOutputStream(response.getOutputStream());
76                     response.setContentType("text/html");
77                     if (modifier.equals("getfile"))
78                         out.writeBytes("You need to select an operation from the list on the left!");
79                     else if (modifier.equals("displayonly"))
80                         out.writeBytes("error");
81                     else if (modifier.equals("getlistname")) {
82                         out.writeBytes(do_getlistinput(qv, request, response));
83                     }
84                     out.flush();
85                 } catch (Exception ee) {
86                     ee.printStackTrace();
87                 }
88                 return;
89             }
90             if (operation.charAt(operation.length()-2) == '\r') // Trim newline stuff
91                 operation = operation.substring(0, operation.length() - 2);
92             if (modifier.equals("getlistname")) {
93                 msg = do_getlistinput(qv, request, response);
94                 if (msg.equals("")) return;
95             } else if (modifier.equals("getfile")) {
96                 msg = getfile(operation);
97             } else if (operation.equals("getmembers")) {
98                 if (modifier.equals("displayonly")) {
99                     msg = "show members";
100                 } else
101                     msg = do_getmembers(qv, request, response);
102                 if (msg.equals("")) return;
103             } else if (operation.equals("addfinal")) {
104                 if (modifier.equals("displayonly")) {
105                     msg = "added members";
106                 } else
107                     msg = do_addfinal(qv, request, response);
108                 if (msg.equals("")) return;
109             } else if (operation.equals("editme")) {
110                 if (modifier.equals("displayonly")) {
111                     msg = "add or remove yourself from a list";
112                 } else
113                     msg = do_editme(qv, request, response);
114                 if (msg.equals("")) return;
115             } else if (operation.equals("removemembers")) {
116                 if (modifier.equals("displayonly")) {
117                     msg = "edit/remove members";
118                 } else 
119                     msg = do_removemembers(qv, request, response);
120                 if (msg.equals("")) return;
121             } else if (operation.equals("delmembers")) {
122                 if (modifier.equals("displayonly")) {
123                     msg = "edit/remove members";
124                 } else 
125                     msg = do_delmember(qv, request, response);
126                 if (msg.equals("")) return;
127             } else if (operation.equals("delconfirm")) {
128                 if (modifier.equals("displayonly")) {
129                     msg = "member deleted";
130                 } else 
131                     msg = do_delconfirm(qv, request, response);
132                 if (msg.equals("")) return;
133             } else if (operation.equals("addmember")) {
134                 if (modifier.equals("displayonly")) {
135                     msg = "add member(s)";
136                 } else
137                     msg = do_addmember(qv, request, response);
138                 if (msg.equals("")) return;
139             } else if (operation.equals("addme")) {
140                 if (modifier.equals("displayonly")) {
141                     msg = "added to list";
142                 } else
143                     msg = do_addremme(qv, request, response, true);
144             } else if (operation.equals("delme")) {
145                 if (modifier.equals("displayonly")) {
146                     msg = "removed from list";
147                 } else
148                     msg = do_addremme(qv, request, response, false);
149             } else if (operation.equals("displaylistinfo")) {
150                 if (modifier.equals("displayonly")) {
151                     msg = "display list characteristics";
152                 } else
153                     msg = do_showlistinfo(qv, request, response);
154             } else if (operation.equals("updatelistinfo")) {
155                 if (modifier.equals("displayonly")) {
156                     msg = "update list characteristics";
157                 } else
158                     msg = do_updatelistinfo(qv, request, response);
159             } else if (operation.equals("updatelistinfoconf")) {
160                 if (modifier.equals("displayonly")) {
161                     msg = "update list characteristics";
162                 } else
163                     msg = do_updatelistinfoconf(qv, request, response);
164             } else {
165                 sendError("Unimplemented Operation: " + (String)qv.get("operation"), response, true);
166                 return;
167             }
168
169         } catch (AuthenticationError e) {
170             msg = "<b>" + e.getMessage() + "</b><p>\r\n";
171         } catch (Exception e) {
172             msg += "<h1>Error during Processing</h1>\r\n";
173             msg += "Please try again later</HTML>\r\n";
174             e.printStackTrace();
175         }
176     
177         try {
178             DataOutputStream out = new DataOutputStream(response.getOutputStream());
179             response.setContentType("text/html");
180             if (!MOIRA_SERVER.equals("moira.mit.edu") && modifier.equals(""))
181                 out.writeBytes("<font color=red>Moira Server: " + MOIRA_SERVER + "<br></font>\r\n");
182             out.writeBytes(msg);
183             out.flush();
184         } catch (Exception e) {
185             e.printStackTrace();
186         }
187     
188     }
189     void sendError(String message, HttpServletResponse response, boolean showheader) {
190         String msg;
191         if (showheader) {
192             msg = "<HTML><TITLE>Error</TITLE></HEAD><BODY BGCOLOR=#FFFFFF>\r\n";
193             msg += "<H1>Error</H1>\r\n";
194             msg += message;
195             msg += "<p></body></html>\r\n";
196         } else msg = "<b>" + message + "</b>";
197         try {
198             DataOutputStream out = new DataOutputStream(response.getOutputStream());
199             response.setContentType("text/html");
200             out.writeBytes(msg);
201             out.flush();
202         } catch (Exception e) {
203             e.printStackTrace();
204         }
205     }
206
207     /**
208      * Authenticate the user.
209      *
210      * @param request The HttpServlet request object
211      * @return String value of the Kerberos username who owns this request
212      * @exception AuthenticationError if authentication cannot be performed
213      */
214     String do_authentication(HttpServletRequest request) throws AuthenticationError {
215
216         // Attempt to obtain authenticated username from the session
217
218         HttpSession session = request.getSession(true);
219         String kname = (String) session.getValue("kname");
220         if (kname != null) return (kname);
221
222         String client_email = (String)request.getAttribute("org.apache.jserv.SSL_CLIENT_EMAIL");
223         if (client_email == null)
224             throw new AuthenticationError("You must use a Certificate to access this service.");
225         
226         // Need to remove the @MIT.EDU portion
227         int i = client_email.indexOf('@');
228         if (i == -1)
229             throw new AuthenticationError("Malformed or non-MIT Certificate, shouldn't happen!");
230         if (!client_email.substring(i+1).equals("MIT.EDU"))
231             throw new AuthenticationError("Certificate Email Address must end in MIT.EDU");
232         kname = client_email.substring(0, i);
233         session.putValue("kname", kname);
234         return (kname);
235     }
236
237     String do_getmembers(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
238         String kname = do_authentication(request);
239
240         String msg = null;
241         String arg = (String) qv.get("list");
242         if (arg == null || arg.equals("")) {
243             msg = "<p>Argument is required</p>";
244             return (msg);
245         }
246         
247         // Obtain the list of members stashed in the session object
248         // If this is the first call to do_getmembers for this list,
249         // we won't have one in which case we will obtain it from Moira
250         // below
251
252         String list = "";
253         Member [] members = null;
254         HttpSession session = request.getSession(true);
255         if (session != null) {
256             list = (String)session.getValue("list");
257             if (list == null) list = "";
258             members = (Member []) session.getValue("members");
259         }
260         if (!list.equals(arg)) // Different list from argument, new session
261             members = null;     // Force obtaining members from Moira
262
263         // Determine offset of list to view
264         int offset = 0;
265         String tmp = (String)qv.get("offset");
266         if (tmp != null)
267             offset = Integer.parseInt(tmp);
268
269         boolean showall = false;
270         if (offset < 0) showall = true;
271
272         if (members == null) {
273             MoiraConnect mc = null;
274             try {
275                 mc = connect();
276                 mc.proxy(kname);
277                 members = mc.get_members_of_list(arg);
278                 mc.disconnect();
279                 mc = null;
280                 if (members != null)
281                     session.putValue("members", members);
282                 session.putValue("list", arg);
283             } catch (MoiraException m) {
284                 try {
285                     msg = "<P><b>\r\n";
286                     msg += m.getMessage();
287                     msg += "</b></P>\r\n";
288                     msg += "<!\r\n";
289                     CharArrayWriter err = new CharArrayWriter();
290                     PrintWriter perr = new PrintWriter(err);
291                     m.printStackTrace(perr);
292                     perr.flush();
293                     msg += err.toString();
294                     msg += "!>\r\n";
295                     return (msg);
296                 } catch (Exception e) {
297                     e.printStackTrace();
298                 }
299             } finally {
300                 if (mc != null) mc.disconnect();
301             }
302         }
303
304         // Do the actual display of the members
305         if (members ==  null)
306             return("<b>No members for list " + arg + "</b>");
307             
308         msg = "<table border=0>\r\n";
309         msg += "<tr><td>&nbsp;</td><td><table border=1 cellpadding=2>\r\n";
310         msg += "<tr><td colspan=2><b>Members of list: " + arg + "</b></td></tr>\r\n";
311         int len = offset + MAXDISPLAY;
312         if (len > members.length) len = members.length;
313         if (showall) {
314             offset = 0;
315             len = members.length;
316         }
317         for (int i = offset; i < len; i++) {
318             msg += "<tr><td>" + members[i].getMemberType() + "</td>";
319             msg += "<td>" + members[i].getMemberId() + "</td></tr>\r\n";
320         }
321         msg += "</table></td><td>&nbsp;</td></tr><tr>\r\n";
322         if ((offset > 0) && !showall) {
323             msg += "<td width=50><form method=POST action=\"" +
324                 response.encodeUrl("showresult.jhtml") + "\">\r\n";
325             msg += "<input type=hidden name=operation value=getmembers>";
326             msg += "<input type=hidden name=offset value=\"" + (offset - MAXDISPLAY) + "\">\r\n";
327             msg += "<input type=hidden name=list value=\"" + arg + "\">";
328             msg += "<input type=submit value=\"Previous\"></form></td>\r\n";
329         } else
330             msg += "<td width=50>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>";
331         if (!showall && ((offset > 0) || (members.length > len))) {
332             msg += "<td width=50><form method=POST action=\"" +
333                 response.encodeUrl("showresult.jhtml") + "\">\r\n";
334             msg += "<input type=hidden name=operation value=getmembers>";
335             msg += "<input type=hidden name=offset value=\"-1\">";
336             msg += "<input type=hidden name=list value=\"" + arg + "\">";
337             msg += "<input type=submit value=\"Show All\"></form></td>\r\n";
338         } else
339             msg += "<td width=50>&nbsp;</td>";
340         if (members.length > len && !showall) {
341             msg += "<td width=50><form method=POST action=\"" +
342                 response.encodeUrl("showresult.jhtml") + "\">\r\n";
343             msg += "<input type=hidden name=operation value=getmembers>";
344             msg += "<input type=hidden name=offset value=\"" + (offset + MAXDISPLAY) + "\">\r\n";
345             msg += "<input type=hidden name=list value=\"" + arg + "\">";
346             msg += "<input type=submit value=\"Next\"></form></td>\r\n";
347         } else
348             msg += "<td width=50>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>";
349         msg += "</tr>\r\n";
350         msg += "</table>\r\n";
351         return (msg);
352     }
353
354     void do_showform(Hashtable qv, HttpServletRequest request, HttpServletResponse response) {
355         String server = request.getServerName();
356         if (server.indexOf(".") == -1)
357             server += ".mit.edu"; // MIT Specific kludge!!! XXX
358         String msg = "<form method=post action=\"" + response.encodeUrl("https://" + server + ":445/moira/showresult.jhtml") + "\">";
359         try {
360             DataOutputStream out = new DataOutputStream(response.getOutputStream());
361             response.setContentType("text/html");
362             out.writeBytes(msg);
363             out.flush();
364         } catch (Exception e) {
365             e.printStackTrace(); // Nothing else I can do here
366         }
367     }
368         
369     void do_showurl(Hashtable qv, HttpServletRequest request, HttpServletResponse response) {
370         HttpSession session = request.getSession(true); // Sigh, have to create the session here if it doesn't already exist.
371         String msg = "<a href=\"" + response.encodeUrl((String)qv.get("url"))
372             + "\">";
373         try {
374             DataOutputStream out = new DataOutputStream(response.getOutputStream());
375             response.setContentType("text/html");
376             out.writeBytes(msg);
377             out.flush();
378         } catch (Exception e) {
379             e.printStackTrace(); // Nothing else I can do here
380         }
381     }
382
383     String do_getlistinput(Hashtable qv, HttpServletRequest request, HttpServletResponse response) {
384         HttpSession session = request.getSession(false);
385         String list = null;
386         list = (String) qv.get("list");
387         if ((list == null) && (session != null)) list = (String) session.getValue("list");
388         if (list == null) list = "";
389         return("<input name=list value=\"" + list + "\" length=15 size=12 maxlength=40>\r\n");
390     }
391
392     String do_addmember(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
393         String msg = "";
394         String list = (String) qv.get("list");
395         if (list == null || list.equals("")) {
396             msg = "<p>Argument is required</p>";
397             return (msg);
398         }
399         
400         String kname = do_authentication(request);
401
402         HttpSession session = request.getSession(true);
403
404         MoiraConnect mc = null;
405         ListInfo li = null;
406         try {
407             mc = connect();
408             mc.proxy(kname);
409             li = mc.get_list_info(list);
410         } catch (MoiraException m) {
411             msg += "Error getting list info: " + m.getMessage();
412                     msg += "<!\r\n";
413             CharArrayWriter err = new CharArrayWriter();
414             PrintWriter perr = new PrintWriter(err);
415             m.printStackTrace(perr);
416             perr.flush();
417             msg += err.toString();
418             msg += "!>\r\n";
419             return (msg);
420         } finally {
421             try {
422                 if (mc != null) mc.disconnect();
423                 mc = null;
424             } catch (Exception e) {
425             }
426         }
427
428         String list_description = "";
429         if (li != null) list_description = descript(li.description);
430
431         msg += "<form method=post action=\"" +
432             response.encodeUrl("showresult.jhtml") + "\">\r\n";
433         msg += "        <table border=1 cellpadding=2>\r\n          <tr> \r\n            <td colspan=2> \r\n              <p><b>Add member(s) to list " + list + "<br>\r\n</b>Description: " + list_description + "<br>\r\n                (you may enter more than one member of the same type by listing \r\n                each member on its own line)</p>\r\n            </td>\r\n          </tr>\r\n          <tr> \r\n            <td> \r\n              <select name=type>\r\n                <option value=\"USER\" selected>user</option>\r\n                <option value=\"STRING\">string</option>\r\n                <option value=\"LIST\">list</option>\r\n              </select>\r\n            </td>\r\n            <td> \r\n              <textarea name=\"member\" cols=\"20\" rows=\"4\"></textarea>\r\n            </td>\r\n          </tr>\r\n        </table>\r\n";
434         msg += "<input type=hidden name=list value=\"" + list + "\">\r\n";
435         msg += "<input type=hidden name=operation value=addfinal>\r\n";
436         msg += "<input type=submit name=submit value=\"Add Member(s)\">\r\n";
437         session.putValue("list", list);
438         session.removeValue("members"); // In case we had them from old list
439         return (msg);
440     }
441
442     String do_editme(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
443         String msg = null;
444         String arg = (String) qv.get("list");
445         if (arg == null || arg.equals("")) {
446             msg = "<p>Argument is required</p>";
447             return (msg);
448         }
449         
450         String kname = do_authentication(request);
451
452         HttpSession session = request.getSession(true);
453
454         MoiraConnect mc = null;
455         boolean found = false;
456         boolean sublists = false;
457         Member [] members = null;
458         try {
459             mc = connect();
460             mc.proxy(kname);
461             members = mc.get_members_of_list(arg);
462             if (members != null) {
463                 for (int i = 0; i < members.length; i++) {
464                     if (members[i].getMemberId().equals(kname)) {
465                         found = true;
466                         if (sublists) break;
467                     }
468                     if (members[i].getMemberType().equals("LIST")) {
469                         sublists = true;
470                         if (found) break;
471                     }
472                 }
473             }
474             mc.disconnect();
475             mc = null;
476         } catch (MoiraException m) {
477             try {
478                 msg = "<P><b>\r\n";
479                 msg += m.getMessage();
480                 msg += "</b></P>\r\n";
481                 msg += "<!\r\n";
482                 CharArrayWriter err = new CharArrayWriter();
483                 PrintWriter perr = new PrintWriter(err);
484                 m.printStackTrace(perr);
485                 perr.flush();
486                 msg += err.toString();
487                 msg += "!>\r\n";
488                 return (msg);
489             } catch (Exception e) {
490                 e.printStackTrace();
491             }
492         } finally {
493             if (mc != null) mc.disconnect();
494         }
495         msg = "You are " + (found ? "" : "not ") + "a member of the list <b>" + arg + "</b>.<br>\r\n";
496         if (!found && sublists)
497             msg += "Note: You may be a member of a sublist of <b>" + arg + "</b>. You may wish to check the sublists by using the <b>show list members</b> function.<br>\r\n";
498         msg += "<form method=POST action=\"" + response.encodeUrl("showresult.jhtml") + "\">\r\n";
499         msg += "<input type=hidden name=list value=\"" + arg + "\">\r\n";
500         if (found)
501             msg += "<input type=hidden name=operation value=delme>\r\n";
502         else
503             msg += "<input type=hidden name=operation value=addme>\r\n";
504         msg += "<input name=submit type=submit value=\"" + (found ? "Remove Me" : "Add Me") + "\">\r\n";
505         msg += "</form>";
506         if (members != null) {
507             session.putValue("list", arg);
508             session.putValue("members", members);
509         }
510         return (msg);
511     }
512
513     String do_addremme(Hashtable qv, HttpServletRequest request, HttpServletResponse response, boolean add) throws AuthenticationError {
514         HttpSession session = request.getSession(false); // Better be one
515         if (session == null) {
516             return("<p>Could not proceed, has it been 30 minutes since you last interaction. If so, back up and try again.</p>");
517         }
518
519         String kname = do_authentication(request);
520
521         String msg = null;
522         String listname = (String) session.getValue("list");
523         if (listname == null) {
524             return("<p>Could not find list name (shouldn't happen).</p>");
525         }
526         MoiraConnect mc = null;
527         try {
528             mc = connect();
529             mc.proxy(kname);
530             if (!add) 
531                 mc.delete_member_from_list(listname, "USER", kname);
532             else
533                 mc.add_member_to_list(listname, "USER", kname);
534         } catch (MoiraException m) {
535             msg = "<p><b>Unable to " + (add? "add" : "remove") + " you " + (add? "to" : "from") +  " the " + listname + " list.<br>\r\n";
536             msg += "The error from Moira was: " + m.getMessage() + "</b></p>";
537             msg += "<!\r\n";
538             CharArrayWriter err = new CharArrayWriter();
539             PrintWriter perr = new PrintWriter(err);
540             m.printStackTrace(perr);
541             perr.flush();
542             msg += err.toString();
543             msg += "!>\r\n";
544             return (msg);
545         } finally {
546             try {
547                 if (mc != null) mc.disconnect();
548             } catch (Exception e) {
549             }
550         }
551         if (add) msg = "You have been added to the <b>" + listname + "</b> list.";
552         else msg = "You have been removed from the <b>" + listname + "</b> list.";
553         return (msg);
554     }
555
556     String do_removemembers(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
557         Delmember [] del = null;
558         String msg = null;
559         String arg = (String) qv.get("list");
560         if (arg == null || arg.equals("")) {
561             msg = "<p>Argument is required</p>";
562             return (msg);
563         }
564         
565         String kname = do_authentication(request);
566
567         HttpSession session = request.getSession(true);
568
569         MoiraConnect mc = null;
570         try {
571             mc = connect();
572             mc.proxy(kname);
573             Member [] members = mc.get_members_of_list(arg);
574             if (members == null) {
575                 return("<P><b>No such list or empty list</b></p>.");
576             }
577             del = new Delmember[members.length];
578             for (int i = 0; i < members.length; i++) {
579                 del[i] = new Delmember(members[i]);
580             }
581             mc.disconnect();
582             mc = null;
583             session.putValue("list", arg);
584             session.removeValue("members"); // In case left over from previous call
585             session.putValue("delmembers", del);
586         } catch (MoiraException m) {
587             try {
588                 msg = "<P><b>\r\n";
589                 msg += m.getMessage();
590                 msg += "</b></P>\r\n";
591                 msg += "<!\r\n";
592                 CharArrayWriter err = new CharArrayWriter();
593                 PrintWriter perr = new PrintWriter(err);
594                 m.printStackTrace(perr);
595                 perr.flush();
596                 msg += err.toString();
597                 msg += "!>\r\n";
598             } catch (Exception e) {
599                 e.printStackTrace();
600             }
601         } finally {
602             if (mc != null) mc.disconnect();
603         }
604         return (do_remdisplay(qv, request, response, del, 0));
605     }
606
607     String do_remdisplay(Hashtable qv, HttpServletRequest request, HttpServletResponse response, Delmember [] del, int offset) {
608         // Offset = -1 means show everybody
609         boolean showall = false;
610         if (offset < 0) {
611             showall = true;
612             offset = 0;
613         }
614         String msg = "<h2>Select Members to Delete</h2>\r\n";
615         if (((offset > 0) || del.length > MAXDISPLAY) && !showall)
616             msg += "<p><font color=red>Note: Selections are remembered when you select the \"Previous\" and \"Next Buttons\".</font></p>\r\n";
617         msg += "<form method=POST action=\"" +
618             response.encodeUrl("showresult.jhtml") + "\">\r\n";
619         msg += "<table border=0><tr><td></td><td>\r\n";
620         msg += "<table border=1 cellpadding=2>\r\n";
621         int len;
622         if (showall) len = del.length;
623         else len = offset + MAXDISPLAY;
624         if (del.length < len)
625             len = del.length;
626         for (int i = offset; i < len; i++) {
627             msg += "<tr><td><input type=checkbox name=selected value=\" " + i + "\"";
628             if (del[i].marked) msg += " checked";
629             msg += "></td><td>" + del[i].member.getMemberType() + "</td>";
630             msg += "<td>" + del[i].member.getMemberId() + "</td></tr>\r\n";
631         }
632         msg += "</table></td>\r\n";
633         msg += "<td><input type=hidden name=operation value=delmembers></td></tr>\r\n";
634         if (offset > 0)
635             msg += "<td><input type=submit name=dodel value=\"Previous\"></td>";
636         else
637             msg += "<td width=50>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>";
638         if (!showall && (del.length > MAXDISPLAY))
639             msg += "<td><input type=submit name=dodel value=\"Show All\"></td>";
640         else msg += "<td width=50>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>";
641         if (((offset + MAXDISPLAY) < del.length) && !showall)
642             msg += "<td><input type=submit name=dodel value=\"Next\"></td></tr>\r\n";
643         else msg += "<td width=50>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td></tr>\r\n";
644         msg += "<tr><td></td><td><input type=submit name=dodel value=\"Delete Selected\"></td><td></td></tr></table></form>\r\n";
645         HttpSession session = request.getSession(false);
646         session.putValue("offset", new Integer(offset));
647         return (msg);
648     }
649
650
651     String do_delmember(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
652         String kname = do_authentication(request);
653
654         HttpSession session = request.getSession(false); // Better be one
655         if (session == null) {
656             return("<p>Could not proceed, has it been 30 minutes since you last interaction. If so, back up and try again.</p>");
657         }
658
659         Delmember [] del = (Delmember []) session.getValue("delmembers");
660         if (del == null) 
661             return("<p>Could not proceed, membership list doesn't exist, this should not happen!</p>");
662         Integer OffsetO = (Integer) session.getValue("offset");
663         if (OffsetO == null) {  // Hmmm....
664             OffsetO = new Integer(0);
665         }
666         
667         int offset = OffsetO.intValue();
668
669         String dodel = (String)qv.get("dodel"); // This is the submit button
670         if (dodel == null)
671             return("<p>Could not proceed, submit button incorrect, shouldn't happen.</p>");
672
673         // Process the selections on this form
674
675         int last = offset + MAXDISPLAY;
676         if (last > del.length) last = del.length;
677         for (int i = offset; i < last; i++) // Clear marked bits for displayed
678             del[i].marked = false;          // entries
679
680         String selected = (String)qv.get("selected");
681         if (selected == null) selected = ""; // None selected
682
683         StreamTokenizer tk = new StreamTokenizer(new StringReader(selected));
684         try {
685             tk.parseNumbers();
686             while (tk.nextToken() != StreamTokenizer.TT_EOF) {
687                 if (tk.ttype != StreamTokenizer.TT_NUMBER) continue;
688                 int v = (int) tk.nval;
689                 del[v].marked = true;
690             }
691         } catch (IOException e) {
692             e.printStackTrace();
693             return("<p>Exception while processing...</p>");
694         }
695         
696         if (dodel.equals("Next"))
697             return(do_remdisplay(qv, request, response, del, offset + MAXDISPLAY));
698         if (dodel.equals("Previous"))
699             return(do_remdisplay(qv, request, response, del, offset - MAXDISPLAY));
700         if (dodel.equals("Show All"))
701             return(do_remdisplay(qv, request, response, del, -1));
702         if (!dodel.equals("Delete Selected"))
703             return("<p>Cannot proceed, bad submit value, should not happen</p>");
704         // At this point we are going to display a list of who will be
705         // deleted and offer a confirmation.
706
707         String listname = (String) session.getValue("list");
708         if (listname == null) {
709             return("<p>Could not find list name (shouldn't happen).</p>");
710         }
711
712         // Check to see if anyone will be removed
713
714         boolean havesome = false;
715         for (int i = 0; i < del.length; i++) {
716             if (del[i].marked) {
717                 havesome = true;
718                 break;
719             }
720         }
721         if (!havesome)
722             return("No members selected to be removed");
723
724         // Some will be, so throw up confirmation dialog
725
726         String msg = "<h2>Please Confirm Deletion of:</h2>\r\n";
727         msg += "<table border=1 cellpadding=2>\r\n";
728         for (int i = 0; i < del.length; i++) {
729             if (del[i].marked) {
730                 msg += "<tr><td>" + del[i].member.getMemberType() + "</td>";
731                 msg += "<td>" + del[i].member.getMemberId() + "</td></tr>\r\n";
732             }
733         }
734         msg += "</table>\r\n";
735         msg += "<form method=POST action=\"" +
736             response.encodeUrl("showresult.jhtml") + "\">\r\n";
737         msg += "<input type=hidden name=operation value=delconfirm>\r\n";
738         msg += "<input type=submit value=\"Confirm Deletion\">\r\n";
739         msg += "</form>\r\n";
740         return (msg);
741     }
742
743     String do_delconfirm(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
744
745         String kname = do_authentication(request);
746
747         String msg = "";
748
749         HttpSession session = request.getSession(false); // Better be one
750         if (session == null) {
751             return("<p>Could not proceed, has it been 30 minutes since you last interaction. If so, back up and try again.</p>");
752         }
753
754         String listname = (String)session.getValue("list");
755
756         Delmember [] del = (Delmember []) session.getValue("delmembers");
757         if (del == null)
758             return("<p>Cannot proceed, nothing to delete, shouldn't happen!</p>");
759         
760         Vector problems = new Vector();
761         Vector success = new Vector();
762
763         MoiraConnect mc = null;
764         try {
765             mc = connect();
766             mc.proxy(kname);
767             for (int i = 0; i < del.length; i++) {
768                 try {
769                     if (del[i].marked) {
770                         mc.delete_member_from_list(listname, del[i].member.getMemberType(), del[i].member.getMemberId());
771                         success.addElement(del[i].member);
772                     }
773                 } catch (MoiraException m) {
774                     problems.addElement("<tr><td>" + del[i].member.getMemberId() + "</td><td>" + m.getMessage() + "</td></tr>\r\n");
775                 }
776             }
777         } catch (MoiraException m) {
778             msg = "<p><b>" + m.getMessage() + "</b></p>";
779             msg += "<!\r\n";
780             CharArrayWriter err = new CharArrayWriter();
781             PrintWriter perr = new PrintWriter(err);
782             m.printStackTrace(perr);
783             perr.flush();
784             msg += err.toString();
785             msg += "!>\r\n";
786             return (msg);
787         } finally {
788             try {
789                 if (mc != null) mc.disconnect();
790             } catch (Exception e) {
791             }
792         }
793
794         msg = "";
795         if (success.size() > 0) {
796             msg += "<h2>Deleted the following:</h2>\r\n";
797             msg += "<table border=1 cellpadding=2>\r\n";
798             for (int i = 0; i < success.size(); i++) {
799                 msg += "<tr><td>" + ((Member)success.elementAt(i)).getMemberId() + "</td></tr>\r\n";
800             }
801             msg += "</table>\r\n";
802         }
803         if (problems.size() > 0) {
804             msg += "<p><h2>There were difficulties removing:</h2>\r\n";
805             msg += "<table border=1 cellpadding=2>\r\n";
806             for (int i = 0; i < problems.size(); i++) {
807                 msg += (String)problems.elementAt(i);
808             }
809             msg += "</table>\r\n";
810         }
811
812         return (msg);
813     }
814
815     String do_showlistinfo(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
816
817         String kname = do_authentication(request);
818
819         String list = (String)qv.get("list");
820
821         if (list == null || list.equals("")) {
822             return("Hmmm, no list specified");
823         }
824
825         HttpSession session = request.getSession(true);
826
827         String msg = "";
828         MoiraConnect mc = null;
829         ListInfo li = null;
830         try {
831             mc = connect();
832             mc.proxy(kname);
833             li = mc.get_list_info(list);
834         } catch (MoiraException m) {
835             msg += "Error getting list info: " + m.getMessage();
836                     msg += "<!\r\n";
837             CharArrayWriter err = new CharArrayWriter();
838             PrintWriter perr = new PrintWriter(err);
839             m.printStackTrace(perr);
840             perr.flush();
841             msg += err.toString();
842             msg += "!>\r\n";
843             return (msg);
844         } finally {
845             try {
846                 if (mc != null) mc.disconnect();
847             } catch (Exception e) {
848             }
849         }
850         if (li == null) {
851             return("Did not find list info.");
852         }
853         msg += "<b>List: " + list + "</b><br>\r\n";
854         msg += "Description: " + descript(li.description) + "<br>\r\n";
855         if (li.maillist)
856             msg += "This list is a mailing list.<br>\r\n";
857         if (li.grouplist)
858             msg += "This list is a Group and its ID number is " + li.gid + ".<br>\r\n";
859         msg += "The Administrator of this list is the " + li.ace_type + ": " + li.ace_name + ".<br>\r\n";
860         msg += "This list is: " + mkflags(li) + ".<br>\r\n";
861         msg += "Last modification by " + li.moduser + " at " + df.format(li.modtime) + " with " + li.modwith + ".<br>\r\n";
862         return (msg);
863     }
864
865     String do_updatelistinfo(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
866
867         String kname = do_authentication(request);
868
869         String list = (String)qv.get("list");
870
871         if (list == null || list.equals("")) {
872             return("Hmmm, no list specified");
873         }
874
875         HttpSession session = request.getSession(true);
876
877         String msg = "";
878         MoiraConnect mc = null;
879         ListInfo li = null;
880         try {
881             mc = connect();
882             mc.proxy(kname);
883             li = mc.get_list_info(list);
884         } catch (MoiraException m) {
885             msg += "Error getting list info: " + m.getMessage();
886                     msg += "<!\r\n";
887             CharArrayWriter err = new CharArrayWriter();
888             PrintWriter perr = new PrintWriter(err);
889             m.printStackTrace(perr);
890             perr.flush();
891             msg += err.toString();
892             msg += "!>\r\n";
893             return (msg);
894         } finally {
895             try {
896                 if (mc != null) mc.disconnect();
897             } catch (Exception e) {
898             }
899         }
900         if (li == null) {
901             return("Did not find list info.");
902         }
903
904         session.putValue("listinfo", li); // Save for the confirmation call
905         session.putValue("list", list); // Save for side bar update
906         session.removeValue("members"); // In case left over...
907
908         msg += "<form method=POST action=\"" +
909             response.encodeUrl("showresult.jhtml") + "\">\r\n";
910         msg += "<input type=hidden name=operation value=updatelistinfoconf>\r\n";
911         msg += "<b>Update characteristics of list " + list + "</b><p>\r\n";
912         msg += "Is this list a maillist? <input type=radio name=maillist value=1 "
913             + (li.maillist ? "checked" : "") + ">Yes <input type=radio name=maillist value=0 " + (li.maillist ? "" : "checked") + "> No<br>\r\n";
914         // Note: We don't update group information here
915
916         msg += "Is this list a public list? <input type=radio name=public value=1 "
917             + (li.bpublic ? "checked" : "") + ">Yes <input type=radio name=public value=0 " + (li.bpublic ? "" : "checked") + "> No<br>\r\n";
918         msg += "Is this list a hidden list? <input type=radio name=hidden value=1 "
919             + (li.hidden ? "checked" : "") + ">Yes <input type=radio name=hidden value=0 " + (li.hidden ? "" : "checked") + "> No<p>\r\n";
920         
921         msg += "The Administrator for this list is<br>\r\n";
922         msg += "<select name=ace_type><option value=\"USER\"" +
923             (li.ace_type.equals("USER") ? " selected" : "") + ">user</option>" +
924             "<option value=\"LIST\"" + (li.ace_type.equals("LIST") ? " selected" : "") + ">list</option>" +
925             "<option value=\"KERBEROS\"" + (li.ace_type.equals("KERBEROS") ? " selected" : "") + ">kerberos</option></select>";
926         msg += " <input name=ace_name value=\"" + li.ace_name + "\"><br>\r\n";
927         msg += "Description:<br>\r\n";
928         msg += "<textarea name=description cols=60 rows=3>" + li.description + "</textarea><br>\r\n";
929         msg += "<input type=submit value=\"Make Update\"></form>\r\n";
930         return (msg);
931     }
932
933     String do_updatelistinfoconf(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
934
935         String kname = do_authentication(request);
936         HttpSession session = request.getSession(false); // Better be one
937         if (session == null) {
938             return("<p>Could not proceed, has it been 30 minutes since you last interaction. If so, back up and try again.</p>");
939         }
940         
941         ListInfo li = (ListInfo)session.getValue("listinfo");
942         if (li == null) {
943             return("<p>Could not proceed, could not find orignial list info, should not happen!</p>");
944         }
945         
946         String tmp = (String)qv.get("description");
947         if (tmp != null) li.description = tmp;
948         tmp = (String)qv.get("maillist");
949         if (tmp != null) {
950             if (tmp.equals("1")) li.maillist = true;
951             else li.maillist = false;
952         }
953         tmp = (String)qv.get("public");
954         if (tmp != null) {
955             if (tmp.equals("1")) li.bpublic = true;
956             else li.bpublic = false;
957         }
958         tmp = (String)qv.get("hidden");
959         if (tmp != null) {
960             if (tmp.equals("1")) li.hidden = true;
961             else li.hidden = false;
962         }
963         tmp = (String)qv.get("ace_type");
964         if (tmp != null)
965             li.ace_type = tmp;
966
967         tmp = (String)qv.get("ace_name");
968         if (tmp != null)
969             li.ace_name = tmp;
970
971         MoiraConnect mc = null;
972         try {
973             mc = connect();
974             mc.proxy(kname);
975             mc.update_list_info(li.name, li);
976             mc.disconnect();
977             mc = null;
978         } catch (MoiraException e) {
979             String msg;
980             if (e.getMessage().startsWith("No such list")) {
981                 msg = "<p><b>Error updating " + li.name + ".<br>\r\n";
982                 msg += "The list you specified as administrator does not exist.</p>\r\n";
983             } else if(e.getMessage().startsWith("No such user")) {
984                 msg = "<p><b>Error updating " + li.name + ".<br>\r\n";
985                 msg += "The user you specified as administrator is not known to Moira.</p>\r\n";                
986             } else 
987                 msg = "<p><b>Error during update of " + li.name + ": " + e.getMessage() + "</b></p>";
988             msg += "<!\r\n";
989             CharArrayWriter err = new CharArrayWriter();
990             PrintWriter perr = new PrintWriter(err);
991             e.printStackTrace(perr);
992             perr.flush();
993             msg += err.toString();
994             msg += "!>\r\n";
995             return (msg);
996         } finally {
997             try {
998                 if (mc != null) mc.disconnect();
999             } catch (Exception e) {
1000             }
1001         }
1002         String msg = "<b>Update of " + li.name + " succeeded</b><p>\r\n";
1003         qv.put("list", li.name);
1004         msg += do_showlistinfo(qv, request, response);
1005         return (msg);
1006     }
1007
1008     String do_addfinal(Hashtable qv, HttpServletRequest request, HttpServletResponse response) throws AuthenticationError {
1009         HttpSession session = request.getSession(false); // Better be one
1010         if (session == null) {
1011             return("<p>Could not proceed, has it been 30 minutes since you last interaction. If so, back up and try again.</p>");
1012         }
1013
1014         String kname = do_authentication(request);
1015
1016         String listname = (String) session.getValue("list");
1017         if (listname == null) {
1018             return("<p>Unable to find list name! (shouldn't happen).</p>");
1019         }
1020         String msg = "";
1021         String member = (String)qv.get("member");
1022         String type = (String)qv.get("type");
1023         if (member == null || type == null || member.equals("")) {
1024             return("<p>No names selected to be added!</p>");
1025         }
1026         MoiraConnect mc = null;
1027         StreamTokenizer tk = null;
1028         msg += "<table border=1 cellpadding=2>\r\n";
1029         boolean addheader = false;
1030         Vector warnings = new Vector();
1031         Vector problems = new Vector();
1032         try {
1033             mc = connect();
1034             mc.proxy(kname);
1035             tk = new StreamTokenizer(new StringReader(member));
1036             tk.wordChars('@', '@');
1037             tk.wordChars('0', '9');
1038             tk.wordChars('_', '_');
1039             while (tk.nextToken() != StreamTokenizer.TT_EOF) {
1040                 if (tk.ttype != StreamTokenizer.TT_WORD) continue;
1041                 try {
1042
1043                     // Pre-process user input
1044                     String [] user = canonicalize(tk.sval, type);
1045
1046                     mc.add_member_to_list(listname, user[1], user[0]);
1047                     if (!addheader) {
1048                         msg += "<tr><td>Added to list</td></tr>\r\n";
1049                         addheader = true;
1050                     }
1051                     msg += "<tr><td>" + user[1] + "</td><td>" + user[0] + "</td></tr>\r\n";
1052                     if (user.length > 2)
1053                         warnings.addElement(user[2]);
1054                 } catch (MoiraException e) {
1055                     String err = "<tr><td>" + tk.sval + "</td><td>" + e.getMessage() + "</td></tr>\r\n";
1056                     problems.addElement(err);
1057                 }
1058             }
1059             if (!addheader)     // We didn't seem to be able to add anyone
1060                 msg += "<tr><td>No one added!</td></tr>\r\n";
1061             msg += "</table>\r\n";
1062             mc.disconnect();
1063             mc = null;
1064         } catch (MoiraException e) {
1065             if (tk != null)
1066                 msg = "<p><b>Error adding " + tk.sval + ": " + e.getMessage() + "</b></p>";
1067             else
1068                 msg = "<p><b>Error during add: " + e.getMessage() + "</b></p>";
1069             msg += "<!\r\n";
1070             CharArrayWriter err = new CharArrayWriter();
1071             PrintWriter perr = new PrintWriter(err);
1072             e.printStackTrace(perr);
1073             perr.flush();
1074             msg += err.toString();
1075             msg += "!>\r\n";
1076             return (msg);
1077         } catch (IOException e) {
1078             e.printStackTrace(); // Shouldn't happen
1079         } finally {
1080             try {
1081                 if (mc != null) mc.disconnect();
1082             } catch (Exception e) {
1083             }
1084         }
1085         if (problems.size() != 0) {
1086             msg += "<p>There were difficulties adding the following users:<br>\r\n";
1087             msg += "<table border=1 cellpadding=2>\r\n";
1088             for (int i = 0; i < problems.size(); i++)
1089                 msg += problems.elementAt(i);
1090             msg += "</table>\r\n";
1091         }
1092         if (warnings.size() != 0) {
1093             msg += "<p>The following warnings were generated:<br>\r\n";
1094             msg += "<table border=1 cellpadding=2>\r\n";
1095             for (int i = 0; i < warnings.size(); i++)
1096                 msg += "<tr><td>" + warnings.elementAt(i) + "</td></tr>\r\n";
1097             msg += "</table>\r\n";
1098         }
1099         return (msg);
1100     }
1101
1102     String getfile(String operation) {
1103         ResourceBundle bd = null;
1104         try {
1105             bd = ResourceBundle.getBundle("mit.moira.FileParts");
1106         } catch (java.util.MissingResourceException e) {
1107             return("Cannot find FileParts.properties");
1108         }
1109         if (bd == null) return("Cannot find FileParts.properties!");
1110         String filename = null;
1111         try {
1112             filename = bd.getString(operation);
1113         } catch (java.util.MissingResourceException e) {
1114             return("Cannot find file for operation: " + operation);
1115         }
1116         if (filename == null) {
1117             return("Cannot find file for operation: " + operation);
1118         }
1119         File file = new File(filename);
1120         if (!file.isFile()) return("Cannot file file: " + filename);
1121         long filemodtime = file.lastModified();
1122         Long cachemodtime = (Long) FileTimes.get(filename);
1123         if (cachemodtime == null || filemodtime > cachemodtime.longValue()) {
1124             // Need to fetch the file into the cache
1125             byte [] buffer = null;
1126             try {
1127                 BufferedInputStream input = new BufferedInputStream(new FileInputStream(filename));
1128                 buffer = new byte[input.available()];
1129                 input.read(buffer);
1130                 input.close();
1131             } catch (FileNotFoundException f) {
1132                                 // Should never happen given check above
1133             } catch (IOException e) {
1134                 return("IO Error Reading: " + filename);
1135             }
1136             String data = new String(buffer);
1137             data += "\r\n<!-- FileName: " + filename + "-->\r\n";
1138             FileTimes.put(filename, new Long(filemodtime));
1139             FileParts.put(filename, data);
1140             return (data);
1141         } else {
1142             return ((String)FileParts.get(filename));
1143         }
1144     }
1145
1146     String mkflags(ListInfo li) {
1147         String retval = "";
1148         int state = 0;
1149         if (!li.hidden) {
1150             retval = "visible";
1151             state = 1;
1152         }
1153         if (!li.bpublic) {
1154             switch (state) {
1155             case 0:
1156                 retval = "private";
1157                 state = 1;
1158                 break;
1159             case 1:
1160                 retval = "private and " + retval;
1161                 state = 2;
1162                 break;
1163             case 2:
1164                 retval = "private, " + retval;
1165             }
1166         }
1167         if (li.active) {
1168             switch (state) {
1169             case 0:
1170                 retval = "active";
1171                 state = 1;
1172                 break;
1173             case 1:
1174                 retval = "active and " + retval;
1175                 state = 2;
1176                 break;
1177             case 2:
1178                 retval = "active, " + retval;
1179             }
1180         }
1181         return (retval);
1182     }
1183
1184     /**
1185      * pre-process user input. Mostly this catches cases where the
1186      * incorrect type is used to add someone to a list.
1187      *
1188      * @param user String or Userid being proposed for an add
1189      * @param type Either LIST,STRING or USER
1190      * @return an array of elements. The first is the user portion followed by the type and an optional warning message.
1191      */
1192
1193     private String [] canonicalize(String user, String type) throws MoiraException {
1194         int i;
1195         String [] retval = null;
1196         if (type.equals("STRING")) {
1197             i = user.indexOf('@');
1198             if (i != -1) {
1199                 String host = user.substring(i + 1);
1200                 if (host.equalsIgnoreCase("mit.edu")) {
1201                     retval = new String[3];
1202                     retval[0] = user.substring(0, i);
1203                     retval[1] = "USER";
1204                     retval[2] = "Converted " + user + " to userid " + retval[0];
1205                     return (retval);
1206                 }
1207                 // Don't convert
1208                 retval = new String[2];
1209                 retval[0] = user;
1210                 retval[1] = "STRING";
1211                 return (retval);
1212             } else { // No @ sign
1213                 throw new MoiraException("STRING (mailing list entries) must have an \'@\' in them!");
1214             }
1215         } else if (type.equals("USER")) {
1216             i = user.indexOf('@');
1217             if (i != -1) {
1218                 String host = user.substring(i + 1);
1219                 if (host.equalsIgnoreCase("mit.edu")) {
1220                     retval = new String[3];
1221                     retval[0] = user.substring(0, i);
1222                     retval[1] = "USER";
1223                     retval[2] = "Converted " + user + " to userid " + retval[0];
1224                     return (retval);
1225                 }
1226                 throw new MoiraException("USER types must not have \'@\'s in them!");
1227             }
1228             retval = new String[2];
1229             retval[0] = user;
1230             retval[1] = type;
1231             return (retval);
1232         } else if (type.equals("LIST")) {
1233             i = user.indexOf('@');
1234             if (i == -1) {      // No '@' sign, just process normally
1235                 retval = new String[2];
1236                 retval[0] = user;
1237                 retval[1] = type;
1238                 return (retval);
1239             } else {
1240                 String host = user.substring(i + 1);
1241                 if (host.equalsIgnoreCase("mit.edu")) { // trim mit.edu
1242                     retval = new String[3];
1243                     retval[0] = user.substring(0, i);
1244                     retval[1] = "LIST";
1245                     retval[2] = "Converted " + user + " to list named " + retval[0];
1246                     return (retval);
1247                 } else
1248                     throw new MoiraException("LIST types may not contain \'@\'s in them!");
1249             } 
1250         } else { // Just pass through everything else for now
1251             retval = new String[2];
1252             retval[0] = user;
1253             retval[1] = type;
1254             return (retval);
1255         }
1256     }
1257
1258     /**
1259      * Remove &lt;SCRIPT&gt; tags from input String
1260      *
1261      * @param input String to check out
1262      * @return String with &lt;SCRIPT&gt; tag removed
1263      */
1264     private String descript(String input) {
1265         String lc = input.toLowerCase();
1266         int i = lc.indexOf("<scri");
1267         int j = lc.lastIndexOf("</scri");
1268         int len = input.length();
1269         if (i == -1) return (input); // Nothing to do.
1270         else if (j == -1) {     // No closing script tag
1271             return (input.substring(0, i));
1272         } else {
1273             return (input.substring(0, i) + input.substring(j));
1274         }
1275     }
1276
1277     /**
1278      * Shutdown the servlet
1279      *
1280      */
1281     public void destroy() {
1282         super.destroy();
1283         kt.destroy();
1284     }
1285
1286
1287     /**
1288      * Connect to the Moira Server. Special case the error KE_RD_AP_BADD.
1289      * This error occurs if the tickets we have contain the wrong IP address.
1290      * This can happen if we are on a multi-homed system. If this happens,
1291      * get new tickets and try again. If we exceed the loop count, throw
1292      * an exception (sigh).
1293      *
1294      * @return A Moira Connection Object
1295      * @exception MoiraException on any error
1296      */
1297     protected MoiraConnect connect() throws MoiraException {
1298         MoiraConnect retval = null;
1299         int count = 0;
1300         while (count++ < 10) {  // Got to stop at some point!
1301             retval = new MoiraConnect(MOIRA_SERVER, LOCK);
1302             retval.connect();
1303             try {
1304                 retval.auth();
1305                 return (retval); // No exception, return. yeah!
1306             } catch (MoiraException m) {
1307                 if ((m.getCode() != KE_RD_AP_BADD) || (count > 8)) {
1308                     if (retval != null) {
1309                         try {
1310                             retval.disconnect();
1311                         } catch (Exception e) {
1312                         }
1313                     }
1314                     throw m;    // Re-throw if not the error we expect or we are looping
1315                 }
1316             }
1317             if (retval != null) {
1318                 try {
1319                     retval.disconnect();
1320                 } catch (Exception e) {
1321                 }
1322                 retval = null;
1323             }
1324             System.err.println("MoiraServlet: Forced Renewal...");
1325             kt.renew();         // Renew tickets
1326         }
1327         return (null);
1328     }
1329
1330 }
1331
1332 class Delmember {
1333     boolean marked = false;
1334     Member member = null;
1335
1336     Delmember(Member m) {
1337         member = m;
1338     }
1339 }
This page took 0.152412 seconds and 5 git commands to generate.