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. # values.
NS_LIST = [NS_USERS, NS_ALIASES, NS_ROOMS] 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.token = token
self.url = url self.url = url
self.hs_token = hs_token
self.namespaces = self._check_namespaces(namespaces) self.namespaces = self._check_namespaces(namespaces)
self.txn_id = None self.txn_id = txn_id
def _check_namespaces(self, namespaces): def _check_namespaces(self, namespaces):
# Sanity check that it is of the form: # Sanity check that it is of the form:

View File

@ -30,7 +30,6 @@ class ApplicationServiceApi(SimpleHttpClient):
def __init__(self, hs): def __init__(self, hs):
super(ApplicationServiceApi, self).__init__(hs) super(ApplicationServiceApi, self).__init__(hs)
self.hs_token = "_hs_token_" # TODO extract hs token
@defer.inlineCallbacks @defer.inlineCallbacks
def query_user(self, service, user_id): def query_user(self, service, user_id):
@ -38,7 +37,7 @@ class ApplicationServiceApi(SimpleHttpClient):
response = None response = None
try: try:
response = yield self.get_json(uri, { response = yield self.get_json(uri, {
"access_token": self.hs_token "access_token": service.hs_token
}) })
if response: # just an empty json object if response: # just an empty json object
defer.returnValue(True) defer.returnValue(True)
@ -54,7 +53,7 @@ class ApplicationServiceApi(SimpleHttpClient):
response = None response = None
try: try:
response = yield self.get_json(uri, { response = yield self.get_json(uri, {
"access_token": self.hs_token "access_token": service.hs_token
}) })
if response: # just an empty json object if response: # just an empty json object
defer.returnValue(True) defer.returnValue(True)
@ -76,9 +75,10 @@ class ApplicationServiceApi(SimpleHttpClient):
"events": events "events": events
}, },
{ {
"access_token": self.hs_token "access_token": service.hs_token
}) })
if response: # just an empty json object if response: # just an empty json object
# TODO: Mark txn as sent successfully
defer.returnValue(True) defer.returnValue(True)
except CodeMessageException as e: except CodeMessageException as e:
logger.warning("push_bulk to %s received %s", uri, e.code) 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.api.errors import Codes, StoreError, SynapseError
from synapse.appservice import ApplicationService from synapse.appservice import ApplicationService
from synapse.appservice.api import ApplicationServiceApi from synapse.appservice.api import ApplicationServiceApi
import synapse.util.stringutils as stringutils
import logging import logging
@ -53,10 +54,9 @@ class ApplicationServicesHandler(object):
errcode=Codes.FORBIDDEN errcode=Codes.FORBIDDEN
) )
logger.info("Updating application service info...") logger.info("Updating application service info...")
app_service.hs_token = self._generate_hs_token()
yield self.store.update_app_service(app_service) yield self.store.update_app_service(app_service)
defer.returnValue(app_service)
logger.info("Sending ping to %s...", app_service.url)
yield self.appservice_api.push(app_service, "pinger")
def unregister(self, token): def unregister(self, token):
logger.info("Unregister as_token=%s", 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 # Fork off pushes to these services - XXX First cut, best effort
for service in services: for service in services:
self.appservice_api.push(service, event) 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) app_service = ApplicationService(as_token, as_url, namespaces)
yield self.handler.register(app_service) app_service = yield self.handler.register(app_service)
hs_token = "_not_implemented_yet" # TODO: Pull this from self.hs? hs_token = app_service.hs_token
defer.returnValue((200, { defer.returnValue((200, {
"hs_token": hs_token "hs_token": hs_token

View File

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

View File

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