diff options
| author | Nils Schwabe | 2014-04-10 11:58:34 +0200 |
|---|---|---|
| committer | Nils Schwabe | 2014-04-10 11:58:34 +0200 |
| commit | d5e1e558f22de9e20fbee6c1e8a884e65fa7cbbc (patch) | |
| tree | c9895bd99ed579d421343b41e9611da23eb1a4c1 /src/main/java/org/openslx/imagemaster/serversession | |
| parent | added new thrift methods: (diff) | |
| download | masterserver-d5e1e558f22de9e20fbee6c1e8a884e65fa7cbbc.tar.gz masterserver-d5e1e558f22de9e20fbee6c1e8a884e65fa7cbbc.tar.xz masterserver-d5e1e558f22de9e20fbee6c1e8a884e65fa7cbbc.zip | |
Added authentification for uni/hs server
--> added serversession, serversessionmanager
--> missing implementation for server authentication
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/serversession')
4 files changed, 155 insertions, 0 deletions
diff --git a/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java new file mode 100644 index 0000000..b16766a --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/serversession/ServerAuthenticator.java @@ -0,0 +1,40 @@ +package org.openslx.imagemaster.serversession; + +import java.util.HashMap; + +import org.apache.thrift.TException; +import org.openslx.imagemaster.thrift.iface.AuthenticationException; +import org.openslx.imagemaster.util.RandomString; + +public class ServerAuthenticator { + private static HashMap<String, String> authenticatingServers = new HashMap<String, String>(); + /** + * Start the server authentification. + * @param organization the organization of the server + * @return encrypted random string + */ + public static String startServerAuthentication(String organization) { + /* + * TODO: + * Create random string, send it to server. + * Remember organization for later authentification. + */ + String secret = RandomString.generate(100, false); + synchronized (authenticatingServers) { + authenticatingServers.put(organization, secret); + } + return secret; + } + + + public static ServerUser serverAuthenticate(String organization, String address, + String challengeResponse) throws AuthenticationException, + TException { + /* + * TODO: + * Decrypt the given challengeResponse and check whether it was right or not. + * Authenticate server if so. + */ + return new ServerUser(organization, address); + } +} diff --git a/src/main/java/org/openslx/imagemaster/serversession/ServerSession.java b/src/main/java/org/openslx/imagemaster/serversession/ServerSession.java new file mode 100644 index 0000000..e15f863 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/serversession/ServerSession.java @@ -0,0 +1,35 @@ +package org.openslx.imagemaster.serversession; + +public class ServerSession { + + private static final long TIMEOUT = 600L * 1000L; // TODO: config + + private long timeOut = 0; + private final ServerUser serverUser; + + public ServerSession(final ServerUser serverUser) + { + this.serverUser = serverUser; + this.timeOut = System.currentTimeMillis() + TIMEOUT; + } + + public synchronized void refresh() + { + if ( timedOut() ) + return; // Don't allow refreshing timed out session + this.timeOut = System.currentTimeMillis() + TIMEOUT; + } + + public synchronized boolean timedOut() + { + return System.currentTimeMillis() > this.timeOut; + } + + public String getOrganization() { + return serverUser.organization; + } + + public String getAddress() { + return serverUser.address; + } +} diff --git a/src/main/java/org/openslx/imagemaster/serversession/ServerSessionManager.java b/src/main/java/org/openslx/imagemaster/serversession/ServerSessionManager.java new file mode 100644 index 0000000..1fd4322 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/serversession/ServerSessionManager.java @@ -0,0 +1,69 @@ +package org.openslx.imagemaster.serversession; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.log4j.Logger; +import org.openslx.imagemaster.session.SessionManager; +import org.openslx.imagemaster.thrift.iface.ServerSessionData; +import org.openslx.imagemaster.util.Hash; + +public class ServerSessionManager { + + private static Logger log = Logger.getLogger( SessionManager.class ); + + // Map of currently known sessions + private static final Map<String, ServerSession> serverSessions = new LinkedHashMap<String, ServerSession>(); + private static final Thread gcThread; + + public static ServerSessionData addSession( ServerSession serverSession ) + { + final String sessionId = Hash.sha256( UUID.randomUUID().toString() ); + + synchronized ( serverSessions ) { + serverSessions.put( sessionId, serverSession ); + } + return new ServerSessionData( sessionId ); + } + + public static ServerSession getSession( String sessionId ) + { + final ServerSession serverSession; + synchronized ( serverSessions ) { + serverSession = serverSessions.get( sessionId ); + } + if ( serverSession == null || serverSession.timedOut() ) { + return null; + } + return serverSession; + } + + static { + gcThread = new Thread( new Runnable() { + @Override + public void run() + { + for ( ;; ) { + try { + Thread.sleep( 1800L * 1000L ); + } catch ( InterruptedException e ) { + } + synchronized ( serverSessions ) { + Iterator<ServerSession> it = serverSessions.values().iterator(); + while ( it.hasNext() ) { + final ServerSession s = it.next(); + if ( s.timedOut() ) { + log.debug( "Removing old session of " + s.getOrganization() ); + it.remove(); + } + } + } + } + } + } ); + gcThread.start(); + } + +} diff --git a/src/main/java/org/openslx/imagemaster/serversession/ServerUser.java b/src/main/java/org/openslx/imagemaster/serversession/ServerUser.java new file mode 100644 index 0000000..48815a8 --- /dev/null +++ b/src/main/java/org/openslx/imagemaster/serversession/ServerUser.java @@ -0,0 +1,11 @@ +package org.openslx.imagemaster.serversession; + +public class ServerUser { + public final String organization, address; + + public ServerUser(String organization, String address) { + this.organization = organization; + this.address = address; + } + +} |
