Add hs_token column and generate a different token f.e application service.

This commit is contained in:
Kegan Dougal 2015-02-05 10:08:12 +00:00
parent a1a4960baf
commit 27091f146a
7 changed files with 35 additions and 20 deletions

View File

@ -34,11 +34,13 @@ class ApplicationService(object):
# values.
NS_LIST = [NS_USERS, NS_ALIASES, NS_ROOMS]
def __init__(self, token, url=None, namespaces=None, txn_id=None):
def __init__(self, token, url=None, namespaces=None, hs_token=None,
txn_id=None):
self.token = token
self.url = url
self.hs_token = hs_token
self.namespaces = self._check_namespaces(namespaces)
self.txn_id = None
self.txn_id = txn_id
def _check_namespaces(self, namespaces):
# Sanity check that it is of the form:

View File

@ -30,7 +30,6 @@ class ApplicationServiceApi(SimpleHttpClient):
def __init__(self, hs):
super(ApplicationServiceApi, self).__init__(hs)
self.hs_token = "_hs_token_" # TODO extract hs token
@defer.inlineCallbacks
def query_user(self, service, user_id):
@ -38,7 +37,7 @@ class ApplicationServiceApi(SimpleHttpClient):
response = None
try:
response = yield self.get_json(uri, {
"access_token": self.hs_token
"access_token": service.hs_token
})
if response: # just an empty json object
defer.returnValue(True)
@ -54,7 +53,7 @@ class ApplicationServiceApi(SimpleHttpClient):
response = None
try:
response = yield self.get_json(uri, {
"access_token": self.hs_token
"access_token": service.hs_token
})
if response: # just an empty json object
defer.returnValue(True)
@ -76,9 +75,10 @@ class ApplicationServiceApi(SimpleHttpClient):
"events": events
},
{
"access_token": self.hs_token
"access_token": service.hs_token
})
if response: # just an empty json object
# TODO: Mark txn as sent successfully
defer.returnValue(True)
except CodeMessageException as e:
logger.warning("push_bulk to %s received %s", uri, e.code)

View File

@ -19,6 +19,7 @@ from ._base import BaseHandler
from synapse.api.errors import Codes, StoreError, SynapseError
from synapse.appservice import ApplicationService
from synapse.appservice.api import ApplicationServiceApi
import synapse.util.stringutils as stringutils
import logging
@ -53,10 +54,9 @@ class ApplicationServicesHandler(object):
errcode=Codes.FORBIDDEN
)
logger.info("Updating application service info...")
app_service.hs_token = self._generate_hs_token()
yield self.store.update_app_service(app_service)
logger.info("Sending ping to %s...", app_service.url)
yield self.appservice_api.push(app_service, "pinger")
defer.returnValue(app_service)
def unregister(self, token):
logger.info("Unregister as_token=%s", token)
@ -136,3 +136,6 @@ class ApplicationServicesHandler(object):
# Fork off pushes to these services - XXX First cut, best effort
for service in services:
self.appservice_api.push(service, event)
def _generate_hs_token(self):
return stringutils.random_string(18)

View File

@ -61,8 +61,8 @@ class RegisterRestServlet(AppServiceRestServlet):
app_service = ApplicationService(as_token, as_url, namespaces)
yield self.handler.register(app_service)
hs_token = "_not_implemented_yet" # TODO: Pull this from self.hs?
app_service = yield self.handler.register(app_service)
hs_token = app_service.hs_token
defer.returnValue((200, {
"hs_token": hs_token

View File

@ -60,6 +60,7 @@ class ApplicationServiceStore(SQLBaseStore):
if service.token == token:
service.url = None
service.namespaces = None
service.hs_token = None
def _unregister_app_service_txn(self, txn, token):
# kill the url to prevent pushes
@ -100,6 +101,9 @@ class ApplicationServiceStore(SQLBaseStore):
if not service.token or not service.url:
raise StoreError(400, "Token and url must be specified.")
if not service.hs_token:
raise StoreError(500, "No HS token")
yield self.runInteraction(
"update_app_service",
self._update_app_service_txn,
@ -126,8 +130,8 @@ class ApplicationServiceStore(SQLBaseStore):
return False
txn.execute(
"UPDATE application_services SET url=? WHERE id=?",
(service.url, as_id,)
"UPDATE application_services SET url=?, hs_token=? WHERE id=?",
(service.url, service.hs_token, as_id,)
)
# cleanup regex
txn.execute(
@ -196,6 +200,7 @@ class ApplicationServiceStore(SQLBaseStore):
# 'namespace': enum,
# 'as_id': 0,
# 'token': "something",
# 'hs_token': "otherthing",
# 'id': 0
# }
# ]
@ -208,6 +213,7 @@ class ApplicationServiceStore(SQLBaseStore):
services[as_token] = {
"url": res["url"],
"token": as_token,
"hs_token": res["hs_token"],
"namespaces": {
ApplicationService.NS_USERS: [],
ApplicationService.NS_ALIASES: [],
@ -230,8 +236,9 @@ class ApplicationServiceStore(SQLBaseStore):
for service in services.values():
logger.info("Found application service: %s", service)
self.cache.services.append(ApplicationService(
service["token"],
service["url"],
service["namespaces"]
token=service["token"],
url=service["url"],
namespaces=service["namespaces"],
hs_token=service["hs_token"]
))

View File

@ -17,6 +17,7 @@ CREATE TABLE IF NOT EXISTS application_services(
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT,
token TEXT,
hs_token TEXT,
UNIQUE(token) ON CONFLICT ROLLBACK
);

View File

@ -46,13 +46,15 @@ class ApplicationServiceStoreTestCase(unittest.TestCase):
@defer.inlineCallbacks
def test_update_and_retrieval_of_service(self):
url = "https://matrix.org/appservices/foobar"
hs_token = "hstok"
user_regex = ["@foobar_.*:matrix.org"]
alias_regex = ["#foobar_.*:matrix.org"]
room_regex = []
service = ApplicationService(url=url, token=self.as_token, namespaces={
ApplicationService.NS_USERS: user_regex,
ApplicationService.NS_ALIASES: alias_regex,
ApplicationService.NS_ROOMS: room_regex
service = ApplicationService(
url=url, hs_token=hs_token, token=self.as_token, namespaces={
ApplicationService.NS_USERS: user_regex,
ApplicationService.NS_ALIASES: alias_regex,
ApplicationService.NS_ROOMS: room_regex
})
yield self.store.update_app_service(service)