Update RPS to allow configuration for the new Mobile App
Update RPS to have endpoint that return url for QR code.
The RPS now also have /service endpoint that return JSON formated
service details.
diff --git a/servers/rps/rps.py b/servers/rps/rps.py
index 4dd9c6f..2b4f176 100755
--- a/servers/rps/rps.py
+++ b/servers/rps/rps.py
@@ -27,6 +27,7 @@
import sys
import time
import urllib
+import uuid
from urlparse import urlparse
import tornado.autoreload
@@ -129,6 +130,9 @@
define("mobileUseNative", default=False, type=bool)
define("mobileConfig", default=None, type=list)
define("useNFC", default=False, type=bool)
+define("serviceName", default="", type=unicode)
+define("serviceType", default="online", type=unicode)
+define("serviceIconUrl", default="", type=unicode)
# Mapping between local names of dynamic options and names from json
@@ -315,6 +319,9 @@
params["accessNumberURL"] = "{0}/accessnumber".format(baseURL)
params["getAccessNumberURL"] = "{0}/getAccessNumber".format(baseURL)
+ if options.mobileUseNative:
+ params["getQrUrl"] = "{0}/getQrUrl".format(baseURL)
+
self.write(params)
self.finish()
@@ -674,7 +681,7 @@
# Generate request for MPinWIDServer for WID
wId = secrets.generate_random_webid(self.application.server_secret.rng, options.accessNumberUseCheckSum)
- while wId is None or (self.storage.find(stage="auth", webID=wId)):
+ while wId is None or (self.storage.find(stage="auth", wid=wId)):
if wId is None:
log.debug("WebId is None".format(wId))
else:
@@ -703,6 +710,44 @@
self.finish()
+class RPSGetQrUrlHandler(BaseHandler):
+ @tornado.web.asynchronous
+ @tornado.gen.engine
+ def post(self):
+ # Generate request for MPinWIDServer for WID
+ wId = uuid.uuid4().hex
+
+ while wId is None or (self.storage.find(stage="auth", wid=wId)):
+ if wId is None:
+ log.debug("WebId is None".format(wId))
+ else:
+ log.debug("WebId {0} already exists. Generating a new one".format(wId))
+
+ wId = uuid.uuid4().hex
+
+ log.debug("New webId generated: {0}." .format(wId))
+
+ webOTT = secrets.generate_ott(options.OTTLength, self.application.server_secret.rng, "hex")
+
+ nowTime = Time.syncedNow()
+ expirePinPadTime = nowTime + datetime.timedelta(seconds=options.accessNumberExpireSeconds)
+ expireTime = expirePinPadTime + datetime.timedelta(seconds=options.accessNumberExtendValiditySeconds)
+
+ self.storage.add(stage="auth", expire_time=expireTime, webOTT=webOTT, wid=wId)
+
+ qrUrl = options.rpsBaseURL + "#" + wId
+ params = {
+ "ttlSeconds": options.accessNumberExpireSeconds,
+ "qrUrl": qrUrl,
+ "webOTT": webOTT,
+ "localTimeStart": Time.DateTimetoEpoch(nowTime),
+ "localTimeEnd": Time.DateTimetoEpoch(expirePinPadTime)
+ }
+
+ self.write(params)
+ self.finish()
+
+
class RPSAccessNumberHandler(BaseHandler):
@tornado.web.asynchronous
@tornado.gen.engine
@@ -849,6 +894,22 @@
self.finish()
+class ServiceHandler(BaseHandler):
+ @tornado.web.asynchronous
+ @tornado.gen.engine
+ def get(self):
+ params = {
+ "name": options.serviceName,
+ "url": options.rpsBaseURL,
+ "type": options.serviceType,
+ "rps_prefix": options.rpsPrefix,
+ "icon_url": options.serviceIconUrl,
+ }
+
+ self.write(params)
+ self.finish()
+
+
class DefaultHandler(BaseHandler):
def get(self, input):
reason = "URI NOT FOUND"
@@ -1505,6 +1566,7 @@
(r"/{0}/setupDone/([0-9A-Fa-f]+)".format(rpsPrefix), RPSSetupDoneHandler), # POST
(r"/{0}/accessnumber".format(rpsPrefix), RPSAccessNumberHandler), # POST
(r"/{0}/getAccessNumber".format(rpsPrefix), RPSGetAccessNumberHandler), # POST
+ (r"/{0}/getQrUrl".format(rpsPrefix), RPSGetQrUrlHandler), # POST
(r"/{0}/clientSettings".format(rpsPrefix), ClientSettingsHandler),
(r"/{0}/authenticate".format(rpsPrefix), RPSAuthenticateHandler), # POST, for mobile login
# Authentication
@@ -1518,6 +1580,7 @@
(r"/loginResult", LoginResultHandler), # POST
(r"/status", StatusHandler),
+ (r"/service", ServiceHandler), # GET
(r"/dynamicOptions", DynamicOptionsHandler), # POST, GET
(r"/{0}/mobileConfig".format(rpsPrefix), MobileConfigHandler), # GET
(r"/(.*)", DefaultHandler),