|
@@ -0,0 +1,111 @@
|
|
|
+package de.tudarmstadt.informatik.hostage.protocol.cifs;
|
|
|
+
|
|
|
+import org.alfresco.jlan.server.SrvSession;
|
|
|
+import org.alfresco.jlan.server.core.DeviceContext;
|
|
|
+import org.alfresco.jlan.server.filesys.FileExistsException;
|
|
|
+import org.alfresco.jlan.server.filesys.FileName;
|
|
|
+import org.alfresco.jlan.server.filesys.FileOpenParams;
|
|
|
+import org.alfresco.jlan.server.filesys.NetworkFile;
|
|
|
+import org.alfresco.jlan.server.filesys.TreeConnection;
|
|
|
+import org.alfresco.jlan.smb.server.disk.JavaFileDiskDriver;
|
|
|
+import org.alfresco.jlan.smb.server.disk.JavaNetworkFile;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.FileWriter;
|
|
|
+import java.math.BigInteger;
|
|
|
+import java.security.MessageDigest;
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
+
|
|
|
+import de.tudarmstadt.informatik.hostage.logging.MessageRecord;
|
|
|
+import de.tudarmstadt.informatik.hostage.protocol.CIFS;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by Daniel on 26.03.2015.
|
|
|
+ */
|
|
|
+public class PseudoJavaFileDiskDriver extends JavaFileDiskDriver {
|
|
|
+ private static class PseudoJavaNetworkFile extends JavaNetworkFile {
|
|
|
+ protected final CIFS cifs;
|
|
|
+ private final SrvSession sess;
|
|
|
+ boolean wasWrittenTo = false;
|
|
|
+
|
|
|
+ public PseudoJavaNetworkFile(File file, String netPath, CIFS cifs, SrvSession sess) {
|
|
|
+ super(file, netPath);
|
|
|
+ this.cifs = cifs;
|
|
|
+ this.sess = sess;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void closeFile() throws java.io.IOException {
|
|
|
+ super.closeFile();
|
|
|
+ if(wasWrittenTo){
|
|
|
+ try {
|
|
|
+ MessageDigest digest = MessageDigest.getInstance("MD5");
|
|
|
+ FileInputStream fis = new FileInputStream(m_file);
|
|
|
+
|
|
|
+ byte[] buffer = new byte[8192];
|
|
|
+ int numOfBytesRead;
|
|
|
+ while( (numOfBytesRead = fis.read(buffer)) > 0){
|
|
|
+ digest.update(buffer, 0, numOfBytesRead);
|
|
|
+ }
|
|
|
+
|
|
|
+ byte[] hash = digest.digest();
|
|
|
+ String checksum = new BigInteger(1, hash).toString(16);
|
|
|
+
|
|
|
+ String message = "File received: " + m_file.getName() + "\n\nCHECKSUM:\n" + checksum;
|
|
|
+
|
|
|
+ cifs.log(MessageRecord.TYPE.RECEIVE, message, 445, sess.getRemoteAddress(), 445);
|
|
|
+ } catch (NoSuchAlgorithmException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ m_file.delete();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void writeFile(byte[] buf, int len, int pos)
|
|
|
+ throws java.io.IOException {
|
|
|
+ super.writeFile(buf, len, pos);
|
|
|
+ wasWrittenTo = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void writeFile(byte[] buf, int len, int pos, long offset)
|
|
|
+ throws java.io.IOException {
|
|
|
+ super.writeFile(buf, len, pos, offset);
|
|
|
+ wasWrittenTo = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private final CIFS cifs;
|
|
|
+
|
|
|
+ public PseudoJavaFileDiskDriver(CIFS cifs) {
|
|
|
+ this.cifs = cifs;
|
|
|
+ }
|
|
|
+
|
|
|
+ public NetworkFile createFile(SrvSession sess, TreeConnection tree, FileOpenParams params)
|
|
|
+ throws java.io.IOException {
|
|
|
+ DeviceContext ctx = tree.getContext();
|
|
|
+ String fname = FileName.buildPath(ctx.getDeviceName(), params.getPath(), null, java.io.File.separatorChar);
|
|
|
+
|
|
|
+ // Check if the file already exists
|
|
|
+
|
|
|
+ File file = new File(fname);
|
|
|
+ if (file.exists())
|
|
|
+ throw new FileExistsException();
|
|
|
+
|
|
|
+ // Create the new file
|
|
|
+
|
|
|
+ FileWriter newFile = new FileWriter(fname, false);
|
|
|
+ newFile.close();
|
|
|
+
|
|
|
+ // Create a Java network file
|
|
|
+
|
|
|
+ file = new File(fname);
|
|
|
+ PseudoJavaNetworkFile netFile = new PseudoJavaNetworkFile(file, params.getPath(), cifs, sess);
|
|
|
+ netFile.setGrantedAccess(NetworkFile.READWRITE);
|
|
|
+ netFile.setFullName(params.getPath());
|
|
|
+
|
|
|
+ // Return the network file
|
|
|
+
|
|
|
+ return netFile;
|
|
|
+ }
|
|
|
+}
|