// --------------------------------------------------------------------------- // jWebSocket - Copyright (c) 2010 Innotrade GmbH // --------------------------------------------------------------------------- // This program is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published by the // Free Software Foundation; either version 3 of the License, or (at your // option) any later version. // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for // more details. // You should have received a copy of the GNU Lesser General Public License along // with this program; if not, see <http://www.gnu.org/licenses/lgpl.html>. // --------------------------------------------------------------------------- package org.jwebsocket.client.token; import org.jwebsocket.api.WebSocketTokenClient; import org.jwebsocket.api.WebSocketClientEvent; import org.jwebsocket.api.WebSocketClientListener; import org.jwebsocket.api.WebSocketClientTokenListener; import org.jwebsocket.api.WebSocketPacket; import org.jwebsocket.client.java.BaseWebSocket; import org.jwebsocket.config.JWebSocketCommonConstants; import org.jwebsocket.kit.WebSocketException; import org.jwebsocket.packetProcessors.CSVProcessor; import org.jwebsocket.packetProcessors.JSONProcessor; import org.jwebsocket.packetProcessors.XMLProcessor; import org.jwebsocket.token.Token; import org.apache.commons.codec.binary.Base64; /** * Token based implementation of {@code JWebSocketClient} * @author aschulze * @author puran * @version $Id:$ */ public class BaseTokenClient extends BaseWebSocket implements WebSocketTokenClient { /** base namespace for jWebSocket */ private final static String NS_BASE = "org.jWebSocket"; /** constants for connection status */ public final static int DISCONNECTED = 0; public final static int CONNECTED = 1; public final static int AUTHENTICATED = 2; /** token client protocols */ private final static String WELCOME = "welcome"; private final static String LOGIN = "login"; private final static String GOODBYE = "goodBye"; private final static String LOGOUT = "logout"; /** token id */ private int CUR_TOKEN_ID = 0; /** subprotocol value */ private String lSubProt = JWebSocketCommonConstants.SUB_PROT_DEFAULT; private String fUsername = null; private String fClientId = null; private String fSessionId = null; /** * Default constructor */ public BaseTokenClient() { addListener(new TokenClientListener()); } /** * WebSocketClient listener implementation that recieves the data packet and * creates <tt>token</tt> objects * * @author aschulze */ class TokenClientListener implements WebSocketClientListener { /** * {@inheritDoc} Initialize all the variables when the process starts */ @Override public void processOpened(WebSocketClientEvent aEvent) { fUsername = null; fClientId = null; fSessionId = null; } /** * {@inheritDoc} This callback method is invoked by jWebSocket client * after the data is received from low-level <tt>WebSocket</tt> * connection. This method then generates the <tt>token</tt> objects * using the data packets. */ @Override public void processPacket(WebSocketClientEvent aEvent, WebSocketPacket aPacket) { for (WebSocketClientListener lListener : getListeners()) { if (lListener instanceof WebSocketClientTokenListener) { Token lToken = packetToToken(aPacket); String lType = lToken.getType(); String lReqType = lToken.getString("reqType"); if (lType != null) { if (WELCOME.equals(lType)) { fClientId = lToken.getString("sourceId"); fSessionId = lToken.getString("usid"); } else if (GOODBYE.equals(lType)) { fUsername = null; } } if (lReqType != null) { if (LOGIN.equals(lReqType)) { fUsername = lToken.getString("username"); } else if (LOGOUT.equals(lReqType)) { fUsername = null; } } ((WebSocketClientTokenListener) lListener).processToken(aEvent, lToken); } } } /** * {@inheritDoc} */ @Override public void processClosed(WebSocketClientEvent aEvent) { // clean up resources fUsername = null; fClientId = null; fSessionId = null; } } /** * {@ */ @Override public void close() throws WebSocketException { super.close(); fUsername = null; fClientId = null; fSessionId = null; } /** * @return the fUsername */ @Override public String getUsername() { return fUsername; } @Override public boolean isAuthenticated() { return (fUsername != null); } /** * @return the fClientId */ public String getClientId() { return fClientId; } /** * @return the fSessionId */ public String getfSessionId() { return fSessionId; } /** * * @param aConnector * @param aPacket * @return */ public Token packetToToken(WebSocketPacket aPacket) { Token lToken = null; if (lSubProt.equals(JWebSocketCommonConstants.SUB_PROT_JSON)) { lToken = JSONProcessor.packetToToken(aPacket); } else if (lSubProt.equals(JWebSocketCommonConstants.SUB_PROT_CSV)) { lToken = CSVProcessor.packetToToken(aPacket); } else if (lSubProt.equals(JWebSocketCommonConstants.SUB_PROT_XML)) { lToken = XMLProcessor.packetToToken(aPacket); } return lToken; } /** * * @param aConnector * @param aToken * @return */ public WebSocketPacket tokenToPacket(Token aToken) { WebSocketPacket lPacket = null; if (lSubProt.equals(JWebSocketCommonConstants.SUB_PROT_JSON)) { lPacket = JSONProcessor.tokenToPacket(aToken); } else if (lSubProt.equals(JWebSocketCommonConstants.SUB_PROT_CSV)) { lPacket = CSVProcessor.tokenToPacket(aToken); } else if (lSubProt.equals(JWebSocketCommonConstants.SUB_PROT_XML)) { lPacket = XMLProcessor.tokenToPacket(aToken); } return lPacket; } public void sendToken(Token aToken) throws WebSocketException { CUR_TOKEN_ID++; aToken.put("utid", CUR_TOKEN_ID); super.send(tokenToPacket(aToken)); } private final static String NS_SYSTEM_PLUGIN = NS_BASE + ".plugins.system"; @Override public void login(String aUsername, String aPassword) throws WebSocketException { Token lToken = new Token(); lToken.put("type", "login"); lToken.put("ns", NS_SYSTEM_PLUGIN); lToken.put("username", aUsername); lToken.put("password", aPassword); sendToken(lToken); } @Override public void logout() throws WebSocketException { Token lToken = new Token(); lToken.put("type", "logout"); lToken.put("ns", NS_SYSTEM_PLUGIN); sendToken(lToken); } @Override public void ping(boolean aEcho) throws WebSocketException { Token lToken = new Token(); lToken.put("ns", NS_SYSTEM_PLUGIN); lToken.put("type", "ping"); lToken.put("echo", aEcho); sendToken(lToken); } @Override public void sendText(String aTarget, String aData) throws WebSocketException { Token lToken = new Token(); lToken.put("ns", NS_SYSTEM_PLUGIN); lToken.put("type", "send"); lToken.put("targetId", aTarget); lToken.put("sourceId", getClientId()); lToken.put("sender", getUsername()); lToken.put("data", aData); sendToken(lToken); } @Override public void broadcastText(String aData) throws WebSocketException { Token lToken = new Token(); lToken.put("ns", NS_SYSTEM_PLUGIN); lToken.put("type", "broadcast"); lToken.put("sourceId", getClientId()); lToken.put("sender", getUsername()); lToken.put("data", aData); lToken.put("senderIncluded", false); lToken.put("responseRequested", true); sendToken(lToken); } private final static String NS_FILESYSTEM_PLUGIN = NS_BASE + ".plugins.filesystem"; // @Override public void saveFile(byte[] aData, String aFilename, String aScope, Boolean aNotify) throws WebSocketException { Token lToken = new Token(); lToken.put("ns", NS_FILESYSTEM_PLUGIN); lToken.put("type", "save"); lToken.put("sourceId", getClientId()); lToken.put("sender", getUsername()); lToken.put("filename", aFilename); // TODO: set mimetype correctly according to file extension based on configuration in jWebSocket.xml lToken.put("mimetype", "image/jpeg"); lToken.put("scope", aScope); lToken.put("notify", aNotify); lToken.put("data", new String(Base64.encodeBase64(aData))); sendToken(lToken); } /* functions of the Admin Plug-in */ private final static String NS_ADMIN_PLUGIN = NS_BASE + ".plugins.admin"; @Override public void disconnect() throws WebSocketException { } public void shutdown() throws WebSocketException { Token lToken = new Token(); lToken.put("type", "shutdown"); lToken.put("ns", NS_ADMIN_PLUGIN); sendToken(lToken); } @Override public void getConnections() throws WebSocketException { Token lToken = new Token(); lToken.put("type", "getConnections"); lToken.put("ns", NS_ADMIN_PLUGIN); sendToken(lToken); } @Override public void addTokenClientListener(WebSocketClientTokenListener tokenListener) { super.addListener(tokenListener); } @Override public void removeTokenClientListener(WebSocketClientTokenListener tokenListener) { super.removeListener(tokenListener); } }