apache-airflow-providers-fab 3.0.1rc1__tar.gz → 3.2.0__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.
Files changed (258) hide show
  1. apache_airflow_providers_fab-3.2.0/.pre-commit-config.yaml +60 -0
  2. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/3rd-party-licenses/LICENSES-ui.txt +1 -1
  3. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/NOTICE +1 -1
  4. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/PKG-INFO +15 -14
  5. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/README.rst +6 -6
  6. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/access-control.rst +1 -1
  7. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/api-authentication.rst +3 -3
  8. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/configuring-flask-app.rst +1 -1
  9. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/sso.rst +30 -4
  10. apache_airflow_providers_fab-3.2.0/docs/auth-manager/token.rst +155 -0
  11. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/webserver-authentication.rst +83 -1
  12. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/changelog.rst +181 -3
  13. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/cli-ref.rst +1 -1
  14. apache_airflow_providers_fab-3.2.0/docs/img/azure-ad-authentication.jpeg +0 -0
  15. apache_airflow_providers_fab-3.2.0/docs/img/azure-ad-token-claims.jpeg +0 -0
  16. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/index.rst +6 -6
  17. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/provider.yaml +17 -2
  18. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/pyproject.toml +10 -11
  19. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/__init__.py +1 -1
  20. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_endpoints/user_endpoint.py +5 -3
  21. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/login.py +0 -7
  22. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/roles.py +69 -0
  23. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/users.py +68 -0
  24. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/v2-fab-auth-manager-generated.yaml +1020 -0
  25. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/parameters.py +55 -0
  26. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/routes/login.py +36 -6
  27. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/routes/roles.py +137 -0
  28. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/routes/users.py +133 -0
  29. apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/api_fastapi/conftest.py → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/security.py +10 -10
  30. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/services/login.py +13 -27
  31. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/services/roles.py +158 -0
  32. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/services/users.py +219 -0
  33. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/auth_manager/api_fastapi/sorting.py +49 -0
  34. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/db_command.py +2 -2
  35. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/permissions_command.py +6 -2
  36. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/user_command.py +3 -3
  37. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/fab_auth_manager.py +50 -53
  38. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/models/__init__.py +9 -14
  39. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/models/db.py +1 -1
  40. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/security_manager/override.py +145 -89
  41. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/user.py +12 -0
  42. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/cli/__init__.py +18 -0
  43. {apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/auth_manager/cli_commands → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/cli}/definition.py +50 -2
  44. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/get_provider_info.py +8 -0
  45. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/version_compat.py +1 -0
  46. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/parameters.py +1 -46
  47. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/app.py +6 -8
  48. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_appbuilder.py +8 -4
  49. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_security.py +1 -1
  50. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_views.py +11 -7
  51. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/package-lock.json +972 -682
  52. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/package.json +14 -11
  53. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/session.py +5 -8
  54. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/743.935ed3d26e56ed8f63d3.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/743.8fb7d21632ed892227fe.js +2 -2
  55. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.ff5a35f322070b094aa2.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.51e5d14856ee1ebc83ca.js +1 -1
  56. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/flash.5583a9e0cf11f2be93da.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/flash.865b6940c00b2a9041b3.js +1 -1
  57. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/loadingDots.2e5f555f0753107b0300.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/loadingDots.07f5b9805847242736e1.js +1 -1
  58. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/main.8cffe40bcf7cca998f4e.js +2 -0
  59. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/manifest.json +22 -0
  60. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/materialIcons.3e67dd6fbfcc4f3b5105.js → apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/materialIcons.4fe84ae36604d84dec78.js +1 -1
  61. apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/moment.0ec3ee3fb60dc999b1fd.js +1 -0
  62. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/js/main.js +11 -0
  63. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/main.html +1 -0
  64. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/views.py +18 -14
  65. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/test_role_and_permission_endpoint.py +11 -11
  66. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/test_user_endpoint.py +5 -5
  67. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/conftest.py +70 -0
  68. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/datamodels/test_roles.py +130 -0
  69. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/datamodels/test_users.py +234 -0
  70. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/routes/test_login.py +13 -4
  71. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/routes/test_roles.py +554 -0
  72. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/routes/test_users.py +582 -0
  73. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/services/test_login.py +22 -42
  74. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/services/test_roles.py +363 -0
  75. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/services/test_users.py +462 -0
  76. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/test_parameters.py +70 -0
  77. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/test_security.py +50 -0
  78. apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/test_sorting.py +69 -0
  79. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_db_command.py +18 -16
  80. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_permissions_command.py +3 -3
  81. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_role_command.py +2 -2
  82. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_user_command.py +6 -6
  83. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/test_user_model.py +3 -6
  84. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/security_manager/test_override.py +1 -1
  85. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/test_fab_auth_manager.py +80 -16
  86. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/test_security.py +23 -13
  87. apache_airflow_providers_fab-3.2.0/tests/unit/fab/cli/__init__.py +16 -0
  88. {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/cli_commands → apache_airflow_providers_fab-3.2.0/tests/unit/fab/cli}/test_definition.py +1 -1
  89. apache_airflow_providers_fab-3.2.0/tests/unit/fab/db_manager/__init__.py +16 -0
  90. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/db_manager/test_fab_db_manager.py +1 -1
  91. apache_airflow_providers_fab-3.2.0/tests/unit/fab/plugins/__init__.py +16 -0
  92. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/plugins/test_plugin.py +1 -1
  93. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/test_auth.py +2 -2
  94. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/test_views_custom_user_views.py +39 -3
  95. apache_airflow_providers_fab-3.2.0/www-hash.txt +1 -0
  96. apache_airflow_providers_fab-3.0.1rc1/docs/auth-manager/token.rst +0 -45
  97. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/v2-fab-auth-manager-generated.yaml +0 -153
  98. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/main.3cf3be1a0c5439bb640d.js +0 -2
  99. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/manifest.json +0 -22
  100. apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/moment.9baee5ec3d7639a10897.js +0 -1
  101. apache_airflow_providers_fab-3.0.1rc1/www-hash.txt +0 -1
  102. {apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab → apache_airflow_providers_fab-3.2.0}/LICENSE +0 -0
  103. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/api-ref/fab-public-api-ref.rst +0 -0
  104. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/api-ref/fab-token-api-ref.rst +0 -0
  105. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/index.rst +0 -0
  106. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/auth-manager/security.rst +0 -0
  107. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/commits.rst +0 -0
  108. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/conf.py +0 -0
  109. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/configurations-ref.rst +0 -0
  110. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/add-role.png +0 -0
  111. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/diagram_fab_auth_manager_airflow_architecture.md5sum +0 -0
  112. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/diagram_fab_auth_manager_airflow_architecture.png +0 -0
  113. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/diagram_fab_auth_manager_airflow_architecture.py +0 -0
  114. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/img/new-role.png +0 -0
  115. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/installing-providers-from-sources.rst +0 -0
  116. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/migrations-ref.rst +0 -0
  117. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/security.rst +0 -0
  118. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/docs/upgrading.rst +0 -0
  119. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/__init__.py +0 -0
  120. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/3rd-party-licenses/LICENSES-ui.txt +0 -0
  121. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/__init__.py +0 -0
  122. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/alembic.ini +0 -0
  123. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/__init__.py +0 -0
  124. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/__init__.py +0 -0
  125. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/__init__.py +0 -0
  126. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/__init__.py +0 -0
  127. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/basic_auth.py +0 -0
  128. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/kerberos_auth.py +0 -0
  129. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api/auth/backend/session.py +0 -0
  130. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_endpoints/__init__.py +0 -0
  131. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_endpoints/role_and_permission_endpoint.py +0 -0
  132. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/__init__.py +0 -0
  133. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/datamodels/__init__.py +0 -0
  134. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/openapi/__init__.py +0 -0
  135. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/routes/__init__.py +0 -0
  136. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/api_fastapi/services/__init__.py +0 -0
  137. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/__init__.py +0 -0
  138. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/role_command.py +0 -0
  139. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/sync_perm_command.py +0 -0
  140. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/cli_commands/utils.py +0 -0
  141. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/models/anonymous_user.py +0 -0
  142. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/openapi/__init__.py +0 -0
  143. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/openapi/v1-flask-api.yaml +0 -0
  144. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/schemas/__init__.py +0 -0
  145. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/schemas/role_and_permission_schema.py +0 -0
  146. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/schemas/user_schema.py +0 -0
  147. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/security_manager/__init__.py +0 -0
  148. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/security_manager/constants.py +0 -0
  149. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/__init__.py +0 -0
  150. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/permissions.py +0 -0
  151. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/roles_list.py +0 -0
  152. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/user_edit.py +0 -0
  153. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/auth_manager/views/user_stats.py +0 -0
  154. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/README +0 -0
  155. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/__init__.py +0 -0
  156. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/env.py +0 -0
  157. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/script.py.mako +0 -0
  158. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/migrations/versions/0001_1_4_0_create_ab_tables_if_missing.py → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/migrations/versions/0000_1_4_0_create_ab_tables_if_missing.py +0 -0
  159. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/migrations/versions/__init__.py +0 -0
  160. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/__init__.py +0 -0
  161. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/airflow_flask_app.py +0 -0
  162. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/__init__.py +0 -0
  163. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/exceptions.py +0 -0
  164. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/security.py +0 -0
  165. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/api_connexion/types.py +0 -0
  166. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/auth.py +0 -0
  167. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/constants.py +0 -0
  168. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/__init__.py +0 -0
  169. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_jinja_globals.py +0 -0
  170. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_manifest_files.py +0 -0
  171. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_session.py +0 -0
  172. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/extensions/init_wsgi_middlewares.py +0 -0
  173. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security/__init__.py +0 -0
  174. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security/permissions.py +0 -0
  175. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security_appless.py +0 -0
  176. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/security_manager.py +0 -0
  177. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/bootstrap-theme.css +0 -0
  178. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/flash.css +0 -0
  179. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/loading-dots.css +0 -0
  180. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/main.css +0 -0
  181. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/css/material-icons.css +0 -0
  182. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/48f0ea180c40270a5b05.png +0 -0
  183. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/649c0b07771e68fafdeb.png +0 -0
  184. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/743.935ed3d26e56ed8f63d3.js.LICENSE.txt → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/743.8fb7d21632ed892227fe.js.LICENSE.txt +0 -0
  185. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.ff5a35f322070b094aa2.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/airflowDefaultTheme.51e5d14856ee1ebc83ca.css +0 -0
  186. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/f7490d556a6c42e49ba4.png +0 -0
  187. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/flash.5583a9e0cf11f2be93da.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/flash.865b6940c00b2a9041b3.css +0 -0
  188. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.css +0 -0
  189. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.js +0 -0
  190. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/jquery-ui.min.js.LICENSE.txt +0 -0
  191. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/loadingDots.2e5f555f0753107b0300.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/loadingDots.07f5b9805847242736e1.css +0 -0
  192. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/main.3cf3be1a0c5439bb640d.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/main.8cffe40bcf7cca998f4e.css +0 -0
  193. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/main.3cf3be1a0c5439bb640d.js.LICENSE.txt → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/main.8cffe40bcf7cca998f4e.js.LICENSE.txt +0 -0
  194. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/materialIcons.3e67dd6fbfcc4f3b5105.css → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/materialIcons.4fe84ae36604d84dec78.css +0 -0
  195. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/dist/oss-licenses.json +0 -0
  196. /apache_airflow_providers_fab-3.0.1rc1/src/airflow/providers/fab/www/static/dist/runtime.6ad9da077ea169d60db9.js → /apache_airflow_providers_fab-3.2.0/src/airflow/providers/fab/www/static/dist/runtime.45b36fb8335446865b53.js +0 -0
  197. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/js/datetime_utils.js +0 -0
  198. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/pin_100.png +0 -0
  199. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/pin_32.png +0 -0
  200. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/sort_asc.png +0 -0
  201. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/sort_both.png +0 -0
  202. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/static/sort_desc.png +0 -0
  203. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/_messages.html +0 -0
  204. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/error.html +0 -0
  205. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/airflow/traceback.html +0 -0
  206. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/flash.html +0 -0
  207. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/index.html +0 -0
  208. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/navbar.html +0 -0
  209. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/navbar_menu.html +0 -0
  210. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/templates/appbuilder/navbar_right.html +0 -0
  211. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/utils.py +0 -0
  212. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/src/airflow/providers/fab/www/webpack.config.js +0 -0
  213. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/conftest.py +0 -0
  214. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/__init__.py +0 -0
  215. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/__init__.py +0 -0
  216. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/__init__.py +0 -0
  217. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/__init__.py +0 -0
  218. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/__init__.py +0 -0
  219. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/__init__.py +0 -0
  220. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/test_basic_auth.py +0 -0
  221. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/test_kerberos_auth.py +0 -0
  222. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api/auth/backend/test_session.py +0 -0
  223. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/__init__.py +0 -0
  224. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/api_connexion_utils.py +0 -0
  225. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/remote_user_api_auth_backend.py +0 -0
  226. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_endpoints/test_auth.py +0 -0
  227. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/__init__.py +0 -0
  228. {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/api_fastapi/routes → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/datamodels}/__init__.py +0 -0
  229. {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/cli_commands → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/api_fastapi/routes}/__init__.py +0 -0
  230. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/api_fastapi/services/__init__.py +0 -0
  231. {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/auth_manager/security_manager → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/cli}/__init__.py +0 -0
  232. {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/db_manager → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/cli_commands}/__init__.py +0 -0
  233. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_sync_perm_command.py +0 -0
  234. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/cli_commands/test_utils.py +0 -0
  235. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/conftest.py +0 -0
  236. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/__init__.py +0 -0
  237. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/test_anonymous_user.py +0 -0
  238. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/models/test_db.py +0 -0
  239. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/schemas/__init__.py +0 -0
  240. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/schemas/test_role_and_permission_schema.py +0 -0
  241. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/schemas/test_user_schema.py +0 -0
  242. {apache_airflow_providers_fab-3.0.1rc1/tests/unit/fab/plugins → apache_airflow_providers_fab-3.2.0/tests/unit/fab/auth_manager/security_manager}/__init__.py +0 -0
  243. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/security_manager/test_constants.py +0 -0
  244. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/test_models.py +0 -0
  245. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/__init__.py +0 -0
  246. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_permissions.py +0 -0
  247. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_roles_list.py +0 -0
  248. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_user.py +0 -0
  249. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_user_edit.py +0 -0
  250. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/auth_manager/views/test_user_stats.py +0 -0
  251. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/decorators.py +0 -0
  252. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/plugins/conftest.py +0 -0
  253. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/utils.py +0 -0
  254. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/__init__.py +0 -0
  255. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/test_utils.py +0 -0
  256. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/__init__.py +0 -0
  257. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/conftest.py +0 -0
  258. {apache_airflow_providers_fab-3.0.1rc1 → apache_airflow_providers_fab-3.2.0}/tests/unit/fab/www/views/test_connection_form_fields.py +0 -0
