/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.security.sso.facebook.connect.internal;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.facebook.FacebookConnect;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.module.configuration.ConfigurationException;
import com.liferay.portal.kernel.module.configuration.ConfigurationProvider;
import com.liferay.portal.kernel.settings.CompanyServiceSettingsLocator;
import com.liferay.portal.kernel.util.Http;
import com.liferay.portal.kernel.util.Portal;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.security.sso.facebook.connect.configuration.FacebookConnectConfiguration;
import com.liferay.portal.security.sso.facebook.connect.constants.FacebookConnectConstants;
import com.liferay.portal.security.sso.facebook.connect.constants.FacebookConnectWebKeys;
import javax.portlet.PortletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* Implements the OAuth protocol for Facebook Connect.
*
* <p>
* This class is utilized by many of the other Facebook Connect classes via
* {@link com.liferay.portal.facebook.FacebookConnectUtil}, which exposes all of
* its methods statically.
* </p>
*
* @author Wilson Man
* @author Mika Koivisto
*/
@Component(
configurationPid = "com.liferay.portal.security.sso.facebook.connect.configuration.FacebookConnectConfiguration",
immediate = true, service = FacebookConnect.class
)
public class FacebookConnectImpl implements FacebookConnect {
@Override
public String getAccessToken(long companyId, String redirect, String code) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
String url = _http.addParameter(
facebookConnectConfiguration.oauthTokenURL(), "client_id",
facebookConnectConfiguration.appId());
String facebookConnectRedirectURL =
facebookConnectConfiguration.oauthRedirectURL();
url = _http.addParameter(
url, "redirect_uri", facebookConnectRedirectURL);
facebookConnectRedirectURL = _http.addParameter(
facebookConnectRedirectURL, "redirect", redirect);
url = _http.addParameter(
url, "redirect_uri", facebookConnectRedirectURL);
url = _http.addParameter(
url, "client_secret", facebookConnectConfiguration.appSecret());
url = _http.addParameter(url, "code", code);
Http.Options options = new Http.Options();
options.setLocation(url);
options.setPost(true);
try {
String content = _http.URLtoString(options);
JSONObject contentJSONObject = JSONFactoryUtil.createJSONObject(
content);
String accessToken = contentJSONObject.getString("access_token");
if (Validator.isNotNull(accessToken)) {
return accessToken;
}
}
catch (Exception e) {
throw new SystemException(
"Unable to retrieve Facebook access token", e);
}
return null;
}
@Override
public String getAccessTokenURL(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.oauthTokenURL();
}
@Override
public String getAppId(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.appId();
}
@Override
public String getAppSecret(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.appSecret();
}
@Override
public String getAuthURL(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.oauthAuthURL();
}
@Override
public JSONObject getGraphResources(
long companyId, String path, String accessToken, String fields) {
try {
String url = _http.addParameter(
getGraphURL(companyId).concat(path), "access_token",
accessToken);
if (Validator.isNotNull(fields)) {
url = _http.addParameter(url, "fields", fields);
}
Http.Options options = new Http.Options();
options.setLocation(url);
String json = _http.URLtoString(options);
return JSONFactoryUtil.createJSONObject(json);
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(e, e);
}
}
return null;
}
@Override
public String getGraphURL(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.graphURL();
}
@Override
public String getProfileImageURL(PortletRequest portletRequest) {
HttpServletRequest request = _portal.getHttpServletRequest(
portletRequest);
request = _portal.getOriginalServletRequest(request);
HttpSession session = request.getSession();
String facebookId = (String)session.getAttribute(
FacebookConnectWebKeys.FACEBOOK_USER_ID);
if (Validator.isNull(facebookId)) {
return null;
}
long companyId = _portal.getCompanyId(request);
String token = (String)session.getAttribute(
FacebookConnectWebKeys.FACEBOOK_ACCESS_TOKEN);
JSONObject jsonObject = getGraphResources(
companyId, "/me", token, "id,picture");
return jsonObject.getString("picture");
}
@Override
public String getRedirectURL(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.oauthRedirectURL();
}
@Override
public boolean isEnabled(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.enabled();
}
@Override
public boolean isVerifiedAccountRequired(long companyId) {
FacebookConnectConfiguration facebookConnectConfiguration =
getFacebookConnectConfiguration(companyId);
return facebookConnectConfiguration.verifiedAccountRequired();
}
protected FacebookConnectConfiguration getFacebookConnectConfiguration(
long companyId) {
try {
FacebookConnectConfiguration facebookConnectCompanyServiceSettings =
_configurationProvider.getConfiguration(
FacebookConnectConfiguration.class,
new CompanyServiceSettingsLocator(
companyId, FacebookConnectConstants.SERVICE_NAME));
return facebookConnectCompanyServiceSettings;
}
catch (ConfigurationException ce) {
_log.error("Unable to get Facebook Connect configuration", ce);
}
return null;
}
@Reference(unbind = "-")
protected void setConfigurationProvider(
ConfigurationProvider configurationProvider) {
_configurationProvider = configurationProvider;
}
private static final Log _log = LogFactoryUtil.getLog(
FacebookConnectImpl.class);
private ConfigurationProvider _configurationProvider;
@Reference
private Http _http;
@Reference
private Portal _portal;
}