base.jee.JeeBase Maven / Gradle / Ivy
/*
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
*/
package base.jee;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import base.jee.api.API;
import org.stringtemplate.v4.ST;
import base.Command;
import base.Query;
import base.jee.api.Settings;
import base.jee.task.ExpiredTokensTask;
import base.jee.task.LogCleanupTask;
import base.jee.task.SendMailTask;
import base.security.ResourceUid;
import base.security.Role;
import base.security.RoleManager;
import base.security.User;
import base.task.Task;
import base.task.TaskManager;
import base.template.Resource;
import base.template.TemplateManager;
/**
* Initialise and cache all objects associated with the base.jee package. This
* includes initialisation of:
*
*
* - database tables, configuration setting items,
* - user roles,
* - the global shortcut/menu bar,
* - a cache of the currently selected web page template package, and
* - default leading breadcrumb bar items.
*
*/
public class JeeBase {
public String cookieName = "base";
private Settings settings;
private RoleManager roles;
private List baseBreadcrumbs = null;
private List shortcuts = new LinkedList<>();
/** In memory cache of all of the available templates */
private TemplateManager templateManager = null;
private boolean debug = false;
/** Queries available to the public JSON API */
private List queries = new ArrayList<>();
/** Commands available to the public JSON API */
private List commands = new ArrayList<>();
private Task mailTask;
private Task expireTokensTask;
private Task logCleanupTask;
private API api;
/**
* Initialise all objects required before any part of the base.jee. package
* may be used. There should only ever be one instance in memory per application.
*
* @param api
* @param baseTemplateAmmendments
* @throws IOException
*/
public JeeBase(API api, List baseTemplateAmmendments) throws IOException {
this(api, baseTemplateAmmendments, "base");
}
public JeeBase(API api, List baseTemplateAmmendments, String cookie) throws IOException {
cookieName = cookie;
this.api = api;
this.settings = api.getSettingsCache();
this.baseBreadcrumbs = new LinkedList<>();
this.roles = new RoleManager();
api.registerApiCalls(this);
roles.registerRole(new Role(Constants.AUDIT_ROLE, "Audit Trail", "Viewing system activity in the audit log.", null, true));
roles.registerRole(new Role(Constants.PERSON_MANAGE_ROLE, "People manage", "Create, and manage people, inluding managing a persons role.", null, true));
roles.registerRole(new Role(Constants.GROUP_MANAGE_ROLE, "Group manage", "Create, and manage who belongs to a groups.", null, true));
roles.registerRole(new Role(Constants.SETTING_MANAGE_ROLE, "System configuration", "Update system configuration settings.", null, true));
roles.registerRole(new Role(Constants.TEMPLATE_MANAGE_ROLE, "Template Manage", "View and update the HTML and CSS for this site.", null, true));
mailTask = new SendMailTask(api);
expireTokensTask = new ExpiredTokensTask(api);
logCleanupTask = new LogCleanupTask(api);
TaskManager.registerRegularTask("mail", 10, mailTask);
TaskManager.registerRegularTask("token.expiry", 300, expireTokensTask);
TaskManager.registerRegularTask("log.cleanup", 60*60, logCleanupTask);
// Setup some defaults for the required configuration settings
if(settings.get("setting.cache.timeout", null) == null) {
settings.set("setting.cache.timeout", "10");
}
if(settings.get("smtp.hostname", null) == null) {
settings.set("smtp.hostname", "smtp.example.com");
}
if(settings.get("ldap.enabled", null) == null) {
settings.set("ldap.enabled", "false");
}
if(settings.get("ldap.url", null) == null) {
settings.set("ldap.url", "ldaps://ldap.example.com:636/");
}
if(settings.get("ldap.userdn", null) == null) {
settings.set("ldap.userdn", "uid={1},ou=People,dc=example,dc=com");
}
if(settings.get("stacktrace.show", null) == null) {
settings.set("stacktrace.show", "true");
}
if(settings.get("cookies.secure", null) == null) {
settings.set("cookies.secure", "false");
}
if(settings.get("session.expiry", null) == null) {
settings.set("session.expiry", ""+(60*60*4)); // Default to four hour expiry time limit
}
if(settings.get("frame.protection", null) == null) {
settings.set("frame.protection", "false");
}
if(settings.get("base.url", null) == null) {
settings.set("base.url", "");
}
if(settings.get("support_team.name", null) == null) {
settings.set("support_team.name", "Support Team");
}
if(settings.get("support_team.email", null) == null) {
settings.set("support_team.email", "[email protected]");
}
if(settings.get("support_team.url", null) == null) {
settings.set("support_team.url", "");
}
if(settings.get("terms_and_conditions", null) == null) {
settings.set("terms_and_conditions", "false");
}
// Define and/or refresh the contents of the default template.
Map resources = new Hashtable<>();
resources.put("account_activation_email_html.txt", new Resource("account_activation_email_html.txt", loadFromClasspath("/base/jee/resources/account_activation_email_html.txt"), false));
resources.put("account_activation_email_text.txt", new Resource("account_activation_email_text.txt", loadFromClasspath("/base/jee/resources/account_activation_email_text.txt"), false));
resources.put("activate_account.html", new Resource("activate_account.html", loadFromClasspath("/base/jee/resources/activate_account.html"), false));
resources.put("audit.html", new Resource("audit.html", loadFromClasspath("/base/jee/resources/audit.html"), false));
resources.put("authorisation_error.html", new Resource("authorisation_error.html", loadFromClasspath("/base/jee/resources/authorisation_error.html"), false));
resources.put("exception.html", new Resource("exception.html", loadFromClasspath("/base/jee/resources/exception.html"), false));
resources.put("favicon.ico", new Resource("favicon.ico", loadFromClasspath("/base/jee/resources/favicon.ico"), true));
resources.put("fontawesome-webfont.eot", new Resource("fontawesome-webfont.eot", loadFromClasspath("/base/jee/resources/fontawesome-webfont.eot"), true));
resources.put("fontawesome-webfont.ttf", new Resource("fontawesome-webfont.ttf", loadFromClasspath("/base/jee/resources/fontawesome-webfont.ttf"), true));
resources.put("fontawesome-webfont.woff", new Resource("fontawesome-webfont.woff", loadFromClasspath("/base/jee/resources/fontawesome-webfont.woff"), true));
resources.put("footer.html", new Resource("footer.html", loadFromClasspath("/base/jee/resources/footer.html"), false));
resources.put("group_edit.html", new Resource("group_edit.html", loadFromClasspath("/base/jee/resources/group_edit.html"), false));
resources.put("group_members.html", new Resource("group_members.html", loadFromClasspath("/base/jee/resources/group_members.html"), false));
resources.put("group_roles.html", new Resource("group_roles.html", loadFromClasspath("/base/jee/resources/group_roles.html"), false));
resources.put("groups.html", new Resource("groups.html", loadFromClasspath("/base/jee/resources/groups.html"), false));
resources.put("header.html", new Resource("header.html", loadFromClasspath("/base/jee/resources/header.html"), false));
resources.put("jquery-1.10.2.min.js", new Resource("jquery-1.10.2.min.js", loadFromClasspath("/base/jee/resources/jquery-1.10.2.min.js"), true));
resources.put("jquery.qtip.min.js", new Resource("jquery.qtip.min.js", loadFromClasspath("/base/jee/resources/jquery.qtip.min.js"), true));
resources.put("jquery.autosize.min.js", new Resource("jquery.autosize.min.js", loadFromClasspath("/base/jee/resources/jquery.autosize.min.js"), true));
resources.put("password.js", new Resource("password.js", loadFromClasspath("/base/jee/resources/password.js"), true));
resources.put("password_reset.html", new Resource("password_reset.html", loadFromClasspath("/base/jee/resources/password_reset.html"), false));
resources.put("password_reset_complete.html", new Resource("password_reset_complete.html", loadFromClasspath("/base/jee/resources/password_reset_complete.html"), false));
resources.put("password_reset_email_html.txt", new Resource("password_reset_email_html.txt", loadFromClasspath("/base/jee/resources/password_reset_email_html.txt"), false));
resources.put("password_reset_email_text.txt", new Resource("password_reset_email_text.txt", loadFromClasspath("/base/jee/resources/password_reset_email_text.txt"), false));
resources.put("people.html", new Resource("people.html", loadFromClasspath("/base/jee/resources/people.html"), false));
resources.put("permission_denied.html", new Resource("permission_denied.html", loadFromClasspath("/base/jee/resources/permission_denied.html"), false));
resources.put("person_edit.html", new Resource("person_edit.html", loadFromClasspath("/base/jee/resources/person_edit.html"), false));
resources.put("person_new.html", new Resource("person_new.html", loadFromClasspath("/base/jee/resources/person_new.html"), false));
resources.put("resource.html", new Resource("resource.html", loadFromClasspath("/base/jee/resources/resource.html"), false));
resources.put("settings.html", new Resource("settings.html", loadFromClasspath("/base/jee/resources/settings.html"), false));
resources.put("setup.html", new Resource("setup.html", loadFromClasspath("/base/jee/resources/setup.html"), false));
resources.put("signup_confirmation_email_html.txt", new Resource("signup_confirmation_email_html.txt", loadFromClasspath("/base/jee/resources/signup_confirmation_email_html.txt"), false));
resources.put("signup_confirmation_email_text.txt", new Resource("signup_confirmation_email_text.txt", loadFromClasspath("/base/jee/resources/signup_confirmation_email_text.txt"), false));
resources.put("signup_confirmation_fail.html", new Resource("signup_confirmation_fail.html", loadFromClasspath("/base/jee/resources/signup_confirmation_fail.html"), false));
resources.put("signup_details.html", new Resource("signup_details.html", loadFromClasspath("/base/jee/resources/signup_details.html"), false));
resources.put("suspended_accounts.html", new Resource("suspended_accounts.html", loadFromClasspath("/base/jee/resources/suspended_accounts.html"), false));
resources.put("throttled.html", new Resource("throttled.html", loadFromClasspath("/base/jee/resources/throttled.html"), false));
resources.put("signin.html", new Resource("signin.html", loadFromClasspath("/base/jee/resources/signin.html"), false));
resources.put("style.css", new Resource("style.css", loadFromClasspath("/base/jee/resources/style.css"), false));
resources.put("template.html", new Resource("template.html", loadFromClasspath("/base/jee/resources/template.html"), false));
resources.put("templates.html", new Resource("templates.html", loadFromClasspath("/base/jee/resources/templates.html"), false));
resources.put("terms_and_conditions.html", new Resource("terms_and_conditions.html", loadFromClasspath("/base/jee/resources/terms_and_conditions.html"), false));
if(baseTemplateAmmendments != null) {
for(Resource resource : baseTemplateAmmendments) {
resources.put(resource.getName(), resource);
}
}
templateManager = new TemplateManager(api, resources.values());
}
public API getAPI() {
return api;
}
public void cleanup() throws InterruptedException {
TaskManager.unregisterRegularTask("mail");
TaskManager.unregisterRegularTask("token.expiry");
TaskManager.unregisterRegularTask("log.cleanup");
TaskManager.shutdown();
}
public TemplateManager getTemplateManager() {
return templateManager;
}
public void setBaseBreadcrumbs(List baseBreadcrumbs) {
this.baseBreadcrumbs = baseBreadcrumbs;
}
public Settings getSettings() {
return settings;
}
/**
* List of available system roles that were registered on application
* startup. This list includes all roles required by the base.jee package
* plus any other roles that are registered by the developer using the
* jee.getRoles().registerRole()
*
* @see RoleManager
*/
public RoleManager getRoles() {
return roles;
}
private byte[] loadFromClasspath(String name) throws IOException {
URL url = JeeBase.class.getResource(name);
InputStream in = url.openStream();
BufferedInputStream bin = new BufferedInputStream(in);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024*25];
int length = 0;
while ((length = bin.read(buffer)) > 0) {
bout.write(buffer, 0, length);
}
return bout.toByteArray();
}
public ST getPage(User u, String name) throws IOException {
String site = (u == null?null:u.getSite());
// TODO: Support user override of site default template
ST page = templateManager.getCurrentTemplate(site).getInstanceOf(name);
if(page == null) {
log("SEVERE", "JeeBase.getPage() invoked with missing or invalid template file named '" + name + "'");
return null;
}
page.add("formurl", settings.get("base.url", ""));
page.add("user", u);
for(Shortcut s : shortcuts) {
if(s.getRequiredRole() == null || (u != null && u.hasRole(s.getRequiredRole()))) {
page.add("shortcuts", s);
}
}
if(u != null && u.hasRole(base.jee.Constants.PERSON_MANAGE_ROLE)) {
page.add("shortcuts", new Shortcut("People", "/people"));
}
if(u != null && u.hasRole(base.jee.Constants.AUDIT_ROLE)) {
page.add("shortcuts", new Shortcut("Audit", "/audit"));
}
if(u != null && u.hasRole(base.jee.Constants.SETTING_MANAGE_ROLE)) {
page.add("shortcuts", new Shortcut("Settings", "/settings"));
}
if(u != null && u.hasRole(base.jee.Constants.TEMPLATE_MANAGE_ROLE)) {
page.add("shortcuts", new Shortcut("Template", "/templates"));
}
if(u == null || !u.isAuthenticated()) {
page.add("shortcuts", new Shortcut("Sign in", "/signin"));
} else {
page.add("shortcuts", new Shortcut("Sign out", "/signout"));
}
for(Breadcrumb b : baseBreadcrumbs) {
page.add("breadcrumbs", b);
}
page.add("headers", true);
return page;
}
public void log(String level, String message, ResourceUid... resources) throws IOException {
log(level, message, null, resources);
}
public void log(String level, String message, User user, ResourceUid... resources) throws IOException {
if(!debug && level.equalsIgnoreCase("debug")) {
return;
}
try {
api.log(level, user, message, resources);
} catch(IOException e) {
Date date = new Date();
System.out.println("[" + date + "] " + (user == null || user.getIp() == null?"-":user.getIp()) + " " + level + " " + message);
}
}
public void setDebug(boolean debug) {
this.debug = debug;
}
public void add(Shortcut shortcut) {
shortcuts.add(shortcut);
}
/**
* Make a Command available to the API servlet.
*
* @param command
*/
public void add(Command command) {
commands.add(command);
}
/**
* Make a Command available to the API servlet.
*
* @deprecated Use the simpler add() method instead.
* @param command
*/
@Deprecated
public void registerApiCommand(Command command) {
commands.add(command);
}
/**
* Make a Query available to the API servlet.
*
* @param query
*/
public void add(Query query) {
queries.add(query);
}
/**
* Make a Query available to the API servlet.
*
* @deprecated Use the simpler add() method instead.
* @param query
*/
@Deprecated
public void registerApiQuery(Query query) {
queries.add(query);
}
public List getApiQueries() {
return queries;
}
public List getApiCommands() {
return commands;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy