rucio 32.8.6__py3-none-any.whl → 35.8.0__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 rucio might be problematic. Click here for more details.

Files changed (502) hide show
  1. rucio/__init__.py +0 -1
  2. rucio/alembicrevision.py +1 -2
  3. rucio/client/__init__.py +0 -1
  4. rucio/client/accountclient.py +45 -25
  5. rucio/client/accountlimitclient.py +37 -9
  6. rucio/client/baseclient.py +199 -154
  7. rucio/client/client.py +2 -3
  8. rucio/client/configclient.py +19 -6
  9. rucio/client/credentialclient.py +9 -4
  10. rucio/client/didclient.py +238 -63
  11. rucio/client/diracclient.py +13 -5
  12. rucio/client/downloadclient.py +162 -51
  13. rucio/client/exportclient.py +4 -4
  14. rucio/client/fileclient.py +3 -4
  15. rucio/client/importclient.py +4 -4
  16. rucio/client/lifetimeclient.py +21 -5
  17. rucio/client/lockclient.py +18 -8
  18. rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
  19. rucio/client/pingclient.py +0 -1
  20. rucio/client/replicaclient.py +15 -5
  21. rucio/client/requestclient.py +35 -19
  22. rucio/client/rseclient.py +133 -51
  23. rucio/client/ruleclient.py +29 -22
  24. rucio/client/scopeclient.py +8 -6
  25. rucio/client/subscriptionclient.py +47 -35
  26. rucio/client/touchclient.py +8 -4
  27. rucio/client/uploadclient.py +166 -82
  28. rucio/common/__init__.py +0 -1
  29. rucio/common/cache.py +4 -4
  30. rucio/common/config.py +52 -47
  31. rucio/common/constants.py +69 -2
  32. rucio/common/constraints.py +0 -1
  33. rucio/common/didtype.py +24 -22
  34. rucio/common/dumper/__init__.py +70 -41
  35. rucio/common/dumper/consistency.py +26 -22
  36. rucio/common/dumper/data_models.py +16 -23
  37. rucio/common/dumper/path_parsing.py +0 -1
  38. rucio/common/exception.py +281 -222
  39. rucio/common/extra.py +0 -1
  40. rucio/common/logging.py +54 -38
  41. rucio/common/pcache.py +122 -101
  42. rucio/common/plugins.py +153 -0
  43. rucio/common/policy.py +4 -4
  44. rucio/common/schema/__init__.py +17 -10
  45. rucio/common/schema/atlas.py +7 -5
  46. rucio/common/schema/belleii.py +7 -5
  47. rucio/common/schema/domatpc.py +7 -5
  48. rucio/common/schema/escape.py +7 -5
  49. rucio/common/schema/generic.py +8 -6
  50. rucio/common/schema/generic_multi_vo.py +7 -5
  51. rucio/common/schema/icecube.py +7 -5
  52. rucio/common/stomp_utils.py +0 -1
  53. rucio/common/stopwatch.py +0 -1
  54. rucio/common/test_rucio_server.py +2 -2
  55. rucio/common/types.py +262 -17
  56. rucio/common/utils.py +743 -451
  57. rucio/core/__init__.py +0 -1
  58. rucio/core/account.py +99 -29
  59. rucio/core/account_counter.py +89 -24
  60. rucio/core/account_limit.py +90 -24
  61. rucio/core/authentication.py +86 -29
  62. rucio/core/config.py +108 -38
  63. rucio/core/credential.py +14 -7
  64. rucio/core/did.py +680 -782
  65. rucio/core/did_meta_plugins/__init__.py +8 -6
  66. rucio/core/did_meta_plugins/did_column_meta.py +17 -12
  67. rucio/core/did_meta_plugins/did_meta_plugin_interface.py +60 -11
  68. rucio/core/did_meta_plugins/filter_engine.py +90 -50
  69. rucio/core/did_meta_plugins/json_meta.py +41 -16
  70. rucio/core/did_meta_plugins/mongo_meta.py +25 -8
  71. rucio/core/did_meta_plugins/postgres_meta.py +3 -4
  72. rucio/core/dirac.py +46 -17
  73. rucio/core/distance.py +66 -43
  74. rucio/core/exporter.py +5 -5
  75. rucio/core/heartbeat.py +181 -81
  76. rucio/core/identity.py +22 -12
  77. rucio/core/importer.py +23 -12
  78. rucio/core/lifetime_exception.py +32 -32
  79. rucio/core/lock.py +244 -142
  80. rucio/core/message.py +79 -38
  81. rucio/core/{meta.py → meta_conventions.py} +57 -44
  82. rucio/core/monitor.py +19 -13
  83. rucio/core/naming_convention.py +68 -27
  84. rucio/core/nongrid_trace.py +17 -5
  85. rucio/core/oidc.py +151 -29
  86. rucio/core/permission/__init__.py +18 -6
  87. rucio/core/permission/atlas.py +50 -35
  88. rucio/core/permission/belleii.py +6 -5
  89. rucio/core/permission/escape.py +8 -6
  90. rucio/core/permission/generic.py +82 -80
  91. rucio/core/permission/generic_multi_vo.py +9 -7
  92. rucio/core/quarantined_replica.py +91 -58
  93. rucio/core/replica.py +1303 -772
  94. rucio/core/replica_sorter.py +10 -12
  95. rucio/core/request.py +1133 -285
  96. rucio/core/rse.py +142 -102
  97. rucio/core/rse_counter.py +49 -18
  98. rucio/core/rse_expression_parser.py +6 -7
  99. rucio/core/rse_selector.py +41 -16
  100. rucio/core/rule.py +1538 -474
  101. rucio/core/rule_grouping.py +213 -68
  102. rucio/core/scope.py +50 -22
  103. rucio/core/subscription.py +92 -44
  104. rucio/core/topology.py +66 -24
  105. rucio/core/trace.py +42 -28
  106. rucio/core/transfer.py +543 -259
  107. rucio/core/vo.py +36 -18
  108. rucio/core/volatile_replica.py +59 -32
  109. rucio/daemons/__init__.py +0 -1
  110. rucio/daemons/abacus/__init__.py +0 -1
  111. rucio/daemons/abacus/account.py +29 -19
  112. rucio/daemons/abacus/collection_replica.py +21 -10
  113. rucio/daemons/abacus/rse.py +22 -12
  114. rucio/daemons/atropos/__init__.py +0 -1
  115. rucio/daemons/atropos/atropos.py +1 -2
  116. rucio/daemons/auditor/__init__.py +56 -28
  117. rucio/daemons/auditor/hdfs.py +17 -6
  118. rucio/daemons/auditor/srmdumps.py +116 -45
  119. rucio/daemons/automatix/__init__.py +0 -1
  120. rucio/daemons/automatix/automatix.py +30 -18
  121. rucio/daemons/badreplicas/__init__.py +0 -1
  122. rucio/daemons/badreplicas/minos.py +29 -18
  123. rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -7
  124. rucio/daemons/badreplicas/necromancer.py +9 -13
  125. rucio/daemons/bb8/__init__.py +0 -1
  126. rucio/daemons/bb8/bb8.py +10 -13
  127. rucio/daemons/bb8/common.py +151 -154
  128. rucio/daemons/bb8/nuclei_background_rebalance.py +15 -9
  129. rucio/daemons/bb8/t2_background_rebalance.py +15 -8
  130. rucio/daemons/c3po/__init__.py +0 -1
  131. rucio/daemons/c3po/algorithms/__init__.py +0 -1
  132. rucio/daemons/c3po/algorithms/simple.py +8 -5
  133. rucio/daemons/c3po/algorithms/t2_free_space.py +10 -7
  134. rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +10 -7
  135. rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +30 -15
  136. rucio/daemons/c3po/c3po.py +81 -52
  137. rucio/daemons/c3po/collectors/__init__.py +0 -1
  138. rucio/daemons/c3po/collectors/agis.py +17 -17
  139. rucio/daemons/c3po/collectors/free_space.py +32 -13
  140. rucio/daemons/c3po/collectors/jedi_did.py +14 -5
  141. rucio/daemons/c3po/collectors/mock_did.py +11 -6
  142. rucio/daemons/c3po/collectors/network_metrics.py +12 -4
  143. rucio/daemons/c3po/collectors/workload.py +21 -19
  144. rucio/daemons/c3po/utils/__init__.py +0 -1
  145. rucio/daemons/c3po/utils/dataset_cache.py +15 -5
  146. rucio/daemons/c3po/utils/expiring_dataset_cache.py +16 -5
  147. rucio/daemons/c3po/utils/expiring_list.py +6 -7
  148. rucio/daemons/c3po/utils/popularity.py +5 -2
  149. rucio/daemons/c3po/utils/timeseries.py +25 -12
  150. rucio/daemons/cache/__init__.py +0 -1
  151. rucio/daemons/cache/consumer.py +21 -15
  152. rucio/daemons/common.py +42 -18
  153. rucio/daemons/conveyor/__init__.py +0 -1
  154. rucio/daemons/conveyor/common.py +69 -37
  155. rucio/daemons/conveyor/finisher.py +83 -46
  156. rucio/daemons/conveyor/poller.py +101 -69
  157. rucio/daemons/conveyor/preparer.py +35 -28
  158. rucio/daemons/conveyor/receiver.py +64 -21
  159. rucio/daemons/conveyor/stager.py +33 -28
  160. rucio/daemons/conveyor/submitter.py +71 -47
  161. rucio/daemons/conveyor/throttler.py +99 -35
  162. rucio/daemons/follower/__init__.py +0 -1
  163. rucio/daemons/follower/follower.py +12 -8
  164. rucio/daemons/hermes/__init__.py +0 -1
  165. rucio/daemons/hermes/hermes.py +57 -21
  166. rucio/daemons/judge/__init__.py +0 -1
  167. rucio/daemons/judge/cleaner.py +27 -17
  168. rucio/daemons/judge/evaluator.py +31 -18
  169. rucio/daemons/judge/injector.py +31 -23
  170. rucio/daemons/judge/repairer.py +28 -18
  171. rucio/daemons/oauthmanager/__init__.py +0 -1
  172. rucio/daemons/oauthmanager/oauthmanager.py +7 -8
  173. rucio/daemons/reaper/__init__.py +0 -1
  174. rucio/daemons/reaper/dark_reaper.py +15 -9
  175. rucio/daemons/reaper/reaper.py +109 -67
  176. rucio/daemons/replicarecoverer/__init__.py +0 -1
  177. rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +255 -116
  178. rucio/{api → daemons/rsedecommissioner}/__init__.py +0 -1
  179. rucio/daemons/rsedecommissioner/config.py +81 -0
  180. rucio/daemons/rsedecommissioner/profiles/__init__.py +24 -0
  181. rucio/daemons/rsedecommissioner/profiles/atlas.py +60 -0
  182. rucio/daemons/rsedecommissioner/profiles/generic.py +451 -0
  183. rucio/daemons/rsedecommissioner/profiles/types.py +92 -0
  184. rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
  185. rucio/daemons/storage/__init__.py +0 -1
  186. rucio/daemons/storage/consistency/__init__.py +0 -1
  187. rucio/daemons/storage/consistency/actions.py +152 -59
  188. rucio/daemons/tracer/__init__.py +0 -1
  189. rucio/daemons/tracer/kronos.py +47 -24
  190. rucio/daemons/transmogrifier/__init__.py +0 -1
  191. rucio/daemons/transmogrifier/transmogrifier.py +35 -26
  192. rucio/daemons/undertaker/__init__.py +0 -1
  193. rucio/daemons/undertaker/undertaker.py +10 -10
  194. rucio/db/__init__.py +0 -1
  195. rucio/db/sqla/__init__.py +16 -2
  196. rucio/db/sqla/constants.py +10 -1
  197. rucio/db/sqla/migrate_repo/__init__.py +0 -1
  198. rucio/db/sqla/migrate_repo/env.py +0 -1
  199. rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -1
  200. rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -3
  201. rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +1 -3
  202. rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -3
  203. rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +1 -3
  204. rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +1 -3
  205. rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -3
  206. rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +1 -4
  207. rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -1
  208. rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -2
  209. rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -1
  210. rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -1
  211. rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -2
  212. rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -1
  213. rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +1 -3
  214. rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -1
  215. rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -3
  216. rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -1
  217. rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +1 -2
  218. rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -1
  219. rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -3
  220. rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +1 -3
  221. rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +1 -4
  222. rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -2
  223. rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -3
  224. rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -3
  225. rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +1 -2
  226. rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -1
  227. rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -1
  228. rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -2
  229. rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -3
  230. rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +1 -3
  231. rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -2
  232. rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +1 -4
  233. rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -3
  234. rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +1 -4
  235. rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -1
  236. rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +1 -3
  237. rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -2
  238. rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -3
  239. rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +1 -3
  240. rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +1 -2
  241. rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +1 -3
  242. rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +1 -3
  243. rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -2
  244. rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +1 -3
  245. rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +2 -3
  246. rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -3
  247. rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +1 -4
  248. rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -1
  249. rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -1
  250. rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -3
  251. rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -1
  252. rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -2
  253. rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -3
  254. rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -2
  255. rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +2 -4
  256. rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -2
  257. rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +1 -3
  258. rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +1 -4
  259. rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -3
  260. rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -3
  261. rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -2
  262. rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +1 -3
  263. rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -3
  264. rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +55 -0
  265. rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -2
  266. rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -2
  267. rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -3
  268. rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -3
  269. rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -3
  270. rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +1 -2
  271. rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -3
  272. rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +1 -3
  273. rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +1 -3
  274. rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +1 -2
  275. rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -3
  276. rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -3
  277. rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +1 -2
  278. rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +2 -4
  279. rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -1
  280. rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +1 -4
  281. rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -2
  282. rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -3
  283. rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +1 -2
  284. rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -3
  285. rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +1 -3
  286. rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -3
  287. rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -1
  288. rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +1 -2
  289. rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -2
  290. rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +55 -0
  291. rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +1 -3
  292. rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -2
  293. rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +1 -4
  294. rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -1
  295. rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -1
  296. rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +1 -3
  297. rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +1 -4
  298. rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -1
  299. rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +57 -0
  300. rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -3
  301. rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +41 -0
  302. rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +1 -2
  303. rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +1 -3
  304. rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -3
  305. rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +1 -5
  306. rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +1 -3
  307. rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -3
  308. rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +1 -3
  309. rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +1 -2
  310. rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -3
  311. rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +1 -4
  312. rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +1 -2
  313. rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +1 -4
  314. rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +1 -3
  315. rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +1 -4
  316. rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -2
  317. rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +1 -3
  318. rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -3
  319. rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +1 -3
  320. rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -1
  321. rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +1 -2
  322. rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +1 -3
  323. rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -2
  324. rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -1
  325. rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +1 -2
  326. rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -3
  327. rucio/db/sqla/models.py +122 -216
  328. rucio/db/sqla/sautils.py +12 -5
  329. rucio/db/sqla/session.py +71 -43
  330. rucio/db/sqla/types.py +3 -4
  331. rucio/db/sqla/util.py +91 -69
  332. rucio/gateway/__init__.py +13 -0
  333. rucio/{api → gateway}/account.py +119 -46
  334. rucio/{api → gateway}/account_limit.py +12 -13
  335. rucio/{api → gateway}/authentication.py +106 -33
  336. rucio/{api → gateway}/config.py +12 -13
  337. rucio/{api → gateway}/credential.py +15 -4
  338. rucio/{api → gateway}/did.py +384 -140
  339. rucio/{api → gateway}/dirac.py +16 -6
  340. rucio/{api → gateway}/exporter.py +3 -4
  341. rucio/{api → gateway}/heartbeat.py +17 -5
  342. rucio/{api → gateway}/identity.py +63 -19
  343. rucio/{api → gateway}/importer.py +3 -4
  344. rucio/{api → gateway}/lifetime_exception.py +35 -10
  345. rucio/{api → gateway}/lock.py +34 -12
  346. rucio/{api/meta.py → gateway/meta_conventions.py} +18 -16
  347. rucio/{api → gateway}/permission.py +4 -5
  348. rucio/{api → gateway}/quarantined_replica.py +13 -4
  349. rucio/{api → gateway}/replica.py +12 -11
  350. rucio/{api → gateway}/request.py +129 -28
  351. rucio/{api → gateway}/rse.py +11 -12
  352. rucio/{api → gateway}/rule.py +117 -35
  353. rucio/{api → gateway}/scope.py +24 -14
  354. rucio/{api → gateway}/subscription.py +65 -43
  355. rucio/{api → gateway}/vo.py +17 -7
  356. rucio/rse/__init__.py +3 -4
  357. rucio/rse/protocols/__init__.py +0 -1
  358. rucio/rse/protocols/bittorrent.py +184 -0
  359. rucio/rse/protocols/cache.py +1 -2
  360. rucio/rse/protocols/dummy.py +1 -2
  361. rucio/rse/protocols/gfal.py +12 -10
  362. rucio/rse/protocols/globus.py +7 -7
  363. rucio/rse/protocols/gsiftp.py +2 -3
  364. rucio/rse/protocols/http_cache.py +1 -2
  365. rucio/rse/protocols/mock.py +1 -2
  366. rucio/rse/protocols/ngarc.py +1 -2
  367. rucio/rse/protocols/posix.py +12 -13
  368. rucio/rse/protocols/protocol.py +116 -52
  369. rucio/rse/protocols/rclone.py +6 -7
  370. rucio/rse/protocols/rfio.py +4 -5
  371. rucio/rse/protocols/srm.py +9 -10
  372. rucio/rse/protocols/ssh.py +8 -9
  373. rucio/rse/protocols/storm.py +2 -3
  374. rucio/rse/protocols/webdav.py +17 -14
  375. rucio/rse/protocols/xrootd.py +23 -17
  376. rucio/rse/rsemanager.py +19 -7
  377. rucio/tests/__init__.py +0 -1
  378. rucio/tests/common.py +43 -17
  379. rucio/tests/common_server.py +3 -3
  380. rucio/transfertool/__init__.py +0 -1
  381. rucio/transfertool/bittorrent.py +199 -0
  382. rucio/transfertool/bittorrent_driver.py +52 -0
  383. rucio/transfertool/bittorrent_driver_qbittorrent.py +133 -0
  384. rucio/transfertool/fts3.py +250 -138
  385. rucio/transfertool/fts3_plugins.py +152 -0
  386. rucio/transfertool/globus.py +9 -8
  387. rucio/transfertool/globus_library.py +1 -2
  388. rucio/transfertool/mock.py +21 -12
  389. rucio/transfertool/transfertool.py +33 -24
  390. rucio/vcsversion.py +4 -4
  391. rucio/version.py +5 -13
  392. rucio/web/__init__.py +0 -1
  393. rucio/web/rest/__init__.py +0 -1
  394. rucio/web/rest/flaskapi/__init__.py +0 -1
  395. rucio/web/rest/flaskapi/authenticated_bp.py +0 -1
  396. rucio/web/rest/flaskapi/v1/__init__.py +0 -1
  397. rucio/web/rest/flaskapi/v1/accountlimits.py +15 -13
  398. rucio/web/rest/flaskapi/v1/accounts.py +49 -48
  399. rucio/web/rest/flaskapi/v1/archives.py +12 -10
  400. rucio/web/rest/flaskapi/v1/auth.py +146 -144
  401. rucio/web/rest/flaskapi/v1/common.py +82 -41
  402. rucio/web/rest/flaskapi/v1/config.py +5 -6
  403. rucio/web/rest/flaskapi/v1/credentials.py +7 -8
  404. rucio/web/rest/flaskapi/v1/dids.py +158 -28
  405. rucio/web/rest/flaskapi/v1/dirac.py +8 -8
  406. rucio/web/rest/flaskapi/v1/export.py +3 -5
  407. rucio/web/rest/flaskapi/v1/heartbeats.py +3 -5
  408. rucio/web/rest/flaskapi/v1/identities.py +3 -5
  409. rucio/web/rest/flaskapi/v1/import.py +3 -4
  410. rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +6 -9
  411. rucio/web/rest/flaskapi/v1/locks.py +2 -4
  412. rucio/web/rest/flaskapi/v1/main.py +10 -2
  413. rucio/web/rest/flaskapi/v1/{meta.py → meta_conventions.py} +26 -11
  414. rucio/web/rest/flaskapi/v1/metrics.py +1 -2
  415. rucio/web/rest/flaskapi/v1/nongrid_traces.py +4 -4
  416. rucio/web/rest/flaskapi/v1/ping.py +6 -7
  417. rucio/web/rest/flaskapi/v1/redirect.py +8 -9
  418. rucio/web/rest/flaskapi/v1/replicas.py +43 -19
  419. rucio/web/rest/flaskapi/v1/requests.py +178 -21
  420. rucio/web/rest/flaskapi/v1/rses.py +61 -26
  421. rucio/web/rest/flaskapi/v1/rules.py +48 -18
  422. rucio/web/rest/flaskapi/v1/scopes.py +3 -5
  423. rucio/web/rest/flaskapi/v1/subscriptions.py +22 -18
  424. rucio/web/rest/flaskapi/v1/traces.py +4 -4
  425. rucio/web/rest/flaskapi/v1/types.py +20 -0
  426. rucio/web/rest/flaskapi/v1/vos.py +3 -5
  427. rucio/web/rest/main.py +0 -1
  428. rucio/web/rest/metrics.py +0 -1
  429. rucio/web/rest/ping.py +27 -0
  430. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/ldap.cfg.template +1 -1
  431. rucio-35.8.0.data/data/rucio/requirements.server.txt +268 -0
  432. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/bootstrap.py +3 -3
  433. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/merge_rucio_configs.py +2 -5
  434. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/reset_database.py +3 -3
  435. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio +87 -85
  436. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-account +0 -1
  437. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-collection-replica +0 -1
  438. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-rse +0 -1
  439. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-admin +45 -32
  440. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-atropos +0 -1
  441. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-auditor +13 -7
  442. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-automatix +1 -2
  443. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-bb8 +0 -1
  444. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-c3po +0 -1
  445. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-client +2 -3
  446. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-consumer +0 -1
  447. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-finisher +1 -2
  448. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-poller +0 -1
  449. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-preparer +0 -1
  450. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-receiver +0 -1
  451. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-stager +0 -1
  452. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-submitter +2 -3
  453. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-throttler +0 -1
  454. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dark-reaper +0 -1
  455. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dumper +11 -10
  456. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-follower +0 -1
  457. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-hermes +0 -1
  458. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-cleaner +0 -1
  459. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-evaluator +2 -3
  460. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-injector +0 -1
  461. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-repairer +0 -1
  462. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-kronos +1 -3
  463. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos +0 -1
  464. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos-temporary-expiration +0 -1
  465. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-necromancer +1 -2
  466. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-oauth-manager +2 -3
  467. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-reaper +0 -1
  468. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-replica-recoverer +6 -7
  469. rucio-35.8.0.data/scripts/rucio-rse-decommissioner +66 -0
  470. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-storage-consistency-actions +0 -1
  471. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-transmogrifier +0 -1
  472. {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-undertaker +1 -2
  473. rucio-35.8.0.dist-info/METADATA +72 -0
  474. rucio-35.8.0.dist-info/RECORD +493 -0
  475. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/WHEEL +1 -1
  476. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
  477. rucio/api/temporary_did.py +0 -49
  478. rucio/common/schema/cms.py +0 -478
  479. rucio/common/schema/lsst.py +0 -423
  480. rucio/core/permission/cms.py +0 -1166
  481. rucio/core/temporary_did.py +0 -188
  482. rucio/daemons/reaper/light_reaper.py +0 -255
  483. rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
  484. rucio-32.8.6.data/data/rucio/requirements.txt +0 -55
  485. rucio-32.8.6.data/scripts/rucio-light-reaper +0 -53
  486. rucio-32.8.6.dist-info/METADATA +0 -83
  487. rucio-32.8.6.dist-info/RECORD +0 -481
  488. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic.ini.template +0 -0
  489. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
  490. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
  491. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
  492. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
  493. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
  494. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
  495. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
  496. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
  497. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
  498. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
  499. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
  500. {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
  501. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/LICENSE +0 -0
  502. {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  # Copyright European Organization for Nuclear Research (CERN) since 2012
3
2
  #
4
3
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,36 +12,44 @@
13
12
  # See the License for the specific language governing permissions and
14
13
  # limitations under the License.
15
14
 
16
- import base64
17
15
  import json
18
16
  import logging
19
17
  import time
20
18
  from typing import TYPE_CHECKING
21
19
  from urllib.parse import urlparse
22
20
 
23
- from flask import Flask, Blueprint, request, Response, redirect, render_template
21
+ from flask import Blueprint, Flask, Response, redirect, render_template, request
24
22
  from werkzeug.datastructures import Headers
25
23
 
26
- from rucio.api.authentication import get_auth_token_user_pass, get_auth_token_gss, get_auth_token_x509, \
27
- get_auth_token_ssh, get_ssh_challenge_token, validate_auth_token, get_auth_oidc, redirect_auth_oidc, \
28
- get_token_oidc, refresh_cli_auth_token, get_auth_token_saml
29
- from rucio.api.identity import list_accounts_for_identity, get_default_account, verify_identity
30
24
  from rucio.common.config import config_get
31
- from rucio.common.exception import AccessDenied, IdentityError, IdentityNotFound, CannotAuthenticate, CannotAuthorize
25
+ from rucio.common.exception import AccessDenied, CannotAuthenticate, CannotAuthorize, IdentityError, IdentityNotFound
32
26
  from rucio.common.extra import import_extras
33
27
  from rucio.common.utils import date_to_str
34
28
  from rucio.core.authentication import strip_x509_proxy_attributes
35
- from rucio.web.rest.flaskapi.v1.common import check_accept_header_wrapper_flask, error_headers, \
36
- extract_vo, generate_http_error_flask, ErrorHandlingMethodView
29
+ from rucio.gateway.authentication import (
30
+ get_auth_oidc,
31
+ get_auth_token_gss,
32
+ get_auth_token_saml,
33
+ get_auth_token_ssh,
34
+ get_auth_token_user_pass,
35
+ get_auth_token_x509,
36
+ get_ssh_challenge_token,
37
+ get_token_oidc,
38
+ redirect_auth_oidc,
39
+ refresh_cli_auth_token,
40
+ validate_auth_token,
41
+ )
42
+ from rucio.web.rest.flaskapi.v1.common import ErrorHandlingMethodView, check_accept_header_wrapper_flask, error_headers, extract_vo, generate_http_error_flask, get_account_from_verified_identity
37
43
 
38
44
  if TYPE_CHECKING:
39
- from typing import Optional
40
- from rucio.web.rest.flaskapi.v1.common import HeadersType
45
+
46
+ from flask.typing import ResponseReturnValue
41
47
 
42
48
  EXTRA_MODULES = import_extras(['onelogin'])
43
49
 
44
50
  if EXTRA_MODULES['onelogin']:
45
51
  from onelogin.saml2.auth import OneLogin_Saml2_Auth # pylint: disable=import-error
52
+
46
53
  from rucio.web.ui.flask.common.utils import prepare_saml_request
47
54
 
48
55
 
@@ -51,16 +58,16 @@ class UserPass(ErrorHandlingMethodView):
51
58
  Authenticate a Rucio account temporarily via username and password.
52
59
  """
53
60
 
54
- def get_headers(self) -> "Optional[HeadersType]":
61
+ def get_headers(self) -> Headers:
55
62
  headers = Headers()
56
- headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
57
- headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
63
+ headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN') # type: ignore (value could be None)
64
+ headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS') # type: ignore (value could be None)
58
65
  headers['Access-Control-Allow-Methods'] = '*'
59
66
  headers['Access-Control-Allow-Credentials'] = 'true'
60
67
  headers['Access-Control-Expose-Headers'] = 'X-Rucio-Auth-Token, X-Rucio-Auth-Token-Expires, X-Rucio-Auth-Account, X-Rucio-Auth-Accounts'
61
68
  return headers
62
69
 
63
- def options(self):
70
+ def options(self) -> 'ResponseReturnValue':
64
71
  """
65
72
  ---
66
73
  summary: UserPass Allow cross-site scripting
@@ -96,7 +103,7 @@ class UserPass(ErrorHandlingMethodView):
96
103
  return '', 200, self.get_headers()
97
104
 
98
105
  @check_accept_header_wrapper_flask(['application/octet-stream'])
99
- def get(self):
106
+ def get(self) -> 'ResponseReturnValue':
100
107
  """
101
108
  ---
102
109
  summary: UserPass
@@ -178,48 +185,49 @@ class UserPass(ErrorHandlingMethodView):
178
185
  headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
179
186
  headers.add('Cache-Control', 'post-check=0, pre-check=0')
180
187
  headers['Pragma'] = 'no-cache'
181
-
182
188
  vo = extract_vo(request.headers)
183
189
  account = request.headers.get('X-Rucio-Account', default=None)
184
190
  username = request.headers.get('X-Rucio-Username', default=None)
185
191
  password = request.headers.get('X-Rucio-Password', default=None)
186
192
  appid = request.headers.get('X-Rucio-AppID', default='unknown')
187
193
  ip = request.headers.get('X-Forwarded-For', default=request.remote_addr)
188
-
189
194
  if not username or not password:
190
195
  return generate_http_error_flask(401, CannotAuthenticate.__name__, 'Cannot authenticate without passing all required arguments', headers=headers)
191
196
 
197
+ accounts: list[str] = []
192
198
  if not account:
193
- accounts = list_accounts_for_identity(identity_key=username, id_type='USERPASS')
194
- if accounts is None or len(accounts) == 0:
195
- try:
196
- verify_identity(identity_key=username, id_type='USERPASS', password=password)
197
- except IdentityNotFound:
198
- return generate_http_error_flask(401, IdentityNotFound.__name__, 'Cannot authenticate. Username/Password pair does not exist.', headers=headers)
199
- except IdentityError:
200
- return generate_http_error_flask(401, IdentityError.__name__, 'Cannot authenticate. The identity does not exist.', headers=headers)
201
- return generate_http_error_flask(401, CannotAuthenticate.__name__, 'Cannot authenticate with provided username or password. Identity is not mapped to any accounts.', headers=headers)
202
- if len(accounts) > 1:
203
- try:
204
- account = get_default_account(identity_key=username, id_type='USERPASS')
205
- except IdentityError:
206
- headers['X-Rucio-Auth-Accounts'] = ','.join(accounts)
207
- return json.dumps(accounts), 206, headers
208
- else:
209
- account = accounts[0]
199
+ try:
200
+ accounts = get_account_from_verified_identity(identity_key=username, id_type='USERPASS', password=password)
201
+ except IdentityNotFound:
202
+ return generate_http_error_flask(401, IdentityNotFound.__name__, 'Cannot authenticate. Username/Password pair does not exist.', headers=headers)
203
+ except IdentityError:
204
+ return generate_http_error_flask(401, IdentityError.__name__, 'Cannot authenticate. The identity does not exist.', headers=headers)
205
+ else:
206
+ accounts = [account]
207
+
208
+ if len(accounts) > 1:
209
+ account_names: list[str] = []
210
+ for account in accounts:
211
+ if isinstance(account, str):
212
+ account_names.append(account)
213
+ else:
214
+ account_names.append(account.external)
215
+ headers['X-Rucio-Auth-Accounts'] = ','.join(accounts)
216
+ return json.dumps(account_names), 206, headers
217
+
218
+ account = accounts[0]
210
219
  account_name = account if isinstance(account, str) else account.external
211
220
  try:
212
221
  result = get_auth_token_user_pass(account_name, username, password, appid, ip, vo=vo)
222
+ if not result:
223
+ return generate_http_error_flask(401, CannotAuthenticate.__name__, f'Cannot authenticate to account {account} with given credentials', headers=headers)
224
+ headers['X-Rucio-Auth-Account'] = account_name
225
+ headers['X-Rucio-Auth-Token'] = result['token']
226
+ headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at']) # type: ignore (value could be None)
227
+ return '', 200, headers
213
228
  except AccessDenied:
214
229
  return generate_http_error_flask(401, CannotAuthenticate.__name__, f'Cannot authenticate to account {account} with given credentials', headers=headers)
215
230
 
216
- if not result:
217
- return generate_http_error_flask(401, CannotAuthenticate.__name__, f'Cannot authenticate to account {account} with given credentials', headers=headers)
218
- headers['X-Rucio-Auth-Account'] = account_name
219
- headers['X-Rucio-Auth-Token'] = result['token']
220
- headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at'])
221
- return '', 200, headers
222
-
223
231
 
224
232
  class OIDC(ErrorHandlingMethodView):
225
233
  """
@@ -227,15 +235,15 @@ class OIDC(ErrorHandlingMethodView):
227
235
  nonce, Rucio OIDC Client ID with the correct issuers authentication endpoint).
228
236
  """
229
237
 
230
- def get_headers(self) -> "Optional[HeadersType]":
238
+ def get_headers(self) -> Headers:
231
239
  headers = Headers()
232
- headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
233
- headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
240
+ headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN') # type: ignore (value could be None)
241
+ headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS') # type: ignore (value could be None)
234
242
  headers['Access-Control-Allow-Methods'] = '*'
235
243
  headers['Access-Control-Allow-Credentials'] = 'true'
236
244
  return headers
237
245
 
238
- def options(self):
246
+ def options(self) -> 'ResponseReturnValue':
239
247
  """
240
248
  ---
241
249
  summary: OIDC Allow cross-site scripting
@@ -267,7 +275,7 @@ class OIDC(ErrorHandlingMethodView):
267
275
  return '', 200, self.get_headers()
268
276
 
269
277
  @check_accept_header_wrapper_flask(['application/octet-stream'])
270
- def get(self):
278
+ def get(self) -> 'ResponseReturnValue':
271
279
  """
272
280
  ---
273
281
  summary: OIDC
@@ -374,15 +382,15 @@ class RedirectOIDC(ErrorHandlingMethodView):
374
382
  an Identity Provider (XDC IAM as of June 2019).
375
383
  """
376
384
 
377
- def get_headers(self) -> "Optional[HeadersType]":
385
+ def get_headers(self) -> Headers:
378
386
  headers = Headers()
379
- headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN'))
380
- headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS'))
387
+ headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN')) # type: ignore (value could be None)
388
+ headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')) # type: ignore (value could be None)
381
389
  headers.set('Access-Control-Allow-Methods', '*')
382
390
  headers.set('Access-Control-Allow-Credentials', 'true')
383
391
  return headers
384
392
 
385
- def options(self):
393
+ def options(self) -> 'ResponseReturnValue':
386
394
  """
387
395
  ---
388
396
  summary: RedirectOIDC Allow cross-site scripting
@@ -413,7 +421,7 @@ class RedirectOIDC(ErrorHandlingMethodView):
413
421
  return '', 200, self.get_headers()
414
422
 
415
423
  @check_accept_header_wrapper_flask(['application/octet-stream', 'text/html'])
416
- def get(self):
424
+ def get(self) -> 'ResponseReturnValue':
417
425
  """
418
426
  ---
419
427
  summary: RedirectOIDC
@@ -489,15 +497,15 @@ class CodeOIDC(ErrorHandlingMethodView):
489
497
  operation is confirmed waiting for the Rucio client to get the token automatically.
490
498
  """
491
499
 
492
- def get_headers(self) -> "Optional[HeadersType]":
500
+ def get_headers(self) -> Headers:
493
501
  headers = Headers()
494
- headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN'))
495
- headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS'))
502
+ headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN')) # type: ignore (value could be None)
503
+ headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')) # type: ignore (value could be None)
496
504
  headers.set('Access-Control-Allow-Methods', '*')
497
505
  headers.set('Access-Control-Allow-Credentials', 'true')
498
506
  return headers
499
507
 
500
- def options(self):
508
+ def options(self) -> 'ResponseReturnValue':
501
509
  """
502
510
  ---
503
511
  summary: CodeOIDC Allow cross-site scripting
@@ -528,7 +536,7 @@ class CodeOIDC(ErrorHandlingMethodView):
528
536
  return '', 200, self.get_headers()
529
537
 
530
538
  @check_accept_header_wrapper_flask(['application/octet-stream', 'text/html'])
531
- def get(self):
539
+ def get(self) -> 'ResponseReturnValue':
532
540
  """
533
541
  ---
534
542
  summary: CodeOIDC
@@ -586,15 +594,15 @@ class TokenOIDC(ErrorHandlingMethodView):
586
594
  received from an Identity Provider.
587
595
  """
588
596
 
589
- def get_headers(self) -> "Optional[HeadersType]":
597
+ def get_headers(self) -> Headers:
590
598
  headers = Headers()
591
- headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN'))
592
- headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS'))
599
+ headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN')) # type: ignore (value could be None)
600
+ headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')) # type: ignore (value could be None)
593
601
  headers.set('Access-Control-Allow-Methods', '*')
594
602
  headers.set('Access-Control-Allow-Credentials', 'true')
595
603
  return headers
596
604
 
597
- def options(self):
605
+ def options(self) -> 'ResponseReturnValue':
598
606
  """
599
607
  ---
600
608
  summary: TokenOIDC Allow cross-site scripting
@@ -625,7 +633,7 @@ class TokenOIDC(ErrorHandlingMethodView):
625
633
  return '', 200, self.get_headers()
626
634
 
627
635
  @check_accept_header_wrapper_flask(['application/octet-stream'])
628
- def get(self):
636
+ def get(self) -> 'ResponseReturnValue':
629
637
  """
630
638
  ---
631
639
  summary: TokenOIDC
@@ -671,7 +679,7 @@ class TokenOIDC(ErrorHandlingMethodView):
671
679
  return generate_http_error_flask(401, CannotAuthorize.__name__, 'Cannot authorize token request.', headers=headers)
672
680
  if 'token' in result and 'webhome' not in result:
673
681
  headers.set('X-Rucio-Auth-Token', result['token']['token'])
674
- headers.set('X-Rucio-Auth-Token-Expires', date_to_str(result['token']['expires_at']))
682
+ headers.set('X-Rucio-Auth-Token-Expires', date_to_str(result['token']['expires_at'])) # type: ignore (value could be None)
675
683
  return '', 200, headers
676
684
  elif 'webhome' in result:
677
685
  webhome = result['webhome']
@@ -700,16 +708,16 @@ class RefreshOIDC(ErrorHandlingMethodView):
700
708
  is a result of a previous refresh happening in the last 10 min, the same token will be returned.
701
709
  """
702
710
 
703
- def get_headers(self) -> "Optional[HeadersType]":
711
+ def get_headers(self) -> Headers:
704
712
  headers = Headers()
705
- headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN'))
706
- headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS'))
713
+ headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN')) # type: ignore (value could be None)
714
+ headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')) # type: ignore (value could be None)
707
715
  headers.set('Access-Control-Allow-Methods', '*')
708
716
  headers.set('Access-Control-Allow-Credentials', 'true')
709
717
  headers.set('Access-Control-Expose-Headers', 'X-Rucio-Auth-Token')
710
718
  return headers
711
719
 
712
- def options(self):
720
+ def options(self) -> 'ResponseReturnValue':
713
721
  """
714
722
  ---
715
723
  summary: RefreshOIDC Allow cross-site scripting
@@ -744,7 +752,7 @@ class RefreshOIDC(ErrorHandlingMethodView):
744
752
  return '', 200, self.get_headers()
745
753
 
746
754
  @check_accept_header_wrapper_flask(['application/octet-stream'])
747
- def get(self):
755
+ def get(self) -> 'ResponseReturnValue':
748
756
  """
749
757
  ---
750
758
  summary: RefreshOIDC
@@ -809,16 +817,16 @@ class GSS(ErrorHandlingMethodView):
809
817
  Authenticate a Rucio account temporarily via a GSS token.
810
818
  """
811
819
 
812
- def get_headers(self) -> "Optional[HeadersType]":
820
+ def get_headers(self) -> Headers:
813
821
  headers = Headers()
814
- headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
815
- headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
822
+ headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN') # type: ignore (value could be None)
823
+ headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS') # type: ignore (value could be None)
816
824
  headers['Access-Control-Allow-Methods'] = '*'
817
825
  headers['Access-Control-Allow-Credentials'] = 'true'
818
826
  headers['Access-Control-Expose-Headers'] = 'X-Rucio-Auth-Token'
819
827
  return headers
820
828
 
821
- def options(self):
829
+ def options(self) -> 'ResponseReturnValue':
822
830
  """
823
831
  ---
824
832
  summary: GSS Allow cross-site scripting
@@ -853,7 +861,7 @@ class GSS(ErrorHandlingMethodView):
853
861
  return '', 200, self.get_headers()
854
862
 
855
863
  @check_accept_header_wrapper_flask(['application/octet-stream'])
856
- def get(self):
864
+ def get(self) -> 'ResponseReturnValue':
857
865
  """
858
866
  ---
859
867
  summary: GSS
@@ -927,7 +935,7 @@ class GSS(ErrorHandlingMethodView):
927
935
  )
928
936
 
929
937
  headers['X-Rucio-Auth-Token'] = result['token']
930
- headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at'])
938
+ headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at']) # type: ignore (value could be None)
931
939
  return '', 200, headers
932
940
 
933
941
 
@@ -936,16 +944,16 @@ class x509(ErrorHandlingMethodView):
936
944
  Authenticate a Rucio account temporarily via an x509 certificate.
937
945
  """
938
946
 
939
- def get_headers(self) -> "Optional[HeadersType]":
947
+ def get_headers(self) -> Headers:
940
948
  headers = Headers()
941
- headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
942
- headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
949
+ headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN') # type: ignore (value could be None)
950
+ headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS') # type: ignore (value could be None)
943
951
  headers['Access-Control-Allow-Methods'] = '*'
944
952
  headers['Access-Control-Allow-Credentials'] = 'true'
945
953
  headers['Access-Control-Expose-Headers'] = 'X-Rucio-Auth-Token, X-Rucio-Auth-Token-Expires, X-Rucio-Auth-Account, X-Rucio-Auth-Accounts'
946
954
  return headers
947
955
 
948
- def options(self):
956
+ def options(self) -> 'ResponseReturnValue':
949
957
  """
950
958
  ---
951
959
  summary: x509 Allow cross-site scripting
@@ -980,7 +988,7 @@ class x509(ErrorHandlingMethodView):
980
988
  return '', 200, self.get_headers()
981
989
 
982
990
  @check_accept_header_wrapper_flask(['application/octet-stream'])
983
- def get(self):
991
+ def get(self) -> 'ResponseReturnValue':
984
992
  """
985
993
  ---
986
994
  summary: x509
@@ -1048,39 +1056,45 @@ class x509(ErrorHandlingMethodView):
1048
1056
  ip = request.headers.get('X-Forwarded-For', default=request.remote_addr)
1049
1057
  return_multiple_accounts = request.headers.get('X-Rucio-Allow-Return-Multiple-Accounts', default=None)
1050
1058
 
1059
+ accounts: list[str] = []
1060
+ if not account:
1061
+ try:
1062
+ accounts = get_account_from_verified_identity(identity_key=dn, id_type='X509')
1063
+ except IdentityError as e:
1064
+ return generate_http_error_flask(401, IdentityError.__name__, str(e), headers=headers)
1065
+ else:
1066
+ accounts = [account]
1067
+
1068
+ if len(accounts) > 1:
1069
+ if return_multiple_accounts is None or return_multiple_accounts.lower() != 'true':
1070
+ return generate_http_error_flask(401, CannotAuthenticate.__name__, 'Multiple accounts associated with the provided identity', headers=headers)
1071
+ account_names: list[str] = []
1072
+ for account in accounts:
1073
+ if isinstance(account, str):
1074
+ account_names.append(account)
1075
+ else:
1076
+ account_names.append(account.external)
1077
+ headers['X-Rucio-Auth-Accounts'] = ','.join(accounts)
1078
+ return json.dumps(account_names), 206, headers
1079
+ account = accounts[0]
1080
+ account_name = account if isinstance(account, str) else account.external
1051
1081
  result = None
1052
1082
  try:
1053
- result = get_auth_token_x509(account, dn, appid, ip, vo=vo)
1083
+ result = get_auth_token_x509(account_name, dn, appid, ip, vo=vo)
1054
1084
  except AccessDenied:
1055
1085
  return generate_http_error_flask(
1056
1086
  status_code=401,
1057
1087
  exc=CannotAuthenticate.__name__,
1058
- exc_msg=f'Cannot authenticate to account {account} with given credentials',
1088
+ exc_msg=f'Cannot authenticate to account {account_name} with given credentials',
1089
+ headers=headers
1090
+ )
1091
+ except IdentityError as e:
1092
+ return generate_http_error_flask(
1093
+ status_code=401,
1094
+ exc=CannotAuthenticate.__name__,
1095
+ exc_msg=str(e),
1059
1096
  headers=headers
1060
1097
  )
1061
- except IdentityError:
1062
- if not return_multiple_accounts:
1063
- return generate_http_error_flask(
1064
- status_code=401,
1065
- exc=CannotAuthenticate.__name__,
1066
- exc_msg=f'No default account set for {dn}',
1067
- headers=headers
1068
- )
1069
- accounts = list_accounts_for_identity(identity_key=dn, id_type='X509')
1070
- if len(accounts) == 1:
1071
- account = accounts[0]
1072
- account_name = account if isinstance(account, str) else account.external
1073
- result = get_auth_token_x509(account_name, dn, appid, ip, vo=vo)
1074
- elif len(accounts) > 1:
1075
- headers['X-Rucio-Auth-Accounts'] = ','.join(accounts)
1076
- return json.dumps(accounts), 206, headers
1077
- else:
1078
- return generate_http_error_flask(
1079
- status_code=401,
1080
- exc=CannotAuthenticate.__name__,
1081
- exc_msg=f'No account set for {dn}',
1082
- headers=headers
1083
- )
1084
1098
 
1085
1099
  if not result:
1086
1100
  return generate_http_error_flask(
@@ -1090,7 +1104,7 @@ class x509(ErrorHandlingMethodView):
1090
1104
  headers=headers
1091
1105
  )
1092
1106
  headers['X-Rucio-Auth-Token'] = result['token']
1093
- headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at'])
1107
+ headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at']) # type: ignore (value could be None)
1094
1108
  headers['X-Rucio-Auth-Account'] = account
1095
1109
  return '', 200, headers
1096
1110
 
@@ -1100,16 +1114,16 @@ class SSH(ErrorHandlingMethodView):
1100
1114
  Authenticate a Rucio account temporarily via SSH key exchange.
1101
1115
  """
1102
1116
 
1103
- def get_headers(self) -> "Optional[HeadersType]":
1117
+ def get_headers(self) -> Headers:
1104
1118
  headers = Headers()
1105
- headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
1106
- headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
1119
+ headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN') # type: ignore (value could be None)
1120
+ headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS') # type: ignore (value could be None)
1107
1121
  headers['Access-Control-Allow-Methods'] = '*'
1108
1122
  headers['Access-Control-Allow-Credentials'] = 'true'
1109
1123
  headers['Access-Control-Expose-Headers'] = 'X-Rucio-Auth-Token'
1110
1124
  return headers
1111
1125
 
1112
- def options(self):
1126
+ def options(self) -> 'ResponseReturnValue':
1113
1127
  """
1114
1128
  ---
1115
1129
  summary: SSH Allow cross-site scripting
@@ -1144,7 +1158,7 @@ class SSH(ErrorHandlingMethodView):
1144
1158
  return '', 200, self.get_headers()
1145
1159
 
1146
1160
  @check_accept_header_wrapper_flask(['application/octet-stream'])
1147
- def get(self):
1161
+ def get(self) -> 'ResponseReturnValue':
1148
1162
  """
1149
1163
  ---
1150
1164
  summary: SSH
@@ -1198,18 +1212,6 @@ class SSH(ErrorHandlingMethodView):
1198
1212
  appid = request.headers.get('X-Rucio-AppID', default='unknown')
1199
1213
  ip = request.headers.get('X-Forwarded-For', default=request.remote_addr)
1200
1214
 
1201
- # decode the signature which must come in base64 encoded
1202
- try:
1203
- signature += '=' * ((4 - len(signature) % 4) % 4) # adding required padding
1204
- signature = base64.b64decode(signature)
1205
- except TypeError:
1206
- return generate_http_error_flask(
1207
- status_code=401,
1208
- exc=CannotAuthenticate.__name__,
1209
- exc_msg=f'Cannot authenticate to account {account} with malformed signature',
1210
- headers=headers
1211
- )
1212
-
1213
1215
  try:
1214
1216
  result = get_auth_token_ssh(account, signature, appid, ip, vo=vo)
1215
1217
  except AccessDenied:
@@ -1229,7 +1231,7 @@ class SSH(ErrorHandlingMethodView):
1229
1231
  )
