Add compatibility mode

This commit is contained in:
retgal 2023-11-03 09:37:29 +01:00
parent 59553414a3
commit aa85074edc
19 changed files with 133 additions and 107 deletions

View File

@ -29,9 +29,9 @@ I also moved the code base to GitHub, where it can easier be maintained.
## Releases
The ![latest version](https://github.com/RetGal/Dayon/releases) is v11.0 (Ballsy Beaver) - released more than ten years after the initial release.
The ![latest version](https://github.com/RetGal/Dayon/releases) is v12.0 (Adorable Asteroid) - released more than ten years after the initial release.
This version comes with a new, access token based network configuration of the assisted.
This version comes with UPnP support for the assistant side. If enabled, the port forwarding rules will be created automatically.
The app is available directly from the <a href="https://www.microsoft.com/store/apps/9PBM5KW0C790">Microsoft Store</a>:
@ -90,6 +90,6 @@ You don't have to be a programmer!
For example translations for additional languages would make this app more useful for more earthlings - see: [src/main/resources/Babylon.properties](https://github.com/RetGal/Dayon/blob/master/src/main/resources/Babylon.properties) or [docs](https://github.com/RetGal/Dayon/tree/master/docs)
Also improvements of the existing translations and documentation are very welcome! For example, my current knowledge of Chinese is far below zero - and my knowledge of Russian or Turkish just fractions better..
Also, improvements of the existing translations and documentation are very welcome! For example, my current knowledge of Chinese is far below zero - and my knowledge of Russian or Turkish just fractions better..
Some additional testing, especially on macOS would also be highly appreciated.

View File

@ -99,6 +99,8 @@ public class Assistant implements ClipboardOwner {
private Boolean upnpEnabled;
private final AtomicBoolean compatibilityModeActive = new AtomicBoolean(false);
public Assistant() {
receivedBitCounter = new BitCounter("receivedBits", translate("networkBandwidth"));
receivedBitCounter.start(1000);
@ -179,6 +181,7 @@ public class Assistant implements ClipboardOwner {
assistantActions.setRemoteClipboardSetAction(createRemoteClipboardUpdateAction());
assistantActions.setStartAction(createStartAction());
assistantActions.setStopAction(createStopAction());
assistantActions.setToggleCompatibilityModeAction(createToggleCompatibilityModeAction());
return assistantActions;
}
@ -208,7 +211,7 @@ public class Assistant implements ClipboardOwner {
frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
try {
publicIp = UPnP.getExternalIP();
if (publicIp == null) {
if (publicIp == null || publicIp.startsWith("192.168") || publicIp.startsWith("10.")) {
final URL url = new URL(WHATSMYIP_SERVER_URL);
try (final BufferedReader lines = new BufferedReader(new InputStreamReader(url.openStream()))) {
publicIp = lines.readLine();
@ -223,7 +226,6 @@ public class Assistant implements ClipboardOwner {
}
if (publicIp != null) {
button.setText(publicIp);
button.setFont(new Font("Sans Serif", Font.PLAIN, 18));
}
});
choices.add(menuItem);
@ -263,8 +265,6 @@ public class Assistant implements ClipboardOwner {
choices.setLocation(choicesLocation.x - xOffset, choicesLocation.y + yOffset);
}
};
ip.putValue(Action.NAME, "whatIsMyIpAddress");
ip.putValue("DISPLAY_NAME", "127.0.0.1"); // always a selection
// ...
ip.putValue(Action.SHORT_DESCRIPTION, translate("ipAddress.msg1"));
@ -304,7 +304,7 @@ public class Assistant implements ClipboardOwner {
}
private Action createNetworkAssistantConfigurationAction(Assistant assistant) {
final Action exit = new AbstractAction() {
final Action conf = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ev) {
JFrame networkFrame = (JFrame) SwingUtilities.getRoot((Component) ev.getSource());
@ -347,11 +347,10 @@ public class Assistant implements ClipboardOwner {
}
}
};
exit.putValue(Action.NAME, margin(translate("connection.network")));
exit.putValue(Action.SHORT_DESCRIPTION, translate("connection.settings"));
exit.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.NETWORK_SETTINGS));
return exit;
conf.putValue(Action.NAME, margin(translate("connection.network")));
conf.putValue(Action.SHORT_DESCRIPTION, translate("connection.settings"));
conf.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.NETWORK_SETTINGS));
return conf;
}
private Action createRemoteClipboardRequestAction() {
@ -361,8 +360,6 @@ public class Assistant implements ClipboardOwner {
sendRemoteClipboardRequest();
}
};
getRemoteClipboard.putValue(Action.NAME, "getClipboard");
getRemoteClipboard.putValue(Action.SHORT_DESCRIPTION, translate("clipboard.getRemote"));
getRemoteClipboard.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.DOWN));
return getRemoteClipboard;
@ -375,8 +372,6 @@ public class Assistant implements ClipboardOwner {
sendLocalClipboard();
}
};
setRemoteClipboard.putValue(Action.NAME, "setClipboard");
setRemoteClipboard.putValue(Action.SHORT_DESCRIPTION, translate("clipboard.setRemote"));
setRemoteClipboard.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.UP));
return setRemoteClipboard;
@ -468,13 +463,11 @@ public class Assistant implements ClipboardOwner {
if (!newCaptureEngineConfiguration.equals(captureEngineConfiguration)) {
captureEngineConfiguration = newCaptureEngineConfiguration;
captureEngineConfiguration.persist();
sendCaptureConfiguration(captureEngineConfiguration);
}
}
}
};
configure.putValue(Action.NAME, margin(translate("capture")));
configure.putValue(Action.SHORT_DESCRIPTION, translate("capture.settings"));
configure.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.CAPTURE_SETTINGS));
@ -565,7 +558,6 @@ public class Assistant implements ClipboardOwner {
}
}
};
configure.putValue(Action.NAME, margin(translate("compression")));
configure.putValue(Action.SHORT_DESCRIPTION, translate("compression.settings"));
configure.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.COMPRESSION_SETTINGS));
@ -608,8 +600,6 @@ public class Assistant implements ClipboardOwner {
sendCaptureConfiguration(captureEngineConfiguration);
}
};
configure.putValue(Action.NAME, "resetCapture");
configure.putValue(Action.SHORT_DESCRIPTION, translate("capture.reset"));
configure.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.RESET_CAPTURE));
return configure;
@ -628,8 +618,6 @@ public class Assistant implements ClipboardOwner {
frame.repaint();
}
};
fitScreen.putValue(Action.NAME, "toggleScreenMode");
fitScreen.putValue(Action.SHORT_DESCRIPTION, translate("toggle.screen.mode"));
fitScreen.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.FIT));
return fitScreen;
@ -650,8 +638,6 @@ public class Assistant implements ClipboardOwner {
choices.show(caller, 0, caller.getHeight());
}
};
settings.putValue(Action.NAME, translate("settings"));
settings.putValue(Action.SHORT_DESCRIPTION, translate("settings"));
settings.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.SETTINGS));
return settings;
@ -690,8 +676,6 @@ public class Assistant implements ClipboardOwner {
clipboard.setContents(value, value);
}
};
tokenAction.putValue(Action.NAME, "createToken");
tokenAction.putValue(Action.SHORT_DESCRIPTION, translate("token.create.msg"));
tokenAction.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.KEY));
return tokenAction;
@ -704,7 +688,6 @@ public class Assistant implements ClipboardOwner {
new Assistant.NetWorker().execute();
}
};
startAction.putValue(Action.NAME, "start");
startAction.putValue(Action.SHORT_DESCRIPTION, translate("start.session"));
startAction.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.START));
return startAction;
@ -718,7 +701,6 @@ public class Assistant implements ClipboardOwner {
}
};
stopAction.setEnabled(false);
stopAction.putValue(Action.NAME, "stop");
stopAction.putValue(Action.SHORT_DESCRIPTION, translate("stop.session"));
stopAction.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.STOP));
return stopAction;
@ -758,6 +740,19 @@ public class Assistant implements ClipboardOwner {
}
}
private Action createToggleCompatibilityModeAction() {
final Action compatibilityMode = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ev) {
compatibilityModeActive.set(!compatibilityModeActive.get());
frame.repaint();
}
};
compatibilityMode.putValue(Action.SHORT_DESCRIPTION, translate("compatibility.mode"));
compatibilityMode.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.COMPATIBILITY));
return compatibilityMode;
}
private class NetWorker extends SwingWorker<String, String> {
@Override
protected String doInBackground() {
@ -769,7 +764,7 @@ public class Assistant implements ClipboardOwner {
private void startNetwork() {
frame.onGettingReady();
network.start();
network.start(compatibilityModeActive.get());
}
@Override
@ -788,14 +783,14 @@ public class Assistant implements ClipboardOwner {
private void initUpnp() {
CompletableFuture.supplyAsync(() -> {
upnpEnabled = Boolean.valueOf(UPnP.isUPnPAvailable());
upnpEnabled = UPnP.isUPnPAvailable();
Log.info(format("UPnP is %s", isUpnpEnabled() ? "enabled" : "disabled"));
return upnpEnabled;
});
}
private String margin(String in) {
return " " + in;
return format(" %s", in);
}
private class MyDeCompressorEngineListener implements DeCompressorEngineListener {
@ -879,6 +874,14 @@ public class Assistant implements ClipboardOwner {
frame.onSessionStarted();
}
@Override
public void onFingerprinted(String fingerprints) {
if (null == fingerprints) {
fingerprints = translate("compatibility.mode.enable");
}
frame.setFingerprints(fingerprints);
}
/**
* Should not block as called from the network receiving thread (!)
*/
@ -924,9 +927,5 @@ public class Assistant implements ClipboardOwner {
frame.onIOError(error);
}
@Override
public void onUntrustedConnection(String fingerprint) {
frame.onUntrustedConnection(fingerprint);
}
}
}

View File

@ -16,6 +16,7 @@ class AssistantActions {
private Action stopAction;
private Action settingsAction;
private Action tokenAction;
private Action toggleCompatibilityModeAction;
public Action getIpAddressAction() {
return ipAddressAction;
@ -112,4 +113,12 @@ class AssistantActions {
public void setTokenAction(Action tokenAction) {
this.tokenAction = tokenAction;
}
public Action getToggleCompatibilityModeAction() {
return toggleCompatibilityModeAction;
}
public void setToggleCompatibilityModeAction(Action toggleCompatibilityModeAction) {
this.toggleCompatibilityModeAction = toggleCompatibilityModeAction;
}
}

View File

@ -196,18 +196,15 @@ class AssistantFrame extends BaseFrame {
toolbar.addToggleAction(actions.getToggleFitScreenAction());
toolbar.addAction(actions.getResetAction());
toolbar.addSeparator();
toolbar.addToggleAction(actions.getToggleCompatibilityModeAction());
toolbar.addAction(actions.getSettingsAction());
toolbar.addSeparator();
toolbar.addAction(createShowInfoAction());
toolbar.addAction(createShowHelpAction());
toolbar.addSeparator();
toolbar.addAction(actions.getTokenAction());
toolbar.addSeparator();
toolbar.add(toolbar.getMessage());
toolbar.add(toolbar.getFingerprints());
toolbar.addGlue();
toolbar.addAction(actions.getIpAddressAction());
toolbar.addSeparator();
toolbar.addAction(createExitAction());
return toolbar;
}
@ -234,7 +231,6 @@ class AssistantFrame extends BaseFrame {
windowsKeyToggleButton.setEnabled(controlActivated.get());
}
};
remoteControl.putValue(Action.NAME, "toggleControlMode");
remoteControl.putValue(Action.SHORT_DESCRIPTION, translate("control.mode"));
remoteControl.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.CONTROL));
return remoteControl;
@ -252,7 +248,6 @@ class AssistantFrame extends BaseFrame {
windowsKeyActivated.set(!windowsKeyActivated.get());
}
};
sendWindowsKey.putValue(Action.NAME, "sendWindowsKey");
sendWindowsKey.putValue(Action.SHORT_DESCRIPTION, translate("send.windowsKey"));
sendWindowsKey.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.WIN));
return sendWindowsKey;
@ -265,6 +260,7 @@ class AssistantFrame extends BaseFrame {
actions.getStartAction().setEnabled(true);
actions.getStopAction().setEnabled(false);
actions.getNetworkConfigurationAction().setEnabled(true);
actions.getToggleCompatibilityModeAction().setEnabled(true);
actions.getIpAddressAction().setEnabled(true);
actions.getCaptureEngineConfigurationAction().setEnabled(true);
actions.getResetAction().setEnabled(false);
@ -275,7 +271,9 @@ class AssistantFrame extends BaseFrame {
void onHttpStarting(int port) {
actions.getStopAction().setEnabled(true);
actions.getNetworkConfigurationAction().setEnabled(false);
actions.getToggleCompatibilityModeAction().setEnabled(false);
actions.getIpAddressAction().setEnabled(false);
toolbar.clearFingerprints();
getStatusBar().setMessage(translate("listening", port));
}
@ -333,14 +331,12 @@ class AssistantFrame extends BaseFrame {
void onDisconnecting() {
stopSessionTimer();
toolbar.clearMessage();
}
void onIOError(IOException error) {
actions.getStartAction().setEnabled(false);
actions.getStopAction().setEnabled(false);
actions.getResetAction().setEnabled(false);
toolbar.clearMessage();
disableControls();
stopSessionTimer();
hideSpinner();

View File

@ -22,9 +22,6 @@ import static mpo.dayon.common.utils.SystemUtilities.*;
public abstract class BaseFrame extends JFrame {
private static final int MIN_WIDTH = 550;
private static final int MIN_HEIGHT = 300;
private transient FrameConfiguration configuration;
private transient Position position;
@ -42,7 +39,6 @@ public abstract class BaseFrame extends JFrame {
protected BaseFrame() {
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setIconImage(ImageUtilities.getOrCreateIcon(ImageNames.APP).getImage());
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent ev) {
@ -66,8 +62,8 @@ public abstract class BaseFrame extends JFrame {
this.configuration = new FrameConfiguration(frameType);
this.position = new Position(configuration.getX(), configuration.getY());
this.setLocation(position.getX(), position.getY());
this.dimension = new Dimension(Math.max(configuration.getWidth(), MIN_WIDTH),
Math.max(configuration.getHeight(), MIN_HEIGHT));
this.dimension = new Dimension(Math.max(configuration.getWidth(), frameType.getMinWidth()),
Math.max(configuration.getHeight(), frameType.getMinHeight()));
this.setSize(dimension.width, dimension.height);
updateTitle(translate(frameType.getPrefix()), Version.get());
}
@ -83,16 +79,20 @@ public abstract class BaseFrame extends JFrame {
}
protected void setupToolBar(ToolBar toolBar) {
this.toolBar = toolBar;
toolBar.addAction(createShowInfoAction());
toolBar.addAction(createShowHelpAction());
toolBar.addSeparator();
toolBar.addAction(createExitAction());
add(toolBar, BorderLayout.NORTH);
this.toolBar = toolBar;
}
protected void setupStatusBar(StatusBar statusBar) {
this.setStatusBar(statusBar);
add(statusBar, BorderLayout.SOUTH);
this.statusBar = statusBar;
}
protected Action createExitAction() {
private Action createExitAction() {
final Action exit = new AbstractAction() {
@Override
@ -100,11 +100,8 @@ public abstract class BaseFrame extends JFrame {
doExit();
}
};
exit.putValue(Action.NAME, "exit");
exit.putValue(Action.SHORT_DESCRIPTION, translate("exit.dayon"));
exit.putValue(Action.SMALL_ICON, ImageUtilities.getOrCreateIcon(ImageNames.EXIT));
return exit;
}
@ -112,7 +109,7 @@ public abstract class BaseFrame extends JFrame {
private static final String HTTP_SUPPORT = "https://retgal.github.io/Dayon/" + translate("support.html");
private static final String HTTP_FEEDBACK = HTTP_HOME + "/issues";
protected Action createShowInfoAction() {
private Action createShowInfoAction() {
final Action showSystemInfo = new AbstractAction() {
@Override
@ -174,8 +171,6 @@ public abstract class BaseFrame extends JFrame {
}
};
showSystemInfo.putValue(Action.NAME, "showSystemInfo");
showSystemInfo.putValue(Action.SHORT_DESCRIPTION, translate("system.info.show"));
showSystemInfo.putValue(Action.SMALL_ICON, ImageUtilities.getOrCreateIcon(ImageNames.INFO));
@ -219,15 +214,13 @@ public abstract class BaseFrame extends JFrame {
return format("<html>%s : <a href=''>%s</a> (build %s)</html>", label, url, buildNumber);
}
protected Action createShowHelpAction() {
private Action createShowHelpAction() {
final Action showHelp = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ev) {
browse(SystemUtilities.getQuickStartURI(translate("quickstart.html"), frameType.getPrefix()));
}
};
showHelp.putValue(Action.NAME, "showHelp");
showHelp.putValue(Action.SHORT_DESCRIPTION, translate("help"));
showHelp.putValue(Action.SMALL_ICON, ImageUtilities.getOrCreateIcon(ImageNames.HELP));
@ -267,12 +260,8 @@ public abstract class BaseFrame extends JFrame {
return statusBar;
}
private void setStatusBar(StatusBar statusBar) {
this.statusBar = statusBar;
}
public void onUntrustedConnection(String fingerprint) {
toolBar.setMessage(fingerprint);
public void setFingerprints(String fingerprints) {
toolBar.setFingerprints(fingerprints);
}
private static class FeedbackMouseAdapter extends MouseAdapter {

View File

@ -1,15 +1,28 @@
package mpo.dayon.common.gui.common;
public enum FrameType {
ASSISTANT("assistant"), ASSISTED("assisted");
ASSISTANT("assistant", 1024, 512),
ASSISTED("assisted", 512, 256);
private final String prefix;
private final Integer minWidth;
private final Integer minHeight;
FrameType(String prefix) {
FrameType(String prefix, Integer minWidth, Integer minHeight) {
this.prefix = prefix;
this.minWidth = minWidth;
this.minHeight = minHeight;
}
public String getPrefix() {
return prefix;
}
public Integer getMinWidth() {
return minWidth;
}
public Integer getMinHeight() {
return minHeight;
}
}

View File

@ -7,11 +7,13 @@ public final class ImageNames {
public static final String APP = "app_32.png";
public static final String APP_LARGE = "app_48.png";
public static final String CAPTURE_SETTINGS = "capture_settings.png";
public static final String COMPATIBILITY = "compatibility.png";
public static final String COMPRESSION_SETTINGS = "compression_settings.png";
public static final String CONTROL = "control.png";
public static final String COPY = "copy.png";
public static final String DOWN = "down.png";
public static final String EXIT = "exit.png";
public static final String FINGERPRINT = "fingerprint.png";
public static final String FIT = "fit.png";
public static final String HELP = "help.png";
public static final String INFO = "info.png";
@ -28,7 +30,6 @@ public final class ImageNames {
public static final String UP = "up.png";
public static final String USERS = "users_48.png";
public static final String WAITING = "waiting.gif";
public static final String WARNING = "warning.png";
public static final String WIN = "win.png";
}

View File

@ -1,18 +1,20 @@
package mpo.dayon.common.gui.toolbar;
import mpo.dayon.common.gui.common.ImageNames;
import java.awt.*;
import javax.swing.*;
import static java.lang.String.format;
import static mpo.dayon.common.babylon.Babylon.translate;
import static mpo.dayon.common.gui.common.ImageNames.FINGERPRINT;
import static mpo.dayon.common.gui.common.ImageUtilities.getOrCreateIcon;
public class ToolBar extends JToolBar {
public static final Insets ZERO_INSETS = new Insets(1, 1, 1, 1);
private final JLabel message = new JLabel();
private static final Font DEFAULT_FONT = new Font("Sans Serif", Font.PLAIN, 16);
private final JLabel fingerprint = new JLabel();
public ToolBar() {
setFloatable(false);
@ -24,6 +26,7 @@ public class ToolBar extends JToolBar {
final JButton button = new JButton();
addButtonProperties(action, button);
button.setDisabledIcon(null);
button.setFont(DEFAULT_FONT);
add(button);
}
@ -47,20 +50,20 @@ public class ToolBar extends JToolBar {
add(Box.createHorizontalGlue());
}
public JLabel getMessage() {
return message;
public JLabel getFingerprints() {
return fingerprint;
}
public void clearMessage() {
this.message.setIcon(null);
this.message.setText(null);
this.message.setToolTipText(null);
public void clearFingerprints() {
this.fingerprint.setText("");
this.fingerprint.setIcon(null);
}
public void setMessage(String fingerprint) {
this.message.setIcon(getOrCreateIcon(ImageNames.WARNING));
this.message.setText(translate("connection.suspicious"));
this.message.setToolTipText(translate("connection.fingerprint.mismatch", fingerprint));
public void setFingerprints(String hash) {
fingerprint.setIcon(getOrCreateIcon(FINGERPRINT));
fingerprint.setText(format("%s ", hash));
fingerprint.setToolTipText(translate("connection.peer.fingerprints"));
fingerprint.setFont(DEFAULT_FONT);
}
}
}

View File

@ -69,6 +69,7 @@ connection.incoming.msg2 = Connected with [ %s ]
# Connection Settings ...
connection.network = Network
connection.peer.fingerprints = Fingerprints assistant:assisted
connection.settings = Connection settings
connection.settings.assistantIpAddress = Assistant IP address
connection.settings.assistantPortNumber = Assistant port number
@ -83,9 +84,6 @@ connection.settings.invalidToken = This token is invalid.
connection.settings.upnp.true = UPnP is enabled on this gateway %s
connection.settings.upnp.false = UPnP is disabled in this network.
connection.settings.portforward.true = Port forwarding is configured automatically.
connection.settings.portforward.false = Remember to configure the port forwarding.
connection.suspicious = Possible MITM attack!
connection.fingerprint.mismatch = Fingerprints don't match %s
# Token
token = Token
@ -182,3 +180,6 @@ toggle.screen.mode = Toggle fit screen mode
uacSettings = UAC settings
share.all.screens = Share all screens
compatibility.mode = Compatibility mode for previous versions
compatibility.mode.enable = Enable compatibility mode!

View File

@ -69,6 +69,7 @@ connection.incoming.msg2 = Verbunden mit [ %s ]
# Connection Settings ...
connection.network = Netzwerk
connection.peer.fingerprints = Fingerabdr\u00FCcke Assistent:Assistierter
connection.settings = Verbindungseinstellungen
connection.settings.assistantIpAddress = IP-Adresse des Assistenten
connection.settings.assistantPortNumber = Port Nummer des Assistenten
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP ist aktiviert - Gateway %s
connection.settings.upnp.false = UPnP ist in diesem Netzwerk deaktiviert.
connection.settings.portforward.true = Portweiterleitung wird automatisch konfiguriert.
connection.settings.portforward.false = Einrichten der Portweiterleitung nicht vergessen.
connection.suspicious = M\u00F6glicher MITM-Angriff!
connection.fingerprint.mismatch = Fingerabdr\u00FCcke passen nicht %s
# Token
token = Token
@ -182,3 +181,6 @@ toggle.screen.mode = Anzeigemodus umschalten
uacSettings = UAC-Einstellungen
share.all.screens = Alle Bildschirme teilen
compatibility.mode = Kompatibilit\u00E4tsmodus f\u00FCr Vorg\u00E4ngerversionen
compatibility.mode.enable = Kompatibilit\u00E4tsmodus aktivieren!

View File

@ -69,6 +69,7 @@ connection.incoming.msg2 = Conectado con [ %s ]
# Connection Settings ...
connection.network = Red
connection.peer.fingerprints = Huellas asistente:asistido
connection.settings = Configuraci\u00F3n de conexi\u00F3n
connection.settings.assistantIpAddress = Direcci\u00F3n IP del asistente
connection.settings.assistantPortNumber = N\u00FAmero de puerto del asistente
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP est\u00E1 habilitado en esta puer
connection.settings.upnp.false = UPnP est\u00E1 deshabilitado en esta red.
connection.settings.portforward.true = El reenv\u00EDo de puertos se configura autom\u00E1ticamente.
connection.settings.portforward.false = Recuerde configurar el reenv\u00EDo de puertos.
connection.suspicious = \u00A1Posible ataque MITM!
connection.fingerprint.mismatch = Las huellas dactilares no coinciden %s
# Token
token = C\u00F3digo
@ -182,3 +181,6 @@ toggle.screen.mode = Cambiar modo de visualizaci\u00F3n
uacSettings = Configuraci\u00F3n de UAC
share.all.screens = Compartir todas las pantallas
compatibility.mode = Modo de compatibilidad para versiones anteriores
compatibility.mode.enable = \u00A1Habilite el modo de compatibilidad!

View File

@ -69,6 +69,7 @@ connection.incoming.msg2 = Connect\u00E9 avec [ %s ]
# Assisted Connection Settings ...
connection.network = R\u00E9seau
connection.peer.fingerprints = Empreintes assistant:assist\u00E9
connection.settings = Configuration de la Connexion
connection.settings.assistantIpAddress = Addresse IP de l'Assistant
connection.settings.assistantPortNumber = Num\u00E9ro du Port de l'Assistant
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP est activ\u00E9 sur cette passere
connection.settings.upnp.false = UPnP est d\u00E9sactiv\u00E9 dans ce r\u00E9seau.
connection.settings.portforward.true = La redirection de port est configur\u00E9e automatiquement.
connection.settings.portforward.false = N'oubliez pas de configurer la redirection de port.
connection.suspicious = Possible attaque MITM!
connection.fingerprint.mismatch = Les empreintes digitales ne correspondent pas %s
# Token
token = Code
@ -182,3 +181,6 @@ toggle.screen.mode = Ajuster le mode \u00E9cran
uacSettings = Param\u00E8tres UAC
share.all.screens = Partager tous les \u00E9crans
compatibility.mode = Mode de compatibilit\u00E9 pour les versions pr\u00E9c\u00E9dentes
compatibility.mode.enable = Activez le mode compatibilit\u00E9!

View File

@ -69,6 +69,7 @@ connection.incoming.msg2 = Connesso con [ %s ]
# Connection Settings ...
connection.network = Rete
connection.peer.fingerprints = Impronte assistante:assistito
connection.settings = Impostazioni di connessione
connection.settings.assistantIpAddress = Indirizzo IP dell'assistente
connection.settings.assistantPortNumber = Numero porta assistente
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP \u00E8 abilitato su questo gatewa
connection.settings.upnp.false = UPnP \u00E8 disabilitato in questa rete.
connection.settings.portforward.true = Il port forwarding \u00E8 configurato automaticamente.
connection.settings.portforward.false = Ricordati di configurare il port forwarding.
connection.suspicious = Possibile attacco MITM!
connection.fingerprint.mismatch = Le impronte digitali non corrispondono %s
# Token
token = Token
@ -177,8 +176,11 @@ clipboard.setRemote = Imposta appunti assistiti
send.windowsKey = Invia chiave Windows
toggle.screen.mode = Attiva / disattiva la modalit\u00E0 di adattamento allo schermo
toggle.screen.mode = Attiva/disattiva la modalit\u00E0 di adattamento allo schermo
uacSettings = Impostazioni dell'UAC
share.all.screens = Condividi tutti gli schermi
compatibility.mode = Modalit\u00E0 di compatibilit\u00E0 per le versioni precedenti
compatibility.mode.enable = Abilita la modalit\u00E0 compatibilit\u00E0!

View File

@ -69,6 +69,7 @@ connection.incoming.msg2 = \u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043
# Connection Settings ...
connection.network = \u0421\u0435\u0442\u044C
connection.peer.fingerprints = \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u043F\u0430\u043B\u044C\u0446\u0435\u0432 \u041F\u043E\u043C\u043E\u0449\u043D\u0438\u043A:\u041F\u043E\u043C\u043E\u0433\u0430\u043B
connection.settings = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F
connection.settings.assistantIpAddress = IP-\u0430\u0434\u0440\u0435\u0441 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430
connection.settings.assistantPortNumber = \u041D\u043E\u043C\u0435\u0440 \u043F\u043E\u0440\u0442\u0430 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP \u0432\u043A\u043B\u044E\u0447\u0
connection.settings.upnp.false = UPnP \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D \u0432 \u044D\u0442\u043E\u0439 \u0441\u0435\u0442\u0438.
connection.settings.portforward.true = \u041F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u043F\u043E\u0440\u0442\u043E\u0432 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.
connection.settings.portforward.false = \u041D\u0435 \u0437\u0430\u0431\u0443\u0434\u044C\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044E \u043F\u043E\u0440\u0442\u043E\u0432.
connection.suspicious = \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u0430 MITM-\u0430\u0442\u0430\u043A\u0430!
connection.fingerprint.mismatch = \u041E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u043F\u0430\u043B\u044C\u0446\u0435\u0432 \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442 %s
# Token (access code)
token = \u041A\u043E\u0434 \u0434\u043E\u0441\u0442\u0443\u043F\u0430
@ -182,3 +181,6 @@ toggle.screen.mode = \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u044
uacSettings = \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \u0443\u0447\u0435\u0442\u043D\u044B\u0445 \u0437\u0430\u043F\u0438\u0441\u0435\u0439
share.all.screens = \u0414\u0435\u043B\u0438\u0442\u0435\u0441\u044C \u0432\u0441\u0435\u043C\u0438 \u044D\u043A\u0440\u0430\u043D\u0430\u043C\u0438
compatibility.mode = \u0420\u0435\u0436\u0438\u043C \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438 \u0441 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u043C\u0438 \u0432\u0435\u0440\u0441\u0438\u044F\u043C\u0438
compatibility.mode.enable = \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0440\u0435\u0436\u0438\u043C \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438!

View File

@ -69,6 +69,7 @@ connection.incoming.msg2 = [ %s ]'a ba\u011Fland\u0131
# Connection Settings ...
connection.network = A\u011F
connection.peer.fingerprints = parmak izleri asistan:yard\u0131ml\u0131
connection.settings = Ba\u011Flant\u0131 ayarlar\u0131
connection.settings.assistantIpAddress = Asistan IP adresi
connection.settings.assistantPortNumber = Asistan port numaras\u0131
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP bu a\u011F ge\u00E7idinde etkinle
connection.settings.upnp.false = UPnP bu a\u011Fda devre d\u0131\u015F\u0131.
connection.settings.portforward.true = Ba\u011Flant\u0131 noktas\u0131 y\u00F6nlendirme otomatik olarak yap\u0131land\u0131r\u0131l\u0131r.
connection.settings.portforward.false = Ba\u011Flant\u0131 noktas\u0131 y\u00F6nlendirmeyi yap\u0131land\u0131rmay\u0131 unutmay\u0131n.
connection.suspicious = Muhtemel MITM sald\u0131r\u0131s\u0131!
connection.fingerprint.mismatch = Parmak izleri e\u015Fle\u015Fmiyor %s
# Token (access code)
token = Giri\u015F kodu
@ -182,3 +181,6 @@ toggle.screen.mode = Ekrana s\u0131\u011Fd\u0131r modunu a\u00E7/kapat
uacSettings = UAC ayarlar\u0131
share.all.screens = T\u00FCm ekranlar\u0131 payla\u015F
compatibility.mode = \u00D6nceki s\u00FCr\u00FCmler i\u00E7in uyumluluk modu
compatibility.mode.enable = Uyumluluk modunu etkinle\u015Ftirin!

View File

@ -104,6 +104,8 @@ connection.incoming.msg2 = \u4F1A\u8BDD\u5DF2\u542F\u52A8 [ %s ]
# Connection Settings ...
# Network Network Setting
connection.network = \u7F51\u7EDC\u914D\u7F6E
# Fingerprints assistant:assisted
connection.peer.fingerprints = \u6307\u7EB9 \u4E3B\u63A7\u7AEF\uFF1A\u7528\u6237\u7AEF
# Connection settings
connection.settings = \u8FDE\u63A5\u914D\u7F6E
# Assistant IP address
@ -130,8 +132,6 @@ connection.settings.upnp.true = \u6B64\u7F51\u5173 %s \u4E0A\u542F\u75
connection.settings.upnp.false = UPnP \u5728\u6B64\u7F51\u7EDC\u4E2D\u88AB\u7981\u7528\u3002
connection.settings.portforward.true = \u7AEF\u53E3\u8F6C\u53D1\u662F\u81EA\u52A8\u914D\u7F6E\u7684\u3002
connection.settings.portforward.false = \u8BF7\u8BB0\u4F4F\u914D\u7F6E\u7AEF\u53E3\u8F6C\u53D1\u3002
connection.suspicious = \u53EF\u80FD\u7684 MITM \u653B\u51FB\uFF01
connection.fingerprint.mismatch = \u6307\u7EB9\u4E0D\u5339\u914D %s
# Token (access code)
token = \u8BBF\u95EE\u4EE3\u7801
@ -277,3 +277,6 @@ toggle.screen.mode = \u8FDC\u7A0B\u684C\u9762\u5C4F\u5E55\u81EA\u9002\u5E94
uacSettings = UAC \u8BBE\u7F6E
share.all.screens = \u5171\u4EAB\u6240\u6709\u5C4F\u5E55
compatibility.mode = \u4EE5\u524D\u7248\u672C\u7684\u517C\u5BB9\u6A21\u5F0F
compatibility.mode.enable = \u542F\u7528\u517C\u5BB9\u6A21\u5F0F\uFF01

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

View File

@ -25,7 +25,7 @@ class NetworkAssistantEngineTest {
engine.reconfigure(configuration);
// when
engine.start();
engine.start(false);
// then
verify(listener, timeout(2000).atLeastOnce()).onStarting(configuration.getPort());

View File

@ -93,7 +93,7 @@ class VersionTest {
}
@ParameterizedTest
@CsvSource({ "11.0.0,1.10.8", "12.0.0,1.10.8", "12.0.0,11.0.7", "11.0.7,12.0.0" })
@CsvSource({ "11.0.0,1.10.8", "12.0.0,1.10.8", "12.0.0,11.0.7", "11.0.7,12.0.0", "12.0.1,13.0.0" })
void isCompatibleVersionShouldReturnTrueForHardCodedCompatibleVersions(String thatV, String otherV) {
// given
Version that = new Version(thatV);