Subversion Repositories SmartDukaan

Rev

Rev 20177 | Rev 20180 | 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);
11918 amit.gupta 83
/*			if(userinfo.isPrivateDealUser()){
84
				addActionMessage("PrivateDealUser");
85
			}*/
2637 vikas 86
            return "redirect";
781 vikas 87
		} else {
20176 aman.kumar 88
			log.info("in else of loginuser");
1175 varun.gupt 89
			addActionError(UserMessage.USER_AUTHENTICATION_FAILURE);
12616 anikendra 90
//            DataLogger.logData(EventType.LOGIN_FAILED, getSessionId(), userinfo.getUserId(), this.request.getParameter("email"));
830 vikas 91
			return "login";
781 vikas 92
		}
93
	}
94
 
95
	private boolean loginUser() {
96
		try {
20176 aman.kumar 97
			log.info("in loginuser");
7825 amar.kumar 98
			String email, password = null, isFacebookUser;
781 vikas 99
 
20178 aman.kumar 100
			isFacebookUser = (String)this.request.getParameter("isFacebookUser");
7825 amar.kumar 101
			if (isFacebookUser!=null && isFacebookUser.equals("true")) {
20178 aman.kumar 102
				email = (String)this.request.getParameter("email");
7825 amar.kumar 103
			} else {
104
				email = this.request.getParameter("email");
105
				password = this.request.getParameter("password");
106
			}
20177 aman.kumar 107
			log.info("here email "+email+" password "+password+" isfbuser "+isFacebookUser);
7825 amar.kumar 108
 
109
			if (email == null || (password == null && (isFacebookUser==null || !isFacebookUser.equals("true")))) {
20177 aman.kumar 110
				log.info("email "+email+" password "+password+" isfbuser "+isFacebookUser);
781 vikas 111
				return false;
112
			}
815 rajveer 113
 
7825 amar.kumar 114
			String encryptedPassword = null;
115
			if(!(password==null)){
116
				encryptedPassword = desEncrypter.encrypt(password);
117
			}
118
 
3126 rajveer 119
			UserClient userContextServiceClient = new UserClient();
1747 varun.gupt 120
			in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
7825 amar.kumar 121
 
122
			User user = null;
123
 
124
			boolean shouldChangeCookieExpiry = false;
125
			boolean isNewFacebookUser = false;
126
			if (isFacebookUser!=null && isFacebookUser.equals("true") && !email.equals("undefined")) {
20178 aman.kumar 127
				String accessToken = (String)this.request.getParameter("accessToken");
128
				String facebookId = (String)this.request.getParameter("facebookId");
7825 amar.kumar 129
				if (userClient.userExists(email)){
130
					shouldChangeCookieExpiry = true;
131
					user = userClient.getUserByEmail(email);
132
					userId = user.getUserId();
133
					if(!user.isIsFacebookUser()) {
134
						user.setIsFacebookUser(true);						
135
						user.setFacebookAccessToken(accessToken);
136
						user.setFacebookId(facebookId);
137
						userClient.updateUser(user);
138
					} else if(user.getFacebookAccessToken() == null || (accessToken!=null && !accessToken.equals(user.getFacebookAccessToken()))){
139
						user.setFacebookAccessToken(accessToken);
140
						if(facebookId!=null) {
141
							user.setFacebookId(facebookId);
142
						}
143
						userClient.updateUser(user);
144
					}
145
				} else {
146
					isNewFacebookUser = createNewUserForFacebook(email);
147
				}
148
				if(shouldChangeCookieExpiry || isNewFacebookUser) {
149
					Cookie uidCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_ID_COOKIE_NAME);
150
					Cookie uicCookie = (Cookie) cookiesMap.get(UserInterceptor.USER_INFO_COOKIE_NAME);
151
					HttpServletResponse response = ServletActionContext.getResponse();
152
					if (uidCookie == null) {
153
						DesEncrypter cookieEncryter = new DesEncrypter(UserInterceptor.COOKIE_DECRYPTION_STRING);
154
						uidCookie = new Cookie(UserInterceptor.USER_ID_COOKIE_NAME, cookieEncryter.encrypt(userId + ""));
155
						uidCookie.setPath("/");
156
						if(!domainName.isEmpty()) {
157
							uidCookie.setDomain(domainName);
158
						}
159
					}
160
					if (uicCookie != null) {
161
						uicCookie.setMaxAge(UserInterceptor.FACEBOOK_USER_COOKIE_EXPIRY_TIME);
162
						cookiesMap.put(UserInterceptor.USER_INFO_COOKIE_NAME, uicCookie);
163
				        response.addCookie(uicCookie);
164
					}
165
					uidCookie.setMaxAge(UserInterceptor.FACEBOOK_USER_COOKIE_EXPIRY_TIME);
166
					cookiesMap.put(UserInterceptor.USER_ID_COOKIE_NAME, uidCookie);
167
			        response.addCookie(uidCookie);
168
 
169
			        if(isNewFacebookUser) {
170
			        	return true;
171
			        }
172
				}
173
			} else {
174
				user = userClient.authenticateUser(email, encryptedPassword);
175
			}
793 rajveer 176
			userClient.setUserAsLoggedIn(user.getUserId(),(new Date()).getTime());
177
			String pincode = userClient.getDefaultPincode(user.getUserId());
2637 vikas 178
 
1175 varun.gupt 179
			// TODO: setTotalItems shouldn't be a method on userinfo. This allows
180
			// for potentially updating the item count wrongly. The method setCartId
637 rajveer 181
			// should update the item count as well. Also, there can be a method
1175 varun.gupt 182
			// called refreshItemCount() that automatically updates the number of
637 rajveer 183
			// items currently in the cart.
1625 rajveer 184
			if(userinfo.getUserId() != -1){
1623 rajveer 185
				userClient.mergeCart(userinfo.getCartId(), user.getActiveCartId());
1625 rajveer 186
 
2982 rajveer 187
				List<Long> items = userClient.getBrowseHistoryItems(userinfo.getUserId());
188
				if(items != null){
189
					for(Long itemId: items){
190
						userClient.updateBrowseHistory(user.getUserId(), itemId);
1623 rajveer 191
					}
192
				}
4453 varun.gupt 193
 
2982 rajveer 194
				items = userClient.getMyResearchItems(userinfo.getUserId());
195
				if(items != null){
196
					for(Long itemId: items){
197
						userClient.updateMyResearch(user.getUserId(), itemId);
1625 rajveer 198
					}
199
				}
1623 rajveer 200
			}
201
 
1625 rajveer 202
			userinfo.setUserId(user.getUserId());
203
			userinfo.setEmail(email);
204
			userinfo.setLoggedIn(true);
205
			userinfo.setPincode(pincode);
637 rajveer 206
			userinfo.setCartId(user.getActiveCartId());
3830 chandransh 207
			Cart cart = userClient.getCart(user.getActiveCartId());
208
			userinfo.setTotalItems(cart.getLinesSize());
209
			userinfo.setTotalAmount(cart.getTotalPrice());
11808 amit.gupta 210
			userinfo.setPrivateDealUser(isPrivateDealUser());
2996 vikas 211
			String src = user.getSource();
212
			if (src == null) {
213
			    src = "";
214
			}
12616 anikendra 215
//			DataLogger.logData(EventType.LOGIN_SUCCESS, getSessionId(), userinfo.getUserId(),
216
//                    email, src);
2637 vikas 217
    		return true;
781 vikas 218
		} catch (Exception e) {
2959 chandransh 219
			log.error(UserMessage.USER_AUTHENTICATION_FAILURE, e);
781 vikas 220
			return false;
221
		}
