1 22 23 package server; 24 25 import javax.net.ssl.*; 26 import java.io.BufferedInputStream ; 27 import java.io.BufferedOutputStream ; 28 import java.io.ObjectOutputStream ; 29 import java.io.ObjectInputStream ; 30 import java.io.IOException ; 31 import java.lang.ClassNotFoundException ; 32 import common.*; 33 import common.sd.*; 34 35 36 42 public class ClientConnection implements Runnable , SocketConnection { 43 private LlamaChatServer server; 44 private SSLSocket socket; 45 public String name; 46 public String ip; 47 public String channel; 48 49 private ObjectInputStream in; 50 private ObjectOutputStream out; 51 private boolean finalized; 52 private boolean admin; 53 54 private MessageQueue queue; 55 56 ClientConnection(LlamaChatServer serv, SSLSocket sock) { 57 try { 58 name = null; 59 finalized = false; 60 admin = false; 61 channel = serv.channels.defaultChannel; 62 server = serv; 63 socket = sock; 64 ip = sock.getInetAddress().getHostName(); 65 out = new ObjectOutputStream (sock.getOutputStream()); 66 in = new ObjectInputStream (sock.getInputStream()); 67 queue = new MessageQueue(this); 68 new Thread (this).start(); 69 } catch (IOException e) { 70 server.log(this, "failed connection"); 71 server.connectingUsers.remove(this); 72 } 73 } 74 75 79 private SocketData readObject() { 80 try { 81 return (SocketData) in.readObject(); 82 } catch (IOException e) { 83 return null; 84 } catch (ClassNotFoundException e) { 85 return null; 86 } 87 } 88 89 93 public void writeObject(Object obj) { 94 queue.enqueue(obj); 95 } 96 97 101 public void _writeObject(Object obj) { 102 try { 103 out.writeObject(obj); 104 out.flush(); 105 } catch (IOException e) { 106 close(); 107 } 108 } 109 110 113 public void close() { 114 server.kill(this); 115 try { 116 socket.close(); 117 } catch (IOException e) { e.printStackTrace(); } 118 } 119 120 124 public boolean isAdmin() { 125 return admin; 126 } 127 128 134 public void serverCap(char type, Object obj) { 135 } 137 138 144 public void userAdd(String username) { 145 if (username == null) { 146 writeObject(new SD_Error("no username recieved")); 147 return; 148 } 149 if (name == null && !finalized) { 150 name = username; 151 finalized = server.finalizeUser(username, this); 152 if (!finalized) { 153 name = null; 154 writeObject(new SD_Kick(null)); 155 } 156 } else { 157 writeObject(new SD_Error("already recieved name: " + name)); 158 } 159 } 160 161 165 public void adminAdd(String password) { 166 if (!server.allowAdmin) { 167 writeObject(new SD_Error("admins are not allow on this server")); 168 } else if (password.equals(server.adminPass)) { 169 admin = true; 170 server.broadcast(new SD_AdminAdd(name), null, channel); 171 } else { 172 writeObject(new SD_Error("incorrect administrative password")); 173 } 174 } 175 176 180 public void userDel(String username) { 181 close(); 182 } 183 184 190 public void rename(String on, String nn) { 191 if (server.connectedUsers.containsKey(nn)) { 192 writeObject(new SD_Error("username already exists")); 193 } else { 195 server.connectedUsers.remove(name); 196 server.connectedUsers.put(nn, this); 197 server.broadcast(new SD_Rename(name, nn), nn, channel); 198 server.updateUserExport(); 199 name = nn; 200 } 201 } 202 203 208 public void kick(String username) { 209 if (admin) { 210 ClientConnection cc = 211 (ClientConnection) server.connectedUsers.get(username); 212 if (cc == null) { 213 writeObject(new SD_Error("user " + username + 214 " does not exist")); 215 } else { 216 server.sendTo(new SD_Error("You have been kicked by " + name), 217 username); 218 cc.close(); 219 } 220 } else { 221 writeObject(new SD_Error("Couldn't verify administrative status")); 222 } 223 } 224 225 235 public void channel(boolean nc, String n, String p) { 236 if (nc) { 237 String reason; 238 if ((reason = server.newChannel(n, p, this)) == null) { 239 server.log(this, "channel " + n + " created"); 240 channel(false, n, p); 241 } else { 242 writeObject(new SD_Error(reason)); 243 } 244 } else { 245 if (server.channels.channelExists(n)) { 246 if (channel.equals(n)) { 247 writeObject(new SD_Error("Already a member of " + n)); 248 writeObject(new SD_Channel(false,null,null)); 249 } else if (!server.channels.userAdd(n, p)) { 250 writeObject(new SD_Error("invalid passphrase or none " + 251 "provided, use \\join " + n + " <password>")); 252 writeObject(new SD_Channel(false,null,null)); 253 } else { 254 server.broadcast(new SD_UserDel(name), name, channel); 255 if (server.channels.userDel(channel)) { 256 server.broadcast(new SD_Channel(true, channel, null), null); 257 server.chatLog(this, false); 258 server.log(this, "channel " + channel + " removed"); 259 } 260 channel = n; 261 server.broadcast(new SD_UserAdd(name), name, channel); 262 if (admin) { 263 server.broadcast(new SD_AdminAdd(name), name, channel); 264 } 265 266 writeObject(new SD_Channel(false, channel, null)); 267 server.sendUserList(this); 268 server.updateUserExport(); 269 } 270 } else { 271 writeObject(new SD_Error(n + " does not exist")); 272 writeObject(new SD_Channel(false,null,null)); 273 } 274 } 275 } 276 277 278 284 public void chat(String username, String message) { 285 if (finalized) { 286 server.chatLog(this, message); 287 server.broadcast(new SD_Chat(name, message), name, channel); 288 } else { 289 writeObject(new SD_Error("connection not confirmed")); 290 } 291 } 292 293 298 public void private_msg(String username, String message) { 299 if (finalized) { 300 server.sendTo(new SD_Private(name, message), username); 301 } else { 302 writeObject(new SD_Error("connection not confirmed")); 303 } 304 } 305 306 311 public void whisper(String username, String message) { 312 if (finalized) { 313 server.sendTo(new SD_Whisper(name, message), username); 314 } else { 315 writeObject(new SD_Error("connection not confirmed")); 316 } 317 } 318 319 323 public void chatLog(boolean start) { 324 if (admin) { 325 if (server.chatLog(this, start)) { 326 writeObject(new SD_Log(start)); 327 } else { 328 writeObject(new SD_Error("unable to modify log for " + channel)); 329 } 330 } else { 331 writeObject(new SD_Error("Could not verify administrative status")); 332 } 333 } 334 335 339 public void error(String err) { 340 server.log(this, err); 341 } 342 343 345 349 public void run() { 350 SocketData sd; 351 while ((sd = readObject()) != null) { 352 sd.performAction(this); 353 } 354 close(); 355 } 356 } 357
| Popular Tags
|