apache-airflow-providers-fab 2.4.2__py3-none-any.whl → 2.4.3rc1__py3-none-any.whl

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 apache-airflow-providers-fab might be problematic. Click here for more details.

@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "2.4.2"
32
+ __version__ = "2.4.3"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "3.0.2"
@@ -108,6 +108,14 @@ ARG_INCLUDE_DAGS = Arg(
108
108
  ("--include-dags",), help="If passed, DAG specific permissions will also be synced.", action="store_true"
109
109
  )
110
110
 
111
+ # permissions cleanup
112
+ ARG_DRY_RUN = Arg(
113
+ ("--dry-run",), help="Show what would be cleaned up without making any changes.", action="store_true"
114
+ )
115
+ ARG_DAG_ID_OPTIONAL = Arg(
116
+ ("-d", "--dag-id"), help="Optional: Clean up permissions for specific DAG ID only", type=str
117
+ )
118
+
111
119
  ################
112
120
  # # COMMANDS # #
113
121
  ################
@@ -253,6 +261,30 @@ SYNC_PERM_COMMAND = ActionCommand(
253
261
  args=(ARG_INCLUDE_DAGS, ARG_VERBOSE),
254
262
  )
255
263
 
264
+ PERMISSIONS_CLEANUP_COMMAND = ActionCommand(
265
+ name="permissions-cleanup",
266
+ help="Clean up DAG permissions in Flask-AppBuilder tables",
267
+ description=(
268
+ "Clean up DAG-specific permissions. By default, cleans up orphaned permissions "
269
+ "for deleted DAGs. Use --dag-id to clean up permissions for a specific DAG."
270
+ ),
271
+ func=lazy_load_command(
272
+ "airflow.providers.fab.auth_manager.cli_commands.permissions_command.permissions_cleanup"
273
+ ),
274
+ args=(ARG_DAG_ID_OPTIONAL, ARG_DRY_RUN, ARG_YES, ARG_VERBOSE),
275
+ epilog=(
276
+ "examples:\n"
277
+ "To see what orphaned permissions would be cleaned up:\n"
278
+ " $ airflow fab-auth-manager permissions-cleanup --dry-run\n"
279
+ "To clean up all orphaned permissions:\n"
280
+ " $ airflow fab-auth-manager permissions-cleanup\n"
281
+ "To clean up permissions for specific DAG:\n"
282
+ " $ airflow fab-auth-manager permissions-cleanup --dag-id my_dag\n"
283
+ "To clean up without confirmation:\n"
284
+ " $ airflow fab-auth-manager permissions-cleanup --yes"
285
+ ),
286
+ )
287
+
256
288
  DB_COMMANDS = (
257
289
  ActionCommand(
258
290
  name="migrate",
@@ -0,0 +1,196 @@
1
+ #
2
+ # Licensed to the Apache Software Foundation (ASF) under one
3
+ # or more contributor license agreements. See the NOTICE file
4
+ # distributed with this work for additional information
5
+ # regarding copyright ownership. The ASF licenses this file
6
+ # to you under the Apache License, Version 2.0 (the
7
+ # "License"); you may not use this file except in compliance
8
+ # with the License. You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing,
13
+ # software distributed under the License is distributed on an
14
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ # KIND, either express or implied. See the License for the
16
+ # specific language governing permissions and limitations
17
+ # under the License.
18
+ """Permissions cleanup command."""
19
+
20
+ from __future__ import annotations
21
+
22
+ import logging
23
+ from typing import TYPE_CHECKING
24
+
25
+ from airflow.utils import cli as cli_utils
26
+ from airflow.utils.providers_configuration_loader import providers_configuration_loaded
27
+ from airflow.utils.session import NEW_SESSION, provide_session
28
+ from airflow.utils.strings import to_boolean
29
+
30
+ if TYPE_CHECKING:
31
+ from sqlalchemy.orm import Session
32
+
33
+ log = logging.getLogger(__name__)
34
+
35
+
36
+ @provide_session
37
+ def cleanup_dag_permissions(dag_id: str, session: Session = NEW_SESSION) -> None:
38
+ """
39
+ Clean up DAG-specific permissions from Flask-AppBuilder tables.
40
+
41
+ When a DAG is deleted, we need to clean up the corresponding permissions
42
+ to prevent orphaned entries in the ab_view_menu table.
43
+
44
+ This addresses issue #50905: Deleted DAGs not removed from ab_view_menu table
45
+ and show up in permissions.
46
+
47
+ :param dag_id: Specific DAG ID to clean up.
48
+ :param session: Database session.
49
+ """
50
+ from sqlalchemy import delete, select
51
+
52
+ from airflow.providers.fab.auth_manager.models import Permission, Resource, assoc_permission_role
53
+ from airflow.security.permissions import RESOURCE_DAG_PREFIX, RESOURCE_DAG_RUN, RESOURCE_DETAILS_MAP
54
+
55
+ # Clean up specific DAG permissions
56
+ dag_resources = session.scalars(
57
+ select(Resource).filter(
58
+ Resource.name.in_(
59
+ [
60
+ f"{RESOURCE_DAG_PREFIX}{dag_id}", # DAG:dag_id
61
+ f"{RESOURCE_DETAILS_MAP[RESOURCE_DAG_RUN]['prefix']}{dag_id}", # DAG_RUN:dag_id
62
+ ]
63
+ )
64
+ )
65
+ ).all()
66
+ log.info("Cleaning up DAG-specific permissions for dag_id: %s", dag_id)
67
+
68
+ if not dag_resources:
69
+ return
70
+
71
+ dag_resource_ids = [resource.id for resource in dag_resources]
72
+
73
+ # Find all permissions associated with these resources
74
+ dag_permissions = session.scalars(
75
+ select(Permission).filter(Permission.resource_id.in_(dag_resource_ids))
76
+ ).all()
77
+
78
+ if not dag_permissions:
79
+ # Delete resources even if no permissions exist
80
+ session.execute(delete(Resource).where(Resource.id.in_(dag_resource_ids)))
81
+ return
82
+
83
+ dag_permission_ids = [permission.id for permission in dag_permissions]
84
+
85
+ # Delete permission-role associations first (foreign key constraint)
86
+ session.execute(
87
+ delete(assoc_permission_role).where(
88
+ assoc_permission_role.c.permission_view_id.in_(dag_permission_ids)
89
+ )
90
+ )
91
+
92
+ # Delete permissions
93
+ session.execute(delete(Permission).where(Permission.resource_id.in_(dag_resource_ids)))
94
+
95
+ # Delete resources (ab_view_menu entries)
96
+ session.execute(delete(Resource).where(Resource.id.in_(dag_resource_ids)))
97
+
98
+ log.info("Cleaned up %d DAG-specific permissions", len(dag_permissions))
99
+
100
+
101
+ @cli_utils.action_cli
102
+ @providers_configuration_loaded
103
+ def permissions_cleanup(args):
104
+ """Clean up DAG permissions in Flask-AppBuilder tables."""
105
+ from sqlalchemy import select
106
+
107
+ from airflow.models import DagModel
108
+ from airflow.providers.fab.auth_manager.cli_commands.utils import get_application_builder
109
+ from airflow.providers.fab.auth_manager.models import Resource
110
+ from airflow.security.permissions import (
111
+ RESOURCE_DAG_PREFIX,
112
+ RESOURCE_DAG_RUN,
113
+ RESOURCE_DETAILS_MAP,
114
+ )
115
+ from airflow.utils.session import create_session
116
+
117
+ with get_application_builder() as _:
118
+ with create_session() as session:
119
+ # Get all existing DAG IDs from DagModel
120
+ existing_dag_ids = {dag.dag_id for dag in session.scalars(select(DagModel)).all()}
121
+
122
+ # Get all DAG-related resources from FAB tables
123
+ dag_resources = session.scalars(
124
+ select(Resource).filter(
125
+ Resource.name.like(f"{RESOURCE_DAG_PREFIX}%")
126
+ | Resource.name.like(f"{RESOURCE_DETAILS_MAP[RESOURCE_DAG_RUN]['prefix']}%")
127
+ )
128
+ ).all()
129
+
130
+ orphaned_resources = []
131
+ orphaned_dag_ids = set()
132
+
133
+ for resource in dag_resources:
134
+ # Extract DAG ID from resource name
135
+ dag_id = None
136
+ if resource.name.startswith(RESOURCE_DAG_PREFIX):
137
+ dag_id = resource.name[len(RESOURCE_DAG_PREFIX) :]
138
+ elif resource.name.startswith(RESOURCE_DETAILS_MAP[RESOURCE_DAG_RUN]["prefix"]):
139
+ dag_id = resource.name[len(RESOURCE_DETAILS_MAP[RESOURCE_DAG_RUN]["prefix"]) :]
140
+
141
+ # Check if this DAG ID still exists
142
+ if dag_id and dag_id not in existing_dag_ids:
143
+ orphaned_resources.append(resource)
144
+ orphaned_dag_ids.add(dag_id)
145
+
146
+ # Filter by specific DAG ID if provided
147
+ if args.dag_id:
148
+ if args.dag_id in orphaned_dag_ids:
149
+ orphaned_dag_ids = {args.dag_id}
150
+ print(f"Filtering to clean up permissions for DAG: {args.dag_id}")
151
+ else:
152
+ print(
153
+ f"DAG '{args.dag_id}' not found in orphaned permissions or still exists in database."
154
+ )
155
+ return
156
+
157
+ if not orphaned_dag_ids:
158
+ if args.dag_id:
159
+ print(f"No orphaned permissions found for DAG: {args.dag_id}")
160
+ else:
161
+ print("No orphaned DAG permissions found.")
162
+ return
163
+
164
+ print(f"Found orphaned permissions for {len(orphaned_dag_ids)} deleted DAG(s):")
165
+ for dag_id in sorted(orphaned_dag_ids):
166
+ print(f" - {dag_id}")
167
+
168
+ if args.dry_run:
169
+ print("\nDry run mode: No changes will be made.")
170
+ print(f"Would clean up permissions for {len(orphaned_dag_ids)} orphaned DAG(s).")
171
+ return
172
+
173
+ # Perform cleanup if not in dry run mode
174
+ if not args.yes:
175
+ action = (
176
+ f"clean up permissions for {len(orphaned_dag_ids)} DAG(s)"
177
+ if not args.dag_id
178
+ else f"clean up permissions for DAG '{args.dag_id}'"
179
+ )
180
+ confirm = input(f"\nDo you want to {action}? [y/N]: ")
181
+ if not to_boolean(confirm):
182
+ print("Cleanup cancelled.")
183
+ return
184
+
185
+ # Perform the actual cleanup
186
+ cleanup_count = 0
187
+ for dag_id in orphaned_dag_ids:
188
+ try:
189
+ cleanup_dag_permissions(dag_id, session)
190
+ cleanup_count += 1
191
+ if args.verbose:
192
+ print(f"Cleaned up permissions for DAG: {dag_id}")
193
+ except Exception as e:
194
+ print(f"Failed to clean up permissions for DAG {dag_id}: {e}")
195
+
196
+ print(f"\nSuccessfully cleaned up permissions for {cleanup_count} DAG(s).")
@@ -60,6 +60,7 @@ from airflow.exceptions import AirflowConfigException, AirflowException
60
60
  from airflow.models import DagModel
61
61
  from airflow.providers.fab.auth_manager.cli_commands.definition import (
62
62
  DB_COMMANDS,
63
+ PERMISSIONS_CLEANUP_COMMAND,
63
64
  ROLES_COMMANDS,
64
65
  SYNC_PERM_COMMAND,
65
66
  USERS_COMMANDS,
@@ -211,6 +212,7 @@ class FabAuthManager(BaseAuthManager[User]):
211
212
  subcommands=ROLES_COMMANDS,
212
213
  ),
213
214
  SYNC_PERM_COMMAND, # not in a command group
215
+ PERMISSIONS_CLEANUP_COMMAND, # single command for permissions cleanup
214
216
  ]
215
217
  # If Airflow version is 3.0.0 or higher, add the fab-db command group
216
218
  if packaging.version.parse(
@@ -112,6 +112,7 @@ if TYPE_CHECKING:
112
112
  RESOURCE_ASSET_ALIAS,
113
113
  )
114
114
  from airflow.sdk import DAG
115
+ from airflow.serialization.serialized_objects import SerializedDAG
115
116
  else:
116
117
  from airflow.providers.common.compat.security.permissions import (
117
118
  RESOURCE_ASSET,
@@ -122,13 +123,13 @@ if AIRFLOW_V_3_1_PLUS:
122
123
  from airflow.models.dagbag import DBDagBag
123
124
  from airflow.utils.session import create_session
124
125
 
125
- def _iter_dags() -> Iterable[DAG]:
126
+ def _iter_dags() -> Iterable[DAG | SerializedDAG]:
126
127
  with create_session() as session:
127
128
  yield from DBDagBag().iter_all_latest_version_dags(session=session)
128
129
  else:
129
130
  from airflow.models.dagbag import DagBag
130
131
 
131
- def _iter_dags() -> Iterable[DAG]:
132
+ def _iter_dags() -> Iterable[DAG | SerializedDAG]:
132
133
  dagbag = DagBag(read_dags_from_db=True) # type: ignore[call-arg]
133
134
  dagbag.collect_dags_from_db() # type: ignore[attr-defined]
134
135
  return dagbag.dags.values()
@@ -13,8 +13,8 @@
13
13
  "moment-timezone": "^0.6.0"
14
14
  },
15
15
  "devDependencies": {
16
- "@babel/core": "^7.28.3",
17
- "@babel/eslint-parser": "^7.28.0",
16
+ "@babel/core": "^7.28.4",
17
+ "@babel/eslint-parser": "^7.28.4",
18
18
  "@babel/plugin-transform-runtime": "^7.28.3",
19
19
  "@babel/preset-env": "^7.28.3",
20
20
  "babel-loader": "^10.0.0",
@@ -22,7 +22,7 @@
22
22
  "copy-webpack-plugin": "^13.0.1",
23
23
  "css-loader": "7.1.2",
24
24
  "css-minimizer-webpack-plugin": "^7.0.2",
25
- "eslint": "^9.34.0",
25
+ "eslint": "^9.35.0",
26
26
  "eslint-config-prettier": "^10.1.8",
27
27
  "eslint-plugin-html": "^8.1.3",
28
28
  "eslint-plugin-import": "^2.32.0",
@@ -33,7 +33,7 @@
33
33
  "moment": "^2.29.4",
34
34
  "moment-locales-webpack-plugin": "^1.2.0",
35
35
  "prettier": "^3.6.2",
36
- "stylelint": "^16.23.1",
36
+ "stylelint": "^16.24.0",
37
37
  "terser-webpack-plugin": "<6.0.0",
38
38
  "url-loader": "4.1.1",
39
39
  "webpack": "^5.101.3",
@@ -42,19 +42,6 @@
42
42
  "webpack-manifest-plugin": "^5.0.1"
43
43
  }
44
44
  },
45
- "node_modules/@ampproject/remapping": {
46
- "version": "2.3.0",
47
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
48
- "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
49
- "dev": true,
50
- "dependencies": {
51
- "@jridgewell/gen-mapping": "^0.3.5",
52
- "@jridgewell/trace-mapping": "^0.3.24"
53
- },
54
- "engines": {
55
- "node": ">=6.0.0"
56
- }
57
- },
58
45
  "node_modules/@babel/code-frame": {
59
46
  "version": "7.27.1",
60
47
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -80,22 +67,22 @@
80
67
  }
81
68
  },
82
69
  "node_modules/@babel/core": {
83
- "version": "7.28.3",
84
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz",
85
- "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==",
70
+ "version": "7.28.4",
71
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
72
+ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
86
73
  "dev": true,
87
74
  "license": "MIT",
88
75
  "dependencies": {
89
- "@ampproject/remapping": "^2.2.0",
90
76
  "@babel/code-frame": "^7.27.1",
91
77
  "@babel/generator": "^7.28.3",
92
78
  "@babel/helper-compilation-targets": "^7.27.2",
93
79
  "@babel/helper-module-transforms": "^7.28.3",
94
- "@babel/helpers": "^7.28.3",
95
- "@babel/parser": "^7.28.3",
80
+ "@babel/helpers": "^7.28.4",
81
+ "@babel/parser": "^7.28.4",
96
82
  "@babel/template": "^7.27.2",
97
- "@babel/traverse": "^7.28.3",
98
- "@babel/types": "^7.28.2",
83
+ "@babel/traverse": "^7.28.4",
84
+ "@babel/types": "^7.28.4",
85
+ "@jridgewell/remapping": "^2.3.5",
99
86
  "convert-source-map": "^2.0.0",
100
87
  "debug": "^4.1.0",
101
88
  "gensync": "^1.0.0-beta.2",
@@ -111,10 +98,11 @@
111
98
  }
112
99
  },
