| // Copyright (C) 2014 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.server.api.accounts; |
| |
| import static com.google.gerrit.server.api.ApiUtil.asRestApiException; |
| import static javax.servlet.http.HttpServletResponse.SC_OK; |
| |
| import com.google.gerrit.common.Nullable; |
| import com.google.gerrit.common.RawInputUtil; |
| import com.google.gerrit.extensions.api.accounts.AccountApi; |
| import com.google.gerrit.extensions.api.accounts.AgreementInput; |
| import com.google.gerrit.extensions.api.accounts.DeleteDraftCommentsInput; |
| import com.google.gerrit.extensions.api.accounts.DeletedDraftCommentInfo; |
| import com.google.gerrit.extensions.api.accounts.DisplayNameInput; |
| import com.google.gerrit.extensions.api.accounts.EmailApi; |
| import com.google.gerrit.extensions.api.accounts.EmailInput; |
| import com.google.gerrit.extensions.api.accounts.GpgKeyApi; |
| import com.google.gerrit.extensions.api.accounts.SshKeyInput; |
| import com.google.gerrit.extensions.api.accounts.StatusInput; |
| import com.google.gerrit.extensions.client.DiffPreferencesInfo; |
| import com.google.gerrit.extensions.client.EditPreferencesInfo; |
| import com.google.gerrit.extensions.client.GeneralPreferencesInfo; |
| import com.google.gerrit.extensions.client.ProjectWatchInfo; |
| import com.google.gerrit.extensions.common.AccountDetailInfo; |
| import com.google.gerrit.extensions.common.AccountExternalIdInfo; |
| import com.google.gerrit.extensions.common.AccountInfo; |
| import com.google.gerrit.extensions.common.AgreementInfo; |
| import com.google.gerrit.extensions.common.EmailInfo; |
| import com.google.gerrit.extensions.common.GpgKeyInfo; |
| import com.google.gerrit.extensions.common.GroupInfo; |
| import com.google.gerrit.extensions.common.HttpPasswordInput; |
| import com.google.gerrit.extensions.common.Input; |
| import com.google.gerrit.extensions.common.NameInput; |
| import com.google.gerrit.extensions.common.SshKeyInfo; |
| import com.google.gerrit.extensions.restapi.IdString; |
| import com.google.gerrit.extensions.restapi.Response; |
| import com.google.gerrit.extensions.restapi.RestApiException; |
| import com.google.gerrit.extensions.restapi.TopLevelResource; |
| import com.google.gerrit.server.account.AccountLoader; |
| import com.google.gerrit.server.account.AccountResource; |
| import com.google.gerrit.server.account.GpgApiAdapter; |
| import com.google.gerrit.server.change.ChangeResource; |
| import com.google.gerrit.server.restapi.account.AddSshKey; |
| import com.google.gerrit.server.restapi.account.CreateEmail; |
| import com.google.gerrit.server.restapi.account.DeleteAccount; |
| import com.google.gerrit.server.restapi.account.DeleteActive; |
| import com.google.gerrit.server.restapi.account.DeleteDraftComments; |
| import com.google.gerrit.server.restapi.account.DeleteEmail; |
| import com.google.gerrit.server.restapi.account.DeleteExternalIds; |
| import com.google.gerrit.server.restapi.account.DeleteSshKey; |
| import com.google.gerrit.server.restapi.account.DeleteWatchedProjects; |
| import com.google.gerrit.server.restapi.account.GetActive; |
| import com.google.gerrit.server.restapi.account.GetAgreements; |
| import com.google.gerrit.server.restapi.account.GetAvatar; |
| import com.google.gerrit.server.restapi.account.GetDetail; |
| import com.google.gerrit.server.restapi.account.GetDiffPreferences; |
| import com.google.gerrit.server.restapi.account.GetEditPreferences; |
| import com.google.gerrit.server.restapi.account.GetEmails; |
| import com.google.gerrit.server.restapi.account.GetExternalIds; |
| import com.google.gerrit.server.restapi.account.GetGroups; |
| import com.google.gerrit.server.restapi.account.GetPreferences; |
| import com.google.gerrit.server.restapi.account.GetSshKeys; |
| import com.google.gerrit.server.restapi.account.GetWatchedProjects; |
| import com.google.gerrit.server.restapi.account.Index; |
| import com.google.gerrit.server.restapi.account.PostWatchedProjects; |
| import com.google.gerrit.server.restapi.account.PutActive; |
| import com.google.gerrit.server.restapi.account.PutAgreement; |
| import com.google.gerrit.server.restapi.account.PutDisplayName; |
| import com.google.gerrit.server.restapi.account.PutHttpPassword; |
| import com.google.gerrit.server.restapi.account.PutName; |
| import com.google.gerrit.server.restapi.account.PutStatus; |
| import com.google.gerrit.server.restapi.account.SetDiffPreferences; |
| import com.google.gerrit.server.restapi.account.SetEditPreferences; |
| import com.google.gerrit.server.restapi.account.SetPreferences; |
| import com.google.gerrit.server.restapi.account.SshKeys; |
| import com.google.gerrit.server.restapi.account.StarredChanges; |
| import com.google.gerrit.server.restapi.change.ChangesCollection; |
| import com.google.inject.Inject; |
| import com.google.inject.assistedinject.Assisted; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class AccountApiImpl implements AccountApi { |
| interface Factory { |
| AccountApiImpl create(AccountResource account); |
| } |
| |
| private final AccountResource account; |
| private final ChangesCollection changes; |
| private final AccountLoader.Factory accountLoaderFactory; |
| private final GetDetail getDetail; |
| private final GetAvatar getAvatar; |
| private final GetPreferences getPreferences; |
| private final SetPreferences setPreferences; |
| private final GetDiffPreferences getDiffPreferences; |
| private final SetDiffPreferences setDiffPreferences; |
| private final GetEditPreferences getEditPreferences; |
| private final SetEditPreferences setEditPreferences; |
| private final GetWatchedProjects getWatchedProjects; |
| private final PostWatchedProjects postWatchedProjects; |
| private final DeleteWatchedProjects deleteWatchedProjects; |
| private final StarredChanges.Create starredChangesCreate; |
| private final StarredChanges.Delete starredChangesDelete; |
| private final GetEmails getEmails; |
| private final CreateEmail createEmail; |
| private final DeleteEmail deleteEmail; |
| private final GpgApiAdapter gpgApiAdapter; |
| private final GetSshKeys getSshKeys; |
| private final AddSshKey addSshKey; |
| private final DeleteSshKey deleteSshKey; |
| private final SshKeys sshKeys; |
| private final GetAgreements getAgreements; |
| private final PutAgreement putAgreement; |
| private final GetActive getActive; |
| private final PutActive putActive; |
| private final DeleteActive deleteActive; |
| private final Index index; |
| private final GetExternalIds getExternalIds; |
| private final DeleteExternalIds deleteExternalIds; |
| private final DeleteDraftComments deleteDraftComments; |
| private final PutStatus putStatus; |
| private final PutDisplayName putDisplayName; |
| private final GetGroups getGroups; |
| private final EmailApiImpl.Factory emailApi; |
| private final PutName putName; |
| private final PutHttpPassword putHttpPassword; |
| private final DeleteAccount deleteAccount; |
| |
| @Inject |
| AccountApiImpl( |
| AccountLoader.Factory ailf, |
| ChangesCollection changes, |
| GetDetail getDetail, |
| GetAvatar getAvatar, |
| GetPreferences getPreferences, |
| SetPreferences setPreferences, |
| GetDiffPreferences getDiffPreferences, |
| SetDiffPreferences setDiffPreferences, |
| GetEditPreferences getEditPreferences, |
| SetEditPreferences setEditPreferences, |
| GetWatchedProjects getWatchedProjects, |
| PostWatchedProjects postWatchedProjects, |
| DeleteWatchedProjects deleteWatchedProjects, |
| StarredChanges.Create starredChangesCreate, |
| StarredChanges.Delete starredChangesDelete, |
| GetEmails getEmails, |
| CreateEmail createEmail, |
| DeleteEmail deleteEmail, |
| GpgApiAdapter gpgApiAdapter, |
| GetSshKeys getSshKeys, |
| AddSshKey addSshKey, |
| DeleteSshKey deleteSshKey, |
| SshKeys sshKeys, |
| GetAgreements getAgreements, |
| PutAgreement putAgreement, |
| GetActive getActive, |
| PutActive putActive, |
| DeleteActive deleteActive, |
| Index index, |
| GetExternalIds getExternalIds, |
| DeleteExternalIds deleteExternalIds, |
| DeleteDraftComments deleteDraftComments, |
| PutStatus putStatus, |
| PutDisplayName putDisplayName, |
| GetGroups getGroups, |
| EmailApiImpl.Factory emailApi, |
| PutName putName, |
| PutHttpPassword putPassword, |
| DeleteAccount deleteAccount, |
| @Assisted AccountResource account) { |
| this.account = account; |
| this.accountLoaderFactory = ailf; |
| this.changes = changes; |
| this.getDetail = getDetail; |
| this.getAvatar = getAvatar; |
| this.getPreferences = getPreferences; |
| this.setPreferences = setPreferences; |
| this.getDiffPreferences = getDiffPreferences; |
| this.setDiffPreferences = setDiffPreferences; |
| this.getEditPreferences = getEditPreferences; |
| this.setEditPreferences = setEditPreferences; |
| this.getWatchedProjects = getWatchedProjects; |
| this.postWatchedProjects = postWatchedProjects; |
| this.deleteWatchedProjects = deleteWatchedProjects; |
| this.starredChangesCreate = starredChangesCreate; |
| this.starredChangesDelete = starredChangesDelete; |
| this.getEmails = getEmails; |
| this.createEmail = createEmail; |
| this.deleteEmail = deleteEmail; |
| this.getSshKeys = getSshKeys; |
| this.addSshKey = addSshKey; |
| this.deleteSshKey = deleteSshKey; |
| this.sshKeys = sshKeys; |
| this.gpgApiAdapter = gpgApiAdapter; |
| this.getAgreements = getAgreements; |
| this.putAgreement = putAgreement; |
| this.getActive = getActive; |
| this.putActive = putActive; |
| this.deleteActive = deleteActive; |
| this.index = index; |
| this.getExternalIds = getExternalIds; |
| this.deleteExternalIds = deleteExternalIds; |
| this.deleteDraftComments = deleteDraftComments; |
| this.putStatus = putStatus; |
| this.putDisplayName = putDisplayName; |
| this.getGroups = getGroups; |
| this.emailApi = emailApi; |
| this.putName = putName; |
| this.putHttpPassword = putPassword; |
| this.deleteAccount = deleteAccount; |
| } |
| |
| @Override |
| public com.google.gerrit.extensions.common.AccountInfo get() throws RestApiException { |
| AccountLoader accountLoader = accountLoaderFactory.create(true); |
| try { |
| AccountInfo ai = accountLoader.get(account.getUser().getAccountId()); |
| accountLoader.fill(); |
| return ai; |
| } catch (Exception e) { |
| throw asRestApiException("Cannot parse account", e); |
| } |
| } |
| |
| @Override |
| public AccountDetailInfo detail() throws RestApiException { |
| try { |
| return getDetail.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get detail", e); |
| } |
| } |
| |
| @Override |
| public boolean getActive() throws RestApiException { |
| try { |
| Response<String> result = getActive.apply(account); |
| return result.statusCode() == SC_OK && result.value().equals("ok"); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get active", e); |
| } |
| } |
| |
| @Override |
| public void setActive(boolean active) throws RestApiException { |
| try { |
| if (active) { |
| putActive.apply(account, new Input()); |
| } else { |
| deleteActive.apply(account, new Input()); |
| } |
| } catch (Exception e) { |
| throw asRestApiException("Cannot set active", e); |
| } |
| } |
| |
| @Override |
| public String getAvatarUrl(int size) throws RestApiException { |
| getAvatar.setSize(size); |
| return getAvatar.apply(account).location(); |
| } |
| |
| @Override |
| public GeneralPreferencesInfo getPreferences() throws RestApiException { |
| try { |
| return getPreferences.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get preferences", e); |
| } |
| } |
| |
| @Override |
| public GeneralPreferencesInfo setPreferences(GeneralPreferencesInfo in) throws RestApiException { |
| try { |
| return setPreferences.apply(account, in).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot set preferences", e); |
| } |
| } |
| |
| @Override |
| public DiffPreferencesInfo getDiffPreferences() throws RestApiException { |
| try { |
| return getDiffPreferences.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot query diff preferences", e); |
| } |
| } |
| |
| @Override |
| public DiffPreferencesInfo setDiffPreferences(DiffPreferencesInfo in) throws RestApiException { |
| try { |
| return setDiffPreferences.apply(account, in).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot set diff preferences", e); |
| } |
| } |
| |
| @Override |
| public EditPreferencesInfo getEditPreferences() throws RestApiException { |
| try { |
| return getEditPreferences.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot query edit preferences", e); |
| } |
| } |
| |
| @Override |
| public EditPreferencesInfo setEditPreferences(EditPreferencesInfo in) throws RestApiException { |
| try { |
| return setEditPreferences.apply(account, in).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot set edit preferences", e); |
| } |
| } |
| |
| @Override |
| public List<ProjectWatchInfo> getWatchedProjects() throws RestApiException { |
| try { |
| return getWatchedProjects.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get watched projects", e); |
| } |
| } |
| |
| @Override |
| public List<ProjectWatchInfo> setWatchedProjects(List<ProjectWatchInfo> in) |
| throws RestApiException { |
| try { |
| return postWatchedProjects.apply(account, in).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot update watched projects", e); |
| } |
| } |
| |
| @Override |
| public void deleteWatchedProjects(List<ProjectWatchInfo> in) throws RestApiException { |
| try { |
| deleteWatchedProjects.apply(account, in); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot delete watched projects", e); |
| } |
| } |
| |
| @Override |
| public void starChange(String changeId) throws RestApiException { |
| try { |
| starredChangesCreate.apply(account, IdString.fromUrl(changeId), new Input()); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot star change", e); |
| } |
| } |
| |
| @Override |
| public void unstarChange(String changeId) throws RestApiException { |
| try { |
| ChangeResource rsrc = changes.parse(TopLevelResource.INSTANCE, IdString.fromUrl(changeId)); |
| AccountResource.StarredChange starredChange = |
| new AccountResource.StarredChange(account.getUser(), rsrc); |
| starredChangesDelete.apply(starredChange, new Input()); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot unstar change", e); |
| } |
| } |
| |
| @Override |
| public List<GroupInfo> getGroups() throws RestApiException { |
| try { |
| return getGroups.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get groups", e); |
| } |
| } |
| |
| @Override |
| public List<EmailInfo> getEmails() throws RestApiException { |
| try { |
| return getEmails.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get emails", e); |
| } |
| } |
| |
| @Override |
| public void addEmail(EmailInput input) throws RestApiException { |
| AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), input.email); |
| try { |
| createEmail.apply(rsrc, IdString.fromDecoded(input.email), input); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot add email", e); |
| } |
| } |
| |
| @Override |
| public void deleteEmail(String email) throws RestApiException { |
| AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), email); |
| try { |
| deleteEmail.apply(rsrc, null); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot delete email", e); |
| } |
| } |
| |
| @Override |
| public EmailApi createEmail(EmailInput input) throws RestApiException { |
| AccountResource.Email rsrc = new AccountResource.Email(account.getUser(), input.email); |
| try { |
| createEmail.apply(rsrc, IdString.fromDecoded(input.email), input); |
| return email(rsrc.getEmail()); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot create email", e); |
| } |
| } |
| |
| @Override |
| public EmailApi email(String email) throws RestApiException { |
| try { |
| return emailApi.create(account, email); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot parse email", e); |
| } |
| } |
| |
| @Override |
| public void setStatus(String status) throws RestApiException { |
| StatusInput in = new StatusInput(status); |
| try { |
| putStatus.apply(account, in); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot set status", e); |
| } |
| } |
| |
| @Override |
| public void setDisplayName(String displayName) throws RestApiException { |
| DisplayNameInput in = new DisplayNameInput(displayName); |
| try { |
| putDisplayName.apply(account, in); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot set display name", e); |
| } |
| } |
| |
| @Override |
| public List<SshKeyInfo> listSshKeys() throws RestApiException { |
| try { |
| return getSshKeys.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot list SSH keys", e); |
| } |
| } |
| |
| @Override |
| public SshKeyInfo addSshKey(String key) throws RestApiException { |
| SshKeyInput in = new SshKeyInput(); |
| in.raw = RawInputUtil.create(key); |
| try { |
| return addSshKey.apply(account, in).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot add SSH key", e); |
| } |
| } |
| |
| @Override |
| public void deleteSshKey(int seq) throws RestApiException { |
| try { |
| AccountResource.SshKey sshKeyRes = |
| sshKeys.parse(account, IdString.fromDecoded(Integer.toString(seq))); |
| deleteSshKey.apply(sshKeyRes, null); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot delete SSH key", e); |
| } |
| } |
| |
| @Override |
| public Map<String, GpgKeyInfo> listGpgKeys() throws RestApiException { |
| try { |
| return gpgApiAdapter.listGpgKeys(account); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot list GPG keys", e); |
| } |
| } |
| |
| @Override |
| public Map<String, GpgKeyInfo> putGpgKeys(List<String> add, List<String> delete) |
| throws RestApiException { |
| try { |
| return gpgApiAdapter.putGpgKeys(account, add, delete); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot add GPG key", e); |
| } |
| } |
| |
| @Override |
| public GpgKeyApi gpgKey(String id) throws RestApiException { |
| try { |
| return gpgApiAdapter.gpgKey(account, IdString.fromDecoded(id)); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get PGP key", e); |
| } |
| } |
| |
| @Override |
| public List<AgreementInfo> listAgreements() throws RestApiException { |
| try { |
| return getAgreements.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get agreements", e); |
| } |
| } |
| |
| @Override |
| public void signAgreement(String agreementName) throws RestApiException { |
| try { |
| AgreementInput input = new AgreementInput(); |
| input.name = agreementName; |
| putAgreement.apply(account, input); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot sign agreement", e); |
| } |
| } |
| |
| @Override |
| public void index() throws RestApiException { |
| try { |
| index.apply(account, new Input()); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot index account", e); |
| } |
| } |
| |
| @Override |
| public List<AccountExternalIdInfo> getExternalIds() throws RestApiException { |
| try { |
| return getExternalIds.apply(account).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot get external IDs", e); |
| } |
| } |
| |
| @Override |
| public void deleteExternalIds(List<String> externalIds) throws RestApiException { |
| try { |
| deleteExternalIds.apply(account, externalIds); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot delete external IDs", e); |
| } |
| } |
| |
| @Override |
| public List<DeletedDraftCommentInfo> deleteDraftComments(DeleteDraftCommentsInput input) |
| throws RestApiException { |
| try { |
| return deleteDraftComments.apply(account, input).value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot delete draft comments", e); |
| } |
| } |
| |
| @Override |
| public void setName(String name) throws RestApiException { |
| NameInput input = new NameInput(); |
| input.name = name; |
| try { |
| putName.apply(account, input); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot set account name", e); |
| } |
| } |
| |
| @Nullable |
| @Override |
| public String generateHttpPassword() throws RestApiException { |
| HttpPasswordInput input = new HttpPasswordInput(); |
| input.generate = true; |
| try { |
| // Response should never be 'none' for a generated password, but |
| // let's make sure. |
| Response<String> result = putHttpPassword.apply(account, input); |
| return result.isNone() ? null : result.value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot generate HTTP password", e); |
| } |
| } |
| |
| @Nullable |
| @Override |
| public String setHttpPassword(String password) throws RestApiException { |
| HttpPasswordInput input = new HttpPasswordInput(); |
| input.generate = false; |
| input.httpPassword = password; |
| try { |
| Response<String> result = putHttpPassword.apply(account, input); |
| return result.isNone() ? null : result.value(); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot generate HTTP password", e); |
| } |
| } |
| |
| @Override |
| public void delete() throws RestApiException { |
| try { |
| deleteAccount.apply(account, null); |
| } catch (Exception e) { |
| throw asRestApiException("Cannot delete account " + account.getUser().getNameEmail(), e); |
| } |
| } |
| } |