mirror of
https://github.com/SKCraft/Launcher.git
synced 2025-01-08 19:38:58 +01:00
Automatically show login dialog when session expires
Previously it just gave an unhelpful error message; now it pops up the login dialog again. Also, the duplicated accounts bug should be fixed!
This commit is contained in:
parent
f23d387609
commit
b7be91bc9c
@ -7,11 +7,14 @@
|
|||||||
package com.skcraft.launcher.auth;
|
package com.skcraft.launcher.auth;
|
||||||
|
|
||||||
import com.skcraft.launcher.LauncherException;
|
import com.skcraft.launcher.LauncherException;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thrown on authentication error.
|
* Thrown on authentication error.
|
||||||
*/
|
*/
|
||||||
public class AuthenticationException extends LauncherException {
|
public class AuthenticationException extends LauncherException {
|
||||||
|
@Getter
|
||||||
|
private boolean invalidatedSession = false;
|
||||||
|
|
||||||
public AuthenticationException(String message, String localizedMessage) {
|
public AuthenticationException(String message, String localizedMessage) {
|
||||||
super(message, localizedMessage);
|
super(message, localizedMessage);
|
||||||
@ -21,6 +24,11 @@ public class AuthenticationException extends LauncherException {
|
|||||||
super(message, message);
|
super(message, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AuthenticationException(String message, boolean invalidatedSession) {
|
||||||
|
super(message, message);
|
||||||
|
this.invalidatedSession = invalidatedSession;
|
||||||
|
}
|
||||||
|
|
||||||
public AuthenticationException(Throwable cause, String localizedMessage) {
|
public AuthenticationException(Throwable cause, String localizedMessage) {
|
||||||
super(cause, localizedMessage);
|
super(cause, localizedMessage);
|
||||||
}
|
}
|
||||||
|
@ -54,11 +54,13 @@ public class YggdrasilLoginService implements LoginService {
|
|||||||
if (req.getResponseCode() != 200) {
|
if (req.getResponseCode() != 200) {
|
||||||
ErrorResponse error = req.returnContent().asJson(ErrorResponse.class);
|
ErrorResponse error = req.returnContent().asJson(ErrorResponse.class);
|
||||||
|
|
||||||
throw new AuthenticationException(error.getErrorMessage());
|
throw new AuthenticationException(error.getErrorMessage(), true);
|
||||||
} else {
|
} else {
|
||||||
AuthenticateResponse response = req.returnContent().asJson(AuthenticateResponse.class);
|
AuthenticateResponse response = req.returnContent().asJson(AuthenticateResponse.class);
|
||||||
Profile profile = response.getSelectedProfile();
|
Profile profile = response.getSelectedProfile();
|
||||||
|
|
||||||
|
if (profile == null) return null; // Minecraft not owned
|
||||||
|
|
||||||
if (previous != null && previous.getAvatarImage() != null) {
|
if (previous != null && previous.getAvatarImage() != null) {
|
||||||
profile.setAvatarImage(previous.getAvatarImage());
|
profile.setAvatarImage(previous.getAvatarImage());
|
||||||
} else {
|
} else {
|
||||||
|
@ -7,10 +7,7 @@ import com.skcraft.concurrency.ObservableFuture;
|
|||||||
import com.skcraft.concurrency.ProgressObservable;
|
import com.skcraft.concurrency.ProgressObservable;
|
||||||
import com.skcraft.concurrency.SettableProgress;
|
import com.skcraft.concurrency.SettableProgress;
|
||||||
import com.skcraft.launcher.Launcher;
|
import com.skcraft.launcher.Launcher;
|
||||||
import com.skcraft.launcher.auth.LoginService;
|
import com.skcraft.launcher.auth.*;
|
||||||
import com.skcraft.launcher.auth.OfflineSession;
|
|
||||||
import com.skcraft.launcher.auth.SavedSession;
|
|
||||||
import com.skcraft.launcher.auth.Session;
|
|
||||||
import com.skcraft.launcher.persistence.Persistence;
|
import com.skcraft.launcher.persistence.Persistence;
|
||||||
import com.skcraft.launcher.swing.LinedBoxPanel;
|
import com.skcraft.launcher.swing.LinedBoxPanel;
|
||||||
import com.skcraft.launcher.swing.SwingHelper;
|
import com.skcraft.launcher.swing.SwingHelper;
|
||||||
@ -100,7 +97,7 @@ public class AccountSelectDialog extends JDialog {
|
|||||||
Session newSession = LoginDialog.showLoginRequest(this, launcher);
|
Session newSession = LoginDialog.showLoginRequest(this, launcher);
|
||||||
|
|
||||||
if (newSession != null) {
|
if (newSession != null) {
|
||||||
launcher.getAccounts().add(newSession.toSavedSession());
|
launcher.getAccounts().update(newSession.toSavedSession());
|
||||||
setResult(newSession);
|
setResult(newSession);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -157,7 +154,7 @@ public class AccountSelectDialog extends JDialog {
|
|||||||
progress.set(SharedLocale.tr("login.loggingInStatus"), -1));
|
progress.set(SharedLocale.tr("login.loggingInStatus"), -1));
|
||||||
|
|
||||||
if (newSession != null) {
|
if (newSession != null) {
|
||||||
launcher.getAccounts().add(newSession.toSavedSession());
|
launcher.getAccounts().update(newSession.toSavedSession());
|
||||||
setResult(newSession);
|
setResult(newSession);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,13 +181,22 @@ public class AccountSelectDialog extends JDialog {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(Throwable t) {
|
public void onFailure(Throwable t) {
|
||||||
t.printStackTrace();
|
if (t instanceof AuthenticationException) {
|
||||||
|
if (((AuthenticationException) t).isInvalidatedSession()) {
|
||||||
|
// Just need to log in again
|
||||||
|
LoginDialog.ReloginDetails details = new LoginDialog.ReloginDetails(session.getUsername(), t.getLocalizedMessage());
|
||||||
|
Session newSession = LoginDialog.showLoginRequest(AccountSelectDialog.this, launcher, details);
|
||||||
|
|
||||||
|
setResult(newSession);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SwingHelper.showErrorDialog(AccountSelectDialog.this, t.getLocalizedMessage(), SharedLocale.tr("errorTitle"), t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}, SwingExecutor.INSTANCE);
|
}, SwingExecutor.INSTANCE);
|
||||||
|
|
||||||
ProgressDialog.showProgress(this, future, SharedLocale.tr("login.loggingInTitle"),
|
ProgressDialog.showProgress(this, future, SharedLocale.tr("login.loggingInTitle"),
|
||||||
SharedLocale.tr("login.loggingInStatus"));
|
SharedLocale.tr("login.loggingInStatus"));
|
||||||
SwingHelper.addErrorDialogCallback(this, future);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@ -19,6 +19,7 @@ import com.skcraft.launcher.persistence.Persistence;
|
|||||||
import com.skcraft.launcher.swing.*;
|
import com.skcraft.launcher.swing.*;
|
||||||
import com.skcraft.launcher.util.SharedLocale;
|
import com.skcraft.launcher.util.SharedLocale;
|
||||||
import com.skcraft.launcher.util.SwingExecutor;
|
import com.skcraft.launcher.util.SwingExecutor;
|
||||||
|
import lombok.Data;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -28,6 +29,7 @@ import java.awt.*;
|
|||||||
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowAdapter;
|
||||||
import java.awt.event.WindowEvent;
|
import java.awt.event.WindowEvent;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,6 +40,7 @@ public class LoginDialog extends JDialog {
|
|||||||
private final Launcher launcher;
|
private final Launcher launcher;
|
||||||
@Getter private Session session;
|
@Getter private Session session;
|
||||||
|
|
||||||
|
private final JLabel message = new JLabel(SharedLocale.tr("login.defaultMessage"));
|
||||||
private final JTextField usernameText = new JTextField();
|
private final JTextField usernameText = new JTextField();
|
||||||
private final JPasswordField passwordText = new JPasswordField();
|
private final JPasswordField passwordText = new JPasswordField();
|
||||||
private final JButton loginButton = new JButton(SharedLocale.tr("login.login"));
|
private final JButton loginButton = new JButton(SharedLocale.tr("login.login"));
|
||||||
@ -52,7 +55,7 @@ public class LoginDialog extends JDialog {
|
|||||||
* @param owner the owner
|
* @param owner the owner
|
||||||
* @param launcher the launcher
|
* @param launcher the launcher
|
||||||
*/
|
*/
|
||||||
public LoginDialog(Window owner, @NonNull Launcher launcher) {
|
public LoginDialog(Window owner, @NonNull Launcher launcher, Optional<ReloginDetails> reloginDetails) {
|
||||||
super(owner, ModalityType.DOCUMENT_MODAL);
|
super(owner, ModalityType.DOCUMENT_MODAL);
|
||||||
|
|
||||||
this.launcher = launcher;
|
this.launcher = launcher;
|
||||||
@ -72,6 +75,8 @@ public class LoginDialog extends JDialog {
|
|||||||
dispose();
|
dispose();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
reloginDetails.ifPresent(details -> message.setText(details.message));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@ -80,6 +85,7 @@ public class LoginDialog extends JDialog {
|
|||||||
|
|
||||||
loginButton.setFont(loginButton.getFont().deriveFont(Font.BOLD));
|
loginButton.setFont(loginButton.getFont().deriveFont(Font.BOLD));
|
||||||
|
|
||||||
|
formPanel.addRow(message);
|
||||||
formPanel.addRow(new JLabel(SharedLocale.tr("login.idEmail")), usernameText);
|
formPanel.addRow(new JLabel(SharedLocale.tr("login.idEmail")), usernameText);
|
||||||
formPanel.addRow(new JLabel(SharedLocale.tr("login.password")), passwordText);
|
formPanel.addRow(new JLabel(SharedLocale.tr("login.password")), passwordText);
|
||||||
buttonsPanel.setBorder(BorderFactory.createEmptyBorder(26, 13, 13, 13));
|
buttonsPanel.setBorder(BorderFactory.createEmptyBorder(26, 13, 13, 13));
|
||||||
@ -144,7 +150,11 @@ public class LoginDialog extends JDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Session showLoginRequest(Window owner, Launcher launcher) {
|
public static Session showLoginRequest(Window owner, Launcher launcher) {
|
||||||
LoginDialog dialog = new LoginDialog(owner, launcher);
|
return showLoginRequest(owner, launcher, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Session showLoginRequest(Window owner, Launcher launcher, ReloginDetails reloginDetails) {
|
||||||
|
LoginDialog dialog = new LoginDialog(owner, launcher, Optional.ofNullable(reloginDetails));
|
||||||
dialog.setVisible(true);
|
dialog.setVisible(true);
|
||||||
return dialog.getSession();
|
return dialog.getSession();
|
||||||
}
|
}
|
||||||
@ -186,4 +196,9 @@ public class LoginDialog extends JDialog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class ReloginDetails {
|
||||||
|
private final String username;
|
||||||
|
private final String message;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,7 @@ login.login=Login...
|
|||||||
login.recoverAccount=Forgot your login?
|
login.recoverAccount=Forgot your login?
|
||||||
login.playOffline=Play offline
|
login.playOffline=Play offline
|
||||||
login.title=Minecraft Login
|
login.title=Minecraft Login
|
||||||
|
login.defaultMessage=Log in with your Mojang account
|
||||||
login.idEmail=ID/Email\:
|
login.idEmail=ID/Email\:
|
||||||
login.password=Password\:
|
login.password=Password\:
|
||||||
login.noPasswordError=Please enter a password.
|
login.noPasswordError=Please enter a password.
|
||||||
|
Loading…
Reference in New Issue
Block a user