Skip to content

Commit a3ac6a8

Browse files
committed
implement password encoder from spring security
1 parent 4b9c9e9 commit a3ac6a8

File tree

17 files changed

+201
-121
lines changed

17 files changed

+201
-121
lines changed

haikudepotserver-core-test/src/main/java/org/haiku/haikudepotserver/IntegrationTestSupportService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ private void ensureUserRatingAggregate(ObjectContext context, Pkg pkg, Repositor
333333
Optional<PkgUserRatingAggregate> aggregateOptional = pkg.getPkgUserRatingAggregate(repository);
334334
PkgUserRatingAggregate aggregate;
335335

336-
if(!aggregateOptional.isPresent()) {
336+
if(aggregateOptional.isEmpty()) {
337337
aggregate = context.newObject(PkgUserRatingAggregate.class);
338338
pkg.addToManyTarget(Pkg.PKG_USER_RATING_AGGREGATES.getName(), aggregate, true);
339339
aggregate.setRepository(repository);
@@ -346,11 +346,10 @@ private void ensureUserRatingAggregate(ObjectContext context, Pkg pkg, Repositor
346346
aggregate.setDerivedRatingSampleSize(sampleSize);
347347
}
348348

349-
public User createBasicUser(ObjectContext context, String nickname, String password) {
349+
public User createBasicUser(ObjectContext context, String nickname, String passwordClear) {
350350
User user = context.newObject(User.class);
351351
user.setNickname(nickname);
352-
user.setPasswordSalt(); // random
353-
user.setPasswordHash(userAuthenticationService.hashPassword(user, password));
352+
userAuthenticationService.setPassword(user, passwordClear);
354353
user.setNaturalLanguage(NaturalLanguage.getByCode(context, NaturalLanguage.CODE_ENGLISH));
355354
context.commitChanges();
356355
return user;

haikudepotserver-core-test/src/test/java/org/haiku/haikudepotserver/security/UserAuthenticationServiceIT.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,36 @@ public void testAuthenticateByNicknameAndPassword() {
5555
@Test
5656
public void testHashPassword() {
5757
User user = new User();
58-
user.setPasswordSalt("cad3422ea02761f8");
59-
String passwordHash = userAuthenticationService.hashPassword(user,"p4mphl3t");
60-
Assertions.assertThat(passwordHash).isEqualTo("b9c4717bc5c6d16f2be9e967ab0c752f8ac2084f95781989f39cf8736e2edeef");
58+
59+
// -----------------
60+
userAuthenticationService.setPassword(user, "p4mphl3t");
61+
// -----------------
62+
63+
Assertions.assertThat(userAuthenticationService.matchPassword(user, "p4mphl3t")).isTrue();
64+
Assertions.assertThat(userAuthenticationService.matchPassword(user, "Other")).isFalse();
6165
}
6266

6367
@Test
6468
public void testHashPassword_2() {
6569
User user = new User();
66-
user.setPasswordSalt("66a9b264bf730ac2");
67-
String passwordHash = userAuthenticationService.hashPassword(user,"Pa55word0");
68-
Assertions.assertThat(passwordHash).isEqualTo("d439da8f2ec8c7aa3d0c9c2a1dd7cd6dcbf8b4435f9e288cc1a6f7b77d47361e");
70+
71+
// -----------------
72+
userAuthenticationService.setPassword(user, "Pa55word0");
73+
// -----------------
74+
75+
Assertions.assertThat(userAuthenticationService.matchPassword(user, "Pa55word0")).isTrue();
76+
Assertions.assertThat(userAuthenticationService.matchPassword(user, "Other")).isFalse();
77+
}
78+
79+
@Test(expected = Exception.class)
80+
public void testClearPassword() {
81+
User user = new User();
82+
83+
// -----------------
84+
userAuthenticationService.setPassword(user, null);
85+
// -----------------
86+
87+
// expecting an exception.
6988
}
7089

7190
}

haikudepotserver-core/src/main/java/org/haiku/haikudepotserver/api1/RepositoryApiImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,11 +309,11 @@ public UpdateRepositoryResult updateRepository(UpdateRepositoryRequest updateRep
309309

310310
case PASSWORD:
311311
if (StringUtils.isBlank(updateRepositoryRequest.passwordClear)) {
312+
repository.setPasswordSalt(null);
312313
repository.setPasswordHash(null);
313314
LOGGER.info("cleared the password for repository [{}]", repository);
314315
} else {
315-
repository.setPasswordHash(userAuthenticationService.hashPassword(
316-
repository.getPasswordSalt(), updateRepositoryRequest.passwordClear));
316+
repositoryService.setPassword(repository, updateRepositoryRequest.passwordClear);
317317
LOGGER.info("did update the repository [{}] password", repository);
318318
}
319319
break;

haikudepotserver-core/src/main/java/org/haiku/haikudepotserver/api1/UserApiImpl.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ public CreateUserResult createUser(CreateUserRequest createUserRequest) throws O
219219
user.setNaturalLanguage(getNaturalLanguage(context, createUserRequest.naturalLanguageCode));
220220
user.setNickname(createUserRequest.nickname);
221221
user.setEmail(createUserRequest.email);
222-
user.setPasswordHash(userAuthenticationService.hashPassword(user, createUserRequest.passwordClear));
222+
223+
userAuthenticationService.setPassword(user, createUserRequest.passwordClear);
223224

224225
UserUsageConditionsAgreement agreement = context.newObject(UserUsageConditionsAgreement.class);
225226
agreement.setUser(user);
@@ -400,7 +401,8 @@ public ChangePasswordResult changePassword(
400401
}
401402
}
402403

403-
targetUser.setPasswordHash(userAuthenticationService.hashPassword(targetUser, changePasswordRequest.newPasswordClear));
404+
userAuthenticationService.setPassword(targetUser, changePasswordRequest.newPasswordClear);
405+
404406
context.commitChanges();
405407
LOGGER.info("did change password for user {}", changePasswordRequest.nickname);
406408

haikudepotserver-core/src/main/java/org/haiku/haikudepotserver/config/BasicConfig.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2018, Andrew Lindesay
2+
* Copyright 2018-2020, Andrew Lindesay
33
* Distributed under the terms of the MIT License.
44
*/
55

@@ -18,6 +18,7 @@
1818
import org.haiku.haikudepotserver.graphics.bitmap.PngOptimizationServiceFactory;
1919
import org.haiku.haikudepotserver.graphics.hvif.HvifRenderingService;
2020
import org.haiku.haikudepotserver.graphics.hvif.HvifRenderingServiceFactory;
21+
import org.haiku.haikudepotserver.security.PasswordEncoder;
2122
import org.haiku.haikudepotserver.support.RuntimeInformationService;
2223
import org.haiku.haikudepotserver.support.freemarker.LocalizedTemplateLoader;
2324
import org.haiku.haikudepotserver.support.logging.LoggingSetupOrchestration;
@@ -30,6 +31,7 @@
3031
import org.springframework.context.annotation.Import;
3132
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
3233
import org.springframework.core.io.ResourceLoader;
34+
import org.springframework.security.crypto.keygen.KeyGenerators;
3335
import org.springframework.stereotype.Controller;
3436

3537
import java.util.List;
@@ -129,4 +131,9 @@ public MessageSource messageSource(
129131
return messageSource;
130132
}
131133

134+
@Bean
135+
public PasswordEncoder passwordEncoder() {
136+
return new PasswordEncoder(KeyGenerators.secureRandom(8));
137+
}
138+
132139
}

haikudepotserver-core/src/main/java/org/haiku/haikudepotserver/dataobjects/Repository.java

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
/*
2-
* Copyright 2018, Andrew Lindesay
2+
* Copyright 2018-2020, Andrew Lindesay
33
* Distributed under the terms of the MIT License.
44
*/
55

66
package org.haiku.haikudepotserver.dataobjects;
77

88
import com.google.common.base.Preconditions;
9-
import com.google.common.hash.Hashing;
109
import org.apache.cayenne.ObjectContext;
1110
import org.apache.cayenne.ObjectId;
12-
import org.apache.cayenne.query.*;
11+
import org.apache.cayenne.query.ObjectSelect;
12+
import org.apache.cayenne.query.SelectById;
1313
import org.apache.cayenne.validation.BeanValidationFailure;
1414
import org.apache.cayenne.validation.ValidationResult;
1515
import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -25,7 +25,6 @@
2525
import java.net.URL;
2626
import java.util.List;
2727
import java.util.Optional;
28-
import java.util.UUID;
2928
import java.util.stream.Collectors;
3029

3130
public class Repository extends _Repository implements MutableCreateAndModifyTimestamped, Coded, Comparable<Repository> {
@@ -88,14 +87,6 @@ public void validateForInsert(ValidationResult validationResult) {
8887
super.validateForInsert(validationResult);
8988
}
9089

91-
// called from a listener
92-
@SuppressWarnings("unused")
93-
public void onPostAdd() {
94-
if(null==getPasswordSalt()) {
95-
setPasswordSalt();
96-
}
97-
}
98-
9990
@Override
10091
protected void validateForSave(ValidationResult validationResult) {
10192
super.validateForSave(validationResult);
@@ -121,11 +112,6 @@ UriComponentsBuilder appendPathSegments(UriComponentsBuilder builder) {
121112
return builder.pathSegment(getCode());
122113
}
123114

124-
private void setPasswordSalt() {
125-
String randomHash = Hashing.sha256().hashUnencodedChars(UUID.randomUUID().toString()).toString();
126-
setPasswordSalt(randomHash.substring(0,16));
127-
}
128-
129115
@Override
130116
public int compareTo(Repository o) {
131117
return getCode().compareTo(o.getCode());

haikudepotserver-core/src/main/java/org/haiku/haikudepotserver/dataobjects/User.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
/*
2-
* Copyright 2018-2019, Andrew Lindesay
2+
* Copyright 2018-2020, Andrew Lindesay
33
* Distributed under the terms of the MIT License.
44
*/
55

66
package org.haiku.haikudepotserver.dataobjects;
77

88
import com.google.common.base.Preconditions;
99
import com.google.common.base.Strings;
10-
import com.google.common.hash.Hashing;
1110
import org.apache.cayenne.ObjectContext;
1211
import org.apache.cayenne.ObjectId;
1312
import org.apache.cayenne.query.ObjectIdQuery;
@@ -25,7 +24,6 @@
2524
import javax.mail.internet.InternetAddress;
2625
import java.util.List;
2726
import java.util.Optional;
28-
import java.util.UUID;
2927
import java.util.regex.Pattern;
3028
import java.util.stream.Collectors;
3129

@@ -91,10 +89,6 @@ public void onPostAdd() {
9189
setActive(Boolean.TRUE);
9290
}
9391

94-
if(null==getPasswordSalt()) {
95-
setPasswordSalt();
96-
}
97-
9892
// create and modify timestamp handled by listener.
9993
}
10094

@@ -157,15 +151,6 @@ public List<? extends AuthorizationPkgRule> getAuthorizationPkgRules(final Pkg p
157151
.collect(Collectors.toList());
158152
}
159153

160-
/**
161-
* <p>This method will configure a random salt value.</p>
162-
*/
163-
164-
public void setPasswordSalt() {
165-
String randomHash = Hashing.sha256().hashUnencodedChars(UUID.randomUUID().toString()).toString();
166-
setPasswordSalt(randomHash.substring(0,16)); // LDAP server doesn't seem to like very long salts
167-
}
168-
169154
@Override
170155
public String toString() {
171156
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)

haikudepotserver-core/src/main/java/org/haiku/haikudepotserver/dataobjects/auto/_Repository.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,4 @@ public List<RepositorySource> getRepositorySources() {
104104
return (List<RepositorySource>)readProperty("repositorySources");
105105
}
106106

107-
108-
protected abstract void onPostAdd();
109-
110107
}

haikudepotserver-core/src/main/java/org/haiku/haikudepotserver/passwordreset/PasswordResetServiceImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,7 @@ public void complete(String tokenCode, String passwordClear) {
189189
if (user.getActive()) {
190190

191191
if (!Strings.isNullOrEmpty(passwordClear) && userAuthenticationService.validatePassword(passwordClear)) {
192-
user.setPasswordSalt();
193-
user.setPasswordHash(userAuthenticationService.hashPassword(user, passwordClear));
192+
userAuthenticationService.setPassword(user, passwordClear);
194193
context.deleteObjects(token);
195194
context.commitChanges();
196195

0 commit comments

Comments
 (0)