Project

General

Profile

1
package eu.dnetlib.goldoa.service;
2

    
3

    
4
import eu.dnetlib.goldoa.domain.*;
5
import eu.dnetlib.goldoa.service.dao.UserDAO;
6
import eu.dnetlib.goldoa.service.utils.EmailUtils;
7
import org.apache.commons.codec.digest.DigestUtils;
8
import org.apache.commons.logging.Log;
9
import org.apache.commons.logging.LogFactory;
10
import org.springframework.beans.factory.annotation.Autowired;
11
import org.springframework.stereotype.Service;
12
import org.springframework.transaction.annotation.Transactional;
13

    
14
import javax.mail.MessagingException;
15
import java.math.BigInteger;
16
import java.nio.charset.Charset;
17
import java.security.SecureRandom;
18
import java.util.ArrayList;
19
import java.util.List;
20
import java.util.UUID;
21
import java.util.concurrent.ExecutorService;
22

    
23
//import eu.dnetlib.goldoa.service.utils.EmailUtils;
24

    
25
/**
26
 * Created by antleb on 3/4/15.
27
 */
28
@Service("userManager")
29
@Transactional
30
public class UserManagerImpl implements UserManager {
31

    
32
	@Autowired
33
	private UserDAO userDAO;
34

    
35
	@Autowired
36
	private EmailUtils emailUtils;
37
	
38
	@Autowired
39
	ExecutorService executorService;
40

    
41
	private int tokenTTL = 30;
42

    
43
	private Log log = LogFactory.getLog(UserManagerImpl.class);
44

    
45
	public static int generateId(Affiliation affiliation) {
46
		StringBuilder sb = new StringBuilder();
47

    
48
		if (affiliation.getUsers().get(0) != null)
49
			sb.append(affiliation.getUsers().get(0).getId());
50
		if (affiliation.getOrganization() != null)
51
			sb.append(affiliation.getOrganization().getId());
52

    
53
		return DigestUtils.md5Hex(sb.toString()).hashCode();
54
	}
55

    
56
	@Override
57
	public User getById(String personId) throws PersonManagerException {
58
		return userDAO.getUserById(personId);
59
	}
60

    
61
	@Override
62
	public User getByEmail(final String email) throws PersonManagerException {
63
		User user = userDAO.getUserByEmail(email);
64
		if(user == null)
65
			throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_EXISTS);
66
		return user;
67
	}
68

    
69
	@Override
70
	// register or update
71
	public User saveUser(final User user) throws PersonManagerException {
72
		final List<UserRole> previousRoles;
73

    
74
		if (user.getId() == null) {
75
			user.setId(generateId(user));
76
			user.setSource("portal");
77

    
78
			previousRoles = new ArrayList<UserRole>();
79
		} else {
80
			previousRoles = user.getRoles();
81
		}
82
		
83
		userDAO.saveUser(user);
84

    
85
		final List<User> moderators = userDAO.getModerators();
86

    
87
		executorService.submit(new Runnable() {
88
			@Override
89
			public void run() {
90
				try {
91
					List<Role> roles = new ArrayList<>();
92
					for (UserRole pRole : user.getRoles()) {
93
						//!previousRoles.contains(pRole) &&
94
						if ( !pRole.isApproved())
95
							roles.add(pRole.getPk().getRole());
96
					}
97

    
98
					if (roles.size() > 0) {
99
						emailUtils.sendUserRoleRequestedEmail(user, roles);
100

    
101
						for (User moderator : moderators)
102
							emailUtils.sendModeratorRoleRequestedEmail(moderator, user, roles);
103
					}
104
				} catch (MessagingException e) {
105
					e.printStackTrace();
106
				}
107
			}
108
		});
109

    
110
		return user;
111
	}
112

    
113
	@Override
114
	public void register(final User user) throws PersonManagerException {
115
		final String token = UUID.randomUUID().toString();
116
		
117
		try {
118
			User u = userDAO.getUserByEmail(user.getEmail());
119
			if (u != null)
120
				throw new PersonManagerException(PersonManagerException.ErrorCause.ALREADY_EXISTS);
121
		} catch (PersonManagerException e) {
122
			throw e;
123
		} catch (RuntimeException e) {
124
			e.printStackTrace();
125
			throw e;
126
		}
127

    
128
		user.setPassword(org.springframework.util.DigestUtils.md5DigestAsHex( user.getPassword().getBytes(Charset.forName("UTF-8"))));
129
		this.saveUser(user);
130
		userDAO.saveToken(user.getEmail(), token, tokenTTL);
131

    
132
		executorService.submit(new Runnable() {
133
			@Override
134
			public void run() {
135
				try {
136
					emailUtils.sendActivationEmail(user, token);
137
				} catch (MessagingException e) {
138
					e.printStackTrace();
139
				}
140
			}
141
		});
142
	}
143

    
144
	@Override
