summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/piztor/prob.py5
-rw-r--r--server/piztor/ptp.rst135
-rw-r--r--server/piztor/server.py24
3 files changed, 157 insertions, 7 deletions
diff --git a/server/piztor/prob.py b/server/piztor/prob.py
index 1f9bdb7..4ccc957 100644
--- a/server/piztor/prob.py
+++ b/server/piztor/prob.py
@@ -45,6 +45,11 @@ def send(data):
sock.close()
return received
+from sys import argv
+
+if len(argv) == 2:
+ host = argv[1]
+
username = "hello"
password = "world"
gid = 1
diff --git a/server/piztor/ptp.rst b/server/piztor/ptp.rst
new file mode 100644
index 0000000..c12cf65
--- /dev/null
+++ b/server/piztor/ptp.rst
@@ -0,0 +1,135 @@
+Piztor Transmission Protocol v0.3a
+----------------------------------
+
+- General
+
+ - Request
+
+ ::
+
+ +---4b---+---1b---+-------?b--------+
+ | LENGTH | OPT_ID | SPECIFIC DATA |
+ +--int---+-uchar--+-----------------+
+
+ - Response
+
+ ::
+
+ +---4b---+---1b---+------?b---------+
+ | LENGTH | OPT_ID | SPECIFIC DATA |
+ +--int---+-uchar--+-----------------+
+
+ Notice:
+
+ - In following sections, ``LENGTH`` part is left out for clarity.
+ - ``PADDING`` has value ``0``.
+ - ``AUTH_HEAD`` structure:
+
+ ::
+
+ +----32b-----+----?b----+----1b---+
+ | USER_TOKEN | USERNAME | PADDING |
+ +----raw-----+----------+---------+
+
+- Authentication
+
+ - Request
+
+ ::
+
+ +--1b---+-----?b------+----1b----+-----?b-----+
+ | 0x00 | USERNAME | PADDING | PASSWORD |
+ +-uchar-+-------------+----------+------------+
+
+ - Response
+
+ ::
+
+ +--1b---+---1b---+---4b----+----32b-----+
+ | 0x00 | STATUS | USER_ID | USER_TOKEN |
+ +-uchar-+--uchar-+---int---+----raw-----+
+
+ ``STATUS`` :
+
+ - ``0x00`` for success
+ - ``0x01`` for failure
+
+- Location Update
+
+ - Request
+
+ ::
+
+ +--1b---+-----?b------+----8b------+------8b-----+
+ | 0x01 | AUTH_HEAD | LATITUDE | LONGITUDE |
+ +-uchar-+-------------+---double---+---double----+
+
+ - Response
+
+ ::
+
+ +--1b---+---1b---+
+ | 0x01 | STATUS |
+ +-uchar-+--uchar-+
+
+ ``STATUS`` :
+
+ - ``0x00`` for success
+ - ``0x01`` for invalid token
+
+- Location Information
+
+ - Request
+
+ ::
+
+ +--1b---+------?b------+------4b-----+
+ | 0x02 | AUTH_HEAD | GROUP_ID |
+ +-uchar-+--------------+-----int-----+
+
+ - Response
+
+ ::
+
+ +--1b---+---1b---+-----4b----+------20b-------+-----+
+ | 0x02 | STATUS | ENTRY_CNT | LOCATION_ENTRY | ... |
+ +-uchar-+-uchar--+----int----+----------------+-----+
+
+ ``LOCATION_ENTRY`` :
+
+ ::
+
+ +---4b----+----8b----+-----8b----+
+ | USER_ID | LATITUDE | LONGITUDE |
+ +---int---+--double--+--double---+
+
+- User Information
+
+ - Request
+
+ ::
+
+ +--1b---+------?b------+------4b-----+
+ | 0x02 | AUTH_HEAD | USER_ID |
+ +-uchar-+--------------+-----int-----+
+
+ - Response
+
+ ::
+
+ +--1b---+---1b---+------?b-----+-----+
+ | 0x03 | STATUS | UINFO_ENTRY | ... |
+ +-uchar-+-uchar--+-------------+-----+
+
+ ``UINFO_ENTRY`` :
+
+ ::
+
+ +----1b----+-----?b-----+
+ | INFO_KEY | INFO_VALUE |
+ +--uchar---+------------+
+
+ ``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)
diff --git a/server/piztor/server.py b/server/piztor/server.py
index 5c3160b..2397225 100644
--- a/server/piztor/server.py
+++ b/server/piztor/server.py
@@ -2,6 +2,7 @@ from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint
from twisted.internet import reactor
+from twisted.protocols.policies import TimeoutMixin
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
@@ -45,8 +46,8 @@ class _SectionSize:
class _OptCode:
user_auth = 0x00
- location_update = 0x02
- location_request= 0x03
+ location_update = 0x01
+ location_request= 0x02
class _StatusCode:
sucess = 0x00
@@ -265,17 +266,23 @@ handlers = [UserAuthHandler,
def check_header(header):
return 0 <= header < len(handlers)
-class PTP(Protocol):
+class PTP(Protocol, TimeoutMixin):
- def __init__(self):
+ def __init__(self, factory):
self.buff = bytes()
self.length = -1
+ self.factory = factory
+
+ def timeoutConnection(self):
+ logger.info("The connection times out")
def connectionMade(self):
logger.info("A new connection is made")
+ self.setTimeout(self.factory.timeout)
def dataReceived(self, data):
self.buff += data
+ self.resetTimeout()
print len(self.buff)
if len(self.buff) > 4:
try:
@@ -286,6 +293,8 @@ class PTP(Protocol):
logger.warning("Invalid request header")
raise BadReqError("Malformed request header")
print self.length
+ if self.length == -1:
+ return
if len(self.buff) == self.length:
h = handlers[self.optcode]()
reply = h.handle(self.buff[5:])
@@ -299,12 +308,13 @@ class PTP(Protocol):
def connectionLost(self, reason):
logger.info("The connection is lost")
+ self.setTimeout(None)
class PTPFactory(Factory):
- def __init__(self):
- pass
+ def __init__(self, timeout = 10):
+ self.timeout = timeout
def buildProtocol(self, addr):
- return PTP()
+ return PTP(self)
endpoint = TCP4ServerEndpoint(reactor, 9990)
endpoint.listen(PTPFactory())