222
	}
637 rajveer 223
 
7825 amar.kumar 224
 
225
 
226
 
227
	private boolean createNewUserForFacebook(String email) {
228
    	String password;
229
    	password = RandomStringUtils.randomAlphabetic(8);
230
 
20178 aman.kumar 231
    	String name = (String)this.request.getParameter("name");
232
    	String accessToken = (String)this.request.getParameter("accessToken");
233
    	String facebookId = (String)this.request.getParameter("facebookId");
7825 amar.kumar 234
		User user = new User();
235
		user.setEmail(email);
236
		String encryptedPassword = desEncrypter.encrypt(password);
237
		user.setPassword(encryptedPassword);
238
		user.setCommunicationEmail(email);
239
		user.setName(name);
240
		user.setFacebookAccessToken(accessToken);
241
		if(user.getFacebookId()==null || user.getFacebookId().isEmpty()) {
242
			user.setFacebookId(facebookId);
243
		}
244
		Cookie sourceCookie = (Cookie) cookiesMap.get(TrackingInterceptor.SRC_COOKIE);
245
        if (sourceCookie != null) {
246
            DesEncrypter des = new DesEncrypter(TrackingInterceptor.ENCRIPTION_STRING);
247
            String sourceCookieVal = des.decrypt(sourceCookie.getValue());
248
            user.setSource(sourceCookieVal);
249
        }
250
 
251
        Cookie sourceTimeCookie = (Cookie) cookiesMap.get(TrackingInterceptor.SRC_TIME_COOKIE);
252
        long sourceTime = 0;
253
        if (sourceTimeCookie != null) {
254
            try {
255
                sourceTime = Long.parseLong(sourceTimeCookie.getValue());
256
            }
257
            catch (Exception e) {
258
                log.warn("Unable to parse session src time cookie.");
259
            }
260
            user.setSourceStartTime(sourceTime);
261
        }
262
 
263
		user.setSex(Sex.WONT_SAY);
264
		user.setIsFacebookUser(true);
265
 
266
		UserClient userContextServiceClient;
267
		try {
268
			userContextServiceClient = new UserClient();
269
			in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
270
			try{
271
				user = userClient.createUser(user);
272
			}catch (UserContextException ux){
273
				addActionError("User already exists with this email id.");
12616 anikendra 274
//				DataLogger.logData(EventType.REGISTER_FAILED_USER_EXISTS, getSessionId(), userinfo.getUserId(), email, "", email);
7825 amar.kumar 275
				return false;				
276
			}
277
			this.userId = user.getUserId();
278
			long userId = user.getUserId();
279
			userClient.setUserAsLoggedIn(userId, (new Date()).getTime());
280
			String pincode = userClient.getDefaultPincode(user.getUserId());
281
 
282
			if(userinfo.getUserId() != -1){
283
				userClient.mergeCart(userinfo.getCartId(), user.getActiveCartId());
284
 
285
				List<Long> items = userClient.getBrowseHistoryItems(userinfo.getUserId());
286
				if(items != null){
287
					for(Long itemId: items){
288
						userClient.updateBrowseHistory(user.getUserId(), itemId);
289
					}
290
				}
291
 
292
				items = userClient.getMyResearchItems(userinfo.getUserId());
293
				if(items != null){
294
					for(Long itemId: items){
295
						userClient.updateMyResearch(user.getUserId(), itemId);
296
					}
297
				}
298
			}
299
 
300
			userinfo.setUserId(userId);
301
			userinfo.setEmail(email);
302
			userinfo.setLoggedIn(true);
303
			userinfo.setPincode(pincode);
304
			userinfo.setCartId(user.getActiveCartId());
305
			Cart cart = userClient.getCart(userinfo.getCartId());
306
			userinfo.setTotalItems(cart.getLinesSize());
307
			userinfo.setTotalAmount(cart.getTotalPrice());
308
 
309
	        if (cookiesMap.containsKey(TrackingInterceptor.AFF_COOKIE)) {
310
	            long affId = Long.parseLong(cookiesMap.get(TrackingInterceptor.AFF_COOKIE).getValue());
311
	            userClient.addTrackLog(affId, userId, TrackLogType.NEW_REGISTRATION, "",email, (new Date()).getTime());
312
	        }
12616 anikendra 313
//	        DataLogger.logData(EventType.REGISTER_SUCCESS, getSessionId(), userinfo.getUserId(), email, "", email);
7825 amar.kumar 314
 
315
			return true;
316
		} catch (TTransportException e) {
317
			log.error("Unable to register user." + e);
318
		} catch (UserContextException e) {
319
			log.error("Unable to register user." + e);
320
		} catch (TException e) {
321
			log.error("Unable to register user." + e);
322
		} catch (UserAffiliateException e) {
323
			log.error("Unable to register user." + e);
324
		} catch (ShoppingCartException e) {
325
			log.error("Unable to register user." + e);
326
		} catch (WidgetException e) {
327
			log.error("Unable to register user." + e);
328
		}
329
		return false;
330
	}
