Subversion Repositories SmartDukaan

Rev

Rev 11747 | Rev 11918 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
637 rajveer 1
/**
2
 * 
3
 */
4
package in.shop2020.serving.controllers;
5
 
2263 vikas 6
import in.shop2020.datalogger.EventType;
3830 chandransh 7
import in.shop2020.model.v1.user.Cart;
7825 amar.kumar 8
import in.shop2020.model.v1.user.Sex;
9
import in.shop2020.model.v1.user.ShoppingCartException;
10
import in.shop2020.model.v1.user.TrackLogType;
637 rajveer 11
import in.shop2020.model.v1.user.User;
7825 amar.kumar 12
import in.shop2020.model.v1.user.UserAffiliateException;
13
import in.shop2020.model.v1.user.UserContextException;
14
import in.shop2020.model.v1.user.WidgetException;
15
import in.shop2020.serving.interceptors.TrackingInterceptor;
16
import in.shop2020.serving.interceptors.UserInterceptor;
815 rajveer 17
import in.shop2020.serving.utils.DesEncrypter;
1175 varun.gupt 18
import in.shop2020.serving.utils.UserMessage;
3126 rajveer 19
import in.shop2020.thrift.clients.UserClient;
2511 vikas 20
import in.shop2020.utils.DataLogger;
637 rajveer 21
 
22
import java.io.IOException;
23
import java.util.Date;
1623 rajveer 24
import java.util.List;
637 rajveer 25
 
7825 amar.kumar 26
import javax.servlet.http.Cookie;
27
import javax.servlet.http.HttpServletResponse;
28
 
29
import org.apache.commons.codec.binary.Base64;
30
import org.apache.commons.lang.RandomStringUtils;
832 rajveer 31
import org.apache.log4j.Logger;
7825 amar.kumar 32
import org.apache.struts2.ServletActionContext;
4222 varun.gupt 33
import org.apache.struts2.convention.annotation.Action;
34
import org.apache.struts2.convention.annotation.Actions;
35
import org.apache.struts2.convention.annotation.InterceptorRef;
637 rajveer 36
import org.apache.struts2.convention.annotation.Result;
925 rajveer 37
import org.apache.struts2.convention.annotation.Results;
7825 amar.kumar 38
import org.apache.thrift.TException;
39
import org.apache.thrift.transport.TTransportException;
40
import org.json.JSONObject;
637 rajveer 41
 
42
/**
43
 * 
44
 * @author rajveer
781 vikas 45
 * 
637 rajveer 46
 */
925 rajveer 47
@Results({
48
	@Result(name="success", type="redirectAction", params = {"actionName" , "home"}),
49
	@Result(name = "redirect", location = "${redirectUrl}", type = "redirect")
50
})
637 rajveer 51
 
