summaryrefslogtreecommitdiff
path: root/src/main/java/com/p4square/session
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2016-04-09 14:22:20 -0700
committerJesse Morgan <jesse@jesterpm.net>2016-04-09 15:48:01 -0700
commit3102d8bce3426d9cf41aeaf201c360d342677770 (patch)
tree38c4f1e8828f9af9c4b77a173bee0d312b321698 /src/main/java/com/p4square/session
parentbbf907e51dfcf157bdee24dead1d531122aa25db (diff)
Switching from Ivy+Ant to Maven.
Diffstat (limited to 'src/main/java/com/p4square/session')
-rw-r--r--src/main/java/com/p4square/session/Session.java59
-rw-r--r--src/main/java/com/p4square/session/SessionAuthenticator.java36
-rw-r--r--src/main/java/com/p4square/session/SessionCheckingAuthenticator.java39
-rw-r--r--src/main/java/com/p4square/session/SessionCookieAuthenticator.java59
-rw-r--r--src/main/java/com/p4square/session/SessionCreatingAuthenticator.java46
-rw-r--r--src/main/java/com/p4square/session/Sessions.java155
6 files changed, 394 insertions, 0 deletions
diff --git a/src/main/java/com/p4square/session/Session.java b/src/main/java/com/p4square/session/Session.java
new file mode 100644
index 0000000..1bb65f5
--- /dev/null
+++ b/src/main/java/com/p4square/session/Session.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013 Jesse Morgan
+ */
+
+package com.p4square.session;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.restlet.security.User;
+
+/**
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class Session {
+ static final long LIFETIME = 86400000;
+
+ private final String mSessionId;
+ private final User mUser;
+ private final Map<String, String> mData;
+ private long mExpires;
+
+ Session(User user) {
+ mUser = user;
+ mSessionId = UUID.randomUUID().toString();
+ mExpires = System.currentTimeMillis() + LIFETIME;
+ mData = new HashMap<String, String>();
+ }
+
+ void touch() {
+ mExpires = System.currentTimeMillis() + LIFETIME;
+ }
+
+ boolean isExpired() {
+ return System.currentTimeMillis() > mExpires;
+ }
+
+ public String getId() {
+ return mSessionId;
+ }
+
+ public Object get(String key) {
+ return mData.get(key);
+ }
+
+ public void put(String key, String value) {
+ mData.put(key, value);
+ }
+
+ public User getUser() {
+ return mUser;
+ }
+
+ public Map<String, String> getMap() {
+ return mData;
+ }
+}
diff --git a/src/main/java/com/p4square/session/SessionAuthenticator.java b/src/main/java/com/p4square/session/SessionAuthenticator.java
new file mode 100644
index 0000000..794e1a8
--- /dev/null
+++ b/src/main/java/com/p4square/session/SessionAuthenticator.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2013 Jesse Morgan
+ */
+
+package com.p4square.session;
+
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.security.Authenticator;
+import org.restlet.security.User;
+
+/**
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class SessionAuthenticator /*extends Authenticator*/ {
+ /*
+ @Override
+ protected boolean authenticate(Request request, Response response) {
+ // Check for authentication cookie
+ final String cookie = request.getCookies().getFirstValue(COOKIE_NAME);
+ if (cookie != null) {
+ cLog.debug("Got cookie: " + cookie);
+ // TODO Decrypt user info
+ User user = new User(cookie);
+ request.getClientInfo().setUser(user);
+ return true;
+ }
+
+ // Challenge the user if not authenticated
+ response.redirectSeeOther(mLoginPage);
+ return false;
+ }
+ */
+}
diff --git a/src/main/java/com/p4square/session/SessionCheckingAuthenticator.java b/src/main/java/com/p4square/session/SessionCheckingAuthenticator.java
new file mode 100644
index 0000000..489d6a0
--- /dev/null
+++ b/src/main/java/com/p4square/session/SessionCheckingAuthenticator.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013 Jesse Morgan
+ */
+
+package com.p4square.session;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.security.Authenticator;
+
+/**
+ * Authenticator which succeeds if a valid Session exists.
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class SessionCheckingAuthenticator extends Authenticator {
+ private static final Logger LOG = Logger.getLogger(SessionCheckingAuthenticator.class);
+
+ public SessionCheckingAuthenticator(Context context, boolean optional) {
+ super(context, optional);
+ }
+
+ protected boolean authenticate(Request request, Response response) {
+ Session s = Sessions.getInstance().get(request);
+
+ if (s != null) {
+ LOG.debug("Found session for user " + s.getUser());
+ request.getClientInfo().setUser(s.getUser());
+ return true;
+
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/src/main/java/com/p4square/session/SessionCookieAuthenticator.java b/src/main/java/com/p4square/session/SessionCookieAuthenticator.java
new file mode 100644
index 0000000..0074b77
--- /dev/null
+++ b/src/main/java/com/p4square/session/SessionCookieAuthenticator.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013 Jesse Morgan
+ */
+
+package com.p4square.session;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.security.Authenticator;
+
+/**
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class SessionCookieAuthenticator extends Authenticator {
+ private static final Logger LOG = Logger.getLogger(SessionCookieAuthenticator.class);
+
+ private static final String COOKIE_NAME = "S";
+
+ private final Sessions mSessions;
+
+ public SessionCookieAuthenticator(Context context, boolean optional, Sessions sessions) {
+ super(context, optional);
+
+ mSessions = sessions;
+ }
+
+ protected boolean authenticate(Request request, Response response) {
+ final String cookie = request.getCookies().getFirstValue(COOKIE_NAME);
+
+ if (request.getClientInfo().isAuthenticated()) {
+ // Request is already authenticated... create session if it doesn't exist.
+ if (cookie == null) {
+ Session s = mSessions.create(request.getClientInfo().getUser());
+ response.getCookieSettings().add(COOKIE_NAME, s.getId());
+ }
+
+ return true;
+
+ } else {
+ // Check for authentication cookie
+ if (cookie != null) {
+ LOG.debug("Got cookie: " + cookie);
+
+ Session s = mSessions.get(cookie);
+ if (s != null) {
+ request.getClientInfo().setUser(s.getUser());
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+}
diff --git a/src/main/java/com/p4square/session/SessionCreatingAuthenticator.java b/src/main/java/com/p4square/session/SessionCreatingAuthenticator.java
new file mode 100644
index 0000000..3ec14b4
--- /dev/null
+++ b/src/main/java/com/p4square/session/SessionCreatingAuthenticator.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2013 Jesse Morgan
+ */
+
+package com.p4square.session;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.security.Authenticator;
+import org.restlet.security.User;
+
+/**
+ * Authenticator which creates a Session for the request and adds a cookie
+ * to the response.
+ *
+ * The Request MUST be Authenticated and MUST have a User object associated.
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class SessionCreatingAuthenticator extends Authenticator {
+ private static final Logger LOG = Logger.getLogger(SessionCreatingAuthenticator.class);
+
+ public SessionCreatingAuthenticator(Context context) {
+ super(context, true);
+ }
+
+ protected boolean authenticate(Request request, Response response) {
+ if (Sessions.getInstance().get(request) != null) {
+ return true;
+ }
+
+ User user = request.getClientInfo().getUser();
+
+ if (request.getClientInfo().isAuthenticated() && user != null) {
+ Sessions.getInstance().create(request, response);
+ LOG.debug(response);
+ return true;
+ }
+
+ return false;
+ }
+
+}
diff --git a/src/main/java/com/p4square/session/Sessions.java b/src/main/java/com/p4square/session/Sessions.java
new file mode 100644
index 0000000..9f9dda0
--- /dev/null
+++ b/src/main/java/com/p4square/session/Sessions.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2013 Jesse Morgan
+ */
+
+package com.p4square.session;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import org.restlet.Response;
+import org.restlet.Request;
+import org.restlet.data.CookieSetting;
+import org.restlet.security.User;
+
+/**
+ * Singleton Session Manager.
+ *
+ * @author Jesse Morgan <jesse@jesterpm.net>
+ */
+public class Sessions {
+ private static final String COOKIE_NAME = "S";
+ private static final int DELETE = 0;
+
+ private static final Sessions THE = new Sessions();
+ public static Sessions getInstance() {
+ return THE;
+ }
+
+ private final Map<String, Session> mSessions;
+ private final Timer mCleanupTimer;
+
+ private Sessions() {
+ mSessions = new ConcurrentHashMap<String, Session>();
+
+ mCleanupTimer = new Timer("sessionCleaner", true);
+ mCleanupTimer.scheduleAtFixedRate(new TimerTask() {
+ @Override
+ public void run() {
+ for (Session s : mSessions.values()) {
+ if (s.isExpired()) {
+ mSessions.remove(s.getId());
+ }
+ }
+ }
+ }, Session.LIFETIME, Session.LIFETIME);
+ }
+
+ /**
+ * Get a session by ID.
+ *
+ * @param sessionid
+ * The Session id
+ * @return The Session if found and not expired, null otherwise.
+ */
+ public Session get(String sessionid) {
+ Session s = mSessions.get(sessionid);
+
+ if (s != null && !s.isExpired()) {
+ s.touch();
+ return s;
+ }
+
+ return null;
+ }
+
+ /**
+ * Get the Session associated with the Request.
+ *
+ * @param request
+ * The request to fetch a session for.
+ * @return A session or null if no session is found.
+ */
+ public Session get(Request request) {
+ final String cookie = request.getCookies().getFirstValue(COOKIE_NAME);
+
+ if (cookie != null) {
+ return get(cookie);
+ }
+
+ return null;
+ }
+
+ /**
+ * Create a new Session for the given User object.
+ *
+ * @param user
+ * The User to associate with the Session.
+ * @return The new Session object.
+ */
+ public Session create(User user) {
+ if (user == null) {
+ throw new IllegalArgumentException("Can not create session for null user.");
+ }
+
+ Session s = new Session(user);
+ mSessions.put(s.getId(), s);
+
+ return s;
+ }
+
+ /**
+ * Delete a Session.
+ *
+ * @param sessionid
+ * The id of the Session to remove.
+ */
+ public void delete(String sessionid) {
+ mSessions.remove(sessionid);
+ }
+
+ /**
+ * Create a new Session and add the Session cookie to the response.
+ *
+ * @param request
+ * The request to create the Session for.
+ * @param response
+ * The response to add the session cookie to.
+ * @return The new Session.
+ */
+ public Session create(Request request, Response response) {
+ Session s = create(request.getClientInfo().getUser());
+
+ CookieSetting cookie = new CookieSetting(COOKIE_NAME, s.getId());
+ cookie.setPath("/");
+
+ request.getCookies().add(cookie);
+ response.getCookieSettings().add(cookie);
+
+ return s;
+ }
+
+ /**
+ * Remove a Session and delete the cookies.
+ *
+ * @param request
+ * The request with the session cookie to remove
+ * @param response
+ * The response to remove the session cookie from.
+ */
+ public void delete(Request request, Response response) {
+ final String sessionid = request.getCookies().getFirstValue(COOKIE_NAME);
+
+ delete(sessionid);
+
+ CookieSetting cookie = new CookieSetting(COOKIE_NAME, "");
+ cookie.setPath("/");
+ cookie.setMaxAge(DELETE);
+
+ request.getCookies().add(cookie);
+ response.getCookieSettings().add(cookie);
+ }
+
+}