/* * @(#)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();
}
}
}