blob: 3463640c4b4cff6acb717e358d0a8855de2ec4d6 [file] [log] [blame]
// Copyright (C) 2009 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.client.auth.userpass;
import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.SignInDialog;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.SmallHeading;
import com.google.gerrit.common.PageLinks;
import com.google.gerrit.common.auth.SignInMode;
import com.google.gerrit.common.auth.userpass.LoginResult;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.InlineLabel;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwtexpui.globalkey.client.GlobalKey;
import com.google.gwtexpui.globalkey.client.NpTextBox;
public class UserPassSignInDialog extends SignInDialog {
static {
UserPassResources.I.css().ensureInjected();
}
private final FlowPanel formBody;
private FlowPanel errorLine;
private InlineLabel errorMsg;
private Button login;
private Button close;
private TextBox username;
private TextBox password;
public UserPassSignInDialog(final String token, final String initialErrorMsg) {
super(SignInMode.SIGN_IN, token);
setAutoHideEnabled(false);
formBody = new FlowPanel();
formBody.setStyleName(UserPassResources.I.css().loginForm());
add(formBody);
createHeaderText();
createErrorBox();
createUsernameBox();
if (initialErrorMsg != null) {
showError(initialErrorMsg);
}
}
@Override
public void show() {
super.show();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
username.setFocus(true);
}
});
}
private void createHeaderText() {
final FlowPanel headerText = new FlowPanel();
final SmallHeading headerLabel = new SmallHeading();
headerLabel.setText(Util.M.signInAt(Location.getHostName()));
headerText.add(headerLabel);
formBody.add(headerText);
}
private void createErrorBox() {
errorLine = new FlowPanel();
DOM.setStyleAttribute(errorLine.getElement(), "visibility", "hidden");
errorLine.setStyleName(UserPassResources.I.css().error());
errorMsg = new InlineLabel();
errorLine.add(errorMsg);
formBody.add(errorLine);
}
private void showError(final String msgText) {
errorMsg.setText(msgText);
DOM.setStyleAttribute(errorLine.getElement(), "visibility", "");
}
private void hideError() {
DOM.setStyleAttribute(errorLine.getElement(), "visibility", "hidden");
}
private void createUsernameBox() {
username = new NpTextBox();
username.setVisibleLength(25);
username.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(final KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
event.preventDefault();
password.selectAll();
password.setFocus(true);
}
}
});
password = new PasswordTextBox();
password.setVisibleLength(25);
password.addKeyPressHandler(GlobalKey.STOP_PROPAGATION);
password.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(final KeyPressEvent event) {
if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
event.preventDefault();
onLogin();
}
}
});
final FlowPanel buttons = new FlowPanel();
buttons.setStyleName(Gerrit.RESOURCES.css().errorDialogButtons());
login = new Button();
login.setText(Util.C.buttonSignIn());
login.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
onLogin();
}
});
buttons.add(login);
close = new Button();
DOM.setStyleAttribute(close.getElement(), "marginLeft", "45px");
close.setText(Gerrit.C.signInDialogClose());
close.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
buttons.add(close);
final Grid formGrid = new Grid(3, 2);
formGrid.setText(0, 0, Util.C.username());
formGrid.setText(1, 0, Util.C.password());
formGrid.setWidget(0, 1, username);
formGrid.setWidget(1, 1, password);
formGrid.setWidget(2, 1, buttons);
formBody.add(formGrid);
username.setTabIndex(1);
password.setTabIndex(2);
login.setTabIndex(3);
close.setTabIndex(4);
}
private void enable(final boolean on) {
username.setEnabled(on);
password.setEnabled(on);
login.setEnabled(on);
}
private void onLogin() {
hideError();
final String user = username.getText();
if (user == null || user.equals("")) {
showError(Util.C.usernameRequired());
username.setFocus(true);
return;
}
final String pass = password.getText();
if (pass == null || pass.equals("")) {
showError(Util.C.passwordRequired());
password.setFocus(true);
return;
}
enable(false);
Util.SVC.authenticate(user, pass, new GerritCallback<LoginResult>() {
public void onSuccess(final LoginResult result) {
if (result.success) {
String to = token;
if (!to.startsWith("/")) {
to = "/" + to;
}
if (result.isNew && !token.startsWith(PageLinks.REGISTER + "/")) {
to = PageLinks.REGISTER + to;
}
Location.replace(Location.getPath() + "login" + to);
} else {
final String message;
switch (result.getError()) {
case AUTHENTICATION_UNAVAILABLE:
message = Util.M.authenticationUnavailable(result.getAuthType());
break;
case INVALID_LOGIN:
default:
message = Util.C.invalidLogin();
}
showError(message);
enable(true);
password.selectAll();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
password.setFocus(true);
}
});
}
}
@Override
public void onFailure(final Throwable caught) {
super.onFailure(caught);
enable(true);
}
});
}
}