1230
1232
 
1231
1233
  headers['X-Rucio-Auth-Token'] = result['token']
1232
- headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at'])
1234
+ headers['X-Rucio-Auth-Token-Expires'] = date_to_str(result['expires_at']) # type: ignore (value could be None)
1233
1235
  return '', 200, headers
1234
1236
 
1235
1237
 
@@ -1238,16 +1240,16 @@ class SSHChallengeToken(ErrorHandlingMethodView):
1238
1240
  Request a challenge token for SSH authentication
1239
1241
  """
1240
1242
 
1241
- def get_headers(self) -> "Optional[HeadersType]":
1243
+ def get_headers(self) -> Headers:
1242
1244
  headers = Headers()
1243
- headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
1244
- headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
1245
+ headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN') # type: ignore (value could be None)
1246
+ headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS') # type: ignore (value could be None)
1245
1247
  headers['Access-Control-Allow-Methods'] = '*'
1246
1248
  headers['Access-Control-Allow-Credentials'] = 'true'
1247
1249
  headers['Access-Control-Expose-Headers'] = 'X-Rucio-Auth-Token'
1248
1250
  return headers
1249
1251
 
1250
- def options(self):
1252
+ def options(self) -> 'ResponseReturnValue':
1251
1253
  """
1252
1254
  ---