331
 
332
	public String facebooklogin(){
333
		try {
334
			String dataResponse = signed_request.split("\\.")[1];
335
			String encoded_json = dataResponse.replace("-", "+").replace("_", "/");
336
			byte[] decoded_json  = Base64.decodeBase64(encoded_json);
337
			JSONObject json_data = new JSONObject(new String(decoded_json, "UTF-8"));
338
			this.request.setAttribute("name", (new JSONObject(json_data.get("registration").toString())).get("name"));
339
			this.request.setAttribute("email", (new JSONObject(json_data.get("registration").toString())).get("email"));
340
			this.request.setAttribute("accessToken", json_data.get("oauth_token").toString());
341
			this.request.setAttribute("facebookId", json_data.get("user_id").toString());
342
			this.request.setAttribute("isFacebookUser", "true");
343
			if(loginUser()){
344
				return "redirect";
345
			} else {
346
				log.error("Error in logging through facebook");
347
				addActionError(UserMessage.FACEBOOK_USER_AUTH_FAILURE);
348
				return "login";
349
			}
350
		} catch (Exception e ) {
351
			log.error("Error in reading facebook response for login", e);
352
			addActionError(UserMessage.FACEBOOK_USER_AUTH_FAILURE);
353
			return "login";
354
		}
355
	}
