mongo 2.23.0 → 2.24.0
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.
- checksums.yaml +4 -4
- data/bin/mongo_console +0 -1
- data/lib/mongo/active_support.rb +1 -2
- data/lib/mongo/address/ipv4.rb +3 -6
- data/lib/mongo/address/ipv6.rb +6 -10
- data/lib/mongo/address/unix.rb +1 -4
- data/lib/mongo/address/validator.rb +16 -28
- data/lib/mongo/address.rb +30 -40
- data/lib/mongo/auth/aws/conversation.rb +6 -10
- data/lib/mongo/auth/aws/credentials.rb +0 -1
- data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
- data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
- data/lib/mongo/auth/aws/request.rb +20 -35
- data/lib/mongo/auth/aws.rb +1 -2
- data/lib/mongo/auth/base.rb +20 -29
- data/lib/mongo/auth/conversation_base.rb +14 -18
- data/lib/mongo/auth/cr/conversation.rb +0 -3
- data/lib/mongo/auth/cr.rb +1 -4
- data/lib/mongo/auth/credential_cache.rb +0 -2
- data/lib/mongo/auth/gssapi/conversation.rb +3 -8
- data/lib/mongo/auth/gssapi.rb +1 -4
- data/lib/mongo/auth/ldap/conversation.rb +0 -3
- data/lib/mongo/auth/ldap.rb +1 -4
- data/lib/mongo/auth/roles.rb +16 -19
- data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
- data/lib/mongo/auth/scram/conversation.rb +2 -5
- data/lib/mongo/auth/scram.rb +5 -10
- data/lib/mongo/auth/scram256/conversation.rb +2 -5
- data/lib/mongo/auth/scram256.rb +1 -3
- data/lib/mongo/auth/scram_conversation_base.rb +18 -24
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
- data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
- data/lib/mongo/auth/stringprep.rb +9 -12
- data/lib/mongo/auth/user/view.rb +3 -5
- data/lib/mongo/auth/user.rb +14 -24
- data/lib/mongo/auth/x509/conversation.rb +0 -3
- data/lib/mongo/auth/x509.rb +7 -9
- data/lib/mongo/auth.rb +18 -30
- data/lib/mongo/background_thread.rb +9 -17
- data/lib/mongo/bson.rb +0 -2
- data/lib/mongo/bulk_write/combineable.rb +0 -3
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/result.rb +11 -16
- data/lib/mongo/bulk_write/result_combiner.rb +9 -12
- data/lib/mongo/bulk_write/transformable.rb +16 -19
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/validatable.rb +11 -18
- data/lib/mongo/bulk_write.rb +76 -91
- data/lib/mongo/caching_cursor.rb +2 -7
- data/lib/mongo/client.rb +230 -275
- data/lib/mongo/client_encryption.rb +4 -5
- data/lib/mongo/cluster/periodic_executor.rb +2 -5
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
- data/lib/mongo/cluster/sdam_flow.rb +136 -159
- data/lib/mongo/cluster/topology/base.rb +15 -18
- data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
- data/lib/mongo/cluster/topology/sharded.rb +19 -9
- data/lib/mongo/cluster/topology/single.rb +24 -14
- data/lib/mongo/cluster/topology/unknown.rb +20 -10
- data/lib/mongo/cluster/topology.rb +29 -25
- data/lib/mongo/cluster.rb +148 -183
- data/lib/mongo/cluster_time.rb +14 -31
- data/lib/mongo/collection/helpers.rb +5 -8
- data/lib/mongo/collection/view/aggregation.rb +5 -10
- data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
- data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
- data/lib/mongo/collection/view/builder.rb +0 -1
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
- data/lib/mongo/collection/view/change_stream.rb +59 -58
- data/lib/mongo/collection/view/explainable.rb +11 -20
- data/lib/mongo/collection/view/immutable.rb +1 -3
- data/lib/mongo/collection/view/iterable.rb +35 -28
- data/lib/mongo/collection/view/map_reduce.rb +20 -25
- data/lib/mongo/collection/view/readable.rb +50 -57
- data/lib/mongo/collection/view/writable.rb +56 -72
- data/lib/mongo/collection/view.rb +9 -8
- data/lib/mongo/collection.rb +63 -76
- data/lib/mongo/condition_variable.rb +4 -4
- data/lib/mongo/config/options.rb +0 -3
- data/lib/mongo/config/validators/option.rb +3 -5
- data/lib/mongo/config.rb +2 -4
- data/lib/mongo/crypt/auto_decryption_context.rb +0 -3
- data/lib/mongo/crypt/auto_encrypter.rb +34 -43
- data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
- data/lib/mongo/crypt/binary.rb +5 -9
- data/lib/mongo/crypt/binding.rb +149 -155
- data/lib/mongo/crypt/context.rb +10 -17
- data/lib/mongo/crypt/data_key_context.rb +2 -7
- data/lib/mongo/crypt/encryption_io.rb +29 -39
- data/lib/mongo/crypt/explicit_decryption_context.rb +0 -3
- data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
- data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
- data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
- data/lib/mongo/crypt/handle.rb +42 -48
- data/lib/mongo/crypt/hooks.rb +12 -15
- data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
- data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
- data/lib/mongo/crypt/kms/aws.rb +0 -2
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
- data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
- data/lib/mongo/crypt/kms/azure.rb +0 -1
- data/lib/mongo/crypt/kms/credentials.rb +13 -27
- data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
- data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
- data/lib/mongo/crypt/kms/gcp.rb +0 -2
- data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
- data/lib/mongo/crypt/kms/kmip.rb +0 -1
- data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
- data/lib/mongo/crypt/kms/local.rb +0 -1
- data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
- data/lib/mongo/crypt/kms.rb +14 -16
- data/lib/mongo/crypt/kms_context.rb +0 -2
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
- data/lib/mongo/crypt/status.rb +12 -14
- data/lib/mongo/crypt.rb +0 -1
- data/lib/mongo/csot_timeout_holder.rb +3 -2
- data/lib/mongo/cursor/kill_spec.rb +7 -10
- data/lib/mongo/cursor.rb +74 -64
- data/lib/mongo/cursor_host.rb +8 -10
- data/lib/mongo/database/view.rb +16 -37
- data/lib/mongo/database.rb +52 -56
- data/lib/mongo/dbref.rb +0 -1
- data/lib/mongo/distinguishing_semaphore.rb +0 -1
- data/lib/mongo/error/auth_error.rb +0 -2
- data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
- data/lib/mongo/error/bulk_write_error.rb +7 -10
- data/lib/mongo/error/change_stream_resumable.rb +0 -2
- data/lib/mongo/error/client_closed.rb +0 -2
- data/lib/mongo/error/closed_stream.rb +1 -4
- data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
- data/lib/mongo/error/connection_perished.rb +0 -2
- data/lib/mongo/error/connection_unavailable.rb +0 -2
- data/lib/mongo/error/credential_check_error.rb +0 -2
- data/lib/mongo/error/crypt_error.rb +0 -2
- data/lib/mongo/error/extra_file_chunk.rb +1 -4
- data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
- data/lib/mongo/error/file_not_found.rb +0 -3
- data/lib/mongo/error/handshake_error.rb +0 -2
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
- data/lib/mongo/error/internal_driver_error.rb +0 -2
- data/lib/mongo/error/invalid_address.rb +0 -2
- data/lib/mongo/error/invalid_application_name.rb +0 -3
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
- data/lib/mongo/error/invalid_collection_name.rb +1 -4
- data/lib/mongo/error/invalid_config_option.rb +0 -3
- data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
- data/lib/mongo/error/invalid_database_name.rb +1 -4
- data/lib/mongo/error/invalid_document.rb +1 -4
- data/lib/mongo/error/invalid_file.rb +0 -3
- data/lib/mongo/error/invalid_file_revision.rb +0 -3
- data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
- data/lib/mongo/error/invalid_nonce.rb +0 -3
- data/lib/mongo/error/invalid_read_concern.rb +2 -4
- data/lib/mongo/error/invalid_read_option.rb +0 -3
- data/lib/mongo/error/invalid_replacement_document.rb +2 -5
- data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
- data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
- data/lib/mongo/error/invalid_server_preference.rb +7 -16
- data/lib/mongo/error/invalid_session.rb +1 -4
- data/lib/mongo/error/invalid_signature.rb +0 -3
- data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
- data/lib/mongo/error/invalid_txt_record.rb +0 -2
- data/lib/mongo/error/invalid_update_document.rb +2 -5
- data/lib/mongo/error/invalid_uri.rb +1 -4
- data/lib/mongo/error/invalid_write_concern.rb +2 -5
- data/lib/mongo/error/kms_error.rb +0 -2
- data/lib/mongo/error/labelable.rb +0 -3
- data/lib/mongo/error/lint_error.rb +0 -2
- data/lib/mongo/error/max_bson_size.rb +8 -11
- data/lib/mongo/error/max_message_size.rb +2 -5
- data/lib/mongo/error/mismatched_domain.rb +0 -2
- data/lib/mongo/error/missing_connection.rb +0 -2
- data/lib/mongo/error/missing_file_chunk.rb +0 -3
- data/lib/mongo/error/missing_password.rb +0 -2
- data/lib/mongo/error/missing_resume_token.rb +1 -4
- data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
- data/lib/mongo/error/missing_service_id.rb +0 -2
- data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
- data/lib/mongo/error/multi_index_drop.rb +0 -3
- data/lib/mongo/error/need_primary_server.rb +0 -2
- data/lib/mongo/error/no_server_available.rb +3 -8
- data/lib/mongo/error/no_service_connection_available.rb +1 -3
- data/lib/mongo/error/no_srv_records.rb +0 -2
- data/lib/mongo/error/notable.rb +8 -16
- data/lib/mongo/error/operation_failure.rb +22 -35
- data/lib/mongo/error/parser.rb +33 -75
- data/lib/mongo/error/pool_cleared_error.rb +1 -3
- data/lib/mongo/error/pool_closed_error.rb +0 -3
- data/lib/mongo/error/pool_error.rb +0 -3
- data/lib/mongo/error/pool_paused_error.rb +0 -2
- data/lib/mongo/error/raise_original_error.rb +1 -3
- data/lib/mongo/error/read_write_retryable.rb +14 -17
- data/lib/mongo/error/sdam_error_detection.rb +3 -5
- data/lib/mongo/error/server_api_conflict.rb +0 -2
- data/lib/mongo/error/server_certificate_revoked.rb +0 -2
- data/lib/mongo/error/server_not_usable.rb +0 -2
- data/lib/mongo/error/session_ended.rb +1 -3
- data/lib/mongo/error/session_not_materialized.rb +1 -3
- data/lib/mongo/error/sessions_not_supported.rb +1 -4
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
- data/lib/mongo/error/socket_error.rb +0 -2
- data/lib/mongo/error/socket_timeout_error.rb +0 -2
- data/lib/mongo/error/transactions_not_supported.rb +3 -6
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
- data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
- data/lib/mongo/error/unexpected_response.rb +1 -4
- data/lib/mongo/error/unknown_payload_type.rb +0 -3
- data/lib/mongo/error/unmet_dependency.rb +0 -2
- data/lib/mongo/error/unsupported_array_filters.rb +3 -24
- data/lib/mongo/error/unsupported_collation.rb +3 -24
- data/lib/mongo/error/unsupported_features.rb +0 -2
- data/lib/mongo/error/unsupported_message_type.rb +0 -2
- data/lib/mongo/error/unsupported_option.rb +19 -21
- data/lib/mongo/error/write_retryable.rb +0 -2
- data/lib/mongo/error.rb +10 -24
- data/lib/mongo/event/base.rb +0 -2
- data/lib/mongo/event/listeners.rb +0 -3
- data/lib/mongo/event/publisher.rb +0 -3
- data/lib/mongo/event/subscriber.rb +0 -4
- data/lib/mongo/event.rb +4 -6
- data/lib/mongo/grid/file/chunk.rb +7 -10
- data/lib/mongo/grid/file/info.rb +20 -24
- data/lib/mongo/grid/file.rb +7 -8
- data/lib/mongo/grid/fs_bucket.rb +40 -48
- data/lib/mongo/grid/stream/read.rb +25 -35
- data/lib/mongo/grid/stream/write.rb +17 -22
- data/lib/mongo/grid/stream.rb +2 -4
- data/lib/mongo/grid.rb +0 -1
- data/lib/mongo/id.rb +0 -1
- data/lib/mongo/index/view.rb +49 -48
- data/lib/mongo/index.rb +7 -10
- data/lib/mongo/lint.rb +31 -37
- data/lib/mongo/loggable.rb +5 -8
- data/lib/mongo/logger.rb +1 -7
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
- data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap.rb +0 -1
- data/lib/mongo/monitoring/event/command_failed.rb +5 -9
- data/lib/mongo/monitoring/event/command_started.rb +8 -12
- data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
- data/lib/mongo/monitoring/event/secure.rb +15 -20
- data/lib/mongo/monitoring/event/server_closed.rb +1 -4
- data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
- data/lib/mongo/monitoring/event/server_opening.rb +1 -4
- data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
- data/lib/mongo/monitoring/event.rb +0 -1
- data/lib/mongo/monitoring/publishable.rb +20 -30
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
- data/lib/mongo/monitoring.rb +38 -39
- data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
- data/lib/mongo/operation/aggregate/result.rb +3 -6
- data/lib/mongo/operation/aggregate.rb +0 -2
- data/lib/mongo/operation/collections_info/result.rb +0 -3
- data/lib/mongo/operation/collections_info.rb +0 -2
- data/lib/mongo/operation/command/op_msg.rb +1 -4
- data/lib/mongo/operation/command.rb +0 -2
- data/lib/mongo/operation/context.rb +13 -16
- data/lib/mongo/operation/count/op_msg.rb +2 -4
- data/lib/mongo/operation/count.rb +0 -2
- data/lib/mongo/operation/create/op_msg.rb +2 -5
- data/lib/mongo/operation/create.rb +0 -2
- data/lib/mongo/operation/create_index/op_msg.rb +3 -7
- data/lib/mongo/operation/create_index.rb +0 -2
- data/lib/mongo/operation/create_user/op_msg.rb +2 -4
- data/lib/mongo/operation/create_user.rb +0 -2
- data/lib/mongo/operation/delete/bulk_result.rb +2 -3
- data/lib/mongo/operation/delete/op_msg.rb +3 -10
- data/lib/mongo/operation/delete/result.rb +0 -3
- data/lib/mongo/operation/delete.rb +1 -5
- data/lib/mongo/operation/distinct/op_msg.rb +2 -5
- data/lib/mongo/operation/distinct.rb +0 -2
- data/lib/mongo/operation/drop/op_msg.rb +0 -2
- data/lib/mongo/operation/drop.rb +0 -2
- data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
- data/lib/mongo/operation/drop_database.rb +0 -2
- data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
- data/lib/mongo/operation/drop_index.rb +0 -2
- data/lib/mongo/operation/explain/op_msg.rb +0 -2
- data/lib/mongo/operation/explain/result.rb +0 -3
- data/lib/mongo/operation/explain.rb +0 -2
- data/lib/mongo/operation/find/builder/command.rb +4 -12
- data/lib/mongo/operation/find/builder/flags.rb +9 -15
- data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
- data/lib/mongo/operation/find/builder.rb +0 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -12
- data/lib/mongo/operation/find/result.rb +0 -3
- data/lib/mongo/operation/find.rb +0 -2
- data/lib/mongo/operation/get_more/command_builder.rb +1 -6
- data/lib/mongo/operation/get_more/op_msg.rb +10 -4
- data/lib/mongo/operation/get_more/result.rb +0 -3
- data/lib/mongo/operation/get_more.rb +0 -2
- data/lib/mongo/operation/indexes/op_msg.rb +0 -2
- data/lib/mongo/operation/indexes/result.rb +1 -5
- data/lib/mongo/operation/indexes.rb +0 -2
- data/lib/mongo/operation/insert/bulk_result.rb +2 -6
- data/lib/mongo/operation/insert/op_msg.rb +2 -4
- data/lib/mongo/operation/insert/result.rb +0 -3
- data/lib/mongo/operation/insert.rb +2 -5
- data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
- data/lib/mongo/operation/kill_cursors.rb +0 -2
- data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
- data/lib/mongo/operation/list_collections/result.rb +1 -4
- data/lib/mongo/operation/list_collections.rb +0 -2
- data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
- data/lib/mongo/operation/map_reduce/result.rb +3 -6
- data/lib/mongo/operation/map_reduce.rb +0 -2
- data/lib/mongo/operation/op_msg_base.rb +0 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
- data/lib/mongo/operation/parallel_scan/result.rb +2 -5
- data/lib/mongo/operation/parallel_scan.rb +0 -2
- data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
- data/lib/mongo/operation/remove_user.rb +0 -2
- data/lib/mongo/operation/result.rb +38 -48
- data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
- data/lib/mongo/operation/shared/executable.rb +19 -28
- data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
- data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
- data/lib/mongo/operation/shared/idable.rb +3 -6
- data/lib/mongo/operation/shared/limited.rb +0 -3
- data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
- data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
- data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
- data/lib/mongo/operation/shared/response_handling.rb +13 -26
- data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
- data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
- data/lib/mongo/operation/shared/specifiable.rb +32 -58
- data/lib/mongo/operation/shared/write.rb +12 -17
- data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
- data/lib/mongo/operation/update/bulk_result.rb +13 -17
- data/lib/mongo/operation/update/op_msg.rb +2 -5
- data/lib/mongo/operation/update/result.rb +5 -5
- data/lib/mongo/operation/update.rb +1 -5
- data/lib/mongo/operation/update_user/op_msg.rb +2 -4
- data/lib/mongo/operation/update_user.rb +0 -2
- data/lib/mongo/operation/users_info/op_msg.rb +2 -4
- data/lib/mongo/operation/users_info/result.rb +1 -4
- data/lib/mongo/operation/users_info.rb +0 -2
- data/lib/mongo/operation/write_command/op_msg.rb +2 -10
- data/lib/mongo/operation/write_command.rb +0 -2
- data/lib/mongo/operation.rb +9 -14
- data/lib/mongo/options/mapper.rb +8 -15
- data/lib/mongo/options/redacted.rb +7 -9
- data/lib/mongo/options.rb +0 -1
- data/lib/mongo/protocol/bit_vector.rb +3 -5
- data/lib/mongo/protocol/caching_hash.rb +2 -7
- data/lib/mongo/protocol/compressed.rb +5 -10
- data/lib/mongo/protocol/get_more.rb +2 -8
- data/lib/mongo/protocol/kill_cursors.rb +2 -8
- data/lib/mongo/protocol/message.rb +103 -105
- data/lib/mongo/protocol/msg.rb +48 -63
- data/lib/mongo/protocol/query.rb +32 -41
- data/lib/mongo/protocol/registry.rb +2 -5
- data/lib/mongo/protocol/reply.rb +10 -16
- data/lib/mongo/protocol/serializers.rb +41 -59
- data/lib/mongo/protocol.rb +0 -1
- data/lib/mongo/query_cache.rb +7 -15
- data/lib/mongo/retryable/backpressure.rb +31 -0
- data/lib/mongo/retryable/base_worker.rb +39 -13
- data/lib/mongo/retryable/read_worker.rb +77 -21
- data/lib/mongo/retryable/retry_policy.rb +59 -0
- data/lib/mongo/retryable/write_worker.rb +155 -56
- data/lib/mongo/retryable.rb +70 -9
- data/lib/mongo/search_index/view.rb +1 -1
- data/lib/mongo/semaphore.rb +0 -1
- data/lib/mongo/server/app_metadata/environment.rb +3 -3
- data/lib/mongo/server/app_metadata.rb +4 -5
- data/lib/mongo/server/connection.rb +61 -61
- data/lib/mongo/server/connection_base.rb +43 -53
- data/lib/mongo/server/connection_common.rb +41 -64
- data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
- data/lib/mongo/server/connection_pool/populator.rb +1 -4
- data/lib/mongo/server/connection_pool.rb +195 -167
- data/lib/mongo/server/description/features.rb +23 -60
- data/lib/mongo/server/description/load_balancer.rb +0 -2
- data/lib/mongo/server/description.rb +117 -138
- data/lib/mongo/server/monitor/app_metadata.rb +3 -4
- data/lib/mongo/server/monitor/connection.rb +28 -35
- data/lib/mongo/server/monitor.rb +65 -60
- data/lib/mongo/server/pending_connection.rb +70 -71
- data/lib/mongo/server/push_monitor/connection.rb +0 -3
- data/lib/mongo/server/push_monitor.rb +21 -29
- data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
- data/lib/mongo/server.rb +60 -93
- data/lib/mongo/server_selector/base.rb +133 -157
- data/lib/mongo/server_selector/nearest.rb +2 -5
- data/lib/mongo/server_selector/primary.rb +1 -5
- data/lib/mongo/server_selector/primary_preferred.rb +2 -6
- data/lib/mongo/server_selector/secondary.rb +2 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
- data/lib/mongo/server_selector.rb +3 -4
- data/lib/mongo/session/server_session.rb +6 -7
- data/lib/mongo/session/session_pool.rb +20 -34
- data/lib/mongo/session.rb +287 -188
- data/lib/mongo/socket/ocsp_cache.rb +8 -13
- data/lib/mongo/socket/ocsp_verifier.rb +69 -70
- data/lib/mongo/socket/ssl.rb +44 -43
- data/lib/mongo/socket/tcp.rb +5 -8
- data/lib/mongo/socket/unix.rb +0 -4
- data/lib/mongo/socket.rb +80 -102
- data/lib/mongo/srv/monitor.rb +6 -11
- data/lib/mongo/srv/resolver.rb +15 -24
- data/lib/mongo/srv/result.rb +18 -24
- data/lib/mongo/srv.rb +0 -1
- data/lib/mongo/timeout.rb +4 -11
- data/lib/mongo/topology_version.rb +8 -13
- data/lib/mongo/tracing/open_telemetry/command_tracer.rb +1 -1
- data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
- data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
- data/lib/mongo/uri/options_mapper.rb +135 -126
- data/lib/mongo/uri/srv_protocol.rb +25 -38
- data/lib/mongo/uri.rb +95 -139
- data/lib/mongo/utils.rb +5 -12
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +0 -2
- data/lib/mongo/write_concern/base.rb +6 -6
- data/lib/mongo/write_concern/unacknowledged.rb +0 -2
- data/lib/mongo/write_concern.rb +14 -15
- data/lib/mongo.rb +1 -3
- data/mongo.gemspec +17 -17
- metadata +5 -5
- data/lib/mongo/error/server_api_not_supported.rb +0 -27
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
- data/lib/mongo/operation/shared/validatable.rb +0 -87
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2015-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,13 +17,11 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
19
|
class Gssapi
|
|
21
|
-
|
|
22
|
-
# Defines behaviour around a single Kerberos conversation between the
|
|
20
|
+
# Defines behavior around a single Kerberos conversation between the
|
|
23
21
|
# client and the server.
|
|
24
22
|
#
|
|
25
23
|
# @api private
|
|
26
24
|
class Conversation < SaslConversationBase
|
|
27
|
-
|
|
28
25
|
# The base client first message.
|
|
29
26
|
START_MESSAGE = { saslStart: 1, autoAuthorize: 1 }.freeze
|
|
30
27
|
|
|
@@ -44,14 +41,12 @@ module Mongo
|
|
|
44
41
|
def initialize(user, connection, **opts)
|
|
45
42
|
super
|
|
46
43
|
host = connection.address.host
|
|
47
|
-
unless defined?(Mongo::GssapiNative)
|
|
48
|
-
require 'mongo_kerberos'
|
|
49
|
-
end
|
|
44
|
+
require 'mongo_kerberos' unless defined?(Mongo::GssapiNative)
|
|
50
45
|
@authenticator = Mongo::GssapiNative::Authenticator.new(
|
|
51
46
|
user.name,
|
|
52
47
|
host,
|
|
53
48
|
user.auth_mech_properties[:service_name] || 'mongodb',
|
|
54
|
-
user.auth_mech_properties[:canonicalize_host_name] || false
|
|
49
|
+
user.auth_mech_properties[:canonicalize_host_name] || false
|
|
55
50
|
)
|
|
56
51
|
end
|
|
57
52
|
|
data/lib/mongo/auth/gssapi.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB, Inc.
|
|
5
4
|
#
|
|
@@ -17,16 +16,14 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
|
-
|
|
21
19
|
# Defines behavior for Kerberos authentication.
|
|
22
20
|
#
|
|
23
21
|
# @api private
|
|
24
22
|
class Gssapi < Base
|
|
25
|
-
|
|
26
23
|
# The authentication mechanism string.
|
|
27
24
|
#
|
|
28
25
|
# @since 2.0.0
|
|
29
|
-
MECHANISM = 'GSSAPI'
|
|
26
|
+
MECHANISM = 'GSSAPI'
|
|
30
27
|
|
|
31
28
|
# Log the user in on the current connection.
|
|
32
29
|
#
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,14 +17,12 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
19
|
class LDAP
|
|
21
|
-
|
|
22
20
|
# Defines behavior around a single PLAIN conversation between the
|
|
23
21
|
# client and server.
|
|
24
22
|
#
|
|
25
23
|
# @since 2.0.0
|
|
26
24
|
# @api private
|
|
27
25
|
class Conversation < ConversationBase
|
|
28
|
-
|
|
29
26
|
# The login message.
|
|
30
27
|
#
|
|
31
28
|
# @since 2.0.0
|
data/lib/mongo/auth/ldap.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,17 +16,15 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
|
-
|
|
21
19
|
# Defines behavior for LDAP Proxy authentication.
|
|
22
20
|
#
|
|
23
21
|
# @since 2.0.0
|
|
24
22
|
# @api private
|
|
25
23
|
class LDAP < Base
|
|
26
|
-
|
|
27
24
|
# The authentication mechanism string.
|
|
28
25
|
#
|
|
29
26
|
# @since 2.0.0
|
|
30
|
-
MECHANISM = 'PLAIN'
|
|
27
|
+
MECHANISM = 'PLAIN'
|
|
31
28
|
|
|
32
29
|
# Log the user in on the current connection.
|
|
33
30
|
#
|
data/lib/mongo/auth/roles.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,91 +16,89 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
|
-
|
|
21
19
|
# Provides constants for the built in roles provided by MongoDB.
|
|
22
20
|
#
|
|
23
21
|
# @since 2.0.0
|
|
24
22
|
module Roles
|
|
25
|
-
|
|
26
23
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#backup
|
|
27
24
|
#
|
|
28
25
|
# @since 2.0.0
|
|
29
|
-
BACKUP = 'backup'
|
|
26
|
+
BACKUP = 'backup'
|
|
30
27
|
|
|
31
28
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#clusterAdmin
|
|
32
29
|
#
|
|
33
30
|
# @since 2.0.0
|
|
34
|
-
CLUSTER_ADMIN = 'clusterAdmin'
|
|
31
|
+
CLUSTER_ADMIN = 'clusterAdmin'
|
|
35
32
|
|
|
36
33
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#clusterManager
|
|
37
34
|
#
|
|
38
35
|
# @since 2.0.0
|
|
39
|
-
CLUSTER_MANAGER = 'clusterManager'
|
|
36
|
+
CLUSTER_MANAGER = 'clusterManager'
|
|
40
37
|
|
|
41
38
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#clusterMonitor
|
|
42
39
|
#
|
|
43
40
|
# @since 2.0.0
|
|
44
|
-
CLUSTER_MONITOR = 'clusterMonitor'
|
|
41
|
+
CLUSTER_MONITOR = 'clusterMonitor'
|
|
45
42
|
|
|
46
43
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#dbAdmin
|
|
47
44
|
#
|
|
48
45
|
# @since 2.0.0
|
|
49
|
-
DATABASE_ADMIN = 'dbAdmin'
|
|
46
|
+
DATABASE_ADMIN = 'dbAdmin'
|
|
50
47
|
|
|
51
48
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#dbAdminAnyDatabase
|
|
52
49
|
#
|
|
53
50
|
# @since 2.0.0
|
|
54
|
-
DATABASE_ADMIN_ANY_DATABASE = 'dbAdminAnyDatabase'
|
|
51
|
+
DATABASE_ADMIN_ANY_DATABASE = 'dbAdminAnyDatabase'
|
|
55
52
|
|
|
56
53
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#dbOwner
|
|
57
54
|
#
|
|
58
55
|
# @since 2.0.0
|
|
59
|
-
DATABASE_OWNER = 'dbOwner'
|
|
56
|
+
DATABASE_OWNER = 'dbOwner'
|
|
60
57
|
|
|
61
58
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#hostManager
|
|
62
59
|
#
|
|
63
60
|
# @since 2.0.0
|
|
64
|
-
HOST_MANAGER = 'hostManager'
|
|
61
|
+
HOST_MANAGER = 'hostManager'
|
|
65
62
|
|
|
66
63
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#read
|
|
67
64
|
#
|
|
68
65
|
# @since 2.0.0
|
|
69
|
-
READ = 'read'
|
|
66
|
+
READ = 'read'
|
|
70
67
|
|
|
71
68
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#readAnyDatabase
|
|
72
69
|
#
|
|
73
70
|
# @since 2.0.0
|
|
74
|
-
READ_ANY_DATABASE = 'readAnyDatabase'
|
|
71
|
+
READ_ANY_DATABASE = 'readAnyDatabase'
|
|
75
72
|
|
|
76
73
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#readWriteAnyDatabase
|
|
77
74
|
#
|
|
78
75
|
# @since 2.0.0
|
|
79
|
-
READ_WRITE_ANY_DATABASE = 'readWriteAnyDatabase'
|
|
76
|
+
READ_WRITE_ANY_DATABASE = 'readWriteAnyDatabase'
|
|
80
77
|
|
|
81
78
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#readWrite
|
|
82
79
|
#
|
|
83
80
|
# @since 2.0.0
|
|
84
|
-
READ_WRITE = 'readWrite'
|
|
81
|
+
READ_WRITE = 'readWrite'
|
|
85
82
|
|
|
86
83
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#restore
|
|
87
84
|
#
|
|
88
85
|
# @since 2.0.0
|
|
89
|
-
RESTORE = 'restore'
|
|
86
|
+
RESTORE = 'restore'
|
|
90
87
|
|
|
91
88
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#root
|
|
92
89
|
#
|
|
93
90
|
# @since 2.0.0
|
|
94
|
-
ROOT = 'root'
|
|
91
|
+
ROOT = 'root'
|
|
95
92
|
|
|
96
93
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#userAdmin
|
|
97
94
|
#
|
|
98
95
|
# @since 2.0.0
|
|
99
|
-
USER_ADMIN = 'userAdmin'
|
|
96
|
+
USER_ADMIN = 'userAdmin'
|
|
100
97
|
|
|
101
98
|
# @see https://www.mongodb.com/docs/manual/reference/built-in-roles/#userAdminAnyDatabase
|
|
102
99
|
#
|
|
103
100
|
# @since 2.0.0
|
|
104
|
-
USER_ADMIN_ANY_DATABASE = 'userAdminAnyDatabase'
|
|
101
|
+
USER_ADMIN_ANY_DATABASE = 'userAdminAnyDatabase'
|
|
105
102
|
end
|
|
106
103
|
end
|
|
107
104
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,13 +16,11 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
|
-
|
|
21
19
|
# Defines common behavior around SASL conversations between
|
|
22
20
|
# the client and the server.
|
|
23
21
|
#
|
|
24
22
|
# @api private
|
|
25
23
|
class SaslConversationBase < ConversationBase
|
|
26
|
-
|
|
27
24
|
# The base client first message.
|
|
28
25
|
CLIENT_FIRST_MESSAGE = { saslStart: 1, autoAuthorize: 1 }.freeze
|
|
29
26
|
|
|
@@ -66,14 +63,13 @@ module Mongo
|
|
|
66
63
|
|
|
67
64
|
def client_first_document
|
|
68
65
|
payload = client_first_payload
|
|
69
|
-
if Lint.enabled?
|
|
70
|
-
|
|
71
|
-
raise Error::LintError, "Payload must be a string but is a #{payload.class}: #{payload}"
|
|
72
|
-
end
|
|
66
|
+
if Lint.enabled? && !payload.is_a?(String)
|
|
67
|
+
raise Error::LintError, "Payload must be a string but is a #{payload.class}: #{payload}"
|
|
73
68
|
end
|
|
69
|
+
|
|
74
70
|
doc = CLIENT_FIRST_MESSAGE.merge(
|
|
75
71
|
mechanism: auth_mechanism_name,
|
|
76
|
-
payload: BSON::Binary.new(payload)
|
|
72
|
+
payload: BSON::Binary.new(payload)
|
|
77
73
|
)
|
|
78
74
|
if options = client_first_message_options
|
|
79
75
|
# Short SCRAM conversation,
|
|
@@ -93,9 +89,9 @@ module Mongo
|
|
|
93
89
|
raise ArgumentError, 'Cannot validate server nonce when client nonce is nil or empty'
|
|
94
90
|
end
|
|
95
91
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
92
|
+
return if server_nonce.start_with?(client_nonce)
|
|
93
|
+
|
|
94
|
+
raise Error::InvalidNonce.new(client_nonce, server_nonce)
|
|
99
95
|
end
|
|
100
96
|
end
|
|
101
97
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,13 +17,11 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
19
|
class Scram
|
|
21
|
-
|
|
22
20
|
# Defines behavior around a single SCRAM-SHA-1 conversation between
|
|
23
21
|
# the client and server.
|
|
24
22
|
#
|
|
25
23
|
# @api private
|
|
26
24
|
class Conversation < ScramConversationBase
|
|
27
|
-
|
|
28
25
|
private
|
|
29
26
|
|
|
30
27
|
# HI algorithm implementation.
|
|
@@ -39,7 +36,7 @@ module Mongo
|
|
|
39
36
|
data,
|
|
40
37
|
salt,
|
|
41
38
|
iterations,
|
|
42
|
-
digest.size
|
|
39
|
+
digest.size
|
|
43
40
|
)
|
|
44
41
|
end
|
|
45
42
|
|
|
@@ -57,7 +54,7 @@ module Mongo
|
|
|
57
54
|
end
|
|
58
55
|
|
|
59
56
|
def digest
|
|
60
|
-
@digest ||= OpenSSL::Digest
|
|
57
|
+
@digest ||= OpenSSL::Digest.new('SHA1').freeze
|
|
61
58
|
end
|
|
62
59
|
end
|
|
63
60
|
end
|
data/lib/mongo/auth/scram.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,14 +16,12 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
|
-
|
|
21
19
|
# Defines behavior for SCRAM authentication.
|
|
22
20
|
#
|
|
23
21
|
# @api private
|
|
24
22
|
class Scram < Base
|
|
25
|
-
|
|
26
23
|
# The authentication mechanism string.
|
|
27
|
-
MECHANISM = 'SCRAM-SHA-1'
|
|
24
|
+
MECHANISM = 'SCRAM-SHA-1'
|
|
28
25
|
|
|
29
26
|
# Initializes the Scram authenticator.
|
|
30
27
|
#
|
|
@@ -53,7 +50,8 @@ module Mongo
|
|
|
53
50
|
|
|
54
51
|
def conversation
|
|
55
52
|
@conversation ||= self.class.const_get(:Conversation).new(
|
|
56
|
-
user, connection, client_nonce: speculative_auth_client_nonce
|
|
53
|
+
user, connection, client_nonce: speculative_auth_client_nonce
|
|
54
|
+
)
|
|
57
55
|
end
|
|
58
56
|
|
|
59
57
|
# Log the user in on the current connection.
|
|
@@ -61,11 +59,8 @@ module Mongo
|
|
|
61
59
|
# @return [ BSON::Document ] The document of the authentication response.
|
|
62
60
|
def login
|
|
63
61
|
converse_multi_step(connection, conversation,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
unless conversation.server_verified?
|
|
67
|
-
raise Error::MissingScramServerSignature
|
|
68
|
-
end
|
|
62
|
+
speculative_auth_result: speculative_auth_result).tap do
|
|
63
|
+
raise Error::MissingScramServerSignature unless conversation.server_verified?
|
|
69
64
|
end
|
|
70
65
|
end
|
|
71
66
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,13 +17,11 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
19
|
class Scram256
|
|
21
|
-
|
|
22
20
|
# Defines behavior around a single SCRAM-SHA-256 conversation between
|
|
23
21
|
# the client and server.
|
|
24
22
|
#
|
|
25
23
|
# @api private
|
|
26
24
|
class Conversation < ScramConversationBase
|
|
27
|
-
|
|
28
25
|
private
|
|
29
26
|
|
|
30
27
|
# HI algorithm implementation.
|
|
@@ -40,7 +37,7 @@ module Mongo
|
|
|
40
37
|
salt,
|
|
41
38
|
iterations,
|
|
42
39
|
digest.size,
|
|
43
|
-
digest
|
|
40
|
+
digest
|
|
44
41
|
)
|
|
45
42
|
end
|
|
46
43
|
|
|
@@ -58,7 +55,7 @@ module Mongo
|
|
|
58
55
|
end
|
|
59
56
|
|
|
60
57
|
def digest
|
|
61
|
-
@digest ||= OpenSSL::Digest
|
|
58
|
+
@digest ||= OpenSSL::Digest.new('SHA256').freeze
|
|
62
59
|
end
|
|
63
60
|
end
|
|
64
61
|
end
|
data/lib/mongo/auth/scram256.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
|
-
|
|
21
19
|
# Defines behavior for SCRAM-SHA-256 authentication.
|
|
22
20
|
#
|
|
23
21
|
# The purpose of this class is to provide the namespace for the
|
|
@@ -26,7 +24,7 @@ module Mongo
|
|
|
26
24
|
# @api private
|
|
27
25
|
class Scram256 < Scram
|
|
28
26
|
# The authentication mechanism string.
|
|
29
|
-
MECHANISM = 'SCRAM-SHA-256'
|
|
27
|
+
MECHANISM = 'SCRAM-SHA-256'
|
|
30
28
|
end
|
|
31
29
|
end
|
|
32
30
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,13 +16,11 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Auth
|
|
20
|
-
|
|
21
19
|
# Defines common behavior around authentication conversations between
|
|
22
20
|
# the client and the server.
|
|
23
21
|
#
|
|
24
22
|
# @api private
|
|
25
23
|
class ScramConversationBase < SaslConversationBase
|
|
26
|
-
|
|
27
24
|
# The minimum iteration count for SCRAM-SHA-1 and SCRAM-SHA-256.
|
|
28
25
|
MIN_ITER_COUNT = 4096
|
|
29
26
|
|
|
@@ -55,7 +52,7 @@ module Mongo
|
|
|
55
52
|
#
|
|
56
53
|
# @see https://jira.mongodb.org/browse/SECURITY-621
|
|
57
54
|
#
|
|
58
|
-
# @return [ true |
|
|
55
|
+
# @return [ true | false ] Whether the server's signature was verified.
|
|
59
56
|
def server_verified?
|
|
60
57
|
!!@server_verified
|
|
61
58
|
end
|
|
@@ -79,7 +76,8 @@ module Mongo
|
|
|
79
76
|
@iterations = parsed_data.fetch('i').to_i.tap do |i|
|
|
80
77
|
if i < MIN_ITER_COUNT
|
|
81
78
|
raise Error::InsufficientIterationCount.new(
|
|
82
|
-
Error::InsufficientIterationCount.message(MIN_ITER_COUNT, i)
|
|
79
|
+
Error::InsufficientIterationCount.message(MIN_ITER_COUNT, i)
|
|
80
|
+
)
|
|
83
81
|
end
|
|
84
82
|
end
|
|
85
83
|
@auth_message = "#{first_bare},#{payload_data},#{without_proof}"
|
|
@@ -88,7 +86,7 @@ module Mongo
|
|
|
88
86
|
|
|
89
87
|
selector = CLIENT_CONTINUE_MESSAGE.merge(
|
|
90
88
|
payload: client_final_message,
|
|
91
|
-
conversationId: id
|
|
89
|
+
conversationId: id
|
|
92
90
|
)
|
|
93
91
|
build_message(connection, user.auth_source, selector)
|
|
94
92
|
end
|
|
@@ -111,7 +109,7 @@ module Mongo
|
|
|
111
109
|
def finalize(connection)
|
|
112
110
|
selector = CLIENT_CONTINUE_MESSAGE.merge(
|
|
113
111
|
payload: client_empty_message,
|
|
114
|
-
conversationId: id
|
|
112
|
+
conversationId: id
|
|
115
113
|
)
|
|
116
114
|
build_message(connection, user.auth_source, selector)
|
|
117
115
|
end
|
|
@@ -138,15 +136,14 @@ module Mongo
|
|
|
138
136
|
def parse_payload(payload)
|
|
139
137
|
Hash[payload.split(',').reject { |v| v == '' }.map do |pair|
|
|
140
138
|
k, v, = pair.split('=', 2)
|
|
141
|
-
if k == ''
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
[k, v]
|
|
139
|
+
raise Error::InvalidServerAuthResponse, 'Payload malformed: missing key' if k == ''
|
|
140
|
+
|
|
141
|
+
[ k, v ]
|
|
145
142
|
end]
|
|
146
143
|
end
|
|
147
144
|
|
|
148
145
|
def client_first_message_options
|
|
149
|
-
{skipEmptyExchange: true}
|
|
146
|
+
{ skipEmptyExchange: true }
|
|
150
147
|
end
|
|
151
148
|
|
|
152
149
|
# @see http://tools.ietf.org/html/rfc5802#section-3
|
|
@@ -192,8 +189,8 @@ module Mongo
|
|
|
192
189
|
# @since 2.0.0
|
|
193
190
|
def client_final
|
|
194
191
|
@client_final ||= client_proof(client_key,
|
|
195
|
-
|
|
196
|
-
|
|
192
|
+
client_signature(stored_key(client_key),
|
|
193
|
+
auth_message))
|
|
197
194
|
end
|
|
198
195
|
|
|
199
196
|
# Looks for field 'v' in payload data, if it is present verifies the
|
|
@@ -203,13 +200,10 @@ module Mongo
|
|
|
203
200
|
# This method can be called from different conversation steps
|
|
204
201
|
# depending on whether the short SCRAM conversation is used.
|
|
205
202
|
def check_server_signature(payload_data)
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
raise Error::InvalidSignature.new(verifier, server_signature)
|
|
211
|
-
end
|
|
212
|
-
end
|
|
203
|
+
return unless verifier = payload_data['v']
|
|
204
|
+
raise Error::InvalidSignature.new(verifier, server_signature) unless compare_digest(verifier, server_signature)
|
|
205
|
+
|
|
206
|
+
@server_verified = true
|
|
213
207
|
end
|
|
214
208
|
|
|
215
209
|
# Client key algorithm implementation.
|
|
@@ -310,7 +304,7 @@ module Mongo
|
|
|
310
304
|
|
|
311
305
|
# @api private
|
|
312
306
|
def cache_key(*extra)
|
|
313
|
-
[user.password, salt, iterations, @mechanism] + extra
|
|
307
|
+
[ user.password, salt, iterations, @mechanism ] + extra
|
|
314
308
|
end
|
|
315
309
|
|
|
316
310
|
# Server key algorithm implementation.
|
|
@@ -365,12 +359,12 @@ module Mongo
|
|
|
365
359
|
#
|
|
366
360
|
# @since 2.0.0
|
|
367
361
|
def xor(first, second)
|
|
368
|
-
first.bytes.zip(second.bytes).map{ |(a,b)| (a ^ b).chr }.join('')
|
|
362
|
+
first.bytes.zip(second.bytes).map { |(a, b)| (a ^ b).chr }.join('')
|
|
369
363
|
end
|
|
370
364
|
|
|
371
365
|
def compare_digest(a, b)
|
|
372
366
|
check = a.bytesize ^ b.bytesize
|
|
373
|
-
a.bytes.zip(b.bytes){ |x, y| check |= x ^ y.to_i }
|
|
367
|
+
a.bytes.zip(b.bytes) { |x, y| check |= x ^ y.to_i }
|
|
374
368
|
check == 0
|
|
375
369
|
end
|
|
376
370
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2018-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -27,23 +26,23 @@ module Mongo
|
|
|
27
26
|
# @api private
|
|
28
27
|
module SASL
|
|
29
28
|
MAP_NON_ASCII_TO_SPACE = {
|
|
30
|
-
0x00A0 => [0x0020],
|
|
31
|
-
0x1680 => [0x0020],
|
|
32
|
-
0x2000 => [0x0020],
|
|
33
|
-
0x2001 => [0x0020],
|
|
34
|
-
0x2002 => [0x0020],
|
|
35
|
-
0x2003 => [0x0020],
|
|
36
|
-
0x2004 => [0x0020],
|
|
37
|
-
0x2005 => [0x0020],
|
|
38
|
-
0x2006 => [0x0020],
|
|
39
|
-
0x2007 => [0x0020],
|
|
40
|
-
0x2008 => [0x0020],
|
|
41
|
-
0x2009 => [0x0020],
|
|
42
|
-
0x200A => [0x0020],
|
|
43
|
-
0x200B => [0x0020],
|
|
44
|
-
0x202F => [0x0020],
|
|
45
|
-
0x205F => [0x0020],
|
|
46
|
-
0x3000 => [0x0020],
|
|
29
|
+
0x00A0 => [ 0x0020 ],
|
|
30
|
+
0x1680 => [ 0x0020 ],
|
|
31
|
+
0x2000 => [ 0x0020 ],
|
|
32
|
+
0x2001 => [ 0x0020 ],
|
|
33
|
+
0x2002 => [ 0x0020 ],
|
|
34
|
+
0x2003 => [ 0x0020 ],
|
|
35
|
+
0x2004 => [ 0x0020 ],
|
|
36
|
+
0x2005 => [ 0x0020 ],
|
|
37
|
+
0x2006 => [ 0x0020 ],
|
|
38
|
+
0x2007 => [ 0x0020 ],
|
|
39
|
+
0x2008 => [ 0x0020 ],
|
|
40
|
+
0x2009 => [ 0x0020 ],
|
|
41
|
+
0x200A => [ 0x0020 ],
|
|
42
|
+
0x200B => [ 0x0020 ],
|
|
43
|
+
0x202F => [ 0x0020 ],
|
|
44
|
+
0x205F => [ 0x0020 ],
|
|
45
|
+
0x3000 => [ 0x0020 ],
|
|
47
46
|
}.freeze
|
|
48
47
|
|
|
49
48
|
# The mappings to use for SASL string preparation.
|