package co.forsaken.projectindigo.managers; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.List; import java.util.Scanner; import javax.swing.SwingWorker; import co.forsaken.projectindigo.data.LoginEvents; import co.forsaken.projectindigo.data.log.Logger; import co.forsaken.projectindigo.exceptions.AuthenticationException; import co.forsaken.projectindigo.gui.LoginPanel; import co.forsaken.projectindigo.gui.MainPanel; import co.forsaken.projectindigo.gui.ProgressPanel; import co.forsaken.projectindigo.log.LogManager; import co.forsaken.projectindigo.session.Account; import co.forsaken.projectindigo.session.Identity; import co.forsaken.projectindigo.session.YggdrasilSession; public class LoginHandler extends SwingWorker<String, Void> { private MainPanel _mainPanel; private String _username; private String _password; private boolean _savePassword; private Account account; public LoginHandler(MainPanel mainPanel, String username, String password, boolean savePassword) { _mainPanel = mainPanel; _username = username; _password = password; _savePassword = savePassword; account = new Account(username); account.setPassword(password); } @Override protected String doInBackground() { _mainPanel.switchPage(-1); try { ((ProgressPanel) _mainPanel.getPanel(-1)).stateChanged("Logging in as " + _username, "", 33); Identity result = doLogin(); ((ProgressPanel) _mainPanel.getPanel(-1)).stateChanged("Reading response", "", 99); ((ProgressPanel) _mainPanel.getPanel(-1)).stateChanged("Logged in", "", 100); LogManager.info("Login successful, Starting minecraft"); ((LoginPanel) _mainPanel.getPanel(0)).getUserManager().clear(); if (_savePassword) { ((LoginPanel) _mainPanel.getPanel(0)).getUserManager().saveUsername(_username, result.getId(), _password); } ((LoginPanel) _mainPanel.getPanel(0)).getUserManager().writeUsernameList(); ((LoginPanel) _mainPanel.getPanel(0)).setResponse(result); ((LoginPanel) _mainPanel.getPanel(0)).onEvent(LoginEvents.LAUNCH); } catch (AuthenticationException e) { ((LoginPanel) _mainPanel.getPanel(0)).onEvent(LoginEvents.AUTH_ERROR, e.getLocalizedMessage()); } catch (UnsupportedEncodingException e) { Logger.logError(e.getMessage(), e); this.cancel(true); } catch (Exception e) { Logger.logError(e.getMessage(), e); } return ""; } public Identity doLogin() throws AuthenticationException, InterruptedException, IOException { YggdrasilSession session = new YggdrasilSession(_username); session.setPassword(_password); session.verify(); List<Identity> identities = session.getIdentities(); if (identities.size() > 0) { account.setIdentities(identities); return identities.get(0); } else { throw new AuthenticationException("Account doesn't own Minecraft", "You do not have a premium account"); } } private String getString(URL url) throws IOException { Scanner scanner = new Scanner(url.openStream()).useDelimiter("\\A"); return scanner.hasNext() ? scanner.next() : ""; } }