]> andersk Git - moira.git/blame - webmoira/mit/moira/MoiraServlet.java
Added WebMoira sources
[moira.git] / webmoira / mit / moira / MoiraServlet.java
CommitLineData
bde1652c 1package mit.moira;
2
3import javax.servlet.*;
4import javax.servlet.http.*;
5import java.io.*;
6import java.util.*;
7import java.sql.SQLException;
8import java.sql.ResultSet;
9import java.sql.ResultSetMetaData;
10import java.text.SimpleDateFormat;
11import java.util.Date;
12import java.util.ResourceBundle;
13
14public 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
1332class Delmember {
1333 boolean marked = false;
1334 Member member = null;
1335
1336 Delmember(Member m) {
1337 member = m;
1338 }
1339}
This page took 0.22798 seconds and 5 git commands to generate.