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
		return userDAO.getUserByEmail(email);
64
	}
65

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

    
71
		if (user.getId() == null) {
72
			user.setId(generateId(user));
73
			user.setSource("portal");
74

    
75
			previousRoles = new ArrayList<UserRole>();
76
		} else {
77
			previousRoles = user.getRoles();
78
		}
79
		
80
		userDAO.saveUser(user);
81

    
82
		final List<User> moderators = userDAO.getModerators();
83

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

    
95
					if (roles.size() > 0) {
96
						emailUtils.sendUserRoleRequestedEmail(user, roles);
97

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

    
107
		return user;
108
	}
109

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

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

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

    
141
	@Override
142
	public User login(String email, String password) throws PersonManagerException {
143

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
311
}
(29-29/29)