dataflow-core 2.0.2__tar.gz → 2.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dataflow-core might be problematic. Click here for more details.

Files changed (31) hide show
  1. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/PKG-INFO +1 -1
  2. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/authenticator/dataflowairflowauthenticator.py +14 -52
  3. dataflow-core-2.0.5/authenticator/dataflowsupersetauthenticator.py +48 -0
  4. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow/dataflow.py +22 -27
  5. dataflow-core-2.0.5/dataflow/utils/__init__.py +0 -0
  6. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow_core.egg-info/PKG-INFO +1 -1
  7. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow_core.egg-info/requires.txt +1 -0
  8. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/setup.py +3 -2
  9. dataflow-core-2.0.2/authenticator/__init__.py +0 -3
  10. dataflow-core-2.0.2/authenticator/dataflowsupersetauthenticator.py +0 -57
  11. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/README.md +0 -0
  12. {dataflow-core-2.0.2/authenticator/package → dataflow-core-2.0.5/authenticator}/__init__.py +0 -0
  13. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/authenticator/dataflowhubauthenticator.py +0 -0
  14. {dataflow-core-2.0.2/authenticator/package/models → dataflow-core-2.0.5/authenticator/package}/__init__.py +0 -0
  15. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/authenticator/package/configuration.py +0 -0
  16. {dataflow-core-2.0.2/dataflow → dataflow-core-2.0.5/authenticator/package}/models/__init__.py +0 -0
  17. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/authenticator/package/models/database.py +0 -0
  18. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/authenticator/package/models/session.py +0 -0
  19. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/authenticator/package/models/user.py +0 -0
  20. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow/__init__.py +0 -0
  21. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow/configuration.py +0 -0
  22. {dataflow-core-2.0.2/dataflow/utils → dataflow-core-2.0.5/dataflow/models}/__init__.py +0 -0
  23. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow/models/database.py +0 -0
  24. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow/models/session.py +0 -0
  25. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow/models/user.py +0 -0
  26. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow/utils/aws_secrets_manager.py +0 -0
  27. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow_core.egg-info/SOURCES.txt +0 -0
  28. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow_core.egg-info/dependency_links.txt +0 -0
  29. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow_core.egg-info/entry_points.txt +0 -0
  30. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/dataflow_core.egg-info/top_level.txt +0 -0
  31. {dataflow-core-2.0.2 → dataflow-core-2.0.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: dataflow-core
3
- Version: 2.0.2
3
+ Version: 2.0.5
4
4
  Summary: Dataflow core package
5
5
  Home-page: UNKNOWN
6
6
  Author: Dataflow
@@ -1,34 +1,19 @@
1
- from .package.configuration import ConfigurationManager
2
1
  from .package.models.database import DatabaseManager
3
- from .package.models import (
4
- user as m_user,
5
- session as m_session
6
- )
2
+ from dataflow.dataflow import Dataflow
7
3
 
8
4
  from typing import Any, Callable
9
5
  from airflow.www.security import FabAirflowSecurityManagerOverride
6
+ from airflow.configuration import conf
10
7
 
11
8
  class DataflowAirflowAuthenticator(FabAirflowSecurityManagerOverride):
12
9
  def __init__(self, wsgi_app: Callable) -> None:
13
10
  self.wsgi_app = wsgi_app
11
+ self.dataflow = Dataflow()
12
+ self.airflow_database_url = conf.get("database", "sql_alchemy_conn")
14
13
 
15
- # Dataflow database configuration
16
- self.dataflow_config = ConfigurationManager('/dataflow/app/config/dataflow.cfg')
17
- self.dataflow_database_url = self.dataflow_config.get_config_value('database', 'database_url')
18
-
19
- self.dataflow_db_instance = DatabaseManager(self.dataflow_database_url)
20
- self.dataflow_db = next(self.dataflow_db_instance.get_session())
21
-
22
- # Airflow database configuration
23
- self.airflow_config = ConfigurationManager('airflow.cfg')
24
- self.airflow_database_url = self.airflow_config.get_config_value('database', 'sql_alchemy_conn')
25
-
26
14
  self.airflow_db_instance = DatabaseManager(self.airflow_database_url)
27
15
  self.airflow_db = next(self.airflow_db_instance.get_session())
28
16
 
29
- m_user.Base.metadata.create_all(bind=self.dataflow_db_instance.get_engine())
30
- m_session.Base.metadata.create_all(bind=self.dataflow_db_instance.get_engine())
31
-
32
17
  def __call__(self, environ: dict, start_response: Callable) -> Any:
33
18
 
34
19
  path = environ.get('PATH_INFO', '')
@@ -51,39 +36,28 @@ class DataflowAirflowAuthenticator(FabAirflowSecurityManagerOverride):
51
36
  user_session_id = user_session_id.split('=')[1]
52
37
 
53
38
  # Retrieving user details
54
- user_data = self.find_dataflow_user(user_session_id)
39
+ user_data = self.dataflow.auth(user_session_id)
55
40
 
56
41
  if user_data is None:
57
42
  raise Exception("No user found for the dataflow_session id")
58
43
 
59
- user = self.find_user(user_data.user_name)
44
+ user = self.find_user(user_data["user_name"])
60
45
 
61
46
  if not user:
62
- user_role = self.find_role(user_data.role.title())
63
- user = self.add_user(username=user_data.user_name, first_name=self.not_none(user_data.first_name), last_name=self.not_none(user_data.last_name), email=self.not_none(user_data.email), role=user_role, password=self.not_none(user_data.password))
47
+ user_role = self.find_role(user_data["role"].title())
48
+ user = self.add_user(
49
+ username=user_data["user_name"],
50
+ first_name=user_data.get("first_name", ""),
51
+ last_name=user_data.get("last_name", ""),
52
+ email=user_data.get("email", ""),
53
+ role=user_role
54
+ )
64
55
 
65
56
  environ['REMOTE_USER'] = user.username
66
- self.write_user_id(user_data.user_id)
67
57
  return self.wsgi_app(environ, start_response)
68
58
 
69
59
  except Exception as e:
70
60
  return self.wsgi_app(environ, start_response)
71
-
72
- def not_none(self, value):
73
- return value if value is not None else ""
74
-
75
- def find_dataflow_user(self, user_session_id):
76
- """Find user by session_id in dataflow database."""
77
- query = self.dataflow_db.query(m_session.Session_table)
78
- session = query.filter(m_session.Session_table.session_id == user_session_id).first()
79
- if session is None:
80
- return None
81
-
82
- user_data = self.dataflow_db.query(m_user.User).filter(m_user.User.user_id == session.user_id).first()
83
- if user_data is None:
84
- return None
85
-
86
- return user_data
87
61
 
88
62
  def find_user(self, username=None):
89
63
  """Find user by username or email."""
@@ -106,16 +80,4 @@ class DataflowAirflowAuthenticator(FabAirflowSecurityManagerOverride):
106
80
  self.airflow_db.add(user)
107
81
  self.airflow_db.commit()
108
82
  return user
109
-
110
- def write_user_id(self, user_id):
111
- """
112
- Write the given user_id to a file named dataflow_user_id.txt.
113
-
114
- Args:
115
- user_id (str): The user ID to be written to the file.
116
- """
117
- file_name = 'dataflow_user_id.txt'
118
- with open(file_name, 'w') as file:
119
- file.write(str(user_id))
120
-
121
83
 
@@ -0,0 +1,48 @@
1
+ from flask import redirect, request
2
+ from flask_appbuilder.security.views import AuthDBView
3
+ from superset.security import SupersetSecurityManager
4
+ from flask_appbuilder.security.views import expose
5
+ from flask_login import login_user
6
+ from .package.configuration import ConfigurationManager
7
+ from .package.models.database import DatabaseManager
8
+ from .package.models import (
9
+ user as m_user,
10
+ session as m_session
11
+ )
12
+ from dataflow.dataflow import Dataflow
13
+
14
+ class CustomAuthDBView(AuthDBView):
15
+ def __init__(self):
16
+ self.dataflow = Dataflow()
17
+
18
+ @expose('/login/', methods=['GET'])
19
+ def login(self):
20
+ try:
21
+ session_id = request.cookies.get('dataflow_session')
22
+
23
+ user_details = self.dataflow.auth(session_id)
24
+ user = self.appbuilder.sm.find_user(username=user_details['user_name'])
25
+ if user:
26
+ login_user(user, remember=False)
27
+ else:
28
+ user = self.appbuilder.sm.add_user(
29
+ username=user_details['user_name'],
30
+ first_name=user_details.get("first_name", ""),
31
+ last_name=user_details.get("last_name", ""),
32
+ email=user_details.get("email", ""),
33
+ role=self.appbuilder.sm.find_role('Admin'),
34
+ password=""
35
+ )
36
+ if user:
37
+ login_user(user, remember=False)
38
+
39
+ return redirect(self.appbuilder.get_url_for_index)
40
+
41
+ except Exception as e:
42
+ return super().login()
43
+
44
+
45
+ class CustomSecurityManager(SupersetSecurityManager):
46
+ authdbview = CustomAuthDBView
47
+ def __init__(self, appbuilder):
48
+ super(CustomSecurityManager, self).__init__(appbuilder)
@@ -1,45 +1,40 @@
1
- import os
2
- from .configuration import ConfigurationManager
3
- from .models import (
4
- session as m_session,
5
- user as m_user,
6
- )
1
+ import os, requests
7
2
  from .models.database import DatabaseManager
8
3
  from sqlalchemy.inspection import inspect
9
4
  from .utils.aws_secrets_manager import SecretsManagerClient
10
5
  import json
6
+ from authenticator.package.configuration import ConfigurationManager
11
7
 
12
8
 
13
9
  class Dataflow:
14
10
  def __init__(self):
15
- self.dataflow_config = ConfigurationManager('/dataflow/app/config/dataflow.cfg')
16
- self.dataflow_database_url = self.dataflow_config.get_config_value('database', 'database_url')
17
-
18
- self.dataflow_db_instance = DatabaseManager(self.dataflow_database_url)
19
- self.dataflow_db = next(self.dataflow_db_instance.get_session())
20
-
11
+ self.dataflow_config = ConfigurationManager('/dataflow/app/auth_config/dataflow_auth.cfg')
12
+ self.auth_api = self.dataflow_config.get_config_value('auth', 'ui_auth_api')
21
13
  self.secrets_manager = SecretsManagerClient('us-east-1')
22
14
 
23
- m_user.Base.metadata.create_all(bind=self.dataflow_db_instance.get_engine())
24
- m_session.Base.metadata.create_all(bind=self.dataflow_db_instance.get_engine())
25
-
26
15
  def auth(self, session_id: str):
27
- """Find user by session_id in dataflow database."""
16
+ """Retrieve user information from the auth API."""
28
17
  try:
29
- query = self.dataflow_db.query(m_session.Session_table)
30
- session = query.filter(m_session.Session_table.session_id == session_id).first()
31
- if session is None:
32
- return False
33
-
34
- user_data = self.dataflow_db.query(m_user.User).filter(m_user.User.user_id == session.user_id).first()
35
- if user_data is None:
36
- return False
18
+ response = requests.get(
19
+ self.auth_api,
20
+ cookies={"dataflow_session": session_id, "jupyterhub-hub-login": ""}
21
+ )
22
+
23
+ if response.status_code != 200:
24
+ return response.json()
37
25
 
38
- user_dict = {"user_name": user_data.user_name, "name": f"{user_data.first_name} {user_data.last_name}", "email": user_data.email, "role": user_data.role}
26
+ user_data = response.json()
27
+ user_dict = {
28
+ "user_name": user_data["user_name"],
29
+ "first_name": user_data["first_name"],
30
+ "last_name": user_data["last_name"] if user_data.get("last_name") else "",
31
+ "email": user_data["email"],
32
+ "role": user_data["role"]
33
+ }
39
34
  return user_dict
40
-
35
+
41
36
  except Exception as e:
42
- return False
37
+ return e
43
38
 
44
39
  def variable(self, variable_name: str):
45
40
  """Get variable value from secrets manager."""
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.0
2
2
  Name: dataflow-core
3
- Version: 2.0.2
3
+ Version: 2.0.5
4
4
  Summary: Dataflow core package
5
5
  Home-page: UNKNOWN
6
6
  Author: Dataflow
@@ -2,3 +2,4 @@ sqlalchemy
2
2
  boto3
3
3
  psycopg2-binary
4
4
  pymysql
5
+ requests
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="dataflow-core",
5
- version="2.0.2",
5
+ version="2.0.5",
6
6
  packages=find_packages(exclude=["tests", "tests.*"]),
7
7
  include_package_data=True,
8
8
  package_data={},
@@ -10,7 +10,8 @@ setup(
10
10
  'sqlalchemy',
11
11
  'boto3',
12
12
  'psycopg2-binary',
13
- 'pymysql'
13
+ 'pymysql',
14
+ 'requests'
14
15
  ],
15
16
  author="Dataflow",
16
17
  author_email="",
@@ -1,3 +0,0 @@
1
- from .dataflowhubauthenticator import DataflowHubAuthenticator
2
- from .dataflowairflowauthenticator import DataflowAirflowAuthenticator
3
- from .dataflowsupersetauthenticator import DataflowSupersetAuthenticator
@@ -1,57 +0,0 @@
1
- from flask import redirect, request
2
- from flask_appbuilder.security.views import AuthDBView
3
- from superset.security import SupersetSecurityManager
4
- from flask_appbuilder.security.views import expose
5
- from flask_login import login_user
6
- from .package.configuration import ConfigurationManager
7
- from .package.models.database import DatabaseManager
8
- from .package.models import (
9
- user as m_user,
10
- session as m_session
11
- )
12
-
13
- class CustomAuthDBView(AuthDBView):
14
- def __init__(self):
15
- self.dataflow_config = ConfigurationManager('/dataflow/app/config/dataflow.cfg')
16
- self.dataflow_database_url = self.dataflow_config.get_config_value('database', 'database_url')
17
- self.dataflow_db_instance = DatabaseManager(self.dataflow_database_url)
18
- self.dataflow_db = next(self.dataflow_db_instance.get_session())
19
- m_user.Base.metadata.create_all(bind=self.dataflow_db_instance.get_engine())
20
- m_session.Base.metadata.create_all(bind=self.dataflow_db_instance.get_engine())
21
-
22
- def _get_user_id_from_session(self, session_id):
23
- query = self.dataflow_db.query(m_session.Session_table).filter(m_session.Session_table.session_id == session_id).first()
24
- return query.user_id if query!=None else None
25
-
26
- def _get_user_details_from_user_table(self, user_id):
27
- user_details = self.dataflow_db.query(m_user.User).filter(m_user.User.user_id == user_id).first()
28
- return user_details if user_details!=None else None
29
-
30
- def not_none(self, value):
31
- return value if value is not None else ""
32
-
33
- @expose('/login/', methods=['GET'])
34
- def login(self):
35
- try:
36
- session_id = request.cookies.get('dataflow_session')
37
-
38
- user_id = self._get_user_id_from_session(session_id)
39
- user_details = self._get_user_details_from_user_table(user_id)
40
- user = self.appbuilder.sm.find_user(username=user_details.user_name)
41
- if user:
42
- login_user(user, remember=False)
43
- else:
44
- user = self.appbuilder.sm.add_user(username=self.not_none(user_details.user_name), first_name=self.not_none(user_details.first_name), last_name=self.not_none(user_details.last_name), email=self.not_none(user_details.email), role=self.appbuilder.sm.find_role('Admin'), password=self.not_none(user_details.password))
45
- if user:
46
- login_user(user, remember=False)
47
-
48
- return redirect(self.appbuilder.get_url_for_index)
49
-
50
- except Exception as e:
51
- return super().login()
52
-
53
-
54
- class CustomSecurityManager(SupersetSecurityManager):
55
- authdbview = CustomAuthDBView
56
- def __init__(self, appbuilder):
57
- super(CustomSecurityManager, self).__init__(appbuilder)
File without changes
File without changes