diff --git a/src/org/blueshard/cryptogx/Controller.java b/src/org/blueshard/cryptogx/Controller.java deleted file mode 100644 index bb9071c..0000000 --- a/src/org/blueshard/cryptogx/Controller.java +++ /dev/null @@ -1,1647 +0,0 @@ -package org.bytedream.cryptogx; - -import javafx.application.Platform; -import javafx.collections.FXCollections; -import javafx.event.Event; -import javafx.fxml.Initializable; -import javafx.scene.Node; -import javafx.scene.Scene; -import javafx.scene.control.*; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.control.Menu; -import javafx.scene.control.MenuBar; -import javafx.scene.control.MenuItem; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import javafx.scene.input.*; -import javafx.scene.layout.AnchorPane; -import javafx.scene.layout.VBox; -import javafx.stage.*; - -import javax.crypto.BadPaddingException; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; -import java.awt.image.BufferedImage; -import java.io.*; -import java.net.*; -import java.nio.charset.StandardCharsets; -import java.nio.file.CopyOption; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.spec.InvalidKeySpecException; -import java.util.*; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import static org.bytedream.cryptogx.Settings.*; -import static org.bytedream.cryptogx.Main.*; - -public class Controller implements Initializable { - - private Event fileEnDecryptLabelEvent; - - private double menubarX, menubarY; - private boolean textLoading = false; - private boolean fileEnDecryptLoading = false; - private boolean fileDeleteLoading = false; - private final AtomicInteger textThreads = new AtomicInteger(0); - private final AtomicInteger totalThreads = new AtomicInteger(0); - private final int tooltipShow = 15; - private final int DATAFILEURL = 2; - private final int FILEFILEURL = 1; - private final int NONSPECIFICFILEURL = 0; - private final byte[] buffer = new byte[64]; - private final KeyCombination paste = new KeyCodeCombination(KeyCode.V, KeyCombination.CONTROL_DOWN); - private final Image loadingImage = new Image(getClass().getResource("resources/loading.gif").toExternalForm()); - - private HashMap currentConfigSettings = new HashMap<>(); - - private final HashMap> enDecryptInputOutputFiles = new HashMap<>(); - private final HashMap> enDecryptInputOutputInternetFiles = new HashMap<>(); - private final HashMap enDecryptInputOutputClipboardImages = new HashMap<>(); - private final HashMap deleteInputFiles = new HashMap<>(); - private final List fileEnDecryptThreads = Collections.synchronizedList(new ArrayList<>()); - private final List fileDeleteThreads = Collections.synchronizedList(new ArrayList<>()); - - private final ContextMenu fileEnDecryptInputContextMenu = new ContextMenu(); - private final ContextMenu fileDeleteInputContextMenu = new ContextMenu(); - private Label choosedLabel = null; - private String choosedLabelType = null; - private final MenuItem fileOutputFileChangeDest = new MenuItem("Change output file"); - private final MenuItem getChoosedLabelInputFileFolder = new MenuItem("Open source directory"); - private final MenuItem getChoosedLabelOutputFileFolder = new MenuItem("Open source directory"); - private final Tooltip tooltip = new Tooltip(); - - public AnchorPane rootWindow; - - public Button fileEnDecryptFilesButton; - public Button fileDecrypt; - public Button fileEncrypt; - public Button fileEnDecryptStop; - - public ComboBox textAlgorithmBox; - public ComboBox fileEnDecryptAlgorithmBox; - - public ImageView minimizeWindow; - public ImageView closeWindow; - public ImageView textLoadingImage; - public ImageView fileEnDecryptLoadingImage; - public ImageView fileDeleteLoadingImage; - - public Menu settingsMenu; - public Menu helpMenu; - - public MenuBar menubar; - - public MenuItem setDefaultOutputPath; - public MenuItem saveSettings; - public MenuItem loadSettings; - public MenuItem exportSettings; - public MenuItem importSettings; - - public RadioMenuItem removeFileFromFileBox; - public RadioMenuItem limitNumberOfThreads; - - public ScrollPane fileEnDecryptInputScroll; - - public TextArea textDecryptedEntry; - public TextArea textEncryptedEntry; - - public TextField textKeyEntry; - public TextField textSaltEntry; - public TextField fileEnDecryptKeyEntry; - public TextField fileDecryptOutputFile; - public TextField fileEncryptOutputFile; - public TextField fileEnDecryptSaltEntry; - public TextField fileDeleteIterationsEntry; - - public VBox fileEnDecryptInputFiles; - public VBox fileDeleteInputFiles; - - //-----general-----// - - /** - *

Shows a tooltip when the user type in some text in a text field, text area, etc. and the mouse is over this entry

- * - * @param event from which this method is called - */ - public void keyTypedTooltip(KeyEvent event) { - String id = null; - String text = ""; - try { - id = ((TextField) event.getSource()).getId(); - text = ((TextField) event.getSource()).getText() + event.getCharacter(); - tooltip.setText(text); - } catch (ClassCastException e) { - tooltip.setText(((TextArea) event.getSource()).getText() + event.getCharacter()); - } - if (id != null) { - switch (id) { - case ("textKeyEntry"): - currentConfigSettings.replace("textKey", text); - break; - case ("textSaltEntry"): - currentConfigSettings.replace("textSalt", text); - break; - case ("fileEnDecryptKeyEntry"): - currentConfigSettings.replace("fileEnDecryptKey", text); - break; - case ("fileEnDecryptSaltEntry"): - currentConfigSettings.replace("fileEnDecryptSalt", text); - break; - case ("fileDeleteIterationsEntry"): - currentConfigSettings.replace("fileDeleteIterations", String.valueOf(Integer.parseInt(text))); - break; - } - } - } - - /** - *

Shows a tooltip when to mouse is over a text field, text area, etc.

- * - * @param event from which this method is called - */ - public void mouseOverEntryTooltip(MouseEvent event) { - try { - tooltip.setText(((TextField) event.getSource()).getText()); - } catch (ClassCastException e) { - try { - tooltip.setText(((TextArea) event.getSource()).getText()); - } catch (ClassCastException ex) { - tooltip.setText(((Label) event.getSource()).getText()); - } - } - if (!tooltip.getText().trim().isEmpty()) { - tooltip.show(rootWindow.getScene().getWindow(), event.getScreenX(), event.getScreenY() + tooltipShow); - } - } - - /** - *

Hides the tooltip if the mouse exit a text field, text area, etc.

- */ - public void mouseExitEntryTooltip() { - tooltip.hide(); - } - - //-----menu / close bar-----// - - /** - *

Closed the application. - * Get called if red close button is pressed

- * - * @since 1.0.0 - */ - public void closeApplication() { - Stage rootStage = (Stage) rootWindow.getScene().getWindow(); - rootStage.close(); - System.exit(0); - } - - /** - *

Hides the application. - * Get called if the green minimize button is pressed

- * - * @since 1.0.0 - */ - public void minimizeApplication() { - Stage rootStage = (Stage) rootWindow.getScene().getWindow(); - rootStage.setIconified(true); - } - - //-----text-----// - - /** - *

Encrypt text in {@link Controller#textDecryptedEntry}. - * Get called if the text 'Encrypt' button is pressed

- * - * @since 1.0.0 - */ - public void textEncryptButton() { - final byte[] salt; - if (!textSaltEntry.getText().isEmpty()) { - salt = textSaltEntry.getText().getBytes(StandardCharsets.UTF_8); - } else { - salt = new byte[16]; - } - if (!textLoading) { - textLoadingImage.setImage(loadingImage); - } - Thread textEncrypt = new Thread(() -> { - textThreads.getAndIncrement(); - if (limitNumberOfThreads.isSelected()) { - while (totalThreads.get() >= Runtime.getRuntime().availableProcessors()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().stop(); - } - } - } - totalThreads.getAndIncrement(); - String textAlgorithm = textAlgorithmBox.getSelectionModel().getSelectedItem(); - EnDecrypt.AES encrypt = new EnDecrypt.AES(textKeyEntry.getText(), salt, Integer.parseInt(textAlgorithm.substring(textAlgorithm.indexOf('-') + 1))); - try { - String encryptedText = encrypt.encrypt(textDecryptedEntry.getText()); - Platform.runLater(() -> textEncryptedEntry.setText(encryptedText)); - } catch (NoSuchPaddingException | InvalidKeySpecException | InvalidKeyException | NoSuchAlgorithmException | BadPaddingException e) { - e.printStackTrace(); - } catch (IllegalArgumentException | IllegalBlockSizeException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("Wrong text for encryption is given", e.getMessage())); - } - if ((textThreads.get() - 1) <= 0) { - textLoadingImage.setImage(null); - textLoading = false; - } - textThreads.getAndDecrement(); - totalThreads.getAndDecrement(); - }); - textEncrypt.setDaemon(false); - textEncrypt.start(); - textLoading = true; - } - - /** - *

Decrypt text in {@link Controller#textEncryptedEntry}. - * Get called if the text 'Decrypt' button is pressed

- * - * @since 1.0.0 - */ - public void textDecryptButton() { - final byte[] salt; - if (!textSaltEntry.getText().isEmpty()) { - salt = textSaltEntry.getText().getBytes(StandardCharsets.UTF_8); - } else { - salt = new byte[16]; - } - if (!textLoading) { - textLoadingImage.setImage(loadingImage); - } - Thread textDecrypt = new Thread(() -> { - textThreads.getAndIncrement(); - if (limitNumberOfThreads.isSelected()) { - while (totalThreads.get() >= Runtime.getRuntime().availableProcessors()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().stop(); - } - } - } - totalThreads.getAndIncrement(); - String textAlgorithm = textAlgorithmBox.getSelectionModel().getSelectedItem(); - EnDecrypt.AES decrypt = new EnDecrypt.AES(textKeyEntry.getText(), salt, Integer.parseInt(textAlgorithm.substring(textAlgorithm.indexOf('-') + 1))); - try { - String DecryptedText = decrypt.decrypt(textEncryptedEntry.getText()); - Platform.runLater(() -> textDecryptedEntry.setText(DecryptedText)); - } catch (NoSuchPaddingException | InvalidKeySpecException | InvalidKeyException | NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("Wrong key and / or salt is given", e.getMessage())); - } catch (IllegalArgumentException | IllegalBlockSizeException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("Wrong text for decryption is given", e.getMessage())); - } - if ((textThreads.get() - 1) <= 0) { - textLoading = false; - Platform.runLater(() -> textLoadingImage.setImage(null)); - } - textThreads.getAndDecrement(); - totalThreads.getAndDecrement(); - }); - textDecrypt.setDaemon(false); - textDecrypt.start(); - textLoading = true; - } - - //-----fileEnDecrypt-----// - - /** - *

