From 37b1e627b7bda5a1e7aeca3ebe5beb58b84edec4 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sat, 28 Sep 2024 15:09:47 +0000 Subject: [PATCH] Rework terminal launches --- .../beacon/impl/SshLaunchExchangeImpl.java | 2 +- .../impl/TerminalLaunchExchangeImpl.java | 2 +- .../beacon/impl/TerminalWaitExchangeImpl.java | 2 +- .../io/xpipe/app/core/AppLayoutModel.java | 2 +- .../java/io/xpipe/app/prefs/AppPrefs.java | 6 + .../io/xpipe/app/prefs/SecurityCategory.java | 5 +- .../app/terminal/ExternalTerminalType.java | 20 +++ .../io/xpipe/app/util/SshLocalBridge.java | 16 +- .../xpipe/app/util/TerminalLaunchRequest.java | 87 ++++++++++ .../xpipe/app/util/TerminalLaunchResult.java | 18 ++ .../app/util/TerminalLauncherManager.java | 156 ++++-------------- lang/app/strings/translations_da.properties | 2 + lang/app/strings/translations_de.properties | 2 + lang/app/strings/translations_en.properties | 4 +- lang/app/strings/translations_es.properties | 2 + lang/app/strings/translations_fr.properties | 2 + lang/app/strings/translations_it.properties | 2 + lang/app/strings/translations_ja.properties | 2 + lang/app/strings/translations_nl.properties | 2 + lang/app/strings/translations_pt.properties | 2 + lang/app/strings/translations_ru.properties | 2 + lang/app/strings/translations_tr.properties | 2 + lang/app/strings/translations_zh.properties | 2 + 23 files changed, 214 insertions(+), 128 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/util/TerminalLaunchRequest.java create mode 100644 app/src/main/java/io/xpipe/app/util/TerminalLaunchResult.java diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java index 21cd6480d..2b8c8c410 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/SshLaunchExchangeImpl.java @@ -28,7 +28,7 @@ public class SshLaunchExchangeImpl extends SshLaunchExchange { // There are sometimes multiple requests by a terminal client (e.g. Termius) // This might fail sometimes, but it is expected - var r = TerminalLauncherManager.waitForNextLaunch(); + var r = TerminalLauncherManager.sshLaunchExchange(); var c = ProcessControlProvider.get() .getEffectiveLocalDialect() .getOpenScriptCommand(r.toString()) diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java index 1d732bbb9..d1982ca7f 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalLaunchExchangeImpl.java @@ -9,7 +9,7 @@ import com.sun.net.httpserver.HttpExchange; public class TerminalLaunchExchangeImpl extends TerminalLaunchExchange { @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException { - var r = TerminalLauncherManager.performLaunch(msg.getRequest()); + var r = TerminalLauncherManager.launchExchange(msg.getRequest()); return Response.builder().targetFile(r).build(); } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java index 4f6729c5d..885247908 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java @@ -10,7 +10,7 @@ import com.sun.net.httpserver.HttpExchange; public class TerminalWaitExchangeImpl extends TerminalWaitExchange { @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException { - TerminalLauncherManager.waitForCompletion(msg.getRequest()); + TerminalLauncherManager.waitExchange(msg.getRequest()); return Response.builder().build(); } diff --git a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java index de2326cfa..ff68a4052 100644 --- a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java +++ b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java @@ -130,7 +130,7 @@ public class AppLayoutModel { var now = Instant.now(); var zone = ZoneId.of(ZoneId.SHORT_IDS.get("PST")); var phStart = ZonedDateTime.of(2024, 10, 22, 0, 1, 0, 0, zone).toInstant(); - var phEnd = ZonedDateTime.of(2024, 10, 22, 23, 59, 0, 0, zone).toInstant(); + var phEnd = ZonedDateTime.of(2024, 10, 29, 23, 59, 0, 0, zone).toInstant(); var phShow = now.isAfter(phStart) && now.isBefore(phEnd); if (phShow) { l.add(new Entry( diff --git a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java index 2e97e29a7..0149c637f 100644 --- a/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java +++ b/app/src/main/java/io/xpipe/app/prefs/AppPrefs.java @@ -36,6 +36,8 @@ public class AppPrefs { private static AppPrefs INSTANCE; private final List> mapping = new ArrayList<>(); + final BooleanProperty dontAllowTerminalRestart = + mapVaultSpecific(new SimpleBooleanProperty(false), "dontAllowTerminalRestart", Boolean.class); final BooleanProperty enableHttpApi = mapVaultSpecific(new SimpleBooleanProperty(false), "enableHttpApi", Boolean.class); final BooleanProperty dontAutomaticallyStartVmSshServer = @@ -153,6 +155,10 @@ public class AppPrefs { return enableHttpApi; } + public ObservableBooleanValue dontAllowTerminalRestart() { + return dontAllowTerminalRestart; + } + private final IntegerProperty editorReloadTimeout = map(new SimpleIntegerProperty(1000), "editorReloadTimeout", Integer.class); private final BooleanProperty confirmDeletions = diff --git a/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java b/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java index c3b4f8756..c1b3093cc 100644 --- a/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java +++ b/app/src/main/java/io/xpipe/app/prefs/SecurityCategory.java @@ -28,7 +28,10 @@ public class SecurityCategory extends AppPrefsCategory { .nameAndDescription("dontAutomaticallyStartVmSshServer") .addToggle(prefs.dontAutomaticallyStartVmSshServer) .nameAndDescription("disableTerminalRemotePasswordPreparation") - .addToggle(prefs.disableTerminalRemotePasswordPreparation)); + .addToggle(prefs.disableTerminalRemotePasswordPreparation) + .nameAndDescription("dontAllowTerminalRestart") + .addToggle(prefs.dontAllowTerminalRestart) + ); return builder.buildComp(); } } diff --git a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java index aa1fc473e..b5803dd2c 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java @@ -114,6 +114,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } } + @Override + public String getWebsite() { + return "https://www.netsarang.com/en/xshell/"; + } + @Override public boolean supportsTabs() { return true; @@ -213,6 +218,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { return false; } + @Override + public String getWebsite() { + return "https://www.vandyke.com/products/securecrt/"; + } + @Override protected void execute(Path file, LaunchConfiguration configuration) throws Exception { try (var sc = LocalShell.getShell()) { @@ -261,6 +271,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { return true; } + @Override + public String getWebsite() { + return "https://mobaxterm.mobatek.net/"; + } + @Override protected void execute(Path file, LaunchConfiguration configuration) throws Exception { try (var sc = LocalShell.getShell()) { @@ -316,6 +331,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } } + @Override + public String getWebsite() { + return "https://termius.com/"; + } + @Override public boolean supportsTabs() { return true; diff --git a/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java b/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java index cb078e231..3d9572bad 100644 --- a/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java +++ b/app/src/main/java/io/xpipe/app/util/SshLocalBridge.java @@ -15,6 +15,7 @@ import lombok.Setter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.regex.Pattern; @Getter public class SshLocalBridge { @@ -109,8 +110,7 @@ public class SshLocalBridge { } var config = INSTANCE.getConfig(); - var command = "\"" + XPipeInstallation.getLocalDefaultCliExecutable() + "\" ssh-launch " - + sc.getShellDialect().environmentVariable("SSH_ORIGINAL_COMMAND"); + var command = get().getRemoteCommand(sc); var pidFile = bridgeDir.resolve("sshd.pid"); var content = """ @@ -148,6 +148,18 @@ public class SshLocalBridge { } } + private String getRemoteCommand(ShellControl sc) { + var command = "\"" + XPipeInstallation.getLocalDefaultCliExecutable() + "\" ssh-launch " + + sc.getShellDialect().environmentVariable("SSH_ORIGINAL_COMMAND"); + var p = Pattern.compile("\".+?\\\\Users\\\\([^\\\\]+)\\\\(.+)\""); + var matcher = p.matcher(command); + if (matcher.find() && matcher.group(1).contains(" ")) { + return matcher.replaceFirst("\"$2\""); + } else { + return command; + } + } + private void updateConfig() throws IOException { var file = Path.of(System.getProperty("user.home"), ".ssh", "config"); if (!Files.exists(file)) { diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLaunchRequest.java b/app/src/main/java/io/xpipe/app/util/TerminalLaunchRequest.java new file mode 100644 index 000000000..dbba16969 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/util/TerminalLaunchRequest.java @@ -0,0 +1,87 @@ +package io.xpipe.app.util; + +import io.xpipe.beacon.BeaconServerException; +import io.xpipe.core.process.*; +import io.xpipe.core.store.FilePath; +import lombok.Setter; +import lombok.Value; +import lombok.experimental.NonFinal; + +import java.nio.file.Path; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; + +@Value +public class TerminalLaunchRequest { + + UUID request; + ProcessControl processControl; + TerminalInitScriptConfig config; + String workingDirectory; + + @Setter + @NonFinal + TerminalLaunchResult result; + + @Setter + @NonFinal + boolean setupCompleted; + + + public Path waitForCompletion() throws BeaconServerException { + while (true) { + if (getResult() == null) { + ThreadHelper.sleep(10); + continue; + } + + var r = getResult(); + if (r instanceof TerminalLaunchResult.ResultFailure failure) { + var t = failure.getThrowable(); + throw new BeaconServerException(t); + } + + return ((TerminalLaunchResult.ResultSuccess) r).getTargetScript(); + } + } + + public CountDownLatch setupRequestAsync() { + var latch = new CountDownLatch(1); + ThreadHelper.runAsync(() -> { + setupRequest(); + latch.countDown(); + }); + return latch; + } + + public void setupRequest() { + var wd = new WorkingDirectoryFunction() { + + @Override + public boolean isFixed() { + return true; + } + + @Override + public boolean isSpecified() { + return workingDirectory != null; + } + + @Override + public FilePath apply(ShellControl shellControl) { + if (workingDirectory == null) { + return null; + } + + return new FilePath(workingDirectory); + } + }; + + try { + var file = ScriptHelper.createLocalExecScript(processControl.prepareTerminalOpen(config, wd)); + setResult(new TerminalLaunchResult.ResultSuccess(Path.of(file.toString()))); + } catch (Exception e) { + setResult(new TerminalLaunchResult.ResultFailure(e)); + } + } +} diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLaunchResult.java b/app/src/main/java/io/xpipe/app/util/TerminalLaunchResult.java new file mode 100644 index 000000000..0e9203a3e --- /dev/null +++ b/app/src/main/java/io/xpipe/app/util/TerminalLaunchResult.java @@ -0,0 +1,18 @@ +package io.xpipe.app.util; + +import lombok.Value; + +import java.nio.file.Path; + +public interface TerminalLaunchResult { + + @Value + public static class ResultSuccess implements TerminalLaunchResult { + Path targetScript; + } + + @Value + public static class ResultFailure implements TerminalLaunchResult { + Throwable throwable; + } +} diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java b/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java index d65952f63..27d9563d2 100644 --- a/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java +++ b/app/src/main/java/io/xpipe/app/util/TerminalLauncherManager.java @@ -1,126 +1,71 @@ package io.xpipe.app.util; +import io.xpipe.app.prefs.AppPrefs; import io.xpipe.beacon.BeaconClientException; import io.xpipe.beacon.BeaconServerException; import io.xpipe.core.process.ProcessControl; -import io.xpipe.core.process.ShellControl; import io.xpipe.core.process.TerminalInitScriptConfig; -import io.xpipe.core.process.WorkingDirectoryFunction; -import io.xpipe.core.store.FilePath; - -import lombok.Setter; -import lombok.Value; -import lombok.experimental.NonFinal; import java.nio.file.Path; -import java.util.*; +import java.util.LinkedHashMap; +import java.util.SequencedMap; +import java.util.UUID; import java.util.concurrent.CountDownLatch; public class TerminalLauncherManager { - private static final SequencedMap entries = new LinkedHashMap<>(); - - private static void prepare( - ProcessControl processControl, TerminalInitScriptConfig config, String directory, Entry entry) { - var workingDirectory = new WorkingDirectoryFunction() { - - @Override - public boolean isFixed() { - return true; - } - - @Override - public boolean isSpecified() { - return directory != null; - } - - @Override - public FilePath apply(ShellControl shellControl) { - if (directory == null) { - return null; - } - - return new FilePath(directory); - } - }; - - try { - var file = ScriptHelper.createLocalExecScript(processControl.prepareTerminalOpen(config, workingDirectory)); - entry.setResult(new ResultSuccess(Path.of(file.toString()))); - } catch (Exception e) { - entry.setResult(new ResultFailure(e)); - } - } + private static final SequencedMap entries = new LinkedHashMap<>(); public static CountDownLatch submitAsync( - UUID request, ProcessControl processControl, TerminalInitScriptConfig config, String directory) { + UUID request, ProcessControl processControl, TerminalInitScriptConfig config, String directory) throws + BeaconClientException { synchronized (entries) { - var entry = entries.get(request); - if (entry == null) { - entry = new Entry(request, processControl, config, directory, null, false); - entries.put(request, entry); + var req = entries.get(request); + if (req == null) { + req = new TerminalLaunchRequest(request, processControl, config, directory, null, false); + entries.put(request, req); } else { - entry.setResult(null); + req.setResult(null); } - var latch = new CountDownLatch(1); - Entry finalEntry = entry; - ThreadHelper.runAsync(() -> { - prepare(processControl, config, directory, finalEntry); - latch.countDown(); - }); - return latch; + + return req.setupRequestAsync(); } } - public static Path waitForNextLaunch() throws BeaconClientException, BeaconServerException { - Entry first; + public static Path sshLaunchExchange() throws BeaconClientException, BeaconServerException { + TerminalLaunchRequest last; synchronized (entries) { - first = entries.values().stream() - .filter(entry -> !entry.isLaunched()) - .findFirst() - .orElse(null); - if (first == null) { + var all = entries.values().stream().toList(); + last = !all.isEmpty() ? all.getLast() : null; + if (last == null) { throw new BeaconClientException("Unknown launch request"); } } - return waitForCompletion(first); + return last.waitForCompletion(); } - public static Path waitForCompletion(UUID request) throws BeaconClientException, BeaconServerException { - Entry e; + public static Path waitExchange(UUID request) throws BeaconClientException, BeaconServerException { + TerminalLaunchRequest req; synchronized (entries) { - e = entries.get(request); + req = entries.get(request); } - if (e == null) { + if (req == null) { throw new BeaconClientException("Unknown launch request " + request); } - if (e.isLaunched()) { - submitAsync(e.getRequest(), e.getProcessControl(), e.getConfig(), e.getWorkingDirectory()); + if (req.isSetupCompleted() && AppPrefs.get().dontAllowTerminalRestart().get()) { + throw new BeaconClientException("Terminal session restarts have been disabled in the security settings"); } - return waitForCompletion(e); - } - - public static Path waitForCompletion(Entry e) throws BeaconServerException { - while (true) { - if (e.result == null) { - ThreadHelper.sleep(10); - continue; - } - - synchronized (entries) { - var r = e.getResult(); - e.setLaunched(true); - if (r instanceof ResultFailure failure) { - var t = failure.getThrowable(); - throw new BeaconServerException(t); - } - - return ((ResultSuccess) r).getTargetScript(); - } + if (req.isSetupCompleted()) { + submitAsync(req.getRequest(), req.getProcessControl(), req.getConfig(), req.getWorkingDirectory()); + } + try { + return req.waitForCompletion(); + } finally { + req.setSetupCompleted(true); } } - public static Path performLaunch(UUID request) throws BeaconClientException { + public static Path launchExchange(UUID request) throws BeaconClientException { synchronized (entries) { var e = entries.values().stream() .filter(entry -> entry.getRequest().equals(request)) @@ -130,40 +75,11 @@ public class TerminalLauncherManager { throw new BeaconClientException("Unknown launch request " + request); } - if (!(e.result instanceof ResultSuccess)) { + if (!(e.getResult() instanceof TerminalLaunchResult.ResultSuccess)) { throw new BeaconClientException("Invalid launch request state " + request); } - return ((ResultSuccess) e.getResult()).getTargetScript(); + return ((TerminalLaunchResult.ResultSuccess) e.getResult()).getTargetScript(); } } - - public interface Result {} - - @Value - public static class Entry { - - UUID request; - ProcessControl processControl; - TerminalInitScriptConfig config; - String workingDirectory; - - @Setter - @NonFinal - Result result; - - @Setter - @NonFinal - boolean launched; - } - - @Value - public static class ResultSuccess implements Result { - Path targetScript; - } - - @Value - public static class ResultFailure implements Result { - Throwable throwable; - } } diff --git a/lang/app/strings/translations_da.properties b/lang/app/strings/translations_da.properties index 4ccc038e4..552cbaf12 100644 --- a/lang/app/strings/translations_da.properties +++ b/lang/app/strings/translations_da.properties @@ -526,3 +526,5 @@ asktextAlertTitle=Spørg fileWriteSudoTitle=Sudo filskrivning fileWriteSudoHeader=Den fil, du forsøger at skrive, kræver root-rettigheder. Vil du skrive denne fil med sudo? fileWriteSudoContent=Dette vil automatisk hæve sig til root med enten de angivne legitimationsoplysninger eller via en prompt. +dontAllowTerminalRestart=Tillad ikke genstart af terminal +dontAllowTerminalRestartDescription=Som standard kan terminalsessioner genstartes, når de er afsluttet inde fra terminalen. For at tillade dette accepterer XPipe disse eksterne anmodninger fra terminalen om at starte sessionen igen\n\nXPipe har ingen kontrol over terminalen, og hvor dette opkald kommer fra, så ondsindede lokale programmer kan også bruge denne funktion til at starte forbindelser gennem XPipe. Ved at deaktivere denne funktion forhindres dette scenarie. diff --git a/lang/app/strings/translations_de.properties b/lang/app/strings/translations_de.properties index 8d071076e..152f2c054 100644 --- a/lang/app/strings/translations_de.properties +++ b/lang/app/strings/translations_de.properties @@ -520,3 +520,5 @@ asktextAlertTitle=Eingabeaufforderung fileWriteSudoTitle=Sudo-Datei schreiben fileWriteSudoHeader=Die Datei, die du zu schreiben versuchst, erfordert Root-Rechte. Willst du diese Datei mit sudo schreiben? fileWriteSudoContent=Dadurch wird automatisch ein Root-Zugang eingerichtet, entweder mit den angegebenen Anmeldedaten oder über eine Eingabeaufforderung. +dontAllowTerminalRestart=Terminal-Neustart nicht zulassen +dontAllowTerminalRestartDescription=Standardmäßig können Terminalsitzungen neu gestartet werden, nachdem sie vom Terminal aus beendet wurden. Um dies zu ermöglichen, akzeptiert XPipe diese externen Anfragen vom Terminal, um die Sitzung erneut zu starten\n\nXPipe hat keine Kontrolle über das Terminal und darüber, woher dieser Aufruf kommt. Daher können böswillige lokale Anwendungen diese Funktion ebenfalls nutzen, um Verbindungen über XPipe zu starten. Die Deaktivierung dieser Funktion verhindert dieses Szenario. diff --git a/lang/app/strings/translations_en.properties b/lang/app/strings/translations_en.properties index 82735ab75..4beb44067 100644 --- a/lang/app/strings/translations_en.properties +++ b/lang/app/strings/translations_en.properties @@ -525,4 +525,6 @@ red=Red asktextAlertTitle=Prompt fileWriteSudoTitle=Sudo file write fileWriteSudoHeader=The file you are trying to write requires root privileges. Do you want to write this file with sudo? -fileWriteSudoContent=This will automatically elevate to root with either the provided credentials or via a prompt. \ No newline at end of file +fileWriteSudoContent=This will automatically elevate to root with either the provided credentials or via a prompt. +dontAllowTerminalRestart=Don't allow terminal restart +dontAllowTerminalRestartDescription=By default, terminal sessions can be restarted after they ended from within the terminal. To allow this, XPipe will accept these external requests from the terminal to launch the session again\n\nXPipe doesn't have any control over the terminal and where this call comes from, so malicious local applications can use this functionality as well to launch connections through XPipe. Disabling this functionality prevents this scenario. \ No newline at end of file diff --git a/lang/app/strings/translations_es.properties b/lang/app/strings/translations_es.properties index 18174d41f..38c8424b9 100644 --- a/lang/app/strings/translations_es.properties +++ b/lang/app/strings/translations_es.properties @@ -507,3 +507,5 @@ asktextAlertTitle=Pregunta fileWriteSudoTitle=Escritura de archivos Sudo fileWriteSudoHeader=El archivo que intentas escribir requiere privilegios de root. ¿Quieres escribir este archivo con sudo? fileWriteSudoContent=Esto elevará automáticamente a root con las credenciales proporcionadas o a través de un prompt. +dontAllowTerminalRestart=No permitir el reinicio del terminal +dontAllowTerminalRestartDescription=Por defecto, las sesiones de terminal pueden reiniciarse una vez finalizadas desde dentro del terminal. Para permitirlo, XPipe aceptará estas peticiones externas del terminal para iniciar de nuevo la sesión\n\nXPipe no tiene ningún control sobre el terminal y de dónde procede esta llamada, por lo que las aplicaciones locales maliciosas también pueden utilizar esta funcionalidad para lanzar conexiones a través de XPipe. Deshabilitar esta funcionalidad evita este escenario. diff --git a/lang/app/strings/translations_fr.properties b/lang/app/strings/translations_fr.properties index 1f8d30033..3334757b1 100644 --- a/lang/app/strings/translations_fr.properties +++ b/lang/app/strings/translations_fr.properties @@ -507,3 +507,5 @@ asktextAlertTitle=Invite fileWriteSudoTitle=Sudo file write fileWriteSudoHeader=Le fichier que tu essaies d'écrire nécessite les privilèges de root. Veux-tu écrire ce fichier avec sudo ? fileWriteSudoContent=Cette opération permet d'accéder automatiquement à la fonction de super-utilisateur à l'aide des informations d'identification fournies ou d'un message d'invite. +dontAllowTerminalRestart=Ne pas autoriser le redémarrage du terminal +dontAllowTerminalRestartDescription=Par défaut, les sessions de terminal peuvent être relancées après s'être terminées depuis le terminal. Pour permettre cela, XPipe acceptera ces demandes externes du terminal pour relancer la session\n\nXPipe n'a aucun contrôle sur le terminal et sur la provenance de cet appel, de sorte que des applications locales malveillantes peuvent également utiliser cette fonctionnalité pour lancer des connexions par l'intermédiaire de XPipe. La désactivation de cette fonctionnalité permet d'éviter ce scénario. diff --git a/lang/app/strings/translations_it.properties b/lang/app/strings/translations_it.properties index 3901e5188..351a0abdd 100644 --- a/lang/app/strings/translations_it.properties +++ b/lang/app/strings/translations_it.properties @@ -507,3 +507,5 @@ asktextAlertTitle=Prompt fileWriteSudoTitle=Scrittura di file Sudo fileWriteSudoHeader=Il file che stai cercando di scrivere richiede i privilegi di root. Vuoi scrivere questo file con sudo? fileWriteSudoContent=In questo modo si eleva automaticamente a root con le credenziali fornite o tramite un prompt. +dontAllowTerminalRestart=Non consentire il riavvio del terminale +dontAllowTerminalRestartDescription=Per impostazione predefinita, le sessioni del terminale possono essere riavviate dopo la loro conclusione dall'interno del terminale stesso. Per consentire ciò, XPipe accetterà le seguenti richieste esterne dal terminale per avviare nuovamente la sessione\n\nXPipe non ha alcun controllo sul terminale e sulla provenienza di questa chiamata, quindi anche le applicazioni locali malintenzionate possono utilizzare questa funzionalità per avviare connessioni attraverso XPipe. Disabilitando questa funzionalità si evita questo scenario. diff --git a/lang/app/strings/translations_ja.properties b/lang/app/strings/translations_ja.properties index 4c5c94cdf..697f2edd6 100644 --- a/lang/app/strings/translations_ja.properties +++ b/lang/app/strings/translations_ja.properties @@ -507,3 +507,5 @@ asktextAlertTitle=プロンプト fileWriteSudoTitle=須藤ファイル書き込み fileWriteSudoHeader=書き込もうとしているファイルにはroot権限が必要だ。このファイルをsudoで書き込むか? fileWriteSudoContent=これは、提供された認証情報またはプロンプト経由で自動的にrootに昇格する。 +dontAllowTerminalRestart=端末の再起動を許可しない +dontAllowTerminalRestartDescription=デフォルトでは、ターミナル・セッションはターミナル内から終了後に再開することができる。これを可能にするため、XPipeはターミナルからセッションを再び起動するための以下の外部リクエストを受け付ける。\n\nXPipeはターミナルとこの呼び出しの発信元を制御できないため、悪意のあるローカルアプリケーションはこの機能を使用してXPipe経由で接続を開始することができる。この機能を無効にすることで、このシナリオを防ぐことができる。 diff --git a/lang/app/strings/translations_nl.properties b/lang/app/strings/translations_nl.properties index 6fa983c99..8ac322a33 100644 --- a/lang/app/strings/translations_nl.properties +++ b/lang/app/strings/translations_nl.properties @@ -507,3 +507,5 @@ asktextAlertTitle=Prompt fileWriteSudoTitle=Sudo bestand schrijven fileWriteSudoHeader=Het bestand dat je probeert te schrijven vereist rootrechten. Wil je dit bestand schrijven met sudo? fileWriteSudoContent=Dit zal automatisch verheffen naar root met de verstrekte inloggegevens of via een prompt. +dontAllowTerminalRestart=Terminal opnieuw opstarten niet toestaan +dontAllowTerminalRestartDescription=Standaard kunnen terminalsessies opnieuw worden gestart nadat ze vanuit de terminal zijn beëindigd. Om dit mogelijk te maken, accepteert XPipe deze externe verzoeken van de terminal om de sessie opnieuw te starten\n\nXPipe heeft geen controle over de terminal en waar deze oproep vandaan komt, dus kwaadwillende lokale applicaties kunnen deze functionaliteit ook gebruiken om verbindingen via XPipe te starten. Het uitschakelen van deze functionaliteit voorkomt dit scenario. diff --git a/lang/app/strings/translations_pt.properties b/lang/app/strings/translations_pt.properties index ef9d0ebe5..a3d6d4502 100644 --- a/lang/app/strings/translations_pt.properties +++ b/lang/app/strings/translations_pt.properties @@ -507,3 +507,5 @@ asktextAlertTitle=Prompt fileWriteSudoTitle=Escreve um ficheiro Sudo fileWriteSudoHeader=O ficheiro que estás a tentar escrever requer privilégios de root. Queres escrever este ficheiro com sudo? fileWriteSudoContent=Isto irá elevar automaticamente para a raiz com as credenciais fornecidas ou através de um prompt. +dontAllowTerminalRestart=Não permitir o reinício do terminal +dontAllowTerminalRestartDescription=Por defeito, as sessões de terminal podem ser reiniciadas depois de terminarem a partir do terminal. Para permitir isso, o XPipe aceitará essas solicitações externas do terminal para iniciar a sessão novamente\n\nO XPipe não tem qualquer controlo sobre o terminal e sobre a origem desta chamada, pelo que as aplicações locais maliciosas também podem utilizar esta funcionalidade para iniciar ligações através do XPipe. Desativar esta funcionalidade evita este cenário. diff --git a/lang/app/strings/translations_ru.properties b/lang/app/strings/translations_ru.properties index 644eb2d9c..2befdb227 100644 --- a/lang/app/strings/translations_ru.properties +++ b/lang/app/strings/translations_ru.properties @@ -507,3 +507,5 @@ asktextAlertTitle=Prompt fileWriteSudoTitle=Запись файла Sudo fileWriteSudoHeader=Файл, который ты пытаешься записать, требует привилегий root. Хочешь ли ты записать этот файл с помощью sudo? fileWriteSudoContent=Это автоматически повысит статус до root либо с помощью предоставленных учетных данных, либо через приглашение. +dontAllowTerminalRestart=Не разрешайте перезагрузку терминала +dontAllowTerminalRestartDescription=По умолчанию терминальные сессии могут быть перезапущены после их завершения изнутри терминала. Чтобы разрешить это, XPipe будет принимать такие внешние запросы от терминала, чтобы снова запустить сессию\n\nXPipe не имеет никакого контроля над терминалом и тем, откуда поступает этот вызов, поэтому вредоносные локальные приложения могут использовать эту функциональность и для запуска соединений через XPipe. Отключение этой функциональности предотвращает подобный сценарий. diff --git a/lang/app/strings/translations_tr.properties b/lang/app/strings/translations_tr.properties index a79577d3f..037ad1a22 100644 --- a/lang/app/strings/translations_tr.properties +++ b/lang/app/strings/translations_tr.properties @@ -508,3 +508,5 @@ asktextAlertTitle=İstem fileWriteSudoTitle=Sudo dosya yazma fileWriteSudoHeader=Yazmaya çalıştığınız dosya root ayrıcalıkları gerektiriyor. Bu dosyayı sudo ile mi yazmak istiyorsunuz? fileWriteSudoContent=Bu, sağlanan kimlik bilgileriyle veya bir komut istemi aracılığıyla otomatik olarak kök dizine yükseltme yapacaktır. +dontAllowTerminalRestart=Terminalin yeniden başlatılmasına izin verme +dontAllowTerminalRestartDescription=Varsayılan olarak, terminal oturumları terminal içinden sonlandırıldıktan sonra yeniden başlatılabilir. Buna izin vermek için XPipe, oturumu tekrar başlatmak üzere terminalden gelen şu harici istekleri kabul edecektir\n\nXPipe terminal ve bu çağrının nereden geldiği üzerinde herhangi bir kontrole sahip değildir, bu nedenle kötü niyetli yerel uygulamalar XPipe üzerinden bağlantı başlatmak için bu işlevi de kullanabilir. Bu işlevselliğin devre dışı bırakılması bu senaryoyu önler. diff --git a/lang/app/strings/translations_zh.properties b/lang/app/strings/translations_zh.properties index deccec239..5e298e551 100644 --- a/lang/app/strings/translations_zh.properties +++ b/lang/app/strings/translations_zh.properties @@ -507,3 +507,5 @@ asktextAlertTitle=提示 fileWriteSudoTitle=Sudo 文件写入 fileWriteSudoHeader=您要写入的文件需要 root 权限。你想用 sudo 来写这个文件吗? fileWriteSudoContent=这将使用提供的凭据或通过提示自动提升为根用户。 +dontAllowTerminalRestart=不允许终端重启 +dontAllowTerminalRestartDescription=默认情况下,终端会话可以在终端内部结束后重新启动。为了做到这一点,XPipe 将接受来自终端的这些外部请求,以再次启动会话\n\nXPipe无法控制终端以及该调用的来源,因此恶意本地应用程序也可以使用该功能通过XPipe启动连接。禁用该功能可防止出现这种情况。