/*
* Copyright (c) 2009-2010 Lockheed Martin Corporation
*
* 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 org.eurekastreams.server.service.opensocial.gadgets.oauth;
import net.oauth.OAuthServiceProvider;
import org.apache.commons.logging.Log;
import org.apache.shindig.auth.SecurityToken;
import org.apache.shindig.gadgets.GadgetException;
import org.apache.shindig.gadgets.oauth.OAuthStore;
import org.eurekastreams.commons.actions.context.service.ServiceActionContext;
import org.eurekastreams.commons.actions.service.ServiceAction;
import org.eurekastreams.commons.exceptions.ExecutionException;
import org.eurekastreams.commons.logging.LogFactory;
import org.eurekastreams.commons.server.service.ActionController;
import org.eurekastreams.server.action.request.opensocial.GetConsumerInfoRequest;
import org.eurekastreams.server.action.request.opensocial.GetConsumerTokenInfoRequest;
import org.eurekastreams.server.action.request.opensocial.RemoveConsumerTokenRequest;
import org.eurekastreams.server.action.request.opensocial.SetConsumerTokenInfoRequest;
import org.eurekastreams.server.action.response.opensocial.ConsumerInfoResponse;
import org.eurekastreams.server.action.response.opensocial.TokenInfoResponse;
import com.google.inject.Inject;
import com.google.inject.name.Named;
/**
* {@link OAuthStore} implementation that uses action framework to retrieve and persist OAuth tokens and consumers. This
* implementation covers Shindig's role as an OAuth Proxy for Gadgets wishing to use external OAuth resources.
*/
public class OAuthStoreImpl implements OAuthStore
{
/**
* Local instance of logger.
*/
private Log logger = LogFactory.make();
/**
* Instance of the {@link ActionController} for this class.
*/
@Inject
private ActionController actionController;
/**
* Instance of the getConsumerInfo Service Action.
*/
private final ServiceAction getConsumerInfoAction;
/**
* Instance of the setConsumerTokenInfo Service Action.
*/
private final ServiceAction setConsumerTokenInfoAction;
/**
* Instance of the getConsumerTokenInfo Service Action.
*/
private final ServiceAction getConsumerTokenInfoAction;
/**
* Instance of the removeConsumerToken Service Action.
*/
private final ServiceAction removeConsumerTokenAction;
/**
* Constructor.
*
* @param inGetConsumerInfoAction
* instance of {@link ServiceAction} for CreateOAuthRequestToken Service Action.
* @param inSetConsumerTokenInfoAction
* instance of {@link ServiceAction} for OAuthAuthorize.
* @param inGetConsumerTokenInfoAction
* instance of UpdateRequestToAccessToken {@link ServiceAction}.
* @param inRemoveConsumerTokenAction
* instance of GetOAuthEntryByToken {@link ServiceAction}.
*/
@Inject
public OAuthStoreImpl(@Named("getConsumerInfo") final ServiceAction inGetConsumerInfoAction,
@Named("setConsumerTokenInfo") final ServiceAction inSetConsumerTokenInfoAction,
@Named("getConsumerTokenInfo") final ServiceAction inGetConsumerTokenInfoAction,
@Named("removeConsumerToken") final ServiceAction inRemoveConsumerTokenAction)
{
getConsumerInfoAction = inGetConsumerInfoAction;
setConsumerTokenInfoAction = inSetConsumerTokenInfoAction;
getConsumerTokenInfoAction = inGetConsumerTokenInfoAction;
removeConsumerTokenAction = inRemoveConsumerTokenAction;
}
/**
* Setter.
*
* @param inServiceActionController
* instance of the {@link ActionController}.
*/
public void setServiceActionController(final ActionController inServiceActionController)
{
actionController = inServiceActionController;
}
/**
* Retrieves information about the OAuth consumer, most importantly the consumer key and secret.
*
* @param securityToken
* the token itself.
* @param serviceName
* the nickname for the service provider.
* @param provider
* information about the OAuth service provider.
* @return the persisted consumer information.
* @throws GadgetException
* if the consumer was not configured.
*/
public ConsumerInfo getConsumerKeyAndSecret(final SecurityToken securityToken, final String serviceName,
final OAuthServiceProvider provider) throws GadgetException
{
ConsumerInfo consumerInfo = null;
try
{
GetConsumerInfoRequest request = new GetConsumerInfoRequest(securityToken, serviceName, provider);
ServiceActionContext currentContext = new ServiceActionContext(request, null);
ConsumerInfoResponse response = (ConsumerInfoResponse) actionController.execute(currentContext,
getConsumerInfoAction);
consumerInfo = response.getConsumerInfo();
}
catch (Exception ex)
{
logger.error("Error occurred getting consumer info.", ex);
throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR, ex.getMessage());
}
return consumerInfo;
}
/**
* Puts a token into the store.
*
* @param securityToken
* the token itself.
* @param consumerInfo
* information about the consumer.
* @param serviceName
* the nickname for the service provider.
* @param tokenName
* the name for the token.
* @param tokenInfo
* information about the token.
* @throws GadgetException
* if the consumer was not configured.
*/
public void setTokenInfo(final SecurityToken securityToken, final ConsumerInfo consumerInfo,
final String serviceName, final String tokenName, final TokenInfo tokenInfo) throws GadgetException
{
try
{
SetConsumerTokenInfoRequest request = new SetConsumerTokenInfoRequest(securityToken, consumerInfo,
serviceName, tokenName, tokenInfo);
ServiceActionContext currentContext = new ServiceActionContext(request, null);
actionController.execute(currentContext, setConsumerTokenInfoAction);
}
catch (ExecutionException ex)
{
logger.error("Error occurred setting consumer token info.", ex);
throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR, ex.getMessage());
}
}
/**
* Retrieves the token from the store or null if the token was not found or has expired.
*
* @param securityToken
* the token itself.
* @param consumerInfo
* information about the consumer.
* @param serviceName
* the nickname for the service provider.
* @param tokenName
* the name for the token.
* @return the persisted token.
* @throws GadgetException
* if the consumer was not configured.
*/
public TokenInfo getTokenInfo(final SecurityToken securityToken, final ConsumerInfo consumerInfo,
final String serviceName, final String tokenName) throws GadgetException
{
TokenInfo tokenInfo = null;
try
{
GetConsumerTokenInfoRequest request = new GetConsumerTokenInfoRequest(securityToken, consumerInfo,
serviceName, tokenName);
ServiceActionContext currentContext = new ServiceActionContext(request, null);
TokenInfoResponse response = (TokenInfoResponse) actionController.execute(currentContext,
getConsumerTokenInfoAction);
if (response != null)
{
tokenInfo = response.getTokenInfo();
}
}
catch (Exception ex)
{
logger.error("Error occurred getting consumer token info.", ex);
throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR, ex.getMessage());
}
return tokenInfo;
}
/**
* Remove the token from the store.
*
* @param securityToken
* the token itself.
* @param consumerInfo
* information about the consumer.
* @param serviceName
* the nickname for the service provider.
* @param tokenName
* the name for the token.
* @throws GadgetException
* if the consumer was not configured.
*/
public void removeToken(final SecurityToken securityToken, final ConsumerInfo consumerInfo,
final String serviceName, final String tokenName) throws GadgetException
{
try
{
RemoveConsumerTokenRequest request = new RemoveConsumerTokenRequest(securityToken, consumerInfo,
serviceName, tokenName);
ServiceActionContext currentContext = new ServiceActionContext(request, null);
actionController.execute(currentContext, removeConsumerTokenAction);
}
catch (ExecutionException ex)
{
logger.error("Error occurred removing consumer token.", ex);
throw new GadgetException(GadgetException.Code.INTERNAL_SERVER_ERROR, ex.getMessage());
}
}
}