@@ -0,0 +1,60 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one
2
+ # or more contributor license agreements. See the NOTICE file
3
+ # distributed with this work for additional information
4
+ # regarding copyright ownership. The ASF licenses this file
5
+ # to you under the Apache License, Version 2.0 (the
6
+ # "License"); you may not use this file except in compliance
7
+ # with the License. You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing,
12
+ # software distributed under the License is distributed on an
13
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ # KIND, either express or implied. See the License for the
15
+ # specific language governing permissions and limitations
16
+ # under the License.
17
+ ---
18
+ default_stages: [pre-commit, pre-push]
19
+ minimum_prek_version: '0.2.0'
20
+ default_language_version:
21
+ python: python3
22
+ node: 22.19.0
23
+ golang: 1.24.0
24
+ repos:
25
+ - repo: local
26
+ hooks:
27
+ - id: compile-fab-assets
28
+ name: Compile FAB provider assets
29
+ language: node
30
+ files: ^src/airflow/providers/fab/www/
31
+ exclude: |
32
+ (?x)
33
+ ^src/airflow/providers/fab/www/api_connexion/.*|
34
+ ^src/airflow/providers/fab/www/extensions/.*|
35
+ ^src/airflow/providers/fab/www/security/.*
36
+ entry: ../../scripts/ci/prek/compile_provider_assets.py fab
37
+ pass_filenames: false
38
+ additional_dependencies: ['yarn@1.22.21']
39
+ - id: generate-openapi-spec-fab
40
+ name: Generate the FastAPI API spec for FAB
41
+ language: python
42
+ entry: ../../scripts/ci/prek/generate_openapi_spec_providers.py fab
43
+ pass_filenames: false
44
+ files: ^src/airflow/providers/fab/auth_manager/api_fastapi/.*\.py$
45
+ - id: check-revision-heads-map-fab
46
+ name: Check that the REVISION_HEADS_MAP is up-to-date
47
+ language: python
48
+ entry: ../../scripts/ci/prek/check_revision_heads_map.py
49
+ pass_filenames: false
50
+ files: >
51
+ (?x)
52
+ ^src/airflow/providers/fab/migrations/versions/.*$|
53
+ ^src/airflow/providers/fab/migrations/versions|
54
+ ^src/airflow/providers/fab/auth_manager/models/db\.py$
55
+ - id: prevent-deprecated-sqlalchemy-usage-fab
56
+ name: Prevent deprecated sqlalchemy usage
57
+ entry: ../../scripts/ci/prek/prevent_deprecated_sqlalchemy_usage.py
58
+ language: python
59
+ files: ^.*\.py$
60
+ pass_filenames: true
@@ -1,5 +1,5 @@
1
1
  Apache Airflow
