Make audit of account group membership changes pluggable

Account group membership changes were logged in a database table.

Now, the audit log service allows to register listeners to group
member added and group member deleted events. A default listener logs
these events to the database as before. But additional listeners may
now be registered for these events using the GroupMemberAuditListener
interface.

Change-Id: I73872c26479a78be31bacc2cbc8eb850a097d473
This commit is contained in:
Adrian Görler
2014-07-15 13:13:26 +02:00
parent d4871bf8ff
commit 876254f0dd
13 changed files with 356 additions and 98 deletions

View File

@@ -15,6 +15,7 @@
package com.google.gerrit.httpd.rpc.account;
import com.google.common.base.Strings;
import com.google.gerrit.audit.AuditService;
import com.google.gerrit.common.ChangeHooks;
import com.google.gerrit.common.data.AccountSecurity;
import com.google.gerrit.common.data.ContributorAgreement;
@@ -27,7 +28,6 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.AccountExternalId;
import com.google.gerrit.reviewdb.client.AccountGroup;
import com.google.gerrit.reviewdb.client.AccountGroupMember;
import com.google.gerrit.reviewdb.client.AccountGroupMemberAudit;
import com.google.gerrit.reviewdb.client.ContactInformation;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
@@ -71,6 +71,7 @@ class AccountSecurityImpl extends BaseServiceImplementation implements
private final ChangeHooks hooks;
private final GroupCache groupCache;
private final AuditService auditService;
@Inject
AccountSecurityImpl(final Provider<ReviewDb> schema,
@@ -82,7 +83,8 @@ class AccountSecurityImpl extends BaseServiceImplementation implements
final ChangeUserName.CurrentUser changeUserNameFactory,
final DeleteExternalIds.Factory deleteExternalIdsFactory,
final ExternalIdDetailFactory.Factory externalIdDetailFactory,
final ChangeHooks hooks, final GroupCache groupCache) {
final ChangeHooks hooks, final GroupCache groupCache,
final AuditService auditService) {
super(schema, currentUser);
contactStore = cs;
realm = r;
@@ -92,6 +94,7 @@ class AccountSecurityImpl extends BaseServiceImplementation implements
byEmailCache = abec;
accountCache = uac;
accountManager = am;
this.auditService = auditService;
useContactInfo = contactStore != null && contactStore.isEnabled();
@@ -198,9 +201,8 @@ class AccountSecurityImpl extends BaseServiceImplementation implements
AccountGroupMember m = db.accountGroupMembers().get(key);
if (m == null) {
m = new AccountGroupMember(key);
db.accountGroupMembersAudit().insert(
Collections.singleton(new AccountGroupMemberAudit(
m, account.getId(), TimeUtil.nowTs())));
auditService.dispatchAddAccountsToGroup(account.getId(), Collections
.singleton(m));
db.accountGroupMembers().insert(Collections.singleton(m));
accountCache.evict(m.getAccountId());
}