diff --git a/updater/src/main/java/bisq/updater/InstallationFailedException.java b/updater/src/main/java/bisq/updater/InstallationFailedException.java new file mode 100644 index 0000000000..ada4ff2d7e --- /dev/null +++ b/updater/src/main/java/bisq/updater/InstallationFailedException.java @@ -0,0 +1,11 @@ +package bisq.updater; + +public class InstallationFailedException extends RuntimeException { + public InstallationFailedException(String message) { + super(message); + } + + public InstallationFailedException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/updater/src/main/java/bisq/updater/linux/pkexec/PkExec.java b/updater/src/main/java/bisq/updater/linux/pkexec/PkExec.java new file mode 100644 index 0000000000..fbd2738862 --- /dev/null +++ b/updater/src/main/java/bisq/updater/linux/pkexec/PkExec.java @@ -0,0 +1,49 @@ +package bisq.updater.linux.pkexec; + +import java.io.IOException; + +import java.util.List; +import java.util.concurrent.TimeUnit; + + +import lombok.extern.slf4j.Slf4j; + + + +import bisq.updater.InstallationFailedException; + +@Slf4j +public class PkExec { + public static final int AUTHORIZATION_FAILED = 127; + private static final int AUTHORIZATION_DIALOG_DISMISSED = 126; + + public static Process run(List args) { + try { + var processBuilder = new ProcessBuilder("pkexec"); + processBuilder.command().addAll(args); + + Process process = processBuilder + .redirectErrorStream(true) + .redirectOutput(ProcessBuilder.Redirect.DISCARD) + .start(); + + boolean isSuccess = process.waitFor(2, TimeUnit.MINUTES); + if (!isSuccess) { + throw new InstallationFailedException(processBuilder.command() + " didn't finish after 2 minutes."); + } + + int exitCode = process.exitValue(); + switch (exitCode) { + case AUTHORIZATION_FAILED: + throw new PkexecAuthorizationFailedException("Couldn't get authorization from user."); + case AUTHORIZATION_DIALOG_DISMISSED: + throw new PkexecAuthorizationFailedException("User dismissed authorization dialog."); + } + + return process; + + } catch (IOException | InterruptedException e) { + throw new InstallationFailedException("Installation failed.", e); + } + } +} diff --git a/updater/src/main/java/bisq/updater/linux/pkexec/PkexecAuthorizationFailedException.java b/updater/src/main/java/bisq/updater/linux/pkexec/PkexecAuthorizationFailedException.java new file mode 100644 index 0000000000..0a6bc27283 --- /dev/null +++ b/updater/src/main/java/bisq/updater/linux/pkexec/PkexecAuthorizationFailedException.java @@ -0,0 +1,7 @@ +package bisq.updater.linux.pkexec; + +public class PkexecAuthorizationFailedException extends RuntimeException { + public PkexecAuthorizationFailedException(String message) { + super(message); + } +}