// Copyright (C) 2015 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.account; import com.google.gerrit.common.errors.NameAlreadyUsedException; import com.google.gerrit.extensions.client.AccountFieldName; import com.google.gerrit.extensions.restapi.AuthException; import com.google.gerrit.extensions.restapi.DefaultInput; import com.google.gerrit.extensions.restapi.MethodNotAllowedException; import com.google.gerrit.extensions.restapi.ResourceConflictException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.extensions.restapi.UnprocessableEntityException; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.account.PutUsername.Input; import com.google.gerrit.server.permissions.GlobalPermission; import com.google.gerrit.server.permissions.PermissionBackend; import com.google.gerrit.server.permissions.PermissionBackendException; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class PutUsername implements RestModifyView<AccountResource, Input> { public static class Input { @DefaultInput public String username; } private final Provider<CurrentUser> self; private final ChangeUserName.Factory changeUserNameFactory; private final PermissionBackend permissionBackend; private final Realm realm; @Inject PutUsername( Provider<CurrentUser> self, ChangeUserName.Factory changeUserNameFactory, PermissionBackend permissionBackend, Realm realm) { this.self = self; this.changeUserNameFactory = changeUserNameFactory; this.permissionBackend = permissionBackend; this.realm = realm; } @Override public String apply(AccountResource rsrc, Input input) throws AuthException, MethodNotAllowedException, UnprocessableEntityException, ResourceConflictException, OrmException, IOException, ConfigInvalidException, PermissionBackendException { if (self.get() != rsrc.getUser()) { permissionBackend.user(self).check(GlobalPermission.ADMINISTRATE_SERVER); } if (!realm.allowsEdit(AccountFieldName.USER_NAME)) { throw new MethodNotAllowedException("realm does not allow editing username"); } if (input == null) { input = new Input(); } try { changeUserNameFactory.create(rsrc.getUser(), input.username).call(); } catch (IllegalStateException e) { if (ChangeUserName.USERNAME_CANNOT_BE_CHANGED.equals(e.getMessage())) { throw new MethodNotAllowedException(e.getMessage()); } throw e; } catch (InvalidUserNameException e) { throw new UnprocessableEntityException("invalid username"); } catch (NameAlreadyUsedException e) { throw new ResourceConflictException("username already used"); } return input.username; } }