import sqlalchemy
import SocketServer, socket, select
import struct
import os
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from random import randint
engine = create_engine('sqlite:///t.sqlite', echo = False)
Base = declarative_base()
Session = sessionmaker(bind=engine)
def get_hex(data):
return "".join([hex(ord(c))[2:].zfill(2) for c in data])
class PiztorError(Exception):
def __init__(self, msg):
self.err_msg = msg
def __str__(self, msg):
return self.err_msg
class ConnectionError(PiztorError):
pass
class ReqReadError(ConnectionError):
def __init__(self):
super(ReqReadError, self).__init__("Error while reading request")
class ReqInvalidError(ConnectionError):
def __init__(self):
super(ReqInvalidError, self).__init__("Invalid request")
class TokenInvalidError(ConnectionError):
def __init__(self):
super(TokenInvalidError, self).__init__("Invalid token")
class DataManager(object):
def __init__(self, piz_srv):
self.piz_srv = piz_srv
class UserManager(DataManager):
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key = True)
gid = Column(Integer)
username = Column(String)
password = Column(String)
token = Column(Integer)
def get_user_by_token(self, token):
session = Session()
User = UserManager.User
entries = session.query(User).filter(User.token == token).all()
if len(entries) == 0:
raise TokenInvalidError()
return entries[0]
def authentication_handle(self, opt_type, data):
print "Parsing User Data"
pos = -1
for i in xrange(0, len(data)):
if data[i] == '\0':
print i
if pos != -1:
raise ReqInvalidError()
pos = i
break
if pos == -1:
raise ReqInvalidError()
username = data[0:pos]
password = data[pos + 1:]
print "Trying to login with following info:"
print (username, password)
session = Session()
entries = session.query(UserManager.User). \
filter(UserManager.User.username == username).all()
if len(entries) == 0:
return struct.pack("!BLB", 0, 0, 1)
entry = entries[0]
if entry.password != password: # Auth failed
print "Login failed!"
return struct.pack("!BLB", 0, 0, 1)
else: # Succeeded
print "Logged in sucessfully!"
entry.token = randint(0, 2147483647)
session.commit()
return struct.pack("!BLB", 0, entry.token, 0)
class MesgManager(DataManager):
def mesg_sending_handle(self, opt_type, data):
print "Parsing Mesg Data"
try:
if len(data) < 8:
raise ReqInvalidError()
sender_token, recv_id = struct.unpack("!LL", data[:8])
msg = data[8:]
print (sender_token, recv_id, msg)
return struct.pack("!B", 1)
except struct.error:
raise ReqInvalidError()
class LocationManager(DataManager):
class LocationInfo(Base):
__tablename__ = "location_info"
uid = Column(Integer,