diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java index 7215b39a8..d13ae94fa 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/ChangePasswordController.java @@ -10,13 +10,15 @@ import java.nio.file.StandardCopyOption; import java.nio.file.StandardOpenOption; import java.util.ResourceBundle; +import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; -import javafx.scene.control.Label; +import javafx.scene.control.Hyperlink; +import javafx.scene.text.Text; import org.cryptomator.crypto.exceptions.DecryptFailedException; import org.cryptomator.crypto.exceptions.UnsupportedKeyLengthException; @@ -50,11 +52,17 @@ public class ChangePasswordController implements Initializable { private Button changePasswordButton; @FXML - private Label messageLabel; + private Text messageText; + + @FXML + private Hyperlink downloadsPageLink; + + private final Application app; @Inject - public ChangePasswordController() { + public ChangePasswordController(Application app) { super(); + this.app = app; } @Override @@ -77,12 +85,22 @@ public class ChangePasswordController implements Initializable { changePasswordButton.setDisable(oldPasswordIsEmpty || newPasswordIsEmpty || !passwordsAreEqual); } + // **************************************** + // Downloads link + // **************************************** + + @FXML + public void didClickDownloadsLink(ActionEvent event) { + app.getHostServices().showDocument("https://cryptomator.org/downloads/"); + } + // **************************************** // Change password button // **************************************** @FXML private void didClickChangePasswordButton(ActionEvent event) { + downloadsPageLink.setVisible(false); final Path masterKeyPath = vault.getPath().resolve(Vault.VAULT_MASTERKEY_FILE); final Path masterKeyBackupPath = vault.getPath().resolve(Vault.VAULT_MASTERKEY_BACKUP_FILE); @@ -92,31 +110,33 @@ public class ChangePasswordController implements Initializable { vault.getCryptor().decryptMasterKey(masterKeyInputStream, oldPassword); Files.copy(masterKeyPath, masterKeyBackupPath, StandardCopyOption.REPLACE_EXISTING); } catch (DecryptFailedException | IOException ex) { - messageLabel.setText(rb.getString("changePassword.errorMessage.decryptionFailed")); + messageText.setText(rb.getString("changePassword.errorMessage.decryptionFailed")); LOG.error("Decryption failed for technical reasons.", ex); newPasswordField.swipe(); retypePasswordField.swipe(); return; } catch (WrongPasswordException e) { - messageLabel.setText(rb.getString("changePassword.errorMessage.wrongPassword")); + messageText.setText(rb.getString("changePassword.errorMessage.wrongPassword")); newPasswordField.swipe(); retypePasswordField.swipe(); Platform.runLater(oldPasswordField::requestFocus); return; } catch (UnsupportedKeyLengthException ex) { - messageLabel.setText(rb.getString("changePassword.errorMessage.unsupportedKeyLengthInstallJCE")); + messageText.setText(rb.getString("changePassword.errorMessage.unsupportedKeyLengthInstallJCE")); LOG.warn("Unsupported Key-Length. Please install Oracle Java Cryptography Extension (JCE).", ex); newPasswordField.swipe(); retypePasswordField.swipe(); return; } catch (UnsupportedVaultException e) { + downloadsPageLink.setVisible(true); if (e.isVaultOlderThanSoftware()) { - messageLabel.setText(rb.getString("changePassword.errorMessage.unsupportedVersion.vaultOlderThanSoftware")); + messageText.setText(rb.getString("changePassword.errorMessage.unsupportedVersion.vaultOlderThanSoftware") + " "); } else if (e.isSoftwareOlderThanVault()) { - messageLabel.setText(rb.getString("changePassword.errorMessage.unsupportedVersion.softwareOlderThanVault")); + messageText.setText(rb.getString("changePassword.errorMessage.unsupportedVersion.softwareOlderThanVault") + " "); } newPasswordField.swipe(); retypePasswordField.swipe(); + return; } finally { oldPasswordField.swipe(); } @@ -127,7 +147,7 @@ public class ChangePasswordController implements Initializable { final CharSequence newPassword = newPasswordField.getCharacters(); try (final OutputStream masterKeyOutputStream = Files.newOutputStream(masterKeyPath, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.SYNC)) { vault.getCryptor().encryptMasterKey(masterKeyOutputStream, newPassword); - messageLabel.setText(rb.getString("changePassword.infoMessage.success")); + messageText.setText(rb.getString("changePassword.infoMessage.success")); Platform.runLater(this::didChangePassword); // At this point the backup is still using the old password. // It will be changed as soon as the user unlocks the vault the next time. diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java index 6aab80736..9155128c9 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/UnlockController.java @@ -19,16 +19,18 @@ import java.util.ResourceBundle; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import javafx.application.Application; import javafx.application.Platform; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; -import javafx.scene.control.Label; +import javafx.scene.control.Hyperlink; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.TextField; import javafx.scene.input.KeyEvent; +import javafx.scene.text.Text; import javax.security.auth.DestroyFailedException; @@ -66,13 +68,18 @@ public class UnlockController implements Initializable { private ProgressIndicator progressIndicator; @FXML - private Label messageLabel; + private Text messageText; + + @FXML + private Hyperlink downloadsPageLink; private final ExecutorService exec; + private final Application app; @Inject - public UnlockController(ExecutorService exec) { + public UnlockController(Application app, ExecutorService exec) { super(); + this.app = app; this.exec = exec; } @@ -94,6 +101,15 @@ public class UnlockController implements Initializable { unlockButton.setDisable(passwordIsEmpty); } + // **************************************** + // Downloads link + // **************************************** + + @FXML + public void didClickDownloadsLink(ActionEvent event) { + app.getHostServices().showDocument("https://cryptomator.org/downloads/"); + } + // **************************************** // Unlock button // **************************************** @@ -102,13 +118,14 @@ public class UnlockController implements Initializable { private void didClickUnlockButton(ActionEvent event) { setControlsDisabled(true); progressIndicator.setVisible(true); + downloadsPageLink.setVisible(false); final Path masterKeyPath = vault.getPath().resolve(Vault.VAULT_MASTERKEY_FILE); final Path masterKeyBackupPath = vault.getPath().resolve(Vault.VAULT_MASTERKEY_BACKUP_FILE); final CharSequence password = passwordField.getCharacters(); try (final InputStream masterKeyInputStream = Files.newInputStream(masterKeyPath, StandardOpenOption.READ)) { vault.getCryptor().decryptMasterKey(masterKeyInputStream, password); if (!vault.startServer()) { - messageLabel.setText(rb.getString("unlock.messageLabel.startServerFailed")); + messageText.setText(rb.getString("unlock.messageLabel.startServerFailed")); vault.getCryptor().destroy(); return; } @@ -120,30 +137,31 @@ public class UnlockController implements Initializable { } catch (DecryptFailedException | IOException ex) { setControlsDisabled(false); progressIndicator.setVisible(false); - messageLabel.setText(rb.getString("unlock.errorMessage.decryptionFailed")); + messageText.setText(rb.getString("unlock.errorMessage.decryptionFailed")); LOG.error("Decryption failed for technical reasons.", ex); } catch (WrongPasswordException e) { setControlsDisabled(false); progressIndicator.setVisible(false); - messageLabel.setText(rb.getString("unlock.errorMessage.wrongPassword")); + messageText.setText(rb.getString("unlock.errorMessage.wrongPassword")); Platform.runLater(passwordField::requestFocus); } catch (UnsupportedKeyLengthException ex) { setControlsDisabled(false); progressIndicator.setVisible(false); - messageLabel.setText(rb.getString("unlock.errorMessage.unsupportedKeyLengthInstallJCE")); + messageText.setText(rb.getString("unlock.errorMessage.unsupportedKeyLengthInstallJCE")); LOG.warn("Unsupported Key-Length. Please install Oracle Java Cryptography Extension (JCE).", ex); } catch (UnsupportedVaultException e) { setControlsDisabled(false); progressIndicator.setVisible(false); + downloadsPageLink.setVisible(true); if (e.isVaultOlderThanSoftware()) { - messageLabel.setText(rb.getString("unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware")); + messageText.setText(rb.getString("unlock.errorMessage.unsupportedVersion.vaultOlderThanSoftware") + " "); } else if (e.isSoftwareOlderThanVault()) { - messageLabel.setText(rb.getString("unlock.errorMessage.unsupportedVersion.softwareOlderThanVault")); + messageText.setText(rb.getString("unlock.errorMessage.unsupportedVersion.softwareOlderThanVault") + " "); } } catch (DestroyFailedException e) { setControlsDisabled(false); progressIndicator.setVisible(false); - LOG.error("Destruction of cryptor throw an exception.", e); + LOG.error("Destruction of cryptor threw an exception.", e); } finally { passwordField.swipe(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/controllers/WelcomeController.java b/main/ui/src/main/java/org/cryptomator/ui/controllers/WelcomeController.java index f07363605..0b3f39d49 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controllers/WelcomeController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controllers/WelcomeController.java @@ -34,12 +34,16 @@ import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.lang3.SystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; public class WelcomeController implements Initializable { + private static final Logger LOG = LoggerFactory.getLogger(WelcomeController.class); + @FXML private ImageView botImageView; @@ -97,6 +101,7 @@ public class WelcomeController implements Initializable { return; } final String currentVersion = WelcomeController.class.getPackage().getImplementationVersion(); + LOG.debug("Current version: {}, lastest version: {}", currentVersion, latestVersion); if (currentVersion != null && semVerComparator.compare(currentVersion, latestVersion) < 0) { final String msg = String.format(rb.getString("welcome.newVersionMessage"), latestVersion, currentVersion); Platform.runLater(() -> { diff --git a/main/ui/src/main/resources/fxml/change_password.fxml b/main/ui/src/main/resources/fxml/change_password.fxml index f29b657ea..36db54e94 100644 --- a/main/ui/src/main/resources/fxml/change_password.fxml +++ b/main/ui/src/main/resources/fxml/change_password.fxml @@ -17,6 +17,9 @@ + + + @@ -43,10 +46,15 @@ -