Various fixes

This commit is contained in:
crschnick
2026-01-29 10:14:46 +00:00
parent e78e69df46
commit e7180521dd
4 changed files with 23 additions and 85 deletions
@@ -17,7 +17,7 @@ public class SystemIconManager {
AppProperties.get().getDataDir().resolve("cache").resolve("icons").resolve("pool");
private static final Set<SystemIcon> loadedIconImages = new HashSet<>();
private static final Map<SystemIconSource, SystemIconSourceData> LOADED = new HashMap<>();
private static final Map<SystemIconSource, SystemIconSourceData> LOADED_SOURCES = new HashMap<>();
private static final Set<SystemIcon> ICONS = new HashSet<>();
private static int cacheSourceHash;
private static int sourceHash;
@@ -110,7 +110,7 @@ public class SystemIconManager {
private static synchronized int calculateSourceHash() {
var total = 0;
var set = false;
for (var e : LOADED.entrySet()) {
for (var e : LOADED_SOURCES.entrySet()) {
total += e.getKey().getPath().hashCode();
for (SystemIconSourceFile icon : e.getValue().getIcons()) {
total += icon.getFile().toString().hashCode();
@@ -140,9 +140,9 @@ public class SystemIconManager {
public static void initAdditional() {
for (var source : getEffectiveSources()) {
if (!LOADED.containsKey(source)) {
if (!LOADED_SOURCES.containsKey(source)) {
var data = SystemIconSourceData.of(source);
LOADED.put(source, data);
LOADED_SOURCES.put(source, data);
data.getIcons().forEach(systemIconSourceFile -> {
var icon = new SystemIcon(source, systemIconSourceFile.getName());
ICONS.add(icon);
@@ -155,13 +155,13 @@ public class SystemIconManager {
public static synchronized void reloadSources() throws Exception {
Files.createDirectories(DIRECTORY);
LOADED.clear();
LOADED_SOURCES.clear();
for (var source : getEffectiveSources()) {
LOADED.put(source, SystemIconSourceData.of(source));
LOADED_SOURCES.put(source, SystemIconSourceData.of(source));
}
ICONS.clear();
LOADED.forEach((source, systemIconSourceData) -> {
LOADED_SOURCES.forEach((source, systemIconSourceData) -> {
systemIconSourceData.getIcons().forEach(systemIconSourceFile -> {
var icon = new SystemIcon(source, systemIconSourceFile.getName());
ICONS.add(icon);
@@ -177,8 +177,10 @@ public class SystemIconManager {
private static synchronized void reloadImages() {
AppImages.remove(s -> s.startsWith("icons/"));
loadedIconImages.clear();
try {
for (var loadedIconImage : loadedIconImages) {
for (var loadedIconImage : ICONS) {
getAndLoadIconFile(loadedIconImage);
}
} catch (Exception e) {
@@ -197,7 +199,7 @@ public class SystemIconManager {
}
reloadSources();
sourceHash = calculateSourceHash();
SystemIconCache.rebuildCache(LOADED, sourceHash);
SystemIconCache.rebuildCache(LOADED_SOURCES, sourceHash);
cacheSourceHash = sourceHash;
reloadImages();
}
@@ -128,9 +128,8 @@ public class KeeperPasswordManager implements PasswordManager {
}
var b = CommandBuilder.of()
.add(getExecutable(sc), "get")
.add(getExecutable(sc), "find-password")
.addLiteral(key)
.add("--format", "json", "--unmask")
.add("--password")
.addLiteral(r.getSecretValue());
FilePath file = sc.getSystemTemporaryDirectory().join("keeper" + Math.abs(new Random().nextInt()) + ".txt");
@@ -176,9 +175,7 @@ public class KeeperPasswordManager implements PasswordManager {
var result = queryCommand.readStdoutAndStderr();
var exitCode = queryCommand.getExitCode();
if (file != null) {
// sc.view().deleteFileIfPossible(file);
}
sc.view().deleteFileIfPossible(file);
var out = result[0]
.replace("\r\n", "\n")
@@ -200,21 +197,10 @@ public class KeeperPasswordManager implements PasswordManager {
EOF when reading a line
""", "").strip();
var jsonStart = out.indexOf("{\n");
var jsonEnd = out.indexOf("\n}");
if (jsonEnd != -1) {
jsonEnd += 2;
}
var outPrefix = jsonStart <= 0 ? out : out.substring(0, jsonStart);
var outJson = jsonStart <= 0
? (jsonEnd != -1 ? out.substring(0, jsonEnd) : out)
: (jsonEnd != -1 ? out.substring(jsonStart, jsonEnd) : out.substring(jsonStart));
var message = !err.isEmpty() ? out + "\n" + err : out;
if (exitCode != 0) {
// Another password prompt was made
var wrongPw =
outPrefix.contains("Enter password for") || exitCode == CommandControl.EXIT_TIMEOUT_EXIT_CODE;
var wrongPw = out.contains("Enter password for") || exitCode == CommandControl.EXIT_TIMEOUT_EXIT_CODE;
if (wrongPw) {
SecretManager.clearAll(KEEPER_PASSWORD_ID);
ErrorEventFactory.fromMessage("Master password was not accepted by Keeper. Is it correct?")
@@ -223,69 +209,19 @@ public class KeeperPasswordManager implements PasswordManager {
return null;
}
var message = !err.isEmpty() ? outPrefix + "\n" + err : outPrefix;
ErrorEventFactory.fromMessage(message).expected().handle();
return null;
}
JsonNode tree;
try {
tree = JacksonMapper.getDefault().readTree(outJson);
} catch (JsonProcessingException e) {
var message = !err.isEmpty() ? outPrefix + "\n" + err : outPrefix;
ErrorEventFactory.fromMessage(message).expected().handle();
return null;
}
hasCompletedRequestInSession = true;
var fields = tree.get("fields");
// There multiple schemas
if (fields == null || !fields.isArray()) {
String login = null;
String password = null;
var l = tree.get("login");
if (l != null && l.isTextual()) {
login = l.asText();
}
var p = tree.get("password");
if (p != null && p.isTextual()) {
password = p.asText();
}
if (login == null && password == null) {
var message = !err.isEmpty() ? out + "\n" + err : out;
ErrorEventFactory.fromMessage(message)
.description("Received invalid response")
.expected()
.handle();
return null;
}
return new CredentialResult(login, password != null ? InPlaceSecretValue.of(password) : null);
var outLines = out.lines().toList();
if (outLines.isEmpty()) {
return null;
}
String login = null;
String password = null;
for (JsonNode field : fields) {
var type = field.required("type").asText();
if (type.equals("login")) {
var v = field.required("value");
if (v.size() > 0) {
login = v.get(0).asText();
}
}
if (type.equals("password")) {
var v = field.required("value");
if (v.size() > 0) {
password = v.get(0).asText();
}
}
}
return new CredentialResult(login, password != null ? InPlaceSecretValue.of(password) : null);
var lastLine = outLines.getLast();
return new CredentialResult(null, InPlaceSecretValue.of(lastLine));
} catch (Exception ex) {
ErrorEventFactory.fromThrowable(ex).handle();
return null;
@@ -27,7 +27,7 @@ public interface WindowsTerminalType extends ExternalTerminalType, TrackableTerm
ExternalTerminalType WINDOWS_TERMINAL_PREVIEW = new Preview();
ExternalTerminalType WINDOWS_TERMINAL_CANARY = new Canary();
AtomicInteger windowCounter = new AtomicInteger(10);
AtomicInteger windowCounter = new AtomicInteger(101);
private static String getFixedTitle(String s) {
// A weird behavior in Windows Terminal causes the trailing
@@ -40,8 +40,9 @@ public interface WindowsTerminalType extends ExternalTerminalType, TrackableTerm
}
private static CommandBuilder toCommand(TerminalLaunchConfiguration configuration) {
// Start from high window index to guarantee that xpipe uses its own window
var cmd = CommandBuilder.of()
.addIf(configuration.isPreferTabs(), "-w", "1", "nt")
.addIf(configuration.isPreferTabs(), "-w", "100", "nt")
.addIf(!configuration.isPreferTabs(), "-w", "" + windowCounter.getAndIncrement());
if (configuration.getColor() != null) {
-1
View File
@@ -110,7 +110,6 @@ open module io.xpipe.app {
requires org.kordamp.ikonli.bootstrapicons;
requires jdk.zipfs;
requires org.int4.fx.builders;
requires io.xpipe.app;
uses TerminalLauncher;
uses ActionProvider;