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.
- rucio/__init__.py +0 -1
- rucio/alembicrevision.py +1 -2
- rucio/client/__init__.py +0 -1
- rucio/client/accountclient.py +45 -25
- rucio/client/accountlimitclient.py +37 -9
- rucio/client/baseclient.py +199 -154
- rucio/client/client.py +2 -3
- rucio/client/configclient.py +19 -6
- rucio/client/credentialclient.py +9 -4
- rucio/client/didclient.py +238 -63
- rucio/client/diracclient.py +13 -5
- rucio/client/downloadclient.py +162 -51
- rucio/client/exportclient.py +4 -4
- rucio/client/fileclient.py +3 -4
- rucio/client/importclient.py +4 -4
- rucio/client/lifetimeclient.py +21 -5
- rucio/client/lockclient.py +18 -8
- rucio/client/{metaclient.py → metaconventionsclient.py} +18 -15
- rucio/client/pingclient.py +0 -1
- rucio/client/replicaclient.py +15 -5
- rucio/client/requestclient.py +35 -19
- rucio/client/rseclient.py +133 -51
- rucio/client/ruleclient.py +29 -22
- rucio/client/scopeclient.py +8 -6
- rucio/client/subscriptionclient.py +47 -35
- rucio/client/touchclient.py +8 -4
- rucio/client/uploadclient.py +166 -82
- rucio/common/__init__.py +0 -1
- rucio/common/cache.py +4 -4
- rucio/common/config.py +52 -47
- rucio/common/constants.py +69 -2
- rucio/common/constraints.py +0 -1
- rucio/common/didtype.py +24 -22
- rucio/common/dumper/__init__.py +70 -41
- rucio/common/dumper/consistency.py +26 -22
- rucio/common/dumper/data_models.py +16 -23
- rucio/common/dumper/path_parsing.py +0 -1
- rucio/common/exception.py +281 -222
- rucio/common/extra.py +0 -1
- rucio/common/logging.py +54 -38
- rucio/common/pcache.py +122 -101
- rucio/common/plugins.py +153 -0
- rucio/common/policy.py +4 -4
- rucio/common/schema/__init__.py +17 -10
- rucio/common/schema/atlas.py +7 -5
- rucio/common/schema/belleii.py +7 -5
- rucio/common/schema/domatpc.py +7 -5
- rucio/common/schema/escape.py +7 -5
- rucio/common/schema/generic.py +8 -6
- rucio/common/schema/generic_multi_vo.py +7 -5
- rucio/common/schema/icecube.py +7 -5
- rucio/common/stomp_utils.py +0 -1
- rucio/common/stopwatch.py +0 -1
- rucio/common/test_rucio_server.py +2 -2
- rucio/common/types.py +262 -17
- rucio/common/utils.py +743 -451
- rucio/core/__init__.py +0 -1
- rucio/core/account.py +99 -29
- rucio/core/account_counter.py +89 -24
- rucio/core/account_limit.py +90 -24
- rucio/core/authentication.py +86 -29
- rucio/core/config.py +108 -38
- rucio/core/credential.py +14 -7
- rucio/core/did.py +680 -782
- rucio/core/did_meta_plugins/__init__.py +8 -6
- rucio/core/did_meta_plugins/did_column_meta.py +17 -12
- rucio/core/did_meta_plugins/did_meta_plugin_interface.py +60 -11
- rucio/core/did_meta_plugins/filter_engine.py +90 -50
- rucio/core/did_meta_plugins/json_meta.py +41 -16
- rucio/core/did_meta_plugins/mongo_meta.py +25 -8
- rucio/core/did_meta_plugins/postgres_meta.py +3 -4
- rucio/core/dirac.py +46 -17
- rucio/core/distance.py +66 -43
- rucio/core/exporter.py +5 -5
- rucio/core/heartbeat.py +181 -81
- rucio/core/identity.py +22 -12
- rucio/core/importer.py +23 -12
- rucio/core/lifetime_exception.py +32 -32
- rucio/core/lock.py +244 -142
- rucio/core/message.py +79 -38
- rucio/core/{meta.py → meta_conventions.py} +57 -44
- rucio/core/monitor.py +19 -13
- rucio/core/naming_convention.py +68 -27
- rucio/core/nongrid_trace.py +17 -5
- rucio/core/oidc.py +151 -29
- rucio/core/permission/__init__.py +18 -6
- rucio/core/permission/atlas.py +50 -35
- rucio/core/permission/belleii.py +6 -5
- rucio/core/permission/escape.py +8 -6
- rucio/core/permission/generic.py +82 -80
- rucio/core/permission/generic_multi_vo.py +9 -7
- rucio/core/quarantined_replica.py +91 -58
- rucio/core/replica.py +1303 -772
- rucio/core/replica_sorter.py +10 -12
- rucio/core/request.py +1133 -285
- rucio/core/rse.py +142 -102
- rucio/core/rse_counter.py +49 -18
- rucio/core/rse_expression_parser.py +6 -7
- rucio/core/rse_selector.py +41 -16
- rucio/core/rule.py +1538 -474
- rucio/core/rule_grouping.py +213 -68
- rucio/core/scope.py +50 -22
- rucio/core/subscription.py +92 -44
- rucio/core/topology.py +66 -24
- rucio/core/trace.py +42 -28
- rucio/core/transfer.py +543 -259
- rucio/core/vo.py +36 -18
- rucio/core/volatile_replica.py +59 -32
- rucio/daemons/__init__.py +0 -1
- rucio/daemons/abacus/__init__.py +0 -1
- rucio/daemons/abacus/account.py +29 -19
- rucio/daemons/abacus/collection_replica.py +21 -10
- rucio/daemons/abacus/rse.py +22 -12
- rucio/daemons/atropos/__init__.py +0 -1
- rucio/daemons/atropos/atropos.py +1 -2
- rucio/daemons/auditor/__init__.py +56 -28
- rucio/daemons/auditor/hdfs.py +17 -6
- rucio/daemons/auditor/srmdumps.py +116 -45
- rucio/daemons/automatix/__init__.py +0 -1
- rucio/daemons/automatix/automatix.py +30 -18
- rucio/daemons/badreplicas/__init__.py +0 -1
- rucio/daemons/badreplicas/minos.py +29 -18
- rucio/daemons/badreplicas/minos_temporary_expiration.py +5 -7
- rucio/daemons/badreplicas/necromancer.py +9 -13
- rucio/daemons/bb8/__init__.py +0 -1
- rucio/daemons/bb8/bb8.py +10 -13
- rucio/daemons/bb8/common.py +151 -154
- rucio/daemons/bb8/nuclei_background_rebalance.py +15 -9
- rucio/daemons/bb8/t2_background_rebalance.py +15 -8
- rucio/daemons/c3po/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/__init__.py +0 -1
- rucio/daemons/c3po/algorithms/simple.py +8 -5
- rucio/daemons/c3po/algorithms/t2_free_space.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop.py +10 -7
- rucio/daemons/c3po/algorithms/t2_free_space_only_pop_with_network.py +30 -15
- rucio/daemons/c3po/c3po.py +81 -52
- rucio/daemons/c3po/collectors/__init__.py +0 -1
- rucio/daemons/c3po/collectors/agis.py +17 -17
- rucio/daemons/c3po/collectors/free_space.py +32 -13
- rucio/daemons/c3po/collectors/jedi_did.py +14 -5
- rucio/daemons/c3po/collectors/mock_did.py +11 -6
- rucio/daemons/c3po/collectors/network_metrics.py +12 -4
- rucio/daemons/c3po/collectors/workload.py +21 -19
- rucio/daemons/c3po/utils/__init__.py +0 -1
- rucio/daemons/c3po/utils/dataset_cache.py +15 -5
- rucio/daemons/c3po/utils/expiring_dataset_cache.py +16 -5
- rucio/daemons/c3po/utils/expiring_list.py +6 -7
- rucio/daemons/c3po/utils/popularity.py +5 -2
- rucio/daemons/c3po/utils/timeseries.py +25 -12
- rucio/daemons/cache/__init__.py +0 -1
- rucio/daemons/cache/consumer.py +21 -15
- rucio/daemons/common.py +42 -18
- rucio/daemons/conveyor/__init__.py +0 -1
- rucio/daemons/conveyor/common.py +69 -37
- rucio/daemons/conveyor/finisher.py +83 -46
- rucio/daemons/conveyor/poller.py +101 -69
- rucio/daemons/conveyor/preparer.py +35 -28
- rucio/daemons/conveyor/receiver.py +64 -21
- rucio/daemons/conveyor/stager.py +33 -28
- rucio/daemons/conveyor/submitter.py +71 -47
- rucio/daemons/conveyor/throttler.py +99 -35
- rucio/daemons/follower/__init__.py +0 -1
- rucio/daemons/follower/follower.py +12 -8
- rucio/daemons/hermes/__init__.py +0 -1
- rucio/daemons/hermes/hermes.py +57 -21
- rucio/daemons/judge/__init__.py +0 -1
- rucio/daemons/judge/cleaner.py +27 -17
- rucio/daemons/judge/evaluator.py +31 -18
- rucio/daemons/judge/injector.py +31 -23
- rucio/daemons/judge/repairer.py +28 -18
- rucio/daemons/oauthmanager/__init__.py +0 -1
- rucio/daemons/oauthmanager/oauthmanager.py +7 -8
- rucio/daemons/reaper/__init__.py +0 -1
- rucio/daemons/reaper/dark_reaper.py +15 -9
- rucio/daemons/reaper/reaper.py +109 -67
- rucio/daemons/replicarecoverer/__init__.py +0 -1
- rucio/daemons/replicarecoverer/suspicious_replica_recoverer.py +255 -116
- rucio/{api → daemons/rsedecommissioner}/__init__.py +0 -1
- rucio/daemons/rsedecommissioner/config.py +81 -0
- rucio/daemons/rsedecommissioner/profiles/__init__.py +24 -0
- rucio/daemons/rsedecommissioner/profiles/atlas.py +60 -0
- rucio/daemons/rsedecommissioner/profiles/generic.py +451 -0
- rucio/daemons/rsedecommissioner/profiles/types.py +92 -0
- rucio/daemons/rsedecommissioner/rse_decommissioner.py +280 -0
- rucio/daemons/storage/__init__.py +0 -1
- rucio/daemons/storage/consistency/__init__.py +0 -1
- rucio/daemons/storage/consistency/actions.py +152 -59
- rucio/daemons/tracer/__init__.py +0 -1
- rucio/daemons/tracer/kronos.py +47 -24
- rucio/daemons/transmogrifier/__init__.py +0 -1
- rucio/daemons/transmogrifier/transmogrifier.py +35 -26
- rucio/daemons/undertaker/__init__.py +0 -1
- rucio/daemons/undertaker/undertaker.py +10 -10
- rucio/db/__init__.py +0 -1
- rucio/db/sqla/__init__.py +16 -2
- rucio/db/sqla/constants.py +10 -1
- rucio/db/sqla/migrate_repo/__init__.py +0 -1
- rucio/db/sqla/migrate_repo/env.py +0 -1
- rucio/db/sqla/migrate_repo/versions/01eaf73ab656_add_new_rule_notification_state_progress.py +0 -1
- rucio/db/sqla/migrate_repo/versions/0437a40dbfd1_add_eol_at_in_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/0f1adb7a599a_create_transfer_hops_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/102efcf145f4_added_stuck_at_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/13d4f70c66a9_introduce_transfer_limits.py +1 -3
- rucio/db/sqla/migrate_repo/versions/140fef722e91_cleanup_distances_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/14ec5aeb64cf_add_request_external_host.py +0 -3
- rucio/db/sqla/migrate_repo/versions/156fb5b5a14_add_request_type_to_requests_idx.py +1 -4
- rucio/db/sqla/migrate_repo/versions/1677d4d803c8_split_rse_availability_into_multiple.py +0 -1
- rucio/db/sqla/migrate_repo/versions/16a0aca82e12_create_index_on_table_replicas_path.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1803333ac20f_adding_provenance_and_phys_group.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a29d6a9504c_add_didtype_chck_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1a80adff031a_create_index_on_rules_hist_recent.py +0 -2
- rucio/db/sqla/migrate_repo/versions/1c45d9730ca6_increase_identity_length.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1d1215494e95_add_quarantined_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/1d96f484df21_asynchronous_rules_and_rule_approval.py +0 -1
- rucio/db/sqla/migrate_repo/versions/1f46c5f240ac_add_bytes_column_to_bad_replicas.py +0 -3
- rucio/db/sqla/migrate_repo/versions/1fc15ab60d43_add_message_history_table.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2190e703eb6e_move_rse_settings_to_rse_attributes.py +1 -2
- rucio/db/sqla/migrate_repo/versions/21d6b9dc9961_add_mismatch_scheme_state_to_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/22cf51430c78_add_availability_column_to_table_rses.py +0 -3
- rucio/db/sqla/migrate_repo/versions/22d887e4ec0a_create_sources_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/25821a8a45a3_remove_unique_constraint_on_requests.py +1 -4
- rucio/db/sqla/migrate_repo/versions/25fc855625cf_added_unique_constraint_to_rules.py +0 -2
- rucio/db/sqla/migrate_repo/versions/269fee20dee9_add_repair_cnt_to_locks.py +0 -3
- rucio/db/sqla/migrate_repo/versions/271a46ea6244_add_ignore_availability_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/277b5fbb41d3_switch_heartbeats_executable.py +1 -2
- rucio/db/sqla/migrate_repo/versions/27e3a68927fb_remove_replicas_tombstone_and_replicas_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2854cd9e168_added_rule_id_column.py +0 -1
- rucio/db/sqla/migrate_repo/versions/295289b5a800_processed_by_and__at_in_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2962ece31cf4_add_nbaccesses_column_in_the_did_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2af3291ec4c_added_replicas_history_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2b69addda658_add_columns_for_third_party_copy_read_.py +0 -2
- rucio/db/sqla/migrate_repo/versions/2b8e7bcb4783_add_config_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2ba5229cb54c_add_submitted_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/2cbee484dcf9_added_column_volume_to_rse_transfer_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/2edee4a83846_add_source_to_requests_and_requests_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/2eef46be23d4_change_tokens_pk.py +1 -3
- rucio/db/sqla/migrate_repo/versions/2f648fc909f3_index_in_rule_history_on_scope_name.py +0 -2
- rucio/db/sqla/migrate_repo/versions/3082b8cef557_add_naming_convention_table_and_closed_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/30fa38b6434e_add_index_on_service_column_in_the_message_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3152492b110b_added_staging_area_column.py +1 -2
- rucio/db/sqla/migrate_repo/versions/32c7d2783f7e_create_bad_replicas_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/3345511706b8_replicas_table_pk_definition_is_in_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/35ef10d1e11b_change_index_on_table_requests.py +0 -2
- rucio/db/sqla/migrate_repo/versions/379a19b5332d_create_rse_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/384b96aa0f60_created_rule_history_tables.py +2 -3
- rucio/db/sqla/migrate_repo/versions/3ac1660a1a72_extend_distance_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/3ad36e2268b0_create_collection_replicas_updates_table.py +1 -4
- rucio/db/sqla/migrate_repo/versions/3c9df354071b_extend_waiting_request_state.py +0 -1
- rucio/db/sqla/migrate_repo/versions/3d9813fab443_add_a_new_state_lost_in_badfilesstatus.py +0 -1
- rucio/db/sqla/migrate_repo/versions/40ad39ce3160_add_transferred_at_to_requests_table.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4207be2fd914_add_notification_column_to_rules.py +0 -1
- rucio/db/sqla/migrate_repo/versions/42db2617c364_create_index_on_requests_external_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/436827b13f82_added_column_activity_to_table_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/44278720f774_update_requests_typ_sta_upd_idx_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/45378a1e76a8_create_collection_replica_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/469d262be19_removing_created_at_index.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4783c1f49cb4_create_distance_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/49a21b4d4357_create_index_on_table_tokens.py +1 -4
- rucio/db/sqla/migrate_repo/versions/4a2cbedda8b9_add_source_replica_expression_column_to_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4a7182d9578b_added_bytes_length_accessed_at_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4bab9edd01fc_create_index_on_requests_rule_id.py +0 -2
- rucio/db/sqla/migrate_repo/versions/4c3a4acfe006_new_attr_account_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/4cf0a2e127d4_adding_transient_metadata.py +0 -3
- rucio/db/sqla/migrate_repo/versions/4df2c5ddabc0_remove_temporary_dids.py +55 -0
- rucio/db/sqla/migrate_repo/versions/50280c53117c_add_qos_class_to_rse.py +0 -2
- rucio/db/sqla/migrate_repo/versions/52153819589c_add_rse_id_to_replicas_table.py +0 -2
- rucio/db/sqla/migrate_repo/versions/52fd9f4916fa_added_activity_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/53b479c3cb0f_fix_did_meta_table_missing_updated_at_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/5673b4b6e843_add_wfms_metadata_to_rule_tables.py +0 -3
- rucio/db/sqla/migrate_repo/versions/575767d9f89_added_source_history_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/58bff7008037_add_started_at_to_requests.py +0 -3
- rucio/db/sqla/migrate_repo/versions/58c8b78301ab_rename_callback_to_message.py +1 -3
- rucio/db/sqla/migrate_repo/versions/5f139f77382a_added_child_rule_id_column.py +1 -3
- rucio/db/sqla/migrate_repo/versions/688ef1840840_adding_did_meta_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/6e572a9bfbf3_add_new_split_container_column_to_rules.py +0 -3
- rucio/db/sqla/migrate_repo/versions/70587619328_add_comment_column_for_subscriptions.py +0 -3
- rucio/db/sqla/migrate_repo/versions/739064d31565_remove_history_table_pks.py +1 -2
- rucio/db/sqla/migrate_repo/versions/7541902bf173_add_didsfollowed_and_followevents_table.py +2 -4
- rucio/db/sqla/migrate_repo/versions/7ec22226cdbf_new_replica_state_for_temporary_.py +0 -1
- rucio/db/sqla/migrate_repo/versions/810a41685bc1_added_columns_rse_transfer_limits.py +1 -4
- rucio/db/sqla/migrate_repo/versions/83f991c63a93_correct_rse_expression_length.py +0 -2
- rucio/db/sqla/migrate_repo/versions/8523998e2e76_increase_size_of_extended_attributes_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/8ea9122275b1_adding_missing_function_based_indices.py +1 -2
- rucio/db/sqla/migrate_repo/versions/90f47792bb76_add_clob_payload_to_messages.py +0 -3
- rucio/db/sqla/migrate_repo/versions/914b8f02df38_new_table_for_lifetime_model_exceptions.py +1 -3
- rucio/db/sqla/migrate_repo/versions/94a5961ddbf2_add_estimator_columns.py +0 -3
- rucio/db/sqla/migrate_repo/versions/9a1b149a2044_add_saml_identity_type.py +0 -1
- rucio/db/sqla/migrate_repo/versions/9a45bc4ea66d_add_vp_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/9eb936a81eb1_true_is_true.py +0 -2
- rucio/db/sqla/migrate_repo/versions/a08fa8de1545_transfer_stats_table.py +55 -0
- rucio/db/sqla/migrate_repo/versions/a118956323f8_added_vo_table_and_vo_col_to_rse.py +1 -3
- rucio/db/sqla/migrate_repo/versions/a193a275255c_add_status_column_in_messages.py +0 -2
- rucio/db/sqla/migrate_repo/versions/a5f6f6e928a7_1_7_0.py +1 -4
- rucio/db/sqla/migrate_repo/versions/a616581ee47_added_columns_to_table_requests.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a6eb23955c28_state_idx_non_functional.py +0 -1
- rucio/db/sqla/migrate_repo/versions/a74275a1ad30_added_global_quota_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/a93e4e47bda_heartbeats.py +1 -4
- rucio/db/sqla/migrate_repo/versions/ae2a56fcc89_added_comment_column_to_rules.py +0 -1
- rucio/db/sqla/migrate_repo/versions/b0070f3695c8_add_deletedidmeta_table.py +57 -0
- rucio/db/sqla/migrate_repo/versions/b4293a99f344_added_column_identity_to_table_tokens.py +0 -3
- rucio/db/sqla/migrate_repo/versions/b5493606bbf5_fix_primary_key_for_subscription_history.py +41 -0
- rucio/db/sqla/migrate_repo/versions/b7d287de34fd_removal_of_replicastate_source.py +1 -2
- rucio/db/sqla/migrate_repo/versions/b818052fa670_add_index_to_quarantined_replicas.py +1 -3
- rucio/db/sqla/migrate_repo/versions/b8caac94d7f0_add_comments_column_for_subscriptions_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/b96a1c7e1cc4_new_bad_pfns_table_and_bad_replicas_.py +1 -5
- rucio/db/sqla/migrate_repo/versions/bb695f45c04_extend_request_state.py +1 -3
- rucio/db/sqla/migrate_repo/versions/bc68e9946deb_add_staging_timestamps_to_request.py +0 -3
- rucio/db/sqla/migrate_repo/versions/bf3baa1c1474_correct_pk_and_idx_for_history_tables.py +1 -3
- rucio/db/sqla/migrate_repo/versions/c0937668555f_add_qos_policy_map_table.py +1 -2
- rucio/db/sqla/migrate_repo/versions/c129ccdb2d5_add_lumiblocknr_to_dids.py +0 -3
- rucio/db/sqla/migrate_repo/versions/ccdbcd48206e_add_did_type_column_index_on_did_meta_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/cebad904c4dd_new_payload_column_for_heartbeats.py +1 -2
- rucio/db/sqla/migrate_repo/versions/d1189a09c6e0_oauth2_0_and_jwt_feature_support_adding_.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d23453595260_extend_request_state_for_preparer.py +1 -3
- rucio/db/sqla/migrate_repo/versions/d6dceb1de2d_added_purge_column_to_rules.py +1 -4
- rucio/db/sqla/migrate_repo/versions/d6e2c3b2cf26_remove_third_party_copy_column_from_rse.py +0 -2
- rucio/db/sqla/migrate_repo/versions/d91002c5841_new_account_limits_table.py +1 -3
- rucio/db/sqla/migrate_repo/versions/e138c364ebd0_extending_columns_for_filter_and_.py +0 -3
- rucio/db/sqla/migrate_repo/versions/e59300c8b179_support_for_archive.py +1 -3
- rucio/db/sqla/migrate_repo/versions/f1b14a8c2ac1_postgres_use_check_constraints.py +0 -1
- rucio/db/sqla/migrate_repo/versions/f41ffe206f37_oracle_global_temporary_tables.py +1 -2
- rucio/db/sqla/migrate_repo/versions/f85a2962b021_adding_transfertool_column_to_requests_.py +1 -3
- rucio/db/sqla/migrate_repo/versions/fa7a7d78b602_increase_refresh_token_size.py +0 -2
- rucio/db/sqla/migrate_repo/versions/fb28a95fe288_add_replicas_rse_id_tombstone_idx.py +0 -1
- rucio/db/sqla/migrate_repo/versions/fe1a65b176c9_set_third_party_copy_read_and_write_.py +1 -2
- rucio/db/sqla/migrate_repo/versions/fe8ea2fa9788_added_third_party_copy_column_to_rse_.py +0 -3
- rucio/db/sqla/models.py +122 -216
- rucio/db/sqla/sautils.py +12 -5
- rucio/db/sqla/session.py +71 -43
- rucio/db/sqla/types.py +3 -4
- rucio/db/sqla/util.py +91 -69
- rucio/gateway/__init__.py +13 -0
- rucio/{api → gateway}/account.py +119 -46
- rucio/{api → gateway}/account_limit.py +12 -13
- rucio/{api → gateway}/authentication.py +106 -33
- rucio/{api → gateway}/config.py +12 -13
- rucio/{api → gateway}/credential.py +15 -4
- rucio/{api → gateway}/did.py +384 -140
- rucio/{api → gateway}/dirac.py +16 -6
- rucio/{api → gateway}/exporter.py +3 -4
- rucio/{api → gateway}/heartbeat.py +17 -5
- rucio/{api → gateway}/identity.py +63 -19
- rucio/{api → gateway}/importer.py +3 -4
- rucio/{api → gateway}/lifetime_exception.py +35 -10
- rucio/{api → gateway}/lock.py +34 -12
- rucio/{api/meta.py → gateway/meta_conventions.py} +18 -16
- rucio/{api → gateway}/permission.py +4 -5
- rucio/{api → gateway}/quarantined_replica.py +13 -4
- rucio/{api → gateway}/replica.py +12 -11
- rucio/{api → gateway}/request.py +129 -28
- rucio/{api → gateway}/rse.py +11 -12
- rucio/{api → gateway}/rule.py +117 -35
- rucio/{api → gateway}/scope.py +24 -14
- rucio/{api → gateway}/subscription.py +65 -43
- rucio/{api → gateway}/vo.py +17 -7
- rucio/rse/__init__.py +3 -4
- rucio/rse/protocols/__init__.py +0 -1
- rucio/rse/protocols/bittorrent.py +184 -0
- rucio/rse/protocols/cache.py +1 -2
- rucio/rse/protocols/dummy.py +1 -2
- rucio/rse/protocols/gfal.py +12 -10
- rucio/rse/protocols/globus.py +7 -7
- rucio/rse/protocols/gsiftp.py +2 -3
- rucio/rse/protocols/http_cache.py +1 -2
- rucio/rse/protocols/mock.py +1 -2
- rucio/rse/protocols/ngarc.py +1 -2
- rucio/rse/protocols/posix.py +12 -13
- rucio/rse/protocols/protocol.py +116 -52
- rucio/rse/protocols/rclone.py +6 -7
- rucio/rse/protocols/rfio.py +4 -5
- rucio/rse/protocols/srm.py +9 -10
- rucio/rse/protocols/ssh.py +8 -9
- rucio/rse/protocols/storm.py +2 -3
- rucio/rse/protocols/webdav.py +17 -14
- rucio/rse/protocols/xrootd.py +23 -17
- rucio/rse/rsemanager.py +19 -7
- rucio/tests/__init__.py +0 -1
- rucio/tests/common.py +43 -17
- rucio/tests/common_server.py +3 -3
- rucio/transfertool/__init__.py +0 -1
- rucio/transfertool/bittorrent.py +199 -0
- rucio/transfertool/bittorrent_driver.py +52 -0
- rucio/transfertool/bittorrent_driver_qbittorrent.py +133 -0
- rucio/transfertool/fts3.py +250 -138
- rucio/transfertool/fts3_plugins.py +152 -0
- rucio/transfertool/globus.py +9 -8
- rucio/transfertool/globus_library.py +1 -2
- rucio/transfertool/mock.py +21 -12
- rucio/transfertool/transfertool.py +33 -24
- rucio/vcsversion.py +4 -4
- rucio/version.py +5 -13
- rucio/web/__init__.py +0 -1
- rucio/web/rest/__init__.py +0 -1
- rucio/web/rest/flaskapi/__init__.py +0 -1
- rucio/web/rest/flaskapi/authenticated_bp.py +0 -1
- rucio/web/rest/flaskapi/v1/__init__.py +0 -1
- rucio/web/rest/flaskapi/v1/accountlimits.py +15 -13
- rucio/web/rest/flaskapi/v1/accounts.py +49 -48
- rucio/web/rest/flaskapi/v1/archives.py +12 -10
- rucio/web/rest/flaskapi/v1/auth.py +146 -144
- rucio/web/rest/flaskapi/v1/common.py +82 -41
- rucio/web/rest/flaskapi/v1/config.py +5 -6
- rucio/web/rest/flaskapi/v1/credentials.py +7 -8
- rucio/web/rest/flaskapi/v1/dids.py +158 -28
- rucio/web/rest/flaskapi/v1/dirac.py +8 -8
- rucio/web/rest/flaskapi/v1/export.py +3 -5
- rucio/web/rest/flaskapi/v1/heartbeats.py +3 -5
- rucio/web/rest/flaskapi/v1/identities.py +3 -5
- rucio/web/rest/flaskapi/v1/import.py +3 -4
- rucio/web/rest/flaskapi/v1/lifetime_exceptions.py +6 -9
- rucio/web/rest/flaskapi/v1/locks.py +2 -4
- rucio/web/rest/flaskapi/v1/main.py +10 -2
- rucio/web/rest/flaskapi/v1/{meta.py → meta_conventions.py} +26 -11
- rucio/web/rest/flaskapi/v1/metrics.py +1 -2
- rucio/web/rest/flaskapi/v1/nongrid_traces.py +4 -4
- rucio/web/rest/flaskapi/v1/ping.py +6 -7
- rucio/web/rest/flaskapi/v1/redirect.py +8 -9
- rucio/web/rest/flaskapi/v1/replicas.py +43 -19
- rucio/web/rest/flaskapi/v1/requests.py +178 -21
- rucio/web/rest/flaskapi/v1/rses.py +61 -26
- rucio/web/rest/flaskapi/v1/rules.py +48 -18
- rucio/web/rest/flaskapi/v1/scopes.py +3 -5
- rucio/web/rest/flaskapi/v1/subscriptions.py +22 -18
- rucio/web/rest/flaskapi/v1/traces.py +4 -4
- rucio/web/rest/flaskapi/v1/types.py +20 -0
- rucio/web/rest/flaskapi/v1/vos.py +3 -5
- rucio/web/rest/main.py +0 -1
- rucio/web/rest/metrics.py +0 -1
- rucio/web/rest/ping.py +27 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/ldap.cfg.template +1 -1
- rucio-35.8.0.data/data/rucio/requirements.server.txt +268 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/bootstrap.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/merge_rucio_configs.py +2 -5
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/tools/reset_database.py +3 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio +87 -85
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-account +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-collection-replica +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-abacus-rse +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-admin +45 -32
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-atropos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-auditor +13 -7
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-automatix +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-bb8 +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-c3po +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-client +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-cache-consumer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-finisher +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-poller +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-preparer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-receiver +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-stager +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-submitter +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-conveyor-throttler +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dark-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-dumper +11 -10
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-follower +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-hermes +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-cleaner +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-evaluator +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-injector +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-judge-repairer +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-kronos +1 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-minos-temporary-expiration +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-necromancer +1 -2
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-oauth-manager +2 -3
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-reaper +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-replica-recoverer +6 -7
- rucio-35.8.0.data/scripts/rucio-rse-decommissioner +66 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-storage-consistency-actions +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-transmogrifier +0 -1
- {rucio-32.8.6.data → rucio-35.8.0.data}/scripts/rucio-undertaker +1 -2
- rucio-35.8.0.dist-info/METADATA +72 -0
- rucio-35.8.0.dist-info/RECORD +493 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/WHEEL +1 -1
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/AUTHORS.rst +3 -0
- rucio/api/temporary_did.py +0 -49
- rucio/common/schema/cms.py +0 -478
- rucio/common/schema/lsst.py +0 -423
- rucio/core/permission/cms.py +0 -1166
- rucio/core/temporary_did.py +0 -188
- rucio/daemons/reaper/light_reaper.py +0 -255
- rucio/web/rest/flaskapi/v1/tmp_dids.py +0 -115
- rucio-32.8.6.data/data/rucio/requirements.txt +0 -55
- rucio-32.8.6.data/scripts/rucio-light-reaper +0 -53
- rucio-32.8.6.dist-info/METADATA +0 -83
- rucio-32.8.6.dist-info/RECORD +0 -481
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/alembic_offline.ini.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/globus-config.yml.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approval_request.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_approved_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_admin.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_denied_user.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/mail_templates/rule_ok_notification.tmpl +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rse-accounts.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.atlas.client.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio.cfg.template +0 -0
- {rucio-32.8.6.data → rucio-35.8.0.data}/data/rucio/etc/rucio_multi_vo.cfg.template +0 -0
- {rucio-32.8.6.dist-info → rucio-35.8.0.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
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,
|
|
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.
|
|
36
|
-
|
|
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
|
-
|
|
40
|
-
from
|
|
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) ->
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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(
|
|
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 {
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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) ->
|
|
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())
|