from struct import *
import socket, logging
from select import select
from time import sleep
FORMAT = "%(asctime)-15s %(message)s"
logging.basicConfig(format = FORMAT)
logger = logging.getLogger('piztor_server')
logger.setLevel(logging.INFO)
def get_hex(data):
return "".join([hex(ord(c))[2:].zfill(2) for c in data])
class _SectionSize:
LENGTH = 4
OPT_ID = 1
STATUS = 1
USER_ID = 4
USER_TOKEN = 32
GROUP_ID = 2
ENTRY_CNT = 4
LATITUDE = 8
LONGITUDE = 8
LOCATION_ENTRY = USER_ID + LATITUDE + LONGITUDE
PADDING = 1
host = "202.120.7.4"
#host = "localhost"
port = 2223
def pack_data(optcode, data):
return pack("!LB", _SectionSize.LENGTH + \
_SectionSize.OPT_ID + \
len(data), optcode) + data
def gen_auth(username, password):
return pack_data(0x00, username + chr(0) + \
password + chr(0))
def gen_update_location(token, username, lat, lng):
data = pack("!32s", token)
data += username
data += chr(0)
data += pack("!dd", lat, lng)
return pack_data(0x01, data)
def gen_user_info(token, username, gid):
data = pack("!32s", token)
data += username
data += chr(0)
data += pack("!H", gid)
return pack_data(0x02, data)
def gen_update_sub(token, username, sub):
data = pack("!32s", token)
data += username
data += chr(0)
for gid in sub:
data += pack("!H", gid)
data += chr(0)
return pack_data(0x03, data)
def gen_logout(token, username):
data = pack("!32s", token)
data += username
data += chr(0)
return pack_data(0x04, data)
def gen_open_push_tunnel(token, username):
data = pack("!32s", token)
data += username
data += chr(0)
return pack_data(0x05, data)
def gen_send_text_mesg(token, username, mesg):
data = pack("!32s", token)
data += username
data += chr(0)
data += mesg
data += chr(0)
return pack_data(0x06, data)
def gen_set_marker(token, username, lat, lng, deadline):
data = pack("!32s", token)
data += username
data += chr(0)
data += pack("!ddL", lat, lng, deadline)
return pack_data(0x07, data)
def gen_change_password(token, username, old_pass, new_pass):
data = pack("!32s", token)
data += username
data += chr(0)
data += old_pass
data += chr(0)
data += new_pass
data += chr(0)
return pack_data(0x08, data)
def send(data):
received = bytes()
from time import time
begin = time()
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
sock.sendall(data)
while True:
rd, wr, err = select([sock], [], [])
if rd:
buff = sock.recv(4096)
if len(buff) == 0:
break
received += buff
else:
break
finally:
print "closing"
sock.shutdown(1)
sock.close()
print "Waited for {} seconds".format(str(time() - begin))
return received
def user_auth(username, password):
resp = send(gen_auth(username, password))
try:
pl, optcode, status, token = unpack("!LBB32s", resp[:38])
if pl != len(resp):
logger.error("User authentication: incorrect packet length")
print "status: " + str(status)
# print "token: " + get_hex(token)
except error:
logger.