1253
1255
  summary: SSHChallengeToken Allow cross-site scripting
@@ -1282,7 +1284,7 @@ class SSHChallengeToken(ErrorHandlingMethodView):
1282
1284
  return '', 200, self.get_headers()
1283
1285
 
1284
1286
  @check_accept_header_wrapper_flask(['application/octet-stream'])
1285
- def get(self):
1287
+ def get(self) -> 'ResponseReturnValue':
1286
1288
  """
1287
1289
  ---
1288
1290
  summary: SSHChallengeToken
@@ -1341,7 +1343,7 @@ class SSHChallengeToken(ErrorHandlingMethodView):
1341
1343
  )
1342
1344
 
1343
1345
  headers['X-Rucio-SSH-Challenge-Token'] = result['token']
1344
- headers['X-Rucio-SSH-Challenge-Token-Expires'] = date_to_str(result['expires_at'])
1346
+ headers['X-Rucio-SSH-Challenge-Token-Expires'] = date_to_str(result['expires_at']) # type: ignore (value could be None)
1345
1347
  return '', 200, headers
1346
1348
 
1347
1349
 
@@ -1350,16 +1352,16 @@ class SAML(ErrorHandlingMethodView):
1350
1352
  Authenticate a Rucio account temporarily via CERN SSO.
1351
1353
  """
