From d717f75bb44ed576c79b429db6e22c41d59b09a7 Mon Sep 17 00:00:00 2001 From: ljacqu Date: Fri, 23 Dec 2016 23:51:23 +0100 Subject: [PATCH] #1014 Use ConfigMe improvements to create custom Enum set property --- .../authme/security/PasswordSecurity.java | 4 +- .../authme/settings/EnumSetProperty.java | 38 +++++++++---------- .../commandconfig/CommandSettingsHolder.java | 3 +- .../settings/properties/SecuritySettings.java | 3 +- .../authme/security/PasswordSecurityTest.java | 10 ++--- 5 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java index 24607058..8549b388 100644 --- a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java +++ b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java @@ -6,7 +6,6 @@ import fr.xephi.authme.events.PasswordEncryptionEvent; import fr.xephi.authme.initialization.Reloadable; import fr.xephi.authme.security.crypts.EncryptionMethod; import fr.xephi.authme.security.crypts.HashedPassword; -import fr.xephi.authme.settings.EnumSetProperty; import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.properties.SecuritySettings; import org.bukkit.plugin.PluginManager; @@ -42,8 +41,7 @@ public class PasswordSecurity implements Reloadable { @Override public void reload() { this.algorithm = settings.getProperty(SecuritySettings.PASSWORD_HASH); - // TODO #1014: Need to cast to specific type because ConfigMe ignores fields of child Property types - this.legacyAlgorithms = ((EnumSetProperty) SecuritySettings.LEGACY_HASHES).asEnumSet(settings); + this.legacyAlgorithms = settings.getProperty(SecuritySettings.LEGACY_HASHES); } /** diff --git a/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java b/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java index 66def52b..37ebba81 100644 --- a/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java +++ b/src/main/java/fr/xephi/authme/settings/EnumSetProperty.java @@ -1,38 +1,38 @@ package fr.xephi.authme.settings; -import ch.jalu.configme.SettingsManager; -import ch.jalu.configme.properties.StringListProperty; +import ch.jalu.configme.properties.Property; +import ch.jalu.configme.resource.PropertyResource; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import static com.google.common.collect.Sets.newHashSet; + /** * Property whose value is a set of entries of a given enum. */ -// TODO #1014: This property type currently extends StringListProperty with a dedicated method to convert the values -// into a Set of the selected enum due to multiple issues on ConfigMe's side. -public class EnumSetProperty> extends StringListProperty { +public class EnumSetProperty> extends Property> { private final Class enumClass; - public EnumSetProperty(Class enumClass, String path, String... values) { - super(path, values); + @SafeVarargs + public EnumSetProperty(Class enumClass, String path, E... values) { + super(path, newHashSet(values)); this.enumClass = enumClass; } - /** - * Returns the value as a set of enum entries. - * - * @param settings the settings manager to look up the raw value with - * @return the property's value as mapped enum entries - */ - public Set asEnumSet(SettingsManager settings) { - List entries = settings.getProperty(this); - return entries.stream() - .map(str -> toEnum(str)) - .filter(e -> e != null) - .collect(Collectors.toSet()); + @Override + protected Set getFromResource(PropertyResource resource) { + List elements = resource.getList(getPath()); + if (elements != null) { + return elements.stream() + .map(val -> toEnum(String.valueOf(val))) + .filter(e -> e != null) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + return null; } private E toEnum(String str) { diff --git a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java index 7487d298..008d4b99 100644 --- a/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java +++ b/src/main/java/fr/xephi/authme/settings/commandconfig/CommandSettingsHolder.java @@ -46,8 +46,7 @@ public final class CommandSettingsHolder implements SettingsHolder { "Supported command events: onLogin, onJoin, onRegister" }; Map commentMap = new HashMap<>(); - // TODO ConfigMe/#25 cannot set comments on the root ("") - commentMap.put("onLogin", comments); + commentMap.put("", comments); return commentMap; } diff --git a/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java b/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java index 586395cb..5d3d870c 100644 --- a/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java +++ b/src/main/java/fr/xephi/authme/settings/properties/SecuritySettings.java @@ -7,6 +7,7 @@ import fr.xephi.authme.security.HashAlgorithm; import fr.xephi.authme.settings.EnumSetProperty; import java.util.List; +import java.util.Set; import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseListProperty; import static ch.jalu.configme.properties.PropertyInitializer.newProperty; @@ -83,7 +84,7 @@ public class SecuritySettings implements SettingsHolder { "legacyHashes:", "- 'SHA1'" }) - public static final Property> LEGACY_HASHES = + public static final Property> LEGACY_HASHES = new EnumSetProperty<>(HashAlgorithm.class, "settings.security.legacyHashes"); @Comment("Number of rounds to use if passwordHash is set to PBKDF2. Default is 10000") diff --git a/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java b/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java index bca8b6d5..e651ebea 100644 --- a/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java +++ b/src/test/java/fr/xephi/authme/security/PasswordSecurityTest.java @@ -25,10 +25,8 @@ import org.mockito.junit.MockitoJUnitRunner; import org.mockito.stubbing.Answer; import java.util.Collections; -import java.util.List; import java.util.Set; -import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Sets.newHashSet; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalToIgnoringCase; @@ -175,7 +173,7 @@ public class PasswordSecurityTest { given(method.comparePassword(clearTextPass, password, playerLowerCase)).willReturn(false); given(method.computeHash(clearTextPass, playerLowerCase)).willReturn(newPassword); initSettings(HashAlgorithm.MD5); - given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(newArrayList(HashAlgorithm.BCRYPT.name())); + given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(newHashSet(HashAlgorithm.BCRYPT)); PasswordSecurity security = newPasswordSecurity(); // when @@ -260,8 +258,8 @@ public class PasswordSecurityTest { initSettings(HashAlgorithm.BCRYPT); PasswordSecurity passwordSecurity = newPasswordSecurity(); given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.MD5); - List legacyHashes = newArrayList(HashAlgorithm.CUSTOM.name(), HashAlgorithm.BCRYPT.name()); - given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(legacyHashes); + given(settings.getProperty(SecuritySettings.LEGACY_HASHES)) + .willReturn(newHashSet(HashAlgorithm.CUSTOM, HashAlgorithm.BCRYPT)); // when passwordSecurity.reload(); @@ -286,7 +284,7 @@ public class PasswordSecurityTest { private void initSettings(HashAlgorithm algorithm) { given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(algorithm); - given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(Collections.emptyList()); + given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(Collections.emptySet()); given(settings.getProperty(HooksSettings.BCRYPT_LOG2_ROUND)).willReturn(8); }