diff --git a/SAS/MoM/MoMQueryService/momqueryservice.py b/SAS/MoM/MoMQueryService/momqueryservice.py index 395d419224e16015e7d00db5a2847b758304afb9..743b1562f8937aafe32ff1983050191a1635edc1 100755 --- a/SAS/MoM/MoMQueryService/momqueryservice.py +++ b/SAS/MoM/MoMQueryService/momqueryservice.py @@ -13,7 +13,7 @@ from lofar.messaging import Service logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) logger=logging.getLogger("momqueryservice") -class ProjectDetailsQueryHandler: +class MoMDatabaseWrapper: '''handler class for details query in mom db''' def __init__(self, passwd): self.conn = connector.connect(host="mysql1.control.lofar", @@ -21,6 +21,28 @@ class ProjectDetailsQueryHandler: passwd=passwd, database="lofar_mom3") + def getProjectDetails(self, mom_ids_str): + cursor = self.conn.cursor(dictionary=True) + # TODO: make a view for this query in momdb! + query = '''SELECT project.mom2id as project_mom2id, project.name as project_name, project.description as project_description, + object.mom2id as object_mom2id, object.name as object_name, object.description as object_description, object.mom2objecttype as object_type, object.group_id as object_group_id + FROM lofar_mom3.mom2object as object + inner join lofar_mom3.mom2object as project on project.id = object.ownerprojectid + where object.mom2id in (%s) + order by project_mom2id + ''' % (mom_ids_str) + cursor.execute(query) + + return cursor.fetchall() + + +class ProjectDetailsQueryHandler: + '''handler class for details query in mom db + :param MoMDatabaseWrapper momdb inject database access via wrapper + ''' + def __init__(self, passwd, momdb): + self.momdb = momdb + def __call__(self, text): # parse text # it should contain a list of ints @@ -30,24 +52,12 @@ class ProjectDetailsQueryHandler: mom_ids_str = ', '.join(mom_ids) if not mom_ids_str: - logger.error("Could not find proper ids in: " + text) raise KeyError("Could not find proper ids in: " + text) logger.info("Query for mom id%s: %s" % ('\'s' if len(mom_ids) > 1 else '', mom_ids_str)) - cursor = self.conn.cursor(dictionary=True) - # TODO: make a view for this query in momdb! - query = '''SELECT project.mom2id as project_mom2id, project.name as project_name, project.description as project_description, - object.mom2id as object_mom2id, object.name as object_name, object.description as object_description, object.mom2objecttype as object_type, object.group_id as object_group_id - FROM lofar_mom3.mom2object as object - inner join lofar_mom3.mom2object as project on project.id = object.ownerprojectid - where object.mom2id in (%s) - order by project_mom2id - ''' % (mom_ids_str) - cursor.execute(query) - result = {} - rows = cursor.fetchall() + rows = self.momdb.getProjectDetails(mom_ids_str) for row in rows: object_mom2id = row['object_mom2id'] result[str(object_mom2id)] = row @@ -56,12 +66,15 @@ class ProjectDetailsQueryHandler: return result -def createService(busname='momqueryservice', momreadonly_passwd=''): +def createService(busname='momqueryservice', momreadonly_passwd='', momdb = None): '''create the GetProjectDetails on given busname :param string busname: name of the bus on which this service listens :param string momreadonly_passwd: the momreadonly passwd. :rtype: lofar.messaging.Service''' - handler = ProjectDetailsQueryHandler(momreadonly_passwd) + if not momdb: + momdb = MoMDatabaseWrapper(momreadonly_passwd) + + handler = ProjectDetailsQueryHandler(momreadonly_passwd, momdb) return Service(busname, 'GetProjectDetails', handler, diff --git a/SAS/MoM/MoMQueryService/test/test_momqueryservice.py b/SAS/MoM/MoMQueryService/test/test_momqueryservice.py index 24f9158aff102f623c43f7fd1c8bd6acc0de000f..4f1ba7350d36b8a709f691d604faecf524f69552 100755 --- a/SAS/MoM/MoMQueryService/test/test_momqueryservice.py +++ b/SAS/MoM/MoMQueryService/test/test_momqueryservice.py @@ -33,14 +33,20 @@ try: busname = "momqueryservice-test-%s" % (uuid.uuid1()) broker.addExchange('topic', busname) - # do not commit passwd in svn - passwd = '' + testid = '1234' - with momqueryservice.createService(busname, passwd): + # create a mock for the MoMDatabaseWrapper + # so we don't need the actual momdb for this test + # and we don't need the momdb passwd + class MockMoMDatabaseWrapper: + def getProjectDetails(self, mom_ids_str): + return [{'project_mom2id': '4567', 'project_name': 'foo', 'project_description': 'bar', 'object_mom2id': testid}] + + # inject the mock into the service + with momqueryservice.createService(busname, '', MockMoMDatabaseWrapper()): class TestLTAStorageDb(unittest.TestCase): def testProjectDetailsQuery(self): - testid = '598612' result = momprojectdetailsquery.getProjectDetails(testid, busname) self.assertEquals(1, len(result.keys())) self.assertEquals(testid, result.keys()[0]) @@ -49,9 +55,8 @@ try: self.assertTrue('project_description' in result[testid]) def testSqlInjection(self): - testid = '598612; select * from lofar_mom3.mom2object;' - result = momprojectdetailsquery.getProjectDetails(testid, busname) - print result + inj_testid = testid + '; select * from lofar_mom3.mom2object;' + result = momprojectdetailsquery.getProjectDetails(inj_testid, busname) self.assertTrue('errmsg' in result) self.assertTrue('KeyError' in result['errmsg'])