113
100
  "node_modules/@babel/eslint-parser": {
114
- "version": "7.28.0",
115
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz",
116
- "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==",
101
+ "version": "7.28.4",
102
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz",
103
+ "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==",
117
104
  "dev": true,
105
+ "license": "MIT",
118
106
  "dependencies": {
119
107
  "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
120
108
  "eslint-visitor-keys": "^2.1.0",
@@ -404,27 +392,27 @@
404
392
  }
405
393
  },
406
394
  "node_modules/@babel/helpers": {
407
- "version": "7.28.3",
408
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz",
409
- "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==",
395
+ "version": "7.28.4",
396
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
397
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
410
398
  "dev": true,
411
399
  "license": "MIT",
412
400
  "dependencies": {
413
401
  "@babel/template": "^7.27.2",
414
- "@babel/types": "^7.28.2"
402
+ "@babel/types": "^7.28.4"
415
403
  },
416
404
  "engines": {
417
405
  "node": ">=6.9.0"
418
406
  }
419
407
  },
420
408
  "node_modules/@babel/parser": {
421
- "version": "7.28.3",
422
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
423
- "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
409
+ "version": "7.28.4",
410
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
411
+ "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
424
412
  "dev": true,
425
413
  "license": "MIT",
426
414
  "dependencies": {
427
- "@babel/types": "^7.28.2"
415
+ "@babel/types": "^7.28.4"
428
416
  },
429
417
  "bin": {
430
418
  "parser": "bin/babel-parser.js"
@@ -1563,18 +1551,18 @@
1563
1551
  }
1564
1552
  },