2
- Copyright 2016-2025 The Apache Software Foundation
2
+ Copyright 2016-2026 The Apache Software Foundation
3
3
 
4
4
  This product includes software developed at The Apache Software
5
5
  Foundation (http://www.apache.org/).
@@ -1,5 +1,5 @@
1
1
  Apache Airflow
2
- Copyright 2016-2025 The Apache Software Foundation
2
+ Copyright 2016-2026 The Apache Software Foundation
3
3
 
4
4
  This product includes software developed at The Apache Software
5
5
  Foundation (http://www.apache.org/).
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-fab
3
- Version: 3.0.1rc1
3
+ Version: 3.2.0
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>
7
7
  Maintainer-email: Apache Software Foundation <dev@airflow.apache.org>
8
8
  Requires-Python: >=3.10,!=3.13
9
9
  Description-Content-Type: text/x-rst
10
+ License-Expression: Apache-2.0
10
11
  Classifier: Development Status :: 5 - Production/Stable
11
12
  Classifier: Environment :: Console
12
13
  Classifier: Environment :: Web Environment
@@ -14,33 +15,33 @@ Classifier: Intended Audience :: Developers
14
15
  Classifier: Intended Audience :: System Administrators
15
16
  Classifier: Framework :: Apache Airflow
16
17
  Classifier: Framework :: Apache Airflow :: Provider
17
- Classifier: License :: OSI Approved :: Apache Software License
18
18
  Classifier: Programming Language :: Python :: 3.10
19
19
  Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Topic :: System :: Monitoring
22
22
  License-File: 3rd-party-licenses/LICENSES-ui.txt
23
+ License-File: LICENSE
23
24
  License-File: NOTICE
24
- Requires-Dist: apache-airflow>=3.0.2rc1
25
- Requires-Dist: apache-airflow-providers-common-compat>=1.8.0rc1
25
+ Requires-Dist: apache-airflow>=3.0.2
26
+ Requires-Dist: apache-airflow-providers-common-compat>=1.12.0
26
27
  Requires-Dist: blinker>=1.6.2; python_version < '3.13'
27
28
  Requires-Dist: flask>=2.2.1,<2.3; python_version < '3.13'
28
- Requires-Dist: flask-appbuilder==5.0.0; python_version < '3.13'
29
+ Requires-Dist: flask-appbuilder==5.0.1; python_version < '3.13'
29
30
  Requires-Dist: flask-login>=0.6.2; python_version < '3.13'
30
31
  Requires-Dist: flask-session>=0.8.0; python_version < '3.13'
31
32
  Requires-Dist: msgpack>=1.0.0; python_version < '3.13'
32
33
  Requires-Dist: flask-sqlalchemy>=3.0.5; python_version < '3.13'
33
- Requires-Dist: sqlalchemy<2; python_version < '3.13'
34
34
  Requires-Dist: flask-wtf>=1.1.0; python_version < '3.13'
35
35
  Requires-Dist: connexion[flask]>=2.14.2,<3.0; python_version < '3.13'
36
36
  Requires-Dist: jmespath>=0.7.0; python_version < '3.13'
37
37
  Requires-Dist: werkzeug>=2.2,<4; python_version < '3.13'
38
38
  Requires-Dist: wtforms>=3.0,<4; python_version < '3.13'
39
+ Requires-Dist: cachetools>=6.0; python_version < '3.13'
39
40
  Requires-Dist: flask_limiter>3,<4,!=3.13
40
41
  Requires-Dist: kerberos>=1.3.0 ; extra == "kerberos" and ( python_version < '3.13')
41
42
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
42
- Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/3.0.1/changelog.html
43
- Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-fab/3.0.1
43
+ Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/changelog.html
44
+ Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0
44
45
  Project-URL: Mastodon, https://fosstodon.org/@airflow
45
46
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
46
47
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -72,7 +73,7 @@ Provides-Extra: kerberos
72
73
 
73
74
  Package ``apache-airflow-providers-fab``
74
75
 
75
- Release: ``3.0.1``
76
+ Release: ``3.2.0``
76
77
 
77
78
 
78
79
  `Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
@@ -85,7 +86,7 @@ This is a provider package for ``fab`` provider. All classes for this provider p
85
86
  are in ``airflow.providers.fab`` python package.
86
87
 
87
88
  You can find package information and changelog for the provider
88
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0.1/>`_.
89
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/>`_.
89
90
 
90
91
  Installation
91
92
  ------------
@@ -103,20 +104,20 @@ Requirements
103
104
  PIP package Version required
104
105
  ========================================== ==========================================
105
106
  ``apache-airflow`` ``>=3.0.2``
106
- ``apache-airflow-providers-common-compat`` ``>=1.8.0``
107
+ ``apache-airflow-providers-common-compat`` ``>=1.12.0``
107
108
  ``blinker`` ``>=1.6.2; python_version < "3.13"``
108
109
  ``flask`` ``>=2.2.1,<2.3; python_version < "3.13"``
109
- ``flask-appbuilder`` ``==5.0.0; python_version < "3.13"``
110
+ ``flask-appbuilder`` ``==5.0.1; python_version < "3.13"``
110
111
  ``flask-login`` ``>=0.6.2; python_version < "3.13"``
111
112
  ``flask-session`` ``>=0.8.0; python_version < "3.13"``
112
113
  ``msgpack`` ``>=1.0.0; python_version < "3.13"``
113
114
  ``flask-sqlalchemy`` ``>=3.0.5; python_version < "3.13"``
114
- ``sqlalchemy`` ``<2; python_version < "3.13"``
115
115
  ``flask-wtf`` ``>=1.1.0; python_version < "3.13"``
116
116
  ``connexion[flask]`` ``>=2.14.2,<3.0; python_version < "3.13"``
117
117
  ``jmespath`` ``>=0.7.0; python_version < "3.13"``
118
118
  ``werkzeug`` ``>=2.2,<4; python_version < "3.13"``
119
119
  ``wtforms`` ``>=3.0,<4; python_version < "3.13"``
120
+ ``cachetools`` ``>=6.0; python_version < "3.13"``
120
121
  ``flask_limiter`` ``>3,!=3.13,<4``
121
122
  ========================================== ==========================================
122
123
 
@@ -149,5 +150,5 @@ Extra Dependencies
149
150
  ============ ============================================
150
151
 
151
152
  The changelog for the provider package can be found in the
152
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0.1/changelog.html>`_.
153
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/changelog.html>`_.
153
154
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-fab``
25
25
 
26
- Release: ``3.0.1``
26
+ Release: ``3.2.0``
27
27
 
28
28
 
29
29
  `Flask App Builder <https://flask-appbuilder.readthedocs.io/>`__
@@ -36,7 +36,7 @@ This is a provider package for ``fab`` provider. All classes for this provider p
36
36
  are in ``airflow.providers.fab`` python package.
37
37
 
38
38
  You can find package information and changelog for the provider
39
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0.1/>`_.
39
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/>`_.
40
40
 
41
41
  Installation
42
42
  ------------
@@ -54,20 +54,20 @@ Requirements
54
54
  PIP package Version required
55
55
  ========================================== ==========================================
56
56
  ``apache-airflow`` ``>=3.0.2``
57
- ``apache-airflow-providers-common-compat`` ``>=1.8.0``
57
+ ``apache-airflow-providers-common-compat`` ``>=1.12.0``
58
58
  ``blinker`` ``>=1.6.2; python_version < "3.13"``
59
59
  ``flask`` ``>=2.2.1,<2.3; python_version < "3.13"``
60
- ``flask-appbuilder`` ``==5.0.0; python_version < "3.13"``
60
+ ``flask-appbuilder`` ``==5.0.1; python_version < "3.13"``
61
61
  ``flask-login`` ``>=0.6.2; python_version < "3.13"``
62
62
  ``flask-session`` ``>=0.8.0; python_version < "3.13"``
63
63
  ``msgpack`` ``>=1.0.0; python_version < "3.13"``
64
64
  ``flask-sqlalchemy`` ``>=3.0.5; python_version < "3.13"``
65
- ``sqlalchemy`` ``<2; python_version < "3.13"``
66
65
  ``flask-wtf`` ``>=1.1.0; python_version < "3.13"``
67
66
  ``connexion[flask]`` ``>=2.14.2,<3.0; python_version < "3.13"``
68
67
  ``jmespath`` ``>=0.7.0; python_version < "3.13"``
69
68
  ``werkzeug`` ``>=2.2,<4; python_version < "3.13"``
70
69
  ``wtforms`` ``>=3.0,<4; python_version < "3.13"``
70
+ ``cachetools`` ``>=6.0; python_version < "3.13"``
71
71
  ``flask_limiter`` ``>3,!=3.13,<4``
72
72
  ========================================== ==========================================
73
73
 
@@ -100,4 +100,4 @@ Extra Dependencies
100
100
  ============ ============================================
101
101
 
102
102
  The changelog for the provider package can be found in the
103
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.0.1/changelog.html>`_.
103
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-fab/3.2.0/changelog.html>`_.
@@ -333,7 +333,7 @@ It's also possible to add Dag Runs resource permissions in a similar way, but ex
333
333
  dag_id="example_fine_grained_access",
334
334
  start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
335
335
  access_control={
336
- "Viewer": {"Dags": {"can_edit", "can_read", "can_delete"}, "Dag Runs": {"can_create"}},
336
+ "Viewer": {"DAGs": {"can_edit", "can_read", "can_delete"}, "DAG Runs": {"can_create"}},
337
337
  },
338
338
  )
339
339
 
@@ -38,9 +38,9 @@ command as in the example below.
38
38
 
39
39
  .. versionchanged:: 3.0.0
40
40
 
41
- In Airflow, the default setting is using token based authentication.
42
- This approach is independent from which ``auth_backend`` is used.
43
- The default setting is using Airflow public API to create a token (JWT) first and use this token in the requests to access the API.
41
+ Airflow now uses token-based authentication for the public API.
42
+ This mechanism is independent of the configured ``auth_backend``.
43
+ Clients must first obtain a JWT token using :doc:`token`, then include that token in subsequent API requests.
44
44
 
45
45
  Kerberos authentication
46
46
  '''''''''''''''''''''''
@@ -33,6 +33,6 @@ as the `app context <https://flask.palletsprojects.com/en/2.3.x/appcontext/>`_ i
33
33
  from flask import current_app as app
34
34
 
35
35
 
36
- @app.before_requestq
36
+ @app.before_request
37
37
  def print_custom_message() -> None:
38
38
  print("Executing before every request")
@@ -59,7 +59,33 @@ Configuration Steps
59
59
 
60
60
  This replaces the default ``SimpleAuthManager``.
61
61
 
62
- 2. **Install Required Packages**
62
+ 2. **Enable OAuth Authentication Type**
63
+
64
+ Set ``AUTH_TYPE`` to ``AUTH_OAUTH`` in your ``webserver_config.py`` file
65
+ (located at ``$AIRFLOW_HOME/webserver_config.py`` by default, configurable via
66
+ ``[fab] config_file`` in ``airflow.cfg``):
67
+
68
+ .. code-block:: python
69
+
70
+ from flask_appbuilder.const import AUTH_OAUTH
71
+
72
+ AUTH_TYPE = AUTH_OAUTH
73
+
74
+ .. important::
75
+ This step is required. Without setting ``AUTH_TYPE = AUTH_OAUTH``,
76
+ the OAuth providers will not be activated even if ``OAUTH_PROVIDERS``
77
+ is configured. The default ``AUTH_TYPE = AUTH_DB`` uses database
78
+ authentication only.
79
+
80
+ .. note::
81
+ If the ``webserver_config.py`` file does not exist in your environment,
82
+ you need to create it manually. A template with default values and examples
83
+ can be found in the Airflow source at
84
+ ``airflow-core/src/airflow/config_templates/default_webserver_config.py``.
85
+ You can copy this file to ``$AIRFLOW_HOME/webserver_config.py`` and modify
86
+ it for your needs.
87
+
88
+ 3. **Install Required Packages**
63
89
 
64
90
  If not already installed, ensure the FAB provider is available:
65
91
 
@@ -71,7 +97,7 @@ Configuration Steps
71
97
  The FAB Auth Manager provider is not installed by default in Airflow 3.
72
98
  You must install it explicitly to use OAuth2-based SSO.
73
99
 
74
- 3. **Configure OAuth2 Provider**
100
+ 4. **Configure OAuth2 Provider**
75
101
 
76
102
  FAB Auth Manager reads provider configuration from the ``[fab]`` section
77
103
  of ``airflow.cfg`` or from environment variables.
@@ -119,13 +145,13 @@ Configuration Steps
119
145
 
120
146
  Adjust these values according to your provider's documentation.
121
147
 
122
- 4. **Restart Airflow Webserver**
148
+ 5. **Restart Airflow Webserver**
123
149
 
124
150
  .. code-block:: bash
125
151
 
126
152
  airflow webserver --reload
127
153
 
128
- 5. **Test SSO Login**
154
+ 6. **Test SSO Login**
129
155
 
130
156
  Open the Airflow UI. You should see a login option for your SSO provider.
131
157
 
@@ -0,0 +1,155 @@
1
+ .. Licensed to the Apache Software Foundation (ASF) under one
2
+ or more contributor license agreements. See the NOTICE file
3
+ distributed with this work for additional information
4
+ regarding copyright ownership. The ASF licenses this file
5
+ to you under the Apache License, Version 2.0 (the
6
+ "License"); you may not use this file except in compliance
7
+ with the License. You may obtain a copy of the License at
8
+
9
+ .. http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ .. Unless required by applicable law or agreed to in writing,
12
+ software distributed under the License is distributed on an
13
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ KIND, either express or implied. See the License for the
15
+ specific language governing permissions and limitations
16
+ under the License.
17
+
18
+ Generate JWT token with FAB auth manager
19
+ ========================================
20
+
21
+ .. note::
22
+ This guide only applies if your environment is configured with FAB auth manager.
23
+
24
+ To use the :doc:`Airflow public API <apache-airflow:stable-rest-api-ref>`, you first need to obtain a JWT Token for
25
+ authentication.
26
+ Once you have the token, include it in the ``Authorization`` header when making requests to the public API.
27
+
28
+ You can generate a JWT token using the ``Create Token`` API endpoint,
29
+ documented in :doc:`/api-ref/fab-token-api-ref`.
30
+
31
+ Example
32
+ '''''''
33
+
34
+ Use the following example to generate a token via username and password.
35
+
36
+ .. code-block:: bash
37
+
38
+ ENDPOINT_URL="http://localhost:8080"
39
+ curl -X 'POST' \
40
+ "${ENDPOINT_URL}/auth/token" \
41
+ -H 'Content-Type: application/json' \
42
+ -d '{
43
+ "username": "<username>",
44
+ "password": "<password>"
45
+ }'
46
+
47
+ If successful, this request returns a JWT token that you can use for subsequent Airflow public API calls.
48
+
49
+ Only users authenticated via the database (``AUTH_TYPE = AUTH_DB``) or LDAP
50
+ (``AUTH_TYPE = AUTH_LDAP``) can generate tokens using this method.
51
+ For more details, see :doc:`webserver-authentication`.
52
+
53
+ If you need to generate a token using a different authentication mechanism, see the next section.
54
+
55
+ Custom authentication implementation
56
+ ------------------------------------
57
+
58
+ By default, JWT tokens for the Airflow public API can only be generated using
59
+ basic authentication (username and password) for database or LDAP users.
60
+
61
+ If you want to support another authentication mechanism, such as oauth, you can do so by overriding the
62
+ ``create_token`` method in the FAB auth manager.
63
+
64
+ Example
65
+ '''''''
66
+
67
+ .. code-block:: python
68
+
69
+ class MyAuthManager(FabAuthManager):
70
+
71
+ def create_token(self, headers: dict[str, str], body: dict[str, Any]) -> User:
72
+ """
73
+ Return the authenticated user for a given payload.
74
+
75
+ Implement your own custom token creation logic here.
76
+ """
77
+ ...
78
+
79
+ Oauth example
80
+ '''''''''''''
81
+
82
+ Below is an example implementation that uses OAuth to allow users to obtain a JWT token.
83
+ This custom logic overrides the default ``create_token`` method from the FAB authentication manager.
84
+
85
+ .. warning::
86
+ The example shown below disables signature verification (``verify_signature=False``).
87
+ This is **insecure** and should only be used for testing. Always validate tokens properly in production.
88
+ Furthermore you need to make sure that the claims of the JWT are valid.
89
+ Critical claims that you must verify are for example (but not limited to):
90
+ - ``iss`` (issuer)
91
+ - ``aud`` (audience)
92
+ - ``nbf`` (not before time)
93
+ - ``exp`` (expiration time)
94
+ Refer to the documentation of your identity provider for more information.
95
+
96
+ .. code-block:: python
97
+
98
+ class MyAuthManager(FabAuthManager):
99
+
100
+ def create_token(self, headers: dict[str, str], body: dict[str, Any]) -> User:
101
+ """
102
+ Return the authenticated user derived from an OAuth access token.
103
+
104
+ Implement your own custom token validation and user mapping logic here.
105
+ """
106
+ user = None
107
+
108
+ # Handle OAuth-based authentication
109
+ if self.security_manager.auth_type == AUTH_OAUTH:
110
+ # Require a Bearer token
111
+ auth_header = headers.get("Authorization")
112
+ if not auth_header:
113
+ return None
114
+
115
+ token = auth_header.replace("Bearer ", "")
116
+
117
+ # Example token decoding
118
+ #
119
+ # With signature validation (recommended):
120
+ # me = jwt.decode(
121
+ # token,
122
+ # public_key,
123
+ # algorithms=['HS256', 'RS256'],
124
+ # audience=CLIENT_ID,
125
+ # issuer=ISSUER_URL,
126
+ # )
127
+ #
128
+ # Without signature validation (not recommended):
129
+ me = jwt.decode(token, options={"verify_signature": False})
130
+
131
+ # Extract groups/roles (example schema — adjust to your provider)
132
+ groups = me["resource_access"]["airflow"]["roles"] # requires validation
133
+ if not groups:
134
+ groups = ["airflow_public"]
135
+ else:
136
+ groups = [g for g in groups if "airflow" in g]
137
+
138
+ # Build user info payload for FAB
139
+ userinfo = {
140
+ "username": me.get("preferred_username"),
141
+ "email": me.get("email"),
142
+ "first_name": me.get("given_name"),
143
+ "last_name": me.get("family_name"),
144
+ "role_keys": groups,
145
+ }
146
+
147
+ user = self.security_manager.auth_user_oauth(userinfo, rotate_session_id=False)
148
+
149
+ # Fall back to the default implementation
150
+ else:
151
+ user = super().create_token(headers=headers, body=body)
152
+
153
+ log.info("User: %s", user)
154
+
155
+ return user
@@ -23,7 +23,9 @@ FAB auth manager authentication
23
23
  While this documentation refers to authentication using the ``apache-airflow-providers-fab`` package, please note:
24
24
 
25
25
  - The **FAB auth provider** is actively maintained and compatible with the latest versions of Airflow.
26
- - The legacy ``webserver_config.py`` file referenced in older docs is **no longer used** in recent versions of Airflow. Instead, authentication is handled via the new ``auth_manager`` framework configured in ``airflow.cfg``.
26
+ - It is preferred to configure supported authentication options using the new ``auth_manager`` framework configured in ``airflow.cfg``.
27
+ - The ``webserver_config.py`` file is still used for more advanced options,
28
+ such as Single Sign-On with OAuth.
27
29
 
28
30
  For more, see the :doc:`token`.
29
31
 
@@ -236,6 +238,86 @@ webserver_config.py itself if you wish.
236
238
  log.debug(f"User info from GitHub: {user_data}\nTeam info from GitHub: {teams}")
237
239
  return {"username": "github_" + user_data.get("login"), "role_keys": roles}
238
240
 
241
+ Example using role / group based Authorization with Azure Active Directory
242
+ '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
243
+
244
+ Here is an example of what you might have in your ``webserver_config.py``:
245
+
246
+ .. code-block:: python
247
+
248
+ from airflow.providers.fab.auth_manager.security_manager.override import FabAirflowSecurityManagerOverride
249
+ from flask_appbuilder.security.manager import AUTH_OAUTH
250
+
251
+ AUTH_TYPE = AUTH_OAUTH
252
+ AUTH_USER_REGISTRATION = True
253
+ AUTH_ROLES_SYNC_AT_LOGIN = True
254
+
255
+ AUTH_ROLES_MAPPING = {
256
+ "Azure-Admins": ["Admin"],
257
+ "Azure-Users": ["User"],
258
+ "Azure-Viewers": ["Viewer"],
259
+ }
260
+
261
+ OAUTH_PROVIDERS = [
262
+ {
263
+ "name": "azure",
264
+ "icon": "fa-windows",
265
+ "token_key": "access_token",
266
+ "remote_app": {
267
+ "client_id": "<your-client-id>",
268
+ "client_secret": "<your-client-secret>",
269
+ "api_base_url": "https://graph.microsoft.com/v1.0/",
270
+ "client_kwargs": {"scope": "openid email profile"},
271
+ "access_token_url": "https://login.microsoftonline.com/<your-tenant-id>/oauth2/v2.0/token",
272
+ "authorize_url": "https://login.microsoftonline.com/<your-tenant-id>/oauth2/v2.0/authorize",
273
+ "request_token_url": None,
274
+ },
275
+ }
276
+ ]
277
+
278
+
279
+ class AzureAdSecurityManager(FabAirflowSecurityManagerOverride):
280
+ def get_oauth_user_info(self, provider, response):
281
+ if provider != "azure":
282
+ return {}
283
+
284
+ groups = response.get("groups", [])
285
+ roles = response.get("roles", [])
286
+
287
+ return {
288
+ "username": response.get("preferred_username"),
289
+ "email": response.get("email"),
290
+ "first_name": response.get("given_name"),
291
+ "last_name": response.get("family_name"),
292
+ "role_keys": groups or roles,
293
+ }
294
+
295
+
296
+ SECURITY_MANAGER_CLASS = AzureAdSecurityManager
297
+
298
+ .. note::
299
+
300
+ * Azure AD group or role claims must be explicitly enabled in the application
301
+ registration (for example via ``groupMembershipClaims``).
302
+ * Depending on tenant configuration, group claims may be returned as IDs
303
+ rather than display names.
304
+ * For large group memberships, querying Microsoft Graph may be required
305
+ instead of relying solely on token claims.
306
+
307
+ .. figure:: /img/azure-ad-authentication.jpeg
308
+ :alt: Azure AD app registration authentication settings
309
+
310
+ Azure AD app registration authentication configuration showing the redirect URI
311
+ (``http://localhost:8080/auth/oauth-authorized/azure``) required for Airflow OAuth
312
+ integration.
313
+
314
+ .. figure:: /img/azure-ad-token-claims.jpeg
315
+ :alt: Azure AD token configuration with group or role claims enabled
316
+
317
+ Azure AD app registration token configuration showing the ``groups`` optional claim
318
+ enabled, which allows Azure AD group or role information to be included in the token
319
+ and mapped to Airflow RBAC roles.
320
+
239
321
  Example using team based Authorization with KeyCloak
240
322
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''
241
323
  Here is an example of what you might have in your webserver_config.py: