Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions src/main/java/xyz/orbitary/perigee/transport/EndpointResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@

package xyz.orbitary.perigee.transport;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;


/**
Expand Down Expand Up @@ -52,6 +56,7 @@ public static List<String> resolve(boolean windows, Map<String, String> env, Lis
for (String sub : SANDBOX_SUBDIRS) {
bases.add(withSeparator(dir) + sub + "/");
}
bases.addAll(flatpakRuntimeDirs(Path.of(dir, ".flatpak")));
}
}
bases.add("/tmp/");
Expand Down Expand Up @@ -83,4 +88,21 @@ private static String withSeparator(String dir) {
return dir.endsWith("/") ? dir : dir + "/";
}

/**
* rather than littering SANDBOX_SUBDIRS with variations of
* ".flatpak/dev.vencord.Vesktop/xdg-run"
* for every client under the sun, find them all at once.
*/
private static List<String> flatpakRuntimeDirs(Path flatpakDir) {
try (Stream<Path> apps = Files.list(flatpakDir)) {
return apps.map(app -> app.resolve("xdg-run"))
.filter(Files::isDirectory)
.map(path -> path + "/")
.sorted()
.toList();
} catch (IOException | SecurityException e) {
return List.of();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public static Transport connect(List<String> endpoints, boolean windows) throws
try {
return windows ? WindowsPipeTransport.connect(endpoint) : UnixSocketTransport.connect(endpoint);
} catch (IOException | RuntimeException e) {
failure.addSuppressed(e);
failure.addSuppressed(new IOException(endpoint + ": " + e, e));
}
}
throw failure;
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/xyz/orbitary/perigee/LiveDiscordTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ void reportsHowDiscordTreatsEachActivityType() throws Exception {
System.out.println("[live] " + type + " (documented rpcSupported=" + type.rpcSupported() + ") -> " + outcome);
Thread.sleep(1_000);
}
client.clearActivity().get(10, TimeUnit.SECONDS);
client.clearActivity().get(30, TimeUnit.SECONDS);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,14 @@
package xyz.orbitary.perigee.transport;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand All @@ -33,21 +37,21 @@ void windowsUsesNamedPipesAndIgnoresTheEnvironment() {

@Test
void unixFollowsDocumentedOrderWithSandboxesAndFallback() {
Map<String, String> env = Map.of("XDG_RUNTIME_DIR", "/run/user/1000", "TMPDIR", "/var/tmp/", "TEMP", "/run/user/1000");
Map<String, String> env = Map.of("XDG_RUNTIME_DIR", "/run/user/1", "TMPDIR", "/var/tmp/", "TEMP", "/run/user/1");

List<String> endpoints = EndpointResolver.resolve(false, env, List.of("/custom"));

List<String> firstOfEach = List.of(0, 10, 20, 30, 40, 50, 60, 70, 80, 90).stream().map(endpoints::get).toList();
assertEquals(
List.of(
"/custom/discord-ipc-0",
"/run/user/1000/discord-ipc-0",
"/run/user/1000/app/com.discordapp.Discord/discord-ipc-0",
"/run/user/1000/snap.discord/discord-ipc-0",
"/run/user/1000/app/com.discordapp.DiscordPTB/discord-ipc-0",
"/run/user/1000/snap.discord-ptb/discord-ipc-0",
"/run/user/1000/app/com.discordapp.DiscordCanary/discord-ipc-0",
"/run/user/1000/snap.discord-canary/discord-ipc-0",
"/run/user/1/discord-ipc-0",
"/run/user/1/app/com.discordapp.Discord/discord-ipc-0",
"/run/user/1/snap.discord/discord-ipc-0",
"/run/user/1/app/com.discordapp.DiscordPTB/discord-ipc-0",
"/run/user/1/snap.discord-ptb/discord-ipc-0",
"/run/user/1/app/com.discordapp.DiscordCanary/discord-ipc-0",
"/run/user/1/snap.discord-canary/discord-ipc-0",
"/var/tmp/discord-ipc-0",
"/tmp/discord-ipc-0"
), firstOfEach
Expand Down Expand Up @@ -109,6 +113,18 @@ void ptbAndCanaryInstallsAreSearchedInsideTheirSandboxes() {
}
}

@Test
void flatpakClientsAreFoundInsideTheirXdgRunFolders(@TempDir Path runtime) throws IOException {
Files.createDirectories(runtime.resolve(".flatpak/dev.vencord.Vesktop/xdg-run"));
Files.createDirectories(runtime.resolve(".flatpak/123456"));

List<String> endpoints = EndpointResolver.resolve(false, Map.of("XDG_RUNTIME_DIR", runtime.toString()), List.of());

int vesktop = endpoints.indexOf(runtime + "/.flatpak/dev.vencord.Vesktop/xdg-run/discord-ipc-0");
assertTrue(vesktop > endpoints.indexOf(runtime + "/snap.discord-canary/discord-ipc-0"), "after the official sandboxes");
assertTrue(endpoints.stream().noneMatch(path -> path.contains(".flatpak/123456")), "instance folders without xdg-run are skipped");
}

static Stream<Arguments> macOsEnvironments() {
return Stream.of(
Arguments.of("TMPDIR only", Map.of("TMPDIR", "/var/folders/ab/cd/T/"), "/var/folders/ab/cd/T/discord-ipc-0", 20),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ void theConnectorReportsEveryFailureWhenNothingIsListening() {
IOException e = assertThrows(IOException.class, () -> TransportConnector.connect(List.of(dir.resolve("a").toString(), dir.resolve("b").toString()), false));

assertEquals(2, e.getSuppressed().length);
assertTrue(String.valueOf(e.getSuppressed()[0].getMessage()).startsWith(dir.resolve("a") + ": "));
assertTrue(String.valueOf(e.getSuppressed()[1].getMessage()).startsWith(dir.resolve("b") + ": "));
}

@Test
Expand Down