diff --git a/platform/build.gradle b/platform/build.gradle index 5036fd8e6a..56008f3448 100644 --- a/platform/build.gradle +++ b/platform/build.gradle @@ -5,5 +5,6 @@ plugins { dependencies { constraints { api libs.protobuf.java + api libs.slf4j.api } } diff --git a/settings.gradle b/settings.gradle index cadfe73422..ae5573c6bb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -36,6 +36,8 @@ include 'statsnode' include 'apitest' include 'platform' include 'code-coverage-report' +include 'updater' + includeBuild 'bitcoind' rootProject.name = 'bisq' diff --git a/updater/build.gradle b/updater/build.gradle new file mode 100644 index 0000000000..94b783bbe5 --- /dev/null +++ b/updater/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'bisq.java-conventions' + id 'java-library' +} + +dependencies { + implementation enforcedPlatform(project(':platform')) + annotationProcessor libs.lombok + compileOnly libs.lombok + implementation libs.logback.classic + implementation libs.logback.core +} 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); + } +}