diff --git a/parabotv2/src/org/parabot/Landing.java b/parabotv2/src/org/parabot/Landing.java index f31d248..4edf9ed 100644 --- a/parabotv2/src/org/parabot/Landing.java +++ b/parabotv2/src/org/parabot/Landing.java @@ -10,21 +10,17 @@ import org.parabot.core.network.proxy.ProxyType; import org.parabot.core.ui.BotUI; import org.parabot.core.ui.ServerSelector; import org.parabot.core.ui.utils.UILog; -import org.parabot.environment.api.utils.WebUtil; import javax.swing.*; - import java.awt.*; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.net.URI; -import java.net.URL; /** * Parabot v2.1 * - * @author Everel/Parnassian/Clisprail, Paradox, Matt, Dane + * @author Everel/Parnassian/Clisprail, Paradox/JKetelaar, Matt, Dane * @version 2.1 * @see Homepage */ @@ -91,14 +87,14 @@ public final class Landing { * @return String array with username and password */ private static String[] getCredentials() { - try { - BufferedReader bufferedReader = WebUtil.getReader(new URL( - Configuration.GET_PASSWORD)); - if (bufferedReader.readLine() != null) { - } - } catch (IOException e) { - e.printStackTrace(); - } +// try { +// BufferedReader bufferedReader = WebUtil.getReader(new URL( +// Configuration.GET_PASSWORD)); +// if (bufferedReader.readLine() != null) { +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } return null; } diff --git a/parabotv2/src/org/parabot/core/Configuration.java b/parabotv2/src/org/parabot/core/Configuration.java index 35ba1bb..8835fa2 100644 --- a/parabotv2/src/org/parabot/core/Configuration.java +++ b/parabotv2/src/org/parabot/core/Configuration.java @@ -21,5 +21,5 @@ public class Configuration { public static final String DATA_API = "http://bdn.parabot.org/api/v2/data/"; public static final String ITEM_API = DATA_API + "items/"; - public static final String BOT_VERSION = "2.1.12"; + public static final String BOT_VERSION = "2.1.14"; } diff --git a/parabotv2/src/org/parabot/core/Core.java b/parabotv2/src/org/parabot/core/Core.java index ca19f98..79e9c75 100644 --- a/parabotv2/src/org/parabot/core/Core.java +++ b/parabotv2/src/org/parabot/core/Core.java @@ -6,6 +6,7 @@ import org.parabot.Landing; import org.parabot.environment.api.utils.WebUtil; import java.io.*; +import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URLEncoder; import java.security.MessageDigest; @@ -99,8 +100,6 @@ public class Core { */ @SuppressWarnings("unused") private static boolean checksumValid(){ - String checksum = ""; - File f = new File(Landing.class.getProtectionDomain().getCodeSource().getLocation().getFile()); if (f.isFile()) { try { @@ -152,10 +151,12 @@ public class Core { JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(br); version = (String) object.get("result"); } - if (!Configuration.BOT_VERSION.equals(version)) { - Core.verbose("Our version: " + Configuration.BOT_VERSION); - Core.verbose("Latest version: " + version); - return false; + if (version != null) { + if (!Configuration.BOT_VERSION.equals(version)) { + Core.verbose("Our version: " + Configuration.BOT_VERSION); + Core.verbose("Latest version: " + version); + return false; + } } } catch (NumberFormatException | IOException | ParseException e) { e.printStackTrace(); @@ -172,35 +173,29 @@ public class Core { return true; } - private static boolean policyValid(){ - return new File(Directories.getSettingsPath() + "/java.policy").exists(); - } - - private static void createPolicy(){ - File policy = new File(Directories.getSettingsPath() + "/java.policy"); - if (!policy.exists()){ - try { - final BufferedReader in = WebUtil.getReader(Configuration.DATA_API + "policy"); - if (in != null) { - String line; - PrintWriter printWriter = new PrintWriter(Directories.getSettingsPath() + "/java.policy"); - while ((line = in.readLine()) != null) { - if (line.contains("%parabot_resources%")){ - line = line.replace("%parabot_resources%", Directories.getResourcesPath().getAbsolutePath()); - } - printWriter.println(line); - } - printWriter.close(); - in.close(); + private static void validateCache(){ + File[] cache = Directories.getCachePath().listFiles(); + Integer lowest = null; + if (cache != null) { + for (File f : cache) { + int date = (int) (f.lastModified()/ 1000); + if (lowest == null || date < lowest){ + lowest = date; } - } catch (IOException e) { - e.printStackTrace(); } } - } - public static void main(String[] args){ - createPolicy(); + try { + JSONObject object = (JSONObject) WebUtil.getJsonParser().parse(WebUtil.getContents("http://bdn.parabot.org/api/v2/bot/cache", "date=" + lowest)); + if ((boolean) object.get("result")){ + Core.verbose("Making space for the latest cache files"); + Directories.clearCache(); + }else{ + Core.verbose("Cache is up to date"); + } + } catch (MalformedURLException | ParseException e) { + e.printStackTrace(); + } } /** @@ -210,6 +205,7 @@ public class Core { */ public static boolean isValid() { Core.verbose("Checking for updates..."); + validateCache(); if (versionValid() && checksumValid()){ Core.verbose("No updates available."); diff --git a/parabotv2/src/org/parabot/core/Directories.java b/parabotv2/src/org/parabot/core/Directories.java index a01c5ed..22f8e92 100644 --- a/parabotv2/src/org/parabot/core/Directories.java +++ b/parabotv2/src/org/parabot/core/Directories.java @@ -194,4 +194,13 @@ public class Directories { } } + public static void clearCache() { + File[] cache = getCachePath().listFiles(); + if (cache != null) { + for (File f : cache) { + Core.verbose("Clearing " + f.getName() + " from cache..."); + f.delete(); + } + } + } } diff --git a/parabotv2/src/org/parabot/core/forum/AccountManager.java b/parabotv2/src/org/parabot/core/forum/AccountManager.java index ab05113..a848863 100644 --- a/parabotv2/src/org/parabot/core/forum/AccountManager.java +++ b/parabotv2/src/org/parabot/core/forum/AccountManager.java @@ -2,14 +2,17 @@ package org.parabot.core.forum; import org.json.simple.JSONObject; import org.parabot.core.Configuration; +import org.parabot.core.Context; import org.parabot.core.Core; import org.parabot.core.parsers.scripts.BDNScripts; import org.parabot.core.parsers.servers.PublicServers; import org.parabot.core.ui.components.VerboseLoader; +import org.parabot.environment.api.utils.PBPreferences; import org.parabot.environment.api.utils.WebUtil; import org.parabot.environment.scripts.executers.BDNScriptsExecuter; import org.parabot.environment.servers.executers.PublicServerExecuter; +import javax.swing.*; import java.io.BufferedReader; import java.net.URL; import java.net.URLEncoder; @@ -45,6 +48,7 @@ public final class AccountManager { accessors.add(BDNScriptsExecuter.MANAGER_FETCHER); accessors.add(PublicServers.MANAGER_FETCHER); accessors.add(PublicServerExecuter.MANAGER_FETCHER); + accessors.add(PBPreferences.MANAGER_FETCHER); for (final AccountManagerAccess accessor : accessors) { accessor.setManager(instance); @@ -60,30 +64,51 @@ public final class AccountManager { return account; } - public final boolean login(final String user, final String pass) { + public final boolean login(final String user, final String pass, boolean requestTwoStep) { if (account != null) { throw new IllegalStateException("Already logged in."); } - JSONObject result; - try { - BufferedReader contents = WebUtil.getReader(WebUtil.getConnection( - new URL(Configuration.LOGIN_SERVER), - URLEncoder.encode(user, "UTF-8"), - URLEncoder.encode(pass, "UTF-8"))); - result = (JSONObject) WebUtil.getJsonParser().parse(contents); + JSONObject result = null; + if (!requestTwoStep){ + try { + BufferedReader contents = WebUtil.getReader(WebUtil.getConnection( + new URL(Configuration.LOGIN_SERVER), + URLEncoder.encode(user, "UTF-8"), + URLEncoder.encode(pass, "UTF-8"))); - } catch (Throwable t) { - t.printStackTrace(); - return false; + result = (JSONObject) WebUtil.getJsonParser().parse(contents); + + } catch (Throwable t) { + t.printStackTrace(); + return false; + } + }else{ + try { + String two = JOptionPane.showInputDialog("Please provide your two factor authentication code\nYou can find this in either your email or the app you've setup"); + if (two != null && two.length() > 0) { + String contents = WebUtil.getContents(Configuration.LOGIN_SERVER, + "username=" + URLEncoder.encode(user, "UTF-8") + "&password=" + URLEncoder.encode(pass, "UTF-8") + "&2fa=" + URLEncoder.encode(two, "UTF-8") + ); + result = (JSONObject) WebUtil.getJsonParser().parse(contents); + } + } catch (Throwable t) { + t.printStackTrace(); + return false; + } } - if (result != null){ + if (result != null) { if (result.get("complete") != null) { String api = (String) ((JSONObject) result.get("data")).get("api"); account = new Account(user, pass, api); + Context.setUsername(user); return true; - }else if (result.get("error") != null){ - Core.verbose((String) result.get("error")); + } else if (result.get("error") != null) { + String errorResult = (String) result.get("error"); + if (errorResult.equals("2fa") || errorResult.equals("2fae")) { + return login(user, pass, true); + } + Core.verbose(errorResult); return false; } } diff --git a/parabotv2/src/org/parabot/core/network/NetworkInterface.java b/parabotv2/src/org/parabot/core/network/NetworkInterface.java index 146c1cf..8be4ae4 100644 --- a/parabotv2/src/org/parabot/core/network/NetworkInterface.java +++ b/parabotv2/src/org/parabot/core/network/NetworkInterface.java @@ -12,10 +12,10 @@ public class NetworkInterface { private static NetworkInterface cached; static { - try { - mac = getRealHardwareAddress(); - } catch (SocketException ignored) { - } + try { + mac = getRealHardwareAddress(); + } catch (SocketException ignored) { + } } public byte[] getHardwareAddress() { @@ -47,14 +47,11 @@ public class NetworkInterface { if (realMac != null) return realMac; try { - byte[] b = java.net.NetworkInterface.getByInetAddress( + return realMac = java.net.NetworkInterface.getByInetAddress( InetAddress.getLocalHost()).getHardwareAddress(); - if(b == null) - b = mac; - realMac = b; } catch (Exception ignored) { } - return realMac = mac; + return mac; } public static NetworkInterface getByInetAddress(InetAddress addr) { @@ -67,7 +64,7 @@ public class NetworkInterface { System.out.println("Setting mac address to:" + formatMac(mac2)); mac = mac2; } - + public static String formatMac(byte[] mac){ StringBuffer b = new StringBuffer(); for(int i = 0; i < 6;i++){ @@ -77,4 +74,4 @@ public class NetworkInterface { } return b.toString(); } -} +} \ No newline at end of file diff --git a/parabotv2/src/org/parabot/core/network/proxy/ProxySocket.java b/parabotv2/src/org/parabot/core/network/proxy/ProxySocket.java index e01698b..6082890 100644 --- a/parabotv2/src/org/parabot/core/network/proxy/ProxySocket.java +++ b/parabotv2/src/org/parabot/core/network/proxy/ProxySocket.java @@ -1,25 +1,14 @@ package org.parabot.core.network.proxy; -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketAddress; -import java.net.UnknownHostException; +import org.parabot.core.ui.utils.UILog; + +import javax.swing.*; +import java.io.*; +import java.net.*; import java.nio.channels.SocketChannel; import java.util.ArrayList; import java.util.List; -import javax.swing.JOptionPane; - -import org.parabot.core.ui.utils.UILog; - public class ProxySocket extends Socket { private static List connections = new ArrayList(); @@ -294,7 +283,7 @@ public class ProxySocket extends Socket { } public static void setLogin(String user, char[] pass) { - setLogin(user,new String(pass)); + setLogin(user, new String(pass)); } public static void setLogin(String user, String pass) { diff --git a/parabotv2/src/org/parabot/core/ui/LoginUI.java b/parabotv2/src/org/parabot/core/ui/LoginUI.java index 67d63c4..190ba96 100644 --- a/parabotv2/src/org/parabot/core/ui/LoginUI.java +++ b/parabotv2/src/org/parabot/core/ui/LoginUI.java @@ -39,7 +39,7 @@ public class LoginUI extends JFrame { String password = new String(txtPassword.getPassword()); if (username.length() > 0 && password.length() > 0) { - if (manager.login(username, password)) { + if (manager.login(username, password, false)) { Core.verbose("Logged in."); instance.dispose(); Core.verbose("Running server selector."); @@ -53,7 +53,7 @@ public class LoginUI extends JFrame { private void attempt(String user, String pass) { Core.verbose("Logging in..."); - if (manager.login(user, pass)) { + if (manager.login(user, pass, false)) { Core.verbose("Logged in."); instance.dispose(); Core.verbose("Running server selector."); diff --git a/parabotv2/src/org/parabot/core/ui/NetworkUI.java b/parabotv2/src/org/parabot/core/ui/NetworkUI.java index 59f6a01..daa44d6 100644 --- a/parabotv2/src/org/parabot/core/ui/NetworkUI.java +++ b/parabotv2/src/org/parabot/core/ui/NetworkUI.java @@ -1,24 +1,11 @@ package org.parabot.core.ui; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; +import org.parabot.core.network.NetworkInterface; +import org.parabot.core.network.proxy.ProxySocket; +import org.parabot.core.network.proxy.ProxyType; +import org.parabot.core.ui.utils.UILog; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; +import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -26,317 +13,324 @@ import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.PlainDocument; - -import org.parabot.core.network.NetworkInterface; -import org.parabot.core.network.proxy.ProxySocket; -import org.parabot.core.network.proxy.ProxyType; -import org.parabot.core.ui.utils.UILog; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; public class NetworkUI extends JFrame implements KeyListener, ActionListener, - DocumentListener { + DocumentListener { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private static NetworkUI instance; + private static NetworkUI instance; - private JComboBox proxyType; - private JTextField proxyHost; - private IntTextField proxyPort; - private JButton submitButton; + private JComboBox proxyType; + private JTextField proxyHost; + private IntTextField proxyPort; + private JButton submitButton; - private JList[] macList; - private JScrollPane[] macScrollList; + private JList[] macList; + private JScrollPane[] macScrollList; - private JCheckBox authCheckBox; - private JTextField authUsername; - private JPasswordField authPassword; + private JCheckBox authCheckBox; + private JTextField authUsername; + private JPasswordField authPassword; - private NetworkUI() { - initGUI(); - } + private NetworkUI() { + initGUI(); + } - public static NetworkUI getInstance() { - return instance == null ? instance = new NetworkUI() : instance; - } + public static NetworkUI getInstance() { + return instance == null ? instance = new NetworkUI() : instance; + } - @Override - public void setVisible(boolean b) { - BotUI.getInstance().setEnabled(!b); - if (ProxySocket.getProxyAddress() != null) - proxyHost.setText(ProxySocket.getProxyAddress().getHostName()); - proxyPort.setText("" + ProxySocket.getProxyPort()); - proxyType.setSelectedItem(ProxySocket.getProxyType()); - authCheckBox.setSelected(ProxySocket.auth); - setLocationRelativeTo(BotUI.getInstance()); - super.setVisible(b); - } + @Override + public void setVisible(boolean b) { + BotUI.getInstance().setEnabled(!b); + if (ProxySocket.getProxyAddress() != null) + proxyHost.setText(ProxySocket.getProxyAddress().getHostName()); + proxyPort.setText("" + ProxySocket.getProxyPort()); + proxyType.setSelectedItem(ProxySocket.getProxyType()); + authCheckBox.setSelected(ProxySocket.auth); + setLocationRelativeTo(BotUI.getInstance()); + super.setVisible(b); + } - @SuppressWarnings("unchecked") - private void initGUI() { - proxyType = new JComboBox(ProxyType.values()); - proxyType.setSelectedItem(ProxySocket.getProxyType()); + @SuppressWarnings("unchecked") + private void initGUI() { + proxyType = new JComboBox(ProxyType.values()); + proxyType.setSelectedItem(ProxySocket.getProxyType()); - proxyType.addActionListener(this); + proxyType.addActionListener(this); - proxyHost = new JTextField(); - proxyHost.addKeyListener(this); + proxyHost = new JTextField(); + proxyHost.addKeyListener(this); - proxyPort = new IntTextField(80, 5); - proxyPort.setColumns(5); - proxyPort.addKeyListener(this); + proxyPort = new IntTextField(80, 5); + proxyPort.setColumns(5); + proxyPort.addKeyListener(this); - submitButton = new JButton("Submit"); - submitButton.addActionListener(this); + submitButton = new JButton("Submit"); + submitButton.addActionListener(this); - byte[] mac = new byte[6]; - mac = NetworkInterface.mac; - macList = new JList[mac.length]; - macScrollList = new JScrollPane[mac.length]; - for (int i = 0; i < mac.length; i++) { - int value = mac[i] & 0xFF; - macList[i] = createMacList(); - macList[i].setSelectedIndex(value); - macScrollList[i] = new JScrollPane(macList[i]); - macList[i].ensureIndexIsVisible(value > 0 ? value - 1 : value); + byte[] mac = new byte[6]; + mac = NetworkInterface.mac; + macList = new JList[mac.length]; + macScrollList = new JScrollPane[mac.length]; + for (int i = 0; i < mac.length; i++) { + int value = mac[i] & 0xFF; + macList[i] = createMacList(); + macList[i].setSelectedIndex(value); + macScrollList[i] = new JScrollPane(macList[i]); + macList[i].ensureIndexIsVisible(value > 0 ? value - 1 : value); - } + } - authCheckBox = new JCheckBox("Auth"); - authCheckBox.addActionListener(this); + authCheckBox = new JCheckBox("Auth"); + authCheckBox.setSelected(ProxySocket.auth); + authCheckBox.addActionListener(this); - authUsername = new JTextField(); - authUsername.setEnabled(false); - authPassword = new JPasswordField(); - authPassword.setEnabled(false); + authUsername = new JTextField(); + authPassword = new JPasswordField(); - JPanel p = createPanelUI(); - add(p); - setResizable(false); - setDefaultCloseOperation(HIDE_ON_CLOSE); - pack(); - setTitle("Network Settings"); - } + authUsername.setEnabled(authCheckBox.isSelected()); + authPassword.setEnabled(authCheckBox.isSelected()); - private JPanel createPanelUI() { - JPanel ret = new JPanel(); - ret.setLayout(new BoxLayout(ret, BoxLayout.LINE_AXIS)); - Box main = Box.createVerticalBox(); + JPanel p = createPanelUI(); + add(p); + setResizable(false); + setDefaultCloseOperation(HIDE_ON_CLOSE); + pack(); + setTitle("Network Settings"); + } - Box type = Box.createHorizontalBox(); - type.add(new JLabel("Proxy Type: ")); - type.add(proxyType); + private JPanel createPanelUI() { + JPanel ret = new JPanel(); + ret.setLayout(new BoxLayout(ret, BoxLayout.LINE_AXIS)); + Box main = Box.createVerticalBox(); - Box host = Box.createHorizontalBox(); - host.add(new JLabel("Proxy Host: ")); - host.add(proxyHost); + Box type = Box.createHorizontalBox(); + type.add(new JLabel("Proxy Type: ")); + type.add(proxyType); - Box port = Box.createHorizontalBox(); - port.add(new JLabel("Proxy Port: ")); - port.add(proxyPort); + Box host = Box.createHorizontalBox(); + host.add(new JLabel("Proxy Host: ")); + host.add(proxyHost); - Box auth = Box.createHorizontalBox(); - auth.add(authCheckBox); + Box port = Box.createHorizontalBox(); + port.add(new JLabel("Proxy Port: ")); + port.add(proxyPort); - auth.add(Box.createHorizontalStrut(3)); + Box auth = Box.createHorizontalBox(); + auth.add(authCheckBox); - auth.add(new JLabel("User:")); - auth.add(authUsername); + auth.add(Box.createHorizontalStrut(3)); - auth.add(Box.createHorizontalStrut(3)); + auth.add(new JLabel("User:")); + auth.add(authUsername); - auth.add(new JLabel("Pass:")); - auth.add(authPassword); + auth.add(Box.createHorizontalStrut(3)); - Box macBox = Box.createHorizontalBox(); - macBox.add(new JLabel("MAC:")); - for (int i = 0; i < macList.length; i++) { - macBox.add(new JScrollPane(macList[i])); - macBox.add(Box.createHorizontalStrut(5)); - } + auth.add(new JLabel("Pass:")); + auth.add(authPassword); - Box submit = Box.createHorizontalBox(); - submit.add(submitButton); + Box macBox = Box.createHorizontalBox(); + macBox.add(new JLabel("MAC:")); + for (int i = 0; i < macList.length; i++) { + macBox.add(new JScrollPane(macList[i])); + macBox.add(Box.createHorizontalStrut(5)); + } - main.add(type); + Box submit = Box.createHorizontalBox(); + submit.add(submitButton); - main.add(Box.createVerticalStrut(5)); - main.add(host); + main.add(type); - main.add(Box.createVerticalStrut(5)); - main.add(port); + main.add(Box.createVerticalStrut(5)); + main.add(host); - main.add(Box.createVerticalStrut(5)); - main.add(auth); + main.add(Box.createVerticalStrut(5)); + main.add(port); - main.add(Box.createVerticalStrut(5)); - main.add(macBox); + main.add(Box.createVerticalStrut(5)); + main.add(auth); - main.add(Box.createVerticalStrut(5)); - main.add(submit); + main.add(Box.createVerticalStrut(5)); + main.add(macBox); - ret.add(main); - ret.setBorder(new EmptyBorder(10, 10, 10, 10)); - return ret; - } + main.add(Box.createVerticalStrut(5)); + main.add(submit); - @Override - public void keyPressed(KeyEvent e) { - Object source = e.getSource(); - if (source == proxyPort || source == proxyHost) { - if (e.getKeyCode() == KeyEvent.VK_ENTER) { - actionPerformed(null); - } - } - } + ret.add(main); + ret.setBorder(new EmptyBorder(10, 10, 10, 10)); + return ret; + } - @Override - public void keyReleased(KeyEvent arg0) { - // TODO Auto-generated method stub + @Override + public void keyPressed(KeyEvent e) { + Object source = e.getSource(); + if (source == proxyPort || source == proxyHost) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + actionPerformed(null); + } + } + } - } + @Override + public void keyReleased(KeyEvent arg0) { + // TODO Auto-generated method stub - @Override - public void keyTyped(KeyEvent arg0) { - // TODO Auto-generated method stub + } - } + @Override + public void keyTyped(KeyEvent arg0) { + // TODO Auto-generated method stub - @Override - public void changedUpdate(DocumentEvent arg0) { + } - } + @Override + public void changedUpdate(DocumentEvent arg0) { - @Override - public void insertUpdate(DocumentEvent arg0) { - if (proxyPort.isValid()) { - proxyPort.setText("" + proxyPort.getValue()); - } - } + } - @Override - public void removeUpdate(DocumentEvent arg0) { - insertUpdate(arg0); - } + @Override + public void insertUpdate(DocumentEvent arg0) { + if (proxyPort.isValid()) { + proxyPort.setText("" + proxyPort.getValue()); + } + } - @Override - public void actionPerformed(ActionEvent arg0) { - boolean b = false; + @Override + public void removeUpdate(DocumentEvent arg0) { + insertUpdate(arg0); + } - if (arg0.getSource() == proxyType) { - Object o = proxyType.getSelectedItem(); - authCheckBox.setEnabled(o == ProxyType.SOCKS5); - proxyHost.setEnabled(o != ProxyType.NONE); - proxyPort.setEnabled(o != ProxyType.NONE); - b = true; - } + @Override + public void actionPerformed(ActionEvent arg0) { + boolean b = false; - if (b || arg0.getSource() == authCheckBox) { - b = authCheckBox.isSelected() && authCheckBox.isEnabled(); - ProxySocket.auth = b; - authUsername.setEnabled(b); - authPassword.setEnabled(b); - return; - } + if (arg0.getSource() == proxyType) { + Object o = proxyType.getSelectedItem(); + authCheckBox.setEnabled(o == ProxyType.SOCKS5); + proxyHost.setEnabled(o != ProxyType.NONE); + proxyPort.setEnabled(o != ProxyType.NONE); + b = true; + } - if (proxyType.getSelectedItem() != ProxyType.NONE) { - if (proxyPort.getText().equals("") - || proxyHost.getText().equals("")) { - UILog.log("Error", "Please supply proxy information!", - JOptionPane.ERROR_MESSAGE); - return; - } - } + if (b || arg0.getSource() == authCheckBox) { + b = authCheckBox.isSelected() && authCheckBox.isEnabled(); + ProxySocket.auth = b; + authUsername.setEnabled(b); + authPassword.setEnabled(b); + return; + } - ProxySocket - .setLogin(authUsername.getText(), authPassword.getPassword()); + if (proxyType.getSelectedItem() != ProxyType.NONE) { + if (proxyPort.getText().equals("") + || proxyHost.getText().equals("")) { + UILog.log("Error", "Please supply proxy information!", + JOptionPane.ERROR_MESSAGE); + return; + } + } - byte[] mac = new byte[macList.length]; - for (int i = 0; i < mac.length; i++) - mac[i] = (byte) Short.parseShort( - (String) macList[i].getSelectedValue(), 16); - NetworkInterface.setMac(mac); + String username = authUsername.getText(); + char[] password = authPassword.getPassword(); - try { - if (ProxySocket.getConnectionCount() > 0) { - try { - System.out.println("Closing Existing Connections..."); - ProxySocket.closeConnections(); - } catch (Exception e) { + ProxySocket + .setLogin(username, password); - } - } - ProxySocket.setProxy((ProxyType) proxyType.getSelectedItem(), - proxyHost.getText(), proxyPort.getValue()); - UILog.log("Info", "Network settings have been set!"); - } catch (Exception e) { - UILog.log("Error", - "Unable to set proxy info!\n\nReason:" + e.getMessage()); - e.printStackTrace(); - } - setVisible(false); - } + byte[] mac = new byte[macList.length]; + for (int i = 0; i < mac.length; i++) + mac[i] = (byte) Short.parseShort( + (String) macList[i].getSelectedValue(), 16); + NetworkInterface.setMac(mac); - private JList createMacList() { - String[] hexStrings = new String[256]; - for (int i = 0; i < 256; i++) { - hexStrings[i] = String.format("%02X", i); - } - JList ret = new JList(hexStrings); - ret.setVisibleRowCount(3); - ret.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - return ret; - } + try { + if (ProxySocket.getConnectionCount() > 0) { + try { + System.out.println("Closing Existing Connections..."); + ProxySocket.closeConnections(); + } catch (Exception e) { - class IntTextField extends JTextField { - /** - * - */ - private static final long serialVersionUID = 1L; + } + } + ProxyType type = (ProxyType) proxyType.getSelectedItem(); + String host = proxyHost.getText(); + int port = proxyPort.getValue(); - public IntTextField(int defval, int size) { - super("" + defval, size); - } + ProxySocket.setProxy(type, host, port); + UILog.log("Info", "Network settings have been set!"); + } catch (Exception e) { + UILog.log("Error", + "Unable to set proxy info!\n\nReason:" + e.getMessage()); + e.printStackTrace(); + } + setVisible(false); + } - protected Document createDefaultModel() { - return new IntTextDocument(); - } + private JList createMacList() { + String[] hexStrings = new String[256]; + for (int i = 0; i < 256; i++) { + hexStrings[i] = String.format("%02X", i); + } + JList ret = new JList(hexStrings); + ret.setVisibleRowCount(3); + ret.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + return ret; + } - public boolean isValid() { - try { - int i = Integer.parseInt(getText()); - return i > 0 && i <= 25565; - } catch (Exception e) { - return false; - } - } + class IntTextField extends JTextField { + /** + * + */ + private static final long serialVersionUID = 1L; - public int getValue() { - try { - return Integer.parseInt(getText()); - } catch (NumberFormatException e) { - return 0; - } - } + public IntTextField(int defval, int size) { + super("" + defval, size); + } - class IntTextDocument extends PlainDocument { - /** - * - */ - private static final long serialVersionUID = 1L; + protected Document createDefaultModel() { + return new IntTextDocument(); + } - public void insertString(int offs, String str, AttributeSet a) - throws BadLocationException { - if (str == null) - return; - String oldString = getText(0, getLength()); - String newString = oldString.substring(0, offs) + str - + oldString.substring(offs); - try { - Integer.parseInt(newString.replace("-", "") + "0"); - super.insertString(offs, str, a); - } catch (NumberFormatException e) { - } - } - } - } + public boolean isValid() { + try { + int i = Integer.parseInt(getText()); + return i > 0 && i <= 25565; + } catch (Exception e) { + return false; + } + } + + public int getValue() { + try { + return Integer.parseInt(getText()); + } catch (NumberFormatException e) { + return 0; + } + } + + class IntTextDocument extends PlainDocument { + /** + * + */ + private static final long serialVersionUID = 1L; + + public void insertString(int offs, String str, AttributeSet a) + throws BadLocationException { + if (str == null) + return; + String oldString = getText(0, getLength()); + String newString = oldString.substring(0, offs) + str + + oldString.substring(offs); + try { + Integer.parseInt(newString.replace("-", "") + "0"); + super.insertString(offs, str, a); + } catch (NumberFormatException e) { + } + } + } + } } \ No newline at end of file diff --git a/parabotv2/src/org/parabot/core/ui/ScriptSelector.java b/parabotv2/src/org/parabot/core/ui/ScriptSelector.java index d2e1f97..38cc6fa 100644 --- a/parabotv2/src/org/parabot/core/ui/ScriptSelector.java +++ b/parabotv2/src/org/parabot/core/ui/ScriptSelector.java @@ -4,6 +4,7 @@ import org.parabot.core.Context; import org.parabot.core.Directories; import org.parabot.core.desc.ScriptDescription; import org.parabot.core.parsers.scripts.ScriptParser; +import org.parabot.environment.api.utils.WebUtil; import org.parabot.environment.scripts.Category; import javax.swing.*; @@ -16,6 +17,9 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URLEncoder; import java.util.HashMap; /** @@ -156,6 +160,11 @@ public final class ScriptSelector extends JFrame { public void actionPerformed(ActionEvent e) { String s = getScriptName(tree.getSelectionPath().toString()); if (s != null) { + try { + WebUtil.getContents("http://bdn.parabot.org/api/v2/scripts/local", "script=" + URLEncoder.encode(s, "UTF-8") + "&username=" + URLEncoder.encode(Context.getUsername(), "UTF-8")); + } catch (MalformedURLException | UnsupportedEncodingException e1) { + e1.printStackTrace(); + } runScript(format.get(s)); } } diff --git a/parabotv2/src/org/parabot/core/ui/components/VerboseLoader.java b/parabotv2/src/org/parabot/core/ui/components/VerboseLoader.java index d4e3156..7cbe948 100644 --- a/parabotv2/src/org/parabot/core/ui/components/VerboseLoader.java +++ b/parabotv2/src/org/parabot/core/ui/components/VerboseLoader.java @@ -1,6 +1,5 @@ package org.parabot.core.ui.components; -import org.parabot.core.Context; import org.parabot.core.Core; import org.parabot.core.forum.AccountManager; import org.parabot.core.forum.AccountManagerAccess; @@ -61,8 +60,7 @@ public class VerboseLoader extends JPanel implements ProgressListener { setOpaque(false); if(username != null && password != null) { - if(Core.inDebugMode() || manager.login(username, password)) { - Context.setUsername(username); + if(Core.inDebugMode() || manager.login(username, password, false)) { currentState = STATE_SERVER_SELECT; } } @@ -133,7 +131,7 @@ public class VerboseLoader extends JPanel implements ProgressListener { @Override public void actionPerformed(ActionEvent e) { - if(manager.login(userInput.getText(), passInput.getText())) { + if(manager.login(userInput.getText(), passInput.getText(), false)) { switchState(STATE_SERVER_SELECT); } else { Core.verbose("Failed to log in."); diff --git a/parabotv2/src/org/parabot/environment/api/utils/FileUtil.java b/parabotv2/src/org/parabot/environment/api/utils/FileUtil.java new file mode 100644 index 0000000..6d0b914 --- /dev/null +++ b/parabotv2/src/org/parabot/environment/api/utils/FileUtil.java @@ -0,0 +1,68 @@ +package org.parabot.environment.api.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * @author JKetelaar + */ +public class FileUtil { + + public static String getChecksum(File file){ + if (file.isFile()) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + if (file.exists()) { + FileInputStream fis = new FileInputStream(file); + byte[] dataBytes = new byte[1024]; + + int nread; + + while ((nread = fis.read(dataBytes)) != -1) { + md.update(dataBytes, 0, nread); + } + + byte[] mdbytes = md.digest(); + + StringBuilder sb = new StringBuilder(""); + for (int i = 0; i < mdbytes.length; i++) { + sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1)); + } + + return sb.toString(); + } + } catch (NoSuchAlgorithmException | IOException e) { + e.printStackTrace(); + } + } + + return null; + } + + public static byte[] getChecksumBytes(File file) { + if (file.isFile()) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + if (file.exists()) { + FileInputStream fis = new FileInputStream(file); + byte[] dataBytes = new byte[1024]; + + int nread; + + while ((nread = fis.read(dataBytes)) != -1) { + md.update(dataBytes, 0, nread); + } + + return md.digest(); + } + } catch (NoSuchAlgorithmException | IOException e) { + e.printStackTrace(); + } + } + + return null; + } +} diff --git a/parabotv2/src/org/parabot/environment/api/utils/PBPreferences.java b/parabotv2/src/org/parabot/environment/api/utils/PBPreferences.java new file mode 100644 index 0000000..8d810e2 --- /dev/null +++ b/parabotv2/src/org/parabot/environment/api/utils/PBPreferences.java @@ -0,0 +1,132 @@ +package org.parabot.environment.api.utils; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.ParseException; +import org.parabot.core.forum.AccountManager; +import org.parabot.core.forum.AccountManagerAccess; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URLEncoder; +import java.util.Map; +import java.util.Properties; + +/** + * @author JKetelaar + */ +public class PBPreferences { + + private static AccountManager manager; + + private Properties properties; + private int scriptID; + + public static final AccountManagerAccess MANAGER_FETCHER = new AccountManagerAccess() { + @Override + public final void setManager(AccountManager manager) { + PBPreferences.manager = manager; + } + }; + + public PBPreferences(int scriptID) { + this.scriptID = scriptID; + this.updateSettings(); + } + + private void updateSettings() { + properties = new Properties(); + try { + JSONObject result = (JSONObject) WebUtil.getJsonParser().parse( + WebUtil.getContents("http://bdn.parabot.org/api/v2/user/preferences/" + scriptID, + "apikey=" + manager.getAccount().getApi()) + ); + + JSONArray resultArray; + if ((resultArray = ((JSONArray) result.get("result"))) != null) { + for(Object rObject : resultArray) { + JSONObject resultObject = (JSONObject) rObject; + for (Object map : resultObject.entrySet()) { + Map.Entry pairs = (Map.Entry) map; + properties.put(pairs.getKey(), pairs.getValue()); + } + } + } + } catch (IOException | ParseException e) { + e.printStackTrace(); + } + } + + /** + * Change a setting + * @param key + * @param value + */ + public void adjustSettings(Object key, Object value) { + this.addSetting(key, value); + } + + /** + * Get a setting value + * @param key + * @return + */ + public Object getSetting(Object key){ + return this.properties.get(key); + } + + /** + * Get a setting value as string + * @param key + * @return + */ + public String getSetting(String key){ + return this.properties.getProperty(key); + } + + /** + * Remove a setting + * @param key + */ + public void removeSetting(Object key){ + try { + JSONObject result = (JSONObject) WebUtil.getJsonParser().parse( + WebUtil.getContents("http://bdn.parabot.org/api/v2/user/preferences/set/", + "apikey=" + manager.getAccount().getApi() + + "&key=" + URLEncoder.encode(String.valueOf(key), "UTF-8") + + "&script=" + String.valueOf(scriptID) + ) + ); + if ((boolean)result.get("result")){ + this.properties.remove(key); + } + } catch (ParseException | MalformedURLException | UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + /** + * Add a setting + * @param key + * @param value + */ + public void addSetting(Object key, Object value){ + try { + JSONObject result = (JSONObject) WebUtil.getJsonParser().parse( + WebUtil.getContents("http://bdn.parabot.org/api/v2/user/preferences/set/", + "apikey=" + manager.getAccount().getApi() + + "&key=" + URLEncoder.encode(String.valueOf(key), "UTF-8") + + "&value=" + URLEncoder.encode(String.valueOf(value), "UTF-8") + + "&script=" + String.valueOf(scriptID) + ) + ); + if ((boolean)result.get("result")){ + this.properties.put(key, value); + } + } catch (ParseException | MalformedURLException | UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + +} diff --git a/parabotv2/src/org/parabot/environment/scripts/Script.java b/parabotv2/src/org/parabot/environment/scripts/Script.java index 3545325..94bb146 100644 --- a/parabotv2/src/org/parabot/environment/scripts/Script.java +++ b/parabotv2/src/org/parabot/environment/scripts/Script.java @@ -4,6 +4,7 @@ import org.parabot.core.Context; import org.parabot.core.Core; import org.parabot.core.ui.BotUI; import org.parabot.core.ui.Logger; +import org.parabot.environment.api.utils.PBPreferences; import org.parabot.environment.api.utils.Time; import org.parabot.environment.scripts.framework.*; import org.parabot.environment.scripts.framework.Frameworks; @@ -12,9 +13,9 @@ import org.parabot.environment.scripts.randoms.Random; import java.util.Collection; /** - * + * * Script template, scripts are 'add-ons' which executes various tasks in-game - * + * * @author Everel * */ @@ -22,43 +23,45 @@ public class Script implements Runnable { public static final int TYPE_STRATEGY = 0; public static final int TYPE_LOOP = 1; public static final int TYPE_OTHER = 2; - + public static final int STATE_RUNNING = 0; public static final int STATE_PAUSE = 1; public static final int STATE_STOPPED = 2; - + private Collection strategies; + private PBPreferences preferences; private AbstractFramework frameWork; private int state; private int frameWorkType; - + private int scriptID; + public boolean onExecute() { return true; } - + public void onFinish() { - + } - + public final void provide(final Collection strategies) { this.strategies = strategies; } - + public final int getFrameWorkType() { return frameWorkType; } - + public final void setFrameWork(int frameWorkType) { if(frameWorkType < 0 || frameWorkType > 2) { throw new RuntimeException("Invalid framework type"); } this.frameWorkType = frameWorkType; } - + public final void setAbstractFrameWork(AbstractFramework f) { this.frameWork = f; } - + public final void addRandom(Random random) { Context.getInstance().getRandomHandler().addRandom(random); } @@ -70,7 +73,7 @@ public class Script implements Runnable { Core.verbose("Initializing script..."); context.getServerProvider().initScript(this); Core.verbose("Done."); - + if(!onExecute()) { Core.verbose("Script#onExecute returned false, unloading and stopping script..."); context.getServerProvider().unloadScript(this); @@ -78,7 +81,7 @@ public class Script implements Runnable { Core.verbose("Done."); return; } - + Core.verbose("Detecting script framework..."); context.setRunningScript(this); BotUI.getInstance().toggleRun(); @@ -101,7 +104,7 @@ public class Script implements Runnable { if(context.getRandomHandler().checkAndRun()) { continue; } - + if(this.state == STATE_PAUSE) { sleep(500); continue; @@ -128,12 +131,12 @@ public class Script implements Runnable { BotUI.getInstance().toggleRun(); Core.verbose("Done."); } - + /** * Sleeps until the SleepCondition is valid. - * + * * DEPRECATED! use {@link Time#sleep(SleepCondition, int)} - * + * * @param conn * the condition. * @param timeout @@ -144,7 +147,7 @@ public class Script implements Runnable { public final boolean sleep(SleepCondition conn, int timeout) { return Time.sleep(conn, timeout); } - + /** * Sets the script's state * @param state @@ -155,7 +158,7 @@ public class Script implements Runnable { } this.state = state; } - + /** * Sleeps for an amount of milliseconds * @param ms @@ -167,4 +170,15 @@ public class Script implements Runnable { public int getState() { return state; } + + public PBPreferences getPreferences(){ + if (this.preferences == null){ + this.preferences = new PBPreferences(scriptID); + } + return this.preferences; + } + + public void setScriptID(int scriptID){ + this.scriptID = scriptID; + } } diff --git a/parabotv2/src/org/parabot/environment/scripts/executers/BDNScriptsExecuter.java b/parabotv2/src/org/parabot/environment/scripts/executers/BDNScriptsExecuter.java index f56c01f..e29b450 100644 --- a/parabotv2/src/org/parabot/environment/scripts/executers/BDNScriptsExecuter.java +++ b/parabotv2/src/org/parabot/environment/scripts/executers/BDNScriptsExecuter.java @@ -74,6 +74,7 @@ public class BDNScriptsExecuter extends ScriptExecuter { final Class scriptClass = loader.loadClass(className); final Constructor con = scriptClass.getConstructor(); final Script script = (Script) con.newInstance(); + script.setScriptID(this.id); super.finalize(tg, script); if (manager.getAccount().getApi() != null) { diff --git a/parabotv2/src/org/parabot/environment/scripts/executers/LocalScriptExecuter.java b/parabotv2/src/org/parabot/environment/scripts/executers/LocalScriptExecuter.java index cca3021..4b071f4 100644 --- a/parabotv2/src/org/parabot/environment/scripts/executers/LocalScriptExecuter.java +++ b/parabotv2/src/org/parabot/environment/scripts/executers/LocalScriptExecuter.java @@ -1,9 +1,9 @@ package org.parabot.environment.scripts.executers; -import java.lang.reflect.Constructor; - import org.parabot.environment.scripts.Script; +import java.lang.reflect.Constructor; + /** * * Loads a locally stored script