Rev 11747 | Rev 12616 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/****/package in.shop2020.serving.controllers;import in.shop2020.datalogger.EventType;import in.shop2020.model.v1.user.Cart;import in.shop2020.model.v1.user.Sex;import in.shop2020.model.v1.user.ShoppingCartException;import in.shop2020.model.v1.user.TrackLogType;import in.shop2020.model.v1.user.User;import in.shop2020.model.v1.user.UserAffiliateException;import in.shop2020.model.v1.user.UserContextException;import in.shop2020.model.v1.user.WidgetException;import in.shop2020.serving.interceptors.TrackingInterceptor;import in.shop2020.serving.interceptors.UserInterceptor;import in.shop2020.serving.utils.DesEncrypter;import in.shop2020.serving.utils.UserMessage;import in.shop2020.thrift.clients.UserClient;import in.shop2020.utils.DataLogger;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletResponse;import org.apache.commons.codec.binary.Base64;import org.apache.commons.lang.RandomStringUtils;import org.apache.log4j.Logger;import org.apache.struts2.ServletActionContext;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Actions;import org.apache.struts2.convention.annotation.InterceptorRef;import org.apache.struts2.convention.annotation.Result;import org.apache.struts2.convention.annotation.Results;import org.apache.thrift.TException;import org.apache.thrift.transport.TTransportException;import org.json.JSONObject;/**** @author rajveer**/@Results({@Result(name="success", type="redirectAction", params = {"actionName" , "home"}),@Result(name = "redirect", location = "${redirectUrl}", type = "redirect")})public class LoginController extends BaseController {/****/private static final long serialVersionUID = 5390035354379263121L;private static Logger log = Logger.getLogger(Class.class);private DesEncrypter desEncrypter = new DesEncrypter("saholic");private String loginResult = "0";private String redirectUrl = "/";private String signed_request;private Long userId = -1L;public LoginController() {super();}@Actions({@Action(value="login", interceptorRefs={@InterceptorRef("myDefault")}),@Action(value="login-mini", interceptorRefs={@InterceptorRef("myDefault")})})public String index() throws SecurityException, IOException {if(userinfo.isLoggedIn()){return "success";}return "index";}public String create() throws SecurityException, Exception {if (loginUser()) {log.info("Will redirect the user to:" + redirectUrl);return "redirect";} else {addActionError(UserMessage.USER_AUTHENTICATION_FAILURE);DataLogger.logData(EventType.LOGIN_FAILED, getSessionId(), userinfo.getUserId(), this.request.getParameter("email"));return "login";}}private boolean loginUser() {try {String email, password = null, isFacebookUser;isFacebookUser = (String)this.request.getAttribute("isFacebookUser");if (isFacebookUser!=null && isFacebookUser.equals("true")) {email = (String)this.request.getAttribute("email");} else {email = this.request.getParameter("email");password = this.request.getParameter("password");}if (email == null || (password == null && (isFacebookUser==null || !isFacebookUser.equals("true")))) {return false;}String encryptedPassword = null;if(!(password==null)){encryptedPassword = desEncrypter.encrypt(password);}UserClient userContextServiceClient = new UserClient();in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();User user = null;boolean shouldChangeCookieExpiry = false;boolean isNewFacebookUser = false;if (isFacebookUser!=null && isFacebookUser.equals("true") && !email.equals("undefined")) {String accessToken = (String)this.request.getAttribute("accessToken");String facebookId = (String)this.request.getAttribute("facebookId");if (userClient.userExists(email)){shouldChangeCookieExpiry = true;user = userClient.getUserByEmail(email);userId = user.getUserId();if(!user.isIsFacebookUser()) {user.setIsFacebookUser(true);user.setFacebookAccessToken(accessToken);user.setFacebookId(facebookId);userClient.updateUser(user);} else if(user.getFacebookAccessToken() == null || (accessToken!=null && !accessToken.equals(user.getFacebookAccessToken()))){user.setFacebookAccessToken(accessToken);if(facebookId!=null) {user.setFacebookId(facebookId);}userClient.updateUser(user);}} else {isNewFacebookUser = createNewUserForFacebook(email);}if(shouldChangeCookieExpiry || isNewFacebookUser) {Cookie uidCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);Cookie uicCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_INFO_COOKIE_NAME);HttpServletResponse response = ServletActionContext.getResponse();if (uidCookie == null) {DesEncrypter cookieEncryter = new DesEncrypter(UserInterceptor.COOKIE_DECRYPTION_STRING);uidCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, cookieEncryter.encrypt(userId + ""));uidCookie.setPath("/");if(!domainName.isEmpty()) {uidCookie.setDomain(domainName);}}if (uicCookie != null) {uicCookie.setMaxAge(UserInterceptor.FACEBOOK_USER_COOKIE_EXPIRY_TIME);cookiesMap.put(UserInterceptor.USER_INFO_COOKIE_NAME, uicCookie);response.addCookie(uicCookie);}uidCookie.setMaxAge(UserInterceptor.FACEBOOK_USER_COOKIE_EXPIRY_TIME);cookiesMap.put(UserInterceptor.USER_ID_COOKIE_NAME, uidCookie);response.addCookie(uidCookie);if(isNewFacebookUser) {return true;}}} else {user = userClient.authenticateUser(email, encryptedPassword);}userClient.setUserAsLoggedIn(user.getUserId(),(new Date()).getTime());String pincode = userClient.getDefaultPincode(user.getUserId());// TODO: setTotalItems shouldn't be a method on userinfo. This allows// for potentially updating the item count wrongly. The method setCartId// should update the item count as well. Also, there can be a method// called refreshItemCount() that automatically updates the number of// items currently in the cart.if(userinfo.getUserId() != -1){userClient.mergeCart(userinfo.getCartId(), user.getActiveCartId());List<Long> items = userClient.getBrowseHistoryItems(userinfo.getUserId());if(items != null){for(Long itemId: items){userClient.updateBrowseHistory(user.getUserId(), itemId);}}items = userClient.getMyResearchItems(userinfo.getUserId());if(items != null){for(Long itemId: items){userClient.updateMyResearch(user.getUserId(), itemId);}}}userinfo.setUserId(user.getUserId());userinfo.setEmail(email);userinfo.setLoggedIn(true);userinfo.setPincode(pincode);userinfo.setCartId(user.getActiveCartId());Cart cart = userClient.getCart(user.getActiveCartId());userinfo.setTotalItems(cart.getLinesSize());userinfo.setTotalAmount(cart.getTotalPrice());userinfo.setPrivateDealUser(isPrivateDealUser());String src = user.getSource();if (src == null) {src = "";}DataLogger.logData(EventType.LOGIN_SUCCESS, getSessionId(), userinfo.getUserId(),email, src);return true;} catch (Exception e) {log.error(UserMessage.USER_AUTHENTICATION_FAILURE, e);return false;}}private boolean createNewUserForFacebook(String email) {String password;password = RandomStringUtils.randomAlphabetic(8);String name = (String)this.request.getAttribute("name");String accessToken = (String)this.request.getAttribute("accessToken");String facebookId = (String)this.request.getAttribute("facebookId");User user = new User();user.setEmail(email);String encryptedPassword = desEncrypter.encrypt(password);user.setPassword(encryptedPassword);user.setCommunicationEmail(email);user.setName(name);user.setFacebookAccessToken(accessToken);if(user.getFacebookId()==null || user.getFacebookId().isEmpty()) {user.setFacebookId(facebookId);}Cookie sourceCookie = (Cookie) cookiesMap.get(TrackingInterceptor.SRC_COOKIE);if (sourceCookie != null) {DesEncrypter des = new DesEncrypter(TrackingInterceptor.ENCRIPTION_STRING);String sourceCookieVal = des.decrypt(sourceCookie.getValue());user.setSource(sourceCookieVal);}Cookie sourceTimeCookie = (Cookie) cookiesMap.get(TrackingInterceptor.SRC_TIME_COOKIE);long sourceTime = 0;if (sourceTimeCookie != null) {try {sourceTime = Long.parseLong(sourceTimeCookie.getValue());}catch (Exception e) {log.warn("Unable to parse session src time cookie.");}user.setSourceStartTime(sourceTime);}user.setSex(Sex.WONT_SAY);user.setIsFacebookUser(true);UserClient userContextServiceClient;try {userContextServiceClient = new UserClient();in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();try{user = userClient.createUser(user);}catch (UserContextException ux){addActionError("User already exists with this email id.");DataLogger.logData(EventType.REGISTER_FAILED_USER_EXISTS, getSessionId(), userinfo.getUserId(), email, "", email);return false;}this.userId = user.getUserId();long userId = user.getUserId();userClient.setUserAsLoggedIn(userId, (new Date()).getTime());String pincode = userClient.getDefaultPincode(user.getUserId());if(userinfo.getUserId() != -1){userClient.mergeCart(userinfo.getCartId(), user.getActiveCartId());List<Long> items = userClient.getBrowseHistoryItems(userinfo.getUserId());if(items != null){for(Long itemId: items){userClient.updateBrowseHistory(user.getUserId(), itemId);}}items = userClient.getMyResearchItems(userinfo.getUserId());if(items != null){for(Long itemId: items){userClient.updateMyResearch(user.getUserId(), itemId);}}}userinfo.setUserId(userId);userinfo.setEmail(email);userinfo.setLoggedIn(true);userinfo.setPincode(pincode);userinfo.setCartId(user.getActiveCartId());Cart cart = userClient.getCart(userinfo.getCartId());userinfo.setTotalItems(cart.getLinesSize());userinfo.setTotalAmount(cart.getTotalPrice());if (cookiesMap.containsKey(TrackingInterceptor.AFF_COOKIE)) {long affId = Long.parseLong(cookiesMap.get(TrackingInterceptor.AFF_COOKIE).getValue());userClient.addTrackLog(affId, userId, TrackLogType.NEW_REGISTRATION, "",email, (new Date()).getTime());}DataLogger.logData(EventType.REGISTER_SUCCESS, getSessionId(), userinfo.getUserId(), email, "", email);return true;} catch (TTransportException e) {log.error("Unable to register user." + e);} catch (UserContextException e) {log.error("Unable to register user." + e);} catch (TException e) {log.error("Unable to register user." + e);} catch (UserAffiliateException e) {log.error("Unable to register user." + e);} catch (ShoppingCartException e) {log.error("Unable to register user." + e);} catch (WidgetException e) {log.error("Unable to register user." + e);}return false;}public String facebooklogin(){try {String dataResponse = signed_request.split("\\.")[1];String encoded_json = dataResponse.replace("-", "+").replace("_", "/");byte[] decoded_json = Base64.decodeBase64(encoded_json);JSONObject json_data = new JSONObject(new String(decoded_json, "UTF-8"));this.request.setAttribute("name", (new JSONObject(json_data.get("registration").toString())).get("name"));this.request.setAttribute("email", (new JSONObject(json_data.get("registration").toString())).get("email"));this.request.setAttribute("accessToken", json_data.get("oauth_token").toString());this.request.setAttribute("facebookId", json_data.get("user_id").toString());this.request.setAttribute("isFacebookUser", "true");if(loginUser()){return "redirect";} else {log.error("Error in logging through facebook");addActionError(UserMessage.FACEBOOK_USER_AUTH_FAILURE);return "login";}} catch (Exception e ) {log.error("Error in reading facebook response for login", e);addActionError(UserMessage.FACEBOOK_USER_AUTH_FAILURE);return "login";}}public String authenticateUser() {String email, password;email = this.request.getParameter("email");password = this.request.getParameter("password");if (email == null || password == null) {loginResult = "0";return "result";}String encryptedPassword = desEncrypter.encrypt(password);try{UserClient userContextServiceClient = new UserClient();in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();userClient.authenticateUser(email, encryptedPassword);}catch (Exception e) {loginResult = "0";return "result";}loginResult = "1";return "result";}public String getLoginResult() {return loginResult;}public String getRedirectUrl() {return redirectUrl;}public void setRedirectUrl(String redirectUrl) {this.redirectUrl = redirectUrl;}public String getSigned_request() {return signed_request;}public void setSigned_request(String signed_request) {this.signed_request = signed_request;}public static void main(String[] args) {DesEncrypter des = new DesEncrypter("saholic");System.out.println(des.decrypt("XvrWIvmYrUAdXqxhovZMSw"));}private boolean isPrivateDealUser() throws TTransportException, TException{try {in.shop2020.model.v1.user.UserContextService.Client uc = new UserClient().getClient();return uc.isPrivateDealUser(userinfo.getUserId());} catch (TTransportException e) {log.error("Unable to get user service client.", e);}return false;}}