Example #1
0
 def stk_login_ack(self, data):
     global updatedata, socklist, updateinfo
     passwd = user.stk_get_pass(self.uid)
     result = 0
     passtmp, reversetmp = struct.unpack("!32s64s", data)
     passnew = passtmp.strip("\000")
     if passwd == "STK_UNKNOWN_USER":
         result = 2
     elif self.state == 1:
         result = 1
     elif passwd == passnew:
         print "STK Client %s(%u) is Login in." % (user.stk_get_nickname(self.uid), self.uid)
         self.state = 1
         socklist[self.uid] = [self.sock, self.state]
         # Notify ui to update
         updateinfo.append([self.uid, u"online"])
         result = 0
     else:
         result = 3
     buf = struct.pack(
         "!2sHHHIIBBHBB",
         STK_MAGIC,
         STK_VERSION,
         COMMANDS["LOGIN"],
         self.sid,
         self.uid,
         self.token,
         self.reverse,
         STK_SERVER_FLAG,
         1,
         result,
         STK_END,
     )
     self.sock.send(buf)
Example #2
0
def stk_socket_thread(t):
    c = t[0]
    client = StkClient(c)
    while 1:
        try:
            buf = c.recv(STK_MAX_PACKET_SIZE)
            # socket.timeout or socket.error or ...
        except socket.timeout:
            global running
            if running == False:
                break
        except socket.error:
            # Whatever, error happen, just exit
            break
        else:
            size = len(buf)
            if size == -1:
                print "Recv Socket Error."
                break
            elif size == 0:
                print "Peer Socket Shutdown."
                break
            elif size > STK_MAX_PACKET_SIZE:
                print "Drop Packet(Too Large)."
                break
            else:
                pass
            h = StkPacket(buf)
            # h.show_stk_head()
            if h.check_head_valid() != True:
                print "Bad STK Packet."
                continue
            cmd = h.get_stk_cmd()
            uid = h.get_stk_uid()
            sid = h.get_stk_sid()
            data = h.get_stk_data()
            length = h.get_stk_len()
            del h
            if cmd == COMMANDS["REQ_LOGIN"]:
                client.stk_set_client(uid, sid)
                client.stk_reqlog_ack(data)
            elif cmd == COMMANDS["LOGIN"]:
                client.stk_login_ack(data)
            elif cmd == COMMANDS["KEEPALIVE"]:
                client.stk_keepalive_ack(data)
            elif cmd == COMMANDS["LOGOUT"]:
                pass
            elif cmd == COMMANDS["GET_USER"]:
                client.stk_getuser_ack(data)
            elif cmd == COMMANDS["GET_ONLINE_USER"]:
                client.stk_getonlineuser_ack(data)
            elif cmd == COMMANDS["GET_USER_INFO"]:
                client.stk_getuserinfo_ack(data)
            elif cmd == COMMANDS["GET_GROUP"]:
                client.stk_getgroup_ack(data)
            elif cmd == COMMANDS["GET_GROUP_INFO"]:
                client.stk_getgroupinfo_ack(data)
            elif cmd == COMMANDS["SEND_MSG"]:
                client.stk_sendmsg_ack(data)
            elif cmd == COMMANDS["REPLY_MSG"]:
                pass
            elif cmd == COMMANDS["SEND_GMSG"]:
                client.stk_sendgmsg_ack(data)
            elif cmd == COMMANDS["REPLY_GMSG"]:
                pass
            else:
                print "Unknow Command, Drop."
                pass
    c.close
    # Notify ui to update
    global socklist, updateinfo
    socklist[uid] = [None, 0]
    updateinfo.append([uid, u"offline"])
    print "Client socket thread exiting..."