Skip to content
This repository was archived by the owner on Apr 22, 2022. It is now read-only.

Commit e939768

Browse files
author
taleksashina
committed
Merge remote-tracking branch 'remotes/origin/master' into geoknow (localize email messages, change password form, route restrictions)
2 parents d6aec5e + 490a6b4 commit e939768

20 files changed

+337
-54
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#Framework configuration files
22
/src/main/webapp/WEB-INF/web.xml
33
/src/main/resources/framework-configuration.ttl
4+
/src/main/resources/framework-components-local.ttl
45

56
#Mac
67
.DS_Store

src/main/java/authentication/FrameworkConfiguration.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package authentication;
22

33
import java.io.IOException;
4+
import java.util.HashMap;
5+
import java.util.Locale;
6+
import java.util.MissingResourceException;
7+
import java.util.ResourceBundle;
48

59
import javax.servlet.ServletContext;
610

711
import org.apache.jena.riot.RiotException;
812

913
import rdf.SecureRdfStoreManagerImpl;
1014
import util.EmailSender;
15+
import util.Localizer;
1116
import util.SSLEmailSender;
1217
import util.TLSEmailSender;
1318
import accounts.FrameworkUserManager;
@@ -50,6 +55,8 @@ public class FrameworkConfiguration {
5055

5156
private static FrameworkConfiguration instance;
5257

58+
private HashMap<Locale, Localizer> localizers = new HashMap<Locale, Localizer>();
59+
5360
/**
5461
*
5562
* @param context
@@ -360,4 +367,30 @@ public void setFrameworkUri(String frameworkUri) {
360367
this.frameworkUri = frameworkUri;
361368
}
362369

370+
public Localizer getLocalizer(Locale locale) {
371+
Localizer localizer = localizers.get(locale);
372+
if (localizer==null) {
373+
try {
374+
final ResourceBundle bundle = ResourceBundle.getBundle("locale/generator", locale);
375+
localizer = new Localizer() {
376+
@Override
377+
public String localize(String str) {
378+
try {
379+
return bundle.getString(str);
380+
} catch (Exception e) {
381+
return str;
382+
}
383+
}
384+
};
385+
} catch (MissingResourceException e) {
386+
localizer = new Localizer() {
387+
public String localize(String str) {
388+
return str;
389+
}
390+
};
391+
}
392+
localizers.put(locale, localizer);
393+
}
394+
return localizer;
395+
}
363396
}

src/main/java/authentication/web/AuthenticationServlet.java

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.io.PrintWriter;
66
import java.util.ArrayList;
77
import java.util.Collection;
8+
import java.util.Locale;
89
import java.util.UUID;
910

1011
import javax.mail.MessagingException;
@@ -19,6 +20,7 @@
1920

2021
import util.EmailSender;
2122
import util.HttpUtils;
23+
import util.Localizer;
2224
import util.RandomStringGenerator;
2325
import accounts.FrameworkUserManager;
2426
import accounts.UserProfile;
@@ -32,6 +34,8 @@
3234
*
3335
* Error codes:
3436
* 1 - user already exists (during user registration, user with the same name or e-mail already exists)
37+
* 2 - incorrect old password (change password)
38+
* 3 - user doesn't exists (in restore password)
3539
*/
3640
public class AuthenticationServlet extends HttpServlet {
3741
/**
@@ -65,6 +69,11 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
6569
throws ServletException, IOException {
6670
String mode = request.getParameter("mode");
6771

72+
String language = request.getParameter("lang");
73+
if (language==null)
74+
language = "en";
75+
Locale locale = new Locale(language);
76+
6877
PrintWriter out = response.getWriter();
6978

7079
if ("login".equals(mode)) {
@@ -143,15 +152,15 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
143152
return;
144153
}
145154
// create user
146-
String password = new RandomStringGenerator().generateSimple(8);
155+
String password = new RandomStringGenerator().generateBasic(6);
147156
try {
148157
frameworkUserManager.createUser(username, password, email);
149158

150-
EmailSender emailSender = FrameworkConfiguration.getInstance(getServletContext())
151-
.getDefaultEmailSender();
159+
FrameworkConfiguration frameworkConfiguration = FrameworkConfiguration.getInstance(getServletContext());
160+
Localizer localizer = frameworkConfiguration.getLocalizer(locale);
161+
EmailSender emailSender = frameworkConfiguration.getDefaultEmailSender();
152162

153-
emailSender.send(email, "GeoKnow registration", "Your login: " + username + ", password: "
154-
+ password);
163+
emailSender.send(email, localizer.localize("email.subject.registration"), localizer.localize("login") + ": " + username + "\n" + localizer.localize("password") + ": " + password);
155164
String responseStr = "{\"message\" : \"Your password will be sent to your e-mail address "
156165
+ email + " \"}";
157166
response.getWriter().print(responseStr);
@@ -174,15 +183,34 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
174183
boolean valid;
175184
try {
176185
valid = frameworkUserManager.checkToken(username, token);
177-
if (!valid)
178-
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "invalid token " + token
179-
+ " for user " + username);
180-
else {
186+
if (!valid) {
187+
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "invalid token " + token
188+
+ " for user " + username);
189+
} else {
190+
//check old password
191+
boolean isCorrect = frameworkUserManager.checkPassword(username, oldPassword);
192+
if (!isCorrect) {
193+
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
194+
out.print("{\"code\" : \"2\", \"message\" : \"Incorrect old password\"}");
195+
return;
196+
}
197+
181198
// change password
182199
frameworkUserManager.changePassword(username, oldPassword, newPassword);
200+
201+
// send new password to user
202+
UserProfile userProfile = frameworkUserManager.getUserProfile(username);
203+
if (userProfile == null) {
204+
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "User profile " + username + " not found");
205+
return;
206+
}
207+
FrameworkConfiguration frameworkConfiguration = FrameworkConfiguration.getInstance(getServletContext());
208+
Localizer localizer = frameworkConfiguration.getLocalizer(locale);
209+
EmailSender emailSender = frameworkConfiguration.getDefaultEmailSender();
210+
emailSender.send(userProfile.getEmail(), localizer.localize("email.subject.passwordChanged"), localizer.localize("email.message.passwordChanged") + " " + username);
211+
183212
String responseStr = "{\"message\" : \"Your password was changed\"}";
184213
response.getWriter().print(responseStr);
185-
186214
}
187215
} catch (Exception e) {
188216
e.printStackTrace();
@@ -197,18 +225,20 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
197225
try {
198226
userProfile = frameworkUserManager.getUserProfile(username);
199227
if (userProfile == null) {
200-
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "User profile "
201-
+ username + " not found");
228+
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
229+
out.print("{\"code\" : \"3\", \"message\" : \"User doesn't exists\"}");
230+
return;
202231
}
203232
// change password
204-
String password = new RandomStringGenerator().generateSimple(8);
233+
String password = new RandomStringGenerator().generateBasic(6);
205234
frameworkUserManager.setPassword(username, password);
206235

207236
// send new password to user
208-
EmailSender emailSender = FrameworkConfiguration.getInstance(getServletContext())
209-
.getDefaultEmailSender();
210-
emailSender.send(userProfile.getEmail(), "GeoKnow restore password", "Your login: "
211-
+ username + ", password: " + password);
237+
FrameworkConfiguration frameworkConfiguration = FrameworkConfiguration.getInstance(getServletContext());
238+
Localizer localizer = frameworkConfiguration.getLocalizer(locale);
239+
EmailSender emailSender = frameworkConfiguration.getDefaultEmailSender();
240+
emailSender.send(userProfile.getEmail(), localizer.localize("email.subject.passwordRestored"), localizer.localize("login") + ": "
241+
+ username + "\n" + localizer.localize("password") + ": " + password);
212242
String responseStr = "{\"message\" : \"New password will be sent to your e-mail address "
213243
+ userProfile.getEmail() + " \"}";
214244
response.getWriter().print(responseStr);

src/main/java/authentication/web/UserManagerServlet.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.ArrayList;
66
import java.util.Collection;
77
import java.util.Iterator;
8+
import java.util.Locale;
89

910
import javax.mail.MessagingException;
1011
import javax.servlet.ServletConfig;
@@ -18,6 +19,7 @@
1819

1920
import util.EmailSender;
2021
import util.HttpUtils;
22+
import util.Localizer;
2123
import util.RandomStringGenerator;
2224
import accounts.FrameworkUserManager;
2325
import accounts.UserProfileExtended;
@@ -110,7 +112,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
110112
String role = rootNode.path("profile").path("role")==null ? null : rootNode.path("profile").path("role").getTextValue();
111113

112114
// create user
113-
String password = new RandomStringGenerator().generateSimple(8);
115+
String password = new RandomStringGenerator().generateBasic(6);
114116
try {
115117
frameworkUserManager.createUser(username, password, email);
116118
} catch (Exception e) {
@@ -137,10 +139,14 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
137139

138140
EmailSender emailSender = null;
139141
try {
140-
emailSender = FrameworkConfiguration.getInstance(getServletContext())
141-
.getDefaultEmailSender();
142-
emailSender.send(email, "GeoKnow registration", "Your login: " + username + ", password: "
143-
+ password);
142+
String language = req.getParameter("lang");
143+
if (language==null)
144+
language = "en";
145+
Locale locale = new Locale(language);
146+
FrameworkConfiguration frameworkConfiguration = FrameworkConfiguration.getInstance(getServletContext());
147+
Localizer localizer = frameworkConfiguration.getLocalizer(locale);
148+
emailSender = frameworkConfiguration.getDefaultEmailSender();
149+
emailSender.send(email, localizer.localize("email.subject.registration"), localizer.localize("login") + ": " + username + "\n" + localizer.localize("password") + ": " + password);
144150
} catch (MessagingException e) {
145151
throw new ServletException("Failed to send email to " + email + " using " + emailSender, e);
146152
} catch (Exception e) {

src/main/java/util/Localizer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package util;
2+
3+
/**
4+
* Created by taleksaschina on 18.07.2014.
5+
*/
6+
public interface Localizer {
7+
String localize(String str);
8+
}

src/main/java/util/RandomStringGenerator.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package util;
22

3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
36
import java.util.Random;
47

58
public class RandomStringGenerator {
@@ -12,11 +15,53 @@ public class RandomStringGenerator {
1215
'+', '-', '_'
1316
};
1417

18+
private static char[] lower = {
19+
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
20+
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
21+
};
22+
23+
private static char[] upper = {
24+
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
25+
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
26+
};
27+
28+
private static char[] digits = {
29+
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
30+
};
31+
1532
public String generateSimple(int length) {
1633
Random random = new Random();
1734
StringBuilder sb = new StringBuilder();
1835
for (int i = 0; i < length; i++)
1936
sb.append(chars[random.nextInt(chars.length)]);
2037
return sb.toString();
2138
}
39+
40+
//at least one digit, one upper case and one lower case
41+
public String generateBasic(int length) {
42+
if (length < 3)
43+
throw new RuntimeException("Invalid basic password length (< 3)");
44+
45+
List<Character> passwordChars = new ArrayList<>();
46+
47+
Random randomLower = new Random();
48+
passwordChars.add(lower[randomLower.nextInt(lower.length)]);
49+
50+
Random randomUpper = new Random();
51+
passwordChars.add(upper[randomUpper.nextInt(upper.length)]);
52+
53+
Random randomDigit = new Random();
54+
passwordChars.add(digits[randomDigit.nextInt(digits.length)]);
55+
56+
Random randomChars = new Random();
57+
for (int i = 0; i < length-3; i++)
58+
passwordChars.add(chars[randomChars.nextInt(chars.length)]);
59+
60+
Collections.shuffle(passwordChars);
61+
62+
StringBuilder passwordString = new StringBuilder();
63+
for (Character c : passwordChars)
64+
passwordString.append(c);
65+
return passwordString.toString();
66+
}
2267
}

src/main/java/util/TLSEmailSender.java

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,44 @@ public TLSEmailSender(String smtpHost, String smtpPort, String fromEmail, String
2020
this.emailPassword = emailPassword;
2121
}
2222

23-
public void send(String toEmail, String msgSubject, String msgText) throws MessagingException {
24-
Properties props = new Properties();
25-
props.put("mail.smtp.auth", "true");
26-
props.put("mail.smtp.starttls.enable", "true");
27-
props.put("mail.smtp.host", smtpHost);
28-
props.put("mail.smtp.port", smtpPort);
29-
30-
Session session = Session.getInstance(props,
31-
new javax.mail.Authenticator() {
32-
protected PasswordAuthentication getPasswordAuthentication() {
33-
return new PasswordAuthentication(emailUsername, emailPassword);
34-
}
35-
});
36-
37-
Message message = new MimeMessage(session);
38-
message.setFrom(new InternetAddress(fromEmail));
39-
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
40-
message.setSubject(msgSubject);
41-
message.setText(msgText);
42-
43-
Transport.send(message);
23+
public void send(String toEmail, String msgSubject, String msgText) throws MessagingException
24+
{
25+
Properties props = new Properties();
26+
props.put("mail.smtp.starttls.enable", "true");
27+
props.put("mail.smtp.host", smtpHost);
28+
props.put("mail.smtp.port", smtpPort);
29+
30+
Session session;
31+
32+
if (emailUsername == null || emailUsername.isEmpty())
33+
session = Session.getDefaultInstance(props);
34+
else
35+
{
36+
props.put("mail.smtp.auth", "true");
37+
session = Session.getInstance(props, new Authenticator()
38+
{
39+
protected PasswordAuthentication getPasswordAuthentication()
40+
{
41+
return new PasswordAuthentication(emailUsername, emailPassword);
42+
}
43+
});
44+
}
45+
46+
Message message = new MimeMessage(session);
47+
message.setFrom(new InternetAddress(fromEmail));
48+
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
49+
message.setSubject(msgSubject);
50+
message.setText(msgText);
51+
52+
Transport.send(message);
53+
}
54+
55+
@Override
56+
public String toString() {
57+
return "TLSEmailSender{" +
58+
"smtpHost='" + smtpHost + '\'' +
59+
", smtpPort='" + smtpPort + '\'' +
60+
", fromEmail='" + fromEmail + '\'' +
61+
'}';
4462
}
4563
}

src/main/resources/framework-components.ttl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,19 @@
132132
:UserManagerService
133133
a lds:ComponentService ;
134134
dcterms:description "Provides create/update functionality for accounts and roles."^^xsd:string ;
135-
lds:serviceUrl <http://localhost:8080/generator/UserManagerServlet> .
135+
lds:serviceUrl <http://localhost:8080/generator/UserManagerServlet> .
136+
137+
########### ROUTES RESTRICTIONS DESCRIPTION #######################################################
138+
# Following triples describe required services for routes. It is used in conditional routing.
139+
# #######################################################################################
140+
141+
:OntologyRouteRestriction
142+
a gkg:RouteRestriction;
143+
gkg:partialUrl "/home/manual-revision-and-authoring/ontology"^^xsd:string;
144+
gkg:requiredService :D2RQService;
145+
gkg:requiredService :MiniDixService .
146+
147+
:RolesRouteRestriction
148+
a gkg:RouteRestriction;
149+
gkg:partialUrl "/settings/roles"^^xsd:string;
150+
gkg:requiredService :UserManagerService .

0 commit comments

Comments
 (0)