diff options
author | mikaelpeltier <mikaelpeltier@google.com> | 2015-06-24 14:31:11 +0200 |
---|---|---|
committer | Mikael Peltier <mikaelpeltier@google.com> | 2015-06-24 14:59:36 +0000 |
commit | 04563874ddaac702d6c715eaa89c29b253f4c54e (patch) | |
tree | c305fa98670c3e80be494cc054a8e31b51bfe7f2 /simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatRoomListener.java | |
parent | f1828481ebcfee3bddc323fca178a4502a60ceef (diff) | |
download | toolchain_jack-04563874ddaac702d6c715eaa89c29b253f4c54e.zip toolchain_jack-04563874ddaac702d6c715eaa89c29b253f4c54e.tar.gz toolchain_jack-04563874ddaac702d6c715eaa89c29b253f4c54e.tar.bz2 |
Add simpleframework source files
Change-Id: I18d01df16de2868ca5458f79a88e6070b75db2c3
(cherry picked from commit 3e9f84cf7b22f6970eb8041ca38d12d75c6bb270)
Diffstat (limited to 'simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatRoomListener.java')
-rw-r--r-- | simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatRoomListener.java | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatRoomListener.java b/simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatRoomListener.java new file mode 100644 index 0000000..e976b78 --- /dev/null +++ b/simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatRoomListener.java @@ -0,0 +1,106 @@ +package org.simpleframework.http.socket; + +import java.security.Principal; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.security.cert.X509Certificate; + +import org.simpleframework.http.Request; +import org.simpleframework.transport.Certificate; + + +public class WebSocketChatRoomListener implements FrameListener { + + private final CertificateUserExtractor extractor; + private final WebSocketChatRoom room; + + public WebSocketChatRoomListener(WebSocketChatRoom room) { + this.extractor = new CertificateUserExtractor(".*EMAILADDRESS=(.*?),.*"); + this.room = room; + } + + public void onFrame(Session socket, Frame frame) { + FrameType type = frame.getType(); + String text = frame.getText(); + + if(type == FrameType.TEXT){ + try { + Request request = socket.getRequest(); + String user = extractor.extractUser(request); + + text = text + " (SSL=" + request.isSecure() + ", EMAILADDRESS=" + user + ")"; + } catch(Exception e) { + e.printStackTrace(); + } + Frame replay = new DataFrame(type, text); + room.distribute(replay); + } + } + + public void onError(Session socket, Exception cause) { + System.err.println("onError("); + cause.printStackTrace(); + System.err.println(")"); + } + + public void onOpen(Session socket) { + System.err.println("onOpen(" + socket +")"); + } + + public void onClose(Session session, Reason reason) { + System.err.println("onClose(" + reason +")"); + } + + public static class CertificateUserExtractor { + + private final Map<String, String> cache; + private final Pattern pattern; + + public CertificateUserExtractor(String pattern) { + this.cache = new ConcurrentHashMap<String, String>(); + this.pattern = Pattern.compile(pattern); + } + + public String extractUser(Request request) throws Exception { + try { + Certificate certificate = request.getClientCertificate(); + + if(certificate != null) { + X509Certificate[] certificates = certificate.getChain(); + + for(X509Certificate entry : certificates) { + String user = extractCertificateUser(entry); + + if(user != null) { + return user; + } + } + } + } catch(Exception e) { + e.printStackTrace(); + } + return null; + } + + private String extractCertificateUser(X509Certificate certificate) throws Exception { + Principal principal = certificate.getSubjectDN(); + String name = principal.getName(); + String user = cache.get(name); + + if(user == null) { + if(!cache.containsKey(name)) { + Matcher matcher = pattern.matcher(name); + + if(matcher.matches()) { + user = matcher.group(1); + } + cache.put(name, user); + } + } + return user; + } + } +} |