package me.rkfg.ns2gather.server; import java.io.IOException; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import me.rkfg.ns2gather.client.CookieSettingsManager; import me.rkfg.ns2gather.domain.Remembered; import org.hibernate.Session; import org.openid4java.association.AssociationException; import org.openid4java.consumer.VerificationResult; import org.openid4java.discovery.DiscoveryException; import org.openid4java.discovery.DiscoveryInformation; import org.openid4java.discovery.Identifier; import org.openid4java.message.MessageException; import org.openid4java.message.ParameterList; import ru.ppsrk.gwt.client.ClientAuthException; import ru.ppsrk.gwt.client.LogicException; import ru.ppsrk.gwt.server.HibernateCallback; import ru.ppsrk.gwt.server.HibernateUtil; public class AuthCallbackServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 6146495372925195290L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { // extract the parameters from the authentication response // (which comes in as a HTTP request from the OpenID provider) ParameterList openidResp = new ParameterList(req.getParameterMap()); // retrieve the previously stored discovery information DiscoveryInformation discovered = (DiscoveryInformation) req.getSession().getAttribute("discovered"); // extract the receiving URL from the HTTP request StringBuffer receivingURL = req.getRequestURL(); String queryString = req.getQueryString(); if (queryString != null && queryString.length() > 0) receivingURL.append("?").append(req.getQueryString()); // verify the response VerificationResult verification = NS2GServiceImpl.consumerManager.verify(receivingURL.toString(), openidResp, discovered); // examine the verification result and extract the verified identifier Identifier verified = verification.getVerifiedId(); if (verified != null) { try { Long steamId = Long.valueOf(verified.getIdentifier().replaceAll("http://steamcommunity.com/openid/id/", "")); req.getSession().setAttribute(Settings.STEAMID_SESSION, steamId); updateRememberCookie(resp, rememberMe(steamId)); resp.sendRedirect(".."); } catch (NumberFormatException e) { resp.getWriter().print("Получен нечисловой Steam ID. GABEN PLZ!"); } } else { resp.getWriter().print("fail!"); } } catch (MessageException | DiscoveryException | AssociationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void updateRememberCookie(HttpServletResponse resp, String rememberIdStr) { Cookie rememberMeCookie = new Cookie(CookieSettingsManager.REMEMBER_STEAM_ID, rememberIdStr); rememberMeCookie.setMaxAge((int) CookieSettingsManager.COOKIE_AGE); resp.addCookie(rememberMeCookie); } private String rememberMe(final Long steamId) { try { return HibernateUtil.exec(new HibernateCallback<String>() { @Override public String run(Session session) throws LogicException, ClientAuthException { Long rememberId = new Random().nextLong(); Remembered remembered = new Remembered(rememberId, steamId); session.merge(remembered); return rememberId.toString(); } }); } catch (LogicException | ClientAuthException e) { e.printStackTrace(); } return ""; } }