diff --git a/sams_classes/sams_proxy.py b/sams_classes/sams_proxy.py index b78c9d2cbf7324572b92077a0268ab79b4e7cfaa..009032742578668c155e2fd4327bb63874b245f0 100644 --- a/sams_classes/sams_proxy.py +++ b/sams_classes/sams_proxy.py @@ -38,6 +38,7 @@ class SAMSProxy: def _pass_param(self, method, paramType, paramDict = {}): paramDict.update(self._filter_session(method, paramType)) + paramDict.update(self._filter_token(paramType)) return paramDict def _filter_session(self, method, paramType): @@ -50,7 +51,13 @@ class SAMSProxy: filteredSession[filteredParams[param]['name']] = str(session.get(param)) return filteredSession - def _get_first_dict(self, *possibleDicts)->dict: + def _filter_token(self, paramType: str) -> dict: + if paramType == self._proxySpec.get('token', {}).get('param-type'): + return { + self._proxySpec['token']['name']: self._proxySpec['token']['value']} + return {} + + def _get_first_dict(self, *possibleDicts) -> dict: for possibleDict in possibleDicts: if isinstance(possibleDict, dict): return possibleDict diff --git a/test/test_sams_proxy.py b/test/test_sams_proxy.py index ed1099a2e59231b0865d7c413784cc5eb1ec175f..8390ccffea162947ec9496c376a8dc4dce70cd5b 100644 --- a/test/test_sams_proxy.py +++ b/test/test_sams_proxy.py @@ -26,30 +26,37 @@ class TestSAMSHub(unittest.TestCase): def test_mandatory_keys_in_spec(self): """ ProxySpecKeyMissing is raised if something is mising in spec""" - with self.assertRaises(ProxySpecKeyMssing): - SAMSProxy(proxySpec = {'out': 'http://baz.foo'}) - SAMSProxy(proxySpec = {'in': '/foo/bar'}) - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'token': {'name': 'user'}}) - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'token': {'value': 'user'}}) - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'session_passthrough': {}}) - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'session_passthrough': {'default': {}}}) - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'session_passthrough': {'default': {'user': {'name': 'u'}}}}) - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'session_passthrough': {'default': {'user': {'param_type': 'body'}}}}) - for method in ('get', 'post', 'delete', 'put', 'update'): - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'session_passthrough': {'default': { - 'user': {'param_type': 'body', 'name': 'u'} - }, method: {'user': {'param_type': 'body'}}}}) - SAMSProxy(proxySpec = {'in': '/foo/bar', 'out': 'http://baz.foo' - , 'session_passthrough': {'default': { - 'user': {'param_type': 'body', 'name': 'u'} - }, method: {'user': {'name': 'u'}}}}) + proxySpecs = [ + {'out': 'http://baz.foo'}, + {'in': '/foo/bar'}, + {'in': '/foo/bar', 'out': 'http://baz.foo' + , 'token': {'name': 'user'}}, + {'in': '/foo/bar', 'out': 'http://baz.foo' + , 'token': {'value': 'user'}}, + {'in': '/foo/bar', 'out': 'http://baz.foo' + , 'token': {'name': 'user', 'value': 'user'}}, + {'in': '/foo/bar', 'out': 'http://baz.foo' + , 'session-passthrough': {}}, + {'in': '/foo/bar', 'out': 'http://baz.foo' + , 'session-passthrough': {'default': {}}}, + {'in': '/foo/bar', 'out': 'http://baz.foo' + , 'session-passthrough': {'default': {'user': {'name': 'u'}}}}, + {'in': '/foo/bar', 'out': 'http://baz.foo' + , 'session-passthrough': {'default': {'user': {'param_type': 'body'}}}} + ] + for method in ('get', 'post', 'delete', 'put', 'update'): + proxySpecs.append({'in': '/foo/bar', 'out': 'http://baz.foo', + 'session-passthrough': {'default': { + 'user': {'param_type': 'body', 'name': 'u'} + }, method: {'user': {'param_type': 'body'}}}}) + proxySpecs.append({'in': '/foo/bar', 'out': 'http://baz.foo', + 'session-passthrough': {'default': { + 'user': {'param_type': 'body', 'name': 'u'} + }, method: {'user': {'name': 'u'}}}}) + for proxySpec in proxySpecs: + with self.subTest(proxySpec): + with self.assertRaises(ProxySpecKeyMssing): + SAMSProxy(proxySpec = proxySpec) class TestSAMSHubWithThreadedAPI(unittest.TestCase): @@ -187,4 +194,33 @@ class TestSAMSHubWithThreadedAPI(unittest.TestCase): resDict = json.loads(res.data.decode('utf-8')) self.assertEqual(resDict['url']['u'], 'foo') self.assertEqual(resDict['body']['g'], 'bar') - self.assertEqual(resDict['header']['Lang'], 'klingon') \ No newline at end of file + self.assertEqual(resDict['header']['Lang'], 'klingon') + + def test_token_passthrough(self): + """The proxy passes the specified token and the other params""" + for param_type in ('header', 'url', 'body'): + proxyApp = Flask('test') + proxyApp.config['TESTING'] = True + proxy = SAMSProxy( + proxySpec = { + 'in': '/proxy', 'out': 'http://localhost:4711', + 'token': { + 'name': 'Api-Token', 'value': '53CUR34P170K3N', + 'param-type': param_type + } + } + ) + with self.subTest(param_type): + proxyApp.add_url_rule(rule = proxy.urlRule, endpoint = 'proxy', + view_func = proxy.proxy, methods=['GET', 'POST', 'PUT', 'UPDATE', + 'PATCH', 'DELETE', 'OPTIONS']) + with proxyApp.test_client(self) as client: + res = client.get(path='/proxy/passthrough', + query_string={'u':'foo'}, data={'g':'bar'}, + headers={'lang': 'klingon'}) + resDict = json.loads(res.data.decode('utf-8')) + self.assertEqual(resDict['url']['u'], 'foo') + self.assertEqual(resDict['body']['g'], 'bar') + self.assertEqual(resDict['header']['Lang'], 'klingon') + eprint(resDict[param_type]) + self.assertEquals(resDict[param_type]['Api-Token'], '53CUR34P170K3N') \ No newline at end of file