File:  [Repository] / upload-applet / RWServlet.java
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Jun 17 14:59:39 2003 UTC (21 years ago) by rogo
Branches: bli, MAIN
CVS tags: bla, HEAD
First checkin.


    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 &gt;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>