summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeddy <[email protected]>2013-08-26 09:48:04 +0800
committerTeddy <[email protected]>2013-08-26 09:48:04 +0800
commit7f91994a99cb7d23a22d949454e861e879a68e98 (patch)
treebee25047dc207eadc6aa524d9c9a253b2501f0ef
parent6783b1ab50072501f4f571a4bd3db7830b120ce8 (diff)
ptp v0.4 and std-compliant server
-rw-r--r--server/piztor/prob.py25
-rw-r--r--server/piztor/ptp.rst34
-rw-r--r--server/piztor/server.py33
3 files changed, 57 insertions, 35 deletions
diff --git a/server/piztor/prob.py b/server/piztor/prob.py
index 57ce2fe..f18e42d 100644
--- a/server/piztor/prob.py
+++ b/server/piztor/prob.py
@@ -78,12 +78,29 @@ print "status: " + str(status)
resp = send(gen_request_location(token, username, gid))
print len(resp)
-pl, optcode, status, length = unpack("!LBBL", resp[:10])
+pl, optcode, status = unpack("!LBB", resp[:6])
print "size: " + str((pl, len(resp)))
-idx = 10
-print "length: " + str(len(resp[10:]))
-for i in xrange(length):
+idx = 6
+print "length: " + str(len(resp[6:]))
+while idx < pl:
print len(resp[idx:idx + 20])
uid, lat, lng = unpack("!Ldd", resp[idx:idx + 20])
idx += 20
print (uid, lat, lng)
+
+resp = send(gen_request_user_info(token, username, uid))
+pl, optcode, status = unpack("!LBB", resp[:6])
+print "size: " + str((pl, len(resp)))
+
+idx = 6
+while idx < pl:
+ info_key, = unpack("!B", resp[idx:idx + 1])
+ idx += 1
+ print info_key
+ if info_key == 0x00:
+ info_value, = unpack("!L", resp[idx:idx + 4])
+ idx += 4
+ elif info_key == 0x01:
+ info_value, = unpack("!B", resp[idx:idx + 1])
+ idx += 1
+ print (info_key, info_value)
diff --git a/server/piztor/ptp.rst b/server/piztor/ptp.rst
index 9fc5ff4..cc0d30c 100644
--- a/server/piztor/ptp.rst
+++ b/server/piztor/ptp.rst
@@ -1,4 +1,4 @@
-Piztor Transmission Protocol v0.3a
+Piztor Transmission Protocol v0.4
----------------------------------
- General
@@ -23,13 +23,21 @@ Piztor Transmission Protocol v0.3a
- In following sections, ``LENGTH`` part is left out for clarity.
- ``PADDING`` has value ``0``.
+ - ``string`` type structure:
+
+ ::
+
+ +-------?b-------+---------+
+ | STRING_CONTENT | PADDING |
+ +----------------+---------+
+
- ``AUTH_HEAD`` structure:
::
- +----32b-----+----?b----+----1b---+
- | USER_TOKEN | USERNAME | PADDING |
- +----raw-----+----------+---------+
+ +----32b-----+----?b----+
+ | USER_TOKEN | USERNAME |
+ +----raw-----+--string--+
- Authentication
@@ -37,9 +45,9 @@ Piztor Transmission Protocol v0.3a
::
- +--1b---+-----?b------+----1b----+-----?b-----+
- | 0x00 | USERNAME | PADDING | PASSWORD |
- +-uchar-+-------------+----------+------------+
+ +--1b---+-----?b---+----?b----+
+ | 0x00 | USERNAME | PASSWORD |
+ +-uchar-+--string--+--string--+
- Response
@@ -91,9 +99,9 @@ Piztor Transmission Protocol v0.3a
::
- +--1b---+---1b---+-----4b----+------20b-------+-----+
- | 0x02 | STATUS | ENTRY_CNT | LOCATION_ENTRY | ... |
- +-uchar-+-uchar--+----int----+----------------+-----+
+ +--1b---+---1b---+------20b-------+-----+
+ | 0x02 | STATUS | LOCATION_ENTRY | ... |
+ +-uchar-+-uchar--+----------------+-----+
``LOCATION_ENTRY`` :
@@ -125,9 +133,9 @@ Piztor Transmission Protocol v0.3a
::
- +----1b----+-----?b-----+---1b----+
- | INFO_KEY | INFO_VALUE | PADDING |
- +--uchar---+------------+---------+
+ +----1b----+-----?b-----+
+ | INFO_KEY | INFO_VALUE |
+ +--uchar---+------------+
``INFO_KEY`` :
diff --git a/server/piztor/server.py b/server/piztor/server.py
index 89c7760..511d51b 100644
--- a/server/piztor/server.py
+++ b/server/piztor/server.py
@@ -216,7 +216,6 @@ class LocationRequestHandler(RequestHandler):
return _SectionSize.LENGTH + \
_SectionSize.OPT_ID + \
_SectionSize.STATUS + \
- _SectionSize.ENTRY_CNT + \
_SectionSize.LOCATION_ENTRY * item_num
def handle(self, tr_data):
@@ -240,19 +239,17 @@ class LocationRequestHandler(RequestHandler):
# Auth failure
if uauth is None:
logger.warning("Authentication failure")
- return struct.pack("!LBBL", LocationRequestHandler \
+ return struct.pack("!LBB", LocationRequestHandler \
._location_request_response_size(0),
_OptCode.location_request,
- _StatusCode.failure,
- 0)
+ _StatusCode.failure)
ulist = session.query(UserModel).filter(UserModel.gid == gid).all()
reply = struct.pack(
- "!LBBL",
+ "!LBB",
LocationRequestHandler._location_request_response_size(len(ulist)),
_OptCode.location_request,
- _StatusCode.sucess,
- len(ulist))
+ _StatusCode.sucess)
for user in ulist:
loc = user.location
@@ -260,6 +257,13 @@ class LocationRequestHandler(RequestHandler):
return reply
+def pack_int(val):
+ return struct.pack("!L", val)
+
+def pack_bool(val):
+ return struct.pack("!B", 0x01 if val else 0x00)
+
+
class UserInfoRequestHandler(RequestHandler):
_failed_response_size = \
@@ -272,24 +276,16 @@ class UserInfoRequestHandler(RequestHandler):
_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)
+ attr, pack_method = cls._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)
+ return struct.pack("!B", info_key) + pack_method(info_value)
def handle(self, tr_data):
logger.info("Reading user info request data...")
@@ -328,8 +324,9 @@ class UserInfoRequestHandler(RequestHandler):
except MultipleResultsFound:
raise DBCorruptedError()
- for code in _code_map:
+ for code in UserInfoRequestHandler._code_map:
reply += UserInfoRequestHandler.pack_entry(quser, code)
+ reply = struct.pack("!L", len(reply) + _SectionSize.LENGTH) + reply
return reply