From 0c32389cf30ebd31bc6e34f1a78aa41774d80099 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Fri, 3 Aug 2018 17:33:28 -0700 Subject: [PATCH] Lyft view - amundsen edition (cherry picked from commit 9b3420c8ef51739206282514ca4a69fb01a2066f) (cherry picked from commit 2df0fb8d286616cd4d5b9f582d337c726edd1d7a) (cherry picked from commit 2829eadd7f3d534710bfc53a735c08efb1487516) (cherry picked from commit ac9dbef4a2fadfc82a617787112bfa336ee100bc) --- superset/views/__init__.py | 1 + superset/views/core.py | 3 +++ superset/views/lyft.py | 55 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 superset/views/lyft.py diff --git a/superset/views/__init__.py b/superset/views/__init__.py index eed1ff2326143..c6bdcd997c201 100644 --- a/superset/views/__init__.py +++ b/superset/views/__init__.py @@ -1,3 +1,4 @@ +from . import lyft # noqa from . import base # noqa from . import api # noqa from . import core # noqa diff --git a/superset/views/core.py b/superset/views/core.py index a15d7247a2e7c..5c716d2ea6cf6 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -2447,6 +2447,9 @@ def stop_query(self): @expose('/sql_json/', methods=['POST', 'GET']) @log_this def sql_json(self): + return self.sql_json_call(request) + + def sql_json_call(self, request): """Runs arbitrary sql and returns and json""" async_ = request.form.get('runAsync') == 'true' sql = request.form.get('sql') diff --git a/superset/views/lyft.py b/superset/views/lyft.py new file mode 100644 index 0000000000000..76e9162a557c9 --- /dev/null +++ b/superset/views/lyft.py @@ -0,0 +1,55 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from flask import g, request, Response +from flask_appbuilder import expose + +from superset import app, appbuilder, security_manager +from superset.exceptions import SupersetException +import superset.models.core as models +from superset.views.core import Superset +from .base import json_error_response + +config = app.config +stats_logger = config.get('STATS_LOGGER') +log_this = models.Log.log_this +DAR = models.DatasourceAccessRequest + + +class UserDontExistException(SupersetException): + pass + + +def json_success(json_msg, status=200): + return Response(json_msg, status=status, mimetype='application/json') + + +class Lyft(Superset): + @staticmethod + def authorize(): + """Provides access if token, impersonates if specified""" + if not security_manager.has_tom_key(): + raise SupersetException('Wrong key') + + email = request.headers.get('IMPERSONATE') + if email: + user = security_manager.find_user(email=email) + if not user: + raise UserDontExistException('Email to impersonate not found') + g.user = user + + @expose('/sql_json/', methods=['POST', 'GET']) + @log_this + def sql_json(self): + try: + Lyft.authorize() + except UserDontExistException as e: + return json_error_response('{}'.format(e), status=412) + except SupersetException as e: + return json_error_response('{}'.format(e)) + return self.sql_json_call(request) + + +appbuilder.add_view_no_menu(Lyft)