package com.salesmanager.core.util.www.integration.fb; import java.net.URLEncoder; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.codehaus.jackson.map.ObjectMapper; import com.restfb.FacebookClient; import com.salesmanager.core.entity.reference.Page; public class FacebookIntegrationFactory { private static Logger log = Logger.getLogger(FacebookIntegrationFactory.class); private static final String FACEBOOK_USER_CLIENT = "facebook.user.client"; private static final String perms = "publish_stream,email,user_online_presence,user_likes"; /** * - Check if exist in http session * - Check if authenticated * @param request * @param page */ public static FacebookUser getFacebookUser(HttpServletRequest request, Page page) { FacebookUser user = new FacebookUser(); try { HttpSession session = request.getSession(); user = (FacebookUser)session.getAttribute(FACEBOOK_USER_CLIENT); if(user==null) { user = new FacebookUser(); user.setClientId(page.getProperty2()); user.setApplicationSecret(page.getProperty4()); user.setApplicationKey(page.getProperty5()); session.setAttribute(FACEBOOK_USER_CLIENT, user); } String error_reason = request.getParameter("error_reason"); if(!StringUtils.isBlank(error_reason)) { user.setOauth_token(null); user.setExpires(null); user.setAuthorized(false); return user; } String signed_request = request.getParameter("signed_request"); if(!StringUtils.isBlank(signed_request)) { user.setAuthenticated(true); if (signed_request == null) throw new Exception("Invalid signature."); String[] parts = signed_request.split("\\."); if (parts.length != 2) throw new Exception("Invalid signature."); String encSig = parts[0]; String encPayload = parts[1]; Base64 decoder = new Base64(true); Map<String, String> data; try { String o = new String(decoder.decode(encPayload.getBytes())); o = o.trim(); data = new ObjectMapper().readValue(o, HashMap.class); String oauthtoken = data.get("oauth_token"); Iterator entries = data.entrySet().iterator(); while (entries.hasNext()) { Entry thisEntry = (Entry) entries.next(); Object key = thisEntry.getKey(); Object value = thisEntry.getValue(); log.debug("Got key " + key + " and value " + value); if(key.equals("page")) { if(value instanceof Map) { Iterator ientries = ((Map)value).entrySet().iterator(); while (ientries.hasNext()) { Entry iEntry = (Entry) ientries.next(); Object ikey = iEntry.getKey(); Object ivalue = iEntry.getValue(); log.debug("Got page key " + ikey + " and value " + ivalue + " type " + ivalue.getClass().getName()); if(ikey.equals("liked")) { if((Boolean)ivalue==true) { log.debug("User likes page [Boolean]"); user.setLikesPage(true); } break; } } } else { log.debug("value instanceof " + value.getClass().toString()); } } } //String expires = data.get("expires"); //System.out.println(oauthtoken); //System.out.println(expires); user.setOauth_token(oauthtoken); //user.setExpires(expires); } catch (Exception e) { throw new Exception("Failed to parse JSON session.", e); } try { int idx = signed_request.indexOf("."); byte[] sig = new Base64(true).decode(signed_request.substring(0, idx).getBytes()); String rawpayload = signed_request.substring(idx+1); SecretKeySpec secretKeySpec = new SecretKeySpec("93b47625ec3dcc4172fda796899ae42d".getBytes(), "HMACSHA256"); Mac mac2 = Mac.getInstance("HMACSHA256"); mac2.init(secretKeySpec); byte[] mysig = mac2.doFinal(rawpayload.getBytes()); if (Arrays.equals(mysig, sig)) { user.setAuthorized(true); } } catch (Exception e) { throw new Exception("Failed to perform crypt operation.", e); } } } catch (Exception e) { log.error(e); } return user; } public static String getAuthorizationUrl(FacebookUser user, Page page) throws Exception { //facebook page url String url = URLEncoder.encode(page.getProperty6(), "UTF-8"); StringBuffer requestUrl = new StringBuffer(); requestUrl.append("https://graph.facebook.com/oauth/authorize?type=user_agent"); requestUrl.append("&client_id="); requestUrl.append(user.getClientId()); requestUrl.append("&redirect_uri="); requestUrl.append(url); requestUrl.append("&scope="); requestUrl.append(perms); return requestUrl.toString(); } }