OfficerBreaker/FileManipulator.java

114 lines
4.2 KiB
Java

package officerbreaker;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileManipulator {
public final static String EXCEL_FILE = "xlsx";
public final static String POWER_POINT_FILE = "pptx";
public final static String WORD_FILE = "docx";
public final static String EXCEL_XML = "workbook.xml";
public final static String POWER_POINT_XML = "presentation.xml";
public final static String WORD_XML = "settings.xml";
public final static String EXCEL_PATH = "xl/";
public final static String POWER_POINT_PATH = "ppt/";
public final static String WORD_PATH = "word/";
public final static String EXCEL_SECURITY_NODE = "workbookProtection";
public final static String POWER_POINT_SECURITY_NODE = "p:modifyVerifier";
public final static String WORD_SECURITY_NODE = "w:documentProtection";
private String filePath; // path of file which will be manipulated
private String extractionPath; // temporary path where the file will be extracted to
private String fileType; // file type (extension name)
private String XMLTargetFile; // XML file to be extracted from file
private String targetPath; // path to XML inside the file
private String securityElement; // hashed password element
public FileManipulator(String filePath, String extractionPath) throws Exception {
this.filePath = filePath;
this.extractionPath = extractionPath;
this.fileType = determineFileType();
locateTargetFileAndPath();
}
public void extractFile() throws Exception {
File outputLocation = new File(this.extractionPath, this.XMLTargetFile);
// path to the file the file will be extracted from
Path zipFile = Paths.get(this.filePath);
// load zip file as filesystem
FileSystem fileSystem = FileSystems.newFileSystem(zipFile, null);
Path source = fileSystem.getPath(this.targetPath + this.XMLTargetFile); // location of XMLTargetFile inside the zip file
Files.copy(source, outputLocation.toPath());
}
public void insertFile() throws Exception {
Path myFilePath = Paths.get(this.XMLTargetFile);
Path zipFilePath = Paths.get(this.filePath);
try (FileSystem fs = FileSystems.newFileSystem(zipFilePath, null)) {
Path fileInsideZipPath = fs.getPath(this.targetPath + this.XMLTargetFile);
Files.delete(fileInsideZipPath);
Files.copy(myFilePath, fileInsideZipPath);
} catch (IOException e) {
e.printStackTrace();
}
}
public String determineFileType() throws Exception {
int indexOfLastDot = this.filePath.lastIndexOf(".");
if (indexOfLastDot == -1) // dot not found, invalid file
{
throw new Exception("invalid input, file extension not found.");
} else {
return filePath.substring(indexOfLastDot + 1);
}
}
public void locateTargetFileAndPath() throws Exception {
if (fileType.equals(POWER_POINT_FILE)) {
this.XMLTargetFile = POWER_POINT_XML;
this.targetPath = POWER_POINT_PATH;
this.securityElement = POWER_POINT_SECURITY_NODE;
} else if (fileType.equals(WORD_FILE)) {
this.XMLTargetFile = WORD_XML;
this.targetPath = WORD_PATH;
this.securityElement = WORD_SECURITY_NODE;
} else if (fileType.equals(EXCEL_FILE)) {
this.XMLTargetFile = EXCEL_XML;
this.targetPath = EXCEL_PATH;
this.securityElement = EXCEL_SECURITY_NODE;
} else // file not recognized
{
throw new Exception("invalid input, file type not supported.");
}
}
public void removeXMLFile() throws Exception {
File file = new File(this.XMLTargetFile);
Files.deleteIfExists(file.toPath());
}
public String getXMLTargetFile() {
return this.XMLTargetFile;
}
public String getSecurityElement() {
return this.securityElement;
}
}