From abc87bb2650a6bb474faf92a8b6274c1e92ac42b Mon Sep 17 00:00:00 2001 From: crschnick Date: Fri, 10 Jan 2025 17:40:14 +0000 Subject: [PATCH] Various fixes --- .../app/prefs/ExternalRdpClientType.java | 2 +- .../java/io/xpipe/app/util/AskpassAlert.java | 8 +++++++ .../java/io/xpipe/app/util/RdpConfig.java | 2 +- .../ext/base/identity/IdentityChoice.java | 23 +++++++------------ .../ext/base/identity/IdentitySelectComp.java | 14 ++++++++++- .../ext/base/identity/IdentityStore.java | 10 ++++---- .../base/identity/IdentityStoreProvider.java | 2 +- .../ext/base/identity/IdentityValue.java | 12 ++++++---- .../identity/SshIdentityStrategyHelper.java | 1 - 9 files changed, 46 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java index 2005fbf4a..705152442 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalRdpClientType.java @@ -52,7 +52,7 @@ public interface ExternalRdpClientType extends PrefsChoiceValue { } if (input.get("username").isEmpty()) { - return input; + //return input; } var pass = configuration.getPassword(); diff --git a/app/src/main/java/io/xpipe/app/util/AskpassAlert.java b/app/src/main/java/io/xpipe/app/util/AskpassAlert.java index add05fe79..1ba8f0855 100644 --- a/app/src/main/java/io/xpipe/app/util/AskpassAlert.java +++ b/app/src/main/java/io/xpipe/app/util/AskpassAlert.java @@ -15,6 +15,7 @@ import javafx.scene.input.MouseEvent; import javafx.scene.layout.StackPane; import javafx.stage.Modality; import javafx.stage.Stage; +import javafx.stage.Window; public class AskpassAlert { @@ -57,6 +58,12 @@ public class AskpassAlert { return; } + var hasInternalFocus = Window.getWindows().stream().filter(window -> window != stage) + .anyMatch(window -> window instanceof Stage s && s.focusedProperty().get()); + if (hasInternalFocus) { + return; + } + if (lastRun == 0) { lastRun = now; return; @@ -71,6 +78,7 @@ public class AskpassAlert { if (!hasFocus) { regainedFocusCount++; } + stage.requestFocus(); lastRun = now; } diff --git a/app/src/main/java/io/xpipe/app/util/RdpConfig.java b/app/src/main/java/io/xpipe/app/util/RdpConfig.java index 2f648f162..4e5d87ed3 100644 --- a/app/src/main/java/io/xpipe/app/util/RdpConfig.java +++ b/app/src/main/java/io/xpipe/app/util/RdpConfig.java @@ -39,7 +39,7 @@ public class RdpConfig { } content.lines().forEach(s -> { - var split = s.split(":"); + var split = s.split(":", 3); if (split.length < 2) { return; } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityChoice.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityChoice.java index cd27dde24..49ddb7846 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityChoice.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityChoice.java @@ -69,21 +69,14 @@ public class IdentityChoice { .nonNullIf(inPlaceSelected.and(new SimpleBooleanProperty(requirePassword))) .disable(refSelected) .hide(refSelected) - .name("keyAuthentication") - .description("keyAuthenticationDescription") - .longDescription("base:sshKey") - .sub( - SshIdentityStrategyHelper.identity( - gateway != null ? gateway : new SimpleObjectProperty<>(), - identityStrategy, - null, - false), - identityStrategy) - .nonNullIf(inPlaceSelected.and(new SimpleBooleanProperty(keyInput))) - .disable(refSelected) - .hide(refSelected.or(new SimpleBooleanProperty(!keyInput))) - .addProperty(ref) - .bind( + .addProperty(ref); + if (keyInput) { + options.name("keyAuthentication").description("keyAuthenticationDescription").longDescription("base:sshKey").sub( + SshIdentityStrategyHelper.identity(gateway != null ? gateway : new SimpleObjectProperty<>(), identityStrategy, null, false), + identityStrategy).nonNullIf(inPlaceSelected).disable(refSelected).hide( + refSelected); + } + options.bind( () -> { if (ref.get() != null) { return IdentityValue.Ref.builder() diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java index 9bd735ca1..5994fe68a 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentitySelectComp.java @@ -26,6 +26,8 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ListChangeListener; import javafx.scene.control.ListCell; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; import atlantafx.base.theme.Styles; @@ -99,7 +101,8 @@ public class IdentitySelectComp extends Comp> { }); }); - return new SimpleCompStructure<>(layout.createStructure().get()); + var structure = layout.createStructure(); + return new SimpleCompStructure<>(structure.get()); } private String formatName(DataStoreEntry storeEntry) { @@ -191,6 +194,15 @@ public class IdentitySelectComp extends Comp> { selectedReference); struc.get().promptTextProperty().bind(binding); }); + combo.apply(struc -> { + struc.get().addEventFilter(KeyEvent.KEY_PRESSED,event -> { + if (event.getCode() == KeyCode.ESCAPE && !allowUserInput) { + selectedReference.setValue(null); + prop.setValue(null); + event.consume(); + } + }); + }); return combo; } } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStore.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStore.java index f3afc9655..671059d88 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStore.java @@ -23,10 +23,12 @@ public abstract class IdentityStore implements SelfReferentialStore, DataStore { @Override public void checkComplete() throws Throwable { - Validators.nonNull(getPassword()); - Validators.nonNull(getSshIdentity()); - getPassword().checkComplete(); - getSshIdentity().checkComplete(); + if (getPassword() != null) { + getPassword().checkComplete(); + } + if (getSshIdentity() != null) { + getSshIdentity().checkComplete(); + } } abstract EncryptedValue getEncryptedPassword(); diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStoreProvider.java index bbe6e219d..2bc836dbe 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityStoreProvider.java @@ -27,7 +27,7 @@ public abstract class IdentityStoreProvider implements DataStoreProvider { @Override public List getSearchableTerms(DataStore store) { IdentityStore s = store.asNeeded(); - return List.of(s.getUsername()); + return s.getUsername() != null ? List.of(s.getUsername()) : List.of(); } @Override diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityValue.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityValue.java index f2035c7fa..af76ede3b 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityValue.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/IdentityValue.java @@ -24,8 +24,12 @@ public interface IdentityValue { return new InPlace(identityStore); } - static IdentityValue.InPlace empty() { - return of(null, null,null); + static IdentityValue.InPlace none() { + var s = LocalIdentityStore.builder() + .password(EncryptedValue.of(new SecretRetrievalStrategy.None())) + .sshIdentity(EncryptedValue.of(new SshIdentityStrategy.None())) + .build(); + return of(s); } static IdentityValue.InPlace of(String user) { @@ -38,8 +42,8 @@ public interface IdentityValue { static IdentityValue.InPlace of(String user, SecretRetrievalStrategy password, SshIdentityStrategy sshIdentity) { var s = LocalIdentityStore.builder().username(user) - .password(EncryptedValue.of(password != null ? password : new SecretRetrievalStrategy.None())) - .sshIdentity(EncryptedValue.of(sshIdentity != null ? sshIdentity : new SshIdentityStrategy.None())) + .password(password != null ? EncryptedValue.of(password) : null) + .sshIdentity(sshIdentity != null ? EncryptedValue.of(sshIdentity) : null) .build(); return of(s); } diff --git a/ext/base/src/main/java/io/xpipe/ext/base/identity/SshIdentityStrategyHelper.java b/ext/base/src/main/java/io/xpipe/ext/base/identity/SshIdentityStrategyHelper.java index 415637198..413dc799b 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/identity/SshIdentityStrategyHelper.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/identity/SshIdentityStrategyHelper.java @@ -186,7 +186,6 @@ public class SshIdentityStrategyHelper { return new OptionsBuilder() .longDescription("base:sshKey") .choice(identityMethodSelected, map) - .nonNull() .bindChoice( () -> { return switch (identityMethodSelected.get()) {