1352
1354
 
1353
- def get_headers(self) -> "Optional[HeadersType]":
1355
+ def get_headers(self) -> Headers:
1354
1356
  headers = Headers()
1355
- headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN'))
1356
- headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS'))
1357
+ headers.set('Access-Control-Allow-Origin', request.environ.get('HTTP_ORIGIN')) # type: ignore (value could be None)
1358
+ headers.set('Access-Control-Allow-Headers', request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')) # type: ignore (value could be None)
1357
1359
  headers.set('Access-Control-Allow-Methods', '*')
1358
1360
  headers.set('Access-Control-Allow-Credentials', 'true')
1359
1361
  headers.set('Access-Control-Expose-Headers', 'X-Rucio-Auth-Token')
1360
1362
  return headers
1361
1363
 
1362
- def options(self):
1364
+ def options(self) -> 'ResponseReturnValue':
1363
1365
  """
1364
1366
  ---
1365
1367
  summary: SAML Allow cross-site scripting
@@ -1394,7 +1396,7 @@ class SAML(ErrorHandlingMethodView):
1394
1396
  return '', 200, self.get_headers()
1395
1397
 
1396
1398
  @check_accept_header_wrapper_flask(['application/octet-stream'])
1397
- def get(self):
1399
+ def get(self) -> 'ResponseReturnValue':
1398
1400
  """
1399
1401
  ---
1400
1402
  summary: SAML
@@ -1470,7 +1472,7 @@ class SAML(ErrorHandlingMethodView):
1470
1472
  )
