Accept email address automatically

When we do Gerrit development work we start by creating a "gerrit
test site". During test site initialization, normally we select
"DEVELOPMENT_BECOME_ANY_ACCOUNT" mode. However, to setup test user
accounts we need to register users. For every test-user we add
to the test site, Gerrit wants to send a confirmation email which
we need to receive and then click the link in it.
This change will enable Gerrit accept email address automatically
in "DEVELOPMENT_BECOME_ANY_ACCOUNT" mode.

Change-Id: Iec6f34e0ecd335b04ef5bf1a5d61c8a906cfd19f
This commit is contained in:
Bruce Zu
2011-06-17 20:08:26 +08:00
committed by Gustaf Lundh
parent f8d35d7312
commit 7bde919f9c
5 changed files with 78 additions and 42 deletions

View File

@@ -72,7 +72,7 @@ public interface AccountSecurity extends RemoteJsonService {
AsyncCallback<VoidResult> callback); AsyncCallback<VoidResult> callback);
@SignInRequired @SignInRequired
void registerEmail(String address, AsyncCallback<VoidResult> callback); void registerEmail(String address, AsyncCallback<Account> callback);
@SignInRequired @SignInRequired
void validateEmail(String token, AsyncCallback<VoidResult> callback); void validateEmail(String token, AsyncCallback<VoidResult> callback);

View File