1565
1553
  "node_modules/@babel/traverse": {
1566
- "version": "7.28.3",
1567
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz",
1568
- "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==",
1554
+ "version": "7.28.4",
1555
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
1556
+ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
1569
1557
  "dev": true,
1570
1558
  "license": "MIT",
1571
1559
  "dependencies": {
1572
1560
  "@babel/code-frame": "^7.27.1",
1573
1561
  "@babel/generator": "^7.28.3",
1574
1562
  "@babel/helper-globals": "^7.28.0",
1575
- "@babel/parser": "^7.28.3",
1563
+ "@babel/parser": "^7.28.4",
1576
1564
  "@babel/template": "^7.27.2",
1577
- "@babel/types": "^7.28.2",
1565
+ "@babel/types": "^7.28.4",
1578
1566
  "debug": "^4.3.1"
1579
1567
  },
1580
1568
  "engines": {
@@ -1582,9 +1570,9 @@
1582
1570
  }
1583
1571
  },
1584
1572
  "node_modules/@babel/types": {
1585
- "version": "7.28.2",
1586
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
1587
- "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
1573
+ "version": "7.28.4",
1574
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
1575
+ "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
1588
1576
  "dev": true,
1589
1577
  "license": "MIT",
1590
1578
  "dependencies": {
@@ -1684,10 +1672,11 @@
1684
1672
  }
1685
1673
  },
1686
1674
  "node_modules/@eslint-community/eslint-utils": {
1687
- "version": "4.4.1",
1688
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
1689
- "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
1675
+ "version": "4.8.0",
1676
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz",
1677
+ "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==",
1690
1678
  "dev": true,
1679
+ "license": "MIT",
1691
1680
  "dependencies": {
1692
1681
  "eslint-visitor-keys": "^3.4.3"
1693
1682
  },
@@ -1706,6 +1695,7 @@
1706
1695
  "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
1707
1696
  "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
1708
1697
  "dev": true,
1698
+ "license": "Apache-2.0",
1709
1699
  "engines": {
1710
1700
  "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1711
1701
  },
@@ -1817,9 +1807,9 @@
1817
1807
  }
1818
1808
  },
1819
1809
  "node_modules/@eslint/js": {
1820
- "version": "9.34.0",
1821
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz",
1822
- "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==",
1810
+ "version": "9.35.0",
1811
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
1812
+ "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
1823
1813
  "dev": true,
1824
1814
  "license": "MIT",
1825
1815
  "engines": {
@@ -1957,6 +1947,17 @@
1957
1947
  "@jridgewell/trace-mapping": "^0.3.24"
1958
1948
  }
1959
1949
  },
