package com.ibm.sbt.opensocial.domino.modules;
import java.util.List;
import java.util.logging.Logger;
import org.apache.shindig.common.Nullable;
import org.apache.shindig.common.crypto.BlobCrypter;
import org.apache.shindig.common.servlet.Authority;
import org.apache.shindig.gadgets.GadgetSpecFactory;
import org.apache.shindig.gadgets.http.HttpFetcher;
import org.apache.shindig.gadgets.oauth.OAuthModule;
import org.apache.shindig.gadgets.oauth.OAuthStore;
import org.apache.shindig.gadgets.oauth2.OAuth2FetcherConfig;
import org.apache.shindig.gadgets.oauth2.OAuth2Module;
import org.apache.shindig.gadgets.oauth2.OAuth2Request;
import org.apache.shindig.gadgets.oauth2.OAuth2RequestParameterGenerator;
import org.apache.shindig.gadgets.oauth2.handler.AuthorizationEndpointResponseHandler;
import org.apache.shindig.gadgets.oauth2.handler.ClientAuthenticationHandler;
import org.apache.shindig.gadgets.oauth2.handler.GrantRequestHandler;
import org.apache.shindig.gadgets.oauth2.handler.ResourceRequestHandler;
import org.apache.shindig.gadgets.oauth2.handler.TokenEndpointResponseHandler;
import org.apache.shindig.gadgets.oauth2.persistence.OAuth2Cache;
import org.apache.shindig.gadgets.oauth2.persistence.OAuth2Encrypter;
import org.apache.shindig.gadgets.oauth2.persistence.OAuth2Persister;
import org.apache.shindig.gadgets.oauth2.persistence.sample.OAuth2PersistenceModule;
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
import com.google.inject.util.Modules;
import com.ibm.sbt.opensocial.domino.container.ContainerExtPointManager;
import com.ibm.sbt.opensocial.domino.oauth.DominoOAuth2Cache;
import com.ibm.sbt.opensocial.domino.oauth.DominoOAuth2Persister;
import com.ibm.sbt.opensocial.domino.oauth.DominoOAuth2Request;
import com.ibm.sbt.opensocial.domino.oauth.DominoOAuth2TokenStore;
import com.ibm.sbt.opensocial.domino.oauth.DominoOAuthStoreProvider;
/**
* Provides implementations for OAuth 1.0 and 2.0 stores in the Playground.
* Shindig will retrieve and store keys and secrets through these modules.
*
*/
public class DominoOAuthModule extends AbstractModule {
@Override
protected void configure() {
// OAuth1.0a
install(Modules.override(new OAuthModule()).with(new OAuthModuleOverride()));
// OAuth2
bind(DominoOAuth2TokenStore.class).toProvider(DominoOAuth2TokenStoreProvider.class);
install(Modules.override(new OAuth2Module()).with(new OAuth2ModuleOverride()));
install(Modules.override(new OAuth2PersistenceModule()).with(new OAuth2PersistenceModuleOverride()));
}
private static class OAuthModuleOverride extends AbstractModule {
@Override
protected void configure() {
bind(OAuthStore.class).toProvider(DominoOAuthStoreProvider.class);
}
}
private static class OAuth2ModuleOverride extends AbstractModule {
@Override
protected void configure() {
this.bind(OAuth2Request.class).toProvider(DominoOAuth2RequestProvider.class);
}
}
private static class OAuth2PersistenceModuleOverride extends AbstractModule {
@Override
protected void configure() {
bind(OAuth2Cache.class).to(DominoOAuth2Cache.class);
bind(OAuth2Persister.class).to(DominoOAuth2Persister.class);
}
}
public static class DominoOAuth2RequestProvider implements Provider<OAuth2Request> {
private final DominoOAuth2TokenStore store;
private final HttpFetcher fetcher;
private final List<AuthorizationEndpointResponseHandler> authorizationEndpointResponseHandlers;
private final List<ClientAuthenticationHandler> clientAuthenticationHandlers;
private final List<GrantRequestHandler> grantRequestHandlers;
private final List<ResourceRequestHandler> resourceRequestHandlers;
private final List<TokenEndpointResponseHandler> tokenEndpointResponseHandlers;
private final boolean sendTraceToClient;
private final OAuth2RequestParameterGenerator requestParameterGenerator;
private final Logger log;
@Inject
public DominoOAuth2RequestProvider(final DominoOAuth2TokenStore store, final HttpFetcher fetcher,
final List<AuthorizationEndpointResponseHandler> authorizationEndpointResponseHandlers,
final List<ClientAuthenticationHandler> clientAuthenticationHandlers,
final List<GrantRequestHandler> grantRequestHandlers,
final List<ResourceRequestHandler> resourceRequestHandlers,
final List<TokenEndpointResponseHandler> tokenEndpointResponseHandlers,
@Named(OAuth2Module.SEND_TRACE_TO_CLIENT)
final boolean sendTraceToClient,
final OAuth2RequestParameterGenerator requestParameterGenerator,
final Logger log){
this.store = store;
this.fetcher = fetcher;
this.authorizationEndpointResponseHandlers = authorizationEndpointResponseHandlers;
this.clientAuthenticationHandlers = clientAuthenticationHandlers;
this.grantRequestHandlers = grantRequestHandlers;
this.resourceRequestHandlers = resourceRequestHandlers;
this.tokenEndpointResponseHandlers = tokenEndpointResponseHandlers;
this.sendTraceToClient = sendTraceToClient;
this.requestParameterGenerator = requestParameterGenerator;
this.log = log;
}
@Override
public OAuth2Request get() {
return new DominoOAuth2Request(store, fetcher, authorizationEndpointResponseHandlers,
clientAuthenticationHandlers, grantRequestHandlers, resourceRequestHandlers,
tokenEndpointResponseHandlers, sendTraceToClient, requestParameterGenerator,
sendTraceToClient, log);
}
}
@Singleton
public static class DominoOAuth2TokenStoreProvider implements Provider<DominoOAuth2TokenStore> {
private DominoOAuth2TokenStore store;
@Inject
public DominoOAuth2TokenStoreProvider(final @Named(OAuth2FetcherConfig.OAUTH2_STATE_CRYPTER) BlobCrypter stateCrypter,
final @Named("shindig.oauth2.global-redirect-uri") String globalRedirectUri,
final GadgetSpecFactory specFactory, final ContainerExtPointManager extPointManager, Logger log,
final OAuth2Encrypter encrypter, Authority authority,
@Nullable @Named("shindig.contextroot") String contextRoot) {
this.store = new DominoOAuth2TokenStore(specFactory, extPointManager, log, encrypter, authority,
contextRoot, stateCrypter, globalRedirectUri);
}
@Override
public DominoOAuth2TokenStore get() {
return store;
}
}
}