@@ -57,6 +57,7 @@ public interface AccountConstants extends Constants {
String buttonClearPassword(); String buttonClearPassword();
String buttonGeneratePassword(); String buttonGeneratePassword();
String invalidUserName(); String invalidUserName();
String invalidUserEmail();
String sshKeyInvalid(); String sshKeyInvalid();
String sshKeyAlgorithm(); String sshKeyAlgorithm();

View File

@@ -38,7 +38,7 @@ buttonChangeUserName = Change Username
buttonClearPassword = Clear Password buttonClearPassword = Clear Password
buttonGeneratePassword = Generate Password buttonGeneratePassword = Generate Password
invalidUserName = Username must contain only letters, numbers, _, - or . invalidUserName = Username must contain only letters, numbers, _, - or .
invalidUserEmail = Email format is wrong.
sshKeyInvalid = Invalid Key sshKeyInvalid = Invalid Key
sshKeyAlgorithm = Algorithm sshKeyAlgorithm = Algorithm
sshKeyKey = Key sshKeyKey = Key

View File

@@ -14,6 +14,7 @@
package com.google.gerrit.client.account; package com.google.gerrit.client.account;
import com.google.gerrit.client.ErrorDialog;
import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.Gerrit;
import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.OnEditEnabler; import com.google.gerrit.client.ui.OnEditEnabler;
@@ -21,6 +22,7 @@ import com.google.gerrit.reviewdb.Account;
import com.google.gerrit.reviewdb.AccountExternalId; import com.google.gerrit.reviewdb.AccountExternalId;
import com.google.gerrit.reviewdb.ContactInformation; import com.google.gerrit.reviewdb.ContactInformation;
import com.google.gerrit.reviewdb.Account.FieldName; import com.google.gerrit.reviewdb.Account.FieldName;
import com.google.gerrit.reviewdb.AuthType;
import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickEvent;
@@ -38,7 +40,6 @@ import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FormPanel.SubmitEvent; import com.google.gwt.user.client.ui.FormPanel.SubmitEvent;
import com.google.gwtexpui.globalkey.client.NpTextBox; import com.google.gwtexpui.globalkey.client.NpTextBox;
import com.google.gwtexpui.user.client.AutoCenterDialogBox; import com.google.gwtexpui.user.client.AutoCenterDialogBox;
import com.google.gwtjsonrpc.client.VoidResult;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -205,30 +206,7 @@ class ContactPanelShort extends Composite {
private void postLoad() { private void postLoad() {
if (haveAccount && haveEmails) { if (haveAccount && haveEmails) {
if (currentEmail != null) { updateEmailList();
boolean found = false;
for (int i = 0; i < emailPick.getItemCount(); i++) {
if (currentEmail.equals(emailPick.getValue(i))) {
emailPick.setSelectedIndex(i);
found = true;
break;
}
}
if (!found) {
emailPick.addItem(currentEmail);
emailPick.setSelectedIndex(emailPick.getItemCount() - 1);
}
}
if (emailPick.getItemCount() > 0) {
emailPick.setVisible(true);
emailPick.setEnabled(true);
if (canRegisterNewEmail()) {
final String t = Util.C.buttonOpenRegisterNewEmail();
emailPick.addItem("... " + t + " ", t);
}
} else {
emailPick.setVisible(false);
}
registerNewEmail.setEnabled(true); registerNewEmail.setEnabled(true);
} }
display(); display();
@@ -270,14 +248,24 @@ class ContactPanelShort extends Composite {
event.cancel(); event.cancel();
final String addr = inEmail.getText().trim(); final String addr = inEmail.getText().trim();
if (!addr.contains("@")) { if (!addr.contains("@")) {
new ErrorDialog(Util.C.invalidUserEmail()).center();
return; return;
} }
inEmail.setEnabled(false); inEmail.setEnabled(false);
register.setEnabled(false); register.setEnabled(false);
Util.ACCOUNT_SEC.registerEmail(addr, new GerritCallback<VoidResult>() { Util.ACCOUNT_SEC.registerEmail(addr, new GerritCallback<Account>() {
public void onSuccess(VoidResult result) { public void onSuccess(Account currentUser) {
box.hide(); box.hide();
if (Gerrit.getConfig().getAuthType() == AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) {
currentEmail = addr;
if (emailPick.getItemCount() == 0) {
onSaveSuccess(currentUser);
} else {
save.setEnabled(true);
}
updateEmailList();
}
} }
@Override @Override
@@ -309,7 +297,9 @@ class ContactPanelShort extends Composite {
buttons.add(register); buttons.add(register);
buttons.add(cancel); buttons.add(cancel);
body.add(new HTML(Util.C.descRegisterNewEmail())); if (Gerrit.getConfig().getAuthType() != AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) {
body.add(new HTML(Util.C.descRegisterNewEmail()));
}
body.add(inEmail); body.add(inEmail);
body.add(buttons); body.add(buttons);
@@ -367,4 +357,39 @@ class ContactPanelShort extends Composite {
ContactInformation toContactInformation() { ContactInformation toContactInformation() {
return null; return null;
} }
private int emailListIndexOf(String value) {
for (int i = 0; i < emailPick.getItemCount(); i++) {
if (value.equalsIgnoreCase(emailPick.getValue(i))) {
return i;
}
}
return -1;
}
private void updateEmailList() {
if (currentEmail != null) {
int index = emailListIndexOf(currentEmail);
if (index == -1) {
emailPick.addItem(currentEmail);
emailPick.setSelectedIndex(emailPick.getItemCount() - 1);
} else {
emailPick.setSelectedIndex(index);
}
}
if (emailPick.getItemCount() > 0) {
emailPick.setVisible(true);
emailPick.setEnabled(true);
if (canRegisterNewEmail()) {
final String t = Util.C.buttonOpenRegisterNewEmail();
int index = emailListIndexOf(t);
if (index != -1) {
emailPick.removeItem(index);
}
emailPick.addItem("... " + t + " ", t);
}
} else {
emailPick.setVisible(false);
}
}
} }

View File

@@ -26,6 +26,7 @@ import com.google.gerrit.reviewdb.AccountAgreement;
import com.google.gerrit.reviewdb.AccountExternalId; import com.google.gerrit.reviewdb.AccountExternalId;
import com.google.gerrit.reviewdb.AccountGroup; import com.google.gerrit.reviewdb.AccountGroup;
import com.google.gerrit.reviewdb.AccountSshKey; import com.google.gerrit.reviewdb.AccountSshKey;
import com.google.gerrit.reviewdb.AuthType;
import com.google.gerrit.reviewdb.ContactInformation; import com.google.gerrit.reviewdb.ContactInformation;
import com.google.gerrit.reviewdb.ContributorAgreement; import com.google.gerrit.reviewdb.ContributorAgreement;
import com.google.gerrit.reviewdb.ReviewDb; import com.google.gerrit.reviewdb.ReviewDb;
@@ -270,18 +271,27 @@ class AccountSecurityImpl extends BaseServiceImplementation implements
} }
public void registerEmail(final String address, public void registerEmail(final String address,
final AsyncCallback<VoidResult> cb) { final AsyncCallback<Account> cb) {
try { if (authConfig.getAuthType() == AuthType.DEVELOPMENT_BECOME_ANY_ACCOUNT) {
final RegisterNewEmailSender sender; try {
sender = registerNewEmailFactory.create(address); accountManager.link(user.get().getAccountId(),
sender.send(); AuthRequest.forEmail(address));
cb.onSuccess(VoidResult.INSTANCE); cb.onSuccess(user.get().getAccount());
} catch (EmailException e) { } catch (AccountException e) {
log.error("Cannot send email verification message to " + address, e); cb.onFailure(e);
cb.onFailure(e); }
} catch (RuntimeException e) { } else {
log.error("Cannot send email verification message to " + address, e); try {
cb.onFailure(e); final RegisterNewEmailSender sender;
sender = registerNewEmailFactory.create(address);
sender.send();
} catch (EmailException e) {
log.error("Cannot send email verification message to " + address, e);
cb.onFailure(e);
} catch (RuntimeException e) {
log.error("Cannot send email verification message to " + address, e);
cb.onFailure(e);
}
} }
} }