package jcifs.http; import java.io.IOException; import java.io.PrintWriter; import java.net.UnknownHostException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.UnavailableException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jcifs.Config; import jcifs.UniAddress; import jcifs.smb.NtlmPasswordAuthentication; import jcifs.smb.SmbFile; import jcifs.smb.SmbFileInputStream; public class SmbBrowser extends HttpServlet { private UniAddress defaultServer; public void init() throws ServletException { ServletConfig config = getServletConfig(); Config.setProperty("jcifs.netbios.cachePolicy", "600"); Config.setProperty("jcifs.smb.client.attrExpirationPeriod", "120000"); Config.setProperty("jcifs.smb.client.soTimeout", "600000"); Enumeration enumeration = config.getInitParameterNames(); while (enumeration.hasMoreElements()) { String name = (String) enumeration.nextElement(); if (name.startsWith("jcifs.")) { Config.setProperty(name, config.getInitParameter(name)); } } String defaultServer = Config.getProperty( "jcifs.http.domainController"); if (defaultServer != null) { try { this.defaultServer = UniAddress.getByName(defaultServer); } catch (UnknownHostException ex) { throw new UnavailableException( "Default server could not be located."); } } } public void destroy() { defaultServer = null; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String pathInfo = request.getPathInfo(); if (pathInfo == null) pathInfo = "/"; if (pathInfo.startsWith("/")) pathInfo = pathInfo.substring(1); UniAddress server = null; int index = pathInfo.indexOf('/'); if (index == -1) { if (pathInfo.equals("")) { server = getDefaultServer(); } else { server = UniAddress.getByName(pathInfo); } } else { server = UniAddress.getByName(pathInfo.substring(0, index)); } if (server == null) { SmbFile file = new SmbFile("smb://"); browse(request, response, file); return; } NtlmProtocol protocol = new BrowserProtocol(server); (new BrowserHandler(protocol, "smb://" + pathInfo)).process(request, response); } protected void browse(HttpServletRequest request, HttpServletResponse response, SmbFile file) throws ServletException, IOException { if (file.isFile()) { response.setContentType("application/octet-stream"); response.setContentLength((int) file.length()); SmbFileInputStream input = new SmbFileInputStream(file); ServletOutputStream output = response.getOutputStream(); byte[] buf = new byte[8192]; int count; while ((count = input.read(buf)) != -1) { output.write(buf, 0, count); } output.flush(); } else { String prefix = request.getRequestURI().endsWith("/") ? "" : file.getName() + "/"; PrintWriter writer = response.getWriter(); SmbFile[] files = file.listFiles(); if (files == null || files.length == 0) { writer.println(""); writer.println("
"); writer.println("Empty Directory
"); writer.println(""); writer.println(""); return; } writer.println(""); writer.println(""); writer.println("