Synchronized method to get the list of threads which en- / decrypt files

- * - * @return list of en- / decryption threads - */ - private synchronized List getFileEnDecryptThreads() { - return fileEnDecryptThreads; - } - - /** - *

Synchronized method to get the number of threads which en- / decrypt files

- * - * @return number of en- / decryption threads - * - * @since 1.2.0 - */ - private synchronized int getFileEnDecryptThreadsSize() { - return fileEnDecryptThreads.size(); - } - - /** - *

Synchronized method to add a thread to the file en- / decryption list of current running file en- / decryption threads

- * - * @param thread that should be added - * - * @since 1.2.0 - */ - private synchronized void addFileEnDecryptThread(Thread thread) { - fileEnDecryptThreads.add(thread); - } - - /** - *

Synchronized method to remove a thread from the file en- / decryption list of current running file en- / decryption threads

- * - * @param thread that should be removed - * - * @since 1.2.0 - */ - private synchronized void removeFileEnDecryptThread(Thread thread) { - fileEnDecryptThreads.remove(thread); - } - - /** - *

Adds a file for en- / decryption

- * - * @param file that should be added - * - * @since 1.0.0 - */ - private void fileEnDecryptAddFile(File file) { - for (Label l: enDecryptInputOutputFiles.keySet()) { - if (l.getText().equals(file.getAbsolutePath())) { - return; - } - } - Label newLabel = new Label(file.getAbsolutePath()); - newLabel.setOnKeyTyped(this::keyTypedTooltip); - newLabel.setOnMouseMoved(this::mouseOverEntryTooltip); - newLabel.setOnMouseExited(event -> mouseExitEntryTooltip()); - newLabel.setOnMouseClicked(event -> { - fileEnDecryptSelected(newLabel); - fileOutputFilesChangeText(newLabel, null, null); - fileEnDecryptLabelEvent = event; - }); - newLabel.setContextMenu(fileEnDecryptInputContextMenu); - String fileAbsolutePath = file.getAbsolutePath(); - String fileName = file.getName(); - - File encryptFile; - File decryptFile; - String fileOutputPath = file.getParent() + "/";; - String fileEnding; - ArrayList inputOutputList = new ArrayList<>(); - if (!currentConfigSettings.get("fileOutputPath").trim().isEmpty()) { - fileOutputPath = currentConfigSettings.get("fileOutputPath").trim() + "/"; - } - if (file.isFile()) { - fileEnding = ".cryptoGX"; - } else { - fileEnding = "_cryptoGX"; - } - encryptFile = new File(fileOutputPath + fileName + fileEnding); - while (encryptFile.exists()) { - encryptFile = new File(encryptFile.getAbsolutePath() + fileEnding); - } - if (fileAbsolutePath.endsWith(".cryptoGX") || fileAbsolutePath.endsWith("_cryptoGX")) { - decryptFile = new File(fileOutputPath + fileName.substring(0, fileName.length() - 9)); - } else { - decryptFile = new File(fileOutputPath + fileName + fileEnding); - } - while (decryptFile.exists()) { - decryptFile = new File(decryptFile.getAbsolutePath() + fileEnding); - } - inputOutputList.add(0, encryptFile); - inputOutputList.add(1, decryptFile); - fileEnDecryptInputFiles.getChildren().add(newLabel); - enDecryptInputOutputFiles.put(newLabel, inputOutputList); - } - - /** - *

Adds an file from the internet for en- / decryption

- * - * @param url of the file - * @param fileType of the file - * @throws URISyntaxException - * - * @since 1.5.0 - */ - private void fileEnDecryptAddInternetFile(String url, int fileType) throws URISyntaxException { - String filename; - switch (fileType) { - case FILEFILEURL: - filename = url.substring(url.lastIndexOf("/") + 1); - break; - case DATAFILEURL: - filename = url.substring(5, url.indexOf("/")) + "." + url.substring(url.indexOf("/") + 1, url.indexOf(";")); - break; - case NONSPECIFICFILEURL: - filename = "unknown" + System.nanoTime(); - break; - default: - warningAlert("Cannot read given url '" + url + "'"); - return; - } - for (Label l: enDecryptInputOutputInternetFiles.keySet()) { - if (l.getText().equals(filename)) { - return; - } - } - Label newLabel = new Label(filename); - newLabel.setOnKeyTyped(this::keyTypedTooltip); - newLabel.setOnMouseMoved(this::mouseOverEntryTooltip); - newLabel.setOnMouseExited(event -> mouseExitEntryTooltip()); - newLabel.setOnMouseClicked(event -> { - fileEnDecryptSelected(newLabel); - fileOutputFilesChangeText(newLabel, null, null); - fileEnDecryptLabelEvent = event; - }); - newLabel.setContextMenu(fileEnDecryptInputContextMenu); - - File encryptFile; - File decryptFile; - ArrayList fileSpecs = new ArrayList<>(); - ArrayList inputOutputFiles = new ArrayList<>(); - fileSpecs.add(0, fileType); - fileSpecs.add(1, url); - String currentDir = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath(); - - if (currentConfigSettings.get("fileOutputPath").trim().isEmpty()) { - encryptFile = new File(currentDir + "/" + filename + ".cryptoGX"); - while (encryptFile.isFile()) { - encryptFile = new File(encryptFile.getAbsolutePath() + ".cryptoGX"); - } - if (url.endsWith(".cryptoGX") && filename.endsWith(".cryptoGX")) { - decryptFile = new File(currentDir + "/" + filename.substring(0, filename.length() - 9)); - } else { - decryptFile = new File(currentDir + "/" + filename); - } - } else { - encryptFile = new File(currentConfigSettings.get("fileOutputPath") + "/" + filename + ".cryptoGX"); - while (encryptFile.isFile()) { - encryptFile = new File(encryptFile.getAbsolutePath() + ".cryptoGX"); - } - if (url.endsWith(".cryptoGX") && filename.endsWith(".cryptoGX")) { - decryptFile = new File(currentConfigSettings.get("fileOutputPath") + "/" + filename.substring(0, filename.length() - 9)); - } else { - decryptFile = new File(currentConfigSettings.get("fileOutputPath") + "/" + filename); - } - } - while (decryptFile.isFile()) { - decryptFile = new File(decryptFile.getAbsolutePath() + ".cryptoGX"); - } - inputOutputFiles.add(0, encryptFile); - inputOutputFiles.add(1, decryptFile); - - fileEnDecryptInputFiles.getChildren().add(newLabel); - enDecryptInputOutputInternetFiles.put(newLabel, fileSpecs); - enDecryptInputOutputFiles.put(newLabel, inputOutputFiles); - } - - /** - *

Adds an clipboard image for en- / decryption. - * This can be a normal image and an image stream

- * - * @param image that should be added - * @throws URISyntaxException - * - * @since 1.7.0 - */ - private void fileEnDecryptAddClipboardImage(BufferedImage image) throws URISyntaxException { - String filename = "clipboardImage" + System.nanoTime() + ".png"; - for (Label l: enDecryptInputOutputClipboardImages.keySet()) { - if (l.getText().equals(filename)) { - return; - } - } - Label newLabel = new Label(filename); - newLabel.setOnKeyTyped(this::keyTypedTooltip); - newLabel.setOnMouseMoved(this::mouseOverEntryTooltip); - newLabel.setOnMouseExited(event -> mouseExitEntryTooltip()); - newLabel.setOnMouseClicked(event -> { - fileEnDecryptSelected(newLabel); - fileOutputFilesChangeText(newLabel, null, null); - fileEnDecryptLabelEvent = event; - }); - newLabel.setContextMenu(fileEnDecryptInputContextMenu); - - File encryptFile; - File decryptFile; - String currentDir = this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath(); - ArrayList inputOutputFiles = new ArrayList<>(); - - if (currentConfigSettings.get("fileOutputPath").trim().isEmpty()) { - encryptFile = new File(currentDir + "/" + filename + ".cryptoGX"); - decryptFile = new File(currentDir + "/" + filename); - } else { - encryptFile = new File(currentConfigSettings.get("fileOutputPath").trim() + "/" + filename + ".cryptoGX"); - decryptFile = new File(currentConfigSettings.get("fileOutputPath").trim() + "/" + filename); - } - while (encryptFile.isFile()) { - encryptFile = new File(encryptFile.getAbsolutePath() + ".cryptoGX"); - } - while (decryptFile.isFile()) { - decryptFile = new File(decryptFile.getAbsolutePath() + ".cryptoGX"); - } - inputOutputFiles.add(0, encryptFile); - inputOutputFiles.add(1, decryptFile); - - fileEnDecryptInputFiles.getChildren().add(newLabel); - enDecryptInputOutputClipboardImages.put(newLabel, image); - enDecryptInputOutputFiles.put(newLabel, inputOutputFiles); - } - - /** - *

Changes the text in the file en- / decryption output file text fields

- * - * @param label - * @param encryptOutputFile is the filename of the file it gets encrypted - * @param decryptOutputFile is the filename of the file it gets decrypted - * - * @since 1.2.0 - */ - private void fileOutputFilesChangeText(Label label, String encryptOutputFile, String decryptOutputFile) { - File encryptFile; - File decryptFile; - ArrayList change = new ArrayList<>(); - if (encryptOutputFile == null) { - encryptFile = enDecryptInputOutputFiles.get(label).get(0); - } else { - encryptFile = new File(encryptOutputFile); - } - if (decryptOutputFile == null) { - decryptFile = enDecryptInputOutputFiles.get(label).get(1); - } else { - decryptFile = new File(decryptOutputFile); - } - change.add(0, encryptFile); - change.add(1, decryptFile); - if (encryptFile.toString().trim().isEmpty()) { - fileEncryptOutputFile.setText(""); - } else { - fileEncryptOutputFile.setText(encryptFile.getAbsolutePath()); - } - if (decryptFile.toString().trim().isEmpty()) { - fileDecryptOutputFile.setText(""); - } else { - fileDecryptOutputFile.setText(decryptFile.getAbsolutePath()); - } - enDecryptInputOutputFiles.replace(label, change); - } - - /** - *

Deletes an entry for en- / decryption. - * Get called if the user presses 'del' or delete the entry in the en- / decryption box via the right click tooltip

- * - * @param label that should be deleted - * - * @since 1.2.0 - */ - private void fileEnDecryptDeleteEntry(Label label) { - enDecryptInputOutputFiles.remove(label); - if (fileEnDecryptInputFiles.getChildren().size() - 1 >= 1) { - for (int i = 0; i < fileEnDecryptInputFiles.getChildren().size(); i++) { - if (fileEnDecryptInputFiles.getChildren().get(i) == label) { - fileEnDecryptInputFiles.getChildren().remove(label); - if (label == choosedLabel) { - try { - choosedLabel = (Label) fileEnDecryptInputFiles.getChildren().get(i - 1); - choosedLabelType = "ENDECRYPT"; - fileOutputFilesChangeText(choosedLabel, null, null); - fileEnDecryptSelected(choosedLabel); - } catch (ArrayIndexOutOfBoundsException e) { - e.printStackTrace(); - fileOutputFileChangeDest.setDisable(true); - getChoosedLabelOutputFileFolder.setDisable(true); - fileEncryptOutputFile.setEditable(false); - fileDecryptOutputFile.setEditable(false); - fileOutputFilesChangeText(choosedLabel, "", ""); - choosedLabel = null; - choosedLabelType = null; - } - break; - } - } - } - } else { - fileEnDecryptInputFiles.getChildren().remove(label); - fileOutputFileChangeDest.setDisable(true); - getChoosedLabelOutputFileFolder.setDisable(true); - fileEncryptOutputFile.setEditable(false); - fileDecryptOutputFile.setEditable(false); - if (label == choosedLabel) { - fileOutputFilesChangeText(choosedLabel, "", ""); - choosedLabel = null; - choosedLabelType = null; - } - } - } - - /** - *

Changes the highlight of the clicked item in the en- / decryption box. - * Get called if the user click an non-highlighted item in the en- / decryption box

- * - * @param changeLabel is the label that the user has clicked - * - * @since 1.0.0 - */ - private void fileEnDecryptSelected(Label changeLabel) { - if (changeLabel != null) { - fileDeleteSelected(null); - enDecryptInputOutputFiles.keySet().forEach(label -> label.setStyle(null)); - changeLabel.setStyle("-fx-background-color: lightblue; -fx-border-color: #292929"); - fileDecryptOutputFile.setEditable(true); - fileEncryptOutputFile.setEditable(true); - fileOutputFileChangeDest.setDisable(false); - getChoosedLabelOutputFileFolder.setDisable(false); - choosedLabel = changeLabel; - choosedLabelType = "ENDECRYPT"; - } else { - enDecryptInputOutputFiles.keySet().forEach(label -> label.setStyle(null)); - fileDecryptOutputFile.setEditable(false); - fileEncryptOutputFile.setEditable(false); - fileOutputFileChangeDest.setDisable(true); - getChoosedLabelOutputFileFolder.setDisable(true); - } - } - - /** - *

Opens a file chooser GUI where the user can select the files that should be en- / decrypted. - * Get called if the 'Choose files...' in the file en- / decrypt section button is pressed

- * - * @since 1.12.0 - */ - public void fileEnDecryptChooseFiles() { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle("Choose files"); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("All files", "*.*")); - List files = fileChooser.showOpenMultipleDialog(rootWindow.getScene().getWindow()); - try { - if (files.size() > 0) { - files.forEach(this::fileEnDecryptAddFile); - } - } catch (NullPointerException e) { - e.printStackTrace(); - } - } - - /** - *

Opens a directory chooser GUI where the user can select the directories that should be en- / decrypted. - * Get called if the 'directories...' in the file en- / decrypt section button is pressed

- * - * @since 1.12.0 - */ - public void fileEnDecryptChooseDirectories() { - DirectoryChooser directoryChooser = new DirectoryChooser(); - directoryChooser.setTitle("Choose directories"); - File file = directoryChooser.showDialog(rootWindow.getScene().getWindow()); - try { - fileEnDecryptAddFile(file); - } catch (NullPointerException e) { - e.printStackTrace(); - } - } - - /** - *

Get called if user drags a (normal or internet) file over the en- / decrypt file box

- * - * @param event source - * - * @since 1.2.0 - */ - public void onFileEnDecryptDragOver(DragEvent event) { - Dragboard dragboard = event.getDragboard(); - if (event.getGestureSource() != fileEnDecryptInputFiles) { - if (dragboard.hasFiles()) { - event.acceptTransferModes(TransferMode.COPY_OR_MOVE); - } else if (dragboard.hasUrl()) { - String url = dragboard.getUrl(); - String urlFilename = dragboard.getUrl().split("/")[dragboard.getUrl().split("/").length - 1]; - if (url.startsWith("data:")) { - try { - final int dataStartIndex = url.indexOf(",") + 1; - final String data = url.substring(dataStartIndex); - java.util.Base64.getDecoder().decode(data); - event.acceptTransferModes(TransferMode.COPY_OR_MOVE); - } catch (Exception e) { - e.printStackTrace(); - } - } else if (urlFilename.contains(".") && Utils.hasAnyCharacter("\\/:*?|<>\"", urlFilename)) { - try { - new URL(url); - event.acceptTransferModes(TransferMode.COPY_OR_MOVE); - } catch (Exception e) { - e.printStackTrace(); - return; - } - } else { - event.acceptTransferModes(TransferMode.COPY_OR_MOVE); - } - } - } - } - - /** - *

Get called if the user drops the dragged (normal or internet) file over the en- / decrypt file box

- * - * @param event source - * @throws URISyntaxException - * - * @since 1.2.0 - */ - public void onFileEnDecryptDragNDrop(DragEvent event) throws URISyntaxException { - Dragboard dragboard = event.getDragboard(); - if (dragboard.hasFiles()) { - dragboard.getFiles().forEach(this::fileEnDecryptAddFile); - } else if (dragboard.hasUrl()) { - String url = dragboard.getUrl(); - String urlFilename = dragboard.getUrl().split("/")[dragboard.getUrl().split("/").length - 1]; - if (url.startsWith("data:")) { - fileEnDecryptAddInternetFile(url, DATAFILEURL); - } else if (urlFilename.contains(".") && Utils.hasAnyCharacter("\\/:*?|<>\"", urlFilename)) { - fileEnDecryptAddInternetFile(url, FILEFILEURL); - } else { - fileEnDecryptAddInternetFile(url, NONSPECIFICFILEURL); - } - } - } - - /** - *

If the user presses Ctrl + V: Adds the last object in clipboard (if file) for en- / decryption. - * Get called if the user presses a key while selected file en- / decryption box

- * - * @param event source - * @throws URISyntaxException - * - * @since 1.7.0 - */ - public void onFileEnDecryptPaste(KeyEvent event) throws URISyntaxException { - if (paste.match(event)) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - Transferable transferable = clipboard.getContents(null); - try { - if (transferable != null) { - if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { - Object objectFileList = transferable.getTransferData(DataFlavor.javaFileListFlavor); - List files = (List) objectFileList; - files.forEach(o -> fileEnDecryptAddFile((File) o)); - } else if (transferable.isDataFlavorSupported(DataFlavor.imageFlavor)) { - Object objectImage = transferable.getTransferData(DataFlavor.imageFlavor); - fileEnDecryptAddClipboardImage((BufferedImage) objectImage); - } - } - } catch (UnsupportedFlavorException | IOException e) { - e.printStackTrace(); - } - } - } - - /** - *

Encrypt all files given files. - * Get called if file 'Encrypt' button is pressed

- * - * @since 1.0.0 - */ - public void fileEncryptButton() { - final byte[] salt; - if (!fileEnDecryptSaltEntry.getText().isEmpty()) { - salt = fileEnDecryptSaltEntry.getText().getBytes(StandardCharsets.UTF_8); - } else { - salt = new byte[16]; - } - if (!enDecryptInputOutputFiles.isEmpty()) { - removeFileFromFileBox.setDisable(true); - limitNumberOfThreads.setDisable(true); - for(Map.Entry> entry: enDecryptInputOutputFiles.entrySet()) { - Thread thread = new Thread(() -> { - addFileEnDecryptThread(Thread.currentThread()); - if (limitNumberOfThreads.isSelected()) { - while (totalThreads.get() >= Runtime.getRuntime().availableProcessors()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().stop(); - } - } - } - totalThreads.getAndIncrement(); - Label inputFileLabel = entry.getKey(); - ArrayList outputFileList = entry.getValue(); - String fileEnDecryptAlgorithm = fileEnDecryptAlgorithmBox.getSelectionModel().getSelectedItem(); - EnDecrypt.AES fileEncrypt = new EnDecrypt.AES(fileEnDecryptKeyEntry.getText(), salt, Integer.parseInt(fileEnDecryptAlgorithm.substring(fileEnDecryptAlgorithm.indexOf('-') + 1))); - if (enDecryptInputOutputInternetFiles.containsKey(inputFileLabel)) { - ArrayList fileSpecs = enDecryptInputOutputInternetFiles.get(inputFileLabel); - int urlType = (int) fileSpecs.get(0); - String url = (String) fileSpecs.get(1); - try { - if (urlType == FILEFILEURL || urlType == NONSPECIFICFILEURL) { - URLConnection openURL = new URL(url).openConnection(); - openURL.addRequestProperty("User-Agent", "Mozilla/5.0"); - fileEncrypt.encryptFile(openURL.getInputStream(), new FileOutputStream((File) fileSpecs.get(2)), buffer); - } else if (urlType == DATAFILEURL) { - final int dataStartIndex = url.indexOf(",") + 1; - final String data = url.substring(dataStartIndex); - byte[] decoded = java.util.Base64.getDecoder().decode(data); - fileEncrypt.encryptFile(new ByteArrayInputStream(decoded), new FileOutputStream((File) fileSpecs.get(2)), buffer); - } - } catch (FileNotFoundException | InvalidKeySpecException | NoSuchAlgorithmException | MalformedURLException | InvalidKeyException | NoSuchPaddingException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("IO Exception occurred", e.getMessage())); - } - } else if (enDecryptInputOutputClipboardImages.containsKey(inputFileLabel)) { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - BufferedImage bufferedImage = enDecryptInputOutputClipboardImages.get(inputFileLabel); - try { - ImageIO.write(bufferedImage, "png", byteArrayOutputStream); - fileEncrypt.encryptFile(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), new FileOutputStream(outputFileList.get(0).getAbsoluteFile()), buffer); - } catch (IOException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("IO Exception occurred", e.getMessage())); - } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | InvalidKeySpecException e) { - e.printStackTrace(); - } - } else { - try { - File inputFile = new File(inputFileLabel.getText()); - if (inputFile.isFile()) { - fileEncrypt.encryptFile(new FileInputStream(inputFile), new FileOutputStream(outputFileList.get(0)), buffer); - } else { - fileEncrypt.encryptDirectory(inputFileLabel.getText(), outputFileList.get(0).getAbsolutePath(), ".cryptoGX", buffer); - if (!outputFileList.get(0).isDirectory()) { - Platform.runLater(() -> warningAlert("Couldn't create directory\n '" + outputFileList.get(0).getAbsolutePath() + "'.\nTry again or restart cryptoGX with admin privileges")); - } - } - } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("IO Exception occurred", e.getMessage())); - } - } - if (removeFileFromFileBox.isSelected()) { - Platform.runLater(() -> fileEnDecryptDeleteEntry(entry.getKey())); - } - if ((getFileEnDecryptThreadsSize() - 1) <= 0) { - fileEnDecryptLoading = false; - Platform.runLater(() -> { - fileEnDecryptLoadingImage.setImage(null); - removeFileFromFileBox.setDisable(false); - limitNumberOfThreads.setDisable(false); - }); - } - removeFileEnDecryptThread(Thread.currentThread()); - totalThreads.getAndDecrement(); - }); - thread.setDaemon(false); - thread.start(); - if (!fileEnDecryptLoading) { - fileEnDecryptLoadingImage.setImage(loadingImage); - } - fileEnDecryptLoading = true; - } - } - } - - /** - *

Decrypt all files given files. - * Get called if file 'Decrypt' button is pressed

- * - * @since 1.0.0 - */ - public void fileDecryptButton() { - final byte[] salt; - if (!fileEnDecryptSaltEntry.getText().isEmpty()) { - salt = fileEnDecryptSaltEntry.getText().getBytes(StandardCharsets.UTF_8); - } else { - salt = new byte[16]; - } - if (!enDecryptInputOutputFiles.isEmpty()) { - removeFileFromFileBox.setDisable(true); - limitNumberOfThreads.setDisable(true); - for(Map.Entry> entry: enDecryptInputOutputFiles.entrySet()) { - Thread thread = new Thread(() -> { - addFileEnDecryptThread(Thread.currentThread()); - if (limitNumberOfThreads.isSelected()) { - while (totalThreads.get() >= Runtime.getRuntime().availableProcessors()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().stop(); - } - } - } - totalThreads.getAndIncrement(); - Label inputFileLabel = entry.getKey(); - ArrayList outputFileList = entry.getValue(); - String fileEnDecryptAlgorithm = fileEnDecryptAlgorithmBox.getSelectionModel().getSelectedItem(); - EnDecrypt.AES fileDecrypt = new EnDecrypt.AES(fileEnDecryptKeyEntry.getText(), salt, Integer.parseInt(fileEnDecryptAlgorithm.substring(fileEnDecryptAlgorithm.indexOf('-') + 1))); - if (enDecryptInputOutputInternetFiles.containsKey(entry.getKey())) { - ArrayList imageSpecs = enDecryptInputOutputInternetFiles.get(entry.getKey()); - int urlType = (int) imageSpecs.get(0); - String url = (String) imageSpecs.get(1); - try { - if (urlType == FILEFILEURL) { - URLConnection openURL = new URL(url).openConnection(); - openURL.addRequestProperty("User-Agent", "Mozilla/5.0"); - fileDecrypt.decryptFile(openURL.getInputStream(), new FileOutputStream((File) imageSpecs.get(2)), buffer); - fileDecrypt.decryptFile(openURL.getInputStream(), new FileOutputStream((File) imageSpecs.get(2)), buffer); - } else if (urlType == DATAFILEURL) { - final int dataStartIndex = url.indexOf(",") + 1; - final String data = url.substring(dataStartIndex); - byte[] decoded = java.util.Base64.getDecoder().decode(data); - fileDecrypt.decryptFile(new ByteArrayInputStream(decoded), new FileOutputStream((File) imageSpecs.get(2)), buffer); - } else if (urlType == NONSPECIFICFILEURL) { - URLConnection openURL = new URL(url).openConnection(); - openURL.addRequestProperty("User-Agent", "Mozilla/5.0"); - fileDecrypt.decryptFile(openURL.getInputStream(), new FileOutputStream((File) imageSpecs.get(2)), buffer); - } - } catch (FileNotFoundException | InvalidKeySpecException | NoSuchAlgorithmException | MalformedURLException | InvalidKeyException | NoSuchPaddingException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("IO Exception occurred", e.getMessage())); - } - } else if (enDecryptInputOutputClipboardImages.containsKey(inputFileLabel)) { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - BufferedImage bufferedImage = enDecryptInputOutputClipboardImages.get(inputFileLabel); - try { - ImageIO.write(bufferedImage, "png", byteArrayOutputStream); - fileDecrypt.decryptFile(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()), new FileOutputStream(outputFileList.get(1).getAbsolutePath()), buffer); - } catch (IOException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("IO Exception occurred", e.getMessage())); - } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchPaddingException | InvalidKeySpecException e) { - e.printStackTrace(); - } - } else { - try { - File inputFile = new File(inputFileLabel.getText()); - if (inputFile.isFile()) { - fileDecrypt.decryptFile(new FileInputStream(inputFile), new FileOutputStream(outputFileList.get(1)), buffer); - } else { - fileDecrypt.decryptDirectory(inputFileLabel.getText(), outputFileList.get(1).getAbsolutePath(), "@.cryptoGX@", buffer); - if (!outputFileList.get(1).isDirectory()) { - Platform.runLater(() -> warningAlert("Couldn't create directory\n '" + outputFileList.get(1).getAbsolutePath() + "'.\nTry again or restart cryptoGX with admin privileges")); - } - } - } catch (NoSuchPaddingException | InvalidKeySpecException | InvalidKeyException | NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("IO Exception occurred", e.getMessage())); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - Platform.runLater(() -> errorAlert("Wrong text for encryption is given", e.getMessage())); - } - } - if (removeFileFromFileBox.isSelected()) { - Platform.runLater(() -> fileEnDecryptDeleteEntry(entry.getKey())); - } - if ((getFileEnDecryptThreadsSize() - 1) <= 0) { - fileEnDecryptLoading = false; - Platform.runLater(() -> { - fileEnDecryptLoadingImage.setImage(null); - removeFileFromFileBox.setDisable(false); - limitNumberOfThreads.setDisable(false); - }); - } - removeFileEnDecryptThread(Thread.currentThread()); - totalThreads.getAndDecrement(); - }); - thread.setDaemon(false); - thread.start(); - if (!fileEnDecryptLoading) { - fileEnDecryptLoadingImage.setImage(loadingImage); - } - fileEnDecryptLoading = true; - } - } - } - - /** - *

Cancels the file en- / decryption. - * Get called if the file en- / decrypt 'Cancel' button is pressed

- * - * @since 1.12.0 - */ - public void fileEnDecryptCancelButton() { - for (Iterator iterator = getFileEnDecryptThreads().iterator(); iterator.hasNext();) { - Thread thread = iterator.next(); - while (thread.isAlive() && !thread.isInterrupted()) { - thread.stop(); - thread.interrupt(); - } - iterator.remove(); - } - fileEnDecryptLoading = false; - fileEnDecryptLoadingImage.setImage(null); - removeFileFromFileBox.setDisable(false); - limitNumberOfThreads.setDisable(false); - } - - //-----fileDelete-----// - - /** - *

