Delete user branch when account is deleted
Change-Id: I4fde3560c5d5f138a19f69b695d881fc4b3ce337 Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
		| @@ -41,6 +41,7 @@ import com.google.gerrit.reviewdb.client.RefNames; | ||||
| import com.google.gerrit.server.ChangeUtil; | ||||
| import com.google.gerrit.server.IdentifiedUser; | ||||
| import com.google.gerrit.server.Sequences; | ||||
| import com.google.gerrit.server.account.AccountsUpdate; | ||||
| import com.google.gerrit.server.change.ChangeInserter; | ||||
| import com.google.gerrit.server.change.ConsistencyChecker; | ||||
| import com.google.gerrit.server.change.PatchSetInserter; | ||||
| @@ -90,6 +91,8 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { | ||||
|  | ||||
|   @Inject private Sequences sequences; | ||||
|  | ||||
|   @Inject private AccountsUpdate.Server accountsUpdate; | ||||
|  | ||||
|   private RevCommit tip; | ||||
|   private Account.Id adminId; | ||||
|   private ConsistencyChecker checker; | ||||
| @@ -119,7 +122,7 @@ public class ConsistencyCheckerIT extends AbstractDaemonTest { | ||||
|   public void missingOwner() throws Exception { | ||||
|     TestAccount owner = accounts.create("missing"); | ||||
|     ChangeControl ctl = insertChange(owner); | ||||
|     db.accounts().deleteKeys(singleton(owner.getId())); | ||||
|     accountsUpdate.create().deleteByKey(db, owner.getId()); | ||||
|  | ||||
|     assertProblems(ctl, null, problem("Missing change owner: " + owner.getId())); | ||||
|   } | ||||
|   | ||||
| @@ -232,12 +232,13 @@ public class AccountManager { | ||||
|         awaitsFirstAccountCheck.getAndSet(false) && db.accounts().anyAccounts().toList().isEmpty(); | ||||
|  | ||||
|     try { | ||||
|       accountsUpdateFactory.create().upsert(db, account); | ||||
|       AccountsUpdate accountsUpdate = accountsUpdateFactory.create(); | ||||
|       accountsUpdate.upsert(db, account); | ||||
|  | ||||
|       ExternalId existingExtId = externalIds.get(db, extId.key()); | ||||
|       if (existingExtId != null && !existingExtId.accountId().equals(extId.accountId())) { | ||||
|         // external ID is assigned to another account, do not overwrite | ||||
|         db.accounts().delete(Collections.singleton(account)); | ||||
|         accountsUpdate.delete(db, account); | ||||
|         throw new AccountException( | ||||
|             "Cannot assign external ID \"" | ||||
|                 + extId.key().get() | ||||
| @@ -345,7 +346,7 @@ public class AccountManager { | ||||
|       // such an account cannot be used for uploading changes, | ||||
|       // this is why the best we can do here is to fail early and cleanup | ||||
|       // the database | ||||
|       db.accounts().delete(Collections.singleton(account)); | ||||
|       accountsUpdateFactory.create().delete(db, account); | ||||
|       externalIdsUpdateFactory.create().delete(db, extId); | ||||
|       throw new AccountUserNameException(errorMessage, e); | ||||
|     } | ||||
|   | ||||
| @@ -36,6 +36,7 @@ import org.eclipse.jgit.lib.Constants; | ||||
| import org.eclipse.jgit.lib.ObjectId; | ||||
| import org.eclipse.jgit.lib.ObjectInserter; | ||||
| import org.eclipse.jgit.lib.PersonIdent; | ||||
| import org.eclipse.jgit.lib.Ref; | ||||
| import org.eclipse.jgit.lib.RefUpdate; | ||||
| import org.eclipse.jgit.lib.RefUpdate.Result; | ||||
| import org.eclipse.jgit.lib.Repository; | ||||
| @@ -144,6 +145,18 @@ public class AccountsUpdate { | ||||
|     createUserBranchIfNeeded(account); | ||||
|   } | ||||
|  | ||||
|   /** Deletes the account. */ | ||||
|   public void delete(ReviewDb db, Account account) throws OrmException, IOException { | ||||
|     db.accounts().delete(ImmutableSet.of(account)); | ||||
|     deleteUserBranch(account.getId()); | ||||
|   } | ||||
|  | ||||
|   /** Deletes the account. */ | ||||
|   public void deleteByKey(ReviewDb db, Account.Id accountId) throws OrmException, IOException { | ||||
|     db.accounts().deleteKeys(ImmutableSet.of(accountId)); | ||||
|     deleteUserBranch(accountId); | ||||
|   } | ||||
|  | ||||
|   private void createUserBranch(Account account) throws IOException { | ||||
|     try (Repository repo = repoManager.openRepository(allUsersName); | ||||
|         ObjectInserter oi = repo.newObjectInserter()) { | ||||
| @@ -209,4 +222,25 @@ public class AccountsUpdate { | ||||
|   private static ObjectId emptyTree(ObjectInserter oi) throws IOException { | ||||
|     return oi.insert(Constants.OBJ_TREE, new byte[] {}); | ||||
|   } | ||||
|  | ||||
|   private void deleteUserBranch(Account.Id accountId) throws IOException { | ||||
|     try (Repository repo = repoManager.openRepository(allUsersName)) { | ||||
|       String refName = RefNames.refsUsers(accountId); | ||||
|       Ref ref = repo.exactRef(refName); | ||||
|       if (ref == null) { | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       RefUpdate ru = repo.updateRef(refName); | ||||
|       ru.setExpectedOldObjectId(ref.getObjectId()); | ||||
|       ru.setNewObjectId(ObjectId.zeroId()); | ||||
|       ru.setForceUpdate(true); | ||||
|       ru.setRefLogIdent(committerIdent); | ||||
|       ru.setRefLogMessage("Delete Account", true); | ||||
|       Result result = ru.delete(); | ||||
|       if (result != Result.FORCED) { | ||||
|         throw new IOException(String.format("Failed to delete ref %s: %s", refName, result.name())); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Edwin Kempin
					Edwin Kempin