PseudoJavaFileDIskDriver.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package de.tudarmstadt.informatik.hostage.protocol.cifs;
  2. import org.alfresco.jlan.server.SrvSession;
  3. import org.alfresco.jlan.server.core.DeviceContext;
  4. import org.alfresco.jlan.server.filesys.FileExistsException;
  5. import org.alfresco.jlan.server.filesys.FileName;
  6. import org.alfresco.jlan.server.filesys.FileOpenParams;
  7. import org.alfresco.jlan.server.filesys.NetworkFile;
  8. import org.alfresco.jlan.server.filesys.TreeConnection;
  9. import org.alfresco.jlan.smb.server.disk.JavaFileDiskDriver;
  10. import org.alfresco.jlan.smb.server.disk.JavaNetworkFile;
  11. import java.io.File;
  12. import java.io.FileInputStream;
  13. import java.io.FileWriter;
  14. import java.math.BigInteger;
  15. import java.security.MessageDigest;
  16. import java.security.NoSuchAlgorithmException;
  17. import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
  18. import de.tudarmstadt.informatik.hostage.protocol.CIFS;
  19. /**
  20. * Created by Daniel on 26.03.2015.
  21. */
  22. public class PseudoJavaFileDiskDriver extends JavaFileDiskDriver {
  23. private static class PseudoJavaNetworkFile extends JavaNetworkFile {
  24. protected final CIFS cifs;
  25. private final SrvSession sess;
  26. boolean wasWrittenTo = false;
  27. public PseudoJavaNetworkFile(File file, String netPath, CIFS cifs, SrvSession sess) {
  28. super(file, netPath);
  29. this.cifs = cifs;
  30. this.sess = sess;
  31. }
  32. public void closeFile() throws java.io.IOException {
  33. super.closeFile();
  34. if(wasWrittenTo){
  35. try {
  36. MessageDigest digest = MessageDigest.getInstance("MD5");
  37. FileInputStream fis = new FileInputStream(m_file);
  38. byte[] buffer = new byte[8192];
  39. int numOfBytesRead;
  40. while( (numOfBytesRead = fis.read(buffer)) > 0){
  41. digest.update(buffer, 0, numOfBytesRead);
  42. }
  43. byte[] hash = digest.digest();
  44. String checksum = new BigInteger(1, hash).toString(16);
  45. String message = "File received: " + m_file.getName() + "\n\nCHECKSUM:\n" + checksum;
  46. cifs.log(MessageRecord.TYPE.RECEIVE, message, 445, sess.getRemoteAddress(), 445);
  47. } catch (NoSuchAlgorithmException e) {
  48. e.printStackTrace();
  49. }
  50. m_file.delete();
  51. }
  52. }
  53. public void writeFile(byte[] buf, int len, int pos)
  54. throws java.io.IOException {
  55. super.writeFile(buf, len, pos);
  56. wasWrittenTo = true;
  57. }
  58. public void writeFile(byte[] buf, int len, int pos, long offset)
  59. throws java.io.IOException {
  60. super.writeFile(buf, len, pos, offset);
  61. wasWrittenTo = true;
  62. }
  63. }
  64. private final CIFS cifs;
  65. public PseudoJavaFileDiskDriver(CIFS cifs) {
  66. this.cifs = cifs;
  67. }
  68. public NetworkFile createFile(SrvSession sess, TreeConnection tree, FileOpenParams params)
  69. throws java.io.IOException {
  70. DeviceContext ctx = tree.getContext();
  71. String fname = FileName.buildPath(ctx.getDeviceName(), params.getPath(), null, java.io.File.separatorChar);
  72. // Check if the file already exists
  73. File file = new File(fname);
  74. if (file.exists())
  75. throw new FileExistsException();
  76. // Create the new file
  77. FileWriter newFile = new FileWriter(fname, false);
  78. newFile.close();
  79. // Create a Java network file
  80. file = new File(fname);
  81. PseudoJavaNetworkFile netFile = new PseudoJavaNetworkFile(file, params.getPath(), cifs, sess);
  82. netFile.setGrantedAccess(NetworkFile.READWRITE);
  83. netFile.setFullName(params.getPath());
  84. // Return the network file
  85. return netFile;
  86. }
  87. }