1 19 20 package org.lucane.server; 21 22 import java.io.IOException ; 23 import java.net.Socket ; 24 import java.util.StringTokenizer ; 25 26 import org.lucane.common.Logging; 27 import org.lucane.common.Message; 28 import org.lucane.common.concepts.ServiceConcept; 29 import org.lucane.common.concepts.UserConcept; 30 import org.lucane.common.net.ObjectConnection; 31 import org.lucane.server.store.Store; 32 33 38 public class MessageHandler extends Thread 39 { 40 private Socket socket; 41 42 private ObjectConnection connection; 43 private Message message; 44 45 boolean isAlreadyConnected; 46 boolean isAuthenticationMessage; 47 boolean isServerInfoMessage; 48 49 54 public MessageHandler(Socket socket) 55 { 56 this.socket = socket; 57 } 58 59 62 public void run() 63 { 64 try { 66 init(); 67 } 68 catch (Exception ex) 69 { 70 ex.printStackTrace(); 71 Logging.getLogger().warning("#Err > Unable to read message."); 72 closeConnection(); 73 return; 74 } 75 76 if(!isAlreadyConnected && !isAuthenticationMessage && !isServerInfoMessage) 78 { 79 Logging.getLogger().info("Access denied to " + message.getSender()); 80 try { 81 connection.write("FAILED No Connection"); 82 } catch (Exception e) {} 83 } 84 85 else if (message.getApplication().equals("Server")) 87 handleServerMessage(); 88 89 else 91 handleServiceMessage(); 92 93 closeConnection(); 94 } 95 96 99 private void init() 100 throws IOException , ClassNotFoundException 101 { 102 connection = new ObjectConnection(socket); 103 message = (Message)connection.read(); 104 105 isAlreadyConnected = ConnectInfoManager.getInstance().isConnected(message.getSender()); 106 isAuthenticationMessage = message.getApplication().equals("Server") 107 && ((String )message.getData()).startsWith("AUTH"); 108 isServerInfoMessage = message.getApplication().equals("Server") 109 && ((String )message.getData()).startsWith("GET_SERVER_INFO"); 110 } 111 112 115 private void handleServerMessage() 116 { 117 String command = ""; 118 String parameters = ""; 119 120 try 122 { 123 StringTokenizer stk = new StringTokenizer ((String )message.getData()); 124 command = stk.nextToken(); 125 parameters = stk.nextToken("\0").substring(1); 126 } 127 catch (Exception ex) 128 { 129 } 131 132 if(isAuthenticationMessage) 134 { 135 sendAck(); 136 Server.getInstance().getAuthenticator().authenticate(connection, message, parameters); 137 return; 138 } 139 140 executeCommand(command, parameters); 142 } 143 144 147 private void handleServiceMessage() 148 { 149 String userName = message.getSender().getName(); 150 String serviceName = message.getApplication(); 151 152 Store store = Server.getInstance().getStore(); 154 Service s = ServiceManager.getInstance().getService(serviceName); 155 156 if(s == null) 158 { 159 try { 160 connection.write("FAILED not running"); 161 } catch (Exception e) {} 162 Logging.getLogger().warning("Service "+ serviceName + " not running"); 163 return; 164 } 165 166 167 boolean isAuthorizedService = false; 169 try { 170 UserConcept user = store.getUserStore().getUser(userName); 171 ServiceConcept service = store.getServiceStore().getService(serviceName); 172 isAuthorizedService = store.getServiceStore().isAuthorizedService(user, service); 173 } catch(Exception e) { 174 Logging.getLogger().warning("Error while checking service permission"); 175 e.printStackTrace(); 176 } 177 178 if(!isAuthorizedService) 179 { 180 Logging.getLogger().warning(serviceName + " : Service denied to " + userName); 181 try { 182 connection.write("FAILED You don't have acces to this service"); 183 } catch (Exception e) {} 184 return; 185 } 186 187 sendAck(); 189 s.process(connection, message); 190 } 191 192 195 private void executeCommand(String command, String parameters) 196 { 197 if (command.equals("GET_SERVER_INFO")) 198 { 199 sendAck(); 200 Server.getInstance().sendServerConnectInfo(connection); 201 } 202 203 else if (command.equals("CONNECT_DEL")) 204 { 205 sendAck(); 206 ConnectInfoManager.getInstance().removeConnectInfo(message.getSender()); 207 } 208 209 else if (command.equals("CONNECT_GET")) 210 { 211 sendAck(); 212 Server.getInstance().sendConnectInfo(parameters, connection); 213 } 214 215 else if (command.equals("CONNECT_LIST")) 216 { 217 sendAck(); 218 Server.getInstance().sendUserList(connection); 219 } 220 221 else if (command.equals("PLUGIN_LIST")) 222 { 223 sendAck(); 224 Server.getInstance().sendPluginList(connection, message.getSender().getName()); 225 } 226 227 else if (command.equals("PLUGIN_GET")) 228 { 229 sendAck(); 230 Server.getInstance().sendPluginFile(connection, parameters); 231 } 232 233 else if (command.equals("STARTUP_PLUGINS")) 234 { 235 sendAck(); 236 Server.getInstance().sendStartupPlugin(connection, message.getSender().getName()); 237 } 238 239 else 240 { 241 try { 242 connection.write("FAILED Unknown command"); 243 } catch (Exception e) {} 244 } 245 } 246 247 250 private void sendAck() 251 { 252 try { 253 connection.write("OK"); 254 } catch (Exception e) {} 255 } 256 257 260 private void closeConnection() 261 { 262 try { 263 this.connection.close(); 264 this.socket.close(); 265 } catch (IOException e) {} 266 } 267 } | Popular Tags |