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