Subversion Repositories SmartDukaan

Rev

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