Synchronized method to get the list of threads which delete files

- * - * @return list of threads which delete files - * - * @since 1.2.0 - */ - private synchronized List getFileDeleteThreads() { - return fileDeleteThreads; - } - - /** - *

Synchronized method to get the number of threads which delete files

- * - * @return number of threads which delete files - * - * @since 1.2.0 - */ - private synchronized int getFileDeleteThreadsSize() { - return fileDeleteThreads.size(); - } - - /** - *

Synchronized method to add a thread to the file delete list of current running file delete threads

- * - * @param thread that should be added - * - * @since 1.2.0 - */ - private synchronized void addFileDeleteThread(Thread thread) { - fileDeleteThreads.add(thread); - } - - /** - *

Synchronized method to remove a thread from the file delete list of current file delete threads

- * - * @param thread that should be removed - * - * @since 1.2.0 - */ - private synchronized void removeFileDeleteThread(Thread thread) { - fileDeleteThreads.remove(thread); - } - - /** - *

Adds a file that should be deleted

- * - * @param file that should be added - * - * @since 1.2.0 - */ - private void fileDeleteAddFile(File file) { - for (File f: deleteInputFiles.values()) { - if (f.getAbsolutePath().equals(file.getAbsolutePath())) { - return; - } - } - Label newLabel = new Label(file.getAbsolutePath()); - newLabel.setOnKeyTyped(this::keyTypedTooltip); - newLabel.setOnMouseMoved(this::mouseOverEntryTooltip); - newLabel.setOnMouseExited(event -> mouseExitEntryTooltip()); - newLabel.setOnMouseClicked(event -> fileDeleteSelected(newLabel)); - newLabel.setContextMenu(fileDeleteInputContextMenu); - fileDeleteInputFiles.getChildren().add(newLabel); - deleteInputFiles.put(newLabel, file.getAbsoluteFile()); - } - - /** - *

Changes the highlight of the clicked item in the file delete box. - * Get called if the user click an non-highlighted item in the file delete box

- * - * @param changeLabel is the label that the user has clicked - * - * @since 1.2.0 - */ - private void fileDeleteSelected(Label changeLabel) { - if (changeLabel != null) { - fileEnDecryptSelected(null); - deleteInputFiles.keySet().forEach(label -> label.setStyle(null)); - changeLabel.setStyle("-fx-background-color: lightblue; -fx-border-color: #292929"); - choosedLabel = changeLabel; - choosedLabelType = "DELETE"; - } else { - deleteInputFiles.keySet().forEach(label -> label.setStyle(null)); - } - } - - /** - *

Deletes an entry for file delete. - * Get called if the user presses 'del' or delete the entry in the file delete box via the right click tooltip

- * - * @param label that should be deleted - * - * @since 1.12.0 - */ - private void fileDeleteDeleteEntry(Label label) { - deleteInputFiles.remove(choosedLabel); - if (fileDeleteInputFiles.getChildren().size() - 1 >= 1) { - for (int i=0; iOpens a file chooser GUI where the user can select the files that should be en- / decrypted. - * Get called if the 'Choose files...' in the delete section button is pressed

- * - * @since 1.12.0 - */ - public void fileDeleteChooseFiles() { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle("Choose files"); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("All Files", "*.*")); - List files = fileChooser.showOpenMultipleDialog(rootWindow.getScene().getWindow()); - try { - if (files.size() > 0) { - files.forEach(this::fileDeleteAddFile); - } - } catch (NullPointerException e) { - e.printStackTrace(); - } - } - - /** - *

Opens a directory chooser GUI where the user can select the directories that should be en- / decrypted. - * Get called if the 'Choose directories...' in the delete section button is pressed

- * - * @since 1.12.0 - */ - public void fileDeleteChooseDirectories() { - DirectoryChooser directoryChooser = new DirectoryChooser(); - directoryChooser.setTitle("Choose directories"); - File file = directoryChooser.showDialog(rootWindow.getScene().getWindow()); - try { - fileDeleteAddFile(file); - } catch (NullPointerException e) { - e.printStackTrace(); - } - } - - /** - *

Get called if user drags a file over the delete file box

- * - * @param event source - * - * @since 1.2.0 - */ - public void onFileDeleteDragOver(DragEvent event) { - Dragboard dragboard = event.getDragboard(); - if (event.getGestureSource() != fileDeleteInputFiles && dragboard.hasFiles()) { - event.acceptTransferModes(TransferMode.COPY_OR_MOVE); - } - } - - /** - *

Get called if the user drops the dragged file over the delete file box

- * - * @param event source - * - * @since 1.2.0 - */ - public void onFileDeleteDragNDrop(DragEvent event) { - Dragboard dragboard = event.getDragboard(); - if (dragboard.hasFiles()) { - dragboard.getFiles().forEach(file -> { - if (file.isFile() || file.isDirectory()) { - fileDeleteAddFile(file); - } - }); - } - } - - /** - *

Delete all given files. - * Get called if 'Delete' button is pressed

- * - * @since 1.2.0 - */ - public void fileDelete() { - if (!fileDeleteLoading && !deleteInputFiles.isEmpty()) { - fileDeleteLoadingImage.setImage(loadingImage); - } - int deleteIterations = Integer.parseInt(fileDeleteIterationsEntry.getText()); - for (Map.Entry map : deleteInputFiles.entrySet()) { - Label label = map.getKey(); - File file = map.getValue(); - Thread thread = new Thread(() -> { - addFileDeleteThread(Thread.currentThread()); - if (limitNumberOfThreads.isSelected()) { - while (totalThreads.get() >= Runtime.getRuntime().availableProcessors()) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Thread.currentThread().stop(); - } - } - } - totalThreads.getAndIncrement(); - try { - if (file.isFile()) { - SecureDelete.deleteFile(file, deleteIterations, buffer); - } else if (file.isDirectory()) { - SecureDelete.deleteDirectory(file.getAbsolutePath(), deleteIterations, buffer); - } - } catch (IOException e) { - e.printStackTrace(); - } - if ((getFileDeleteThreadsSize() - 1) <= 0) { - fileDeleteLoading = false; - Platform.runLater(() -> fileDeleteLoadingImage.setImage(null)); - } - if (label == choosedLabel) { - choosedLabel = null; - choosedLabelType = null; - } - Platform.runLater(() -> fileDeleteInputFiles.getChildren().remove(label)); - removeFileDeleteThread(Thread.currentThread()); - totalThreads.getAndDecrement(); - }); - thread.setDaemon(false); - thread.start(); - fileDeleteLoading = true; - } - } - - /** - *

Cancels the file en- / decryption. - * Get called if the file delete 'Cancel' button is pressed

- * - * @since 1.12.0 - */ - public void fileDeleteCancelButton() { - for (Iterator iterator = getFileDeleteThreads().iterator(); iterator.hasNext();) { - Thread thread = iterator.next(); - while (thread.isAlive() & !thread.isInterrupted()) { - thread.stop(); - thread.interrupt(); - } - iterator.remove(); - } - fileDeleteLoading = false; - fileDeleteLoadingImage.setImage(null); - } - - /** - * Called to initialize a controller after its root element has been - * completely processed. - * - * @param location - * The location used to resolve relative paths for the root object, or - * null if the location is not known. - * - * @param resources - * The resources used to localize the root object, or null if - * the root object was not localized. - * - * @since 1.0.0 - */ - @Override - public void initialize(URL location, ResourceBundle resources) { - - //-----general-----// - - currentConfigSettings.put("textKey", configDefaultTextKey); - currentConfigSettings.put("textSalt", configDefaultTextSalt); - currentConfigSettings.put("textAlgorithm", configDefaultTextAlgorithm); - - currentConfigSettings.put("fileEnDecryptKey", configDefaultFileEnDecryptKey); - currentConfigSettings.put("fileEnDecryptSalt", configDefaultFileEnDecryptSalt); - currentConfigSettings.put("fileEnDecryptAlgorithm", configDefaultFileEnDecryptAlgorithm); - - currentConfigSettings.put("fileDeleteIterations", String.valueOf(configDefaultFileDeleteIterations)); - - currentConfigSettings.put("fileOutputPath", configDefaultFileOutputPath); - currentConfigSettings.put("removeFromFileBox", String.valueOf(configDefaultRemoveFileFromFileBox)); - currentConfigSettings.put("limitNumberOfThreads", String.valueOf(configDefaultLimitNumberOfThreads)); - - menubar.setOnMouseDragged(event -> { - Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); - stage.setX(event.getScreenX() + menubarX); - stage.setY(event.getScreenY() + menubarY); - }); - menubar.setOnMousePressed(event -> { - Scene scene = ((Node) event.getSource()).getScene(); - menubarX = scene.getX() - event.getSceneX(); - menubarY = scene.getY() - event.getSceneY(); - }); - - rootWindow.setOnKeyReleased(event -> { - if (event.getCode() == KeyCode.DELETE && choosedLabelType != null) { - if (choosedLabelType.equals("ENDECRYPT")) { - fileEnDecryptDeleteEntry(choosedLabel); - } else if (choosedLabelType.equals("DELETE")) { - fileDeleteDeleteEntry(choosedLabel); - } - } - }); - - getChoosedLabelInputFileFolder.setOnAction(event -> { - Desktop desktop = Desktop.getDesktop(); - String filePath = choosedLabel.getText(); - try { - desktop.open(new File(filePath.substring(0, filePath.lastIndexOf(System.getProperty("file.separator"))))); - } catch (IOException e) { - errorAlert("An unexpected IO Exception occurred", e.getMessage()); - } - }); - - getChoosedLabelOutputFileFolder.setOnAction(event -> { - Desktop desktop; - String filePath; - if (enDecryptInputOutputFiles.containsKey(choosedLabel)) { - desktop = Desktop.getDesktop(); - filePath = enDecryptInputOutputFiles.get(choosedLabel).get(0).getAbsolutePath(); - } else { - return; - } - try { - desktop.open(new File(filePath.substring(0, filePath.lastIndexOf(System.getProperty("file.separator"))))); - } catch (IOException e) { - errorAlert("An unexpected IO Exception occurred", e.getMessage()); - } - }); - - setDefaultOutputPath.setOnAction(event -> { - DirectoryChooser directoryChooser = new DirectoryChooser(); - File directory = directoryChooser.showDialog(rootWindow.getScene().getWindow()); - try { - currentConfigSettings.replace("fileOutputPath", directory.getAbsolutePath()); - } catch (NullPointerException e) { - e.printStackTrace(); - } - }); - - settingsMenu.setOnShowing(event -> { - loadSettings.setDisable(!isConfig); - exportSettings.setDisable(!isConfig); - }); - - removeFileFromFileBox.setOnAction(event -> currentConfigSettings.replace("removeFromFileBox", String.valueOf(removeFileFromFileBox.isSelected()))); - limitNumberOfThreads.setOnAction(event -> currentConfigSettings.replace("limitNumberOfThreads", String.valueOf(limitNumberOfThreads.isSelected()))); - saveSettings.setOnAction(event -> { - try { - addSettingGUI(rootWindow.getScene().getWindow(), currentConfigSettings); - if (config.isFile()) { - isConfig = true; - } - } catch (IOException e) { - e.printStackTrace(); - } - }); - loadSettings.setOnAction(event -> { - try { - currentConfigSettings = (HashMap) loadSettingsGUI(rootWindow.getScene().getWindow()).values().toArray()[0]; - textKeyEntry.setText(currentConfigSettings.get("textKey")); - textSaltEntry.setText(currentConfigSettings.get("textSalt")); - textAlgorithmBox.setValue(currentConfigSettings.get("textAlgorithm")); - - fileEnDecryptKeyEntry.setText(currentConfigSettings.get("fileEnDecryptKey")); - fileEnDecryptSaltEntry.setText(currentConfigSettings.get("fileEnDecryptSalt")); - fileEnDecryptAlgorithmBox.setValue(currentConfigSettings.get("fileEnDecryptAlgorithm")); - - fileDeleteIterationsEntry.setText(currentConfigSettings.get("fileDeleteIterations")); - - removeFileFromFileBox.setSelected(Boolean.parseBoolean(currentConfigSettings.get("removeFromFileBox"))); - limitNumberOfThreads.setSelected(Boolean.parseBoolean(currentConfigSettings.get("limitNumberOfThreads"))); - } catch (IOException e) { - e.printStackTrace(); - } catch (ArrayIndexOutOfBoundsException ex) { - try { - SecureDelete.deleteFile(config, 5, buffer); - isConfig = false; - } catch (IOException e) { - e.printStackTrace(); - } - } - }); - exportSettings.setOnAction(event -> { - try { - exportSettingsGUI(rootWindow.getScene().getWindow()); - } catch (IOException e) { - e.printStackTrace(); - errorAlert("IO Exception occurred", e.getMessage()); - } - }); - importSettings.setOnAction(event -> { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle("Import settings"); - fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Config files", "*.config*", "*.xml"), new FileChooser.ExtensionFilter("All files", "*.*")); - File file = fileChooser.showOpenDialog(rootWindow.getScene().getWindow()); - if (file != null) { - if (isConfig) { - writeSettings(config, readSettings(file)); - } else { - writeSettings(config, readSettings(file)); - isConfig = true; - } - } - }); - - //-----text------// - - textAlgorithmBox.setItems(FXCollections.observableArrayList(Utils.algorithms.keySet())); - textAlgorithmBox.setValue(Utils.algorithms.keySet().toArray(new String[Utils.algorithms.size()])[0]); - - //-----fileEnDecrypt-----// - - fileEnDecryptAlgorithmBox.setItems(FXCollections.observableArrayList(Utils.algorithms.keySet())); - fileEnDecryptAlgorithmBox.setValue(Utils.algorithms.keySet().toArray(new String[Utils.algorithms.size()])[0]); - - MenuItem enDecryptRemove = new MenuItem(); - enDecryptRemove.setText("Remove"); - enDecryptRemove.setOnAction(removeEvent -> fileEnDecryptDeleteEntry(choosedLabel)); - MenuItem enDecryptChangeDest = new MenuItem(); - enDecryptChangeDest.setText("Change output file / directory"); - enDecryptChangeDest.setOnAction(outputFileChangeEvent -> { - File file; - if (new File(choosedLabel.getText()).isFile()) { - FileChooser destChooser = new FileChooser(); - destChooser.setTitle("Choose or create new file"); - destChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("All files", "*.*")); - file = destChooser.showSaveDialog(rootWindow.getScene().getWindow()); - } else { - DirectoryChooser destChooser = new DirectoryChooser(); - destChooser.setTitle("Choose or create new directory"); - file = destChooser.showDialog(rootWindow.getScene().getWindow()); - } - if (file != null) { - for (Map.Entry> entry : enDecryptInputOutputFiles.entrySet()) { - if (entry.getKey().getText().equals(choosedLabel.getText())) { - ArrayList changedFile = new ArrayList<>(); - changedFile.add(0, file); - changedFile.add(1, file); - enDecryptInputOutputFiles.replace(entry.getKey(), entry.getValue(), changedFile); - fileOutputFilesChangeText((Label) fileEnDecryptLabelEvent.getSource(), file.getAbsolutePath(), file.getAbsolutePath()); - break; - } - } - } - }); - fileEnDecryptInputContextMenu.getItems().addAll(enDecryptRemove, enDecryptChangeDest); - - ContextMenu fileEnDecryptInputFilesMenu = new ContextMenu(); - MenuItem enDecryptPaste = new MenuItem(); - enDecryptPaste.setText("Paste"); - enDecryptPaste.setOnAction(pasteEvent -> { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - Transferable transferable = clipboard.getContents(null); - try { - if (transferable != null) { - if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { - Object objectFileList = transferable.getTransferData(DataFlavor.javaFileListFlavor); - List files = (List) objectFileList; - files.forEach(o -> fileEnDecryptAddFile((File) o)); - } else if (transferable.isDataFlavorSupported(DataFlavor.imageFlavor)) { - Object objectImage = transferable.getTransferData(DataFlavor.imageFlavor); - fileEnDecryptAddClipboardImage((BufferedImage) objectImage); - } - } - } catch (UnsupportedFlavorException | IOException | URISyntaxException e) { - e.printStackTrace(); - } - }); - fileEnDecryptInputFilesMenu.getItems().add(enDecryptPaste); - - fileEnDecryptInputFiles.setOnContextMenuRequested(event -> { - if (!fileEnDecryptInputContextMenu.isShowing()) { - fileEnDecryptInputFilesMenu.show(((VBox) event.getSource()).getParent().getScene().getWindow(), event.getScreenX(), event.getScreenY()); - } - }); - - fileOutputFileChangeDest.setOnAction(event -> { - FileChooser fileDestChooser = new FileChooser(); - fileDestChooser.setTitle("Choose or create new file"); - fileDestChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("All files", "*.*")); - File file = fileDestChooser.showSaveDialog(rootWindow.getScene().getWindow()); - if (file != null) { - for (Map.Entry> entry : enDecryptInputOutputFiles.entrySet()) { - if (entry.getKey().getText().equals(choosedLabel.getText())) { - ArrayList changedFile = new ArrayList<>(); - changedFile.add(0, file); - changedFile.add(1, file); - enDecryptInputOutputFiles.replace(entry.getKey(), entry.getValue(), changedFile); - fileOutputFilesChangeText((Label) fileEnDecryptLabelEvent.getSource(), file.getAbsolutePath(), file.getAbsolutePath()); - break; - } - } - } - }); - - fileOutputFileChangeDest.setDisable(true); - getChoosedLabelOutputFileFolder.setDisable(true); - - fileEncryptOutputFile.textProperty().addListener((observable, oldValue, newValue) -> fileOutputFilesChangeText(choosedLabel, newValue, fileDecryptOutputFile.getText())); - fileDecryptOutputFile.textProperty().addListener((observable, oldValue, newValue) -> fileOutputFilesChangeText(choosedLabel, fileEncryptOutputFile.getText(), newValue)); - - //-----fileDelete-----// - - MenuItem deleteRemove = new MenuItem(); - deleteRemove.setText("Remove"); - deleteRemove.setOnAction(removeEvent -> fileDeleteDeleteEntry(choosedLabel)); - fileDeleteInputContextMenu.getItems().add(deleteRemove); - - ContextMenu fileDeleteInputFilesMenu = new ContextMenu(); - MenuItem deletePaste = new MenuItem(); - deletePaste.setText("Paste"); - deletePaste.setOnAction(pasteEvent -> { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - Transferable transferable = clipboard.getContents(null); - try { - if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { - Object objectFileList = transferable.getTransferData(DataFlavor.javaFileListFlavor); - List files = (List) objectFileList; - files.forEach(o -> fileDeleteAddFile((File) o)); - } - } catch (UnsupportedFlavorException | IOException e) { - e.printStackTrace(); - } - }); - fileDeleteInputFilesMenu.getItems().add(deletePaste); - - fileDeleteInputFiles.setOnContextMenuRequested(event -> { - if (!fileDeleteInputContextMenu.isShowing()) { - fileDeleteInputFilesMenu.show(((VBox) event.getSource()).getParent().getScene().getWindow(), event.getScreenX(), event.getScreenY()); - } - }); - - fileDeleteIterationsEntry.textProperty().addListener((observable, oldValue, newValue) -> { - if (!newValue.matches("[0-9]*")) { - fileDeleteIterationsEntry.setText(oldValue); - } - }); - - Thread t = new Thread(() -> { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); - } - if (isConfig) { - Platform.runLater(() -> { - try { - currentConfigSettings = (HashMap) loadSettingsGUI(rootWindow.getScene().getWindow()).values().toArray()[0]; - textKeyEntry.setText(currentConfigSettings.get("textKey")); - textSaltEntry.setText(currentConfigSettings.get("textSalt")); - textAlgorithmBox.setValue(currentConfigSettings.get("textAlgorithm")); - - fileEnDecryptKeyEntry.setText(currentConfigSettings.get("fileEnDecryptKey")); - fileEnDecryptSaltEntry.setText(currentConfigSettings.get("fileEnDecryptSalt")); - fileEnDecryptAlgorithmBox.setValue(currentConfigSettings.get("fileEnDecryptAlgorithm")); - - fileDeleteIterationsEntry.setText(currentConfigSettings.get("fileDeleteIterations")); - - removeFileFromFileBox.setSelected(Boolean.parseBoolean(currentConfigSettings.get("removeFromFileBox"))); - limitNumberOfThreads.setSelected(Boolean.parseBoolean(currentConfigSettings.get("limitNumberOfThreads"))); - } catch (IOException e) { - e.printStackTrace(); - } catch (ArrayIndexOutOfBoundsException ex) { - try { - SecureDelete.deleteFile(config, 5, buffer); - isConfig = false; - } catch (IOException e) { - e.printStackTrace(); - } - } - }); - } - }); - t.start(); - } -}