diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java index 32e6ef519..7cf65b35c 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java @@ -28,6 +28,8 @@ import io.xpipe.app.prefs.WorkspaceManager; import io.xpipe.app.process.LocalShell; import io.xpipe.app.pwman.KeePassXcPasswordManager; import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStorageMigration; +import io.xpipe.app.storage.DataStorageMigrationDialog; import io.xpipe.app.storage.DataStorageSyncHandler; import io.xpipe.app.terminal.TerminalDockHubManager; import io.xpipe.app.terminal.TerminalLauncherManager; @@ -194,6 +196,7 @@ public class AppBaseMode extends AppOperationMode { StartOnInitStore.init(); AppConfigurationDialog.showIfNeeded(); + DataStorageMigration.showLegacyVaultMigrationErrorIfNeeded(); TrackEvent.info("Finished base components initialization"); initialized = true; diff --git a/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java b/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java index 366dd3a9f..2fbc38616 100644 --- a/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/VaultCategory.java @@ -78,37 +78,7 @@ public class VaultCategory extends AppPrefsCategory { uh.setCurrentGroupStrategy(nv); }); - builder.title("vault") - .sub(new OptionsBuilder() - .name("vaultTypeName" + vaultTypeKey) - .description("vaultTypeContent" + vaultTypeKey) - .documentationLink(DocumentationLink.TEAM_VAULTS) - .addComp(RegionBuilder.empty()) - .nameAndDescription("vaultAuthentication") - .addComp(authChoice, prefs.vaultAuthentication) - .nameAndDescription(Bindings.createStringBinding( - () -> { - var empty = uh.getUserCount() == 0; - if (prefs.vaultAuthentication.get() == VaultAuthentication.GROUP) { - return empty ? "groupManagementEmpty" : "groupManagement"; - } - - return empty ? "userManagementEmpty" : "userManagement"; - }, - prefs.vaultAuthentication)) - .addComp(uh.createOverview().maxWidth(getCompWidth())) - .addComp(uh.createGroupStrategyOptions(groupStrategy).buildComp(), groupStrategy) - .hide(prefs.vaultAuthentication.isNotEqualTo(VaultAuthentication.GROUP)) - .nameAndDescription("syncVault") - .addComp(new ButtonComp(AppI18n.observable("enableGitSync"), () -> AppPrefs.get() - .selectCategory("vaultSync"))) - .hide(new SimpleBooleanProperty( - DataStorageSyncHandler.getInstance().supportsSync())) - .nameAndDescription("teamVaults") - .addComp(RegionBuilder.empty()) - .licenseRequirement("team") - .disable(!LicenseProvider.get().getFeature("team").isSupported()) - .hide(uh.getUserCount() > 1)); + builder.title("vault"); builder.sub(new OptionsBuilder() .pref(prefs.encryptAllVaultData) .addToggle(encryptVault) diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageMigration.java b/app/src/main/java/io/xpipe/app/storage/DataStorageMigration.java new file mode 100644 index 000000000..9319d0cca --- /dev/null +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageMigration.java @@ -0,0 +1,78 @@ +package io.xpipe.app.storage; + +import io.xpipe.app.core.AppVersion; +import io.xpipe.app.issue.ErrorEventFactory; +import org.apache.commons.io.FileUtils; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Optional; + +public class DataStorageMigration { + + private static boolean show = false; + + private static Optional loadVaultVersion(Path dir) throws IOException { + var file = dir.resolve("vaultversion"); + if (Files.exists(file)) { + var s = Files.readString(file); + return Optional.of(s); + } else { + return Optional.empty(); + } + } + + public static void showLegacyVaultMigrationErrorIfNeeded() { + if (!show) { + return; + } + + DataStorageMigrationDialog.show(); + } + + public static void init() throws IOException { + var dir = DataStorage.getStorageDirectory(); + var version = loadVaultVersion(dir); + if (version.isPresent()) { + var canonicalVersion = AppVersion.parse(version.get()); + if (canonicalVersion.isEmpty()) { + show = true; + return; + } + + if (canonicalVersion.get().getMajor() < 23 || (canonicalVersion.get().getMajor() == 23 && canonicalVersion.get().getMinor() < 9)) { + show = true; + return; + } + } else { + show = true; + } + } + + private static StandardStorage getStorage() { + return (StandardStorage) DataStorage.get(); + } + + public static void migrate() throws IOException { + var dir = DataStorage.getStorageDirectory(); + + var file = dir.resolve("vaultkey"); + try { + var vaultKey = DataStorageVaultKey.generate(); + DataStorageVaultKey.write(vaultKey, file); + getStorage().vaultKey = vaultKey; + } catch (Exception e) { + ErrorEventFactory.fromThrowable( + "Unable to convert vault key file " + file, e) + .terminal(true) + .build() + .handle(); + } + + DataStorageUserHandler.getInstance().migrate(); + + getStorage().forceRewrite(); + getStorage().save(false); + } +} diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageMigrationDialog.java b/app/src/main/java/io/xpipe/app/storage/DataStorageMigrationDialog.java new file mode 100644 index 000000000..a93c6cdc1 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageMigrationDialog.java @@ -0,0 +1,67 @@ +package io.xpipe.app.storage; + +import io.xpipe.app.comp.RegionBuilder; +import io.xpipe.app.comp.base.LabelComp; +import io.xpipe.app.comp.base.LoadingIconComp; +import io.xpipe.app.comp.base.ModalButton; +import io.xpipe.app.comp.base.ModalOverlay; +import io.xpipe.app.core.AppFontSizes; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.core.window.AppDialog; +import io.xpipe.app.platform.OptionsBuilder; +import io.xpipe.app.platform.PlatformThread; +import io.xpipe.app.util.BooleanScope; +import io.xpipe.app.util.ThreadHelper; +import io.xpipe.core.InPlaceSecretValue; +import javafx.beans.binding.Bindings; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.property.SimpleStringProperty; + +public class DataStorageMigrationDialog { + + public static void show() { + var content = AppDialog.dialogTextKey("storageMigrationContent"); + var busy = new SimpleBooleanProperty(); + var modal = ModalOverlay.of("storageMigrationTitle", content); + modal.addButtonBarComp(new LabelComp(AppI18n.observable("applyingVaultChanges")).visible(busy)); + modal.addButtonBarComp(RegionBuilder.hspacer()); + modal.addButton(ModalButton.cancel()); + modal.addButton(new ModalButton( + "apply", + () -> { + ThreadHelper.runFailableAsync(() -> { + if (busy.get()) { + return; + } + + BooleanScope.executeExclusive(busy, () -> { + DataStorageMigration.migrate(); + modal.close(); + }); + }); + }, + false, + true)) + .augment(button -> { + button.graphicProperty() + .bind(Bindings.createObjectBinding( + () -> { + return busy.get() + ? new LoadingIconComp(busy, AppFontSizes::base) + .style("busy-loading-icon") + .build() + : null; + }, + PlatformThread.sync(busy))); + button.textProperty() + .bind(Bindings.createStringBinding( + () -> { + return !busy.get() ? AppI18n.get("apply") : null; + }, + PlatformThread.sync(busy), + AppI18n.activeLanguage()));; + }); + modal.show(); + } +} diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageUserHandler.java b/app/src/main/java/io/xpipe/app/storage/DataStorageUserHandler.java index 4f5d47d89..e627d80df 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorageUserHandler.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageUserHandler.java @@ -20,16 +20,14 @@ public interface DataStorageUserHandler { void init() throws IOException; + void migrate() throws IOException; + void save(); void login(); SecretKey getEncryptionKey(); - BaseRegionBuilder createOverview(); - - OptionsBuilder createGroupStrategyOptions(ObjectProperty groupStrategy); - String getActiveUser(); VaultAuthentication getVaultAuthenticationType(); diff --git a/app/src/main/java/io/xpipe/app/storage/StandardStorage.java b/app/src/main/java/io/xpipe/app/storage/StandardStorage.java index 5b52c8007..bee0fece8 100644 --- a/app/src/main/java/io/xpipe/app/storage/StandardStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/StandardStorage.java @@ -37,7 +37,7 @@ public class StandardStorage extends DataStorage { private final DataStorageUserHandler dataStorageUserHandler; private final ReentrantLock busyIo = new ReentrantLock(); - private DataStorageVaultKey vaultKey; + DataStorageVaultKey vaultKey; @Getter private boolean disposed; @@ -315,6 +315,8 @@ public class StandardStorage extends DataStorage { return; } + var dirExists = Files.isDirectory(dir); + try { FileUtils.forceMkdir(dir.toFile()); } catch (Exception e) { @@ -324,6 +326,21 @@ public class StandardStorage extends DataStorage { .handle(); } + try { + if (!dirExists) { + Files.writeString(dir.resolve("vaultversion"), AppProperties.get().getVersion()); + } + + DataStorageMigration.init(); + + Files.writeString(dir.resolve("vaultversion"), AppProperties.get().getVersion()); + } catch (IOException e) { + ErrorEventFactory.fromThrowable("Unable to load vault version data", e) + .terminal(true) + .build() + .handle(); + } + try { initSystemInfo(); } catch (Exception e) { diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java index 97fb340bc..cc4faf33a 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubComp.java @@ -1,6 +1,5 @@ package io.xpipe.app.terminal; -import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.WindowDockComp; import javafx.application.Platform; @@ -31,20 +30,18 @@ public class TerminalDockHubComp extends WindowDockComp { var window = scene.getWindow(); window.focusedProperty().subscribe(focus -> { - if (!focus) { + if (!model.isActive()) { return; } - var target = scene.getRoot().lookup(".icon-button-comp:hover"); - ThreadHelper.runFailableAsync(() -> { - if (!model.isActive()) { - return; - } - + if (focus) { + var target = scene.getRoot().lookup(".icon-button-comp:hover"); if (target == null) { - model.focus(); + Platform.runLater(() -> { + model.focus(); + }); } - }); + } }); }); return stack; diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java index 9edc23ab0..a34d6350d 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java @@ -14,7 +14,6 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.GlobalTimer; import io.xpipe.app.util.NativeWinWindowControl; import io.xpipe.app.util.Rect; -import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.OsType; import javafx.application.Platform; @@ -165,11 +164,9 @@ public class TerminalDockHubManager { if (!showing.get()) { // Run later to guarantee order of operations Platform.runLater(() -> { - ThreadHelper.runAsync(() -> { - AppLayoutModel.get().selectConnections(); - showDock(); - attach(); - }); + AppLayoutModel.get().selectConnections(); + showDock(); + attach(); }); return false; } @@ -211,20 +208,18 @@ public class TerminalDockHubManager { var wasShowing = new SimpleBooleanProperty(); var wasAttached = new SimpleBooleanProperty(); AppLayoutModel.get().getSelected().addListener((observable, oldValue, newValue) -> { - ThreadHelper.runAsync(() -> { - if (AppLayoutModel.get().getEntries().indexOf(newValue) == 0) { - if (wasShowing.get()) { - showDock(); - } - if (wasAttached.get()) { - attach(); - } - } else if (AppLayoutModel.get().getEntries().indexOf(oldValue) == 0) { - wasAttached.set(!minimized.get() && !detached.get() && showing.get()); - wasShowing.set(showing.get()); - hideDock(); + if (AppLayoutModel.get().getEntries().indexOf(newValue) == 0) { + if (wasShowing.get()) { + showDock(); } - }); + if (wasAttached.get()) { + attach(); + } + } else if (AppLayoutModel.get().getEntries().indexOf(oldValue) == 0) { + wasAttached.set(!minimized.get() && !detached.get() && showing.get()); + wasShowing.set(showing.get()); + hideDock(); + } }); } @@ -251,10 +246,8 @@ public class TerminalDockHubManager { enableDock(); showDock(); Platform.runLater(() -> { - ThreadHelper.runAsync(() -> { - dockModel.trackTerminal(t, dock); - dockModel.closeOtherTerminals(session.getRequest()); - }); + dockModel.trackTerminal(t, dock); + dockModel.closeOtherTerminals(session.getRequest()); }); } @@ -321,31 +314,35 @@ public class TerminalDockHubManager { } public void enableDock() { - if (enabled.get()) { - return; - } + PlatformThread.runLaterIfNeeded(() -> { + if (enabled.get()) { + return; + } - dockModel.activateView(); - enabled.set(true); - showing.set(true); + dockModel.activateView(); + enabled.set(true); + showing.set(true); - NativeWinWindowControl.MAIN_WINDOW.setWindowsTransitionsEnabled(false); - AppLayoutModel.get().getQueueEntries().add(queueEntry); + NativeWinWindowControl.MAIN_WINDOW.setWindowsTransitionsEnabled(false); + AppLayoutModel.get().getQueueEntries().add(queueEntry); + }); } public void disableDock() { - if (!enabled.get()) { - return; - } + PlatformThread.runLaterIfNeeded(() -> { + if (!enabled.get()) { + return; + } - dockModel.deactivateView(); - enabled.set(false); - showing.set(false); + dockModel.deactivateView(); + enabled.set(false); + showing.set(false); - showDialogIfNeeded(); + showDialogIfNeeded(); - NativeWinWindowControl.MAIN_WINDOW.setWindowsTransitionsEnabled(true); - AppLayoutModel.get().getQueueEntries().remove(queueEntry); + NativeWinWindowControl.MAIN_WINDOW.setWindowsTransitionsEnabled(true); + AppLayoutModel.get().getQueueEntries().remove(queueEntry); + }); } public void triggerDock() { @@ -359,22 +356,26 @@ public class TerminalDockHubManager { } public void showDock() { - if (showing.get()) { - return; - } + PlatformThread.runLaterIfNeeded(() -> { + if (showing.get()) { + return; + } - dockModel.activateView(); - showing.set(true); - AppLayoutModel.get().selectConnections(); + dockModel.activateView(); + showing.set(true); + AppLayoutModel.get().selectConnections(); + }); } public void hideDock() { - if (!showing.get()) { - return; - } + PlatformThread.runLaterIfNeeded(() -> { + if (!showing.get()) { + return; + } - dockModel.deactivateView(); - showing.set(false); + dockModel.deactivateView(); + showing.set(false); + }); } public void attach() { diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java index 04c0a115e..50feb9ec5 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockView.java @@ -225,25 +225,26 @@ public class TerminalDockView implements WindowDockListener { TrackEvent.withTrace("Terminal view window shown").handle(); terminalInstances.forEach(terminalInstance -> { var controllable = terminalInstance.getControllable(); + if (controllable.isActive()) { + return; + } controllable.updateBoundsState(); if (controllable.isCustomBounds()) { return; } - if (controllable.isActive()) { - return; - } - - if (!viewActive) { - return; - } - controllable.show(); - controllable.removeIcon(); - controllable.own(NativeWinWindowControl.MAIN_WINDOW); - controllable.removeStyle(terminalInstance.manageBorders()); - controllable.focus(); + if (viewActive) { + controllable.removeIcon(); + controllable.own(NativeWinWindowControl.MAIN_WINDOW); + controllable.removeStyle(terminalInstance.manageBorders()); + controllable.focus(); + } else { + controllable.restoreIcon(); + controllable.disown(); + controllable.backOfWindow(NativeWinWindowControl.MAIN_WINDOW); + } }); } diff --git a/app/src/main/java/io/xpipe/app/util/WindowDockComp.java b/app/src/main/java/io/xpipe/app/util/WindowDockComp.java index a0b554bc0..3a27a2e75 100644 --- a/app/src/main/java/io/xpipe/app/util/WindowDockComp.java +++ b/app/src/main/java/io/xpipe/app/util/WindowDockComp.java @@ -62,24 +62,14 @@ public class WindowDockComp extends SimpleRegionBu update(stack); } }; - var maximized = new ChangeListener() { - @Override - public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { - update(stack); - } - }; var iconified = new ChangeListener() { @Override public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { if (newValue) { - ThreadHelper.runAsync(() -> { - model.onWindowMinimize(); - }); + model.onWindowMinimize(); } else { Platform.runLater(() -> { - ThreadHelper.runAsync(() -> { - model.onWindowShow(); - }); + model.onWindowShow(); }); } } @@ -99,9 +89,7 @@ public class WindowDockComp extends SimpleRegionBu var hide = new EventHandler() { @Override public void handle(WindowEvent event) { - ThreadHelper.runAsync(() -> { - model.onClose(); - }); + model.onClose(); } }; @@ -113,7 +101,6 @@ public class WindowDockComp extends SimpleRegionBu s.yProperty().removeListener(update); s.widthProperty().removeListener(update); s.heightProperty().removeListener(update); - s.maximizedProperty().removeListener(maximized); s.iconifiedProperty().removeListener(iconified); s.removeEventFilter(WindowEvent.WINDOW_SHOWN, show); s.removeEventFilter(WindowEvent.WINDOW_CLOSE_REQUEST, hide); @@ -129,7 +116,6 @@ public class WindowDockComp extends SimpleRegionBu s.yProperty().addListener(update); s.widthProperty().addListener(update); s.heightProperty().addListener(update); - s.maximizedProperty().addListener(maximized); s.iconifiedProperty().addListener(iconified); s.outputScaleXProperty().removeListener(scale); s.addEventFilter(WindowEvent.WINDOW_SHOWN, show); @@ -160,29 +146,27 @@ public class WindowDockComp extends SimpleRegionBu return; } - ThreadHelper.runAsync(() -> { - var windowRect = new NativeWinWindowControl(handle.get()).getBounds(); - if (windowRect.getX() == 0.0 && windowRect.getY() == 0.0 && windowRect.getW() == 0 && windowRect.getH() == 0) { - return; - } + var windowRect = new NativeWinWindowControl(handle.get()).getBounds(); + if (windowRect.getX() == 0.0 && windowRect.getY() == 0.0 && windowRect.getW() == 0 && windowRect.getH() == 0) { + return; + } - var xPadding = ((bounds.getMinX() + p.getLeft() + scene.getX()) * sx); - var yPadding = ((bounds.getMinY() + p.getTop() + scene.getY()) * sy); - var x = windowRect.getX() + xPadding; - var y = windowRect.getY() + yPadding; - var w = (bounds.getWidth() * sx) - p.getRight() - p.getLeft(); - var h = (bounds.getHeight() * sy) - p.getBottom() - p.getTop(); + var xPadding = ((bounds.getMinX() + p.getLeft() + scene.getX()) * sx); + var yPadding = ((bounds.getMinY() + p.getTop() + scene.getY()) * sy); + var x = windowRect.getX() + xPadding; + var y = windowRect.getY() + yPadding; + var w = (bounds.getWidth() * sx) - p.getRight() - p.getLeft(); + var h = (bounds.getHeight() * sy) - p.getBottom() - p.getTop(); - if (x + w > windowRect.getX() + windowRect.getW()) { - x = windowRect.getX() + 10; - w = windowRect.getW() - 20; - } - if (y + h > windowRect.getY() + windowRect.getH()) { - y = windowRect.getY() + 10; - h = windowRect.getH() - 20; - } + if (x + w > windowRect.getX() + windowRect.getW()) { + x = windowRect.getX() + 10; + w = windowRect.getW() - 20; + } + if (y + h > windowRect.getY() + windowRect.getH()) { + y = windowRect.getY() + 10; + h = windowRect.getH() - 20; + } - model.resizeView((int) Math.round(x), (int) Math.round(y), (int) Math.round(w), (int) Math.round(h)); - }); + model.resizeView((int) Math.round(x), (int) Math.round(y), (int) Math.round(w), (int) Math.round(h)); } } diff --git a/dist/jpackage.gradle b/dist/jpackage.gradle index 22ec74ba8..9700ab2c4 100644 --- a/dist/jpackage.gradle +++ b/dist/jpackage.gradle @@ -63,9 +63,7 @@ jlink { addOptions("--add-modules", groupName + ".ext.${extProject.name}") } - // We can't use jdwp with AOT - def excludeJdwp = bundleCds - if (!excludeJdwp) { + if (!ci || (!isStage && !isFullRelease)) { addOptions("--add-modules", "jdk.jdwp.agent") } 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 ed393ac8f..73db2158c 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 @@ -48,26 +48,11 @@ public abstract class AbstractServiceStore @Override public void checkComplete() throws Throwable { - // We do not require the host to be complete - if (getHost() != null) { - Validators.isType(getHost(), HostAddressStore.class); - } Validators.nonNull(remotePort); Validators.nonNull(serviceProtocolType); if (getHost() == null) { Validators.nonNull(getAddress()); } - - if (serviceProtocolType.hasScheme()) { - var addr = serviceProtocolType.formatAddress(getOpenTargetUrl()); - if (addr != null) { - try { - URI.create(addr); - } catch (IllegalArgumentException e) { - throw new ValidationException(e.getMessage()); - } - } - } } public String getOpenTargetUrl() { @@ -110,10 +95,6 @@ public abstract class AbstractServiceStore return false; } - if (!getHost().getStore().isComplete()) { - return false; - } - if (getHost().getStore() instanceof HostAddressGatewayStore g && !(getHost().getStore() instanceof NetworkTunnelStore)) { var gw = g.getTunnelGateway(); @@ -146,10 +127,6 @@ public abstract class AbstractServiceStore } if (getHost() != null) { - if (!getHost().getStore().isComplete()) { - return null; - } - if (!(getHost().getStore() instanceof NetworkTunnelStore) && getHost().getStore() instanceof HostAddressGatewayStore g) { if (g.getTunnelGateway() == null diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java index b60356bcf..efccd45a0 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/AbstractServiceStoreProvider.java @@ -39,10 +39,6 @@ public abstract class AbstractServiceStoreProvider implements SingletonSessionSt } if (abs.getHost() != null) { - if (!abs.getHost().getStore().isComplete()) { - return false; - } - if (abs.getHost().getStore() instanceof HostAddressGatewayStore a) { if (a.getTunnelGateway() != null && a.getTunnelGateway().getStore().requiresTunnel() diff --git a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java index e9f9e8d95..4935f0ed4 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/service/ServiceProtocolType.java @@ -21,8 +21,6 @@ import java.util.Locale; }) public interface ServiceProtocolType { - boolean hasScheme(); - String formatAddress(String base); void open(String url) throws Exception; @@ -35,11 +33,6 @@ public interface ServiceProtocolType { @Builder class Undefined implements ServiceProtocolType { - @Override - public boolean hasScheme() { - return false; - } - @Override public String formatAddress(String base) { return base; @@ -62,11 +55,6 @@ public interface ServiceProtocolType { String path; - @Override - public boolean hasScheme() { - return true; - } - @Override public String formatAddress(String base) { var url = "http://" + base; @@ -95,11 +83,6 @@ public interface ServiceProtocolType { String path; - @Override - public boolean hasScheme() { - return true; - } - @Override public String formatAddress(String base) { var url = "https://" + base; @@ -128,11 +111,6 @@ public interface ServiceProtocolType { String commandTemplate; - @Override - public boolean hasScheme() { - return false; - } - @Override public String formatAddress(String base) { return base; diff --git a/lang/strings/translations_en.properties b/lang/strings/translations_en.properties index 34ab5c24c..080bfa082 100644 --- a/lang/strings/translations_en.properties +++ b/lang/strings/translations_en.properties @@ -2213,4 +2213,5 @@ enpassUnlock=Enter Enpass vault master password keeperSmsUnlock=Enter Keeper Commander SMS Code keeper2faUnlock=Enter Keeper 2FA Code keeperUnlock=Enter your Keeper master password to unlock - +storageMigrationTitle=Vault migration +storageMigrationContent=Your XPipe vault comes from an older version of XPipe. To use it for the next versions with v24+, you will need to migrate the vault data to the new format. This will take a while and rewrite the data. If you are using git sync, this will result in large changes. diff --git a/version b/version index 5b1bf559e..c7f9d1f1b 100644 --- a/version +++ b/version @@ -1 +1 @@ -23.8-3 +23.8