package fi.otavanopisto.muikku.plugins.logindetails;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import fi.otavanopisto.muikku.events.LoginEvent;
import fi.otavanopisto.muikku.plugins.commonlog.LogProvider;
import fi.otavanopisto.muikku.schooldata.SchoolDataIdentifier;
public class LoginDetailController {
public static final String COLLECTION_NAME = "loginDetails";
public static final String LOG_PROVIDER = "mongo-provider";
@Inject
private Logger logger;
@Any
@Inject
private Instance<LogProvider> logProviders;
public void log(LoginEvent loginEvent) {
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("eventType", "login");
data.put("userIdentifier", loginEvent.getUserIdentifier().toId());
data.put("authenticationProvder", loginEvent.getAuthProvider().getName());
data.put("address", loginEvent.getUserIPAddr());
data.put("time", String.valueOf(System.currentTimeMillis()));
LogProvider provider = getProvider(LOG_PROVIDER);
if (provider != null) {
try {
provider.log(COLLECTION_NAME, data);
} catch (Exception e) {
logger.log(Level.WARNING, "Could not initialize connection to log provider because of an exception " + e.getMessage());
}
} else {
logger.log(Level.WARNING, "Log provider plugin not found, cannot log event.");
}
}
public List<LoginDetails> getLastLogins(SchoolDataIdentifier userIdentifier, int count) {
List<LoginDetails> result = new ArrayList<>();
HashMap<String, Object> query = new HashMap<String, Object>();
query.put("userIdentifier", userIdentifier.toId());
LogProvider provider = getProvider(LOG_PROVIDER);
if (provider != null) {
ArrayList<HashMap<String,Object>> logEntries = provider.getLogEntries(COLLECTION_NAME, query, count);
if (logEntries != null) {
for (HashMap<String,Object> logEntry : logEntries) {
if (StringUtils.equals((String) logEntry.get("eventType"), "login")) {
String userIdentifierId = (String) logEntry.get("userIdentifier");
String authenticationProvder = (String) logEntry.get("authenticationProvder");
String address = (String) logEntry.get("address");
Long time = NumberUtils.createLong((String) logEntry.get("time"));
if (!StringUtils.equals(userIdentifierId, userIdentifier.toId())) {
logger.severe(String.format("Query returned login details for userIdentifer %s instead of requested %s", userIdentifierId, userIdentifier.toId()));
continue;
}
result.add(new LoginDetails(userIdentifier, authenticationProvder, address, time != null ? new Date(time) : null));
}
}
} else {
logger.severe(String.format("Could not list user's last logins log provider returned null"));
}
} else {
logger.severe(String.format("Could not list user's last logins because log provider %s could not be found", LOG_PROVIDER));
}
return result;
}
public LoginDetails getLastLogin(SchoolDataIdentifier userIdentifier) {
List<LoginDetails> lastLogins = getLastLogins(userIdentifier, 1);
if (lastLogins != null && !lastLogins.isEmpty()) {
return lastLogins.get(0);
}
return null;
}
private LogProvider getProvider(String name) {
Iterator<LogProvider> providers = logProviders.iterator();
while (providers.hasNext()) {
LogProvider provider = providers.next();
if (provider.getName().equals(name)) {
return provider;
}
}
return null;
}
}