// Path: app/models/Person.java
// @Entity
// public class Person extends GenericModel {
// 
// 	@Id
// 	public String username;
// 	public String password;
// 	public Role role = Role.Guest;
// 	@Lob
// 	public String clipboard;
// 	public Boolean preferMultiframe;
// 	public String niftiMultiframeScript;
// 
// 	public Person(String username) {
// 		this.username = username;
// 	}
// 
// 	public void setPassword(String password) {
// 		if (!password.startsWith("$2a$")) {
// 			this.password = BCrypt.hashpw(password, BCrypt.gensalt());
// 		}
// 	}
// 
// 	@PostUpdate
// 	public void postUpdate() {
// 		Cache.delete(username);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return String.format("%s (%s)", username, role);
// 	}
// 
// 	public static enum Role {
// 		Researcher, Administrator, Visitor, Guest;
// 	}
// 
// }
// 
// Path: app/models/Person.java
// public static enum Role {
// 	Researcher, Administrator, Visitor, Guest;
// }
// 
// Path: app/util/PersistentLogger.java
// public class PersistentLogger {
// 
// 	public static void log(String message, Object... args) {
// 		new Log(String.format(message, args)).save();
// 	}
// }
// 
// Path: app/util/Properties.java
// public class Properties {
// 
// 	public static int getInt(String key) {
// 		return Integer.parseInt(Play.configuration.getProperty(key));
// 	}
// 
// 	public static String getString(String key) {
// 		return Play.configuration.getProperty(key);
// 	}
// 
// 	public static File getArchive() {
// 		File archive = new File(Filesystem.<Filesystem>findAll().get(0).dirpath);
// 		return archive.isAbsolute() ? archive : new File(getString("dcm4chee"), String.format("server/default/%s", archive.getPath()));
// 	}
// 
// 	public static int pageSize() {
// 		return Integer.parseInt(Play.configuration.getProperty("page.size", String.valueOf(20)));
// 	}
// 
// 	public static File getDownloads() {
// 		File downloads = new File(Play.tmpDir, "downloads");
// 		downloads.mkdir();
// 		return downloads;
// 	}
// 
// 	public static File getExports() {
// 		return new File(getString("exports"));
// 	}
// 
// 	public static int getMaximumExportSize() {
// 		return Integer.parseInt(Play.configuration.getProperty("export.maxsize", String.valueOf(100)));
// 	}
// 
// 	public static File getCollations() {
// 		File downloads = new File(Play.tmpDir, "collations");
// 		downloads.mkdir();
// 		return downloads;
// 	}
// }


import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.InitialDirContext;
import models.Person;
import models.Person.Role;
import org.springframework.security.crypto.bcrypt.BCrypt;
import play.Logger;
import util.PersistentLogger;
import util.Properties;
			if (!password.isEmpty()) {
				Hashtable<String, String> env = new Hashtable<String, String>();
				env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
				env.put(Context.PROVIDER_URL, Properties.getString("ldap.server"));
				env.put(Context.SECURITY_PRINCIPAL, String.format("%s@%s", username, Properties.getString("ldap.domain")));
				env.put(Context.SECURITY_CREDENTIALS, password);
				try {
					new InitialDirContext(env);
					authenticated = true;
				} catch (NamingException e) {
					Logger.info("LDAP authentication failed for %s", username);
				}
			}
		}
		return authenticated;
	}

	static void onAuthenticated() {
		String username = Security.connected().toLowerCase();
		Person person = Person.findById(username);
		if (person == null) {
			person = new Person(username);
			person.validateAndCreate();
		}
		PersistentLogger.log("logged in");
	}

	static boolean check(String profile) {
		String username = Security.connected().toLowerCase();
		if ("admin".equals(profile)) {
// Path: app/models/Person.java
// @Entity
// public class Person extends GenericModel {
// 
// 	@Id
// 	public String username;
// 	public String password;
// 	public Role role = Role.Guest;
// 	@Lob
// 	public String clipboard;
// 	public Boolean preferMultiframe;
// 	public String niftiMultiframeScript;
// 
// 	public Person(String username) {
// 		this.username = username;
// 	}
// 
// 	public void setPassword(String password) {
// 		if (!password.startsWith("$2a$")) {
// 			this.password = BCrypt.hashpw(password, BCrypt.gensalt());
// 		}
// 	}
// 
// 	@PostUpdate
// 	public void postUpdate() {
// 		Cache.delete(username);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return String.format("%s (%s)", username, role);
// 	}
// 
// 	public static enum Role {
// 		Researcher, Administrator, Visitor, Guest;
// 	}
// 
// }
// 
// Path: app/models/Person.java
// public static enum Role {
// 	Researcher, Administrator, Visitor, Guest;
// }
// 
// Path: app/util/PersistentLogger.java
// public class PersistentLogger {
// 
// 	public static void log(String message, Object... args) {
// 		new Log(String.format(message, args)).save();
// 	}
// }
// 
// Path: app/util/Properties.java
// public class Properties {
// 
// 	public static int getInt(String key) {
// 		return Integer.parseInt(Play.configuration.getProperty(key));
// 	}
// 
// 	public static String getString(String key) {
// 		return Play.configuration.getProperty(key);
// 	}
// 
// 	public static File getArchive() {
// 		File archive = new File(Filesystem.<Filesystem>findAll().get(0).dirpath);
// 		return archive.isAbsolute() ? archive : new File(getString("dcm4chee"), String.format("server/default/%s", archive.getPath()));
// 	}
// 
// 	public static int pageSize() {
// 		return Integer.parseInt(Play.configuration.getProperty("page.size", String.valueOf(20)));
// 	}
// 
// 	public static File getDownloads() {
// 		File downloads = new File(Play.tmpDir, "downloads");
// 		downloads.mkdir();
// 		return downloads;
// 	}
// 
// 	public static File getExports() {
// 		return new File(getString("exports"));
// 	}
// 
// 	public static int getMaximumExportSize() {
// 		return Integer.parseInt(Play.configuration.getProperty("export.maxsize", String.valueOf(100)));
// 	}
// 
// 	public static File getCollations() {
// 		File downloads = new File(Play.tmpDir, "collations");
// 		downloads.mkdir();
// 		return downloads;
// 	}
// }


// Path: app/controllers/Security.java
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.InitialDirContext;
import models.Person;
import models.Person.Role;
import org.springframework.security.crypto.bcrypt.BCrypt;
import play.Logger;
import util.PersistentLogger;
import util.Properties;

			if (!password.isEmpty()) {
				Hashtable<String, String> env = new Hashtable<String, String>();
				env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
				env.put(Context.PROVIDER_URL, Properties.getString("ldap.server"));
				env.put(Context.SECURITY_PRINCIPAL, String.format("%s@%s", username, Properties.getString("ldap.domain")));
				env.put(Context.SECURITY_CREDENTIALS, password);
				try {
					new InitialDirContext(env);
					authenticated = true;
				} catch (NamingException e) {
					Logger.info("LDAP authentication failed for %s", username);
				}
			}
		}
		return authenticated;
	}

	static void onAuthenticated() {
		String username = Security.connected().toLowerCase();
		Person person = Person.findById(username);
		if (person == null) {
			person = new Person(username);
			person.validateAndCreate();
		}
		PersistentLogger.log("logged in");
	}

	static boolean check(String profile) {
		String username = Security.connected().toLowerCase();
		if ("admin".equals(profile)) {
			return Person.<Person>findById(username).role == Role.Administrator;