#1014 Use ConfigMe improvements to create custom Enum set property

This commit is contained in:
ljacqu 2016-12-23 23:51:23 +01:00
parent 9ce680f56e
commit d717f75bb4
5 changed files with 27 additions and 31 deletions

View File

@ -6,7 +6,6 @@ import fr.xephi.authme.events.PasswordEncryptionEvent;
import fr.xephi.authme.initialization.Reloadable; import fr.xephi.authme.initialization.Reloadable;
import fr.xephi.authme.security.crypts.EncryptionMethod; import fr.xephi.authme.security.crypts.EncryptionMethod;
import fr.xephi.authme.security.crypts.HashedPassword; import fr.xephi.authme.security.crypts.HashedPassword;
import fr.xephi.authme.settings.EnumSetProperty;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.SecuritySettings; import fr.xephi.authme.settings.properties.SecuritySettings;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
@ -42,8 +41,7 @@ public class PasswordSecurity implements Reloadable {
@Override @Override
public void reload() { public void reload() {
this.algorithm = settings.getProperty(SecuritySettings.PASSWORD_HASH); 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 = settings.getProperty(SecuritySettings.LEGACY_HASHES);
this.legacyAlgorithms = ((EnumSetProperty<HashAlgorithm>) SecuritySettings.LEGACY_HASHES).asEnumSet(settings);
} }
/** /**

View File

@ -1,38 +1,38 @@
package fr.xephi.authme.settings; package fr.xephi.authme.settings;
import ch.jalu.configme.SettingsManager; import ch.jalu.configme.properties.Property;
import ch.jalu.configme.properties.StringListProperty; import ch.jalu.configme.resource.PropertyResource;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; 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. * 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 public class EnumSetProperty<E extends Enum<E>> extends Property<Set<E>> {
// into a Set of the selected enum due to multiple issues on ConfigMe's side.
public class EnumSetProperty<E extends Enum<E>> extends StringListProperty {
private final Class<E> enumClass; private final Class<E> enumClass;
public EnumSetProperty(Class<E> enumClass, String path, String... values) { @SafeVarargs
super(path, values); public EnumSetProperty(Class<E> enumClass, String path, E... values) {
super(path, newHashSet(values));
this.enumClass = enumClass; this.enumClass = enumClass;
} }
/** @Override
* Returns the value as a set of enum entries. protected Set<E> getFromResource(PropertyResource resource) {
* List<?> elements = resource.getList(getPath());
* @param settings the settings manager to look up the raw value with if (elements != null) {
* @return the property's value as mapped enum entries return elements.stream()
*/ .map(val -> toEnum(String.valueOf(val)))
public Set<E> asEnumSet(SettingsManager settings) {
List<String> entries = settings.getProperty(this);
return entries.stream()
.map(str -> toEnum(str))
.filter(e -> e != null) .filter(e -> e != null)
.collect(Collectors.toSet()); .collect(Collectors.toCollection(LinkedHashSet::new));
}
return null;
} }
private E toEnum(String str) { private E toEnum(String str) {

View File

@ -46,8 +46,7 @@ public final class CommandSettingsHolder implements SettingsHolder {
"Supported command events: onLogin, onJoin, onRegister" "Supported command events: onLogin, onJoin, onRegister"
}; };
Map<String, String[]> commentMap = new HashMap<>(); Map<String, String[]> commentMap = new HashMap<>();
// TODO ConfigMe/#25 cannot set comments on the root ("") commentMap.put("", comments);
commentMap.put("onLogin", comments);
return commentMap; return commentMap;
} }

View File

@ -7,6 +7,7 @@ import fr.xephi.authme.security.HashAlgorithm;
import fr.xephi.authme.settings.EnumSetProperty; import fr.xephi.authme.settings.EnumSetProperty;
import java.util.List; import java.util.List;
import java.util.Set;
import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseListProperty; import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseListProperty;
import static ch.jalu.configme.properties.PropertyInitializer.newProperty; import static ch.jalu.configme.properties.PropertyInitializer.newProperty;
@ -83,7 +84,7 @@ public class SecuritySettings implements SettingsHolder {
"legacyHashes:", "legacyHashes:",
"- 'SHA1'" "- 'SHA1'"
}) })
public static final Property<List<String>> LEGACY_HASHES = public static final Property<Set<HashAlgorithm>> LEGACY_HASHES =
new EnumSetProperty<>(HashAlgorithm.class, "settings.security.legacyHashes"); new EnumSetProperty<>(HashAlgorithm.class, "settings.security.legacyHashes");
@Comment("Number of rounds to use if passwordHash is set to PBKDF2. Default is 10000") @Comment("Number of rounds to use if passwordHash is set to PBKDF2. Default is 10000")

View File

@ -25,10 +25,8 @@ import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import java.util.Collections; import java.util.Collections;
import java.util.List;
import java.util.Set; import java.util.Set;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet; import static com.google.common.collect.Sets.newHashSet;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase; import static org.hamcrest.Matchers.equalToIgnoringCase;
@ -175,7 +173,7 @@ public class PasswordSecurityTest {
given(method.comparePassword(clearTextPass, password, playerLowerCase)).willReturn(false); given(method.comparePassword(clearTextPass, password, playerLowerCase)).willReturn(false);
given(method.computeHash(clearTextPass, playerLowerCase)).willReturn(newPassword); given(method.computeHash(clearTextPass, playerLowerCase)).willReturn(newPassword);
initSettings(HashAlgorithm.MD5); 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(); PasswordSecurity security = newPasswordSecurity();
// when // when
@ -260,8 +258,8 @@ public class PasswordSecurityTest {
initSettings(HashAlgorithm.BCRYPT); initSettings(HashAlgorithm.BCRYPT);
PasswordSecurity passwordSecurity = newPasswordSecurity(); PasswordSecurity passwordSecurity = newPasswordSecurity();
given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.MD5); given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(HashAlgorithm.MD5);
List<String> legacyHashes = newArrayList(HashAlgorithm.CUSTOM.name(), HashAlgorithm.BCRYPT.name()); given(settings.getProperty(SecuritySettings.LEGACY_HASHES))
given(settings.getProperty(SecuritySettings.LEGACY_HASHES)).willReturn(legacyHashes); .willReturn(newHashSet(HashAlgorithm.CUSTOM, HashAlgorithm.BCRYPT));
// when // when
passwordSecurity.reload(); passwordSecurity.reload();
@ -286,7 +284,7 @@ public class PasswordSecurityTest {
private void initSettings(HashAlgorithm algorithm) { private void initSettings(HashAlgorithm algorithm) {
given(settings.getProperty(SecuritySettings.PASSWORD_HASH)).willReturn(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); given(settings.getProperty(HooksSettings.BCRYPT_LOG2_ROUND)).willReturn(8);
} }