From 2fda1fc8c16ae92f4d6041f17bdfe02643181a0d Mon Sep 17 00:00:00 2001 From: crschnick Date: Thu, 20 Nov 2025 16:16:52 +0000 Subject: [PATCH] Keeper reliability fixes --- .../io/xpipe/app/pwman/KeeperPasswordManager.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java b/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java index 1cf4b35ae..cebcb2809 100644 --- a/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java +++ b/app/src/main/java/io/xpipe/app/pwman/KeeperPasswordManager.java @@ -1,11 +1,13 @@ package io.xpipe.app.pwman; +import com.fasterxml.jackson.core.JsonProcessingException; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.process.*; import io.xpipe.app.secret.SecretManager; import io.xpipe.app.secret.SecretPromptStrategy; import io.xpipe.app.terminal.TerminalLaunch; +import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.InPlaceSecretValue; import io.xpipe.core.JacksonMapper; import io.xpipe.core.OsType; @@ -37,6 +39,9 @@ public class KeeperPasswordManager implements PasswordManager { @Override public synchronized CredentialResult retrieveCredentials(String key) { + // The copy UID button copies the whole URL in the Keeper UI. Why? ... + key = key.replace("https://keepersecurity.eu/vault/#detail/", ""); + try { CommandSupport.isInLocalPathOrThrow("Keeper Commander CLI", "keeper"); } catch (Exception e) { @@ -80,7 +85,14 @@ public class KeeperPasswordManager implements PasswordManager { .addLiteral(r.getSecretValue())) .sensitive() .readStdoutOrThrow(); - var tree = JacksonMapper.getDefault().readTree(out); + JsonNode tree; + try { + tree = JacksonMapper.getDefault().readTree(out); + } catch (JsonProcessingException e) { + ErrorEventFactory.fromMessage(out).expected().handle(); + return null; + } + var fields = tree.required("fields"); if (!fields.isArray()) { return null;