import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import sun.security.x509.*; import java.security.*; /** * Read/Write Servlet * * * @version 0.85 , 30/04/2003 * @author Robert Gordesch */ public class RWServlet extends HttpServlet { String md5 = ""; static String basePath=null; public void init(ServletConfig config) throws ServletException { basePath=config.getInitParameter("basePath"); System.out.println("path"+basePath); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Enumeration header = req.getHeaderNames(); while(header.hasMoreElements()) System.out.println(header.nextElement()); System.out.println(req.getCookies()[0].getValue()); /* //value chosen to limit denial of service if (req.getContentLength() > 8 * 1024) { res.setContentType("text/html"); ServletOutputStream out = res.getOutputStream(); out.println("Too big"); out.println("

Error - content length >8k not "); out.println("

"); } else { doGet(req, res); }*/ } public void doPut(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ServletOutputStream out = res.getOutputStream(); ServletInputStream in = req.getInputStream(); String mimeType = "text/plain"; /* if(req.getContentLength()==-1) { res.setContentType(mimeType); res.sendError(res.SC_BAD_REQUEST,"You must specifiy Content-Length!"); out.close();in.close();}*/ //else { res.setContentType(mimeType); // res.setStatus(res.SC_CREATED); // } String query = req.getQueryString(); String id = "", count = "", numFiles = "", cMD5 = ""; String mode = ""; try { if (query != null) { // System.out.println(query); // System.out.println("Query parameter got" + req.getParameter("id") + " count" + req.getParameter("count") + " nf" + req.getParameter("nf") + " md5 " + req.getParameter("md5")); id = req.getParameter("id"); count = req.getParameter("count"); numFiles = req.getParameter("nf"); cMD5 = req.getParameter("md5"); mode = req.getParameter("mode"); } String fileToPut = (basePath!=null) ? basePath+"/"+req.getPathInfo():req.getPathTranslated(); System.out.println("fileToWrite " + fileToPut); /* if (exists(fileToPut, id) && !mode.equals("update") && !mode.equals("replace")) { res.setContentType(mimeType); res.setStatus(res.SC_CONFLICT,"Conflict"); //res.sendError(HttpServletResponse.SC_CONFLICT, "Conflict"); // in.close(); //out.close(); System.out.println("why here ? " ); return; } */ // creates the Directorystructure new File(fileToPut.substring(0, fileToPut.lastIndexOf(File.separator))).mkdirs(); // System.out.println("length"+req.getContentLength()); FileOutputStream outFile = new FileOutputStream(fileToPut); cMD5 = receiveFile(outFile, in, out, req.getContentLength()); if (md5.equals(cMD5)) { res.setHeader("MD5", md5); res.setContentType(mimeType); res.setStatus(res.SC_CREATED); // all files uploaded? if (Integer.parseInt(count) == Integer.parseInt(numFiles))// && md5.equals(cMD5)) { int index = fileToPut.lastIndexOf(File.separator) + 1; String source = fileToPut.substring(0, index); String fileName = fileToPut.substring(index); index = source.indexOf(id); int index2 = index + id.length() + 1; int index3 = source.indexOf(File.separator, index2); String dest = (index3 > 0) ? source.substring(0, index) + source.substring(index2, index3) : source.substring(0, index) + fileName; if (index3 < 0) source += fileName; else source = source.substring(0, index3); // System.out.println(source); // System.out.println(dest); File f = new File(source); if (mode.equals("replace")) { File origFile = new File(dest); GregorianCalendar calendar = new GregorianCalendar(); File saveFile = new File(dest + "_" + calendar.get(calendar.DAY_OF_MONTH) + "." + (calendar.get(calendar.MONTH) + 1) + "." + calendar.get(calendar.YEAR) + "_" + calendar.get(calendar.HOUR_OF_DAY) + "." + calendar.get(calendar.MINUTE) + "." + calendar.get(calendar.SECOND)); origFile.renameTo(saveFile); // System.out.println(saveFile+" replace"); // System.out.println(origFile); } f.renameTo(new File(dest)); new File(source.substring(0, index2)).delete(); } in.close(); out.close(); } else { System.out.println("Got an error "+cMD5+" "+md5); res.setContentType(mimeType); res.setStatus(res.SC_NOT_ACCEPTABLE, " Checksums not identical!"); res.setHeader("MD5", md5); //res.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE, " Checksums not identical!"); // out.println("\r\n"); // new File(fileToPut).delete(); in.close(); out.close(); } // outFile.close(); // out.close(); } catch (FileNotFoundException fnf) { res.sendError(HttpServletResponse.SC_NOT_FOUND, " Not Found!"); fnf.printStackTrace(); } catch (IOException ioe) { System.out.println("IOException: Unknown file length: " + ioe); res.sendError(HttpServletResponse.SC_BAD_REQUEST, "File length!"); } catch (Exception e5) { System.out.println(e5); e5.printStackTrace(); } // } // to else } public void doHead(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { System.out.println("Called head"); ServletOutputStream out = res.getOutputStream(); ServletInputStream in = req.getInputStream(); String mimeType = "text/plain"; /* if(req.getContentLength()==-1) { res.setContentType(mimeType); res.sendError(res.SC_BAD_REQUEST,"You must specifiy Content-Length!"); out.close();in.close();}*/ //else { res.setContentType(mimeType); // res.setStatus(res.SC_CREATED); // } String query = req.getQueryString(); String id = "", count = "", numFiles = "", cMD5 = ""; String mode = ""; try { if (query != null) { // System.out.println(query); // System.out.println("Query parameter got" + req.getParameter("id") + " count" + req.getParameter("count") + " nf" + req.getParameter("nf") + " md5 " + req.getParameter("md5")); System.out.println("header ist "+req.getHeader("Connection")); id = req.getParameter("id"); count = req.getParameter("count"); numFiles = req.getParameter("nf"); cMD5 = req.getParameter("md5"); mode = req.getParameter("mode"); } String fileToPut = (basePath!=null) ? basePath+"/"+req.getPathInfo():req.getPathTranslated(); System.out.println("fileToWrite " + fileToPut); if (new File(fileToPut).exists())// && !mode.equals("update") && !mode.equals("replace")) { res.setHeader("Connection", "keep-alive"); res.setContentType(mimeType); res.setStatus(res.SC_OK); //res.sendError(HttpServletResponse.SC_CONFLICT, "Conflict"); // in.close(); //out.close(); return; } else { res.setHeader("Connection", "keep-alive"); res.setContentType(mimeType); res.setStatus(res.SC_ACCEPTED); } } catch(Exception e) { System.out.println(e);} } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ServletOutputStream out = res.getOutputStream(); ServletInputStream in = req.getInputStream(); // start String mimeType = "text/html"; String fileToGet = req.getPathTranslated(); //req.getPathInfo(); String query = req.getQueryString(); System.out.println(req.getQueryString()); try { if (query != null) { System.out.println("Query parameter got" + req.getParameter("baseURL") + " " + req.getContextPath() + req.getServletPath()); String baseURL = req.getParameter("baseURL"); res.setContentType(mimeType); /* Cookie cookie = new Cookie("Rogo", "idiot"); cookie.setPath("http://localhost:8080"); res.addCookie(cookie); */ out.println(""); out.println(" "); out.println(" "); StringTokenizer querys = new StringTokenizer(query, "+"); out.println(""); } if (query == null) { File f = new File(fileToGet); if (f.isDirectory()) { int i = 0; ByteArrayOutputStream tempfile = new ByteArrayOutputStream(1024); try { while (i <= f.list().length - 1) { tempfile.write(f.list()[i].getBytes()); tempfile.write('\n'); ++i; } // to while } catch (IOException ioe) { System.out.println(ioe); } res.setHeader("Content-Length", new Integer(tempfile.size()).toString()); res.setContentType(mimeType); tempfile.writeTo(out); } else { FileInputStream inFile = new FileInputStream(fileToGet); if (fileToGet.endsWith(".html") || fileToGet.endsWith(".htm")) mimeType = "text/html"; res.setHeader("Content-Length", new Integer(inFile.available()).toString()); res.setContentType(mimeType); sendFile(inFile, out, in); inFile.close(); } } // to sec if } catch (FileNotFoundException fnf) { res.sendError(HttpServletResponse.SC_NOT_FOUND, " Not Found!"); } catch (IOException ioe) { System.out.println("IOException: Unknown file length: " + ioe); res.sendError(HttpServletResponse.SC_BAD_REQUEST, " Bad Request"); } // end } public String getServletInfo() { return "A Servlet that reads data from and writes data to the server\n" + "If the requested data is a directory it sends the list of files in the directory back"; } public void sendFile(FileInputStream inFile, ServletOutputStream outbound, ServletInputStream inbound) { try { byte dataBody[] = new byte[1024]; int cnt; while ((cnt = inFile.read(dataBody)) != -1) { outbound.write(dataBody, 0, cnt); } } catch (IOException ioe) { System.out.println("IOException while sending file: " + ioe); } try { // Cleanup outbound.close(); inbound.close(); } catch (IOException ioe) { System.out.println("IOException closing streams in sendFile: " + ioe); } } public String receiveFile(FileOutputStream outFile, ServletInputStream inbound, ServletOutputStream outbound, int length) { StringBuffer buf=new StringBuffer(); try { length-=32; System.out.println("File size " +length+" available "+inbound.available()); byte[] b = new byte[512]; int readCount = 0; int available = 0; int bufSize = b.length; int readSize = b.length; MessageDigest md = MessageDigest.getInstance("MD5"); while (readCount < length) { available=inbound.available(); if(available>=bufSize) readSize=bufSize; else readSize=available; if(readCount + readSize > length) { inbound.read(b, 0, length - readCount); // mout.flush(); md.update(b, 0, length-readCount); outFile.write(b,0, length - readCount); } else { inbound.read(b,0,readSize); md.update(b, 0, readSize); outFile.write(b,0,readSize); } readCount += readSize; //System.out.println("rock " + readCount); } int c=0; System.out.println("rock "); while((c=inbound.read())!=-1) { System.out.print((char)c); buf.append((char)c); } md5 = getMD5(md); System.out.println(md5); // System.out.println(cnt); // one byte version /* int cnt = 0; // System.out.println(cnt); while (cnt < size) { outFile.write(inbound.read()); ++cnt; }*/ } catch (IOException ioe) { System.out.println("IOException while receiving file: " + ioe); } catch (Exception e6) { System.out.println("error while getting MD5 "+e6); } try { // Cleanup outFile.flush(); outFile.close(); // outbound.close(); // inbound.close(); } catch (IOException ioe) { System.out.println("IOException closing streams in receiveFile: " + ioe); } return buf.toString(); } public static String getMD5(MessageDigest md) throws Exception { System.out.println("digest"); byte[] bytes = md.digest(); StringBuffer sb = new StringBuffer(); int decValue; for (int i = 0; i < bytes.length; i++) { String hexVal = Integer.toHexString(bytes[i] & 0xFF); if (hexVal.length() == 1) hexVal = "0" + hexVal; // put a leading zero sb.append(hexVal); } return sb.toString(); } public static String getSHA(byte[] b) throws Exception { MessageDigest md = MessageDigest.getInstance("sha1"); md.update(b, 0, b.length); //System.out.println("digest"); byte[] bytes = md.digest(); StringBuffer sb = new StringBuffer(); int decValue; for (int i = 0; i < bytes.length; i++) { String hexVal = Integer.toHexString(bytes[i] & 0xFF); if (hexVal.length() == 1) hexVal = "0" + hexVal; // put a leading zero sb.append(hexVal); } return sb.toString(); } public boolean exists(String fileToPut, String id) { int index = fileToPut.lastIndexOf(File.separator) + 1; String source = fileToPut.substring(0, index); String fileName = fileToPut.substring(index); index = source.indexOf(id); int index2 = index + id.length() + 1; int index3 = source.indexOf(File.separator, index2); String dest = (index3 > 0) ? source.substring(0, index) + source.substring(index2, index3) : source.substring(0, index) + fileName; if (index3 < 0) source += fileName; else source = source.substring(0, index3); //System.out.println(source); // System.out.println(dest); File f = new File(dest); return f.exists(); } }