package io.github.lucaseasedup.logit.security;
import io.github.lucaseasedup.logit.LogItCoreObject;
import io.github.lucaseasedup.logit.config.TimeUnit;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public final class GlobalPasswordManager extends LogItCoreObject implements Runnable
{
@Override
public void dispose()
{
if (passwords != null)
{
passwords.clear();
passwords = null;
}
}
/**
* Internal method. Do not call directly.
*/
@Override
public void run()
{
Iterator<Map.Entry<String, Long>> it = passwords.entrySet().iterator();
while (it.hasNext())
{
Map.Entry<String, Long> e = it.next();
if (e.getValue() <= 0)
{
it.remove();
continue;
}
e.setValue(e.getValue() - TASK_PERIOD);
}
}
public boolean checkPassword(String password)
{
if (password == null)
throw new IllegalArgumentException();
Iterator<Map.Entry<String, Long>> it = passwords.entrySet().iterator();
while (it.hasNext())
{
Map.Entry<String, Long> e = it.next();
if (e.getKey().equals(password) && e.getValue() > 0)
{
it.remove();
return true;
}
}
return false;
}
public String generatePassword()
{
int length = getConfig("config.yml").getInt("globalPassword.length");
String password = getSecurityHelper().generatePassword(
length, "0123456789"
);
long lifetimeTicks = getConfig("config.yml")
.getTime("globalPassword.invalidateAfter", TimeUnit.TICKS);
passwords.put(password, lifetimeTicks);
return password;
}
public void invalidatePassword(String password)
{
passwords.remove(password);
}
/**
* Recommended task period of {@code GlobalPasswordManager}
* running as a Bukkit task.
*/
public static final long TASK_PERIOD =
TimeUnit.SECONDS.convertTo(1, TimeUnit.TICKS);
private Map<String, Long> passwords = new HashMap<>();
}