781 vikas 52
public class LoginController extends BaseController {
650 rajveer 53
 
781 vikas 54
	/**
55
	 * 
56
	 */
57
	private static final long serialVersionUID = 5390035354379263121L;
650 rajveer 58
 
832 rajveer 59
	private static Logger log = Logger.getLogger(Class.class);
815 rajveer 60
	private DesEncrypter desEncrypter = new DesEncrypter("saholic");
5510 rajveer 61
	private String loginResult = "0";
2933 vikas 62
	private String redirectUrl = "/";
7825 amar.kumar 63
	private String signed_request;
64
	private Long userId = -1L;
65
 
781 vikas 66
	public LoginController() {
637 rajveer 67
		super();
68
	}
4222 varun.gupt 69
	@Actions({
70
		@Action(value="login", interceptorRefs={@InterceptorRef("myDefault")}),
71
		@Action(value="login-mini", interceptorRefs={@InterceptorRef("myDefault")})
72
	})
781 vikas 73
	public String index() throws SecurityException, IOException {
925 rajveer 74
		if(userinfo.isLoggedIn()){
75
    		return "success";
76
    	}
650 rajveer 77
		return "index";
781 vikas 78
	}
637 rajveer 79
 
781 vikas 80
	public String create() throws SecurityException, Exception {
81
		if (loginUser()) {
2959 chandransh 82
			log.info("Will redirect the user to:" + redirectUrl);
2637 vikas 83
            return "redirect";
781 vikas 84
		} else {
1175 varun.gupt 85
			addActionError(UserMessage.USER_AUTHENTICATION_FAILURE);
3185 vikas 86
            DataLogger.logData(EventType.LOGIN_FAILED, getSessionId(), userinfo.getUserId(), this.request.getParameter("email"));
830 vikas 87
			return "login";
781 vikas 88
		}
89
	}
90
 
91
	private boolean loginUser() {
92
		try {
7825 amar.kumar 93
			String email, password = null, isFacebookUser;
781 vikas 94
 
7825 amar.kumar 95
			isFacebookUser = (String)this.request.getAttribute("isFacebookUser");
96
			if (isFacebookUser!=null && isFacebookUser.equals("true")) {
97
				email = (String)this.request.getAttribute("email");
98
			} else {
99
				email = this.request.getParameter("email");
100
				password = this.request.getParameter("password");
101
			}
102
 
103
			if (email == null || (password == null && (isFacebookUser==null || !isFacebookUser.equals("true")))) {
781 vikas 104
				return false;
105
			}
815 rajveer 106
 
7825 amar.kumar 107
			String encryptedPassword = null;
108
			if(!(password==null)){
109
				encryptedPassword = desEncrypter.encrypt(password);
110
			}
111
 
3126 rajveer 112
			UserClient userContextServiceClient = new UserClient();
1747 varun.gupt 113
			in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
7825 amar.kumar 114
 
115
			User user = null;
116
 
117
			boolean shouldChangeCookieExpiry = false;
118
			boolean isNewFacebookUser = false;
119
			if (isFacebookUser!=null && isFacebookUser.equals("true") && !email.equals("undefined")) {
120
				String accessToken = (String)this.request.getAttribute("accessToken");
121
				String facebookId = (String)this.request.getAttribute("facebookId");
122
				if (userClient.userExists(email)){
123
					shouldChangeCookieExpiry = true;
124
					user = userClient.getUserByEmail(email);
125
					userId = user.getUserId();
126
					if(!user.isIsFacebookUser()) {
127
						user.setIsFacebookUser(true);						
128
						user.setFacebookAccessToken(accessToken);
129
						user.setFacebookId(facebookId);
130
						userClient.updateUser(user);
131
					} else if(user.getFacebookAccessToken() == null || (accessToken!=null && !accessToken.equals(user.getFacebookAccessToken()))){
132
						user.setFacebookAccessToken(accessToken);
133
						if(facebookId!=null) {
134
							user.setFacebookId(facebookId);
135
						}
136
						userClient.updateUser(user);
137
					}
138
				} else {
139
					isNewFacebookUser = createNewUserForFacebook(email);
140
				}
141
				if(shouldChangeCookieExpiry || isNewFacebookUser) {
142
					Cookie uidCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
143
					Cookie uicCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_INFO_COOKIE_NAME);
144
					HttpServletResponse response = ServletActionContext.getResponse();
145
					if (uidCookie == null) {
146
						DesEncrypter cookieEncryter = new DesEncrypter(UserInterceptor.COOKIE_DECRYPTION_STRING);
147
						uidCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, cookieEncryter.encrypt(userId + ""));
148
						uidCookie.setPath("/");
149
						if(!domainName.isEmpty()) {
150
							uidCookie.setDomain(domainName);
151
						}
152
					}
153
					if (uicCookie != null) {
154
						uicCookie.setMaxAge(UserInterceptor.FACEBOOK_USER_COOKIE_EXPIRY_TIME);
155
						cookiesMap.put(UserInterceptor.USER_INFO_COOKIE_NAME, uicCookie);
156
				        response.addCookie(uicCookie);
157
					}
158
					uidCookie.setMaxAge(UserInterceptor.FACEBOOK_USER_COOKIE_EXPIRY_TIME);
159
					cookiesMap.put(UserInterceptor.USER_ID_COOKIE_NAME, uidCookie);
160
			        response.addCookie(uidCookie);
161
 
162
			        if(isNewFacebookUser) {
163
			        	return true;
164
			        }
165
				}
166
			} else {
167
				user = userClient.authenticateUser(email, encryptedPassword);
168
			}
793 rajveer 169
			userClient.setUserAsLoggedIn(user.getUserId(),(new Date()).getTime());
170
			String pincode = userClient.getDefaultPincode(user.getUserId());
2637 vikas 171
 
1175 varun.gupt 172
			// TODO: setTotalItems shouldn't be a method on userinfo. This allows
173
			// for potentially updating the item count wrongly. The method setCartId
637 rajveer 174
			// should update the item count as well. Also, there can be a method
1175 varun.gupt 175
			// called refreshItemCount() that automatically updates the number of
637 rajveer 176
			// items currently in the cart.
1625 rajveer 177
			if(userinfo.getUserId() != -1){
1623 rajveer 178
				userClient.mergeCart(userinfo.getCartId(), user.getActiveCartId());
1625 rajveer 179
 
2982 rajveer 180
				List<Long> items = userClient.getBrowseHistoryItems(userinfo.getUserId());
181
				if(items != null){
182
					for(Long itemId: items){
183
						userClient.updateBrowseHistory(user.getUserId(), itemId);
1623 rajveer 184
					}
185
				}
4453 varun.gupt 186
 
2982 rajveer 187
				items = userClient.getMyResearchItems(userinfo.getUserId());
188
				if(items != null){
189
					for(Long itemId: items){
190
						userClient.updateMyResearch(user.getUserId(), itemId);
1625 rajveer 191
					}
192
				}
1623 rajveer 193
			}
194
 
1625 rajveer 195
			userinfo.setUserId(user.getUserId());
196
			userinfo.setEmail(email);
197
			userinfo.setLoggedIn(true);
198
			userinfo.setPincode(pincode);
637 rajveer 199
			userinfo.setCartId(user.getActiveCartId());
3830 chandransh 200
			Cart cart = userClient.getCart(user.getActiveCartId());
201
			userinfo.setTotalItems(cart.getLinesSize());
202
			userinfo.setTotalAmount(cart.getTotalPrice());
11808 amit.gupta 203
			userinfo.setPrivateDealUser(isPrivateDealUser());
2996 vikas 204
			String src = user.getSource();
205
			if (src == null) {
206
			    src = "";
207
			}
3185 vikas 208
			DataLogger.logData(EventType.LOGIN_SUCCESS, getSessionId(), userinfo.getUserId(),
2996 vikas 209
                    email, src);
2637 vikas 210
    		return true;
781 vikas 211
		} catch (Exception e) {
2959 chandransh 212
			log.error(UserMessage.USER_AUTHENTICATION_FAILURE, e);
781 vikas 213
			return false;
214
		}
