/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.clients.fcp;
import java.io.File;
import java.io.IOException;
import freenet.clients.fcp.FCPConnectionHandler.DDACheckJob;
import freenet.node.Node;
import freenet.support.Logger;
import freenet.support.SimpleFieldSet;
import freenet.support.io.FileUtil;
/**
* client -> node: DDARequest { WantRead=true, WantWrite=true, Dir=/tmp/blah }
* node -> client: DDAReply { Dir=/tmp/blah, ReadFilename=random1, WriteFilename=random2, ContentToWrite=random3 }
* client -> node: DDAResponse { Dir=/tmp/blah, ReadContent=blah }
* node -> client: DDAComplete { Dir=/tmp/blah, ReadAllowed=true, WriteAllowed=true }
*
* @author Florent Daignière <nextgens@freenetproject.org>
*
*/
public class TestDDACompleteMessage extends FCPMessage {
public final static String name = "TestDDAComplete";
public final static String READ_ALLOWED = "ReadDirectoryAllowed";
public final static String WRITE_ALLOWED = "WriteDirectoryAllowed";
final DDACheckJob checkJob;
final String readContentFromClient;
private final FCPConnectionHandler handler;
public TestDDACompleteMessage(FCPConnectionHandler handler, DDACheckJob job, String readContent) {
this.checkJob = job;
this.readContentFromClient = readContent;
this.handler = handler;
}
@Override
public SimpleFieldSet getFieldSet() {
SimpleFieldSet sfs = new SimpleFieldSet(true);
sfs.putSingle(TestDDARequestMessage.DIRECTORY, checkJob.directory.toString());
boolean isReadAllowed = false;
boolean isWriteAllowed = false;
if(checkJob.readFilename != null) {
isReadAllowed = (readContentFromClient != null) && (checkJob.readContent.equals(readContentFromClient));
// cleanup in any case : we created it!... let's hope the client will do the same on its side.
checkJob.readFilename.delete();
sfs.putSingle(READ_ALLOWED, String.valueOf(isReadAllowed));
}
if(checkJob.writeFilename != null) {
File maybeWrittenFile = checkJob.writeFilename;
if (maybeWrittenFile.exists() && maybeWrittenFile.isFile() && maybeWrittenFile.canRead()) {
try {
String existingContent = FileUtil.readUTF(maybeWrittenFile).toString().trim();
isWriteAllowed = checkJob.writeContent.equals(existingContent);
} catch (IOException e) {
Logger.error(this, "Caught an IOE trying to read the file (" + maybeWrittenFile + ")! " + e.getMessage());
}
}
sfs.putSingle(WRITE_ALLOWED, String.valueOf(isWriteAllowed));
}
// FIXME this really shouldn't be a side-effect!
handler.registerTestDDAResult(checkJob.directory.toString(), isReadAllowed, isWriteAllowed);
return sfs;
}
@Override
public String getName() {
return name;
}
@Override
public void run(FCPConnectionHandler handler, Node node) throws MessageInvalidException {
throw new MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, name + " goes from server to client not the other way around", name, false);
}
}