1471
1473
 
1472
1474
  headers.set('X-Rucio-Auth-Token', result['token'])
1473
- headers.set('X-Rucio-Auth-Token-Expires', date_to_str(result['expires_at']))
1475
+ headers.set('X-Rucio-Auth-Token-Expires', date_to_str(result['expires_at'])) # type: ignore (value could be None)
1474
1476
  return '', 200, headers
1475
1477
 
1476
1478
  # Path to the SAML config folder
@@ -1482,7 +1484,7 @@ class SAML(ErrorHandlingMethodView):
1482
1484
  headers.set('X-Rucio-SAML-Auth-URL', auth.login())
1483
1485
  return '', 200, headers
1484
1486
 
1485
- def post(self):
1487
+ def post(self) -> 'ResponseReturnValue':
1486
1488
  """
1487
1489
  ---
1488
1490
  summary: Post a SAML request
@@ -1517,16 +1519,16 @@ class Validate(ErrorHandlingMethodView):
1517
1519
  Validate a Rucio Auth Token.
1518
1520
  """
1519
1521
 
1520
- def get_headers(self) -> "Optional[HeadersType]":
1522
+ def get_headers(self) -> Headers:
1521
1523
  headers = Headers()
1522
- headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN')
1523
- headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS')
1524
+ headers['Access-Control-Allow-Origin'] = request.environ.get('HTTP_ORIGIN') # type: ignore (value could be None)
1525
+ headers['Access-Control-Allow-Headers'] = request.environ.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS') # type: ignore (value could be None)
1524
1526
  headers['Access-Control-Allow-Methods'] = '*'