356
 
5510 rajveer 357
	public String authenticateUser() {
358
		String email, password;
359
 
360
		email = this.request.getParameter("email");
361
		password = this.request.getParameter("password");
362
 
363
		if (email == null || password == null) {
364
			loginResult = "0";
365
			return "result";
366
		}
367
 
368
		String encryptedPassword = desEncrypter.encrypt(password);
369
		try{
370
			UserClient userContextServiceClient = new UserClient();
371
			in.shop2020.model.v1.user.UserContextService.Client userClient = userContextServiceClient.getClient();
372
			userClient.authenticateUser(email, encryptedPassword);
373
		}catch (Exception e) {
374
			loginResult = "0";
375
			return "result";
376
		}
377
		loginResult = "1";
378
		return "result";
379
	}
380
 
381
	public String getLoginResult() {
382
		return loginResult;
383
	}
384
 
924 vikas 385
	public String getRedirectUrl() {
386
		return redirectUrl;
781 vikas 387
	}
388
 
924 vikas 389
	public void setRedirectUrl(String redirectUrl) {
390
		this.redirectUrl = redirectUrl;
391
	}
6903 anupam.sin 392
 
7825 amar.kumar 393
	public String getSigned_request() {
394
		return signed_request;
395
	}
396
	public void setSigned_request(String signed_request) {
397
		this.signed_request = signed_request;
398
	}
399
 
6903 anupam.sin 400
	public static void main(String[] args) {
401
        DesEncrypter des = new DesEncrypter("saholic");
12788 amit.gupta 402
        System.out.println(des.decrypt("V9gWakvuejQEJqCJjYhZtA"));
6903 anupam.sin 403
    }
11808 amit.gupta 404
 
405
	private boolean isPrivateDealUser() throws TTransportException, TException{
406
		try {
407
			in.shop2020.model.v1.user.UserContextService.Client uc = new UserClient().getClient();
408
			return uc.isPrivateDealUser(userinfo.getUserId());
409
		} catch (TTransportException e) {
410
			log.error("Unable to get user service client.", e);	
411
		}
412
		return false;
413
	}
637 rajveer 414
}