215
	}
637 rajveer 216
 
7825 amar.kumar 217
 
218
 
219
 
220
	private boolean createNewUserForFacebook(String email) {
221
    	String password;
222
    	password = RandomStringUtils.randomAlphabetic(8);
223
 
224
    	String name = (String)this.request.getAttribute("name");
225
    	String accessToken = (String)this.request.getAttribute("accessToken");
226
    	String facebookId = (String)this.request.getAttribute("facebookId");
227
		User user = new User();
228
		user.setEmail(email);
229
		String encryptedPassword = desEncrypter.encrypt(password);
230
		user.setPassword(encryptedPassword);
231
		user.setCommunicationEmail(email);
232
		user.setName(name);
233
		user.setFacebookAccessToken(accessToken);
234
		if(user.getFacebookId()==null || user.getFacebookId().isEmpty()) {
235
			user.setFacebookId(facebookId);
236
		}
237
		Cookie sourceCookie = (Cookie) cookiesMap.get(TrackingInterceptor.SRC_COOKIE);
238
        if (sourceCookie != null) {
239
            DesEncrypter des = new DesEncrypter(TrackingInterceptor.ENCRIPTION_STRING);
240
            String sourceCookieVal = des.decrypt(sourceCookie.getValue());
241
            user.setSource(sourceCookieVal);
242
        }
243
 
244
        Cookie sourceTimeCookie = (Cookie) cookiesMap.get(TrackingInterceptor.SRC_TIME_COOKIE);
245
        long sourceTime = 0;
246
        if (sourceTimeCookie != null) {
247
            try {
248
                sourceTime = Long.parseLong(sourceTimeCookie.getValue());
249
            }
250
            catch (Exception e) {
251
                log.warn("Unable to parse session src time cookie.");
252
            }
253
            user.setSourceStartTime(sourceTime);
254
        }
255
 
256
		user.setSex(Sex.WONT_SAY);
257
		user.setIsFacebookUser(true);
258
 
259
		UserClient userContextServiceClient;
260
		try {
261
			userContextServiceClient = new UserClient();
262
			in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
263
			try{
264
				user = userClient.createUser(user);
265
			}catch (UserContextException ux){
266
				addActionError("User already exists with this email id.");
267
				DataLogger.logData(EventType.REGISTER_FAILED_USER_EXISTS, getSessionId(), userinfo.getUserId(), email, "", email);
268
				return false;				
269
			}
270
			this.userId = user.getUserId();
271
			long userId = user.getUserId();
272
			userClient.setUserAsLoggedIn(userId, (new Date()).getTime());
273
			String pincode = userClient.getDefaultPincode(user.getUserId());
274
 
275
			if(userinfo.getUserId() != -1){
276
				userClient.mergeCart(userinfo.getCartId(), user.getActiveCartId());
277
 
278
				List<Long> items = userClient.getBrowseHistoryItems(userinfo.getUserId());
279
				if(items != null){
280
					for(Long itemId: items){
281
						userClient.updateBrowseHistory(user.getUserId(), itemId);
282
					}
283
				}
284
 
285
				items = userClient.getMyResearchItems(userinfo.getUserId());
286
				if(items != null){
287
					for(Long itemId: items){
288
						userClient.updateMyResearch(user.getUserId(), itemId);
289
					}
290
				}
291
			}
292
 
293
			userinfo.setUserId(userId);
294
			userinfo.setEmail(email);
295
			userinfo.setLoggedIn(true);
296
			userinfo.setPincode(pincode);
297
			userinfo.setCartId(user.getActiveCartId());
298
			Cart cart = userClient.getCart(userinfo.getCartId());
299
			userinfo.setTotalItems(cart.getLinesSize());
300
			userinfo.setTotalAmount(cart.getTotalPrice());
301
 
302
	        if (cookiesMap.containsKey(TrackingInterceptor.AFF_COOKIE)) {
303
	            long affId = Long.parseLong(cookiesMap.get(TrackingInterceptor.AFF_COOKIE).getValue());
304
	            userClient.addTrackLog(affId, userId, TrackLogType.NEW_REGISTRATION, "",email, (new Date()).getTime());
305
	        }
306
	        DataLogger.logData(EventType.REGISTER_SUCCESS, getSessionId(), userinfo.getUserId(), email, "", email);
307
 
308
			return true;
309
		} catch (TTransportException e) {
310
			log.error("Unable to register user." + e);
311
		} catch (UserContextException e) {
312
			log.error("Unable to register user." + e);
313
		} catch (TException e) {
314
			log.error("Unable to register user." + e);
315
		} catch (UserAffiliateException e) {
316
			log.error("Unable to register user." + e);
317
		} catch (ShoppingCartException e) {
318
			log.error("Unable to register user." + e);
319
		} catch (WidgetException e) {
320
			log.error("Unable to register user." + e);
321
		}
322
		return false;
323
	}
