package net.thesocialos.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.thesocialos.server.json.JSONException;
import net.thesocialos.server.json.JSONObject;
import net.thesocialos.shared.model.Facebook;
import net.thesocialos.shared.model.Google;
import net.thesocialos.shared.model.Session;
import net.thesocialos.shared.model.User;
import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
public class Oauth2Response extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int GOOGLE = 0;
private static final int FACEBOOK = 1;
public Oauth2Response() {
// TODO Auto-generated constructor stub
}
private String getUsername(int type, String authToken) {
// TODO Auto-generated method stub
String urlString = "", params = "", jsonParameter = "", username = "";
switch (type) {
case GOOGLE:
urlString = "https://www.googleapis.com/oauth2/v2/userinfo";
params = "access_token=" + authToken;
jsonParameter = "email";
break;
case FACEBOOK:
urlString = "https://graph.facebook.com/me";
params = "access_token=" + authToken;
jsonParameter = "username";
break;
}
try {
URL url = new URL(urlString + "?" + params);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// get the results
conn.connect();
int responseCode = conn.getResponseCode(); // 200, 404, etc
String responseMsg = conn.getResponseMessage(); // OK, Forbidden, etc
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer results = new StringBuffer();
String oneline;
while ((oneline = br.readLine()) != null)
results.append(oneline);
br.close();
JSONObject js = new JSONObject(results.toString());
username = js.getString(jsonParameter);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return username;
}
@Override
public void service(HttpServletRequest request, HttpServletResponse response) {
String authToken = request.getParameter("authToken");
String refreshToken = request.getParameter("refreshToken");
String serviceName = request.getParameter("serviceName");
// String uid = request.getParameter("uid");
Objectify ofy = ObjectifyService.begin();
Session session = UserHelper.getSesssionHttpSession(request.getSession());
User user = UserHelper.getUserWithSession(session, ofy);
if ("google".equalsIgnoreCase(serviceName)) {
int expires_in = Integer.parseInt(request.getParameter("expires_in"));
Google googleAccount = new Google();
// We use expires_in - 10 to compensate the delay
googleAccount.setExpireDate(new Date(System.currentTimeMillis() + (expires_in - 10) * 1000));
googleAccount.setAuthToken(authToken);
googleAccount.setRefreshToken(refreshToken);
googleAccount.setUsername(getUsername(GOOGLE, authToken));
user.addAccount(ofy.put(googleAccount));
} else if ("facebook".equalsIgnoreCase(serviceName)) {
Facebook facebookAccount = new Facebook();
facebookAccount.setExpireDate(new Date(System.currentTimeMillis() + 60 * 24 * 60 * 60 * 1000));
facebookAccount.setAuthToken(authToken);
// facebookAccount.setRefreshToken(refreshToken);
facebookAccount.setUsername(getUsername(FACEBOOK, authToken));
user.addAccount(ofy.put(facebookAccount));
}
ofy.put(user);
try {
PrintWriter writer = response.getWriter();
response.setContentType("text/html");
writer.println("<html>");
writer.println("<head>");
writer.println("<TITLE>");
writer.println("Account Added");
writer.println("</TITLE>");
writer.println("<SCRIPT LANGUAGE=javascript>");
writer.println("<!--");
writer.println("function window_onload() { window.opener.location.hash='account-added'; window.close(); } ");
writer.println("//-->");
writer.println("</SCRIPT>");
writer.println("</head>");
writer.println("<body onload=window_onload()>");
writer.println("</body>");
writer.println("</html>");
// TheSocialOS.get().getEventBus().fireEvent(new AccountAddedEvent());
// writer.write("<script>window.opener.location.hash='account-added'</script>");
// writer.write("<Button onClick=\"javascript:window.opener.location.hash='account-added';window.close();\">Close window</Button>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}