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
				User user = getByEmail(email);
150
				if (user.isActive()) {
151
					return user;
152
				}
153
				else
154
					throw new PersonManagerException(PersonManagerException.ErrorCause.NOT_ACTIVATED);
155
			} else {
156
				throw new PersonManagerException(PersonManagerException.ErrorCause.WRONG_EMAIL_OR_PASSWORD);
157
			}
158
		} catch (PersonManagerException e) {
159
			throw e;
160
		} catch (Exception e) {
161
			log.error("Error logging in", e);
162
		}
163
		return null;
164
	}
165

    
166
	@Override
167
	public User activate(final String email, final String token) throws PersonManagerException {
168

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

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

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

    
200
	@Override
201
	public List<Role> getRoles() {
202
		return userDAO.getRoles();
203
	}
204

    
205
	@Override
206
	public List<User> getModerators() {
207
		return userDAO.getModerators();
208
	}
209

    
210
	@Override
211
	public List<User> getAccountingOfficers() {
212
		return userDAO.getAccountingOfficers();
213
	}
214

    
215
	@Override
216
	public void activateUser(String email) {
217
		userDAO.activateUser(email);
218
	}
219

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

    
227
	@Override
228
	public void deactivateUser(String email) {
229
		userDAO.deactivateUser(email);
230
	}
231

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

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

    
259
	@Override
260
	public void rejectRole(final String email, final String roleId) {
261
		userDAO.rejectUserRole(email, roleId);
262

    
263
		final User user = userDAO.getUserByEmail(email);
264
		final Role role = getRole(roleId);
265
		final List<User> moderators = getModerators();
266

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

    
281
	@Override
282
	public List<User> getUsers() {
283
		return userDAO.getUsers();
284
	}
285

    
286
	@Override
287
	public String generateId(User user) {
288
		StringBuilder sb = new StringBuilder();
289

    
290
		sb.append(user.getFirstname()).append(user.getLastname()).append(user.getEmail());
291
		return "portal::" + DigestUtils.md5Hex(sb.toString());
292
	}
293

    
294
	public int getTokenTTL() {
295
		return tokenTTL;
296
	}
297

    
298
	public void setTokenTTL(int tokenTTL) {
299
		this.tokenTTL = tokenTTL;
300
	}
301

    
302
	@Override
303
	public Role getRole(String roleId){
304
		return userDAO.getRole(roleId);
305
	}
306

    
307
	@Override
308
	public List<Role> getUserRoles(String email){
309
		return userDAO.getUserRoles(email);
310
	}
311

    
312
}
(29-29/29)