/* * @(#)FingerServlet.java 1.12 97/05/22 * * Copyright (c) 1995, 2004, Oracle. All rights reserved. * * This software is the confidential and proprietary information of Sun * Microsystems, Inc. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Sun. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING * THIS SOFTWARE OR ITS DERIVATIVES. * * CopyrightVersion 1.0 */ import java.io.*; import java.net.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; /** * Finger servlet. This servlet uses the finger protocol to query * information about users on specified hosts. The query string * parameters user, hosts, and verbose * can be used to specify the user and hosts to query. The parameter * user is the user name, hosts is a comma-separated * list of host names to query, and verbose if specified will * cause verbose output to be generated. For example, *
* http:/goa/finger.html?user=dac&hosts=eno,doppio&verbose=yes ** This URL will request full information about user 'dac' on both * hosts 'eno' and 'doppio'. * * @author David Connelly * @version 1.12, 05/22/97 */ public class FingerServlet extends HttpServlet { /* * Port number for finger daemon. */ static final int FINGER_PORT = 79; private static final String timeoutMessage = "Timeout reading from server"; /** * Handles a single finger request from the client. */ public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String user = req.getParameter("user"); String hosts = req.getParameter("hosts"); String verbose = req.getParameter("verbose"); res.setContentType("text/html"); ServletOutputStream out = res.getOutputStream(); out.println(""); out.println("
"); if (hosts == null) { finger(out, user, null, "yes".equalsIgnoreCase(verbose)); } else { StringTokenizer st = new StringTokenizer(hosts, ","); while (st.hasMoreTokens()) { String host = st.nextToken(); out.println("[" + host + "]"); try { finger(out, user, host, "yes".equalsIgnoreCase(verbose)); } catch (IOException e) { out.println(e.toString()); } out.println(); } } out.println(""); out.println(""); } /* * Sends finger output for a user and host to the specified output * stream. */ private void finger(ServletOutputStream out, String user, String host, boolean verbose) throws IOException { // open connection to finger daemon Socket s; if (host == null) { s = new Socket(InetAddress.getLocalHost(), FINGER_PORT); } else { s = new Socket(host, FINGER_PORT); } // send finger command PrintStream socketOut = new PrintStream(s.getOutputStream()); if (verbose) { socketOut.print("/W "); } if (user != null) { socketOut.print(user); } socketOut.print("\r\n"); socketOut.flush(); // copy results to output stream // s.setSoTimeout(30000); InputStream in = s.getInputStream(); byte[] buf = new byte[2048]; int len; try { while ((len = in.read(buf, 0, buf.length)) != -1) { out.write(buf, 0, len); } } catch (InterruptedIOException ioe) { timeoutMessage.getBytes(0, timeoutMessage.length(), buf, 0); out.write(buf, 0, timeoutMessage.length()); } finally { socketOut.close(); s.close(); } } }