diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java index 6964a0f6d..33883d1d7 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStore.java @@ -10,6 +10,7 @@ import io.xpipe.app.util.HostHelper; import io.xpipe.app.util.LicenseProvider; import io.xpipe.app.util.Validators; +import io.xpipe.ext.base.host.HostAddressStore; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @@ -21,36 +22,6 @@ import lombok.experimental.SuperBuilder; @ToString public abstract class AbstractServiceStore implements SingletonSessionStore, DataStore { - public static boolean requiresTunnel(NetworkTunnelStore t) { - if (!t.isLocallyTunnelable()) { - var parent = t.getNetworkParent(); - if (!(parent instanceof NetworkTunnelStore nts)) { - return false; - } - - return nts.requiresTunnel(); - } - - return t.requiresTunnel(); - } - - public static boolean requiresManualAddress(DataStore s) { - if (!(s instanceof NetworkTunnelStore t)) { - return true; - } - - if (!t.isLocallyTunnelable()) { - var parent = t.getNetworkParent(); - if (!(parent instanceof NetworkTunnelStore nts)) { - return false; - } - - return nts.requiresTunnel(); - } - - return t.requiresTunnel(); - } - private final Integer remotePort; private final Integer localPort; private final ServiceProtocolType serviceProtocolType; @@ -81,6 +52,15 @@ public abstract class AbstractServiceStore implements SingletonSessionStore s) { var abs = (AbstractServiceStore) s; - if (abs.getHost() != null && (!(abs.getHost().getStore() instanceof NetworkTunnelStore t) - || !t.requiresTunnel() - || !t.isLocallyTunnelable())) { - return false; + if (abs.getAddress() != null) { + return abs.getGateway() != null && abs.getGateway().getStore().isLocallyTunnelable() && abs.getGateway().getStore().requiresTunnel(); } - if (abs.getHost() == null && (abs.getGateway() == null || - !abs.getGateway().getStore().isLocallyTunnelable() || !abs.getGateway().getStore().requiresTunnel())) { - return false; + if (abs.getHost() != null) { + if (abs.getHost().getStore() instanceof AbstractHostStore a) { + return a.getGateway() != null && a.getGateway().getStore().requiresTunnel() && a.getGateway().getStore().isLocallyTunnelable(); + } + + if (abs.getHost().getStore() instanceof NetworkTunnelStore t) { + if (!t.requiresTunnel()) { + return false; + } + + if (t.isLocallyTunnelable()) { + return true; + } + + var parent = t.getNetworkParent(); + if (!t.isLocallyTunnelable() && parent instanceof NetworkTunnelStore nts) { + return nts.isLocallyTunnelable(); + } + + return false; + } } - return true; + return false; } + + @Override public FailableRunnable launch(DataStoreEntry store) { return () -> { @@ -62,9 +82,15 @@ public abstract class AbstractServiceStoreProvider implements SingletonSessionSt @Override public List getSearchableTerms(DataStore store) { AbstractServiceStore s = store.asNeeded(); - return s.getLocalPort() != null - ? List.of("" + s.getRemotePort(), "" + s.getLocalPort()) - : List.of("" + s.getRemotePort()); + var l = new ArrayList(); + l.add("" + s.getRemotePort()); + if (s.getLocalPort() != null) { + l.add("" + s.getLocalPort()); + } + if (s.getAddress() != null) { + l.add(s.getAddress()); + } + return l; } @Override @@ -109,11 +135,6 @@ public abstract class AbstractServiceStoreProvider implements SingletonSessionSt return "base:service_icon.svg"; } - @Override - public boolean showToggleWhenInactive(SingletonSessionStore store) { - return false; - } - @Override public Comp stateDisplay(StoreEntryWrapper w) { return new SystemStateComp(Bindings.createObjectBinding( diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStore.java b/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStore.java index 5b71e3717..cc6bbb2d1 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStore.java @@ -22,7 +22,7 @@ import lombok.extern.jackson.Jacksonized; @ToString(callSuper = true) public final class CustomServiceStore extends AbstractServiceStore implements AbstractHostTransformStore { - private final DataStoreEntryRef host; + private final DataStoreEntryRef host; private final String address; private final DataStoreEntryRef gateway; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java index d2db5cd19..241041b06 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/CustomServiceStoreProvider.java @@ -69,7 +69,7 @@ public class CustomServiceStoreProvider extends AbstractServiceStoreProvider { var serviceProtocolType = new SimpleObjectProperty<>(st.getServiceProtocolType()); var hostChoice = new StoreComboChoiceComp<>( - hostStore -> hostStore.getHostAddress().get(), + hostStore -> hostStore instanceof AbstractHostStore a ? a.getHostAddress().get() : hostStore instanceof NetworkTunnelStore t ? t.getTunnelHostName() : "?", entry, comboHost, NetworkTunnelStore.class, diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceStore.java b/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceStore.java index 904205878..e4bc8873f 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceStore.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/FixedServiceStore.java @@ -7,6 +7,7 @@ import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.Validators; import com.fasterxml.jackson.annotation.JsonTypeName; +import io.xpipe.ext.base.host.HostAddressStore; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; diff --git a/lang/strings/translations_en.properties b/lang/strings/translations_en.properties index f5f788fe4..6f3ff05c9 100644 --- a/lang/strings/translations_en.properties +++ b/lang/strings/translations_en.properties @@ -1668,7 +1668,7 @@ abstractHostAddress=Host address abstractHostAddressDescription=The address of the host abstractHostGateway=Gateway abstractHostGatewayDescription=The optional gateway system through which to reach this host -abstractHostConvert=Convert to abstract host +abstractHostConvert=Convert to abstract host entry abstractHostNoConnections=No available connections abstractHostHasConnections=$COUNT$ available connections abstractHostHasConnection=$COUNT$ available connection