package com.faforever.client.login; import com.faforever.client.preferences.LoginPrefs; import com.faforever.client.preferences.PreferencesService; import com.faforever.client.user.UserService; import com.google.common.base.Strings; import com.google.common.hash.Hashing; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.Pane; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Resource; import java.lang.invoke.MethodHandles; import static com.google.common.base.Strings.isNullOrEmpty; import static java.nio.charset.StandardCharsets.UTF_8; public class LoginController { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @FXML Pane loginFormPane; @FXML Pane loginProgressPane; @FXML CheckBox autoLoginCheckBox; @FXML TextField usernameInput; @FXML TextField passwordInput; @FXML Button loginButton; @FXML Label loginErrorLabel; @FXML Pane loginRoot; @Resource UserService userService; @Resource PreferencesService preferencesService; private boolean autoLogin; @FXML private void initialize() { loginProgressPane.setVisible(false); loginErrorLabel.managedProperty().bind(loginErrorLabel.visibleProperty()); autoLogin = true; } public void display() { setShowLoginProgress(false); LoginPrefs loginPrefs = preferencesService.getPreferences().getLogin(); String username = loginPrefs.getUsername(); String password = loginPrefs.getPassword(); boolean isAutoLogin = loginPrefs.getAutoLogin(); // Fill the form even if autoLogin is true, since user may cancel the login usernameInput.setText(Strings.nullToEmpty(username)); autoLoginCheckBox.setSelected(isAutoLogin); if (loginPrefs.getAutoLogin() && !isNullOrEmpty(username) && !isNullOrEmpty(password) && autoLogin) { autoLogin = false; login(username, password, true); } else if (isNullOrEmpty(username)) { usernameInput.requestFocus(); } else { passwordInput.requestFocus(); } } private void setShowLoginProgress(boolean show) { loginFormPane.setVisible(!show); loginProgressPane.setVisible(show); loginButton.setDisable(show); loginErrorLabel.setVisible(false); } private void login(String username, String password, boolean autoLogin) { setShowLoginProgress(true); userService.login(username, password, autoLogin) .exceptionally(throwable -> { onLoginFailed(throwable); return null; }); } private void onLoginFailed(Throwable e) { logger.warn("Login failed", e); Platform.runLater(() -> { loginErrorLabel.setText(e.getCause().getLocalizedMessage()); setShowLoginProgress(false); loginErrorLabel.setVisible(true); }); } @FXML void loginButtonClicked() { String username = usernameInput.getText(); String password = passwordInput.getText(); password = Hashing.sha256().hashString(password, UTF_8).toString(); boolean autoLogin = autoLoginCheckBox.isSelected(); login(username, password, autoLogin); } @FXML public void onCancelLoginButtonClicked() { userService.cancelLogin(); setShowLoginProgress(false); } public Pane getRoot() { return loginRoot; } }