Subversion Repositories SmartDukaan

Rev

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