Various fixes

This commit is contained in:
crschnick 2024-08-19 11:22:37 +00:00
parent 4f1ddc6634
commit a08dba4d06
5 changed files with 35 additions and 15 deletions

View file

@ -44,11 +44,15 @@ public class OpenFileSystemCache extends ShellControlCache {
return; 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 -> { lines.lines().forEach(s -> {
var split = s.split(":"); var split = s.split(":");
users.putIfAbsent(Integer.parseInt(split[2]), split[0]); users.putIfAbsent(Integer.parseInt(split[2]), split[0]);
}); });
if (users.isEmpty()) {
users.put(0, "root");
}
} }
private void loadGroups() throws Exception { private void loadGroups() throws Exception {
@ -57,11 +61,15 @@ public class OpenFileSystemCache extends ShellControlCache {
return; 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 -> { lines.lines().forEach(s -> {
var split = s.split(":"); var split = s.split(":");
groups.putIfAbsent(Integer.parseInt(split[2]), split[0]); groups.putIfAbsent(Integer.parseInt(split[2]), split[0]);
}); });
if (groups.isEmpty()) {
groups.put(0, "root");
}
} }
public boolean isRoot() { public boolean isRoot() {

View file

@ -9,10 +9,10 @@ import io.xpipe.app.util.PlatformState;
import io.xpipe.app.util.ThreadHelper; import io.xpipe.app.util.ThreadHelper;
import io.xpipe.core.process.OsType; import io.xpipe.core.process.OsType;
import javax.imageio.ImageIO;
import java.awt.*; import java.awt.*;
import java.awt.desktop.*; import java.awt.desktop.*;
import java.util.List; import java.util.List;
import javax.imageio.ImageIO;
public class AppDesktopIntegration { 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 // macOS does not like applications that run fully in the background, so always do it
if (OsType.getLocal().equals(OsType.MACOS) && Desktop.isDesktopSupported()) { if (OsType.getLocal().equals(OsType.MACOS) && Desktop.isDesktopSupported()) {
Desktop.getDesktop().setPreferencesHandler(e -> { 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 // This is necessary in case XPipe was started through a script as it will have no icon otherwise
if (AppProperties.get().isDeveloperMode() if (AppProperties.get().isDeveloperMode()
&& AppLogs.get().isWriteToSysout() && AppLogs.get().isWriteToSysout()

View file

@ -3,6 +3,7 @@ package io.xpipe.app.prefs;
import io.xpipe.app.comp.base.ButtonComp; import io.xpipe.app.comp.base.ButtonComp;
import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppI18n;
import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.Comp;
import io.xpipe.app.util.LicenseProvider;
import io.xpipe.app.util.OptionsBuilder; import io.xpipe.app.util.OptionsBuilder;
public class WorkspacesCategory extends AppPrefsCategory { public class WorkspacesCategory extends AppPrefsCategory {
@ -15,10 +16,11 @@ public class WorkspacesCategory extends AppPrefsCategory {
@Override @Override
protected Comp<?> create() { protected Comp<?> create() {
return new OptionsBuilder() return new OptionsBuilder()
.addTitle("manageWorkspaces") .addTitle(AppI18n.observable("manageWorkspaces").map(s -> s + (LicenseProvider.get().getFeature("workspaces").isSupported() ? "" : " (Pro)")))
.sub(new OptionsBuilder() .sub(new OptionsBuilder()
.nameAndDescription("workspaceAdd") .nameAndDescription("workspaceAdd")
.addComp(new ButtonComp(AppI18n.observable("addWorkspace"), WorkspaceCreationAlert::showAsync))) .addComp(new ButtonComp(AppI18n.observable("addWorkspace"), WorkspaceCreationAlert::showAsync)))
.disable(!LicenseProvider.get().getFeature("workspaces").isSupported())
.buildComp(); .buildComp();
} }
} }

View file

@ -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. 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 This feature is available in the Professional edition and is freely available to anyone for two weeks after this release using the Pro Preview.
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.
## Workspaces ## 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. 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 ## 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 ## Fixes
- Fix git sync freezing when using key with passphrase on modern ssh clients - Fix git sync freezing when using ssh key with passphrase
- Fix git sync restarting daemon after exit when using 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 git vault readme not being generated on first push when no connections were added
- Fix terminal exit not working properly in fish - 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 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 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 - Fix file browser list jumping around on first show
## Other ## Other

View file

@ -44,7 +44,7 @@ rdpFile.displayName=RDP file
rdpFile.displayDescription=Connect to a system via an existing .rdp file rdpFile.displayDescription=Connect to a system via an existing .rdp file
requiredSshServerAlertTitle=Setup SSH server requiredSshServerAlertTitle=Setup SSH server
requiredSshServerAlertHeader=Unable to find an installed SSH server in the VM. 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 computerName=Computer Name
pssComputerNameDescription=The computer name to connect to. It is assumed that it is already included in your trusted hosts. pssComputerNameDescription=The computer name to connect to. It is assumed that it is already included in your trusted hosts.
credentialUser=Credential User credentialUser=Credential User