Use REST endpoints in set-account command to add/delete email addresses

This also fixes the bug in the set-account SSH command that it was not
checking whether the realm allows to edit the email addresses.

Change-Id: I8f6cb125e67f7d1046d5bfc1d1aa1439ebf54f08
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
This commit is contained in:
Edwin Kempin
2013-06-04 10:59:21 +02:00
parent 9f9ec65cf4
commit 5f84321719
4 changed files with 61 additions and 51 deletions

View File

@@ -65,7 +65,7 @@ public class AccountResource implements RestResource {
} }
} }
static class Email extends AccountResource { public static class Email extends AccountResource {
private final String email; private final String email;
public Email(IdentifiedUser user, String email) { public Email(IdentifiedUser user, String email) {

View File

@@ -41,14 +41,14 @@ import org.slf4j.LoggerFactory;
public class CreateEmail implements RestModifyView<AccountResource, Input> { public class CreateEmail implements RestModifyView<AccountResource, Input> {
private final Logger log = LoggerFactory.getLogger(getClass()); private final Logger log = LoggerFactory.getLogger(getClass());
static class Input { public static class Input {
@DefaultInput @DefaultInput
String email; public String email;
boolean preferred; public boolean preferred;
boolean noConfirmation; public boolean noConfirmation;
} }
static interface Factory { public static interface Factory {
CreateEmail create(String email); CreateEmail create(String email);
} }

View File

@@ -30,7 +30,7 @@ import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
public class DeleteEmail implements RestModifyView<AccountResource.Email, Input> { public class DeleteEmail implements RestModifyView<AccountResource.Email, Input> {
static class Input { public static class Input {
} }
private final Provider<CurrentUser> self; private final Provider<CurrentUser> self;

View File

@@ -15,7 +15,9 @@
package com.google.gerrit.sshd.commands; package com.google.gerrit.sshd.commands;
import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.common.errors.InvalidSshKeyException; import com.google.gerrit.common.errors.InvalidSshKeyException;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Account.FieldName; import com.google.gerrit.reviewdb.client.Account.FieldName;
import com.google.gerrit.reviewdb.client.AccountExternalId; import com.google.gerrit.reviewdb.client.AccountExternalId;
@@ -23,9 +25,11 @@ import com.google.gerrit.reviewdb.client.AccountSshKey;
import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.account.AccountException; import com.google.gerrit.server.account.AccountResource;
import com.google.gerrit.server.account.AccountManager; import com.google.gerrit.server.account.CreateEmail;
import com.google.gerrit.server.account.AuthRequest; import com.google.gerrit.server.account.DeleteEmail;
import com.google.gerrit.server.account.GetEmails;
import com.google.gerrit.server.account.GetEmails.EmailInfo;
import com.google.gerrit.server.account.Realm; import com.google.gerrit.server.account.Realm;
import com.google.gerrit.server.ssh.SshKeyCache; import com.google.gerrit.server.ssh.SshKeyCache;
import com.google.gerrit.sshd.BaseCommand; import com.google.gerrit.sshd.BaseCommand;
@@ -33,6 +37,7 @@ import com.google.gerrit.sshd.CommandMetaData;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.ResultSet;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Provider;
import org.apache.sshd.server.Environment; import org.apache.sshd.server.Environment;
import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Argument;
@@ -83,9 +88,6 @@ final class SetAccountCommand extends BaseCommand {
@Inject @Inject
private ReviewDb db; private ReviewDb db;
@Inject
private AccountManager manager;
@Inject @Inject
private SshKeyCache sshKeyCache; private SshKeyCache sshKeyCache;
@@ -95,6 +97,21 @@ final class SetAccountCommand extends BaseCommand {
@Inject @Inject
private Realm realm; private Realm realm;
@Inject
private IdentifiedUser.GenericFactory genericUserFactory;
@Inject
private CreateEmail.Factory createEmailFactory;
@Inject
private Provider<GetEmails> getEmailsProvider;
@Inject
private Provider<DeleteEmail> deleteEmailProvider;
private IdentifiedUser user;
private AccountResource rsrc;
@Override @Override
public void start(final Environment env) { public void start(final Environment env) {
startThread(new CommandRunnable() { startThread(new CommandRunnable() {
@@ -131,17 +148,18 @@ final class SetAccountCommand extends BaseCommand {
} }
private void setAccount() throws OrmException, IOException, UnloggedFailure { private void setAccount() throws OrmException, IOException, UnloggedFailure {
user = genericUserFactory.create(id);
rsrc = new AccountResource(user);
final Account account = db.accounts().get(id); final Account account = db.accounts().get(id);
boolean accountUpdated = false; boolean accountUpdated = false;
boolean sshKeysUpdated = false; boolean sshKeysUpdated = false;
for (String email : addEmails) { for (String email : addEmails) {
link(id, email); addEmail(email);
} }
for (String email : deleteEmails) { for (String email : deleteEmails) {
deleteMail(id, email); deleteEmail(email);
} }
if (fullName != null) { if (fullName != null) {
@@ -223,22 +241,36 @@ final class SetAccountCommand extends BaseCommand {
} }
} }
private void deleteMail(Account.Id id, final String mailAddress) private void addEmail(String email) throws OrmException,
throws UnloggedFailure, OrmException { UnloggedFailure {
if (mailAddress.equals("ALL")) { CreateEmail.Input in = new CreateEmail.Input();
ResultSet<AccountExternalId> ids = db.accountExternalIds().byAccount(id); in.email = email;
for (AccountExternalId extId : ids) { in.noConfirmation = true;
if (extId.isScheme(AccountExternalId.SCHEME_MAILTO)) { try {
unlink(id, extId.getEmailAddress()); createEmailFactory.create(email).apply(rsrc, in);
} catch (RestApiException e) {
throw die(e.getMessage());
} catch (EmailException e) {
throw die(e.getMessage());
} }
} }
private void deleteEmail(String email)
throws UnloggedFailure, OrmException {
try {
if (email.equals("ALL")) {
List<EmailInfo> emails = getEmailsProvider.get().apply(rsrc);
DeleteEmail deleteEmail = deleteEmailProvider.get();
for (EmailInfo e : emails) {
deleteEmail.apply(new AccountResource.Email(user, e.email),
new DeleteEmail.Input());
}
} else { } else {
AccountExternalId.Key key = new AccountExternalId.Key( deleteEmailProvider.get().apply(new AccountResource.Email(user, email),
AccountExternalId.SCHEME_MAILTO, mailAddress); new DeleteEmail.Input());
AccountExternalId extId = db.accountExternalIds().get(key);
if (extId != null) {
unlink(id, mailAddress);
} }
} catch (RestApiException e) {
throw die(e.getMessage());
} }
} }
@@ -254,28 +286,6 @@ final class SetAccountCommand extends BaseCommand {
} }
} }
private void unlink(Account.Id id, final String mailAddress)
throws UnloggedFailure {
try {
manager.unlink(id, AuthRequest.forEmail(mailAddress));
} catch (AccountException ex) {
throw die(ex.getMessage());
} catch (OrmException ex) {
throw die(ex.getMessage());
}
}
private void link(Account.Id id, final String mailAddress)
throws UnloggedFailure {
try {
manager.link(id, AuthRequest.forEmail(mailAddress));
} catch (AccountException ex) {
throw die(ex.getMessage());
} catch (OrmException ex) {
throw die(ex.getMessage());
}
}
private List<String> readSshKey(final List<String> sshKeys) private List<String> readSshKey(final List<String> sshKeys)
throws UnsupportedEncodingException, IOException { throws UnsupportedEncodingException, IOException {
if (!sshKeys.isEmpty()) { if (!sshKeys.isEmpty()) {