def getIdFromUrl(url): if stringutils.isEmpty(url): return None url = urlsplit(url) path = url.path if stringutils.isNotEmpty(url.path) else "/" # normalize referrers down to a path (get rid of query+fragment) seed = "%s://%s%s" % (url.scheme, url.netloc, path) return hashlib.md5(seed).hexdigest()
def onApiRequest(self): id = self.param(settings.CHATROOM_ID_PARAM) token = self.param(settings.TOKEN_PARAM) name = self.param(settings.CHATROOM_NAME_PARAM, "", settings.ROOM_NAME_CHARACTER_LIMIT, True) participants = 0 chatroom = None if stringutils.isNotEmpty(id): chatroom = chatroomservice.getChatroom(id) if chatroom is None: # check for bad IDs id = None if stringutils.isEmpty(id): id = chatroomservice.getIdFromUrl(self.request.referrer) if stringutils.isNotEmpty(id): chatroom = chatroomservice.getChatroom(id) if chatroom is None: chatroom = Chatroom(id, name) chatroomservice.cacheAndEnqueueSave(chatroom) elif len(name) > 0 and (name != chatroom.getName()): chatroom.setName(name) chatroomservice.cacheAndEnqueueSave(chatroom) if channelservice.isValidToken(id, token): participants = channelservice.activateToken(id, token) else: token, participants = channelservice.createToken(id) channelservice.updateParticipantCount(id, token) self.sendApiResponse({ 'token': token, 'chatroom': chatroom.asLiteral(), 'participants': participants, 'settings': settings.getClientSettings() }) else: self.sendApiError('invalid or missing referrer', 401)
def onApiRequest(self): id = self.param(settings.CHATROOM_ID_PARAM) if stringutils.isNotEmpty(id): chatroom = chatroomservice.getChatroom(id) if chatroom is not None: token = self.param(settings.TOKEN_PARAM) if stringutils.isNotEmpty(token): if channelservice.isValidToken(id, token, active=True): chat = self.param(settings.CHAT_MESSAGE_PARAM, "", settings.MESSAGE_CHARACTER_LIMIT, sanitize=True) alias = self.param(settings.CHAT_ALIAS_PARAM, settings.DEFAULT_CHAT_ALIAS, settings.ALIAS_CHARACTER_LIMIT, sanitize=True) message = Message(alias, chat) chatroom.addMessage(message) chatroomservice.cacheAndEnqueueSave(chatroom) status = channelservice.sendMessage(id, token, message) self.sendApiResponse(status) else: self.sendApiError('expired token', 401, {'expired':True}) else: self.sendApiError('missing access token', 401) else: self.sendApiError('chatroom does not exist', 404) else: self.sendApiError('missing chatroom id', 401)
def isValidToken(id, token, active=False): sessions, count = _getSessions(id) valid = stringutils.isNotEmpty(token) and sessions.has_key(token) if active: active = valid and sessions[token].isActive() return valid and active else: return valid
def onApiRequest(self): id = self.param(settings.CHATROOM_ID_PARAM) token = self.param(settings.TOKEN_PARAM) if stringutils.isNotEmpty(token): participants = channelservice.deactivateToken(id, token) channelservice.updateParticipantCount(id, token) self.sendApiResponse({'participants': participants}); else: self.sendApiError('missing token', 401)
def sendApiResponse(self, data, status=200): # The response body in CORS requests is ignored by browsers if the status code is not 200 # As a result, we always return 200 and add the status to the response json data['status'] = status json = simplejson.dumps(data) if stringutils.isNotEmpty(self._jsonp): self.setContentType('application/javascript') json = "%s(%s);" % (self._jsonp, json) else: self.setContentType('application/json') self.send(json)
def serveAsset(self, path, timeout=settings.ASSET_CACHE_WINDOW): cacheKey = self.getCacheKey(path, self.assetVersion) asset = memcache.get(cacheKey) if stringutils.isEmpty(asset) or not settings.CACHE_ASSETS: if os.path.exists(path): asset = open(path).read() if stringutils.isNotEmpty(asset): memcache.set(cacheKey, asset, timeout) else: return self.send("Empty Asset - %s" % path, 409) else: return self.send("Missing Asset - %s" % path, 404) self.send(asset)
def onApiRequest(self): chatroomJson = self.param(settings.CHATROOM_JSON_PARAM) if stringutils.isNotEmpty(chatroomJson): chatroom = ChatroomFromJson(chatroomJson) if chatroom is not None: chatroomservice.saveChatroom(chatroom) self.sendApiResponse({ settings.CHATROOM_ID_PARAM: chatroom.getId(), 'complete': time() }) else: self.sendApiError('invalid chatroom JSON', 401) else: self.sendApiError('missing chatroom data', 402)
def onAssetRequest(self): selectedTemplatePath = self.getTemplatePath(settings.DEFAULT_LOCALE) preferredLocales = self.param(settings.LOCALE_PARAM) if stringutils.isNotEmpty(preferredLocales): preferredLocales = preferredLocales.split(',') else: preferredLocales = self.getAcceptedLocales() for preferredLocale in preferredLocales: preferredTemplatePath = self.getTemplatePath(preferredLocale) if os.path.exists(preferredTemplatePath): selectedTemplatePath = preferredTemplatePath break self.setContentType("text/html") self.serveAsset(selectedTemplatePath)