1525
1527
  headers['Access-Control-Allow-Credentials'] = 'true'
1526
1528
  headers['Access-Control-Expose-Headers'] = 'X-Rucio-Auth-Token'
1527
1529
  return headers
1528
1530
 
1529
- def options(self):
1531
+ def options(self) -> 'ResponseReturnValue':
1530
1532
  """
1531
1533
  ---
1532
1534
  summary: Validate Allow cross-site scripting
@@ -1561,7 +1563,7 @@ class Validate(ErrorHandlingMethodView):
1561
1563
  return '', 200, self.get_headers()
1562
1564
 
1563
1565
  @check_accept_header_wrapper_flask(['application/octet-stream'])
1564
- def get(self):
1566
+ def get(self) -> 'ResponseReturnValue':
1565
1567
  """
1566
1568
  ---
1567
1569
  summary: Validate
@@ -1602,7 +1604,7 @@ class Validate(ErrorHandlingMethodView):
1602
1604
  return str(result), 200, headers
1603
1605
 
1604
1606
 
1605
- def blueprint():
1607
+ def blueprint() -> Blueprint:
1606
1608
  bp = Blueprint('auth', __name__, url_prefix='/auth')
1607
1609
 
1608
1610
  user_pass_view = UserPass.as_view('user_pass')
@@ -1635,7 +1637,7 @@ def blueprint():
1635
1637
  return bp
1636
1638
 
1637
1639
 
1638
- def make_doc():
1640
+ def make_doc() -> Flask:
1639
1641
  """ Only used for sphinx documentation """
1640
1642
  doc_app = Flask(__name__)
1641
1643
  doc_app.register_blueprint(blueprint())