Permit Realm to supply email address verification on the fly
A Realm might have more data about a user's account in the backend database. If email address information is available, the realm could look this up on the fly to verify incoming commits. Add a new hasEmailAddress() method to check individual emails and cache results inside of the IdentifiedUser object for the duration of the current request/operation scope. Also add a method to lookup as many possible email variations as possible, for reporting in error messages or GET /emails API. Change-Id: I13fec7eb00b1bd6ddcb74323ba7205ee1b2ee42f
This commit is contained in:
@@ -26,8 +26,10 @@ import com.google.gerrit.server.IdentifiedUser;
|
|||||||
import com.google.gerrit.server.account.AccountByEmailCacheImpl;
|
import com.google.gerrit.server.account.AccountByEmailCacheImpl;
|
||||||
import com.google.gerrit.server.account.AccountCacheImpl;
|
import com.google.gerrit.server.account.AccountCacheImpl;
|
||||||
import com.google.gerrit.server.account.CapabilityControl;
|
import com.google.gerrit.server.account.CapabilityControl;
|
||||||
|
import com.google.gerrit.server.account.FakeRealm;
|
||||||
import com.google.gerrit.server.account.GroupCacheImpl;
|
import com.google.gerrit.server.account.GroupCacheImpl;
|
||||||
import com.google.gerrit.server.account.GroupIncludeCacheImpl;
|
import com.google.gerrit.server.account.GroupIncludeCacheImpl;
|
||||||
|
import com.google.gerrit.server.account.Realm;
|
||||||
import com.google.gerrit.server.cache.CacheRemovalListener;
|
import com.google.gerrit.server.cache.CacheRemovalListener;
|
||||||
import com.google.gerrit.server.cache.h2.DefaultCacheFactory;
|
import com.google.gerrit.server.cache.h2.DefaultCacheFactory;
|
||||||
import com.google.gerrit.server.change.ChangeKindCacheImpl;
|
import com.google.gerrit.server.change.ChangeKindCacheImpl;
|
||||||
@@ -96,6 +98,7 @@ public class BatchProgramModule extends FactoryModule {
|
|||||||
.toProvider(CanonicalWebUrlProvider.class);
|
.toProvider(CanonicalWebUrlProvider.class);
|
||||||
bind(Boolean.class).annotatedWith(DisableReverseDnsLookup.class)
|
bind(Boolean.class).annotatedWith(DisableReverseDnsLookup.class)
|
||||||
.toProvider(DisableReverseDnsLookupProvider.class).in(SINGLETON);
|
.toProvider(DisableReverseDnsLookupProvider.class).in(SINGLETON);
|
||||||
|
bind(Realm.class).to(FakeRealm.class);
|
||||||
bind(IdentifiedUser.class)
|
bind(IdentifiedUser.class)
|
||||||
.toProvider(Providers.<IdentifiedUser> of(null));
|
.toProvider(Providers.<IdentifiedUser> of(null));
|
||||||
bind(ReplacePatchSetSender.Factory.class).toProvider(
|
bind(ReplacePatchSetSender.Factory.class).toProvider(
|
||||||
|
@@ -30,6 +30,7 @@ import com.google.gerrit.server.account.CapabilityControl;
|
|||||||
import com.google.gerrit.server.account.GroupBackend;
|
import com.google.gerrit.server.account.GroupBackend;
|
||||||
import com.google.gerrit.server.account.GroupMembership;
|
import com.google.gerrit.server.account.GroupMembership;
|
||||||
import com.google.gerrit.server.account.ListGroupMembership;
|
import com.google.gerrit.server.account.ListGroupMembership;
|
||||||
|
import com.google.gerrit.server.account.Realm;
|
||||||
import com.google.gerrit.server.config.AnonymousCowardName;
|
import com.google.gerrit.server.config.AnonymousCowardName;
|
||||||
import com.google.gerrit.server.config.AuthConfig;
|
import com.google.gerrit.server.config.AuthConfig;
|
||||||
import com.google.gerrit.server.config.CanonicalWebUrl;
|
import com.google.gerrit.server.config.CanonicalWebUrl;
|
||||||
@@ -67,6 +68,7 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
public static class GenericFactory {
|
public static class GenericFactory {
|
||||||
private final CapabilityControl.Factory capabilityControlFactory;
|
private final CapabilityControl.Factory capabilityControlFactory;
|
||||||
private final AuthConfig authConfig;
|
private final AuthConfig authConfig;
|
||||||
|
private final Realm realm;
|
||||||
private final String anonymousCowardName;
|
private final String anonymousCowardName;
|
||||||
private final Provider<String> canonicalUrl;
|
private final Provider<String> canonicalUrl;
|
||||||
private final AccountCache accountCache;
|
private final AccountCache accountCache;
|
||||||
@@ -77,6 +79,7 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
public GenericFactory(
|
public GenericFactory(
|
||||||
@Nullable CapabilityControl.Factory capabilityControlFactory,
|
@Nullable CapabilityControl.Factory capabilityControlFactory,
|
||||||
AuthConfig authConfig,
|
AuthConfig authConfig,
|
||||||
|
Realm realm,
|
||||||
@AnonymousCowardName String anonymousCowardName,
|
@AnonymousCowardName String anonymousCowardName,
|
||||||
@CanonicalWebUrl Provider<String> canonicalUrl,
|
@CanonicalWebUrl Provider<String> canonicalUrl,
|
||||||
@DisableReverseDnsLookup Boolean disableReverseDnsLookup,
|
@DisableReverseDnsLookup Boolean disableReverseDnsLookup,
|
||||||
@@ -84,6 +87,7 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
GroupBackend groupBackend) {
|
GroupBackend groupBackend) {
|
||||||
this.capabilityControlFactory = capabilityControlFactory;
|
this.capabilityControlFactory = capabilityControlFactory;
|
||||||
this.authConfig = authConfig;
|
this.authConfig = authConfig;
|
||||||
|
this.realm = realm;
|
||||||
this.anonymousCowardName = anonymousCowardName;
|
this.anonymousCowardName = anonymousCowardName;
|
||||||
this.canonicalUrl = canonicalUrl;
|
this.canonicalUrl = canonicalUrl;
|
||||||
this.accountCache = accountCache;
|
this.accountCache = accountCache;
|
||||||
@@ -96,20 +100,20 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IdentifiedUser create(Provider<ReviewDb> db, Account.Id id) {
|
public IdentifiedUser create(Provider<ReviewDb> db, Account.Id id) {
|
||||||
return new IdentifiedUser(capabilityControlFactory, authConfig,
|
return new IdentifiedUser(capabilityControlFactory, authConfig, realm,
|
||||||
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
||||||
disableReverseDnsLookup, null, db, id, null);
|
disableReverseDnsLookup, null, db, id, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IdentifiedUser create(SocketAddress remotePeer, Account.Id id) {
|
public IdentifiedUser create(SocketAddress remotePeer, Account.Id id) {
|
||||||
return new IdentifiedUser(capabilityControlFactory, authConfig,
|
return new IdentifiedUser(capabilityControlFactory, authConfig, realm,
|
||||||
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
||||||
disableReverseDnsLookup, Providers.of(remotePeer), null, id, null);
|
disableReverseDnsLookup, Providers.of(remotePeer), null, id, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CurrentUser runAs(SocketAddress remotePeer, Account.Id id,
|
public CurrentUser runAs(SocketAddress remotePeer, Account.Id id,
|
||||||
@Nullable CurrentUser caller) {
|
@Nullable CurrentUser caller) {
|
||||||
return new IdentifiedUser(capabilityControlFactory, authConfig,
|
return new IdentifiedUser(capabilityControlFactory, authConfig, realm,
|
||||||
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
||||||
disableReverseDnsLookup, Providers.of(remotePeer), null, id, caller);
|
disableReverseDnsLookup, Providers.of(remotePeer), null, id, caller);
|
||||||
}
|
}
|
||||||
@@ -125,6 +129,7 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
public static class RequestFactory {
|
public static class RequestFactory {
|
||||||
private final CapabilityControl.Factory capabilityControlFactory;
|
private final CapabilityControl.Factory capabilityControlFactory;
|
||||||
private final AuthConfig authConfig;
|
private final AuthConfig authConfig;
|
||||||
|
private final Realm realm;
|
||||||
private final String anonymousCowardName;
|
private final String anonymousCowardName;
|
||||||
private final Provider<String> canonicalUrl;
|
private final Provider<String> canonicalUrl;
|
||||||
private final AccountCache accountCache;
|
private final AccountCache accountCache;
|
||||||
@@ -138,6 +143,7 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
RequestFactory(
|
RequestFactory(
|
||||||
CapabilityControl.Factory capabilityControlFactory,
|
CapabilityControl.Factory capabilityControlFactory,
|
||||||
final AuthConfig authConfig,
|
final AuthConfig authConfig,
|
||||||
|
Realm realm,
|
||||||
final @AnonymousCowardName String anonymousCowardName,
|
final @AnonymousCowardName String anonymousCowardName,
|
||||||
final @CanonicalWebUrl Provider<String> canonicalUrl,
|
final @CanonicalWebUrl Provider<String> canonicalUrl,
|
||||||
final AccountCache accountCache,
|
final AccountCache accountCache,
|
||||||
@@ -148,6 +154,7 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
final Provider<ReviewDb> dbProvider) {
|
final Provider<ReviewDb> dbProvider) {
|
||||||
this.capabilityControlFactory = capabilityControlFactory;
|
this.capabilityControlFactory = capabilityControlFactory;
|
||||||
this.authConfig = authConfig;
|
this.authConfig = authConfig;
|
||||||
|
this.realm = realm;
|
||||||
this.anonymousCowardName = anonymousCowardName;
|
this.anonymousCowardName = anonymousCowardName;
|
||||||
this.canonicalUrl = canonicalUrl;
|
this.canonicalUrl = canonicalUrl;
|
||||||
this.accountCache = accountCache;
|
this.accountCache = accountCache;
|
||||||
@@ -159,13 +166,13 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public IdentifiedUser create(Account.Id id) {
|
public IdentifiedUser create(Account.Id id) {
|
||||||
return new IdentifiedUser(capabilityControlFactory, authConfig,
|
return new IdentifiedUser(capabilityControlFactory, authConfig, realm,
|
||||||
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
||||||
disableReverseDnsLookup, remotePeerProvider, dbProvider, id, null);
|
disableReverseDnsLookup, remotePeerProvider, dbProvider, id, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IdentifiedUser runAs(Account.Id id, CurrentUser caller) {
|
public IdentifiedUser runAs(Account.Id id, CurrentUser caller) {
|
||||||
return new IdentifiedUser(capabilityControlFactory, authConfig,
|
return new IdentifiedUser(capabilityControlFactory, authConfig, realm,
|
||||||
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
anonymousCowardName, canonicalUrl, accountCache, groupBackend,
|
||||||
disableReverseDnsLookup, remotePeerProvider, dbProvider, id, caller);
|
disableReverseDnsLookup, remotePeerProvider, dbProvider, id, caller);
|
||||||
}
|
}
|
||||||
@@ -182,9 +189,11 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
private final Provider<String> canonicalUrl;
|
private final Provider<String> canonicalUrl;
|
||||||
private final AccountCache accountCache;
|
private final AccountCache accountCache;
|
||||||
private final AuthConfig authConfig;
|
private final AuthConfig authConfig;
|
||||||
|
private final Realm realm;
|
||||||
private final GroupBackend groupBackend;
|
private final GroupBackend groupBackend;
|
||||||
private final String anonymousCowardName;
|
private final String anonymousCowardName;
|
||||||
private final Boolean disableReverseDnsLookup;
|
private final Boolean disableReverseDnsLookup;
|
||||||
|
private final Set<String> validEmails = Sets.newHashSetWithExpectedSize(4);
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private final Provider<SocketAddress> remotePeerProvider;
|
private final Provider<SocketAddress> remotePeerProvider;
|
||||||
@@ -195,17 +204,18 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
private final Account.Id accountId;
|
private final Account.Id accountId;
|
||||||
|
|
||||||
private AccountState state;
|
private AccountState state;
|
||||||
private Set<String> emailAddresses;
|
private boolean loadedAllEmails;
|
||||||
|
private Set<String> invalidEmails;
|
||||||
private GroupMembership effectiveGroups;
|
private GroupMembership effectiveGroups;
|
||||||
private Set<Change.Id> starredChanges;
|
private Set<Change.Id> starredChanges;
|
||||||
private ResultSet<StarredChange> starredQuery;
|
private ResultSet<StarredChange> starredQuery;
|
||||||
private Collection<AccountProjectWatch> notificationFilters;
|
private Collection<AccountProjectWatch> notificationFilters;
|
||||||
private CurrentUser realUser;
|
private CurrentUser realUser;
|
||||||
|
|
||||||
|
|
||||||
private IdentifiedUser(
|
private IdentifiedUser(
|
||||||
CapabilityControl.Factory capabilityControlFactory,
|
CapabilityControl.Factory capabilityControlFactory,
|
||||||
final AuthConfig authConfig,
|
final AuthConfig authConfig,
|
||||||
|
Realm realm,
|
||||||
final String anonymousCowardName,
|
final String anonymousCowardName,
|
||||||
final Provider<String> canonicalUrl,
|
final Provider<String> canonicalUrl,
|
||||||
final AccountCache accountCache,
|
final AccountCache accountCache,
|
||||||
@@ -220,6 +230,7 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
this.accountCache = accountCache;
|
this.accountCache = accountCache;
|
||||||
this.groupBackend = groupBackend;
|
this.groupBackend = groupBackend;
|
||||||
this.authConfig = authConfig;
|
this.authConfig = authConfig;
|
||||||
|
this.realm = realm;
|
||||||
this.anonymousCowardName = anonymousCowardName;
|
this.anonymousCowardName = anonymousCowardName;
|
||||||
this.disableReverseDnsLookup = disableReverseDnsLookup;
|
this.disableReverseDnsLookup = disableReverseDnsLookup;
|
||||||
this.remotePeerProvider = remotePeerProvider;
|
this.remotePeerProvider = remotePeerProvider;
|
||||||
@@ -271,14 +282,26 @@ public class IdentifiedUser extends CurrentUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasEmailAddress(String email) {
|
public boolean hasEmailAddress(String email) {
|
||||||
return getEmailAddresses().contains(email);
|
if (validEmails.contains(email)) {
|
||||||
|
return true;
|
||||||
|
} else if (invalidEmails != null && invalidEmails.contains(email)) {
|
||||||
|
return false;
|
||||||
|
} else if (realm.hasEmailAddress(this, email)) {
|
||||||
|
validEmails.add(email);
|
||||||
|
return true;
|
||||||
|
} else if (invalidEmails == null) {
|
||||||
|
invalidEmails = Sets.newHashSetWithExpectedSize(4);
|
||||||
|
}
|
||||||
|
invalidEmails.add(email);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<String> getEmailAddresses() {
|
public Set<String> getEmailAddresses() {
|
||||||
if (emailAddresses == null) {
|
if (!loadedAllEmails) {
|
||||||
emailAddresses = state().getEmailAddresses();
|
validEmails.addAll(realm.getEmailAddresses(this));
|
||||||
|
loadedAllEmails = true;
|
||||||
}
|
}
|
||||||
return emailAddresses;
|
return validEmails;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
@@ -0,0 +1,49 @@
|
|||||||
|
// 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.account;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
import com.google.gerrit.reviewdb.client.AccountExternalId;
|
||||||
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/** Basic implementation of {@link Realm}. */
|
||||||
|
public abstract class AbstractRealm implements Realm {
|
||||||
|
@Override
|
||||||
|
public boolean hasEmailAddress(IdentifiedUser user, String email) {
|
||||||
|
for (AccountExternalId ext : user.state().getExternalIds()) {
|
||||||
|
if (Objects.equals(ext.getEmailAddress(), email)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getEmailAddresses(IdentifiedUser user) {
|
||||||
|
Collection<AccountExternalId> ids = user.state().getExternalIds();
|
||||||
|
Set<String> emails = Sets.newHashSetWithExpectedSize(ids.size());
|
||||||
|
for (AccountExternalId ext : ids) {
|
||||||
|
if (!Strings.isNullOrEmpty(ext.getEmailAddress())) {
|
||||||
|
emails.add(ext.getEmailAddress());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return emails;
|
||||||
|
}
|
||||||
|
}
|
@@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.AccountExternalId;
|
|||||||
import com.google.gerrit.reviewdb.client.AccountGroup;
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class AccountState {
|
public class AccountState {
|
||||||
@@ -64,25 +63,6 @@ public class AccountState {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* All email addresses registered to this account.
|
|
||||||
* <p>
|
|
||||||
* Gerrit is "reasonably certain" that the returned email addresses actually
|
|
||||||
* belong to the user of the account. Some emails may have been obtained from
|
|
||||||
* the authentication provider, which in the case of OpenID may be trusting
|
|
||||||
* the provider to have validated the address. Other emails may have been
|
|
||||||
* validated by Gerrit directly.
|
|
||||||
*/
|
|
||||||
public Set<String> getEmailAddresses() {
|
|
||||||
final Set<String> emails = new HashSet<>();
|
|
||||||
for (final AccountExternalId e : externalIds) {
|
|
||||||
if (e.getEmailAddress() != null && !e.getEmailAddress().isEmpty()) {
|
|
||||||
emails.add(e.getEmailAddress());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return emails;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** The external identities that identify the account holder. */
|
/** The external identities that identify the account holder. */
|
||||||
public Collection<AccountExternalId> getExternalIds() {
|
public Collection<AccountExternalId> getExternalIds() {
|
||||||
return externalIds;
|
return externalIds;
|
||||||
|
@@ -25,7 +25,7 @@ import com.google.inject.Singleton;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class DefaultRealm implements Realm {
|
public class DefaultRealm extends AbstractRealm {
|
||||||
private final EmailExpander emailExpander;
|
private final EmailExpander emailExpander;
|
||||||
private final AccountByEmailCache byEmail;
|
private final AccountByEmailCache byEmail;
|
||||||
private final AuthConfig authConfig;
|
private final AuthConfig authConfig;
|
||||||
|
@@ -12,16 +12,14 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
package com.google.gerrit.testutil;
|
package com.google.gerrit.server.account;
|
||||||
|
|
||||||
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.server.ReviewDb;
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
import com.google.gerrit.server.account.AuthRequest;
|
|
||||||
import com.google.gerrit.server.account.Realm;
|
|
||||||
|
|
||||||
/** Fake implementation of {@link Realm} for testing. */
|
/** Fake implementation of {@link Realm} that does not communicate. */
|
||||||
public class FakeRealm implements Realm {
|
public class FakeRealm extends AbstractRealm {
|
||||||
@Override
|
@Override
|
||||||
public boolean allowsEdit(FieldName field) {
|
public boolean allowsEdit(FieldName field) {
|
||||||
return false;
|
return false;
|
@@ -16,6 +16,9 @@ package com.google.gerrit.server.account;
|
|||||||
|
|
||||||
import com.google.gerrit.reviewdb.client.Account;
|
import com.google.gerrit.reviewdb.client.Account;
|
||||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
|
import com.google.gerrit.server.IdentifiedUser;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public interface Realm {
|
public interface Realm {
|
||||||
/** Can the end-user modify this field of their own account? */
|
/** Can the end-user modify this field of their own account? */
|
||||||
@@ -31,6 +34,12 @@ public interface Realm {
|
|||||||
|
|
||||||
public void onCreateAccount(AuthRequest who, Account account);
|
public void onCreateAccount(AuthRequest who, Account account);
|
||||||
|
|
||||||
|
/** @return true if the user has the given email address. */
|
||||||
|
public boolean hasEmailAddress(IdentifiedUser who, String email);
|
||||||
|
|
||||||
|
/** @return all known email addresses for the identified user. */
|
||||||
|
public Set<String> getEmailAddresses(IdentifiedUser who);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Locate an account whose local username is the given account name.
|
* Locate an account whose local username is the given account name.
|
||||||
* <p>
|
* <p>
|
||||||
|
@@ -26,10 +26,10 @@ import com.google.gerrit.reviewdb.client.AccountExternalId;
|
|||||||
import com.google.gerrit.reviewdb.client.AccountGroup;
|
import com.google.gerrit.reviewdb.client.AccountGroup;
|
||||||
import com.google.gerrit.reviewdb.client.AuthType;
|
import com.google.gerrit.reviewdb.client.AuthType;
|
||||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||||
|
import com.google.gerrit.server.account.AbstractRealm;
|
||||||
import com.google.gerrit.server.account.AccountException;
|
import com.google.gerrit.server.account.AccountException;
|
||||||
import com.google.gerrit.server.account.AuthRequest;
|
import com.google.gerrit.server.account.AuthRequest;
|
||||||
import com.google.gerrit.server.account.EmailExpander;
|
import com.google.gerrit.server.account.EmailExpander;
|
||||||
import com.google.gerrit.server.account.Realm;
|
|
||||||
import com.google.gerrit.server.auth.AuthenticationUnavailableException;
|
import com.google.gerrit.server.auth.AuthenticationUnavailableException;
|
||||||
import com.google.gerrit.server.config.AuthConfig;
|
import com.google.gerrit.server.config.AuthConfig;
|
||||||
import com.google.gerrit.server.config.GerritServerConfig;
|
import com.google.gerrit.server.config.GerritServerConfig;
|
||||||
@@ -58,7 +58,7 @@ import javax.naming.directory.DirContext;
|
|||||||
import javax.security.auth.login.LoginException;
|
import javax.security.auth.login.LoginException;
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public class LdapRealm implements Realm {
|
public class LdapRealm extends AbstractRealm {
|
||||||
static final Logger log = LoggerFactory.getLogger(LdapRealm.class);
|
static final Logger log = LoggerFactory.getLogger(LdapRealm.class);
|
||||||
static final String LDAP = "com.sun.jndi.ldap.LdapCtxFactory";
|
static final String LDAP = "com.sun.jndi.ldap.LdapCtxFactory";
|
||||||
static final String USERNAME = "username";
|
static final String USERNAME = "username";
|
||||||
|
@@ -14,11 +14,11 @@
|
|||||||
|
|
||||||
package com.google.gerrit.rules;
|
package com.google.gerrit.rules;
|
||||||
|
|
||||||
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static com.google.gerrit.common.data.Permission.LABEL;
|
import static com.google.gerrit.common.data.Permission.LABEL;
|
||||||
import static com.google.gerrit.server.project.Util.allow;
|
import static com.google.gerrit.server.project.Util.allow;
|
||||||
import static com.google.gerrit.server.project.Util.category;
|
import static com.google.gerrit.server.project.Util.category;
|
||||||
import static com.google.gerrit.server.project.Util.value;
|
import static com.google.gerrit.server.project.Util.value;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import com.google.gerrit.common.TimeUtil;
|
import com.google.gerrit.common.TimeUtil;
|
||||||
|
@@ -52,7 +52,9 @@ import com.google.gerrit.server.PatchLineCommentsUtil;
|
|||||||
import com.google.gerrit.server.account.AccountCache;
|
import com.google.gerrit.server.account.AccountCache;
|
||||||
import com.google.gerrit.server.account.AccountLoader;
|
import com.google.gerrit.server.account.AccountLoader;
|
||||||
import com.google.gerrit.server.account.CapabilityControl;
|
import com.google.gerrit.server.account.CapabilityControl;
|
||||||
|
import com.google.gerrit.server.account.FakeRealm;
|
||||||
import com.google.gerrit.server.account.GroupBackend;
|
import com.google.gerrit.server.account.GroupBackend;
|
||||||
|
import com.google.gerrit.server.account.Realm;
|
||||||
import com.google.gerrit.server.config.AllUsersNameProvider;
|
import com.google.gerrit.server.config.AllUsersNameProvider;
|
||||||
import com.google.gerrit.server.config.AnonymousCowardName;
|
import com.google.gerrit.server.config.AnonymousCowardName;
|
||||||
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
|
import com.google.gerrit.server.config.AnonymousCowardNameProvider;
|
||||||
@@ -171,6 +173,7 @@ public class CommentsTest {
|
|||||||
bind(draftViewsType).toInstance(draftViews);
|
bind(draftViewsType).toInstance(draftViews);
|
||||||
bind(AccountLoader.Factory.class).toInstance(alf);
|
bind(AccountLoader.Factory.class).toInstance(alf);
|
||||||
bind(ReviewDb.class).toInstance(db);
|
bind(ReviewDb.class).toInstance(db);
|
||||||
|
bind(Realm.class).to(FakeRealm.class);
|
||||||
bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(config);
|
bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(config);
|
||||||
bind(ProjectCache.class).toProvider(Providers.<ProjectCache> of(null));
|
bind(ProjectCache.class).toProvider(Providers.<ProjectCache> of(null));
|
||||||
install(new GitModule());
|
install(new GitModule());
|
||||||
|
@@ -33,6 +33,7 @@ import com.google.gerrit.server.GerritPersonIdent;
|
|||||||
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.CapabilityControl;
|
import com.google.gerrit.server.account.CapabilityControl;
|
||||||
|
import com.google.gerrit.server.account.FakeRealm;
|
||||||
import com.google.gerrit.server.account.GroupBackend;
|
import com.google.gerrit.server.account.GroupBackend;
|
||||||
import com.google.gerrit.server.account.Realm;
|
import com.google.gerrit.server.account.Realm;
|
||||||
import com.google.gerrit.server.config.AllUsersNameProvider;
|
import com.google.gerrit.server.config.AllUsersNameProvider;
|
||||||
@@ -48,7 +49,6 @@ import com.google.gerrit.server.git.GitRepositoryManager;
|
|||||||
import com.google.gerrit.server.group.SystemGroupBackend;
|
import com.google.gerrit.server.group.SystemGroupBackend;
|
||||||
import com.google.gerrit.server.project.ProjectCache;
|
import com.google.gerrit.server.project.ProjectCache;
|
||||||
import com.google.gerrit.testutil.FakeAccountCache;
|
import com.google.gerrit.testutil.FakeAccountCache;
|
||||||
import com.google.gerrit.testutil.FakeRealm;
|
|
||||||
import com.google.gerrit.testutil.InMemoryRepositoryManager;
|
import com.google.gerrit.testutil.InMemoryRepositoryManager;
|
||||||
import com.google.gerrit.testutil.TestChanges;
|
import com.google.gerrit.testutil.TestChanges;
|
||||||
import com.google.gwtorm.client.KeyUtil;
|
import com.google.gwtorm.client.KeyUtil;
|
||||||
|
@@ -35,9 +35,11 @@ import com.google.gerrit.rules.RulesCache;
|
|||||||
import com.google.gerrit.server.CurrentUser;
|
import com.google.gerrit.server.CurrentUser;
|
||||||
import com.google.gerrit.server.account.AccountCache;
|
import com.google.gerrit.server.account.AccountCache;
|
||||||
import com.google.gerrit.server.account.CapabilityControl;
|
import com.google.gerrit.server.account.CapabilityControl;
|
||||||
|
import com.google.gerrit.server.account.FakeRealm;
|
||||||
import com.google.gerrit.server.account.GroupBackend;
|
import com.google.gerrit.server.account.GroupBackend;
|
||||||
import com.google.gerrit.server.account.GroupMembership;
|
import com.google.gerrit.server.account.GroupMembership;
|
||||||
import com.google.gerrit.server.account.ListGroupMembership;
|
import com.google.gerrit.server.account.ListGroupMembership;
|
||||||
|
import com.google.gerrit.server.account.Realm;
|
||||||
import com.google.gerrit.server.change.ChangeKindCache;
|
import com.google.gerrit.server.change.ChangeKindCache;
|
||||||
import com.google.gerrit.server.change.ChangeKindCacheImpl;
|
import com.google.gerrit.server.change.ChangeKindCacheImpl;
|
||||||
import com.google.gerrit.server.change.MergeabilityCache;
|
import com.google.gerrit.server.change.MergeabilityCache;
|
||||||
@@ -265,6 +267,7 @@ public class Util {
|
|||||||
bind(ReviewDb.class).toProvider(nullProvider);
|
bind(ReviewDb.class).toProvider(nullProvider);
|
||||||
bind(GitRepositoryManager.class).toInstance(repoManager);
|
bind(GitRepositoryManager.class).toInstance(repoManager);
|
||||||
bind(PatchListCache.class).toProvider(nullProvider);
|
bind(PatchListCache.class).toProvider(nullProvider);
|
||||||
|
bind(Realm.class).to(FakeRealm.class);
|
||||||
|
|
||||||
factory(CapabilityControl.Factory.class);
|
factory(CapabilityControl.Factory.class);
|
||||||
factory(ChangeControl.AssistedFactory.class);
|
factory(ChangeControl.AssistedFactory.class);
|
||||||
|
Reference in New Issue
Block a user