1950
+ "node_modules/@jridgewell/remapping": {
1951
+ "version": "2.3.5",
1952
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
1953
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
1954
+ "dev": true,
1955
+ "license": "MIT",
1956
+ "dependencies": {
1957
+ "@jridgewell/gen-mapping": "^0.3.5",
1958
+ "@jridgewell/trace-mapping": "^0.3.24"
1959
+ }
1960
+ },
1960
1961
  "node_modules/@jridgewell/resolve-uri": {
1961
1962
  "version": "3.1.2",
1962
1963
  "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
@@ -1993,9 +1994,9 @@
1993
1994
  }
1994
1995
  },
1995
1996
  "node_modules/@keyv/serialize": {
1996
- "version": "1.1.0",
1997
- "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz",
1998
- "integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==",
1997
+ "version": "1.1.1",
1998
+ "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz",
1999
+ "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==",
1999
2000
  "dev": true,
2000
2001
  "license": "MIT"
2001
2002
  },
@@ -2872,24 +2873,24 @@
2872
2873
  "dev": true
2873
2874
  },
2874
2875
  "node_modules/cacheable": {
2875
- "version": "1.10.3",
2876
- "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.3.tgz",
2877
- "integrity": "sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==",
2876
+ "version": "1.10.4",
2877
+ "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.4.tgz",
2878
+ "integrity": "sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==",
2878
2879
  "dev": true,
2879
2880
  "license": "MIT",
2880
2881
  "dependencies": {
2881
- "hookified": "^1.10.0",
2882
- "keyv": "^5.4.0"
2882
+ "hookified": "^1.11.0",
2883
+ "keyv": "^5.5.0"
2883
2884
  }
2884
2885
  },
2885
2886
  "node_modules/cacheable/node_modules/keyv": {
2886
- "version": "5.4.0",
2887
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.4.0.tgz",
2888
- "integrity": "sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==",
2887
+ "version": "5.5.1",
2888
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.1.tgz",
2889
+ "integrity": "sha512-eF3cHZ40bVsjdlRi/RvKAuB0+B61Q1xWvohnrJrnaQslM3h1n79IV+mc9EGag4nrA9ZOlNyr3TUzW5c8uy8vNA==",
2889
2890
  "dev": true,
2890
2891
  "license": "MIT",
2891
2892
  "dependencies": {
2892
- "@keyv/serialize": "^1.1.0"
2893
+ "@keyv/serialize": "^1.1.1"
2893
2894
  }
2894
2895
  },
2895
2896
  "node_modules/call-bind": {
@@ -3997,19 +3998,19 @@
3997
3998
  }
3998
3999
  },
3999
4000
  "node_modules/eslint": {
4000
- "version": "9.34.0",
4001
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz",
4002
- "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
4001
+ "version": "9.35.0",
4002
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
4003
+ "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==",
4003
4004
  "dev": true,
4004
4005
  "license": "MIT",
4005
4006
  "dependencies": {
4006
- "@eslint-community/eslint-utils": "^4.2.0",
4007
+ "@eslint-community/eslint-utils": "^4.8.0",
4007
4008
  "@eslint-community/regexpp": "^4.12.1",
4008
4009
  "@eslint/config-array": "^0.21.0",
4009
4010
  "@eslint/config-helpers": "^0.3.1",
4010
4011
  "@eslint/core": "^0.15.2",
4011
4012
  "@eslint/eslintrc": "^3.3.1",
4012
- "@eslint/js": "9.34.0",
4013
+ "@eslint/js": "9.35.0",
4013
4014
  "@eslint/plugin-kit": "^0.3.5",
4014
4015
  "@humanfs/node": "^0.16.6",
4015
4016
  "@humanwhocodes/module-importer": "^1.0.1",
@@ -4652,15 +4653,15 @@
4652
4653
  }
4653
4654
  },
4654
4655
  "node_modules/flat-cache": {
4655
- "version": "6.1.12",
4656
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.12.tgz",
4657
- "integrity": "sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==",
4656
+ "version": "6.1.13",
4657
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.13.tgz",
4658
+ "integrity": "sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==",
4658
4659
  "dev": true,
4659
4660
  "license": "MIT",
4660
4661
  "dependencies": {
4661
- "cacheable": "^1.10.3",
4662
+ "cacheable": "^1.10.4",
4662
4663
  "flatted": "^3.3.3",
4663
- "hookified": "^1.10.0"
4664
+ "hookified": "^1.11.0"
4664
4665
  }
4665
4666
  },
4666
4667
  "node_modules/flatted": {
@@ -5016,9 +5017,9 @@
5016
5017
  }
5017
5018
  },
5018
5019
  "node_modules/hookified": {
5019
- "version": "1.11.0",
5020
- "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.11.0.tgz",
5021
- "integrity": "sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==",
5020
+ "version": "1.12.0",
5021
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.0.tgz",
5022
+ "integrity": "sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==",
5022
5023
  "dev": true,
5023
5024
  "license": "MIT"
5024
5025
  },
@@ -7932,9 +7933,9 @@
7932
7933
  }
7933
7934
  },
