diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java index 925bcb119..d692798ac 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java +++ b/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java @@ -44,11 +44,15 @@ public class OpenFileSystemCache extends ShellControlCache { return; } - var lines = sc.command(CommandBuilder.of().add("cat").addFile("/etc/passwd")).readStdoutOrThrow(); + var lines = sc.command(CommandBuilder.of().add("cat").addFile("/etc/passwd")).readStdoutIfPossible().orElse(""); lines.lines().forEach(s -> { var split = s.split(":"); users.putIfAbsent(Integer.parseInt(split[2]), split[0]); }); + + if (users.isEmpty()) { + users.put(0, "root"); + } } private void loadGroups() throws Exception { @@ -57,11 +61,15 @@ public class OpenFileSystemCache extends ShellControlCache { return; } - var lines = sc.command(CommandBuilder.of().add("cat").addFile("/etc/group")).readStdoutOrThrow(); + var lines = sc.command(CommandBuilder.of().add("cat").addFile("/etc/group")).readStdoutIfPossible().orElse(""); lines.lines().forEach(s -> { var split = s.split(":"); groups.putIfAbsent(Integer.parseInt(split[2]), split[0]); }); + + if (groups.isEmpty()) { + groups.put(0, "root"); + } } public boolean isRoot() { diff --git a/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java b/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java index 5edb2e03b..a1a88e748 100644 --- a/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java +++ b/app/src/main/java/io/xpipe/app/core/AppDesktopIntegration.java @@ -9,10 +9,10 @@ import io.xpipe.app.util.PlatformState; import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.process.OsType; +import javax.imageio.ImageIO; import java.awt.*; import java.awt.desktop.*; import java.util.List; -import javax.imageio.ImageIO; public class AppDesktopIntegration { @@ -45,7 +45,7 @@ public class AppDesktopIntegration { }); } - // This will initialize the toolkit on macos and create the dock icon + // This will initialize the toolkit on macOS and create the dock icon // macOS does not like applications that run fully in the background, so always do it if (OsType.getLocal().equals(OsType.MACOS) && Desktop.isDesktopSupported()) { Desktop.getDesktop().setPreferencesHandler(e -> { @@ -68,7 +68,7 @@ public class AppDesktopIntegration { } }); - // Set dock icon explicitly on mac + // Set dock icon explicitly on macOS // This is necessary in case XPipe was started through a script as it will have no icon otherwise if (AppProperties.get().isDeveloperMode() && AppLogs.get().isWriteToSysout() diff --git a/app/src/main/java/io/xpipe/app/prefs/WorkspacesCategory.java b/app/src/main/java/io/xpipe/app/prefs/WorkspacesCategory.java index 375831e9b..53639c149 100644 --- a/app/src/main/java/io/xpipe/app/prefs/WorkspacesCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/WorkspacesCategory.java @@ -3,6 +3,7 @@ package io.xpipe.app.prefs; import io.xpipe.app.comp.base.ButtonComp; import io.xpipe.app.core.AppI18n; import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.util.LicenseProvider; import io.xpipe.app.util.OptionsBuilder; public class WorkspacesCategory extends AppPrefsCategory { @@ -15,10 +16,11 @@ public class WorkspacesCategory extends AppPrefsCategory { @Override protected Comp create() { return new OptionsBuilder() - .addTitle("manageWorkspaces") + .addTitle(AppI18n.observable("manageWorkspaces").map(s -> s + (LicenseProvider.get().getFeature("workspaces").isSupported() ? "" : " (Pro)"))) .sub(new OptionsBuilder() .nameAndDescription("workspaceAdd") .addComp(new ButtonComp(AppI18n.observable("addWorkspace"), WorkspaceCreationAlert::showAsync))) + .disable(!LicenseProvider.get().getFeature("workspaces").isSupported()) .buildComp(); } } diff --git a/dist/changelogs/11.0.md b/dist/changelogs/11.0.md index 8b3ecba74..a4a80cc93 100644 --- a/dist/changelogs/11.0.md +++ b/dist/changelogs/11.0.md @@ -20,28 +20,38 @@ These work via a local SSH bridge that is managed by XPipe. There is now support to add your teleport connections that are available via tsh. You can do that by searching for available connections on any system which has tsh installed. -## Serial connection support - -There is now support to add serial connections. Note that this feature is untested due to me not having physical serial devices around. If you have some, it would be very helpful if you could quickly try out the serial support and share your feedback. +This feature is available in the Professional edition and is freely available to anyone for two weeks after this release using the Pro Preview. ## Workspaces You can now create multiple user workspaces in the settings menu. This will create desktop shortcuts that you can use to start XPipe with different workspaces active. +This feature is available in the Professional edition and is freely available to anyone for two weeks after this release using the Pro Preview. + ## TTYs and PTYs -Up until now, if you added a connection that always allocated pty, XPipe would complain about a missing stderr. This was usually the case with badly implemented third-party ssh wrappers. In XPipe 11, there has been a ground up rework of the shell initialization code which will in theory allow for better handling of these cases. You can therefore now also launch such connections from the hub in a terminal. More advanced operations, such as the file browser, are not it possible for these connections though. +Up until now, if you added a connection that always allocated pty, XPipe would complain about a missing stderr. This was usually the case with badly implemented third-party ssh wrappers. In XPipe 11, there has been a ground up rework of the shell initialization code which will in theory allow for better handling of these cases. You can therefore now also launch such connections from the hub in a terminal. More advanced operations, such as the file browser, are not possible for these connections though. + +## Serial connection support + +There is now support to add serial connections. This is implemented by delegating the serial connection to another installed tool of your choice and opening that in a terminal session. + +Note that this feature is untested due to me not having physical serial devices around. The plan for this feature is for it to evolve over time with user feedback and issue reports. It is not expected that this will actually work at the initial release. + +## Pricing model updates + +I received plenty of user feedback and had time to observe the inner workings of potential customers, so I changed the old model that was created at a time when XPipe had no customers at all. All changes only apply to new orders. If you have previously purchased any XPipe edition, nothing will change for you. Any prices and conditions will stay the same for you. The community edition is also not changed. If you are interested in purchasing XPipe, you can read about the changes in detail at `https://xpipe.io/blog/pricing-updates`. ## Fixes -- Fix git sync freezing when using key with passphrase on modern ssh clients -- Fix git sync restarting daemon after exit when using key with passphrase +- Fix git sync freezing when using ssh key with passphrase +- Fix git sync restarting daemon after exit when using git ssh key with passphrase - Fix git vault readme not being generated on first push when no connections were added - Fix terminal exit not working properly in fish -- Fix renaming a connection clearing all state information +- Fix renaming a connection clearing all saved state information - Fix script enabled status being wrong after editing an enabled script - Fix download move operation failing when moving a directory that already existed in the downloads folder -- Fix some scrollbars are necessarily showing +- Fix some scrollbars unnecessarily showing - Fix file browser list jumping around on first show ## Other diff --git a/lang/proc/strings/translations_en.properties b/lang/proc/strings/translations_en.properties index 2bd4e9428..536bb5a48 100644 --- a/lang/proc/strings/translations_en.properties +++ b/lang/proc/strings/translations_en.properties @@ -44,7 +44,7 @@ rdpFile.displayName=RDP file rdpFile.displayDescription=Connect to a system via an existing .rdp file requiredSshServerAlertTitle=Setup SSH server requiredSshServerAlertHeader=Unable to find an installed SSH server in the VM. -requiredSshServerAlertContent=To connect to the VM, XPipe is looking for a running SSH server but no available SSH server was detected for the VM.. +requiredSshServerAlertContent=To connect to the VM, XPipe is looking for a running SSH server but no available SSH server was detected for the VM. computerName=Computer Name pssComputerNameDescription=The computer name to connect to. It is assumed that it is already included in your trusted hosts. credentialUser=Credential User