diff --git a/extensions/guacamole-auth-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProvider.java b/extensions/guacamole-auth-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProvider.java index 5c80bcaf5..ed51a31c9 100644 --- a/extensions/guacamole-auth-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProvider.java +++ b/extensions/guacamole-auth-cas/src/main/java/org/apache/guacamole/auth/cas/CASAuthenticationProvider.java @@ -22,10 +22,9 @@ package org.apache.guacamole.auth.cas; import com.google.inject.Guice; import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; -import org.apache.guacamole.net.auth.UserContext; /** * Guacamole authentication backend which authenticates users using an @@ -33,7 +32,7 @@ import org.apache.guacamole.net.auth.UserContext; * provided - only authentication. Storage must be provided by some other * extension. */ -public class CASAuthenticationProvider implements AuthenticationProvider { +public class CASAuthenticationProvider extends AbstractAuthenticationProvider { /** * Injector which will manage the object graph of this authentication @@ -63,11 +62,6 @@ public class CASAuthenticationProvider implements AuthenticationProvider { return "cas"; } - @Override - public Object getResource() throws GuacamoleException { - return null; - } - @Override public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { @@ -78,52 +72,4 @@ public class CASAuthenticationProvider implements AuthenticationProvider { } - @Override - public AuthenticatedUser updateAuthenticatedUser( - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - - // No update necessary - return authenticatedUser; - - } - - @Override - public UserContext getUserContext(AuthenticatedUser authenticatedUser) - throws GuacamoleException { - - // No associated data whatsoever - return null; - - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - - // No update necessary - return context; - - } - - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public void shutdown() { - // Do nothing - } - } diff --git a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java index 7d27a75fc..0b1a33dfb 100644 --- a/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java +++ b/extensions/guacamole-auth-duo/src/main/java/org/apache/guacamole/auth/duo/DuoAuthenticationProvider.java @@ -22,9 +22,8 @@ package org.apache.guacamole.auth.duo; import com.google.inject.Guice; import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.apache.guacamole.net.auth.AuthenticationProvider; -import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.net.auth.UserContext; /** @@ -32,7 +31,7 @@ import org.apache.guacamole.net.auth.UserContext; * authentication factor for users which have already been authenticated by * some other AuthenticationProvider. */ -public class DuoAuthenticationProvider implements AuthenticationProvider { +public class DuoAuthenticationProvider extends AbstractAuthenticationProvider { /** * Injector which will manage the object graph of this authentication @@ -62,23 +61,6 @@ public class DuoAuthenticationProvider implements AuthenticationProvider { return "duo"; } - @Override - public Object getResource() { - return null; - } - - @Override - public AuthenticatedUser authenticateUser(Credentials credentials) - throws GuacamoleException { - return null; - } - - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - return authenticatedUser; - } - @Override public UserContext getUserContext(AuthenticatedUser authenticatedUser) throws GuacamoleException { @@ -95,30 +77,4 @@ public class DuoAuthenticationProvider implements AuthenticationProvider { } - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public void shutdown() { - // Do nothing - } - } diff --git a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java index ca19b3999..5478ea576 100644 --- a/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java +++ b/extensions/guacamole-auth-header/src/main/java/org/apache/guacamole/auth/header/HTTPHeaderAuthenticationProvider.java @@ -22,10 +22,9 @@ package org.apache.guacamole.auth.header; import com.google.inject.Guice; import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; -import org.apache.guacamole.net.auth.UserContext; /** * Guacamole authentication backend which authenticates users using an @@ -33,7 +32,7 @@ import org.apache.guacamole.net.auth.UserContext; * provided - only authentication. Storage must be provided by some other * extension. */ -public class HTTPHeaderAuthenticationProvider implements AuthenticationProvider { +public class HTTPHeaderAuthenticationProvider extends AbstractAuthenticationProvider { /** * Injector which will manage the object graph of this authentication @@ -63,11 +62,6 @@ public class HTTPHeaderAuthenticationProvider implements AuthenticationProvider return "header"; } - @Override - public Object getResource() { - return null; - } - @Override public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { @@ -78,52 +72,4 @@ public class HTTPHeaderAuthenticationProvider implements AuthenticationProvider } - @Override - public AuthenticatedUser updateAuthenticatedUser( - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - - // No update necessary - return authenticatedUser; - - } - - @Override - public UserContext getUserContext(AuthenticatedUser authenticatedUser) - throws GuacamoleException { - - // No associated data whatsoever - return null; - - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - - // No update necessary - return context; - - } - - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public void shutdown() { - // Do nothing - } - } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java index 0e3e84b41..fddb20447 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/InjectedAuthenticationProvider.java @@ -21,7 +21,7 @@ package org.apache.guacamole.auth.jdbc; import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.net.auth.AuthenticationProvider; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.net.auth.UserContext; import org.apache.guacamole.net.auth.AuthenticatedUser; @@ -34,7 +34,7 @@ import org.apache.guacamole.net.auth.AuthenticatedUser; * AuthenticationProvider, even though it is the AuthenticationProvider that * serves as the entry point. */ -public abstract class InjectedAuthenticationProvider implements AuthenticationProvider { +public abstract class InjectedAuthenticationProvider extends AbstractAuthenticationProvider { /** * The AuthenticationProviderService to which all AuthenticationProvider @@ -70,26 +70,12 @@ public abstract class InjectedAuthenticationProvider implements AuthenticationPr } - @Override - public Object getResource() throws GuacamoleException { - return null; - } - @Override public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { return authProviderService.authenticateUser(this, credentials); } - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - - // No need to update authenticated users - return authenticatedUser; - - } - @Override public UserContext getUserContext(AuthenticatedUser authenticatedUser) throws GuacamoleException { @@ -104,23 +90,4 @@ public abstract class InjectedAuthenticationProvider implements AuthenticationPr authenticatedUser, credentials); } - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public void shutdown() { - // Do nothing - } - } diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java index 4bc54b562..39500078a 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/sharing/user/SharedUserContext.java @@ -20,27 +20,16 @@ package org.apache.guacamole.auth.jdbc.sharing.user; import com.google.inject.Inject; -import java.util.Collection; -import java.util.Collections; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.jdbc.sharing.connection.SharedConnectionDirectory; import org.apache.guacamole.auth.jdbc.sharing.connectiongroup.SharedRootConnectionGroup; import org.apache.guacamole.auth.jdbc.user.RemoteAuthenticatedUser; -import org.apache.guacamole.form.Form; -import org.apache.guacamole.net.auth.ActiveConnection; -import org.apache.guacamole.net.auth.ActivityRecord; -import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.AbstractUserContext; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; import org.apache.guacamole.net.auth.ConnectionGroup; -import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; -import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; -import org.apache.guacamole.net.auth.UserContext; -import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; -import org.apache.guacamole.net.auth.simple.SimpleConnectionGroupDirectory; -import org.apache.guacamole.net.auth.simple.SimpleDirectory; /** * The user context of a SharedUser, providing access ONLY to the user @@ -48,7 +37,7 @@ import org.apache.guacamole.net.auth.simple.SimpleDirectory; * keys, and an internal root connection group containing only those * connections. */ -public class SharedUserContext implements UserContext { +public class SharedUserContext extends AbstractUserContext { /** * The AuthenticationProvider that created this SharedUserContext. @@ -67,18 +56,6 @@ public class SharedUserContext implements UserContext { @Inject private SharedConnectionDirectory connectionDirectory; - /** - * A directory of all connection groups visible to the user for whom this - * user context was created. - */ - private Directory connectionGroupDirectory; - - /** - * A directory of all users visible to the user for whom this user context - * was created. - */ - private Directory userDirectory; - /** * The root connection group of the hierarchy containing all connections * and connection groups visible to the user for whom this user context was @@ -110,15 +87,10 @@ public class SharedUserContext implements UserContext { // The connection group directory contains only the root group this.rootGroup = new SharedRootConnectionGroup(this); - this.connectionGroupDirectory = new SimpleConnectionGroupDirectory( - Collections.singletonList(this.rootGroup)); // Create internal pseudo-account representing the authenticated user this.self = new SharedUser(user, this); - // Do not provide access to any user accounts via the directory - this.userDirectory = new SimpleDirectory(); - } /** @@ -138,83 +110,20 @@ public class SharedUserContext implements UserContext { return self; } - @Override - public Object getResource() throws GuacamoleException { - return null; - } - @Override public AuthenticationProvider getAuthenticationProvider() { return authProvider; } - @Override - public Directory getUserDirectory() { - return userDirectory; - } - @Override public Directory getConnectionDirectory() throws GuacamoleException { return connectionDirectory; } - @Override - public Directory getConnectionGroupDirectory() { - return connectionGroupDirectory; - } - - @Override - public Directory getActiveConnectionDirectory() - throws GuacamoleException { - return new SimpleDirectory(); - } - - @Override - public Directory getSharingProfileDirectory() - throws GuacamoleException { - return new SimpleDirectory(); - } - - @Override - public ActivityRecordSet getConnectionHistory() { - return new SimpleActivityRecordSet(); - } - - @Override - public ActivityRecordSet getUserHistory() - throws GuacamoleException { - return new SimpleActivityRecordSet(); - } - @Override public ConnectionGroup getRootConnectionGroup() { return rootGroup; } - @Override - public Collection
getUserAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getConnectionAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getConnectionGroupAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getSharingProfileAttributes() { - return Collections.emptyList(); - } - - @Override - public void invalidate() { - // Nothing to invalidate - } - } diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java index 2d8dfd748..31aa4e2e2 100644 --- a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/LDAPAuthenticationProvider.java @@ -23,8 +23,8 @@ package org.apache.guacamole.auth.ldap; import com.google.inject.Guice; import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.net.auth.UserContext; @@ -33,7 +33,7 @@ import org.apache.guacamole.net.auth.UserContext; * any number of authorized configurations. Authorized configurations may be * shared. */ -public class LDAPAuthenticationProvider implements AuthenticationProvider { +public class LDAPAuthenticationProvider extends AbstractAuthenticationProvider { /** * The identifier reserved for the root connection group. @@ -68,11 +68,6 @@ public class LDAPAuthenticationProvider implements AuthenticationProvider { return "ldap"; } - @Override - public String getResource() { - return null; - } - @Override public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { @@ -81,12 +76,6 @@ public class LDAPAuthenticationProvider implements AuthenticationProvider { } - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - return authenticatedUser; - } - @Override public UserContext getUserContext(AuthenticatedUser authenticatedUser) throws GuacamoleException { @@ -96,31 +85,4 @@ public class LDAPAuthenticationProvider implements AuthenticationProvider { } - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - return context; - } - - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public void shutdown() { - // Do nothing - } - } - diff --git a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java index 5e19dcaa1..26ea6b319 100644 --- a/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java +++ b/extensions/guacamole-auth-ldap/src/main/java/org/apache/guacamole/auth/ldap/user/UserContext.java @@ -21,26 +21,18 @@ package org.apache.guacamole.auth.ldap.user; import com.google.inject.Inject; import com.novell.ldap.LDAPConnection; -import java.util.Collection; import java.util.Collections; -import org.apache.guacamole.auth.ldap.LDAPAuthenticationProvider; import org.apache.guacamole.auth.ldap.connection.ConnectionService; import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.form.Form; -import org.apache.guacamole.net.auth.ActiveConnection; -import org.apache.guacamole.net.auth.ActivityRecord; -import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.auth.ldap.LDAPAuthenticationProvider; +import org.apache.guacamole.net.auth.AbstractUserContext; import org.apache.guacamole.net.auth.AuthenticatedUser; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; import org.apache.guacamole.net.auth.ConnectionGroup; -import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; -import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; -import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; import org.apache.guacamole.net.auth.simple.SimpleConnectionGroup; -import org.apache.guacamole.net.auth.simple.SimpleConnectionGroupDirectory; import org.apache.guacamole.net.auth.simple.SimpleDirectory; import org.apache.guacamole.net.auth.simple.SimpleUser; import org.slf4j.Logger; @@ -50,7 +42,7 @@ import org.slf4j.LoggerFactory; * An LDAP-specific implementation of UserContext which queries all Guacamole * connections and users from the LDAP directory. */ -public class UserContext implements org.apache.guacamole.net.auth.UserContext { +public class UserContext extends AbstractUserContext { /** * Logger for this class. @@ -94,12 +86,6 @@ public class UserContext implements org.apache.guacamole.net.auth.UserContext { */ private Directory connectionDirectory; - /** - * Directory containing all ConnectionGroup objects accessible to the user - * associated with this UserContext. - */ - private Directory connectionGroupDirectory; - /** * Reference to the root connection group. */ @@ -143,15 +129,12 @@ public class UserContext implements org.apache.guacamole.net.auth.UserContext { Collections.emptyList() ); - // Expose only the root group in the connection group directory - connectionGroupDirectory = new SimpleConnectionGroupDirectory(Collections.singleton(rootGroup)); - // Init self with basic permissions self = new SimpleUser( user.getIdentifier(), userDirectory.getIdentifiers(), connectionDirectory.getIdentifiers(), - connectionGroupDirectory.getIdentifiers() + Collections.singleton(LDAPAuthenticationProvider.ROOT_CONNECTION_GROUP) ); } @@ -161,11 +144,6 @@ public class UserContext implements org.apache.guacamole.net.auth.UserContext { return self; } - @Override - public String getResource() { - return null; - } - @Override public AuthenticationProvider getAuthenticationProvider() { return authProvider; @@ -182,64 +160,9 @@ public class UserContext implements org.apache.guacamole.net.auth.UserContext { return connectionDirectory; } - @Override - public Directory getConnectionGroupDirectory() - throws GuacamoleException { - return connectionGroupDirectory; - } - @Override public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { return rootGroup; } - @Override - public Directory getActiveConnectionDirectory() - throws GuacamoleException { - return new SimpleDirectory(); - } - - @Override - public Directory getSharingProfileDirectory() - throws GuacamoleException { - return new SimpleDirectory(); - } - - @Override - public ActivityRecordSet getConnectionHistory() - throws GuacamoleException { - return new SimpleActivityRecordSet(); - } - - @Override - public ActivityRecordSet getUserHistory() - throws GuacamoleException { - return new SimpleActivityRecordSet(); - } - - @Override - public Collection getUserAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getConnectionAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getConnectionGroupAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getSharingProfileAttributes() { - return Collections.emptyList(); - } - - @Override - public void invalidate() { - // Nothing to invalidate - } - } diff --git a/extensions/guacamole-auth-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProvider.java b/extensions/guacamole-auth-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProvider.java index cf0b96e41..04a372e55 100644 --- a/extensions/guacamole-auth-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProvider.java +++ b/extensions/guacamole-auth-openid/src/main/java/org/apache/guacamole/auth/openid/OpenIDAuthenticationProvider.java @@ -22,10 +22,9 @@ package org.apache.guacamole.auth.openid; import com.google.inject.Guice; import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; -import org.apache.guacamole.net.auth.UserContext; /** * Guacamole authentication backend which authenticates users using an @@ -33,7 +32,7 @@ import org.apache.guacamole.net.auth.UserContext; * provided - only authentication. Storage must be provided by some other * extension. */ -public class OpenIDAuthenticationProvider implements AuthenticationProvider { +public class OpenIDAuthenticationProvider extends AbstractAuthenticationProvider { /** * Injector which will manage the object graph of this authentication @@ -63,11 +62,6 @@ public class OpenIDAuthenticationProvider implements AuthenticationProvider { return "openid"; } - @Override - public Object getResource() throws GuacamoleException { - return null; - } - @Override public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { @@ -78,52 +72,4 @@ public class OpenIDAuthenticationProvider implements AuthenticationProvider { } - @Override - public AuthenticatedUser updateAuthenticatedUser( - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - - // No update necessary - return authenticatedUser; - - } - - @Override - public UserContext getUserContext(AuthenticatedUser authenticatedUser) - throws GuacamoleException { - - // No associated data whatsoever - return null; - - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - - // No update necessary - return context; - - } - - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public void shutdown() { - // Do nothing - } - } diff --git a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProvider.java b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProvider.java index 02c23dec7..49d84bb76 100644 --- a/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProvider.java +++ b/extensions/guacamole-auth-radius/src/main/java/org/apache/guacamole/auth/radius/RadiusAuthenticationProvider.java @@ -23,17 +23,16 @@ package org.apache.guacamole.auth.radius; import com.google.inject.Guice; import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; -import org.apache.guacamole.net.auth.UserContext; /** * Allows users to be authenticated against an RADIUS server. Each user may have * any number of authorized configurations. Authorized configurations may be * shared. */ -public class RadiusAuthenticationProvider implements AuthenticationProvider { +public class RadiusAuthenticationProvider extends AbstractAuthenticationProvider { /** * Injector which will manage the object graph of this authentication @@ -63,30 +62,6 @@ public class RadiusAuthenticationProvider implements AuthenticationProvider { return "radius"; } - @Override - public Object getResource() throws GuacamoleException { - return null; - } - - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - - @Override - public void shutdown() { - // Do nothing - } - @Override public AuthenticatedUser authenticateUser(Credentials credentials) throws GuacamoleException { @@ -95,26 +70,4 @@ public class RadiusAuthenticationProvider implements AuthenticationProvider { } - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - return authenticatedUser; - } - - @Override - public UserContext getUserContext(AuthenticatedUser authenticatedUser) - throws GuacamoleException { - - return null; - - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - return context; - } - } - diff --git a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProvider.java b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProvider.java index 4f18304a7..0b91558ec 100644 --- a/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProvider.java +++ b/extensions/guacamole-auth-totp/src/main/java/org/apache/guacamole/auth/totp/TOTPAuthenticationProvider.java @@ -25,8 +25,8 @@ import com.google.inject.Injector; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.auth.totp.user.CodeUsageTrackingService; import org.apache.guacamole.auth.totp.user.TOTPUserContext; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; -import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Credentials; import org.apache.guacamole.net.auth.UserContext; @@ -35,7 +35,7 @@ import org.apache.guacamole.net.auth.UserContext; * authentication factor for users which have already been authenticated by * some other AuthenticationProvider. */ -public class TOTPAuthenticationProvider implements AuthenticationProvider { +public class TOTPAuthenticationProvider extends AbstractAuthenticationProvider { /** * Injector which will manage the object graph of this authentication @@ -64,36 +64,6 @@ public class TOTPAuthenticationProvider implements AuthenticationProvider { return "totp"; } - @Override - public Object getResource() { - return null; - } - - @Override - public AuthenticatedUser authenticateUser(Credentials credentials) - throws GuacamoleException { - return null; - } - - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - return authenticatedUser; - } - - @Override - public UserContext getUserContext(AuthenticatedUser authenticatedUser) - throws GuacamoleException { - return null; - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return context; - } - @Override public UserContext decorate(UserContext context, AuthenticatedUser authenticatedUser, Credentials credentials) diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java new file mode 100644 index 000000000..991f6a806 --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractAuthenticationProvider.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.guacamole.net.auth; + +import org.apache.guacamole.GuacamoleException; + +/** + * Base implementation of AuthenticationProvider which provides default + * implementations of most functions. Implementations must provide their + * own {@link getIdentifier()}, but otherwise need only override an implemented + * function if they wish to actually implement the functionality defined for + * that function by the AuthenticationProvider interface. + */ +public abstract class AbstractAuthenticationProvider implements AuthenticationProvider { + + @Override + public Object getResource() throws GuacamoleException { + return null; + } + + @Override + public AuthenticatedUser authenticateUser(Credentials credentials) + throws GuacamoleException { + return null; + } + + @Override + public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return authenticatedUser; + } + + @Override + public UserContext getUserContext(AuthenticatedUser authenticatedUser) + throws GuacamoleException { + return null; + } + + @Override + public UserContext updateUserContext(UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return context; + } + + @Override + public UserContext decorate(UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return context; + } + + @Override + public UserContext redecorate(UserContext decorated, UserContext context, + AuthenticatedUser authenticatedUser, + Credentials credentials) throws GuacamoleException { + return decorate(context, authenticatedUser, credentials); + } + + @Override + public void shutdown() { + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserContext.java new file mode 100644 index 000000000..25db3d59e --- /dev/null +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/AbstractUserContext.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.guacamole.net.auth; + +import java.util.Collection; +import java.util.Collections; +import org.apache.guacamole.GuacamoleException; +import org.apache.guacamole.form.Form; +import org.apache.guacamole.net.auth.simple.SimpleActivityRecordSet; +import org.apache.guacamole.net.auth.simple.SimpleConnectionGroup; +import org.apache.guacamole.net.auth.simple.SimpleDirectory; + +/** + * Base implementation of UserContext which provides default implementations of + * most functions. Implementations must provide their own {@link self()} and + * {@link getAuthenticationProvider()}, but otherwise need only override an + * implemented function if they wish to actually implement the functionality + * defined for that function by the UserContext interface. + */ +public abstract class AbstractUserContext implements UserContext { + + /** + * The unique identifier that will be used for the root connection group if + * {@link #getRootConnectionGroup()} is not overridden. + */ + protected static final String DEFAULT_ROOT_CONNECTION_GROUP = "ROOT"; + + @Override + public Object getResource() throws GuacamoleException { + return null; + } + + @Override + public Directory getUserDirectory() throws GuacamoleException { + return new SimpleDirectory(self()); + } + + @Override + public Directory getConnectionDirectory() + throws GuacamoleException { + return new SimpleDirectory(); + } + + @Override + public Directory getConnectionGroupDirectory() + throws GuacamoleException { + return new SimpleDirectory(getRootConnectionGroup()); + } + + @Override + public Directory getActiveConnectionDirectory() + throws GuacamoleException { + return new SimpleDirectory(); + } + + @Override + public Directory getSharingProfileDirectory() + throws GuacamoleException { + return new SimpleDirectory(); + } + + @Override + public ActivityRecordSet getConnectionHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + + @Override + public ActivityRecordSet getUserHistory() + throws GuacamoleException { + return new SimpleActivityRecordSet(); + } + + @Override + public ConnectionGroup getRootConnectionGroup() + throws GuacamoleException { + return new SimpleConnectionGroup( + DEFAULT_ROOT_CONNECTION_GROUP, + DEFAULT_ROOT_CONNECTION_GROUP, + getConnectionDirectory().getIdentifiers(), + Collections.emptySet() + ); + } + + @Override + public Collection getUserAttributes() { + return Collections.emptyList(); + } + + @Override + public Collection getConnectionAttributes() { + return Collections.emptyList(); + } + + @Override + public Collection getConnectionGroupAttributes() { + return Collections.emptyList(); + } + + @Override + public Collection getSharingProfileAttributes() { + return Collections.emptyList(); + } + + @Override + public void invalidate() { + } + +} diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java index b29c2d794..837f1d701 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleAuthenticationProvider.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.UUID; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.net.auth.AbstractAuthenticatedUser; +import org.apache.guacamole.net.auth.AbstractAuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.AuthenticatedUser; import org.apache.guacamole.net.auth.Credentials; @@ -42,7 +43,7 @@ import org.apache.guacamole.token.TokenFilter; * the AuthenticationProvider interface of older Guacamole releases. */ public abstract class SimpleAuthenticationProvider - implements AuthenticationProvider { + extends AbstractAuthenticationProvider { /** * Given an arbitrary credentials object, returns a Map containing all @@ -203,11 +204,6 @@ public abstract class SimpleAuthenticationProvider } - @Override - public Object getResource() throws GuacamoleException { - return null; - } - @Override public AuthenticatedUser authenticateUser(final Credentials credentials) throws GuacamoleException { @@ -241,45 +237,4 @@ public abstract class SimpleAuthenticationProvider } - @Override - public AuthenticatedUser updateAuthenticatedUser(AuthenticatedUser authenticatedUser, - Credentials credentials) throws GuacamoleException { - - // Simply return the given user, updating nothing - return authenticatedUser; - - } - - @Override - public UserContext updateUserContext(UserContext context, - AuthenticatedUser authorizedUser, Credentials credentials) - throws GuacamoleException { - - // Simply return the given context, updating nothing - return context; - - } - - @Override - public UserContext decorate(UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - - // Simply return the given context, decorating nothing - return context; - - } - - @Override - public UserContext redecorate(UserContext decorated, UserContext context, - AuthenticatedUser authenticatedUser, Credentials credentials) - throws GuacamoleException { - return decorate(context, authenticatedUser, credentials); - } - - @Override - public void shutdown() { - // Do nothing - } - } diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleDirectory.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleDirectory.java index 03a14d960..1e184c4ed 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleDirectory.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleDirectory.java @@ -20,10 +20,12 @@ package org.apache.guacamole.net.auth.simple; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import org.apache.guacamole.GuacamoleException; import org.apache.guacamole.GuacamoleSecurityException; import org.apache.guacamole.net.auth.Directory; @@ -54,7 +56,8 @@ public class SimpleDirectory /** * Creates a new SimpleDirectory which provides access to the objects - * contained within the given Map. + * contained within the given Map. The given Map will be used to back all + * operations on the SimpleDirectory, and must be threadsafe. * * @param objects * The Map of objects to provide access to. @@ -63,6 +66,30 @@ public class SimpleDirectory this.objects = objects; } + public SimpleDirectory(ObjectType object) { + this(Collections.singletonMap(object.getIdentifier(), object)); + } + + public SimpleDirectory(ObjectType... objects) { + this(Arrays.asList(objects)); + } + + /** + * Creates a new SimpleDirectory which provides access to the + * objects contained within the Collection. Note that a new Map will be + * created to store the given objects. If the objects are already available + * in Map form, it is more efficient to use the + * {@link #SimpleDirectory(java.util.Map)} constructor. + * + * @param objects + * A Collection of all objects that should be present in this directory. + */ + public SimpleDirectory(Collection objects) { + this.objects = new ConcurrentHashMap(objects.size()); + for (ObjectType object : objects) + this.objects.put(object.getIdentifier(), object); + } + /** * Sets the Map which backs this SimpleDirectory. Future function calls * which retrieve objects from this SimpleDirectory will use the provided diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java index 1678d8827..26978e9fb 100644 --- a/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java +++ b/guacamole-ext/src/main/java/org/apache/guacamole/net/auth/simple/SimpleUserContext.java @@ -19,24 +19,16 @@ package org.apache.guacamole.net.auth.simple; -import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Map; -import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import org.apache.guacamole.GuacamoleException; -import org.apache.guacamole.form.Form; -import org.apache.guacamole.net.auth.ActiveConnection; -import org.apache.guacamole.net.auth.ActivityRecord; -import org.apache.guacamole.net.auth.ActivityRecordSet; +import org.apache.guacamole.net.auth.AbstractUserContext; +import org.apache.guacamole.net.auth.AuthenticatedUser; import org.apache.guacamole.net.auth.AuthenticationProvider; import org.apache.guacamole.net.auth.Connection; -import org.apache.guacamole.net.auth.ConnectionGroup; -import org.apache.guacamole.net.auth.ConnectionRecord; import org.apache.guacamole.net.auth.Directory; -import org.apache.guacamole.net.auth.SharingProfile; import org.apache.guacamole.net.auth.User; -import org.apache.guacamole.net.auth.UserContext; import org.apache.guacamole.protocol.GuacamoleConfiguration; /** @@ -44,12 +36,7 @@ import org.apache.guacamole.protocol.GuacamoleConfiguration; * a defined and restricted set of GuacamoleConfigurations. Access to * querying or modifying either users or permissions is denied. */ -public class SimpleUserContext implements UserContext { - - /** - * The unique identifier of the root connection group. - */ - private static final String ROOT_IDENTIFIER = "ROOT"; +public class SimpleUserContext extends AbstractUserContext { /** * The AuthenticationProvider that created this UserContext. @@ -57,22 +44,10 @@ public class SimpleUserContext implements UserContext { private final AuthenticationProvider authProvider; /** - * Reference to the user whose permissions dictate the configurations - * accessible within this UserContext. + * The unique identifier (username) of the user whose permissions dictate + * the configurations accessible within this UserContext. */ - private final User self; - - /** - * The Directory with access only to the User associated with this - * UserContext. - */ - private final Directory userDirectory; - - /** - * The Directory with access only to the root group associated with this - * UserContext. - */ - private final Directory connectionGroupDirectory; + private final String username; /** * The Directory with access to all connections within the root group @@ -80,15 +55,11 @@ public class SimpleUserContext implements UserContext { */ private final Directory connectionDirectory; - /** - * The root connection group. - */ - private final ConnectionGroup rootGroup; - /** * Creates a new SimpleUserContext which provides access to only those - * configurations within the given Map. The username is assigned - * arbitrarily. + * configurations within the given Map. The username is set to the + * ANONYMOUS_IDENTIFIER defined by AuthenticatedUser, effectively declaring + * the current user as anonymous. * * @param authProvider * The AuthenticationProvider creating this UserContext. @@ -99,7 +70,7 @@ public class SimpleUserContext implements UserContext { */ public SimpleUserContext(AuthenticationProvider authProvider, Map configs) { - this(authProvider, UUID.randomUUID().toString(), configs); + this(authProvider, AuthenticatedUser.ANONYMOUS_IDENTIFIER, configs); } /** @@ -119,11 +90,8 @@ public class SimpleUserContext implements UserContext { public SimpleUserContext(AuthenticationProvider authProvider, String username, Map configs) { - Collection connectionIdentifiers = new ArrayList(configs.size()); - Collection connectionGroupIdentifiers = Collections.singleton(ROOT_IDENTIFIER); - - // Produce collection of connections from given configs - Collection connections = new ArrayList(configs.size()); + // Produce map of connections from given configs + Map connections = new ConcurrentHashMap(configs.size()); for (Map.Entry configEntry : configs.entrySet()) { // Get connection identifier and configuration @@ -132,37 +100,33 @@ public class SimpleUserContext implements UserContext { // Add as simple connection Connection connection = new SimpleConnection(identifier, identifier, config); - connection.setParentIdentifier(ROOT_IDENTIFIER); - connections.add(connection); + connection.setParentIdentifier(DEFAULT_ROOT_CONNECTION_GROUP); + connections.put(identifier, connection); - // Add identifier to overall set of identifiers - connectionIdentifiers.add(identifier); - } - - // Add root group that contains only the given configurations - this.rootGroup = new SimpleConnectionGroup( - ROOT_IDENTIFIER, ROOT_IDENTIFIER, - connectionIdentifiers, Collections.emptyList() - ); - // Build new user from credentials - this.self = new SimpleUser(username, connectionIdentifiers, - connectionGroupIdentifiers); - - // Create directories for new user - this.userDirectory = new SimpleUserDirectory(self); - this.connectionDirectory = new SimpleConnectionDirectory(connections); - this.connectionGroupDirectory = new SimpleConnectionGroupDirectory(Collections.singleton(this.rootGroup)); - - // Associate provided AuthenticationProvider + this.username = username; this.authProvider = authProvider; + this.connectionDirectory = new SimpleDirectory(connections); } @Override public User self() { - return self; + + try { + return new SimpleUser(username, + getConnectionDirectory().getIdentifiers(), + getConnectionGroupDirectory().getIdentifiers() + ); + } + + catch (GuacamoleException e) { + return new SimpleUser(username, + Collections.emptySet(), + Collections.emptySet()); + } + } @Override @@ -175,76 +139,10 @@ public class SimpleUserContext implements UserContext { return authProvider; } - @Override - public Directory getUserDirectory() - throws GuacamoleException { - return userDirectory; - } - @Override public Directory getConnectionDirectory() throws GuacamoleException { return connectionDirectory; } - @Override - public Directory getConnectionGroupDirectory() - throws GuacamoleException { - return connectionGroupDirectory; - } - - @Override - public ConnectionGroup getRootConnectionGroup() throws GuacamoleException { - return rootGroup; - } - - @Override - public Directory getSharingProfileDirectory() - throws GuacamoleException { - return new SimpleDirectory(); - } - - @Override - public Directory getActiveConnectionDirectory() - throws GuacamoleException { - return new SimpleDirectory(); - } - - @Override - public ActivityRecordSet getConnectionHistory() - throws GuacamoleException { - return new SimpleActivityRecordSet(); - } - - @Override - public ActivityRecordSet getUserHistory() - throws GuacamoleException { - return new SimpleActivityRecordSet(); - } - - @Override - public Collection getUserAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getConnectionAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getConnectionGroupAttributes() { - return Collections.emptyList(); - } - - @Override - public Collection getSharingProfileAttributes() { - return Collections.emptyList(); - } - - @Override - public void invalidate() { - // Nothing to invalidate - } - }