7934
7935
  "node_modules/stylelint": {
7935
- "version": "16.23.1",
7936
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz",
7937
- "integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==",
7936
+ "version": "16.24.0",
7937
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.24.0.tgz",
7938
+ "integrity": "sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==",
7938
7939
  "dev": true,
7939
7940
  "funding": [
7940
7941
  {
@@ -7961,7 +7962,7 @@
7961
7962
  "debug": "^4.4.1",
7962
7963
  "fast-glob": "^3.3.3",
7963
7964
  "fastest-levenshtein": "^1.0.16",
7964
- "file-entry-cache": "^10.1.3",
7965
+ "file-entry-cache": "^10.1.4",
7965
7966
  "global-modules": "^2.0.0",
7966
7967
  "globby": "^11.1.0",
7967
7968
  "globjoin": "^0.1.4",
@@ -8038,13 +8039,13 @@
8038
8039
  }
8039
8040
  },
8040
8041
  "node_modules/stylelint/node_modules/file-entry-cache": {
8041
- "version": "10.1.3",
8042
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.3.tgz",
8043
- "integrity": "sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==",
8042
+ "version": "10.1.4",
8043
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz",
8044
+ "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==",
8044
8045
  "dev": true,
8045
8046
  "license": "MIT",
8046
8047
  "dependencies": {
8047
- "flat-cache": "^6.1.12"
8048
+ "flat-cache": "^6.1.13"
8048
8049
  }
8049
8050
  },
8050
8051
  "node_modules/stylelint/node_modules/ignore": {
@@ -39,8 +39,8 @@
39
39
  ]
40
40
  },