324
 
325
	public String facebooklogin(){
326
		try {
327
			String dataResponse = signed_request.split("\\.")[1];
328
			String encoded_json = dataResponse.replace("-", "+").replace("_", "/");
329
			byte[] decoded_json  = Base64.decodeBase64(encoded_json);
330
			JSONObject json_data = new JSONObject(new String(decoded_json, "UTF-8"));
331
			this.request.setAttribute("name", (new JSONObject(json_data.get("registration").toString())).get("name"));
332
			this.request.setAttribute("email", (new JSONObject(json_data.get("registration").toString())).get("email"));
333
			this.request.setAttribute("accessToken", json_data.get("oauth_token").toString());
334
			this.request.setAttribute("facebookId", json_data.get("user_id").toString());
335
			this.request.setAttribute("isFacebookUser", "true");
336
			if(loginUser()){
337
				return "redirect";
338
			} else {
339
				log.error("Error in logging through facebook");
340
				addActionError(UserMessage.FACEBOOK_USER_AUTH_FAILURE);
341
				return "login";
342
			}
343
		} catch (Exception e ) {
344
			log.error("Error in reading facebook response for login", e);
345
			addActionError(UserMessage.FACEBOOK_USER_AUTH_FAILURE);
346
			return "login";
347
		}
348
	}
349
 
5510 rajveer 350
	public String authenticateUser() {
351
		String email, password;
352
 
353
		email = this.request.getParameter("email");
354
		password = this.request.getParameter("password");
355
 
356
		if (email == null || password == null) {
357
			loginResult = "0";
358
			return "result";
359
		}
360
 
361
		String encryptedPassword = desEncrypter.encrypt(password);
362
		try{
363
			UserClient userContextServiceClient = new UserClient();
364
			in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
365
			userClient.authenticateUser(email, encryptedPassword);
366
		}catch (Exception e) {
367
			loginResult = "0";
368
			return "result";
369
		}
370
		loginResult = "1";
371
		return "result";
372
	}
373
 
374
	public String getLoginResult() {
375
		return loginResult;
376
	}
377
 
924 vikas 378
	public String getRedirectUrl() {
379
		return redirectUrl;
781 vikas 380
	}
381
 
924 vikas 382
	public void setRedirectUrl(String redirectUrl) {
383
		this.redirectUrl = redirectUrl;
384
	}
6903 anupam.sin 385
 
7825 amar.kumar 386
	public String getSigned_request() {
387
		return signed_request;
388
	}
389
	public void setSigned_request(String signed_request) {
390
		this.signed_request = signed_request;
391
	}
392
 
6903 anupam.sin 393
	public static void main(String[] args) {
394
        DesEncrypter des = new DesEncrypter("saholic");
395
        System.out.println(des.decrypt("XvrWIvmYrUAdXqxhovZMSw"));
396
    }
11808 amit.gupta 397
 
398
	private boolean isPrivateDealUser() throws TTransportException, TException{
399
		try {
400
			in.shop2020.model.v1.user.UserContextService.Client uc = new UserClient().getClient();
401
			return uc.isPrivateDealUser(userinfo.getUserId());
402
		} catch (TTransportException e) {
403
			log.error("Unable to get user service client.", e);	
404
		}
405
		return false;
406
	}
637 rajveer 407
}