diff --git a/.gitattributes b/.gitattributes index 3168d97ff22..9f814af0113 100644 --- a/.gitattributes +++ b/.gitattributes @@ -916,6 +916,7 @@ forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletCont forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletLoad.java -text forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/VSubmenuGauntletQuick.java -text forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java -text +forge-gui-desktop/src/main/java/forge/screens/home/online/LoginDialog.java -text forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java -text forge-gui-desktop/src/main/java/forge/screens/home/package-info.java -text forge-gui-desktop/src/main/java/forge/screens/home/quest/CSubmenuChallenges.java -text @@ -17212,4 +17213,7 @@ forge-net/src/main/java/forge/net/protocol/toserver/EchoPacketSrv.java -text forge-net/src/main/java/forge/net/protocol/toserver/IPacketSrv.java -text forge-net/src/main/java/forge/net/protocol/toserver/IncorrectPacketSrv.java -text forge-net/src/main/java/forge/net/protocol/toserver/package-info.java -text +forge-net/src/main/java/forge/server/ServerUtil.java -text +forge-net/src/main/php/login.php -text +forge-net/src/main/php/logout.php -text /pom.xml svneol=native#text/xml diff --git a/forge-core/src/main/java/forge/util/Base64Coder.java b/forge-core/src/main/java/forge/util/Base64Coder.java index e641ffef940..2c88603dedc 100644 --- a/forge-core/src/main/java/forge/util/Base64Coder.java +++ b/forge-core/src/main/java/forge/util/Base64Coder.java @@ -31,6 +31,12 @@ package forge.util; +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; + /** * A Base64 encoder/decoder. *
@@ -360,6 +366,28 @@ public final class Base64Coder { return out; } + private static final char[] PASSWORD = "enfldsgbnlsngdlksdsgm".toCharArray(); + private static final byte[] SALT = { + (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, + (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, + }; + + public static String encrypt(String value) throws Exception { + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); + SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); + Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); + pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); + return String.valueOf(encode(pbeCipher.doFinal(value.getBytes("UTF-8")))); + } + + public static String decrypt(String value) throws Exception { + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); + SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); + Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); + pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); + return new String(pbeCipher.doFinal(decode(value)), "UTF-8"); + } + // Dummy constructor. /** *
@@ -368,5 +396,4 @@ public final class Base64Coder {
*/
private Base64Coder() {
}
-
} // end class Base64Coder
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java
index 8c0156ae4c7..82389e2eb02 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java
@@ -22,7 +22,7 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
-
+ LoginDialog.login();
}
});
}
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/LoginDialog.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/LoginDialog.java
new file mode 100644
index 00000000000..2071ce47b93
--- /dev/null
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/LoginDialog.java
@@ -0,0 +1,120 @@
+package forge.screens.home.online;
+
+import java.awt.Dimension;
+
+import javax.swing.JPanel;
+
+import net.miginfocom.swing.MigLayout;
+import forge.UiCommand;
+import forge.error.BugReporter;
+import forge.model.FModel;
+import forge.properties.ForgePreferences.FPref;
+import forge.server.ServerUtil;
+import forge.toolbox.FButton;
+import forge.toolbox.FCheckBox;
+import forge.toolbox.FLabel;
+import forge.toolbox.FOptionPane;
+import forge.toolbox.FPasswordField;
+import forge.toolbox.FTextField;
+import forge.view.FDialog;
+
+@SuppressWarnings("serial")
+public class LoginDialog extends FDialog {
+ private final FLabel lblUsername = new FLabel.Builder().text("Username:").build();
+ private final FTextField txtUsername = new FTextField.Builder().build();
+ private final FLabel lblPassword = new FLabel.Builder().text("Password:").build();
+ private final FPasswordField txtPassword = new FPasswordField();
+ private final FCheckBox cbRememberMe = new FCheckBox("Remember Me");
+ private final FButton btnLogin = new FButton("Login");
+ private final FButton btnCancel = new FButton("Cancel");
+
+ public static boolean login() {
+ String username = FModel.getPreferences().getPref(FPref.ONLINE_USERNAME);
+ String password = FModel.getPreferences().getPref(FPref.ONLINE_PASSWORD);
+ if (!username.isEmpty() && !password.isEmpty()) {
+ try {
+ if (ServerUtil.login(username, password)) {
+ return true; //avoid showing dialog if able to login with saved username/password
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ FModel.getPreferences().setPref(FPref.ONLINE_PASSWORD, ""); //clear password if login failed
+ FModel.getPreferences().save();
+ }
+
+ LoginDialog dialog = new LoginDialog(username);
+ dialog.setVisible(true);
+ dialog.dispose();
+ return dialog.result;
+ }
+
+ private boolean result = false;
+
+ private LoginDialog(String username) {
+ setTitle("Login");
+
+ txtUsername.setText(username);
+
+ btnLogin.setCommand(new UiCommand() {
+ @Override
+ public void run() {
+ String username = txtUsername.getText();
+ if (username.isEmpty()) {
+ FOptionPane.showErrorDialog("You must enter a username", "Login Failed");
+ txtUsername.requestFocusInWindow();
+ return;
+ }
+ char[] password = txtPassword.getPassword();
+ if (password == null || password.length == 0) {
+ FOptionPane.showErrorDialog("You must enter a password", "Login Failed");
+ txtPassword.requestFocusInWindow();
+ return;
+ }
+ try {
+ String passwordStr = String.valueOf(password);
+ if (ServerUtil.login(username, passwordStr)) {
+ FModel.getPreferences().setPref(FPref.ONLINE_USERNAME, username);
+ FModel.getPreferences().setPref(FPref.ONLINE_PASSWORD, cbRememberMe.isSelected() ? passwordStr : "");
+ FModel.getPreferences().save();
+ setVisible(false);
+ return;
+ }
+ FOptionPane.showErrorDialog("Could not login with entered username and password.", "Login Failed");
+ txtUsername.requestFocusInWindow();
+ }
+ catch (Exception e) {
+ BugReporter.reportException(e, "Login Failed");
+ }
+ }
+ });
+ btnCancel.setCommand(new UiCommand() {
+ @Override
+ public void run() {
+ setVisible(false);
+ }
+ });
+
+ final int width = 330;
+ final int height = 180;
+ setPreferredSize(new Dimension(width, height));
+ setSize(width, height);
+
+ JPanel pnlContent = new JPanel(new MigLayout("gap 6, insets 0"));
+ pnlContent.setOpaque(false);
+ pnlContent.add(lblUsername);
+ pnlContent.add(txtUsername, "growx, pushx, wrap");
+ pnlContent.add(lblPassword);
+ pnlContent.add(txtPassword, "growx, pushx, wrap");
+
+ add(pnlContent, "pushx, growx, wrap, span 2");
+ add(cbRememberMe, "pushx, growx, wrap");
+ add(btnLogin, "w 150px!, h 30px!, gapright 6px");
+ add(btnCancel, "w 150px!, h 30px!");
+
+ if (!username.isEmpty()) {
+ setDefaultFocus(txtPassword);
+ }
+ }
+}
diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java
index 355a52c0d95..2bfddda1f82 100644
--- a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java
+++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java
@@ -26,11 +26,12 @@ public enum VSubmenuOnlineLobby implements IVSubmenu