41
41
  "devDependencies": {
42
- "@babel/core": "^7.28.3",
43
- "@babel/eslint-parser": "^7.28.0",
42
+ "@babel/core": "^7.28.4",
43
+ "@babel/eslint-parser": "^7.28.4",
44
44
  "@babel/plugin-transform-runtime": "^7.28.3",
45
45
  "@babel/preset-env": "^7.28.3",
46
46
  "babel-loader": "^10.0.0",
@@ -48,7 +48,7 @@
48
48
  "copy-webpack-plugin": "^13.0.1",
49
49
  "css-loader": "7.1.2",
50
50
  "css-minimizer-webpack-plugin": "^7.0.2",
51
- "eslint": "^9.34.0",
51
+ "eslint": "^9.35.0",
52
52
  "eslint-config-prettier": "^10.1.8",
53
53
  "eslint-plugin-html": "^8.1.3",
54
54
  "eslint-plugin-import": "^2.32.0",
@@ -59,7 +59,7 @@
59
59
  "moment": "^2.29.4",
60
60
  "moment-locales-webpack-plugin": "^1.2.0",
61
61
  "prettier": "^3.6.2",
62
- "stylelint": "^16.23.1",
62
+ "stylelint": "^16.24.0",
63
63
  "terser-webpack-plugin": "<6.0.0",
64
64
  "url-loader": "4.1.1",
65
65
  "webpack": "^5.101.3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-fab
3
- Version: 2.4.2
3
+ Version: 2.4.3rc1
4
4
  Summary: Provider package apache-airflow-providers-fab for Apache Airflow
5
5
  Keywords: airflow-provider,fab,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -21,8 +21,8 @@ Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Topic :: System :: Monitoring
22
22
  License-File: 3rd-party-licenses/LICENSES-ui.txt
23
23
  License-File: NOTICE
24
- Requires-Dist: apache-airflow>=3.0.2
25
- Requires-Dist: apache-airflow-providers-common-compat>=1.2.1
24
+ Requires-Dist: apache-airflow>=3.0.2rc1
25
+ Requires-Dist: apache-airflow-providers-common-compat>=1.2.1rc1
26
26
  Requires-Dist: blinker>=1.6.2; python_version < '3.13'
27
27
  Requires-Dist: flask>=2.2.1,<2.3; python_version < '3.13'
28
28
  Requires-Dist: flask-appbuilder==4.6.3; python_version < '3.13'
@@ -33,10 +33,11 @@ Requires-Dist: connexion[flask]>=2.14.2,<3.0; python_version < '3.13'
33
33
  Requires-Dist: jmespath>=0.7.0; python_version < '3.13'
34
34
  Requires-Dist: werkzeug>=2.2,<4; python_version < '3.13'
35
35
  Requires-Dist: wtforms>=3.0,<4; python_version < '3.13'
36
+ Requires-Dist: flask_limiter>3,<4,!=3.13
36
37
  Requires-Dist: kerberos>=1.3.0 ; extra == "kerberos" and ( python_version < '3.13')
37
38
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
38
- Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-fab/2.4.2/changelog.html
39
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-fab/2.4.2
39
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/2.4.3/changelog.html
40
+ Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/2.4.3
40
41
  Project-URL: Mastodon, https://fosstodon.org/@airflow
41
42
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
42
43
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -68,7 +69,7 @@ Provides-Extra: kerberos
68
69
 
69
70
  Package ``apache-airflow-providers-fab``
70
71
 
71
- Release: ``2.4.2``
72
+ Release: ``2.4.3``
72
73
 
73
74
 
74
75
  `Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
@@ -81,7 +82,7 @@ This is a provider package for ``fab`` provider. All classes for this provider p
81
82
  are in ``airflow.providers.fab`` python package.
82
83
 
83
84
  You can find package information and changelog for the provider
84
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.4.2/>`_.
85
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.4.3/>`_.
85
86
 
86
87
  Installation
87
88
  ------------
@@ -110,6 +111,7 @@ PIP package Version required
110
111
  ``jmespath`` ``>=0.7.0; python_version < "3.13"``
111
112
  ``werkzeug`` ``>=2.2,<4; python_version < "3.13"``
112
113
  ``wtforms`` ``>=3.0,<4; python_version < "3.13"``
114
+ ``flask_limiter`` ``>3,!=3.13,<4``
113
115
  ========================================== ==========================================
114
116
 
115
117
  Cross provider package dependencies
@@ -131,6 +133,15 @@ Dependent package
131
133
  `apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
132
134
  ================================================================================================================== =================
133
135
 
136
+ Optional dependencies
137
+ ----------------------
138
+
139
+ ============ ============================================
140
+ Extra Dependencies
141
+ ============ ============================================
142
+ ``kerberos`` ``kerberos>=1.3.0; python_version < '3.13'``
143
+ ============ ============================================
144
+
134
145
  The changelog for the provider package can be found in the
135
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.4.2/changelog.html>`_.
146
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/2.4.3/changelog.html>`_.
136
147
 
@@ -1,10 +1,10 @@
1
1
  airflow/providers/fab/LICENSE,sha256=gXPVwptPlW1TJ4HSuG5OMPg-a3h43OGMkZRR1rpwfJA,10850
2
- airflow/providers/fab/__init__.py,sha256=K3aOcXI6f_owLPSZzr6dZlgSpgElEBmQUVyyesmzTVc,1490
2
+ airflow/providers/fab/__init__.py,sha256=MlmpqZ7-xO_XC45_TnMR3YXyeUJYe8fxsxOHN0AN8is,1490
3
3
  airflow/providers/fab/alembic.ini,sha256=_1SvObfjMAkuD7DN5VR2S6Rd7_F81pORZT-w7GJldIA,4461
4
4
  airflow/providers/fab/get_provider_info.py,sha256=Pf7JwSshIaIanP6bFifJTPNhNexWZNiv4h4usLMfZR4,10635
5
5
  airflow/providers/fab/version_compat.py,sha256=1qJhqKH0Bi4HG-pJW6npWYkLx76DBuXP-6A-cgGe77Y,1536
6
6
  airflow/providers/fab/auth_manager/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
7
- airflow/providers/fab/auth_manager/fab_auth_manager.py,sha256=UsV--RM1e3g5voWdoc2j2Pw-YMoGibHzdj0GJNACUUA,25664
7
+ airflow/providers/fab/auth_manager/fab_auth_manager.py,sha256=i0ZTA_xrwJyxCpaTTK8tzngS4v8-x6o_C-ZXgscJkwY,25780
8
8
  airflow/providers/fab/auth_manager/api/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
9
9
  airflow/providers/fab/auth_manager/api/auth/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
10
10
  airflow/providers/fab/auth_manager/api/auth/backend/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
@@ -25,7 +25,8 @@ airflow/providers/fab/auth_manager/api_fastapi/services/__init__.py,sha256=9hdXH
25
25
  airflow/providers/fab/auth_manager/api_fastapi/services/login.py,sha256=rJtO6LDdXlFkABQ2f-OHbee2hnYWyJIOc_VG-g67flo,2627
26
26
  airflow/providers/fab/auth_manager/cli_commands/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
27
27
  airflow/providers/fab/auth_manager/cli_commands/db_command.py,sha256=SeNg8giLDUX5aniF2XFM7txVQ6N2dDV6BRZnV-UzWX8,2151
28
- airflow/providers/fab/auth_manager/cli_commands/definition.py,sha256=XIAPqoHwkFHshfbj6yGIs7xUrR-uSE1F7V71n44PttA,11483
28
+ airflow/providers/fab/auth_manager/cli_commands/definition.py,sha256=qKw6V7htxQPG4DmoRnXtJlm2oK9ec5h5o-cwcErhNkk,12842
29
+ airflow/providers/fab/auth_manager/cli_commands/permissions_command.py,sha256=ITn62u5rW2clf_PwupSs4joAlbkAk6w-HHgPHeSgQWo,7715
29
30
  airflow/providers/fab/auth_manager/cli_commands/role_command.py,sha256=4w1tHTR5gBbsymeqGIJ4Rs8CmGdw0l49y58pfI0DB_s,9098
30
31
  airflow/providers/fab/auth_manager/cli_commands/sync_perm_command.py,sha256=VpW-rWhgHAL_ReU66D_BrsxlXQN4okfxzj6dyE5IfwA,1663
31
32
  airflow/providers/fab/auth_manager/cli_commands/user_command.py,sha256=jkJZnuw17YGTCuUZHtnkSQ6pcUr38nDHetuRdV-0N5o,10273
@@ -40,7 +41,7 @@ airflow/providers/fab/auth_manager/schemas/role_and_permission_schema.py,sha256=
40
41
  airflow/providers/fab/auth_manager/schemas/user_schema.py,sha256=MLnZotQqAg_BFvJunrSwbwur5CaTjk1ww3eCI3aPT6Y,2401
41
42
  airflow/providers/fab/auth_manager/security_manager/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
42
43
  airflow/providers/fab/auth_manager/security_manager/constants.py,sha256=x1Sjl_Mu3wmaSy3NFZlHxK2z-juzWmMs1SrzJ0aiBBQ,907
43
- airflow/providers/fab/auth_manager/security_manager/override.py,sha256=NVCyg6PmYEESexUPke3bBRuRQ221XEOIloFBR7m_go0,99783
44
+ airflow/providers/fab/auth_manager/security_manager/override.py,sha256=FgPPnzHyNWseiou_ui5NMQkXXMnneTeoQ0mW-fWikc8,99886
44
45
  airflow/providers/fab/auth_manager/views/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
45
46
  airflow/providers/fab/auth_manager/views/permissions.py,sha256=CT6jMCDHtirs0Qe4Penb6VwQq1yZeZ1lOLZITIlVqm4,2904
46
47
  airflow/providers/fab/auth_manager/views/roles_list.py,sha256=DwJ1iOCfpbxsWTEFWjW5_Jo3fmrZwxj1rPeflTaSg7A,1512
@@ -58,8 +59,8 @@ airflow/providers/fab/www/airflow_flask_app.py,sha256=-JPQ-mS1kKEj5adENnoVSD4LaF
58
59
  airflow/providers/fab/www/app.py,sha256=4Bmh5KOx-ZbfbmP5EdjOaOlcE9NWsAeBXGdKWzfFkkQ,5346
59
60
  airflow/providers/fab/www/auth.py,sha256=KfxXu5Gnawdukifnay9QRz46iOgMWIaKjHuYyp_aXKc,11881
60
61
  airflow/providers/fab/www/constants.py,sha256=UaDdEt_JsqcMYAMn0s9VBvVTKnRoLrvc2Ii59iOg5iQ,1346
61
- airflow/providers/fab/www/package-lock.json,sha256=lijNHzjBT-r3KbkxJRpxWJqB6jUF9VdYUCaFG6fryf8,329365
62
- airflow/providers/fab/www/package.json,sha256=mZFlglZsKU4Pc0EXaZapZd8wvWNegyqgyOZokqtwdVc,2355
62
+ airflow/providers/fab/www/package-lock.json,sha256=lsYPyt1pE7F6cBv6owVswHCP17rg0gdRwQfKf1WxdF8,329414
63
+ airflow/providers/fab/www/package.json,sha256=dEcb_XJBnJS1rvg6oPNZs7uONAlIQnjwx7IubxBFHFo,2355
63
64
  airflow/providers/fab/www/security_appless.py,sha256=J0OJGRPq6NK2vY6qfMRvyMUEc-E59vXucquQdjgsndY,1655
64
65
  airflow/providers/fab/www/security_manager.py,sha256=7YCUYuQufEaxPNnIK5OUrdcx9Gmz4FNpy50rxCKisN4,4859
65
66
  airflow/providers/fab/www/session.py,sha256=qyy8ipXLe4qH7D52tH3aKY6hyJNJ5tUfHel7_1S4BGg,1741
@@ -125,9 +126,9 @@ airflow/providers/fab/www/templates/appbuilder/index.html,sha256=ZaZsNdD8fCENqdn
125
126
  airflow/providers/fab/www/templates/appbuilder/navbar.html,sha256=1Q8u90aONY_PKTBtApwyp0EeudSsJyysW2UYo9Fa1cc,10215
126
127
  airflow/providers/fab/www/templates/appbuilder/navbar_menu.html,sha256=WWQ-_QLMqcW4Cpx_1_yulaQO-soD6ztnY2zfmBAUAGI,2034
127
128
  airflow/providers/fab/www/templates/appbuilder/navbar_right.html,sha256=qrwZDBbzLi4yhLrfai842MJDdQ4C31Xz9hJ3NoG5mo0,2488
128
- apache_airflow_providers_fab-2.4.2.dist-info/entry_points.txt,sha256=m05kASp7vFi0ZmQ--CFp7GeJpPL7UT2RQF8EEP5XRX8,99
129
- apache_airflow_providers_fab-2.4.2.dist-info/licenses/3rd-party-licenses/LICENSES-ui.txt,sha256=C9vBr_KiUhI3jjCS754n_SPi-ylD8SiJgXlOWuNOO98,3688
130
- apache_airflow_providers_fab-2.4.2.dist-info/licenses/NOTICE,sha256=GrKwLaFNGIn3J86ucRfNIExRSCD6-7nty84-84F2ad4,448
131
- apache_airflow_providers_fab-2.4.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
132
- apache_airflow_providers_fab-2.4.2.dist-info/METADATA,sha256=S075Zfau6wajAP2tAJ7clVIya-i_-hSF12gAYkCqNUk,6702
133
- apache_airflow_providers_fab-2.4.2.dist-info/RECORD,,
129
+ apache_airflow_providers_fab-2.4.3rc1.dist-info/entry_points.txt,sha256=m05kASp7vFi0ZmQ--CFp7GeJpPL7UT2RQF8EEP5XRX8,99
130
+ apache_airflow_providers_fab-2.4.3rc1.dist-info/licenses/3rd-party-licenses/LICENSES-ui.txt,sha256=C9vBr_KiUhI3jjCS754n_SPi-ylD8SiJgXlOWuNOO98,3688
131
+ apache_airflow_providers_fab-2.4.3rc1.dist-info/licenses/NOTICE,sha256=GrKwLaFNGIn3J86ucRfNIExRSCD6-7nty84-84F2ad4,448
132
+ apache_airflow_providers_fab-2.4.3rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
133
+ apache_airflow_providers_fab-2.4.3rc1.dist-info/METADATA,sha256=S8mSzpYfSftigA0SswIZCnCzPefADK2Ib92a5e55q9w,7137
134
+ apache_airflow_providers_fab-2.4.3rc1.dist-info/RECORD,,