diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/piztor/prob.py | 8 | ||||
-rw-r--r-- | server/piztor/ptp.rst | 2 | ||||
-rw-r--r-- | server/piztor/server.py | 69 |
3 files changed, 59 insertions, 20 deletions
diff --git a/server/piztor/prob.py b/server/piztor/prob.py index 4ccc957..57ce2fe 100644 --- a/server/piztor/prob.py +++ b/server/piztor/prob.py @@ -33,6 +33,14 @@ def gen_request_location(token, username, gid): return data +def gen_request_user_info(token, username, uid): + length = 4 + 1 + 32 + len(username) + 1 + 4 + data = pack("!LB32s", length, 0x03, token) + data += username + data += chr(0) + data += pack("!L", uid) + return data + def send(data): received = None try: diff --git a/server/piztor/ptp.rst b/server/piztor/ptp.rst index 0fee00e..9fc5ff4 100644 --- a/server/piztor/ptp.rst +++ b/server/piztor/ptp.rst @@ -132,4 +132,4 @@ Piztor Transmission Protocol v0.3a ``INFO_KEY`` : :``0x00``: gid (value is a 4-byte ``long int``) - :``0x01``: sex (value is a 1-byte ``boolean``: ``True`` for male, ``False`` for female) + :``0x01``: sex (value is a 1-byte ``boolean``: ``0x01`` for male, ``0x00`` for female) diff --git a/server/piztor/server.py b/server/piztor/server.py index 98c67c2..89c7760 100644 --- a/server/piztor/server.py +++ b/server/piztor/server.py @@ -48,6 +48,7 @@ class _OptCode: user_auth = 0x00 location_update = 0x01 location_request= 0x02 + user_info_request = 0x03 class _StatusCode: sucess = 0x00 @@ -261,6 +262,35 @@ class LocationRequestHandler(RequestHandler): class UserInfoRequestHandler(RequestHandler): + _failed_response_size = \ + _SectionSize.LENGTH + \ + _SectionSize.OPT_ID + \ + _SectionSize.STATUS + + _fail_response = \ + struct.pack("!LBB", _failed_response_size, + _OptCode.user_info_request, + _StatusCode.failure) + + @classmethod + def pack_int(cls, val): + return struct.pack("!L", val) + + @classmethod + def pack_bool(cls, val): + return struct.pack("!B", 0x01 if val else 0x00) + + _code_map = {0x00 : ('gid', pack_int), + 0x01 : ('sex', pack_bool)} + + @classmethod + def pack_entry(cls, user, entry_code): + attr, pack_method = _code_map(entry_code) + info_key = entry_code + info_value = getattr(user, attr) + return struct.pack("!B", info_key) + pack_method(info_value) + \ + struct.pack("!B", 0x00) + def handle(self, tr_data): logger.info("Reading user info request data...") @@ -271,41 +301,42 @@ class UserInfoRequestHandler(RequestHandler): raise struct.error uid, = struct.unpack("!L", tail) except struct.error: - raise BadReqError("Location request: Malformed request body") + raise BadReqError("User info request: Malformed request body") logger.info("Trying to request locatin with " \ - "(token = {0}, gid = {1})" \ - .format(get_hex(token), gid)) + "(token = {0}, uid = {1})" \ + .format(get_hex(token), uid)) session = self.Session() uauth = RequestHandler.get_uauth(token, username, session) # Auth failure if uauth is None: logger.warning("Authentication failure") - return struct.pack("!LBBL", LocationRequestHandler \ - ._location_request_response_size(0), - _OptCode.location_request, - _StatusCode.failure, - 0) + return UserInfoRequestHandler._fail_response + # TODO: check the relationship between user and quser + user = uauth.user - ulist = session.query(UserModel).filter(UserModel.gid == gid).all() - reply = struct.pack( - "!LBBL", - LocationRequestHandler._location_request_response_size(len(ulist)), - _OptCode.location_request, - _StatusCode.sucess, - len(ulist)) + reply = struct.pack("!BB", _OptCode.user_info_request, + _StatusCode.sucess) + try: + quser = session.query(UserModel) \ + .filter(UserModel.id == uid).one() + except NoResultFound: + logger.info("No such user: {0}".format(username)) + return UserInfoRequestHandler._fail_response - for user in ulist: - loc = user.location - reply += struct.pack("!Ldd", user.id, loc.lat, loc.lng) + except MultipleResultsFound: + raise DBCorruptedError() + for code in _code_map: + reply += UserInfoRequestHandler.pack_entry(quser, code) return reply handlers = [UserAuthHandler, LocationUpdateHandler, - LocationRequestHandler] + LocationRequestHandler, + UserInfoRequestHandler] def check_header(header): return 0 <= header < len(handlers) |