114 lines
4.2 KiB
Java
114 lines
4.2 KiB
Java
package officerunlocker;
|
|
|
|
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;
|
|
}
|
|
}
|