Annotation of upload-applet/RWServlet.java, revision 1.1.1.1
1.1 rogo 1: import java.io.*;
2: import java.util.*;
3:
4: import javax.servlet.*;
5: import javax.servlet.http.*;
6:
7: import sun.security.x509.*;
8: import java.security.*;
9: /**
10: * Read/Write Servlet
11: *
12: *
13: * @version 0.85 , 30/04/2003
14: * @author Robert Gordesch
15: */
16: public class RWServlet extends HttpServlet
17: {
18:
19: String md5 = "";
20: static String basePath=null;
21:
22: public void init(ServletConfig config) throws ServletException
23: {
24: basePath=config.getInitParameter("basePath");
25: System.out.println("path"+basePath);
26: }
27: public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
28: {
29: Enumeration header = req.getHeaderNames();
30: while(header.hasMoreElements())
31: System.out.println(header.nextElement());
32: System.out.println(req.getCookies()[0].getValue());
33: /*
34: //value chosen to limit denial of service
35: if (req.getContentLength() > 8 * 1024)
36: {
37: res.setContentType("text/html");
38: ServletOutputStream out = res.getOutputStream();
39: out.println("<html><head><title>Too big</title></head>");
40: out.println("<body><h1>Error - content length >8k not ");
41: out.println("</h1></body></html>");
42: } else
43: {
44: doGet(req, res);
45: }*/
46: }
47:
48: public void doPut(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
49: {
50: ServletOutputStream out = res.getOutputStream();
51: ServletInputStream in = req.getInputStream();
52: String mimeType = "text/plain";
53:
54: /* if(req.getContentLength()==-1)
55: {
56: res.setContentType(mimeType);
57: res.sendError(res.SC_BAD_REQUEST,"You must specifiy Content-Length!");
58: out.close();in.close();}*/
59: //else { res.setContentType(mimeType);
60: // res.setStatus(res.SC_CREATED);
61: // }
62: String query = req.getQueryString();
63: String id = "", count = "", numFiles = "", cMD5 = "";
64: String mode = "";
65: try
66: {
67: if (query != null)
68: {
69: // System.out.println(query);
70: // System.out.println("Query parameter got" + req.getParameter("id") + " count" + req.getParameter("count") + " nf" + req.getParameter("nf") + " md5 " + req.getParameter("md5"));
71: id = req.getParameter("id");
72: count = req.getParameter("count");
73: numFiles = req.getParameter("nf");
74: cMD5 = req.getParameter("md5");
75: mode = req.getParameter("mode");
76: }
77: String fileToPut = (basePath!=null) ? basePath+"/"+req.getPathInfo():req.getPathTranslated();
78: System.out.println("fileToWrite " + fileToPut);
79: /*
80: if (exists(fileToPut, id) && !mode.equals("update") && !mode.equals("replace"))
81: {
82: res.setContentType(mimeType);
83: res.setStatus(res.SC_CONFLICT,"Conflict");
84: //res.sendError(HttpServletResponse.SC_CONFLICT, "Conflict");
85: // in.close();
86: //out.close();
87: System.out.println("why here ? " );
88: return;
89: }
90: */
91:
92: // creates the Directorystructure
93: new File(fileToPut.substring(0, fileToPut.lastIndexOf(File.separator))).mkdirs();
94: // System.out.println("length"+req.getContentLength());
95: FileOutputStream outFile = new FileOutputStream(fileToPut);
96: cMD5 = receiveFile(outFile, in, out, req.getContentLength());
97: if (md5.equals(cMD5))
98: {
99: res.setHeader("MD5", md5);
100: res.setContentType(mimeType);
101: res.setStatus(res.SC_CREATED);
102: // all files uploaded?
103: if (Integer.parseInt(count) == Integer.parseInt(numFiles))// && md5.equals(cMD5))
104: {
105: int index = fileToPut.lastIndexOf(File.separator) + 1;
106: String source = fileToPut.substring(0, index);
107: String fileName = fileToPut.substring(index);
108: index = source.indexOf(id);
109: int index2 = index + id.length() + 1;
110: int index3 = source.indexOf(File.separator, index2);
111: String dest = (index3 > 0) ? source.substring(0, index) + source.substring(index2, index3) : source.substring(0, index) + fileName;
112: if (index3 < 0)
113: source += fileName;
114: else
115: source = source.substring(0, index3);
116: // System.out.println(source);
117:
118: // System.out.println(dest);
119: File f = new File(source);
120: if (mode.equals("replace"))
121: {
122: File origFile = new File(dest);
123: GregorianCalendar calendar = new GregorianCalendar();
124: 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));
125: origFile.renameTo(saveFile);
126: // System.out.println(saveFile+" replace");
127: // System.out.println(origFile);
128:
129: }
130: f.renameTo(new File(dest));
131:
132: new File(source.substring(0, index2)).delete();
133: }
134: in.close();
135: out.close();
136: } else
137: {
138: System.out.println("Got an error "+cMD5+" "+md5);
139: res.setContentType(mimeType);
140: res.setStatus(res.SC_NOT_ACCEPTABLE, " Checksums not identical!");
141: res.setHeader("MD5", md5);
142:
143: //res.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE, " Checksums not identical!");
144: // out.println("\r\n");
145: // new File(fileToPut).delete();
146: in.close();
147: out.close();
148: }
149:
150: // outFile.close();
151: // out.close();
152: } catch (FileNotFoundException fnf)
153: {
154:
155: res.sendError(HttpServletResponse.SC_NOT_FOUND, " Not Found!");
156: fnf.printStackTrace();
157: } catch (IOException ioe)
158: {
159: System.out.println("IOException: Unknown file length: " + ioe);
160: res.sendError(HttpServletResponse.SC_BAD_REQUEST, "File length!");
161: } catch (Exception e5)
162: {
163: System.out.println(e5);
164: e5.printStackTrace();
165: }
166: // } // to else
167:
168: }
169: public void doHead(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
170: {
171: System.out.println("Called head");
172: ServletOutputStream out = res.getOutputStream();
173: ServletInputStream in = req.getInputStream();
174: String mimeType = "text/plain";
175:
176: /* if(req.getContentLength()==-1)
177: {
178: res.setContentType(mimeType);
179: res.sendError(res.SC_BAD_REQUEST,"You must specifiy Content-Length!");
180: out.close();in.close();}*/
181: //else { res.setContentType(mimeType);
182: // res.setStatus(res.SC_CREATED);
183: // }
184: String query = req.getQueryString();
185: String id = "", count = "", numFiles = "", cMD5 = "";
186: String mode = "";
187: try
188: {
189: if (query != null)
190: {
191: // System.out.println(query);
192: // System.out.println("Query parameter got" + req.getParameter("id") + " count" + req.getParameter("count") + " nf" + req.getParameter("nf") + " md5 " + req.getParameter("md5"));
193: System.out.println("header ist "+req.getHeader("Connection"));
194: id = req.getParameter("id");
195: count = req.getParameter("count");
196: numFiles = req.getParameter("nf");
197: cMD5 = req.getParameter("md5");
198: mode = req.getParameter("mode");
199: }
200: String fileToPut = (basePath!=null) ? basePath+"/"+req.getPathInfo():req.getPathTranslated();
201: System.out.println("fileToWrite " + fileToPut);
202: if (new File(fileToPut).exists())// && !mode.equals("update") && !mode.equals("replace"))
203: {
204: res.setHeader("Connection", "keep-alive");
205: res.setContentType(mimeType);
206: res.setStatus(res.SC_OK);
207: //res.sendError(HttpServletResponse.SC_CONFLICT, "Conflict");
208: // in.close();
209: //out.close();
210: return;
211: } else
212: {
213: res.setHeader("Connection", "keep-alive");
214: res.setContentType(mimeType);
215: res.setStatus(res.SC_ACCEPTED);
216: }
217: } catch(Exception e) { System.out.println(e);}
218: }
219: public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
220: {
221: ServletOutputStream out = res.getOutputStream();
222: ServletInputStream in = req.getInputStream();
223: // start
224: String mimeType = "text/html";
225: String fileToGet = req.getPathTranslated(); //req.getPathInfo();
226: String query = req.getQueryString();
227: System.out.println(req.getQueryString());
228: try
229: {
230: if (query != null)
231: {
232: System.out.println("Query parameter got" + req.getParameter("baseURL") + " " + req.getContextPath() + req.getServletPath());
233: String baseURL = req.getParameter("baseURL");
234: res.setContentType(mimeType);
235: /* Cookie cookie = new Cookie("Rogo", "idiot");
236: cookie.setPath("http://localhost:8080");
237:
238: res.addCookie(cookie);
239: */
240:
241: out.println("<APPLET");
242:
243: // out.println("CODEBASE = \".\"");
244: out.println("CODE = \"ServerWriter.class\"");
245: out.println("ARCHIVE=\"upload.jar\"");
246: out.println("NAME = \"Upload Applet\"");
247: out.println(" WIDTH = 160");
248:
249: out.println(" HEIGHT = 25");
250:
251: out.println(" HSPACE = 0 ");
252:
253: out.println(" VSPACE = 0 ");
254:
255: out.println(" ALIGN = middle>");
256: out.println(" <PARAM NAME=\"baseURL\" VALUE=" + baseURL + ">");
257: out.println(" <PARAM NAME=\"servletURL\" VALUE=\"" + req.getContextPath() + req.getServletPath() + "\">");
258:
259: StringTokenizer querys = new StringTokenizer(query, "+");
260: out.println("</APPLET>");
261: }
262:
263: if (query == null)
264: {
265: File f = new File(fileToGet);
266: if (f.isDirectory())
267: {
268: int i = 0;
269: ByteArrayOutputStream tempfile = new ByteArrayOutputStream(1024);
270: try
271: {
272:
273: while (i <= f.list().length - 1)
274: {
275: tempfile.write(f.list()[i].getBytes());
276: tempfile.write('\n');
277: ++i;
278: } // to while
279:
280: } catch (IOException ioe)
281: {
282: System.out.println(ioe);
283: }
284: res.setHeader("Content-Length", new Integer(tempfile.size()).toString());
285: res.setContentType(mimeType);
286: tempfile.writeTo(out);
287: } else
288: {
289: FileInputStream inFile = new FileInputStream(fileToGet);
290: if (fileToGet.endsWith(".html") || fileToGet.endsWith(".htm"))
291: mimeType = "text/html";
292: res.setHeader("Content-Length", new Integer(inFile.available()).toString());
293: res.setContentType(mimeType);
294: sendFile(inFile, out, in);
295: inFile.close();
296: }
297: } // to sec if
298: } catch (FileNotFoundException fnf)
299: {
300: res.sendError(HttpServletResponse.SC_NOT_FOUND, " Not Found!");
301:
302: } catch (IOException ioe)
303: {
304: System.out.println("IOException: Unknown file length: " + ioe);
305: res.sendError(HttpServletResponse.SC_BAD_REQUEST, " Bad Request");
306: }
307:
308: // end
309:
310: }
311:
312: public String getServletInfo()
313: {
314: 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";
315: }
316: public void sendFile(FileInputStream inFile, ServletOutputStream outbound, ServletInputStream inbound)
317: {
318:
319: try
320: {
321:
322: byte dataBody[] = new byte[1024];
323: int cnt;
324: while ((cnt = inFile.read(dataBody)) != -1)
325: {
326: outbound.write(dataBody, 0, cnt);
327: }
328: } catch (IOException ioe)
329: {
330: System.out.println("IOException while sending file: " + ioe);
331: }
332: try
333: {
334: // Cleanup
335: outbound.close();
336: inbound.close();
337: } catch (IOException ioe)
338: {
339: System.out.println("IOException closing streams in sendFile: " + ioe);
340: }
341: }
342: public String receiveFile(FileOutputStream outFile, ServletInputStream inbound, ServletOutputStream outbound, int length)
343: {
344: StringBuffer buf=new StringBuffer();
345: try
346: {
347: length-=32;
348: System.out.println("File size " +length+" available "+inbound.available());
349: byte[] b = new byte[512];
350: int readCount = 0;
351: int available = 0;
352: int bufSize = b.length;
353: int readSize = b.length;
354:
355: MessageDigest md = MessageDigest.getInstance("MD5");
356:
357: while (readCount < length)
358: {
359: available=inbound.available();
360:
361: if(available>=bufSize)
362: readSize=bufSize;
363: else
364: readSize=available;
365:
366: if(readCount + readSize > length)
367: {
368: inbound.read(b, 0, length - readCount); // mout.flush();
369: md.update(b, 0, length-readCount);
370: outFile.write(b,0, length - readCount);
371:
372: }
373: else
374: {
375: inbound.read(b,0,readSize);
376: md.update(b, 0, readSize);
377: outFile.write(b,0,readSize);
378:
379: }
380:
381: readCount += readSize;
382: //System.out.println("rock " + readCount);
383:
384: }
385: int c=0;
386: System.out.println("rock ");
387:
388: while((c=inbound.read())!=-1)
389: {
390: System.out.print((char)c);
391: buf.append((char)c);
392: }
393: md5 = getMD5(md);
394: System.out.println(md5);
395:
396: // System.out.println(cnt);
397: // one byte version
398: /* int cnt = 0;
399: // System.out.println(cnt);
400: while (cnt < size)
401: {
402: outFile.write(inbound.read());
403: ++cnt;
404: }*/
405:
406: } catch (IOException ioe)
407: {
408: System.out.println("IOException while receiving file: " + ioe);
409: }
410: catch (Exception e6)
411: {
412: System.out.println("error while getting MD5 "+e6);
413: }
414:
415: try
416: {
417: // Cleanup
418: outFile.flush();
419: outFile.close();
420: // outbound.close();
421: // inbound.close();
422:
423: } catch (IOException ioe)
424: {
425: System.out.println("IOException closing streams in receiveFile: " + ioe);
426: }
427: return buf.toString();
428: }
429: public static String getMD5(MessageDigest md) throws Exception
430: {
431: System.out.println("digest");
432: byte[] bytes = md.digest();
433: StringBuffer sb = new StringBuffer();
434: int decValue;
435: for (int i = 0; i < bytes.length; i++)
436: {
437: String hexVal = Integer.toHexString(bytes[i] & 0xFF);
438: if (hexVal.length() == 1)
439: hexVal = "0" + hexVal; // put a leading zero
440: sb.append(hexVal);
441: }
442: return sb.toString();
443: }
444: public static String getSHA(byte[] b) throws Exception
445: {
446: MessageDigest md = MessageDigest.getInstance("sha1");
447: md.update(b, 0, b.length);
448: //System.out.println("digest");
449: byte[] bytes = md.digest();
450: StringBuffer sb = new StringBuffer();
451: int decValue;
452: for (int i = 0; i < bytes.length; i++)
453: {
454: String hexVal = Integer.toHexString(bytes[i] & 0xFF);
455: if (hexVal.length() == 1)
456: hexVal = "0" + hexVal; // put a leading zero
457: sb.append(hexVal);
458: }
459:
460: return sb.toString();
461: }
462: public boolean exists(String fileToPut, String id)
463: {
464: int index = fileToPut.lastIndexOf(File.separator) + 1;
465: String source = fileToPut.substring(0, index);
466: String fileName = fileToPut.substring(index);
467: index = source.indexOf(id);
468: int index2 = index + id.length() + 1;
469: int index3 = source.indexOf(File.separator, index2);
470: String dest = (index3 > 0) ? source.substring(0, index) + source.substring(index2, index3) : source.substring(0, index) + fileName;
471: if (index3 < 0)
472: source += fileName;
473: else
474: source = source.substring(0, index3);
475: //System.out.println(source);
476:
477: // System.out.println(dest);
478: File f = new File(dest);
479: return f.exists();
480: }
481: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>