From 70568f7a9b7884b069274103d260e170fac02fcf Mon Sep 17 00:00:00 2001 From: Christopher Schnick Date: Thu, 5 Jan 2023 21:41:33 +0100 Subject: [PATCH] Session fixes --- .../impl/LocalProcessControlProvider.java | 4 ++ .../java/io/xpipe/core/util/UuidHelper.java | 26 ++++++++++++ .../java/io/xpipe/core/util/XPipeSession.java | 42 +++++++++++++------ .../xpipe/core/util/XPipeTempDirectory.java | 13 +++--- 4 files changed, 67 insertions(+), 18 deletions(-) create mode 100644 core/src/main/java/io/xpipe/core/util/UuidHelper.java diff --git a/core/src/main/java/io/xpipe/core/impl/LocalProcessControlProvider.java b/core/src/main/java/io/xpipe/core/impl/LocalProcessControlProvider.java index fca96a9f..e0460723 100644 --- a/core/src/main/java/io/xpipe/core/impl/LocalProcessControlProvider.java +++ b/core/src/main/java/io/xpipe/core/impl/LocalProcessControlProvider.java @@ -27,6 +27,10 @@ public abstract class LocalProcessControlProvider { } public static ShellProcessControl create() { + if (INSTANCE == null) { + throw new IllegalStateException("Not initialized"); + } + return INSTANCE.createProcessControl(); } diff --git a/core/src/main/java/io/xpipe/core/util/UuidHelper.java b/core/src/main/java/io/xpipe/core/util/UuidHelper.java new file mode 100644 index 00000000..ed03e325 --- /dev/null +++ b/core/src/main/java/io/xpipe/core/util/UuidHelper.java @@ -0,0 +1,26 @@ +package io.xpipe.core.util; + +import io.xpipe.core.dialog.Dialog; + +import java.util.Optional; +import java.util.UUID; + +public class UuidHelper { + + public static Optional parse(String s) { + try { + return Optional.of(UUID.fromString(s)); + } catch (IllegalArgumentException ex) { + return Optional.empty(); + } + } + + public static Optional parse(Dialog.FailableSupplier supplier) { + try { + var s = supplier.get(); + return Optional.of(UUID.fromString(s)); + } catch (Exception ex) { + return Optional.empty(); + } + } +} diff --git a/core/src/main/java/io/xpipe/core/util/XPipeSession.java b/core/src/main/java/io/xpipe/core/util/XPipeSession.java index 08006984..e21da67a 100644 --- a/core/src/main/java/io/xpipe/core/util/XPipeSession.java +++ b/core/src/main/java/io/xpipe/core/util/XPipeSession.java @@ -30,21 +30,37 @@ public class XPipeSession { private static XPipeSession INSTANCE; - public static void init(UUID buildSessionId) throws Exception { - var sessionFile = XPipeTempDirectory.getLocal().resolve("xpipe_session"); - var isNew = !Files.exists(sessionFile); - var systemSessionId = isNew ? UUID.randomUUID() : UUID.fromString(Files.readString(sessionFile)); - - if (OsType.getLocal().equals(OsType.WINDOWS)) { - var pf = Path.of("C:\\pagefile.sys"); - BasicFileAttributes attr = Files.readAttributes(pf, BasicFileAttributes.class); - var timeUuid = UUID.nameUUIDFromBytes(attr.creationTime().toInstant().toString().getBytes()); - isNew = isNew && timeUuid.equals(systemSessionId); - systemSessionId = timeUuid; + public static void init(UUID buildSessionId) { + if (INSTANCE != null) { + return; } - Files.writeString(sessionFile, systemSessionId.toString()); - INSTANCE = new XPipeSession(isNew, UUID.randomUUID(), buildSessionId, systemSessionId); + var sessionFile = XPipeTempDirectory.getLocal().resolve("xpipe_session"); + var isNewSystemSession = !Files.exists(sessionFile); + var systemSessionId = isNewSystemSession + ? UUID.randomUUID() + : UuidHelper.parse(() -> Files.readString(sessionFile)).orElse(UUID.randomUUID()); + + try { + if (OsType.getLocal().equals(OsType.WINDOWS)) { + var pf = Path.of("C:\\pagefile.sys"); + BasicFileAttributes attr = Files.readAttributes(pf, BasicFileAttributes.class); + var timeUuid = UUID.nameUUIDFromBytes( + attr.creationTime().toInstant().toString().getBytes()); + isNewSystemSession = isNewSystemSession && timeUuid.equals(systemSessionId); + systemSessionId = timeUuid; + } + } catch (Exception ex) { + isNewSystemSession = true; + systemSessionId = UUID.randomUUID(); + } + + try { + Files.writeString(sessionFile, systemSessionId.toString()); + } catch (Exception ignored) { + } + + INSTANCE = new XPipeSession(isNewSystemSession, UUID.randomUUID(), buildSessionId, systemSessionId); } public static XPipeSession get() { diff --git a/core/src/main/java/io/xpipe/core/util/XPipeTempDirectory.java b/core/src/main/java/io/xpipe/core/util/XPipeTempDirectory.java index 5f8a4c1f..0d1f3309 100644 --- a/core/src/main/java/io/xpipe/core/util/XPipeTempDirectory.java +++ b/core/src/main/java/io/xpipe/core/util/XPipeTempDirectory.java @@ -3,16 +3,19 @@ package io.xpipe.core.util; import io.xpipe.core.impl.FileNames; import io.xpipe.core.process.OsType; import io.xpipe.core.process.ShellProcessControl; -import io.xpipe.core.store.ShellStore; import java.io.IOException; import java.nio.file.Path; public class XPipeTempDirectory { - public static Path getLocal() throws Exception { - try (var pc = ShellStore.local().create().start()) { - return Path.of(get(pc)); + public static Path getLocal() { + if (OsType.getLocal().equals(OsType.WINDOWS)) { + return Path.of(System.getenv("TEMP")).resolve("xpipe"); + } else if (OsType.getLocal().equals(OsType.LINUX)) { + return Path.of("/tmp/xpipe"); + } else { + return Path.of(System.getenv("TMPDIR"), "xpipe"); } } @@ -24,7 +27,7 @@ public class XPipeTempDirectory { proc.executeSimpleCommand(proc.getShellType().flatten(proc.getShellType().getMkdirsCommand(dir)), "Unable to access or create temporary directory " + dir); if (proc.getOsType().equals(OsType.LINUX) || proc.getOsType().equals(OsType.MAC)) { - proc.executeSimpleCommand("(chmod -f 777 \"" + dir + "\""); + proc.executeSimpleCommand("chmod -f 777 \"" + dir + "\""); } }