145
	public User login(String email, String password) throws PersonManagerException {
146

    
147
		try {
148
			if (userDAO.verifyLogin(email, password)) {
149
				System.out.println("verified login");
150
				User user = getByEmail(email);
151
				if (user.isActive()) {
152
					System.out.println("user is active");
153
					System.out.println(">>> " + user.getEmail());
154
					return user;
155
				}
156
				else
157
					throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_ACTIVATED);
158
			} else {
159
				throw new PersonManagerException(PersonManagerException.ErrorCause.WRONG_EMAIL_OR_PASSWORD);
160
			}
161
		} catch (PersonManagerException e) {
162
			throw e;
163
		} catch (Exception e) {
164
			log.error("Error logging in", e);
165
		}
166
		return null;
167
	}
168

    
169
	@Override
170
	public User activate(final String email, final String token) throws PersonManagerException {
171

    
172
		if (!userDAO.verifyToken(email, token))
173
			throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_EXISTS);
174
		else {
175
			User user = userDAO.getUserByEmail(email);
176
			userDAO.activateUser(user.getEmail());
177
			userDAO.deleteToken(user.getEmail(), token);
178
		}
179
		return getByEmail(email);
180
	}
181

    
182
	@Override
183
	public void resetPassword(final String email) throws PersonManagerException {
184
		SecureRandom random = new SecureRandom();
185
		final String newPassword = new BigInteger(50, random).toString(32);
186

    
187
		if (!userDAO.updatePassword(newPassword, email)) {
188
			throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_EXISTS);
189
		}
190
		final User user = userDAO.getUserByEmail(email);
191
		executorService.submit(new Runnable() {
192
			@Override
193
			public void run() {
194
				try {
195
					emailUtils.sendResetPasswordEmail(user, newPassword);
196
				} catch (MessagingException e) {
197
					e.printStackTrace();
198
				}
199
			}
200
		});
201
	}
202

    
203
	@Override
204
	public List<Role> getRoles() {
205
		return userDAO.getRoles();
206
	}
207

    
208
	@Override
209
	public List<User> getModerators() {
210
		return userDAO.getModerators();
211
	}
212

    
213
	@Override
214
	public List<User> getAccountingOfficers() {
215
		return userDAO.getAccountingOfficers();
216
	}
217

    
218
	@Override
219
	public void activateUser(String email) {
220
		userDAO.activateUser(email);
221
	}
222

    
223
	@Override
224
	public void activateUsers(List<String> emails) {
225
		for (String email : emails) {
226
			userDAO.activateUser(email);
227
		}
228
	}
229

    
230
	@Override
231
	public void deactivateUser(String email) {
232
		userDAO.deactivateUser(email);
233
	}
234

    
235
	@Override
236
	public void deactivateUsers(List<String> emails) {
237
		for (String email : emails) {
238
			userDAO.deactivateUser(email);
239
		}
240
	}
241

    
242
	@Override
243
	public void acceptUserRole(final String email, final String roleId) {
244
		userDAO.acceptUserRole(email, roleId);
245
		final User user = userDAO.getUserByEmail(email);
246
		final Role role = userDAO.getRole(roleId);
247
		final List<User> moderators = getModerators();
248
		executorService.submit(new Runnable() {
249
			@Override
250
			public void run() {
251
				try {
252
					emailUtils.sendUserRoleAcceptedEmail(user, role);
253
					for (User moderator : moderators)
254
						emailUtils.sendModeratorRoleAcceptedEmail(moderator, user, role);
255
				} catch (MessagingException e) {
256
					e.printStackTrace();
257
				}
258
			}
259
		});
260
	}
261

    
262
	@Override
263
	public void rejectRole(final String email, final String roleId) {
264
		userDAO.rejectUserRole(email, roleId);
265

    
266
		final User user = userDAO.getUserByEmail(email);
267
		final Role role = getRole(roleId);
268
		final List<User> moderators = getModerators();
269

    
270
		executorService.submit(new Runnable() {
271
			@Override
272
			public void run() {
273
				try {
274
					emailUtils.sendUserRoleRejectedEmail(user, role);
275
					for (User moderator : moderators)
276
						emailUtils.sendModeratorRoleRejectedEmail(moderator, user, role);
277
				} catch (MessagingException e) {
278
					e.printStackTrace();
279
				}
280
			}
281
		});
282
	}
283

    
284
	@Override
285
	public List<User> getUsers() {
286
		return userDAO.getUsers();
287
	}
288

    
289
	@Override
290
	public String generateId(User user) {
291
		StringBuilder sb = new StringBuilder();
292

    
293
		sb.append(user.getFirstname()).append(user.getLastname()).append(user.getEmail());
294
		return "portal::" + DigestUtils.md5Hex(sb.toString());
295
	}
296

    
297
	public int getTokenTTL() {
298
		return tokenTTL;
299
	}
300

    
301
	public void setTokenTTL(int tokenTTL) {
302
		this.tokenTTL = tokenTTL;
303
	}
304

    
305
	@Override
306
	public Role getRole(String roleId){
307
		return userDAO.getRole(roleId);
308
	}
309

    
310
	@Override
311
	public List<Role> getUserRoles(String email){
312
		return userDAO.getUserRoles(email);
313
	}
314

    
315
}
(29-29/29)