mongo 2.11.4 → 2.18.1
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
- checksums.yaml.gz.sig +0 -0
- data/CONTRIBUTING.md +8 -36
- data/LICENSE +1 -1
- data/README.md +65 -77
- data/Rakefile +58 -24
- data/lib/mongo/active_support.rb +4 -1
- data/lib/mongo/address/ipv4.rb +35 -5
- data/lib/mongo/address/ipv6.rb +35 -5
- data/lib/mongo/address/unix.rb +6 -3
- data/lib/mongo/address/validator.rb +4 -1
- data/lib/mongo/address.rb +81 -26
- data/lib/mongo/auth/aws/conversation.rb +128 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
- data/lib/mongo/auth/aws/request.rb +285 -0
- data/lib/mongo/auth/aws.rb +40 -0
- data/lib/mongo/auth/base.rb +145 -0
- data/lib/mongo/auth/conversation_base.rb +87 -0
- data/lib/mongo/auth/cr/conversation.rb +21 -86
- data/lib/mongo/auth/cr.rb +12 -36
- data/lib/mongo/auth/credential_cache.rb +54 -0
- data/lib/mongo/auth/gssapi/conversation.rb +100 -0
- data/lib/mongo/auth/gssapi.rb +41 -0
- data/lib/mongo/auth/ldap/conversation.rb +9 -57
- data/lib/mongo/auth/ldap.rb +12 -34
- data/lib/mongo/auth/roles.rb +4 -1
- data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
- data/lib/mongo/auth/scram/conversation.rb +15 -502
- data/lib/mongo/auth/scram.rb +42 -51
- data/lib/mongo/auth/scram256/conversation.rb +66 -0
- data/lib/mongo/auth/scram256.rb +34 -0
- data/lib/mongo/auth/scram_conversation_base.rb +378 -0
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +5 -1
- data/lib/mongo/auth/stringprep/tables.rb +5 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +3 -2
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
- data/lib/mongo/auth/stringprep.rb +9 -5
- data/lib/mongo/auth/user/view.rb +20 -10
- data/lib/mongo/auth/user.rb +5 -10
- data/lib/mongo/auth/x509/conversation.rb +21 -66
- data/lib/mongo/auth/x509.rb +17 -32
- data/lib/mongo/auth.rb +52 -14
- data/lib/mongo/background_thread.rb +27 -4
- data/lib/mongo/bson.rb +4 -1
- data/lib/mongo/bulk_write/combineable.rb +23 -8
- data/lib/mongo/bulk_write/ordered_combiner.rb +4 -1
- data/lib/mongo/bulk_write/result.rb +14 -2
- data/lib/mongo/bulk_write/result_combiner.rb +6 -5
- data/lib/mongo/bulk_write/transformable.rb +12 -10
- data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
- data/lib/mongo/bulk_write/validatable.rb +8 -1
- data/lib/mongo/bulk_write.rb +187 -42
- data/lib/mongo/caching_cursor.rb +77 -0
- data/lib/mongo/client.rb +669 -68
- data/lib/mongo/client_encryption.rb +209 -0
- data/lib/mongo/cluster/periodic_executor.rb +8 -4
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +120 -46
- data/lib/mongo/cluster/reapers/socket_reaper.rb +4 -1
- data/lib/mongo/cluster/sdam_flow.rb +112 -74
- data/lib/mongo/cluster/topology/base.rb +17 -10
- data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +4 -1
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +7 -3
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +4 -1
- data/lib/mongo/cluster/topology/sharded.rb +5 -2
- data/lib/mongo/cluster/topology/single.rb +6 -3
- data/lib/mongo/cluster/topology/unknown.rb +4 -1
- data/lib/mongo/cluster/topology.rb +44 -4
- data/lib/mongo/cluster.rb +344 -155
- data/lib/mongo/cluster_time.rb +4 -1
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +122 -0
- data/lib/mongo/collection/view/aggregation.rb +96 -23
- data/lib/mongo/collection/view/builder/aggregation.rb +20 -18
- data/lib/mongo/collection/view/builder/map_reduce.rb +19 -50
- data/lib/mongo/collection/view/builder.rb +4 -5
- data/lib/mongo/collection/view/change_stream/retryable.rb +4 -1
- data/lib/mongo/collection/view/change_stream.rb +83 -28
- data/lib/mongo/collection/view/explainable.rb +31 -9
- data/lib/mongo/collection/view/immutable.rb +4 -1
- data/lib/mongo/collection/view/iterable.rb +135 -23
- data/lib/mongo/collection/view/map_reduce.rb +78 -24
- data/lib/mongo/collection/view/readable.rb +162 -71
- data/lib/mongo/collection/view/writable.rb +356 -140
- data/lib/mongo/collection/view.rb +47 -42
- data/lib/mongo/collection.rb +244 -68
- data/lib/mongo/config/options.rb +62 -0
- data/lib/mongo/config/validators/option.rb +26 -0
- data/lib/mongo/config.rb +42 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
- data/lib/mongo/crypt/auto_encrypter.rb +304 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
- data/lib/mongo/crypt/binary.rb +158 -0
- data/lib/mongo/crypt/binding.rb +1601 -0
- data/lib/mongo/crypt/context.rb +141 -0
- data/lib/mongo/crypt/data_key_context.rb +73 -0
- data/lib/mongo/crypt/encryption_io.rb +343 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +237 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +115 -0
- data/lib/mongo/crypt/handle.rb +392 -0
- data/lib/mongo/crypt/hooks.rb +116 -0
- data/lib/mongo/crypt/kms/aws.rb +136 -0
- data/lib/mongo/crypt/kms/azure.rb +144 -0
- data/lib/mongo/crypt/kms/credentials.rb +81 -0
- data/lib/mongo/crypt/kms/gcp.rb +189 -0
- data/lib/mongo/crypt/kms/kmip.rb +116 -0
- data/lib/mongo/crypt/kms/local.rb +82 -0
- data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
- data/lib/mongo/crypt/kms.rb +117 -0
- data/lib/mongo/crypt/kms_context.rb +70 -0
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
- data/lib/mongo/crypt/status.rb +140 -0
- data/lib/mongo/crypt.rb +39 -0
- data/lib/mongo/cursor/kill_spec.rb +76 -0
- data/lib/mongo/cursor.rb +175 -70
- data/lib/mongo/database/view.rb +41 -9
- data/lib/mongo/database.rb +142 -25
- data/lib/mongo/dbref.rb +5 -99
- data/lib/mongo/distinguishing_semaphore.rb +58 -0
- data/lib/mongo/error/auth_error.rb +4 -1
- data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
- data/lib/mongo/error/bulk_write_error.rb +60 -14
- data/lib/mongo/error/change_stream_resumable.rb +4 -1
- data/lib/mongo/error/closed_stream.rb +4 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +4 -1
- data/lib/mongo/error/connection_perished.rb +26 -0
- data/lib/mongo/error/credential_check_error.rb +29 -0
- data/lib/mongo/error/crypt_error.rb +34 -0
- data/lib/mongo/error/extra_file_chunk.rb +4 -1
- data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +3 -0
- data/lib/mongo/error/file_not_found.rb +4 -1
- data/lib/mongo/error/handshake_error.rb +4 -1
- data/lib/mongo/error/insufficient_iteration_count.rb +4 -1
- data/lib/mongo/error/internal_driver_error.rb +25 -0
- data/lib/mongo/error/invalid_address.rb +4 -1
- data/lib/mongo/error/invalid_application_name.rb +4 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +4 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +4 -1
- data/lib/mongo/error/invalid_collection_name.rb +4 -1
- data/lib/mongo/error/invalid_config_option.rb +20 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
- data/lib/mongo/error/invalid_database_name.rb +4 -1
- data/lib/mongo/error/invalid_document.rb +4 -1
- data/lib/mongo/error/invalid_file.rb +4 -1
- data/lib/mongo/error/invalid_file_revision.rb +4 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +4 -1
- data/lib/mongo/error/invalid_nonce.rb +5 -2
- data/lib/mongo/error/invalid_read_concern.rb +31 -0
- data/lib/mongo/error/invalid_read_option.rb +4 -1
- data/lib/mongo/error/invalid_replacement_document.rb +31 -10
- data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
- data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
- data/lib/mongo/error/invalid_server_preference.rb +9 -1
- data/lib/mongo/error/invalid_session.rb +6 -2
- data/lib/mongo/error/invalid_signature.rb +4 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +4 -1
- data/lib/mongo/error/invalid_txt_record.rb +4 -1
- data/lib/mongo/error/invalid_update_document.rb +31 -8
- data/lib/mongo/error/invalid_uri.rb +4 -1
- data/lib/mongo/error/invalid_write_concern.rb +4 -1
- data/{spec/support/crud/context.rb → lib/mongo/error/kms_error.rb} +8 -6
- data/lib/mongo/error/labelable.rb +72 -0
- data/lib/mongo/error/lint_error.rb +4 -1
- data/lib/mongo/error/max_bson_size.rb +18 -4
- data/lib/mongo/error/max_message_size.rb +4 -1
- data/lib/mongo/error/mismatched_domain.rb +4 -1
- data/lib/mongo/error/missing_connection.rb +25 -0
- data/lib/mongo/error/missing_file_chunk.rb +12 -3
- data/lib/mongo/error/missing_password.rb +4 -1
- data/lib/mongo/error/missing_resume_token.rb +4 -1
- data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
- data/lib/mongo/error/missing_service_id.rb +26 -0
- data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
- data/lib/mongo/error/multi_index_drop.rb +4 -1
- data/lib/mongo/error/need_primary_server.rb +4 -1
- data/lib/mongo/error/no_server_available.rb +12 -4
- data/lib/mongo/error/no_service_connection_available.rb +49 -0
- data/lib/mongo/error/no_srv_records.rb +4 -1
- data/lib/mongo/error/notable.rb +34 -17
- data/lib/mongo/error/operation_failure.rb +107 -117
- data/lib/mongo/error/parser.rb +85 -18
- data/lib/mongo/error/pool_closed_error.rb +4 -1
- data/lib/mongo/error/raise_original_error.rb +32 -0
- data/lib/mongo/error/read_write_retryable.rb +108 -0
- data/lib/mongo/error/sdam_error_detection.rb +16 -5
- data/lib/mongo/error/server_api_conflict.rb +26 -0
- data/lib/mongo/error/server_api_not_supported.rb +27 -0
- data/lib/mongo/error/server_certificate_revoked.rb +25 -0
- data/lib/mongo/error/session_ended.rb +4 -1
- data/lib/mongo/error/session_not_materialized.rb +29 -0
- data/lib/mongo/error/sessions_not_supported.rb +38 -0
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
- data/lib/mongo/error/socket_error.rb +4 -1
- data/lib/mongo/error/socket_timeout_error.rb +4 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +4 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +4 -1
- data/lib/mongo/error/unexpected_response.rb +4 -1
- data/lib/mongo/error/unknown_payload_type.rb +4 -1
- data/lib/mongo/{cursor/builder.rb → error/unmet_dependency.rb} +11 -5
- data/lib/mongo/error/unsupported_array_filters.rb +10 -2
- data/lib/mongo/error/unsupported_collation.rb +10 -2
- data/lib/mongo/error/unsupported_features.rb +4 -1
- data/lib/mongo/error/unsupported_message_type.rb +4 -1
- data/lib/mongo/error/unsupported_option.rb +104 -0
- data/lib/mongo/error/write_retryable.rb +4 -1
- data/lib/mongo/error.rb +50 -34
- data/lib/mongo/event/base.rb +10 -1
- data/lib/mongo/event/listeners.rb +4 -1
- data/lib/mongo/event/publisher.rb +4 -1
- data/lib/mongo/event/subscriber.rb +4 -1
- data/lib/mongo/event.rb +4 -1
- data/lib/mongo/grid/file/chunk.rb +7 -2
- data/lib/mongo/grid/file/info.rb +7 -3
- data/lib/mongo/grid/file.rb +9 -1
- data/lib/mongo/grid/fs_bucket.rb +108 -61
- data/lib/mongo/grid/stream/read.rb +29 -8
- data/lib/mongo/grid/stream/write.rb +13 -4
- data/lib/mongo/grid/stream.rb +4 -1
- data/lib/mongo/grid.rb +4 -1
- data/lib/mongo/id.rb +11 -6
- data/lib/mongo/index/view.rb +103 -43
- data/lib/mongo/index.rb +5 -1
- data/lib/mongo/lint.rb +14 -0
- data/lib/mongo/loggable.rb +4 -1
- data/lib/mongo/logger.rb +7 -4
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/command_log_subscriber.rb +23 -5
- data/lib/mongo/monitoring/event/cmap/base.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +5 -2
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +11 -5
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +4 -1
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +4 -1
- data/lib/mongo/monitoring/event/cmap.rb +4 -1
- data/lib/mongo/monitoring/event/command_failed.rb +50 -6
- data/lib/mongo/monitoring/event/command_started.rb +70 -4
- data/lib/mongo/monitoring/event/command_succeeded.rb +48 -4
- data/lib/mongo/monitoring/event/secure.rb +44 -4
- data/lib/mongo/monitoring/event/server_closed.rb +5 -2
- data/lib/mongo/monitoring/event/server_description_changed.rb +31 -5
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +39 -18
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +13 -3
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +34 -13
- data/lib/mongo/monitoring/event/server_opening.rb +5 -2
- data/lib/mongo/monitoring/event/topology_changed.rb +5 -2
- data/lib/mongo/monitoring/event/topology_closed.rb +5 -2
- data/lib/mongo/monitoring/event/topology_opening.rb +5 -2
- data/lib/mongo/monitoring/event.rb +4 -1
- data/lib/mongo/monitoring/publishable.rb +43 -17
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +13 -2
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -2
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring.rb +51 -1
- data/lib/mongo/operation/aggregate/command.rb +16 -5
- data/lib/mongo/operation/aggregate/op_msg.rb +4 -1
- data/lib/mongo/operation/aggregate/result.rb +13 -9
- data/lib/mongo/operation/aggregate.rb +4 -1
- data/lib/mongo/operation/{delete/legacy.rb → collections_info/command.rb} +15 -21
- data/lib/mongo/operation/collections_info/result.rb +25 -2
- data/lib/mongo/operation/collections_info.rb +18 -28
- data/lib/mongo/operation/command/command.rb +6 -3
- data/lib/mongo/operation/command/op_msg.rb +10 -1
- data/lib/mongo/operation/command.rb +4 -1
- data/lib/mongo/operation/context.rb +138 -0
- data/lib/mongo/operation/count/command.rb +12 -3
- data/lib/mongo/operation/count/op_msg.rb +13 -1
- data/lib/mongo/operation/count.rb +4 -1
- data/lib/mongo/operation/create/command.rb +13 -4
- data/lib/mongo/operation/create/op_msg.rb +14 -1
- data/lib/mongo/operation/create.rb +4 -1
- data/lib/mongo/operation/create_index/command.rb +24 -5
- data/lib/mongo/operation/create_index/op_msg.rb +23 -3
- data/lib/mongo/operation/create_index.rb +4 -1
- data/lib/mongo/operation/create_user/command.rb +7 -4
- data/lib/mongo/operation/create_user/op_msg.rb +5 -2
- data/lib/mongo/operation/create_user.rb +4 -1
- data/lib/mongo/operation/delete/bulk_result.rb +6 -1
- data/lib/mongo/operation/delete/command.rb +13 -7
- data/lib/mongo/operation/delete/op_msg.rb +18 -6
- data/lib/mongo/operation/delete/result.rb +8 -2
- data/lib/mongo/operation/delete.rb +4 -2
- data/lib/mongo/operation/distinct/command.rb +12 -3
- data/lib/mongo/operation/distinct/op_msg.rb +14 -1
- data/lib/mongo/operation/distinct.rb +4 -1
- data/lib/mongo/operation/drop/command.rb +6 -3
- data/lib/mongo/operation/drop/op_msg.rb +4 -1
- data/lib/mongo/operation/drop.rb +4 -1
- data/lib/mongo/operation/drop_database/command.rb +6 -3
- data/lib/mongo/operation/drop_database/op_msg.rb +4 -1
- data/lib/mongo/operation/drop_database.rb +4 -1
- data/lib/mongo/operation/drop_index/command.rb +7 -4
- data/lib/mongo/operation/drop_index/op_msg.rb +10 -3
- data/lib/mongo/operation/drop_index.rb +4 -1
- data/lib/mongo/operation/explain/command.rb +22 -3
- data/lib/mongo/operation/explain/legacy.rb +17 -3
- data/lib/mongo/operation/explain/op_msg.rb +18 -1
- data/lib/mongo/operation/explain/result.rb +7 -1
- data/lib/mongo/operation/explain.rb +4 -1
- data/lib/mongo/operation/find/builder/command.rb +111 -0
- data/lib/mongo/{collection/view → operation/find}/builder/flags.rb +14 -15
- data/lib/mongo/operation/find/builder/legacy.rb +123 -0
- data/lib/mongo/{collection/view → operation/find}/builder/modifiers.rb +35 -26
- data/lib/mongo/operation/find/builder.rb +21 -0
- data/lib/mongo/operation/find/command.rb +15 -3
- data/lib/mongo/operation/find/legacy/result.rb +6 -1
- data/lib/mongo/operation/find/legacy.rb +15 -3
- data/lib/mongo/operation/find/op_msg.rb +17 -9
- data/lib/mongo/operation/find/result.rb +17 -1
- data/lib/mongo/operation/find.rb +5 -1
- data/lib/mongo/operation/get_more/command.rb +7 -3
- data/lib/mongo/operation/get_more/command_builder.rb +42 -0
- data/lib/mongo/operation/get_more/legacy.rb +5 -2
- data/lib/mongo/operation/get_more/op_msg.rb +6 -9
- data/lib/mongo/operation/get_more/result.rb +7 -1
- data/lib/mongo/operation/get_more.rb +5 -1
- data/lib/mongo/operation/indexes/command.rb +6 -3
- data/lib/mongo/operation/indexes/legacy.rb +7 -4
- data/lib/mongo/operation/indexes/op_msg.rb +4 -1
- data/lib/mongo/operation/indexes/result.rb +9 -1
- data/lib/mongo/operation/indexes.rb +19 -2
- data/lib/mongo/operation/insert/bulk_result.rb +18 -2
- data/lib/mongo/operation/insert/command.rb +10 -10
- data/lib/mongo/operation/insert/op_msg.rb +15 -9
- data/lib/mongo/operation/insert/result.rb +18 -4
- data/lib/mongo/operation/insert.rb +6 -3
- data/lib/mongo/operation/kill_cursors/command.rb +14 -3
- data/lib/mongo/operation/kill_cursors/{legacy.rb → command_builder.rb} +9 -11
- data/lib/mongo/operation/kill_cursors/op_msg.rb +14 -1
- data/lib/mongo/operation/kill_cursors.rb +5 -2
- data/lib/mongo/operation/list_collections/command.rb +7 -4
- data/lib/mongo/operation/list_collections/op_msg.rb +9 -3
- data/lib/mongo/operation/list_collections/result.rb +13 -2
- data/lib/mongo/operation/list_collections.rb +4 -1
- data/lib/mongo/operation/map_reduce/command.rb +14 -3
- data/lib/mongo/operation/map_reduce/op_msg.rb +5 -2
- data/lib/mongo/operation/map_reduce/result.rb +30 -1
- data/lib/mongo/operation/map_reduce.rb +4 -1
- data/lib/mongo/operation/op_msg_base.rb +6 -3
- data/lib/mongo/operation/parallel_scan/command.rb +8 -6
- data/lib/mongo/operation/parallel_scan/op_msg.rb +5 -2
- data/lib/mongo/operation/parallel_scan/result.rb +8 -1
- data/lib/mongo/operation/parallel_scan.rb +4 -1
- data/lib/mongo/operation/remove_user/command.rb +7 -4
- data/lib/mongo/operation/remove_user/op_msg.rb +5 -2
- data/lib/mongo/operation/remove_user.rb +4 -1
- data/lib/mongo/operation/result.rb +126 -37
- data/lib/mongo/operation/shared/bypass_document_validation.rb +14 -4
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +7 -3
- data/lib/mongo/operation/shared/executable.rb +92 -28
- data/lib/mongo/operation/shared/executable_no_validate.rb +6 -3
- data/lib/mongo/operation/shared/executable_transaction_label.rb +4 -1
- data/lib/mongo/operation/shared/idable.rb +6 -2
- data/lib/mongo/operation/shared/limited.rb +14 -2
- data/lib/mongo/operation/shared/object_id_generator.rb +5 -1
- data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -8
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -9
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +4 -1
- data/lib/mongo/operation/shared/polymorphic_operation.rb +54 -0
- data/lib/mongo/operation/shared/polymorphic_result.rb +4 -1
- data/lib/mongo/operation/shared/read_preference_supported.rb +82 -23
- data/lib/mongo/operation/shared/response_handling.rb +97 -17
- data/lib/mongo/operation/shared/result/aggregatable.rb +5 -1
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +4 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +126 -26
- data/lib/mongo/operation/shared/specifiable.rb +36 -38
- data/lib/mongo/operation/shared/validatable.rb +87 -0
- data/lib/mongo/operation/shared/write.rb +37 -24
- data/lib/mongo/operation/shared/write_concern_supported.rb +10 -6
- data/lib/mongo/operation/update/bulk_result.rb +4 -1
- data/lib/mongo/operation/update/command.rb +13 -7
- data/lib/mongo/operation/update/op_msg.rb +16 -8
- data/lib/mongo/operation/update/result.rb +13 -2
- data/lib/mongo/operation/update.rb +4 -2
- data/lib/mongo/operation/update_user/command.rb +7 -4
- data/lib/mongo/operation/update_user/op_msg.rb +5 -2
- data/lib/mongo/operation/update_user.rb +4 -1
- data/lib/mongo/operation/users_info/command.rb +7 -4
- data/lib/mongo/operation/users_info/op_msg.rb +5 -2
- data/lib/mongo/operation/users_info/result.rb +7 -1
- data/lib/mongo/operation/users_info.rb +4 -1
- data/lib/mongo/operation/write_command/command.rb +51 -0
- data/lib/mongo/operation/write_command/op_msg.rb +43 -0
- data/lib/mongo/operation/write_command.rb +32 -0
- data/lib/mongo/operation.rb +17 -1
- data/lib/mongo/options/mapper.rb +4 -1
- data/lib/mongo/options/redacted.rb +4 -1
- data/lib/mongo/options.rb +4 -1
- data/lib/mongo/protocol/bit_vector.rb +6 -2
- data/lib/mongo/protocol/caching_hash.rb +69 -0
- data/lib/mongo/protocol/compressed.rb +61 -11
- data/lib/mongo/protocol/delete.rb +4 -1
- data/lib/mongo/protocol/get_more.rb +4 -1
- data/lib/mongo/protocol/insert.rb +7 -2
- data/lib/mongo/protocol/kill_cursors.rb +4 -1
- data/lib/mongo/protocol/message.rb +158 -21
- data/lib/mongo/protocol/msg.rb +268 -41
- data/lib/mongo/protocol/query.rb +97 -42
- data/lib/mongo/protocol/registry.rb +4 -1
- data/lib/mongo/protocol/reply.rb +4 -1
- data/lib/mongo/protocol/serializers.rb +47 -16
- data/lib/mongo/protocol/update.rb +4 -1
- data/lib/mongo/protocol.rb +4 -0
- data/lib/mongo/query_cache.rb +300 -0
- data/lib/mongo/retryable.rb +114 -43
- data/lib/mongo/semaphore.rb +4 -1
- data/lib/mongo/server/app_metadata.rb +128 -35
- data/lib/mongo/server/connection.rb +105 -127
- data/lib/mongo/server/connection_base.rb +173 -32
- data/lib/mongo/server/connection_common.rb +208 -0
- data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
- data/lib/mongo/server/connection_pool/populator.rb +5 -2
- data/lib/mongo/server/connection_pool.rb +206 -42
- data/lib/mongo/server/description/features.rb +41 -23
- data/lib/mongo/{srv/warning_result.rb → server/description/load_balancer.rb} +13 -15
- data/lib/mongo/server/description.rb +183 -30
- data/lib/mongo/server/monitor/app_metadata.rb +5 -2
- data/lib/mongo/server/monitor/connection.rb +148 -117
- data/lib/mongo/server/monitor.rb +183 -79
- data/lib/mongo/server/pending_connection.rb +247 -1
- data/lib/mongo/server/push_monitor/connection.rb +31 -0
- data/lib/mongo/server/push_monitor.rb +207 -0
- data/lib/mongo/server/round_trip_time_averager.rb +18 -6
- data/lib/mongo/server.rb +154 -52
- data/lib/mongo/server_selector/{selectable.rb → base.rb} +197 -91
- data/lib/mongo/server_selector/nearest.rb +32 -25
- data/lib/mongo/server_selector/primary.rb +30 -32
- data/lib/mongo/server_selector/primary_preferred.rb +38 -29
- data/lib/mongo/server_selector/secondary.rb +32 -25
- data/lib/mongo/server_selector/secondary_preferred.rb +30 -38
- data/lib/mongo/server_selector.rb +5 -2
- data/lib/mongo/session/server_session.rb +4 -1
- data/lib/mongo/session/session_pool.rb +33 -4
- data/lib/mongo/session.rb +178 -39
- data/lib/mongo/socket/ocsp_cache.rb +99 -0
- data/lib/mongo/socket/ocsp_verifier.rb +344 -0
- data/lib/mongo/socket/ssl.rb +165 -55
- data/lib/mongo/socket/tcp.rb +48 -25
- data/lib/mongo/socket/unix.rb +17 -6
- data/lib/mongo/socket.rb +168 -47
- data/lib/mongo/srv/monitor.rb +64 -47
- data/lib/mongo/srv/resolver.rb +42 -14
- data/lib/mongo/srv/result.rb +4 -2
- data/lib/mongo/srv.rb +4 -1
- data/lib/mongo/timeout.rb +54 -0
- data/lib/mongo/topology_version.rb +92 -0
- data/lib/mongo/uri/options_mapper.rb +626 -0
- data/lib/mongo/uri/srv_protocol.rb +23 -13
- data/lib/mongo/uri.rb +103 -388
- data/lib/mongo/utils.rb +105 -0
- data/lib/mongo/version.rb +5 -2
- data/lib/mongo/write_concern/acknowledged.rb +4 -1
- data/lib/mongo/write_concern/base.rb +4 -1
- data/lib/mongo/write_concern/unacknowledged.rb +4 -1
- data/lib/mongo/write_concern.rb +4 -1
- data/lib/mongo.rb +67 -2
- data/mongo.gemspec +12 -8
- data/spec/NOTES.aws-auth.md +296 -0
- data/spec/README.aws-auth.md +318 -0
- data/spec/README.md +386 -15
- data/spec/atlas/atlas_connectivity_spec.rb +3 -0
- data/spec/atlas/operations_spec.rb +3 -0
- data/spec/integration/auth_spec.rb +130 -14
- data/spec/integration/awaited_ismaster_spec.rb +31 -0
- data/spec/integration/aws_auth_request_spec.rb +77 -0
- data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
- data/spec/integration/aws_lambda_examples_spec.rb +68 -0
- data/spec/integration/bson_symbol_spec.rb +8 -3
- data/spec/integration/bulk_insert_spec.rb +3 -0
- data/spec/integration/bulk_write_error_message_spec.rb +73 -0
- data/spec/integration/bulk_write_spec.rb +86 -0
- data/spec/integration/change_stream_examples_spec.rb +9 -2
- data/spec/integration/change_stream_spec.rb +133 -57
- data/spec/integration/check_clean_slate_spec.rb +19 -0
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +123 -46
- data/spec/integration/client_connectivity_spec.rb +4 -1
- data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
- data/spec/integration/client_construction_spec.rb +225 -2
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +74 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +255 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +711 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +265 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +258 -0
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +158 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +176 -0
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
- data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
- data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
- data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
- data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +85 -0
- data/spec/integration/client_side_encryption/views_spec.rb +47 -0
- data/spec/integration/client_spec.rb +7 -2
- data/spec/integration/client_update_spec.rb +157 -0
- data/spec/integration/collection_indexes_prose_spec.rb +58 -0
- data/spec/integration/command_monitoring_spec.rb +95 -31
- data/spec/integration/command_spec.rb +59 -20
- data/spec/integration/connect_single_rs_name_spec.rb +15 -7
- data/spec/integration/connection_pool_populator_spec.rb +7 -2
- data/spec/integration/connection_spec.rb +121 -38
- data/spec/integration/crud_spec.rb +338 -5
- data/spec/integration/cursor_pinning_spec.rb +121 -0
- data/spec/integration/cursor_reaping_spec.rb +75 -28
- data/spec/integration/docs_examples_spec.rb +16 -0
- data/spec/integration/error_detection_spec.rb +3 -0
- data/spec/integration/fork_reconnect_spec.rb +207 -0
- data/spec/integration/get_more_spec.rb +13 -3
- data/spec/integration/grid_fs_bucket_spec.rb +51 -0
- data/spec/integration/heartbeat_events_spec.rb +11 -27
- data/spec/integration/map_reduce_spec.rb +77 -0
- data/spec/integration/mmapv1_spec.rb +3 -0
- data/spec/integration/mongos_pinning_spec.rb +3 -0
- data/spec/integration/ocsp_connectivity_spec.rb +29 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
- data/spec/integration/ocsp_verifier_spec.rb +358 -0
- data/spec/integration/operation_failure_code_spec.rb +4 -1
- data/spec/integration/operation_failure_message_spec.rb +90 -0
- data/spec/integration/query_cache_spec.rb +1256 -0
- data/spec/integration/query_cache_transactions_spec.rb +193 -0
- data/spec/integration/read_concern_spec.rb +5 -2
- data/spec/integration/read_preference_spec.rb +86 -23
- data/spec/integration/reconnect_spec.rb +42 -19
- data/spec/integration/retryable_errors_spec.rb +36 -14
- data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +60 -53
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
- data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
- data/spec/integration/retryable_writes_errors_spec.rb +3 -0
- data/spec/integration/sdam_error_handling_spec.rb +235 -25
- data/spec/integration/sdam_events_spec.rb +142 -7
- data/spec/integration/sdam_prose_spec.rb +67 -0
- data/spec/integration/secondary_reads_spec.rb +102 -0
- data/spec/integration/server_description_spec.rb +3 -0
- data/spec/integration/server_monitor_spec.rb +31 -2
- data/spec/integration/server_selection_spec.rb +39 -0
- data/spec/integration/server_selector_spec.rb +25 -5
- data/spec/integration/server_spec.rb +47 -26
- data/spec/integration/shell_examples_spec.rb +3 -0
- data/spec/integration/size_limit_spec.rb +118 -0
- data/spec/integration/snappy_compression_spec.rb +28 -0
- data/spec/integration/snapshot_query_examples_spec.rb +127 -0
- data/spec/integration/srv_monitoring_spec.rb +93 -9
- data/spec/integration/srv_spec.rb +60 -0
- data/spec/integration/ssl_uri_options_spec.rb +5 -2
- data/spec/integration/step_down_spec.rb +38 -19
- data/spec/integration/time_zone_querying_spec.rb +3 -0
- data/spec/integration/transaction_pinning_spec.rb +120 -0
- data/spec/integration/transactions_api_examples_spec.rb +62 -0
- data/spec/integration/transactions_examples_spec.rb +31 -9
- data/spec/integration/truncated_utf8_spec.rb +26 -0
- data/spec/integration/versioned_api_examples_spec.rb +120 -0
- data/spec/integration/x509_auth_spec.rb +112 -0
- data/spec/integration/zlib_compression_spec.rb +28 -0
- data/spec/integration/zstd_compression_spec.rb +29 -0
- data/spec/kerberos/kerberos_spec.rb +94 -0
- data/spec/lite_spec_helper.rb +88 -44
- data/spec/mongo/address/ipv4_spec.rb +4 -1
- data/spec/mongo/address/ipv6_spec.rb +10 -0
- data/spec/mongo/address/unix_spec.rb +4 -0
- data/spec/mongo/address/validator_spec.rb +3 -0
- data/spec/mongo/address_spec.rb +27 -13
- data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
- data/spec/mongo/auth/aws/request_spec.rb +79 -0
- data/spec/mongo/auth/cr_spec.rb +20 -10
- data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
- data/spec/mongo/auth/invalid_mechanism_spec.rb +4 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +5 -2
- data/spec/mongo/auth/ldap_spec.rb +18 -8
- data/spec/mongo/auth/scram/conversation_spec.rb +125 -338
- data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
- data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +83 -75
- data/spec/mongo/auth/scram_spec.rb +60 -88
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
- data/spec/mongo/auth/stringprep_spec.rb +3 -0
- data/spec/mongo/auth/user/view_spec.rb +7 -7
- data/spec/mongo/auth/user_spec.rb +5 -2
- data/spec/mongo/auth/x509/conversation_spec.rb +7 -4
- data/spec/mongo/auth/x509_spec.rb +18 -12
- data/spec/mongo/auth_spec.rb +7 -4
- data/spec/mongo/bson_spec.rb +3 -0
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
- data/spec/mongo/bulk_write/result_spec.rb +29 -8
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
- data/spec/mongo/bulk_write_spec.rb +333 -5
- data/spec/mongo/caching_cursor_spec.rb +73 -0
- data/spec/mongo/client_construction_spec.rb +1662 -284
- data/spec/mongo/client_encryption_spec.rb +402 -0
- data/spec/mongo/client_spec.rb +425 -6
- data/spec/mongo/cluster/cursor_reaper_spec.rb +78 -31
- data/spec/mongo/cluster/periodic_executor_spec.rb +6 -1
- data/spec/mongo/cluster/socket_reaper_spec.rb +17 -3
- data/spec/mongo/cluster/topology/replica_set_spec.rb +65 -19
- data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
- data/spec/mongo/cluster/topology/single_spec.rb +24 -10
- data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
- data/spec/mongo/cluster/topology_spec.rb +4 -1
- data/spec/mongo/cluster_spec.rb +71 -81
- data/spec/mongo/cluster_time_spec.rb +3 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +186 -86
- data/spec/mongo/collection/view/builder/find_command_spec.rb +24 -6
- data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
- data/spec/mongo/collection/view/change_stream_spec.rb +21 -323
- data/spec/mongo/collection/view/explainable_spec.rb +90 -4
- data/spec/mongo/collection/view/immutable_spec.rb +3 -0
- data/spec/mongo/collection/view/iterable_spec.rb +41 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +44 -6
- data/spec/mongo/collection/view/readable_spec.rb +745 -2
- data/spec/mongo/collection/view/writable_spec.rb +323 -1
- data/spec/mongo/collection/view_spec.rb +4 -1
- data/spec/mongo/collection_crud_spec.rb +4415 -0
- data/spec/mongo/collection_ddl_spec.rb +537 -0
- data/spec/mongo/collection_spec.rb +103 -4367
- data/spec/mongo/config/options_spec.rb +75 -0
- data/spec/mongo/config_spec.rb +73 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +109 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +441 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +126 -0
- data/spec/mongo/crypt/binary_spec.rb +113 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
- data/spec/mongo/crypt/binding/context_spec.rb +305 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +113 -0
- data/spec/mongo/crypt/binding/status_spec.rb +97 -0
- data/spec/mongo/crypt/binding/version_spec.rb +53 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +37 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +144 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +141 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +106 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +266 -0
- data/spec/mongo/crypt/handle_spec.rb +251 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
- data/spec/mongo/crypt/hooks_spec.rb +30 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +357 -0
- data/spec/mongo/crypt/kms_spec.rb +59 -0
- data/spec/mongo/crypt/status_spec.rb +150 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +15 -1
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +15 -1
- data/spec/mongo/cursor_spec.rb +209 -17
- data/spec/mongo/database_spec.rb +526 -27
- data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
- data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
- data/spec/mongo/error/crypt_error_spec.rb +29 -0
- data/spec/mongo/error/max_bson_size_spec.rb +38 -0
- data/spec/mongo/error/no_server_available_spec.rb +15 -2
- data/spec/mongo/error/notable_spec.rb +62 -0
- data/spec/mongo/error/operation_failure_heavy_spec.rb +110 -0
- data/spec/mongo/error/operation_failure_spec.rb +231 -70
- data/spec/mongo/error/parser_spec.rb +40 -6
- data/spec/mongo/error/unsupported_option_spec.rb +57 -0
- data/spec/mongo/event/publisher_spec.rb +3 -0
- data/spec/mongo/event/subscriber_spec.rb +3 -0
- data/spec/mongo/grid/file/chunk_spec.rb +7 -4
- data/spec/mongo/grid/file/info_spec.rb +3 -0
- data/spec/mongo/grid/file_spec.rb +4 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +58 -17
- data/spec/mongo/grid/stream/read_spec.rb +33 -10
- data/spec/mongo/grid/stream/write_spec.rb +38 -9
- data/spec/mongo/grid/stream_spec.rb +4 -1
- data/spec/mongo/id_spec.rb +3 -0
- data/spec/mongo/index/view_spec.rb +446 -0
- data/spec/mongo/lint_spec.rb +3 -0
- data/spec/mongo/logger_spec.rb +16 -11
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +3 -0
- data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
- data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
- data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
- data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +4 -4
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
- data/spec/mongo/monitoring_spec.rb +3 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +11 -1
- data/spec/mongo/operation/aggregate_spec.rb +5 -1
- data/spec/mongo/operation/collections_info_spec.rb +7 -1
- data/spec/mongo/operation/command_spec.rb +11 -5
- data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
- data/spec/mongo/operation/create_index_spec.rb +9 -3
- data/spec/mongo/operation/create_user_spec.rb +9 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +24 -6
- data/spec/mongo/operation/delete/command_spec.rb +3 -0
- data/spec/mongo/operation/delete/op_msg_spec.rb +40 -25
- data/spec/mongo/operation/delete_spec.rb +13 -36
- data/spec/mongo/operation/drop_index_spec.rb +9 -2
- data/spec/mongo/{collection/view → operation/find}/builder/flags_spec.rb +5 -2
- data/spec/mongo/{collection/view → operation/find}/builder/modifiers_spec.rb +5 -2
- data/spec/mongo/operation/find/legacy_spec.rb +34 -7
- data/spec/mongo/operation/get_more_spec.rb +11 -1
- data/spec/mongo/operation/indexes_spec.rb +8 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +28 -8
- data/spec/mongo/operation/insert/command_spec.rb +7 -0
- data/spec/mongo/operation/insert/op_msg_spec.rb +46 -30
- data/spec/mongo/operation/insert_spec.rb +17 -43
- data/spec/mongo/operation/limited_spec.rb +8 -3
- data/spec/mongo/operation/map_reduce_spec.rb +8 -2
- data/spec/mongo/operation/read_preference_legacy_spec.rb +360 -0
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +332 -0
- data/spec/mongo/operation/remove_user_spec.rb +9 -3
- data/spec/mongo/operation/result_spec.rb +34 -4
- data/spec/mongo/operation/specifiable_spec.rb +3 -0
- data/spec/mongo/operation/update/bulk_spec.rb +25 -7
- data/spec/mongo/operation/update/command_spec.rb +7 -0
- data/spec/mongo/operation/update/op_msg_spec.rb +41 -24
- data/spec/mongo/operation/update_spec.rb +12 -35
- data/spec/mongo/operation/update_user_spec.rb +7 -1
- data/spec/mongo/options/redacted_spec.rb +3 -0
- data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
- data/spec/mongo/protocol/compressed_spec.rb +29 -13
- data/spec/mongo/protocol/delete_spec.rb +12 -8
- data/spec/mongo/protocol/get_more_spec.rb +12 -8
- data/spec/mongo/protocol/insert_spec.rb +12 -8
- data/spec/mongo/protocol/kill_cursors_spec.rb +9 -5
- data/spec/mongo/protocol/msg_spec.rb +111 -53
- data/spec/mongo/protocol/query_spec.rb +18 -15
- data/spec/mongo/protocol/registry_spec.rb +4 -1
- data/spec/mongo/protocol/reply_spec.rb +4 -1
- data/spec/mongo/protocol/update_spec.rb +13 -9
- data/spec/mongo/query_cache_middleware_spec.rb +55 -0
- data/spec/mongo/query_cache_spec.rb +453 -0
- data/spec/mongo/retryable_spec.rb +109 -75
- data/spec/mongo/semaphore_spec.rb +54 -0
- data/spec/mongo/server/app_metadata_spec.rb +53 -21
- data/spec/mongo/server/connection_auth_spec.rb +42 -24
- data/spec/mongo/server/connection_common_spec.rb +87 -0
- data/spec/mongo/server/connection_pool/populator_spec.rb +6 -1
- data/spec/mongo/server/connection_pool_spec.rb +189 -80
- data/spec/mongo/server/connection_spec.rb +323 -246
- data/spec/mongo/server/description/features_spec.rb +27 -0
- data/spec/mongo/server/description_query_methods_spec.rb +4 -1
- data/spec/mongo/server/description_spec.rb +625 -594
- data/spec/mongo/server/monitor/app_metadata_spec.rb +10 -1
- data/spec/mongo/server/monitor/connection_spec.rb +60 -69
- data/spec/mongo/server/monitor_spec.rb +95 -24
- data/spec/mongo/server/push_monitor_spec.rb +95 -0
- data/spec/mongo/server/round_trip_time_averager_spec.rb +8 -3
- data/spec/mongo/server_selector/nearest_spec.rb +32 -25
- data/spec/mongo/server_selector/primary_preferred_spec.rb +35 -28
- data/spec/mongo/server_selector/primary_spec.rb +35 -11
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +52 -29
- data/spec/mongo/server_selector/secondary_spec.rb +27 -20
- data/spec/mongo/server_selector_spec.rb +145 -21
- data/spec/mongo/server_spec.rb +18 -2
- data/spec/mongo/session/server_session_spec.rb +3 -0
- data/spec/mongo/session/session_pool_spec.rb +51 -12
- data/spec/mongo/session_spec.rb +58 -0
- data/spec/mongo/session_transaction_spec.rb +17 -36
- data/spec/mongo/socket/ssl_spec.rb +91 -69
- data/spec/mongo/socket/tcp_spec.rb +5 -2
- data/spec/mongo/socket/unix_spec.rb +6 -2
- data/spec/mongo/socket_spec.rb +14 -11
- data/spec/mongo/srv/monitor_spec.rb +91 -69
- data/spec/mongo/srv/result_spec.rb +3 -0
- data/spec/mongo/timeout_spec.rb +42 -0
- data/spec/mongo/tls_context_hooks_spec.rb +40 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +171 -37
- data/spec/mongo/uri_option_parsing_spec.rb +52 -16
- data/spec/mongo/uri_spec.rb +165 -48
- data/spec/mongo/utils_spec.rb +42 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern_spec.rb +16 -1
- data/spec/{support → runners}/auth.rb +45 -9
- data/spec/runners/change_streams/outcome.rb +45 -0
- data/spec/runners/change_streams/spec.rb +60 -0
- data/spec/runners/change_streams/test.rb +232 -0
- data/spec/{support → runners}/cmap/verifier.rb +4 -1
- data/spec/{support → runners}/cmap.rb +7 -4
- data/spec/{support → runners}/command_monitoring.rb +8 -36
- data/spec/runners/connection_string.rb +283 -6
- data/spec/{support/transactions → runners/crud}/context.rb +12 -15
- data/spec/{support → runners}/crud/operation.rb +201 -61
- data/spec/{support → runners}/crud/outcome.rb +4 -1
- data/spec/runners/crud/requirement.rb +139 -0
- data/spec/{support → runners}/crud/spec.rb +21 -11
- data/spec/{support → runners}/crud/test.rb +12 -27
- data/spec/runners/crud/test_base.rb +53 -0
- data/spec/{support → runners}/crud/verifier.rb +47 -15
- data/spec/{support → runners}/crud.rb +34 -12
- data/spec/{support → runners}/gridfs.rb +5 -2
- data/spec/runners/read_write_concern_document.rb +4 -1
- data/spec/runners/sdam/verifier.rb +29 -8
- data/spec/{support/server_discovery_and_monitoring.rb → runners/sdam.rb} +49 -26
- data/spec/runners/server_selection.rb +365 -0
- data/spec/{support → runners}/server_selection_rtt.rb +5 -2
- data/spec/runners/transactions/operation.rb +328 -0
- data/spec/{support → runners}/transactions/spec.rb +6 -3
- data/spec/runners/transactions/test.rb +329 -0
- data/spec/{support → runners}/transactions.rb +30 -27
- data/spec/runners/unified/assertions.rb +362 -0
- data/spec/runners/unified/change_stream_operations.rb +41 -0
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +323 -0
- data/spec/runners/unified/ddl_operations.rb +179 -0
- data/spec/runners/unified/entity_map.rb +42 -0
- data/spec/runners/unified/error.rb +29 -0
- data/spec/runners/unified/event_subscriber.rb +104 -0
- data/spec/runners/unified/exceptions.rb +24 -0
- data/spec/runners/unified/grid_fs_operations.rb +79 -0
- data/spec/runners/unified/support_operations.rb +269 -0
- data/spec/runners/unified/test.rb +511 -0
- data/spec/runners/unified/test_group.rb +31 -0
- data/spec/runners/unified.rb +106 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +378 -0
- data/spec/shared/lib/mrss/docker_runner.rb +291 -0
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +230 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +325 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +392 -0
- data/spec/shared/shlib/set_env.sh +169 -0
- data/spec/solo/clean_exit_spec.rb +29 -0
- data/spec/spec_helper.rb +10 -9
- data/spec/spec_tests/auth_spec.rb +33 -14
- data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
- data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +16 -0
- data/spec/spec_tests/cmap_spec.rb +19 -4
- data/spec/spec_tests/collection_management_spec.rb +13 -0
- data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
- data/spec/spec_tests/connection_string_spec.rb +6 -1
- data/spec/spec_tests/crud_spec.rb +5 -10
- data/spec/spec_tests/crud_unified_spec.rb +13 -0
- data/spec/spec_tests/data/auth/connection-string.yml +69 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1071 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +298 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams.yml +927 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +120 -0
- data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +536 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +81 -0
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/count.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +52 -0
- data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +91 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +66 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +50 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +50 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +50 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
- data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +88 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +47 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +65 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +22 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +501 -0
- data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
- data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +70 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +164 -0
- data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
- data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
- data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
- data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
- data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
- data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
- data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
- data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
- data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -1
- data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
- data/spec/spec_tests/data/crud_unified/aggregate-let.yml +138 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
- data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
- data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +155 -0
- data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
- data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +151 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +93 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +91 -0
- data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +137 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
- data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
- data/spec/spec_tests/data/crud_unified/find-let.yml +71 -0
- data/spec/spec_tests/data/crud_unified/find.yml +68 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-let.yml +94 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
- data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
- data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
- data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-let.yml +107 -0
- data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
- data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-let.yml +102 -0
- data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +299 -0
- data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
- data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
- data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
- data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
- data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
- data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
- data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
- data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
- data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
- data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +7 -6
- data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +2 -1
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +7 -6
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +2 -1
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +7 -6
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +2 -1
- data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → legacy/estimatedDocumentCount-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +3 -1
- data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
- data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite-errorLabels.yml +77 -0
- data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +37 -0
- data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +30 -24
- data/spec/spec_tests/data/retryable_writes/legacy/deleteOne-errorLabels.yml +48 -0
- data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +22 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndDelete-errorLabels.yml +49 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +23 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndReplace-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +25 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndUpdate-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +24 -0
- data/spec/spec_tests/data/retryable_writes/legacy/insertMany-errorLabels.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +24 -0
- data/spec/spec_tests/data/retryable_writes/legacy/insertOne-errorLabels.yml +44 -0
- data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +94 -3
- data/spec/spec_tests/data/retryable_writes/legacy/replaceOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +23 -0
- data/spec/spec_tests/data/retryable_writes/legacy/updateOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +23 -0
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
- data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
- data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
- data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
- data/spec/spec_tests/data/sdam/rs/compatible.yml +6 -2
- data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +4 -1
- data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +4 -3
- data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
- data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
- data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +3 -2
- data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
- data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
- data/spec/spec_tests/data/sdam/rs/discover_passives.yml +6 -4
- data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
- data/spec/spec_tests/data/sdam/rs/discover_primary.yml +4 -3
- data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +5 -3
- data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +4 -3
- data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
- data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
- data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +5 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +7 -5
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +6 -2
- data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
- data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
- data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
- data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
- data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/null_election_id.yml +8 -4
- data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +24 -27
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
- data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +81 -56
- data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
- data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
- data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
- data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +5 -3
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/too_new.yml +6 -2
- data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
- data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +6 -3
- data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
- data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
- data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
- data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
- data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +3 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +4 -3
- data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +4 -3
- data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +4 -3
- data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +4 -3
- data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +4 -3
- data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
- data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
- data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
- data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
- data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
- data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
- data/spec/spec_tests/data/sdam/single/{direct_connection_slave.yml → standalone_using_legacy_hello.yml} +2 -2
- data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
- data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
- data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +85 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +118 -0
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +152 -0
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +148 -0
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +219 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +117 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
- data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
- data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +2 -1
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +2 -1
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +21 -16
- data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +2 -1
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-false.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-true.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
- data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +75 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
- data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
- data/spec/spec_tests/data/transactions/create-index.yml +152 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +90 -21
- data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
- data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +3 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +8 -6
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +20 -5
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +27 -12
- data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
- data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
- data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
- data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
- data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +223 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +171 -0
- data/spec/spec_tests/data/uri_options/auth-options.yml +35 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
- data/spec/spec_tests/data/uri_options/connection-options.yml +103 -0
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
- data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +233 -6
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +419 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +413 -0
- data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
- data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
- data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
- data/spec/spec_tests/gridfs_spec.rb +5 -0
- data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
- data/spec/spec_tests/load_balancers_spec.rb +15 -0
- data/spec/spec_tests/max_staleness_spec.rb +7 -140
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +6 -1
- data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
- data/spec/spec_tests/retryable_reads_spec.rb +13 -5
- data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
- data/spec/spec_tests/retryable_writes_spec.rb +16 -3
- data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
- data/spec/spec_tests/sdam_integration_spec.rb +16 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +16 -7
- data/spec/spec_tests/sdam_spec.rb +75 -3
- data/spec/spec_tests/seed_list_discovery_spec.rb +127 -0
- data/spec/spec_tests/server_selection_rtt_spec.rb +5 -0
- data/spec/spec_tests/server_selection_spec.rb +7 -114
- data/spec/spec_tests/sessions_unified_spec.rb +13 -0
- data/spec/spec_tests/transactions_api_spec.rb +8 -0
- data/spec/spec_tests/transactions_spec.rb +8 -0
- data/spec/spec_tests/transactions_unified_spec.rb +13 -0
- data/spec/spec_tests/unified_spec.rb +23 -0
- data/spec/spec_tests/uri_options_spec.rb +58 -41
- data/spec/spec_tests/versioned_api_spec.rb +13 -0
- data/spec/stress/cleanup_spec.rb +61 -0
- data/spec/stress/connection_pool_stress_spec.rb +14 -13
- data/spec/stress/connection_pool_timing_spec.rb +13 -9
- data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
- data/spec/stress/push_monitor_close_spec.rb +44 -0
- data/spec/support/authorization.rb +5 -12
- data/spec/support/aws_utils/base.rb +137 -0
- data/spec/support/aws_utils/inspector.rb +227 -0
- data/spec/support/aws_utils/orchestrator.rb +373 -0
- data/spec/support/aws_utils/provisioner.rb +363 -0
- data/spec/support/aws_utils.rb +65 -0
- data/spec/support/background_thread_registry.rb +12 -15
- data/spec/support/certificates/README.md +7 -2
- data/spec/support/certificates/atlas-ocsp-ca.crt +103 -0
- data/spec/support/certificates/atlas-ocsp.crt +152 -0
- data/spec/support/certificates/retrieve-atlas-cert +38 -0
- data/spec/support/certificates/server-second-level-bundle.pem +77 -77
- data/spec/support/certificates/server-second-level.crt +52 -52
- data/spec/support/certificates/server-second-level.key +25 -25
- data/spec/support/certificates/server-second-level.pem +77 -77
- data/spec/support/client_registry.rb +37 -32
- data/spec/support/client_registry_macros.rb +17 -5
- data/spec/support/cluster_tools.rb +11 -3
- data/spec/support/common_shortcuts.rb +160 -6
- data/spec/support/constraints.rb +9 -217
- data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
- data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +6335 -0
- data/spec/support/crypt/corpus/corpus.json +8619 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
- data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
- data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -0
- data/spec/support/crypt/encryptedFields.json +33 -0
- data/spec/support/crypt/external/external-key.json +31 -0
- data/spec/support/crypt/external/external-schema.json +19 -0
- data/spec/support/crypt/keys/key1-document.json +30 -0
- data/spec/support/crypt/limits/limits-doc.json +102 -0
- data/spec/support/crypt/limits/limits-key.json +31 -0
- data/spec/support/crypt/limits/limits-schema.json +1405 -0
- data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/crypt.rb +402 -0
- data/spec/support/dns.rb +3 -0
- data/spec/support/json_ext_formatter.rb +3 -0
- data/spec/support/keyword_struct.rb +29 -0
- data/spec/support/local_resource_registry.rb +3 -0
- data/spec/support/macros.rb +28 -0
- data/spec/support/matchers.rb +52 -1
- data/spec/support/mongos_macros.rb +17 -0
- data/spec/support/monitoring_ext.rb +3 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/primary_socket.rb +3 -0
- data/spec/support/sdam_formatter_integration.rb +3 -0
- data/spec/support/shared/app_metadata.rb +167 -0
- data/spec/support/shared/auth_context.rb +16 -0
- data/spec/support/shared/protocol.rb +5 -0
- data/spec/support/shared/scram_conversation.rb +104 -0
- data/spec/support/shared/server_selector.rb +99 -4
- data/spec/support/shared/session.rb +47 -30
- data/spec/support/spec_config.rb +339 -57
- data/spec/support/spec_setup.rb +55 -38
- data/spec/support/using_hash.rb +31 -0
- data/spec/support/utils.rb +455 -35
- data.tar.gz.sig +0 -0
- metadata +2088 -838
- metadata.gz.sig +0 -0
- data/lib/mongo/cluster/srv_monitor.rb +0 -127
- data/lib/mongo/collection/view/builder/find_command.rb +0 -142
- data/lib/mongo/collection/view/builder/op_query.rb +0 -91
- data/lib/mongo/cursor/builder/get_more_command.rb +0 -77
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -108
- data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -103
- data/lib/mongo/operation/insert/legacy.rb +0 -60
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -45
- data/lib/mongo/operation/update/legacy/result.rb +0 -102
- data/lib/mongo/operation/update/legacy.rb +0 -65
- data/lib/mongo/server/connectable.rb +0 -107
- data/lib/mongo/server/context.rb +0 -69
- data/spec/enterprise_auth/kerberos_spec.rb +0 -58
- data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -56
- data/spec/mongo/dbref_spec.rb +0 -149
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -41
- data/spec/mongo/operation/read_preference_spec.rb +0 -245
- data/spec/spec_tests/change_streams_spec.rb +0 -55
- data/spec/spec_tests/command_monitoring_spec.rb +0 -53
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -76
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -536
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
- data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
- data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
- data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
- data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -110
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -81
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -38
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -92
- data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -66
- data/spec/support/change_streams/operation.rb +0 -89
- data/spec/support/change_streams.rb +0 -262
- data/spec/support/cluster_config.rb +0 -194
- data/spec/support/connection_string.rb +0 -354
- data/spec/support/crud/requirement.rb +0 -69
- data/spec/support/crud/test_base.rb +0 -22
- data/spec/support/event_subscriber.rb +0 -112
- data/spec/support/lite_constraints.rb +0 -76
- data/spec/support/sdam_monitoring.rb +0 -89
- data/spec/support/server_selection.rb +0 -148
- data/spec/support/transactions/operation.rb +0 -184
- data/spec/support/transactions/test.rb +0 -252
- /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → legacy/estimatedDocumentCount.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
- /data/spec/spec_tests/data/sdam/rs/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
|
@@ -0,0 +1,1601 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# Copyright (C) 2019-2020 MongoDB Inc.
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
|
|
18
|
+
unless ENV['LIBMONGOCRYPT_PATH']
|
|
19
|
+
begin
|
|
20
|
+
require 'libmongocrypt_helper'
|
|
21
|
+
rescue LoadError => e
|
|
22
|
+
# It seems that MRI maintains autoload configuration for a module until
|
|
23
|
+
# that module is defined, but JRuby removes autoload configuration as soon
|
|
24
|
+
# as the referenced file is attempted to be loaded, even if the module
|
|
25
|
+
# never ends up being defined.
|
|
26
|
+
if BSON::Environment.jruby?
|
|
27
|
+
module Mongo
|
|
28
|
+
module Crypt
|
|
29
|
+
autoload :Binding, 'mongo/crypt/binding'
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# JRuby 9.3.2.0 replaces a LoadError with our custom message with a
|
|
35
|
+
# generic NameError, when this load is attempted as part of autoloading
|
|
36
|
+
# process. JRuby 9.2.20.0 propagates LoadError as expected.
|
|
37
|
+
raise LoadError, "Cannot load Mongo::Crypt::Binding because there is no path " +
|
|
38
|
+
"to libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable " +
|
|
39
|
+
"and libmongocrypt-helper is not installed: #{e.class}: #{e}"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
require 'ffi'
|
|
44
|
+
|
|
45
|
+
module Mongo
|
|
46
|
+
module Crypt
|
|
47
|
+
|
|
48
|
+
# @api private
|
|
49
|
+
def reset_autoload
|
|
50
|
+
remove_const(:Binding)
|
|
51
|
+
autoload(:Binding, 'mongo/crypt/binding')
|
|
52
|
+
end
|
|
53
|
+
module_function :reset_autoload
|
|
54
|
+
|
|
55
|
+
# A Ruby binding for the libmongocrypt C library
|
|
56
|
+
#
|
|
57
|
+
# @api private
|
|
58
|
+
class Binding
|
|
59
|
+
extend FFI::Library
|
|
60
|
+
|
|
61
|
+
if ENV['LIBMONGOCRYPT_PATH']
|
|
62
|
+
begin
|
|
63
|
+
ffi_lib ENV['LIBMONGOCRYPT_PATH']
|
|
64
|
+
rescue LoadError => e
|
|
65
|
+
Crypt.reset_autoload
|
|
66
|
+
raise LoadError, "Cannot load Mongo::Crypt::Binding because the path to " +
|
|
67
|
+
"libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable " +
|
|
68
|
+
"is invalid: #{ENV['LIBMONGOCRYPT_PATH']}\n\n#{e.class}: #{e.message}"
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
begin
|
|
72
|
+
ffi_lib LibmongocryptHelper.libmongocrypt_path
|
|
73
|
+
rescue LoadError => e
|
|
74
|
+
Crypt.reset_autoload
|
|
75
|
+
raise LoadError, "Cannot load Mongo::Crypt::Binding because the path to " +
|
|
76
|
+
"libmongocrypt specified in libmongocrypt-helper " +
|
|
77
|
+
"is invalid: #{LibmongocryptHelper.libmongocrypt_path}\n\n#{e.class}: #{e.message}"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Minimum version of libmongocrypt required by this version of the driver.
|
|
82
|
+
# An attempt to use the driver with any previous version of libmongocrypt
|
|
83
|
+
# will cause a `LoadError`.
|
|
84
|
+
#
|
|
85
|
+
# @api private
|
|
86
|
+
MIN_LIBMONGOCRYPT_VERSION = Gem::Version.new("1.5.2")
|
|
87
|
+
|
|
88
|
+
# @!method self.mongocrypt_version(len)
|
|
89
|
+
# @api private
|
|
90
|
+
#
|
|
91
|
+
# Returns the version string of the libmongocrypt library.
|
|
92
|
+
# @param [ FFI::Pointer | nil ] len (out param) An optional pointer to a
|
|
93
|
+
# uint8 that will reference the length of the returned string.
|
|
94
|
+
# @return [ String ] A version string for libmongocrypt.
|
|
95
|
+
attach_function :mongocrypt_version, [:pointer], :string
|
|
96
|
+
|
|
97
|
+
# Validates if provided version of libmongocrypt is valid, i.e. equal or
|
|
98
|
+
# greater than minimum required version. Raises a LoadError if not.
|
|
99
|
+
#
|
|
100
|
+
# @param [ String ] lmc_version String representing libmongocrypt version.
|
|
101
|
+
#
|
|
102
|
+
# @raise [ LoadError ] if given version is lesser than minimum required version.
|
|
103
|
+
#
|
|
104
|
+
# @api private
|
|
105
|
+
def self.validate_version(lmc_version)
|
|
106
|
+
if (actual_version = Gem::Version.new(lmc_version)) < MIN_LIBMONGOCRYPT_VERSION
|
|
107
|
+
raise LoadError, "libmongocrypt version #{MIN_LIBMONGOCRYPT_VERSION} or above is required, " +
|
|
108
|
+
"but version #{actual_version} was found."
|
|
109
|
+
end
|
|
110
|
+
rescue ArgumentError => e
|
|
111
|
+
# Some lmc versions cannot be parsed with Gem::Version class,
|
|
112
|
+
# so we fall back to regex.
|
|
113
|
+
match = lmc_version.match(/\A(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)?(-[A-Za-z\+\d]+)?\z/)
|
|
114
|
+
if match.nil?
|
|
115
|
+
raise ArgumentError.new("Malformed version number string #{lmc_version}")
|
|
116
|
+
end
|
|
117
|
+
actual_version = Gem::Version.new(
|
|
118
|
+
[
|
|
119
|
+
match[:major],
|
|
120
|
+
match[:minor],
|
|
121
|
+
match[:patch]
|
|
122
|
+
].join('.')
|
|
123
|
+
)
|
|
124
|
+
if actual_version < MIN_LIBMONGOCRYPT_VERSION
|
|
125
|
+
raise LoadError, "libmongocrypt version #{MIN_LIBMONGOCRYPT_VERSION} or above is required, " +
|
|
126
|
+
"but version #{actual_version} was found."
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
validate_version(mongocrypt_version(nil))
|
|
131
|
+
|
|
132
|
+
# @!method self.mongocrypt_binary_new
|
|
133
|
+
# @api private
|
|
134
|
+
#
|
|
135
|
+
# Creates a new mongocrypt_binary_t object (a non-owning view of a byte
|
|
136
|
+
# array).
|
|
137
|
+
# @return [ FFI::Pointer ] A pointer to the newly-created
|
|
138
|
+
# mongocrypt_binary_t object.
|
|
139
|
+
attach_function :mongocrypt_binary_new, [], :pointer
|
|
140
|
+
|
|
141
|
+
# @!method self.mongocrypt_binary_new_from_data(data, len)
|
|
142
|
+
# @api private
|
|
143
|
+
#
|
|
144
|
+
# Create a new mongocrypt_binary_t object that maintains a pointer to
|
|
145
|
+
# the specified byte array.
|
|
146
|
+
# @param [ FFI::Pointer ] data A pointer to an array of bytes; the data
|
|
147
|
+
# is not copied and must outlive the mongocrypt_binary_t object.
|
|
148
|
+
# @param [ Integer ] len The length of the array argument.
|
|
149
|
+
# @return [ FFI::Pointer ] A pointer to the newly-created
|
|
150
|
+
# mongocrypt_binary_t object.
|
|
151
|
+
attach_function(
|
|
152
|
+
:mongocrypt_binary_new_from_data,
|
|
153
|
+
[:pointer, :int],
|
|
154
|
+
:pointer
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# @!method self.mongocrypt_binary_data(binary)
|
|
158
|
+
# @api private
|
|
159
|
+
#
|
|
160
|
+
# Get the pointer to the underlying data for the mongocrypt_binary_t.
|
|
161
|
+
# @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t object.
|
|
162
|
+
# @return [ FFI::Pointer ] A pointer to the data array.
|
|
163
|
+
attach_function :mongocrypt_binary_data, [:pointer], :pointer
|
|
164
|
+
|
|
165
|
+
# @!method self.mongocrypt_binary_len(binary)
|
|
166
|
+
# @api private
|
|
167
|
+
#
|
|
168
|
+
# Get the length of the underlying data array.
|
|
169
|
+
# @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t object.
|
|
170
|
+
# @return [ Integer ] The length of the data array.
|
|
171
|
+
attach_function :mongocrypt_binary_len, [:pointer], :int
|
|
172
|
+
|
|
173
|
+
# @!method self.mongocrypt_binary_destroy(binary)
|
|
174
|
+
# @api private
|
|
175
|
+
#
|
|
176
|
+
# Destroy the mongocrypt_binary_t object.
|
|
177
|
+
# @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t object.
|
|
178
|
+
# @return [ nil ] Always nil.
|
|
179
|
+
attach_function :mongocrypt_binary_destroy, [:pointer], :void
|
|
180
|
+
|
|
181
|
+
# Enum labeling different status types
|
|
182
|
+
enum :status_type, [
|
|
183
|
+
:ok, 0,
|
|
184
|
+
:error_client, 1,
|
|
185
|
+
:error_kms, 2,
|
|
186
|
+
]
|
|
187
|
+
|
|
188
|
+
# @!method self.mongocrypt_status_new
|
|
189
|
+
# @api private
|
|
190
|
+
#
|
|
191
|
+
# Create a new mongocrypt_status_t object.
|
|
192
|
+
# @return [ FFI::Pointer ] A pointer to the new mongocrypt_status_ts.
|
|
193
|
+
attach_function :mongocrypt_status_new, [], :pointer
|
|
194
|
+
|
|
195
|
+
# @!method self.mongocrypt_status_set(status, type, code, message, len)
|
|
196
|
+
# @api private
|
|
197
|
+
#
|
|
198
|
+
# Set a message, type, and code on an existing status.
|
|
199
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
|
|
200
|
+
# @param [ Symbol ] type The status type; possible values are defined
|
|
201
|
+
# by the status_type enum.
|
|
202
|
+
# @param [ Integer ] code The status code.
|
|
203
|
+
# @param [ String ] message The status message.
|
|
204
|
+
# @param [ Integer ] len The length of the message argument (or -1 for a
|
|
205
|
+
# null-terminated string).
|
|
206
|
+
# @return [ nil ] Always nil.
|
|
207
|
+
attach_function(
|
|
208
|
+
:mongocrypt_status_set,
|
|
209
|
+
[:pointer, :status_type, :int, :string, :int],
|
|
210
|
+
:void
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# @!method self.mongocrypt_status_type(status)
|
|
214
|
+
# @api private
|
|
215
|
+
#
|
|
216
|
+
# Indicates the status type.
|
|
217
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
|
|
218
|
+
# @return [ Symbol ] The status type (as defined by the status_type enum).
|
|
219
|
+
attach_function :mongocrypt_status_type, [:pointer], :status_type
|
|
220
|
+
|
|
221
|
+
# @!method self.mongocrypt_status_code(status)
|
|
222
|
+
# @api private
|
|
223
|
+
#
|
|
224
|
+
# Return the status error code.
|
|
225
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
|
|
226
|
+
# @return [ Integer ] The status code.
|
|
227
|
+
attach_function :mongocrypt_status_code, [:pointer], :int
|
|
228
|
+
|
|
229
|
+
# @!method self.mongocrypt_status_message(status, len=nil)
|
|
230
|
+
# @api private
|
|
231
|
+
#
|
|
232
|
+
# Returns the status message.
|
|
233
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
|
|
234
|
+
# @param [ FFI::Pointer | nil ] len (out param) An optional pointer to a
|
|
235
|
+
# uint32, where the length of the retun string will be written.
|
|
236
|
+
# @return [ String ] The status message.
|
|
237
|
+
attach_function :mongocrypt_status_message, [:pointer, :pointer], :string
|
|
238
|
+
|
|
239
|
+
# @!method self.mongocrypt_status_ok(status)
|
|
240
|
+
# @api private
|
|
241
|
+
#
|
|
242
|
+
# Returns whether the status is ok or an error.
|
|
243
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
|
|
244
|
+
# @return [ Boolean ] Whether the status is ok.
|
|
245
|
+
attach_function :mongocrypt_status_ok, [:pointer], :bool
|
|
246
|
+
|
|
247
|
+
# @!method self.mongocrypt_status_destroy(status)
|
|
248
|
+
# @api private
|
|
249
|
+
#
|
|
250
|
+
# Destroys the reference to the mongocrypt_status_t object.
|
|
251
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t.
|
|
252
|
+
# @return [ nil ] Always nil.
|
|
253
|
+
attach_function :mongocrypt_status_destroy, [:pointer], :void
|
|
254
|
+
|
|
255
|
+
# Enum labeling the various log levels
|
|
256
|
+
enum :log_level, [
|
|
257
|
+
:fatal, 0,
|
|
258
|
+
:error, 1,
|
|
259
|
+
:warn, 2,
|
|
260
|
+
:info, 3,
|
|
261
|
+
:debug, 4,
|
|
262
|
+
]
|
|
263
|
+
|
|
264
|
+
# @!method mongocrypt_log_fn_t(level, message, len, ctx)
|
|
265
|
+
# @api private
|
|
266
|
+
#
|
|
267
|
+
# A callback to the mongocrypt log function. Set a custom log callback
|
|
268
|
+
# with the mongocrypt_setopt_log_handler method
|
|
269
|
+
# @param [ Symbol ] level The log level; possible values defined by the
|
|
270
|
+
# log_level enum
|
|
271
|
+
# @param [ String ] message The log message
|
|
272
|
+
# @param [ Integer ] len The length of the message param, or -1 if the
|
|
273
|
+
# string is null terminated
|
|
274
|
+
# @param [ FFI::Pointer | nil ] ctx An optional pointer to a context
|
|
275
|
+
# object when this callback was set
|
|
276
|
+
# @return [ nil ] Always nil.
|
|
277
|
+
#
|
|
278
|
+
# @note This defines a method signature for an FFI callback; it is not
|
|
279
|
+
# an instance method on the Binding class.
|
|
280
|
+
callback :mongocrypt_log_fn_t, [:log_level, :string, :int, :pointer], :void
|
|
281
|
+
|
|
282
|
+
# @!method self.ongocrypt_new
|
|
283
|
+
# @api private
|
|
284
|
+
#
|
|
285
|
+
# Creates a new mongocrypt_t object.
|
|
286
|
+
# @return [ FFI::Pointer ] A pointer to a new mongocrypt_t object.
|
|
287
|
+
attach_function :mongocrypt_new, [], :pointer
|
|
288
|
+
|
|
289
|
+
# @!method self.mongocrypt_setopt_log_handler(crypt, log_fn, log_ctx=nil)
|
|
290
|
+
# @api private
|
|
291
|
+
#
|
|
292
|
+
# Set the handler on the mongocrypt_t object to be called every time
|
|
293
|
+
# libmongocrypt logs a message.
|
|
294
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
295
|
+
# @param [ Method ] log_fn A logging callback method.
|
|
296
|
+
# @param [ FFI::Pointer | nil ] log_ctx An optional pointer to a context
|
|
297
|
+
# to be passed into the log callback on every invocation.
|
|
298
|
+
# @return [ Boolean ] Whether setting the callback was successful.
|
|
299
|
+
attach_function(
|
|
300
|
+
:mongocrypt_setopt_log_handler,
|
|
301
|
+
[:pointer, :mongocrypt_log_fn_t, :pointer],
|
|
302
|
+
:bool
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# Set the logger callback function on the Mongo::Crypt::Handle object
|
|
306
|
+
#
|
|
307
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
308
|
+
# @param [ Method ] log_callback
|
|
309
|
+
#
|
|
310
|
+
# @raise [ Mongo::Error::CryptError ] If the callback is not set successfully
|
|
311
|
+
def self.setopt_log_handler(handle, log_callback)
|
|
312
|
+
check_status(handle) do
|
|
313
|
+
mongocrypt_setopt_log_handler(handle, log_callback, nil)
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
# @!method self.mongocrypt_setopt_kms_providers(crypt, kms_providers)
|
|
318
|
+
# @api private
|
|
319
|
+
#
|
|
320
|
+
# Configure KMS providers with a BSON document.
|
|
321
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
322
|
+
# @param [ FFI::Pointer ] kms_providers A pointer to a
|
|
323
|
+
# mongocrypt_binary_t object that references a BSON document mapping
|
|
324
|
+
# the KMS provider names to credentials.
|
|
325
|
+
# @note Do not initialize ctx before calling this method.
|
|
326
|
+
#
|
|
327
|
+
# @returns [ true | false ] Returns whether the options was set successfully.
|
|
328
|
+
attach_function(
|
|
329
|
+
:mongocrypt_setopt_kms_providers,
|
|
330
|
+
[:pointer, :pointer],
|
|
331
|
+
:bool
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
# Set KMS providers options on the Mongo::Crypt::Handle object
|
|
335
|
+
#
|
|
336
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
337
|
+
# @param [ BSON::Document ] kms_providers BSON document mapping
|
|
338
|
+
# the KMS provider names to credentials.
|
|
339
|
+
#
|
|
340
|
+
# @raise [ Mongo::Error::CryptError ] If the option is not set successfully
|
|
341
|
+
def self.setopt_kms_providers(handle, kms_providers)
|
|
342
|
+
validate_document(kms_providers)
|
|
343
|
+
data = kms_providers.to_bson.to_s
|
|
344
|
+
Binary.wrap_string(data) do |data_p|
|
|
345
|
+
check_status(handle) do
|
|
346
|
+
mongocrypt_setopt_kms_providers(handle.ref, data_p)
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# @!method self.mongocrypt_setopt_schema_map(crypt, schema_map)
|
|
352
|
+
# @api private
|
|
353
|
+
#
|
|
354
|
+
# Sets a local schema map for encryption.
|
|
355
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
356
|
+
# @param [ FFI::Pointer ] schema_map A pointer to a mongocrypt_binary_t.
|
|
357
|
+
# object that references the schema map as a BSON binary string.
|
|
358
|
+
# @return [ Boolean ] Returns whether the option was set successfully.
|
|
359
|
+
attach_function :mongocrypt_setopt_schema_map, [:pointer, :pointer], :bool
|
|
360
|
+
|
|
361
|
+
# Set schema map on the Mongo::Crypt::Handle object
|
|
362
|
+
#
|
|
363
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
364
|
+
# @param [ BSON::Document ] schema_map_doc The schema map as a
|
|
365
|
+
# BSON::Document object
|
|
366
|
+
#
|
|
367
|
+
# @raise [ Mongo::Error::CryptError ] If the schema map is not set successfully
|
|
368
|
+
def self.setopt_schema_map(handle, schema_map_doc)
|
|
369
|
+
validate_document(schema_map_doc)
|
|
370
|
+
data = schema_map_doc.to_bson.to_s
|
|
371
|
+
Binary.wrap_string(data) do |data_p|
|
|
372
|
+
check_status(handle) do
|
|
373
|
+
mongocrypt_setopt_schema_map(handle.ref, data_p)
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
# @!method self.mongocrypt_init(crypt)
|
|
379
|
+
# @api private
|
|
380
|
+
#
|
|
381
|
+
# Initialize the mongocrypt_t object.
|
|
382
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
383
|
+
# @return [ Boolean ] Returns whether the crypt was initialized successfully.
|
|
384
|
+
attach_function :mongocrypt_init, [:pointer], :bool
|
|
385
|
+
|
|
386
|
+
# Initialize the Mongo::Crypt::Handle object
|
|
387
|
+
#
|
|
388
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
389
|
+
#
|
|
390
|
+
# @raise [ Mongo::Error::CryptError ] If initialization fails
|
|
391
|
+
def self.init(handle)
|
|
392
|
+
check_status(handle) do
|
|
393
|
+
mongocrypt_init(handle.ref)
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
# @!method self.mongocrypt_status(crypt, status)
|
|
398
|
+
# @api private
|
|
399
|
+
#
|
|
400
|
+
# Set the status information from the mongocrypt_t object on the
|
|
401
|
+
# mongocrypt_status_t object.
|
|
402
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
403
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t object.
|
|
404
|
+
# @return [ Boolean ] Whether the status was successfully set.
|
|
405
|
+
attach_function :mongocrypt_status, [:pointer, :pointer], :bool
|
|
406
|
+
|
|
407
|
+
# @!method self.mongocrypt_destroy(crypt)
|
|
408
|
+
# @api private
|
|
409
|
+
#
|
|
410
|
+
# Destroy the reference the mongocrypt_t object.
|
|
411
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
412
|
+
# @return [ nil ] Always nil.
|
|
413
|
+
attach_function :mongocrypt_destroy, [:pointer], :void
|
|
414
|
+
|
|
415
|
+
# @!method self.mongocrypt_ctx_new(crypt)
|
|
416
|
+
# @api private
|
|
417
|
+
#
|
|
418
|
+
# Create a new mongocrypt_ctx_t object (a wrapper for the libmongocrypt
|
|
419
|
+
# state machine).
|
|
420
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
421
|
+
# @return [ FFI::Pointer ] A new mongocrypt_ctx_t object.
|
|
422
|
+
attach_function :mongocrypt_ctx_new, [:pointer], :pointer
|
|
423
|
+
|
|
424
|
+
# @!method self.mongocrypt_ctx_status(ctx, status)
|
|
425
|
+
# @api private
|
|
426
|
+
#
|
|
427
|
+
# Set the status information from the mongocrypt_ctx_t object on the
|
|
428
|
+
# mongocrypt_status_t object.
|
|
429
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
430
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t object.
|
|
431
|
+
# @return [ Boolean ] Whether the status was successfully set.
|
|
432
|
+
attach_function :mongocrypt_ctx_status, [:pointer, :pointer], :bool
|
|
433
|
+
|
|
434
|
+
# @!method self.mongocrypt_ctx_setopt_key_id(ctx, key_id)
|
|
435
|
+
# @api private
|
|
436
|
+
#
|
|
437
|
+
# Set the key id used for explicit encryption.
|
|
438
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
439
|
+
# @param [ FFI::Pointer ] key_id A pointer to a mongocrypt_binary_t object
|
|
440
|
+
# that references the 16-byte key-id.
|
|
441
|
+
# @note Do not initialize ctx before calling this method.
|
|
442
|
+
# @return [ Boolean ] Whether the option was successfully set.
|
|
443
|
+
attach_function :mongocrypt_ctx_setopt_key_id, [:pointer, :pointer], :bool
|
|
444
|
+
|
|
445
|
+
# Sets the key id option on an explicit encryption context.
|
|
446
|
+
#
|
|
447
|
+
# @param [ Mongo::Crypt::Context ] context Explicit encryption context
|
|
448
|
+
# @param [ String ] key_id The key id
|
|
449
|
+
#
|
|
450
|
+
# @raise [ Mongo::Error::CryptError ] If the operation failed
|
|
451
|
+
def self.ctx_setopt_key_id(context, key_id)
|
|
452
|
+
Binary.wrap_string(key_id) do |key_id_p|
|
|
453
|
+
check_ctx_status(context) do
|
|
454
|
+
mongocrypt_ctx_setopt_key_id(context.ctx_p, key_id_p)
|
|
455
|
+
end
|
|
456
|
+
end
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
# @!method self.mongocrypt_ctx_setopt_key_alt_name(ctx, binary)
|
|
460
|
+
# @api private
|
|
461
|
+
#
|
|
462
|
+
# When creating a data key, set an alternate name on that key. When
|
|
463
|
+
# performing explicit encryption, specifying which data key to use for
|
|
464
|
+
# encryption based on its keyAltName field.
|
|
465
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
466
|
+
# @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t
|
|
467
|
+
# object that references a BSON document in the format
|
|
468
|
+
# { "keyAltName": <BSON UTF8 value> }.
|
|
469
|
+
# @return [ Boolean ] Whether the alternative name was successfully set.
|
|
470
|
+
# @note Do not initialize ctx before calling this method.
|
|
471
|
+
attach_function(
|
|
472
|
+
:mongocrypt_ctx_setopt_key_alt_name,
|
|
473
|
+
[:pointer, :pointer],
|
|
474
|
+
:bool
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
# Set multiple alternate key names on data key creation
|
|
478
|
+
#
|
|
479
|
+
# @param [ Mongo::Crypt::Context ] context A DataKeyContext
|
|
480
|
+
# @param [ Array ] key_alt_names An array of alternate key names as strings
|
|
481
|
+
#
|
|
482
|
+
# @raise [ Mongo::Error::CryptError ] If any of the alternate names are
|
|
483
|
+
# not valid UTF8 strings
|
|
484
|
+
def self.ctx_setopt_key_alt_names(context, key_alt_names)
|
|
485
|
+
key_alt_names.each do |key_alt_name|
|
|
486
|
+
key_alt_name_bson = { :keyAltName => key_alt_name }.to_bson.to_s
|
|
487
|
+
|
|
488
|
+
Binary.wrap_string(key_alt_name_bson) do |key_alt_name_p|
|
|
489
|
+
check_ctx_status(context) do
|
|
490
|
+
mongocrypt_ctx_setopt_key_alt_name(context.ctx_p, key_alt_name_p)
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
end
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
# @!method self.mongocrypt_ctx_setopt_key_material(ctx, binary)
|
|
497
|
+
# @api private
|
|
498
|
+
#
|
|
499
|
+
# When creating a data key, set a custom key material to use for
|
|
500
|
+
# encrypting data.
|
|
501
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
502
|
+
# @param [ FFI::Pointer ] binary A pointer to a mongocrypt_binary_t
|
|
503
|
+
# object that references the data encryption key to use.
|
|
504
|
+
# @return [ Boolean ] Whether the custom key material was successfully set.
|
|
505
|
+
# @note Do not initialize ctx before calling this method.
|
|
506
|
+
attach_function(
|
|
507
|
+
:mongocrypt_ctx_setopt_key_material,
|
|
508
|
+
[:pointer, :pointer],
|
|
509
|
+
:bool
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
# Set set a custom key material to use for
|
|
513
|
+
# encrypting data.
|
|
514
|
+
#
|
|
515
|
+
# @param [ Mongo::Crypt::Context ] context A DataKeyContext
|
|
516
|
+
# @param [ BSON::Binary ] key_material 96 bytes of custom key material
|
|
517
|
+
#
|
|
518
|
+
# @raise [ Mongo::Error::CryptError ] If the key material is not 96 bytes.
|
|
519
|
+
def self.ctx_setopt_key_material(context, key_material)
|
|
520
|
+
data = {'keyMaterial' => key_material}.to_bson.to_s
|
|
521
|
+
Binary.wrap_string(data) do |data_p|
|
|
522
|
+
check_ctx_status(context) do
|
|
523
|
+
mongocrypt_ctx_setopt_key_material(context.ctx_p, data_p)
|
|
524
|
+
end
|
|
525
|
+
end
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
# @!method self.mongocrypt_ctx_setopt_algorithm(ctx, algorithm, len)
|
|
529
|
+
# @api private
|
|
530
|
+
#
|
|
531
|
+
# Set the algorithm used for explicit encryption.
|
|
532
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
533
|
+
# @param [ String ] algorithm The algorithm name. Valid values are:
|
|
534
|
+
# - "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
|
|
535
|
+
# - "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
|
|
536
|
+
# @param [ Integer ] len The length of the algorithm string.
|
|
537
|
+
# @note Do not initialize ctx before calling this method.
|
|
538
|
+
# @return [ Boolean ] Whether the option was successfully set.
|
|
539
|
+
attach_function(
|
|
540
|
+
:mongocrypt_ctx_setopt_algorithm,
|
|
541
|
+
[:pointer, :string, :int],
|
|
542
|
+
:bool
|
|
543
|
+
)
|
|
544
|
+
|
|
545
|
+
# Set the algorithm on the context
|
|
546
|
+
#
|
|
547
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
548
|
+
# @param [ String ] name The algorithm name. Valid values are:
|
|
549
|
+
# - "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
|
|
550
|
+
# - "AEAD_AES_256_CBC_HMAC_SHA_512-Random"
|
|
551
|
+
#
|
|
552
|
+
# @raise [ Mongo::Error::CryptError ] If the operation failed
|
|
553
|
+
def self.ctx_setopt_algorithm(context, name)
|
|
554
|
+
check_ctx_status(context) do
|
|
555
|
+
mongocrypt_ctx_setopt_algorithm(context.ctx_p, name, -1)
|
|
556
|
+
end
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
# @!method self.mongocrypt_ctx_setopt_key_encryption_key(ctx)
|
|
560
|
+
# @api private
|
|
561
|
+
#
|
|
562
|
+
# Set key encryption key document for creating a data key.
|
|
563
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
564
|
+
# @param [ FFI::Pointer ] bin A pointer to a mongocrypt_binary_t
|
|
565
|
+
# object that references a BSON document representing the key
|
|
566
|
+
# encryption key document with an additional "provider" field.
|
|
567
|
+
# @note Do not initialize ctx before calling this method.
|
|
568
|
+
# @return [ Boolean ] Whether the option was successfully set.
|
|
569
|
+
attach_function(
|
|
570
|
+
:mongocrypt_ctx_setopt_key_encryption_key,
|
|
571
|
+
[:pointer, :pointer],
|
|
572
|
+
:bool
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
# Set key encryption key document for creating a data key.
|
|
576
|
+
#
|
|
577
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
578
|
+
# @param [ BSON::Document ] key_document BSON document representing the key
|
|
579
|
+
# encryption key document with an additional "provider" field.
|
|
580
|
+
#
|
|
581
|
+
# @raise [ Mongo::Error::CryptError ] If the operation failed
|
|
582
|
+
def self.ctx_setopt_key_encryption_key(context, key_document)
|
|
583
|
+
validate_document(key_document)
|
|
584
|
+
data = key_document.to_bson.to_s
|
|
585
|
+
Binary.wrap_string(data) do |data_p|
|
|
586
|
+
check_ctx_status(context) do
|
|
587
|
+
mongocrypt_ctx_setopt_key_encryption_key(context.ctx_p, data_p)
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
# @!method self.mongocrypt_ctx_datakey_init(ctx)
|
|
593
|
+
# @api private
|
|
594
|
+
#
|
|
595
|
+
# Initializes the ctx to create a data key.
|
|
596
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
597
|
+
# @note Before calling this method, master key options must be set.
|
|
598
|
+
# Set AWS master key by calling mongocrypt_ctx_setopt_masterkey_aws
|
|
599
|
+
# and mongocrypt_ctx_setopt_masterkey_aws_endpoint. Set local master
|
|
600
|
+
# key by calling mongocrypt_ctx_setopt_masterkey_local.
|
|
601
|
+
# @return [ Boolean ] Whether the initialization was successful.
|
|
602
|
+
attach_function :mongocrypt_ctx_datakey_init, [:pointer], :bool
|
|
603
|
+
|
|
604
|
+
# Initialize the Context to create a data key
|
|
605
|
+
#
|
|
606
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
607
|
+
#
|
|
608
|
+
# @raise [ Mongo::Error::CryptError ] If initialization fails
|
|
609
|
+
def self.ctx_datakey_init(context)
|
|
610
|
+
check_ctx_status(context) do
|
|
611
|
+
mongocrypt_ctx_datakey_init(context.ctx_p)
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
# @!method self.mongocrypt_ctx_datakey_init(ctx, filter)
|
|
616
|
+
# @api private
|
|
617
|
+
#
|
|
618
|
+
# Initialize a context to rewrap datakeys.
|
|
619
|
+
#
|
|
620
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
621
|
+
# @param [ FFI::Pointer ] filter A pointer to a mongocrypt_binary_t object
|
|
622
|
+
# that represents filter to use for the find command on the key vault
|
|
623
|
+
# collection to retrieve datakeys to rewrap.
|
|
624
|
+
#
|
|
625
|
+
# @return [ Boolean ] Whether the initialization was successful.
|
|
626
|
+
attach_function(
|
|
627
|
+
:mongocrypt_ctx_rewrap_many_datakey_init,
|
|
628
|
+
[:pointer, :pointer],
|
|
629
|
+
:bool
|
|
630
|
+
)
|
|
631
|
+
|
|
632
|
+
# Initialize a context to rewrap datakeys.
|
|
633
|
+
#
|
|
634
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
635
|
+
# @param [ BSON::Document ] filter BSON Document
|
|
636
|
+
# that represents filter to use for the find command on the key vault
|
|
637
|
+
# collection to retrieve datakeys to rewrap.
|
|
638
|
+
#
|
|
639
|
+
# @return [ Boolean ] Whether the initialization was successful.
|
|
640
|
+
def self.ctx_rewrap_many_datakey_init(context, filter)
|
|
641
|
+
filter_data = filter.to_bson.to_s
|
|
642
|
+
Binary.wrap_string(filter_data) do |data_p|
|
|
643
|
+
check_ctx_status(context) do
|
|
644
|
+
mongocrypt_ctx_rewrap_many_datakey_init(context.ctx_p, data_p)
|
|
645
|
+
end
|
|
646
|
+
end
|
|
647
|
+
end
|
|
648
|
+
|
|
649
|
+
# @!method self.mongocrypt_ctx_encrypt_init(ctx, db, db_len, cmd)
|
|
650
|
+
# @api private
|
|
651
|
+
#
|
|
652
|
+
# Initializes the ctx for auto-encryption.
|
|
653
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
654
|
+
# @param [ String ] db The database name.
|
|
655
|
+
# @param [ Integer ] db_len The length of the database name argument
|
|
656
|
+
# (or -1 for a null-terminated string).
|
|
657
|
+
# @param [ FFI::Pointer ] cmd A pointer to a mongocrypt_binary_t object
|
|
658
|
+
# that references the database command as a binary string.
|
|
659
|
+
# @note This method expects the passed-in BSON to be in the format:
|
|
660
|
+
# { "v": BSON value to decrypt }.
|
|
661
|
+
# @return [ Boolean ] Whether the initialization was successful.
|
|
662
|
+
attach_function(
|
|
663
|
+
:mongocrypt_ctx_encrypt_init,
|
|
664
|
+
[:pointer, :string, :int, :pointer],
|
|
665
|
+
:bool
|
|
666
|
+
)
|
|
667
|
+
|
|
668
|
+
# Initialize the Context for auto-encryption
|
|
669
|
+
#
|
|
670
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
671
|
+
# @param [ String ] db_name The name of the database against which the
|
|
672
|
+
# encrypted command is being performed
|
|
673
|
+
# @param [ Hash ] command The command to be encrypted
|
|
674
|
+
#
|
|
675
|
+
# @raise [ Mongo::Error::CryptError ] If initialization fails
|
|
676
|
+
def self.ctx_encrypt_init(context, db_name, command)
|
|
677
|
+
validate_document(command)
|
|
678
|
+
data = command.to_bson.to_s
|
|
679
|
+
Binary.wrap_string(data) do |data_p|
|
|
680
|
+
check_ctx_status(context) do
|
|
681
|
+
mongocrypt_ctx_encrypt_init(context.ctx_p, db_name, -1, data_p)
|
|
682
|
+
end
|
|
683
|
+
end
|
|
684
|
+
end
|
|
685
|
+
|
|
686
|
+
# @!method self.mongocrypt_ctx_explicit_encrypt_init(ctx, msg)
|
|
687
|
+
# @api private
|
|
688
|
+
#
|
|
689
|
+
# Initializes the ctx for explicit encryption.
|
|
690
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
691
|
+
# @param [ FFI::Pointer ] msg A pointer to a mongocrypt_binary_t object
|
|
692
|
+
# that references the message to be encrypted as a binary string.
|
|
693
|
+
# @note Before calling this method, set a key_id, key_alt_name (optional),
|
|
694
|
+
# and encryption algorithm using the following methods:
|
|
695
|
+
# mongocrypt_ctx_setopt_key_id, mongocrypt_ctx_setopt_key_alt_name,
|
|
696
|
+
# and mongocrypt_ctx_setopt_algorithm.
|
|
697
|
+
# @return [ Boolean ] Whether the initialization was successful.
|
|
698
|
+
attach_function(
|
|
699
|
+
:mongocrypt_ctx_explicit_encrypt_init,
|
|
700
|
+
[:pointer, :pointer],
|
|
701
|
+
:bool
|
|
702
|
+
)
|
|
703
|
+
|
|
704
|
+
# Initialize the Context for explicit encryption
|
|
705
|
+
#
|
|
706
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
707
|
+
# @param [ Hash ] doc A BSON document to encrypt
|
|
708
|
+
#
|
|
709
|
+
# @raise [ Mongo::Error::CryptError ] If initialization fails
|
|
710
|
+
def self.ctx_explicit_encrypt_init(context, doc)
|
|
711
|
+
validate_document(doc)
|
|
712
|
+
data = doc.to_bson.to_s
|
|
713
|
+
Binary.wrap_string(data) do |data_p|
|
|
714
|
+
check_ctx_status(context) do
|
|
715
|
+
mongocrypt_ctx_explicit_encrypt_init(context.ctx_p, data_p)
|
|
716
|
+
end
|
|
717
|
+
end
|
|
718
|
+
end
|
|
719
|
+
|
|
720
|
+
# @!method self.mongocrypt_ctx_decrypt_init(ctx, doc)
|
|
721
|
+
# @api private
|
|
722
|
+
#
|
|
723
|
+
# Initializes the ctx for auto-decryption.
|
|
724
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
725
|
+
# @param [ FFI::Pointer ] doc A pointer to a mongocrypt_binary_t object
|
|
726
|
+
# that references the document to be decrypted as a BSON binary string.
|
|
727
|
+
# @return [ Boolean ] Whether the initialization was successful.
|
|
728
|
+
attach_function :mongocrypt_ctx_decrypt_init, [:pointer, :pointer], :bool
|
|
729
|
+
|
|
730
|
+
# Initialize the Context for auto-decryption
|
|
731
|
+
#
|
|
732
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
733
|
+
# @param [ BSON::Document ] command A BSON document to decrypt
|
|
734
|
+
#
|
|
735
|
+
# @raise [ Mongo::Error::CryptError ] If initialization fails
|
|
736
|
+
def self.ctx_decrypt_init(context, command)
|
|
737
|
+
validate_document(command)
|
|
738
|
+
data = command.to_bson.to_s
|
|
739
|
+
Binary.wrap_string(data) do |data_p|
|
|
740
|
+
check_ctx_status(context) do
|
|
741
|
+
mongocrypt_ctx_decrypt_init(context.ctx_p, data_p)
|
|
742
|
+
end
|
|
743
|
+
end
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
# @!method self.mongocrypt_ctx_explicit_decrypt_init(ctx, msg)
|
|
747
|
+
# @api private
|
|
748
|
+
#
|
|
749
|
+
# Initializes the ctx for explicit decryption.
|
|
750
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
751
|
+
# @param [ FFI::Pointer ] msg A pointer to a mongocrypt_binary_t object
|
|
752
|
+
# that references the message to be decrypted as a BSON binary string.
|
|
753
|
+
# @return [ Boolean ] Whether the initialization was successful.
|
|
754
|
+
attach_function(
|
|
755
|
+
:mongocrypt_ctx_explicit_decrypt_init,
|
|
756
|
+
[:pointer, :pointer],
|
|
757
|
+
:bool
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
# Initialize the Context for explicit decryption
|
|
761
|
+
#
|
|
762
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
763
|
+
# @param [ Hash ] doc A BSON document to decrypt
|
|
764
|
+
#
|
|
765
|
+
# @raise [ Mongo::Error::CryptError ] If initialization fails
|
|
766
|
+
def self.ctx_explicit_decrypt_init(context, doc)
|
|
767
|
+
validate_document(doc)
|
|
768
|
+
data = doc.to_bson.to_s
|
|
769
|
+
Binary.wrap_string(data) do |data_p|
|
|
770
|
+
check_ctx_status(context) do
|
|
771
|
+
mongocrypt_ctx_explicit_decrypt_init(context.ctx_p, data_p)
|
|
772
|
+
end
|
|
773
|
+
end
|
|
774
|
+
end
|
|
775
|
+
|
|
776
|
+
# An enum labeling different libmognocrypt state machine states
|
|
777
|
+
enum :mongocrypt_ctx_state, [
|
|
778
|
+
:error, 0,
|
|
779
|
+
:need_mongo_collinfo, 1,
|
|
780
|
+
:need_mongo_markings, 2,
|
|
781
|
+
:need_mongo_keys, 3,
|
|
782
|
+
:need_kms, 4,
|
|
783
|
+
:ready, 5,
|
|
784
|
+
:done, 6,
|
|
785
|
+
]
|
|
786
|
+
|
|
787
|
+
# @!method self.mongocrypt_ctx_state(ctx)
|
|
788
|
+
# @api private
|
|
789
|
+
#
|
|
790
|
+
# Get the current state of the ctx.
|
|
791
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
792
|
+
# @return [ Symbol ] The current state, will be one of the values defined
|
|
793
|
+
# by the mongocrypt_ctx_state enum.
|
|
794
|
+
attach_function :mongocrypt_ctx_state, [:pointer], :mongocrypt_ctx_state
|
|
795
|
+
|
|
796
|
+
# @!method self.mongocrypt_ctx_mongo_op(ctx, op_bson)
|
|
797
|
+
# @api private
|
|
798
|
+
#
|
|
799
|
+
# Get a BSON operation for the driver to run against the MongoDB
|
|
800
|
+
# collection, the key vault database, or mongocryptd.
|
|
801
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
802
|
+
# @param [ FFI::Pointer ] op_bson (out param) A pointer to a
|
|
803
|
+
# mongocrypt_binary_t object that will have a reference to the
|
|
804
|
+
# BSON operation written to it by libmongocrypt.
|
|
805
|
+
# @return [ Boolean ] A boolean indicating the success of the operation.
|
|
806
|
+
attach_function :mongocrypt_ctx_mongo_op, [:pointer, :pointer], :bool
|
|
807
|
+
|
|
808
|
+
# Returns a BSON::Document representing an operation that the
|
|
809
|
+
# driver must perform on behalf of libmongocrypt to get the
|
|
810
|
+
# information it needs in order to continue with
|
|
811
|
+
# encryption/decryption (for example, a filter for a key vault query).
|
|
812
|
+
#
|
|
813
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
814
|
+
#
|
|
815
|
+
# @raise [ Mongo::Crypt ] If there is an error getting the operation
|
|
816
|
+
# @return [ BSON::Document ] The operation that the driver must perform
|
|
817
|
+
def self.ctx_mongo_op(context)
|
|
818
|
+
binary = Binary.new
|
|
819
|
+
|
|
820
|
+
check_ctx_status(context) do
|
|
821
|
+
mongocrypt_ctx_mongo_op(context.ctx_p, binary.ref)
|
|
822
|
+
end
|
|
823
|
+
|
|
824
|
+
# TODO since the binary references a C pointer, and ByteBuffer is
|
|
825
|
+
# written in C in MRI, we could omit a copy of the data by making
|
|
826
|
+
# ByteBuffer reference the string that is owned by libmongocrypt.
|
|
827
|
+
BSON::Document.from_bson(BSON::ByteBuffer.new(binary.to_s), mode: :bson)
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
# @!method self.mongocrypt_ctx_mongo_feed(ctx, reply)
|
|
831
|
+
# @api private
|
|
832
|
+
#
|
|
833
|
+
# Feed a BSON reply to libmongocrypt.
|
|
834
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
835
|
+
# @param [ FFI::Pointer ] reply A mongocrypt_binary_t object that
|
|
836
|
+
# references the BSON reply to feed to libmongocrypt.
|
|
837
|
+
# @return [ Boolean ] A boolean indicating the success of the operation.
|
|
838
|
+
attach_function :mongocrypt_ctx_mongo_feed, [:pointer, :pointer], :bool
|
|
839
|
+
|
|
840
|
+
# Feed a response from the driver back to libmongocrypt
|
|
841
|
+
#
|
|
842
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
843
|
+
# @param [ BSON::Document ] doc The document representing the response
|
|
844
|
+
#
|
|
845
|
+
# @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
|
|
846
|
+
def self.ctx_mongo_feed(context, doc)
|
|
847
|
+
validate_document(doc)
|
|
848
|
+
data = doc.to_bson.to_s
|
|
849
|
+
Binary.wrap_string(data) do |data_p|
|
|
850
|
+
check_ctx_status(context) do
|
|
851
|
+
mongocrypt_ctx_mongo_feed(context.ctx_p, data_p)
|
|
852
|
+
end
|
|
853
|
+
end
|
|
854
|
+
end
|
|
855
|
+
|
|
856
|
+
# @!method self.mongocrypt_ctx_mongo_done(ctx)
|
|
857
|
+
# @api private
|
|
858
|
+
#
|
|
859
|
+
# Indicate to libmongocrypt that the driver is done feeding replies.
|
|
860
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
861
|
+
# @return [ Boolean ] A boolean indicating the success of the operation.
|
|
862
|
+
attach_function :mongocrypt_ctx_mongo_done, [:pointer], :bool
|
|
863
|
+
|
|
864
|
+
# @!method self.mongocrypt_ctx_mongo_next_kms_ctx(ctx)
|
|
865
|
+
# @api private
|
|
866
|
+
#
|
|
867
|
+
# Return a pointer to a mongocrypt_kms_ctx_t object or NULL.
|
|
868
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
869
|
+
# @return [ FFI::Pointer ] A pointer to a mongocrypt_kms_ctx_t object.
|
|
870
|
+
attach_function :mongocrypt_ctx_next_kms_ctx, [:pointer], :pointer
|
|
871
|
+
|
|
872
|
+
# Return a new KmsContext object needed by a Context object.
|
|
873
|
+
#
|
|
874
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
875
|
+
#
|
|
876
|
+
# @return [ Mongo::Crypt::KmsContext | nil ] The KmsContext needed to
|
|
877
|
+
# fetch an AWS master key or nil, if no KmsContext is needed
|
|
878
|
+
def self.ctx_next_kms_ctx(context)
|
|
879
|
+
kms_ctx_p = mongocrypt_ctx_next_kms_ctx(context.ctx_p)
|
|
880
|
+
|
|
881
|
+
if kms_ctx_p.null?
|
|
882
|
+
nil
|
|
883
|
+
else
|
|
884
|
+
KmsContext.new(kms_ctx_p)
|
|
885
|
+
end
|
|
886
|
+
end
|
|
887
|
+
|
|
888
|
+
# @!method self.mongocrypt_kms_ctx_get_kms_provider(crypt, kms_providers)
|
|
889
|
+
# @api private
|
|
890
|
+
#
|
|
891
|
+
# Get the KMS provider identifier associated with this KMS request.
|
|
892
|
+
#
|
|
893
|
+
# This is used to conditionally configure TLS connections based on the KMS
|
|
894
|
+
# request. It is useful for KMIP, which authenticates with a client
|
|
895
|
+
# certificate.
|
|
896
|
+
#
|
|
897
|
+
# @param [ FFI::Pointer ] kms Pointer mongocrypt_kms_ctx_t object.
|
|
898
|
+
# @param [ FFI::Pointer ] len (outparam) Receives the length of the
|
|
899
|
+
# returned string. It may be NULL. If it is not NULL, it is set to
|
|
900
|
+
# the length of the returned string without the NULL terminator.
|
|
901
|
+
#
|
|
902
|
+
# @returns [ FFI::Pointer ] One of the NULL terminated static strings: "aws", "azure", "gcp", or
|
|
903
|
+
# "kmip".
|
|
904
|
+
attach_function(
|
|
905
|
+
:mongocrypt_kms_ctx_get_kms_provider,
|
|
906
|
+
[:pointer, :pointer],
|
|
907
|
+
:pointer
|
|
908
|
+
)
|
|
909
|
+
|
|
910
|
+
# Get the KMS provider identifier associated with this KMS request.
|
|
911
|
+
#
|
|
912
|
+
# This is used to conditionally configure TLS connections based on the KMS
|
|
913
|
+
# request. It is useful for KMIP, which authenticates with a client
|
|
914
|
+
# certificate.
|
|
915
|
+
#
|
|
916
|
+
# @param [ FFI::Pointer ] kms Pointer mongocrypt_kms_ctx_t object.
|
|
917
|
+
#
|
|
918
|
+
# @returns [ Symbol | nil ] KMS provider identifier.
|
|
919
|
+
def self.kms_ctx_get_kms_provider(kms_context)
|
|
920
|
+
len_ptr = FFI::MemoryPointer.new(:uint32, 1)
|
|
921
|
+
provider = mongocrypt_kms_ctx_get_kms_provider(
|
|
922
|
+
kms_context.kms_ctx_p,
|
|
923
|
+
len_ptr
|
|
924
|
+
)
|
|
925
|
+
if len_ptr.nil?
|
|
926
|
+
nil
|
|
927
|
+
else
|
|
928
|
+
len = if BSON::Environment.jruby?
|
|
929
|
+
# JRuby FFI implementation does not have `read(type)` method, but it
|
|
930
|
+
# has this `get_uint32`.
|
|
931
|
+
len_ptr.get_uint32
|
|
932
|
+
else
|
|
933
|
+
# For MRI we use a documented `read` method - https://www.rubydoc.info/github/ffi/ffi/FFI%2FPointer:read
|
|
934
|
+
len_ptr.read(:uint32)
|
|
935
|
+
end
|
|
936
|
+
provider.read_string(len).to_sym
|
|
937
|
+
end
|
|
938
|
+
end
|
|
939
|
+
|
|
940
|
+
# @!method self.mongocrypt_kms_ctx_message(kms, msg)
|
|
941
|
+
# @api private
|
|
942
|
+
#
|
|
943
|
+
# Get the message needed to fetch the AWS KMS master key.
|
|
944
|
+
# @param [ FFI::Pointer ] kms Pointer to the mongocrypt_kms_ctx_t object
|
|
945
|
+
# @param [ FFI::Pointer ] msg (outparam) Pointer to a mongocrypt_binary_t
|
|
946
|
+
# object that will have the location of the message written to it by
|
|
947
|
+
# libmongocrypt.
|
|
948
|
+
# @return [ Boolean ] Whether the operation is successful.
|
|
949
|
+
attach_function :mongocrypt_kms_ctx_message, [:pointer, :pointer], :bool
|
|
950
|
+
|
|
951
|
+
# Get the HTTP message needed to fetch the AWS KMS master key from a
|
|
952
|
+
# KmsContext object.
|
|
953
|
+
#
|
|
954
|
+
# @param [ Mongo::Crypt::KmsContext ] kms_context
|
|
955
|
+
#
|
|
956
|
+
# @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
|
|
957
|
+
#
|
|
958
|
+
# @return [ String ] The HTTP message
|
|
959
|
+
def self.kms_ctx_message(kms_context)
|
|
960
|
+
binary = Binary.new
|
|
961
|
+
|
|
962
|
+
check_kms_ctx_status(kms_context) do
|
|
963
|
+
mongocrypt_kms_ctx_message(kms_context.kms_ctx_p, binary.ref)
|
|
964
|
+
end
|
|
965
|
+
|
|
966
|
+
return binary.to_s
|
|
967
|
+
end
|
|
968
|
+
|
|
969
|
+
# @!method self.mongocrypt_kms_ctx_endpoint(kms, endpoint)
|
|
970
|
+
# @api private
|
|
971
|
+
#
|
|
972
|
+
# Get the hostname with which to connect over TLS to get information about
|
|
973
|
+
# the AWS master key.
|
|
974
|
+
# @param [ FFI::Pointer ] kms A pointer to a mongocrypt_kms_ctx_t object.
|
|
975
|
+
# @param [ FFI::Pointer ] endpoint (out param) A pointer to which the
|
|
976
|
+
# endpoint string will be written by libmongocrypt.
|
|
977
|
+
# @return [ Boolean ] Whether the operation was successful.
|
|
978
|
+
attach_function :mongocrypt_kms_ctx_endpoint, [:pointer, :pointer], :bool
|
|
979
|
+
|
|
980
|
+
# Get the hostname with which to connect over TLS to get information
|
|
981
|
+
# about the AWS master key.
|
|
982
|
+
#
|
|
983
|
+
# @param [ Mongo::Crypt::KmsContext ] kms_context
|
|
984
|
+
#
|
|
985
|
+
# @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
|
|
986
|
+
#
|
|
987
|
+
# @return [ String | nil ] The hostname, or nil if none exists
|
|
988
|
+
def self.kms_ctx_endpoint(kms_context)
|
|
989
|
+
ptr = FFI::MemoryPointer.new(:pointer, 1)
|
|
990
|
+
|
|
991
|
+
check_kms_ctx_status(kms_context) do
|
|
992
|
+
mongocrypt_kms_ctx_endpoint(kms_context.kms_ctx_p, ptr)
|
|
993
|
+
end
|
|
994
|
+
|
|
995
|
+
str_ptr = ptr.read_pointer
|
|
996
|
+
str_ptr.null? ? nil : str_ptr.read_string.force_encoding('UTF-8')
|
|
997
|
+
end
|
|
998
|
+
|
|
999
|
+
# @!method self.mongocrypt_kms_ctx_bytes_needed(kms)
|
|
1000
|
+
# @api private
|
|
1001
|
+
#
|
|
1002
|
+
# Get the number of bytes needed by the KMS context.
|
|
1003
|
+
# @param [ FFI::Pointer ] kms The mongocrypt_kms_ctx_t object.
|
|
1004
|
+
# @return [ Integer ] The number of bytes needed.
|
|
1005
|
+
attach_function :mongocrypt_kms_ctx_bytes_needed, [:pointer], :int
|
|
1006
|
+
|
|
1007
|
+
# Get the number of bytes needed by the KmsContext.
|
|
1008
|
+
#
|
|
1009
|
+
# @param [ Mongo::Crypt::KmsContext ] kms_context
|
|
1010
|
+
#
|
|
1011
|
+
# @return [ Integer ] The number of bytes needed
|
|
1012
|
+
def self.kms_ctx_bytes_needed(kms_context)
|
|
1013
|
+
mongocrypt_kms_ctx_bytes_needed(kms_context.kms_ctx_p)
|
|
1014
|
+
end
|
|
1015
|
+
|
|
1016
|
+
# @!method self.mongocrypt_kms_ctx_feed(kms, bytes)
|
|
1017
|
+
# @api private
|
|
1018
|
+
#
|
|
1019
|
+
# Feed replies from the KMS back to libmongocrypt.
|
|
1020
|
+
# @param [ FFI::Pointer ] kms A pointer to the mongocrypt_kms_ctx_t object.
|
|
1021
|
+
# @param [ FFI::Pointer ] bytes A pointer to a mongocrypt_binary_t
|
|
1022
|
+
# object that references the response from the KMS.
|
|
1023
|
+
# @return [ Boolean ] Whether the operation was successful.
|
|
1024
|
+
attach_function :mongocrypt_kms_ctx_feed, [:pointer, :pointer], :bool
|
|
1025
|
+
|
|
1026
|
+
# Feed replies from the KMS back to libmongocrypt.
|
|
1027
|
+
#
|
|
1028
|
+
# @param [ Mongo::Crypt::KmsContext ] kms_context
|
|
1029
|
+
# @param [ String ] bytes The data to feed to libmongocrypt
|
|
1030
|
+
#
|
|
1031
|
+
# @raise [ Mongo::Error::CryptError ] If the response is not fed successfully
|
|
1032
|
+
def self.kms_ctx_feed(kms_context, bytes)
|
|
1033
|
+
check_kms_ctx_status(kms_context) do
|
|
1034
|
+
Binary.wrap_string(bytes) do |bytes_p|
|
|
1035
|
+
mongocrypt_kms_ctx_feed(kms_context.kms_ctx_p, bytes_p)
|
|
1036
|
+
end
|
|
1037
|
+
end
|
|
1038
|
+
end
|
|
1039
|
+
|
|
1040
|
+
# @!method self.mongocrypt_kms_ctx_status(kms, status)
|
|
1041
|
+
# @api private
|
|
1042
|
+
#
|
|
1043
|
+
# Write status information about the mongocrypt_kms_ctx_t object
|
|
1044
|
+
# to the mongocrypt_status_t object.
|
|
1045
|
+
# @param [ FFI::Pointer ] kms A pointer to the mongocrypt_kms_ctx_t object.
|
|
1046
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t object.
|
|
1047
|
+
# @return [ Boolean ] Whether the operation was successful.
|
|
1048
|
+
attach_function :mongocrypt_kms_ctx_status, [:pointer, :pointer], :bool
|
|
1049
|
+
|
|
1050
|
+
# If the provided block returns false, raise a CryptError with the
|
|
1051
|
+
# status information from the provided KmsContext object.
|
|
1052
|
+
#
|
|
1053
|
+
# @param [ Mongo::Crypt::KmsContext ] kms_context
|
|
1054
|
+
#
|
|
1055
|
+
# @raise [ Mongo::Error::CryptError ] If the provided block returns false
|
|
1056
|
+
def self.check_kms_ctx_status(kms_context)
|
|
1057
|
+
unless yield
|
|
1058
|
+
status = Status.new
|
|
1059
|
+
|
|
1060
|
+
mongocrypt_kms_ctx_status(kms_context.kms_ctx_p, status.ref)
|
|
1061
|
+
status.raise_crypt_error(kms: true)
|
|
1062
|
+
end
|
|
1063
|
+
end
|
|
1064
|
+
|
|
1065
|
+
# @!method self.mongocrypt_kms_ctx_done(ctx)
|
|
1066
|
+
# @api private
|
|
1067
|
+
#
|
|
1068
|
+
# Indicate to libmongocrypt that it will receive no more replies from
|
|
1069
|
+
# mongocrypt_kms_ctx_t objects.
|
|
1070
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
1071
|
+
# @return [ Boolean ] Whether the operation was successful.
|
|
1072
|
+
attach_function :mongocrypt_ctx_kms_done, [:pointer], :bool
|
|
1073
|
+
|
|
1074
|
+
# Indicate to libmongocrypt that it will receive no more KMS replies.
|
|
1075
|
+
#
|
|
1076
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
1077
|
+
#
|
|
1078
|
+
# @raise [ Mongo::Error::CryptError ] If the operation is unsuccessful
|
|
1079
|
+
def self.ctx_kms_done(context)
|
|
1080
|
+
check_ctx_status(context) do
|
|
1081
|
+
mongocrypt_ctx_kms_done(context.ctx_p)
|
|
1082
|
+
end
|
|
1083
|
+
end
|
|
1084
|
+
|
|
1085
|
+
# @!method self.mongocrypt_ctx_finalize(ctx, op_bson)
|
|
1086
|
+
# @api private
|
|
1087
|
+
#
|
|
1088
|
+
# Perform the final encryption or decryption and return a BSON document.
|
|
1089
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
1090
|
+
# @param [ FFI::Pointer ] op_bson (out param) A pointer to a
|
|
1091
|
+
# mongocrypt_binary_t object that will have a reference to the
|
|
1092
|
+
# final encrypted BSON document.
|
|
1093
|
+
# @return [ Boolean ] A boolean indicating the success of the operation.
|
|
1094
|
+
attach_function :mongocrypt_ctx_finalize, [:pointer, :pointer], :void
|
|
1095
|
+
|
|
1096
|
+
# Finalize the state machine represented by the Context
|
|
1097
|
+
#
|
|
1098
|
+
# @param [ Mongo::Crypt::Context ] context
|
|
1099
|
+
#
|
|
1100
|
+
# @raise [ Mongo::Error::CryptError ] If the state machine is not successfully
|
|
1101
|
+
# finalized
|
|
1102
|
+
def self.ctx_finalize(context)
|
|
1103
|
+
binary = Binary.new
|
|
1104
|
+
|
|
1105
|
+
check_ctx_status(context) do
|
|
1106
|
+
mongocrypt_ctx_finalize(context.ctx_p, binary.ref)
|
|
1107
|
+
end
|
|
1108
|
+
|
|
1109
|
+
# TODO since the binary references a C pointer, and ByteBuffer is
|
|
1110
|
+
# written in C in MRI, we could omit a copy of the data by making
|
|
1111
|
+
# ByteBuffer reference the string that is owned by libmongocrypt.
|
|
1112
|
+
BSON::Document.from_bson(BSON::ByteBuffer.new(binary.to_s), mode: :bson)
|
|
1113
|
+
end
|
|
1114
|
+
|
|
1115
|
+
# @!method self.mongocrypt_ctx_destroy(ctx)
|
|
1116
|
+
# @api private
|
|
1117
|
+
#
|
|
1118
|
+
# Destroy the reference to the mongocrypt_ctx_t object.
|
|
1119
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
1120
|
+
# @return [ nil ] Always nil.
|
|
1121
|
+
attach_function :mongocrypt_ctx_destroy, [:pointer], :void
|
|
1122
|
+
|
|
1123
|
+
# @!method mongocrypt_crypto_fn(ctx, key, iv, input, output, status)
|
|
1124
|
+
# @api private
|
|
1125
|
+
#
|
|
1126
|
+
# A callback to a function that performs AES encryption or decryption.
|
|
1127
|
+
# @param [ FFI::Pointer | nil] ctx An optional pointer to a context object
|
|
1128
|
+
# that may have been set when hooks were enabled.
|
|
1129
|
+
# @param [ FFI::Pointer ] key A pointer to a mongocrypt_binary_t object
|
|
1130
|
+
# that references the 32-byte AES encryption key.
|
|
1131
|
+
# @param [ FFI::Pointer ] iv A pointer to a mongocrypt_binary_t object
|
|
1132
|
+
# that references the 16-byte AES IV.
|
|
1133
|
+
# @param [ FFI::Pointer ] input A pointer to a mongocrypt_binary_t object
|
|
1134
|
+
# that references the value to be encrypted/decrypted.
|
|
1135
|
+
# @param [ FFI::Pointer ] output (out param) A pointer to a
|
|
1136
|
+
# mongocrypt_binary_t object will have a reference to the encrypted/
|
|
1137
|
+
# decrypted value written to it by libmongocrypt.
|
|
1138
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
|
|
1139
|
+
# object to which an error message will be written if encryption fails.
|
|
1140
|
+
# @return [ Bool ] Whether encryption/decryption was successful.
|
|
1141
|
+
#
|
|
1142
|
+
# @note This defines a method signature for an FFI callback; it is not
|
|
1143
|
+
# an instance method on the Binding class.
|
|
1144
|
+
callback(
|
|
1145
|
+
:mongocrypt_crypto_fn,
|
|
1146
|
+
[:pointer, :pointer, :pointer, :pointer, :pointer, :pointer, :pointer],
|
|
1147
|
+
:bool
|
|
1148
|
+
)
|
|
1149
|
+
|
|
1150
|
+
# @!method mongocrypt_hmac_fn(ctx, key, input, output, status)
|
|
1151
|
+
# @api private
|
|
1152
|
+
#
|
|
1153
|
+
# A callback to a function that performs HMAC SHA-512 or SHA-256.
|
|
1154
|
+
# @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
|
|
1155
|
+
# that may have been set when hooks were enabled.
|
|
1156
|
+
# @param [ FFI::Pointer ] key A pointer to a mongocrypt_binary_t object
|
|
1157
|
+
# that references the 32-byte HMAC SHA encryption key.
|
|
1158
|
+
# @param [ FFI::Pointer ] input A pointer to a mongocrypt_binary_t object
|
|
1159
|
+
# that references the input value.
|
|
1160
|
+
# @param [ FFI::Pointer ] output (out param) A pointer to a
|
|
1161
|
+
# mongocrypt_binary_t object will have a reference to the output value
|
|
1162
|
+
# written to it by libmongocrypt.
|
|
1163
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
|
|
1164
|
+
# object to which an error message will be written if encryption fails.
|
|
1165
|
+
# @return [ Bool ] Whether HMAC-SHA was successful.
|
|
1166
|
+
#
|
|
1167
|
+
# @note This defines a method signature for an FFI callback; it is not
|
|
1168
|
+
# an instance method on the Binding class.
|
|
1169
|
+
callback(
|
|
1170
|
+
:mongocrypt_hmac_fn,
|
|
1171
|
+
[:pointer, :pointer, :pointer, :pointer, :pointer],
|
|
1172
|
+
:bool
|
|
1173
|
+
)
|
|
1174
|
+
|
|
1175
|
+
# @!method mongocrypt_hash_fn(ctx, input, output, status)
|
|
1176
|
+
# @api private
|
|
1177
|
+
#
|
|
1178
|
+
# A callback to a SHA-256 hash function.
|
|
1179
|
+
# @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
|
|
1180
|
+
# that may have been set when hooks were enabled.
|
|
1181
|
+
# @param [ FFI::Pointer ] input A pointer to a mongocrypt_binary_t object
|
|
1182
|
+
# that references the value to be hashed.
|
|
1183
|
+
# @param [ FFI::Pointer ] output (out param) A pointer to a
|
|
1184
|
+
# mongocrypt_binary_t object will have a reference to the output value
|
|
1185
|
+
# written to it by libmongocrypt.
|
|
1186
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
|
|
1187
|
+
# object to which an error message will be written if encryption fails.
|
|
1188
|
+
# @return [ Bool ] Whether hashing was successful.
|
|
1189
|
+
#
|
|
1190
|
+
# @note This defines a method signature for an FFI callback; it is not
|
|
1191
|
+
# an instance method on the Binding class.
|
|
1192
|
+
callback :mongocrypt_hash_fn, [:pointer, :pointer, :pointer, :pointer], :bool
|
|
1193
|
+
|
|
1194
|
+
# @!method mongocrypt_random_fn(ctx, output, count, status)
|
|
1195
|
+
# @api private
|
|
1196
|
+
#
|
|
1197
|
+
# A callback to a crypto secure random function.
|
|
1198
|
+
# @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
|
|
1199
|
+
# that may have been set when hooks were enabled.
|
|
1200
|
+
# @param [ FFI::Pointer ] output (out param) A pointer to a
|
|
1201
|
+
# mongocrypt_binary_t object will have a reference to the output value
|
|
1202
|
+
# written to it by libmongocrypt.
|
|
1203
|
+
# @param [ Integer ] count The number of random bytes to return.
|
|
1204
|
+
# @param [ FFI::Pointer ] status A pointer to a mongocrypt_status_t
|
|
1205
|
+
# object to which an error message will be written if encryption fails.
|
|
1206
|
+
# @return [ Bool ] Whether hashing was successful.
|
|
1207
|
+
#
|
|
1208
|
+
# @note This defines a method signature for an FFI callback; it is not
|
|
1209
|
+
# an instance method on the Binding class.
|
|
1210
|
+
callback :mongocrypt_random_fn, [:pointer, :pointer, :int, :pointer], :bool
|
|
1211
|
+
|
|
1212
|
+
# @!method self.mongocrypt_setopt_crypto_hooks(crypt, aes_enc_fn, aes_dec_fn, random_fn, sha_512_fn, sha_256_fn, hash_fn, ctx=nil)
|
|
1213
|
+
# @api private
|
|
1214
|
+
#
|
|
1215
|
+
# Set crypto hooks on the provided mongocrypt object.
|
|
1216
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
1217
|
+
# @param [ Proc ] aes_enc_fn An AES encryption method.
|
|
1218
|
+
# @param [ Proc ] aes_dec_fn An AES decryption method.
|
|
1219
|
+
# @param [ Proc ] random_fn A random method.
|
|
1220
|
+
# @param [ Proc ] sha_512_fn A HMAC SHA-512 method.
|
|
1221
|
+
# @param [ Proc ] sha_256_fn A HMAC SHA-256 method.
|
|
1222
|
+
# @param [ Proc ] hash_fn A SHA-256 hash method.
|
|
1223
|
+
# @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
|
|
1224
|
+
# that may have been set when hooks were enabled.
|
|
1225
|
+
# @return [ Boolean ] Whether setting this option succeeded.
|
|
1226
|
+
attach_function(
|
|
1227
|
+
:mongocrypt_setopt_crypto_hooks,
|
|
1228
|
+
[
|
|
1229
|
+
:pointer,
|
|
1230
|
+
:mongocrypt_crypto_fn,
|
|
1231
|
+
:mongocrypt_crypto_fn,
|
|
1232
|
+
:mongocrypt_random_fn,
|
|
1233
|
+
:mongocrypt_hmac_fn,
|
|
1234
|
+
:mongocrypt_hmac_fn,
|
|
1235
|
+
:mongocrypt_hash_fn,
|
|
1236
|
+
:pointer
|
|
1237
|
+
],
|
|
1238
|
+
:bool
|
|
1239
|
+
)
|
|
1240
|
+
|
|
1241
|
+
# Set crypto callbacks on the Handle
|
|
1242
|
+
#
|
|
1243
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
1244
|
+
# @param [ Method ] aes_encrypt_cb An AES encryption method
|
|
1245
|
+
# @param [ Method ] aes_decrypt_cb A AES decryption method
|
|
1246
|
+
# @param [ Method ] random_cb A method that returns a string of random bytes
|
|
1247
|
+
# @param [ Method ] hmac_sha_512_cb A HMAC SHA-512 method
|
|
1248
|
+
# @param [ Method ] hmac_sha_256_cb A HMAC SHA-256 method
|
|
1249
|
+
# @param [ Method ] hmac_hash_cb A SHA-256 hash method
|
|
1250
|
+
#
|
|
1251
|
+
# @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
|
|
1252
|
+
def self.setopt_crypto_hooks(handle,
|
|
1253
|
+
aes_encrypt_cb, aes_decrypt_cb, random_cb,
|
|
1254
|
+
hmac_sha_512_cb, hmac_sha_256_cb, hmac_hash_cb
|
|
1255
|
+
)
|
|
1256
|
+
check_status(handle) do
|
|
1257
|
+
mongocrypt_setopt_crypto_hooks(handle.ref,
|
|
1258
|
+
aes_encrypt_cb, aes_decrypt_cb, random_cb,
|
|
1259
|
+
hmac_sha_512_cb, hmac_sha_256_cb, hmac_hash_cb, nil
|
|
1260
|
+
)
|
|
1261
|
+
end
|
|
1262
|
+
end
|
|
1263
|
+
|
|
1264
|
+
# @!method self.mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(crypt, sign_rsaes_pkcs1_v1_5, ctx=nil)
|
|
1265
|
+
# @api private
|
|
1266
|
+
#
|
|
1267
|
+
# Set a crypto hook for the RSASSA-PKCS1-v1_5 algorithm with a SHA-256 hash.
|
|
1268
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
1269
|
+
# @param [ Proc ] sign_rsaes_pkcs1_v1_5 A RSASSA-PKCS1-v1_5 signing method.
|
|
1270
|
+
# @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
|
|
1271
|
+
# that may have been set when hooks were enabled.
|
|
1272
|
+
# @return [ Boolean ] Whether setting this option succeeded.
|
|
1273
|
+
attach_function(
|
|
1274
|
+
:mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5,
|
|
1275
|
+
[
|
|
1276
|
+
:pointer,
|
|
1277
|
+
:mongocrypt_hmac_fn,
|
|
1278
|
+
:pointer
|
|
1279
|
+
],
|
|
1280
|
+
:bool
|
|
1281
|
+
)
|
|
1282
|
+
|
|
1283
|
+
# Set a crypto hook for the RSASSA-PKCS1-v1_5 algorithm with
|
|
1284
|
+
# a SHA-256 hash oh the Handle.
|
|
1285
|
+
#
|
|
1286
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
1287
|
+
# @param [ Method ] rsaes_pkcs_signature_cb A RSASSA-PKCS1-v1_5 signing method.
|
|
1288
|
+
#
|
|
1289
|
+
# @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
|
|
1290
|
+
def self.setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(
|
|
1291
|
+
handle,
|
|
1292
|
+
rsaes_pkcs_signature_cb
|
|
1293
|
+
)
|
|
1294
|
+
check_status(handle) do
|
|
1295
|
+
mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(
|
|
1296
|
+
handle.ref,
|
|
1297
|
+
rsaes_pkcs_signature_cb,
|
|
1298
|
+
nil
|
|
1299
|
+
)
|
|
1300
|
+
end
|
|
1301
|
+
end
|
|
1302
|
+
|
|
1303
|
+
# @!method self.mongocrypt_setopt_encrypted_field_config_map(crypt, efc_map)
|
|
1304
|
+
# @api private
|
|
1305
|
+
#
|
|
1306
|
+
# Set a local EncryptedFieldConfigMap for encryption.
|
|
1307
|
+
#
|
|
1308
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
1309
|
+
# @param [ FFI::Pointer ] efc_map A pointer to mongocrypt_binary_t object that
|
|
1310
|
+
# references a BSON document representing the EncryptedFieldConfigMap
|
|
1311
|
+
# supplied by the user. The keys are collection namespaces and values are
|
|
1312
|
+
# EncryptedFieldConfigMap documents.
|
|
1313
|
+
#
|
|
1314
|
+
# @return [ Boolean ] Whether the operation succeeded.
|
|
1315
|
+
attach_function(
|
|
1316
|
+
:mongocrypt_setopt_encrypted_field_config_map,
|
|
1317
|
+
[
|
|
1318
|
+
:pointer,
|
|
1319
|
+
:pointer
|
|
1320
|
+
],
|
|
1321
|
+
:bool
|
|
1322
|
+
)
|
|
1323
|
+
|
|
1324
|
+
# Set a local EncryptedFieldConfigMap for encryption.
|
|
1325
|
+
#
|
|
1326
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
1327
|
+
# @param [ BSON::Document ] efc_map A BSON document representing
|
|
1328
|
+
# the EncryptedFieldConfigMap supplied by the user.
|
|
1329
|
+
# The keys are collection namespaces and values are
|
|
1330
|
+
# EncryptedFieldConfigMap documents.
|
|
1331
|
+
#
|
|
1332
|
+
# @raise [ Mongo::Error::CryptError ] If the operation failed.
|
|
1333
|
+
def self.setopt_encrypted_field_config_map(handle, efc_map)
|
|
1334
|
+
validate_document(efc_map)
|
|
1335
|
+
data = efc_map.to_bson.to_s
|
|
1336
|
+
Binary.wrap_string(data) do |data_p|
|
|
1337
|
+
check_status(handle) do
|
|
1338
|
+
mongocrypt_setopt_encrypted_field_config_map(
|
|
1339
|
+
handle.ref,
|
|
1340
|
+
data_p
|
|
1341
|
+
)
|
|
1342
|
+
end
|
|
1343
|
+
end
|
|
1344
|
+
end
|
|
1345
|
+
|
|
1346
|
+
# @!method self.mongocrypt_setopt_bypass_query_analysis(crypt)
|
|
1347
|
+
# @api private
|
|
1348
|
+
#
|
|
1349
|
+
# Opt into skipping query analysis.
|
|
1350
|
+
#
|
|
1351
|
+
# If opted in:
|
|
1352
|
+
# - The csfle shared library will not attempt to be loaded.
|
|
1353
|
+
# - A mongocrypt_ctx_t will never enter the MONGOCRYPT_CTX_NEED_MARKINGS state.
|
|
1354
|
+
#
|
|
1355
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
1356
|
+
attach_function(:mongocrypt_setopt_bypass_query_analysis, [:pointer], :void)
|
|
1357
|
+
|
|
1358
|
+
# Opt-into skipping query analysis.
|
|
1359
|
+
#
|
|
1360
|
+
# If opted in:
|
|
1361
|
+
# - The csfle shared library will not attempt to be loaded.
|
|
1362
|
+
# - A mongocrypt_ctx_t will never enter the MONGOCRYPT_CTX_NEED_MARKINGS state.
|
|
1363
|
+
#
|
|
1364
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
1365
|
+
def self.setopt_bypass_query_analysis(handle)
|
|
1366
|
+
mongocrypt_setopt_bypass_query_analysis(handle.ref)
|
|
1367
|
+
end
|
|
1368
|
+
|
|
1369
|
+
# @!method self.mongocrypt_setopt_aes_256_ctr(crypt, aes_256_ctr_encrypt, aes_256_ctr_decrypt, ctx)
|
|
1370
|
+
# @api private
|
|
1371
|
+
#
|
|
1372
|
+
# Set a crypto hook for the AES256-CTR operations.
|
|
1373
|
+
#
|
|
1374
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
1375
|
+
# @param [ Proc ] aes_enc_fn An AES-CTR encryption method.
|
|
1376
|
+
# @param [ Proc ] aes_dec_fn An AES-CTR decryption method.
|
|
1377
|
+
# @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
|
|
1378
|
+
# that may have been set when hooks were enabled.
|
|
1379
|
+
# @return [ Boolean ] Whether setting this option succeeded.
|
|
1380
|
+
attach_function(
|
|
1381
|
+
:mongocrypt_setopt_aes_256_ctr,
|
|
1382
|
+
[
|
|
1383
|
+
:pointer,
|
|
1384
|
+
:mongocrypt_crypto_fn,
|
|
1385
|
+
:mongocrypt_crypto_fn,
|
|
1386
|
+
:pointer
|
|
1387
|
+
],
|
|
1388
|
+
:bool
|
|
1389
|
+
)
|
|
1390
|
+
|
|
1391
|
+
# Set a crypto hook for the AES256-CTR operations.
|
|
1392
|
+
#
|
|
1393
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
1394
|
+
# @param [ Method ] aes_encrypt_cb An AES-CTR encryption method
|
|
1395
|
+
# @param [ Method ] aes_decrypt_cb A AES-CTR decryption method
|
|
1396
|
+
#
|
|
1397
|
+
# @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
|
|
1398
|
+
def self.setopt_aes_256_ctr(handle, aes_ctr_encrypt_cb, aes_ctr_decrypt_cb)
|
|
1399
|
+
check_status(handle) do
|
|
1400
|
+
mongocrypt_setopt_aes_256_ctr(handle.ref,
|
|
1401
|
+
aes_ctr_encrypt_cb, aes_ctr_decrypt_cb, nil
|
|
1402
|
+
)
|
|
1403
|
+
end
|
|
1404
|
+
end
|
|
1405
|
+
|
|
1406
|
+
# @!method self.mongocrypt_setopt_append_crypt_shared_lib_search_path(crypt, path)
|
|
1407
|
+
# @api private
|
|
1408
|
+
#
|
|
1409
|
+
# Append an additional search directory to the search path for loading
|
|
1410
|
+
# the crypt_shared dynamic library.
|
|
1411
|
+
#
|
|
1412
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
1413
|
+
# @param [ String ] path A path to search for the crypt shared library. If the leading element of
|
|
1414
|
+
# the path is the literal string "$ORIGIN", that substring will be replaced
|
|
1415
|
+
# with the directory path containing the executable libmongocrypt module. If
|
|
1416
|
+
# the path string is literal "$SYSTEM", then libmongocrypt will defer to the
|
|
1417
|
+
# system's library resolution mechanism to find the crypt_shared library.
|
|
1418
|
+
attach_function(
|
|
1419
|
+
:mongocrypt_setopt_append_crypt_shared_lib_search_path,
|
|
1420
|
+
[
|
|
1421
|
+
:pointer,
|
|
1422
|
+
:string,
|
|
1423
|
+
],
|
|
1424
|
+
:void
|
|
1425
|
+
)
|
|
1426
|
+
|
|
1427
|
+
# Append an additional search directory to the search path for loading
|
|
1428
|
+
# the crypt_shared dynamic library.
|
|
1429
|
+
#
|
|
1430
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
1431
|
+
# @param [ String ] path A search path for the crypt shared library.
|
|
1432
|
+
def self.setopt_append_crypt_shared_lib_search_path(handle, path)
|
|
1433
|
+
check_status(handle) do
|
|
1434
|
+
mongocrypt_setopt_append_crypt_shared_lib_search_path(handle.ref, path)
|
|
1435
|
+
end
|
|
1436
|
+
end
|
|
1437
|
+
|
|
1438
|
+
# @!method self.mongocrypt_setopt_set_crypt_shared_lib_path_override(crypt, path)
|
|
1439
|
+
# @api private
|
|
1440
|
+
#
|
|
1441
|
+
# Set a single override path for loading the crypt shared library.
|
|
1442
|
+
#
|
|
1443
|
+
# @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
|
|
1444
|
+
# @param [ String ] path A path to crypt shared library file. If the leading element of
|
|
1445
|
+
# the path is the literal string "$ORIGIN", that substring will be replaced
|
|
1446
|
+
# with the directory path containing the executable libmongocrypt module.
|
|
1447
|
+
attach_function(
|
|
1448
|
+
:mongocrypt_setopt_set_crypt_shared_lib_path_override,
|
|
1449
|
+
[
|
|
1450
|
+
:pointer,
|
|
1451
|
+
:string,
|
|
1452
|
+
],
|
|
1453
|
+
:void
|
|
1454
|
+
)
|
|
1455
|
+
|
|
1456
|
+
# Set a single override path for loading the crypt shared library.
|
|
1457
|
+
#
|
|
1458
|
+
# @param [ Mongo::Crypt::Handle ] handle
|
|
1459
|
+
# @param [ String ] path A path to crypt shared library file.
|
|
1460
|
+
def self.setopt_set_crypt_shared_lib_path_override(handle, path)
|
|
1461
|
+
check_status(handle) do
|
|
1462
|
+
mongocrypt_setopt_set_crypt_shared_lib_path_override(handle.ref, path)
|
|
1463
|
+
end
|
|
1464
|
+
end
|
|
1465
|
+
|
|
1466
|
+
# MONGOCRYPT_EXPORT
|
|
1467
|
+
# uint64_t
|
|
1468
|
+
# mongocrypt_crypt_shared_lib_version (const mongocrypt_t *crypt);
|
|
1469
|
+
attach_function(
|
|
1470
|
+
:mongocrypt_crypt_shared_lib_version,
|
|
1471
|
+
[ :pointer ],
|
|
1472
|
+
:uint64
|
|
1473
|
+
)
|
|
1474
|
+
|
|
1475
|
+
def self.crypt_shared_lib_version(handle)
|
|
1476
|
+
mongocrypt_crypt_shared_lib_version(handle.ref)
|
|
1477
|
+
end
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
# @!method self.mongocrypt_ctx_setopt_query_type(ctx, mongocrypt_query_type)
|
|
1481
|
+
# @api private
|
|
1482
|
+
#
|
|
1483
|
+
# Set the query type to use for FLE 2 explicit encryption.
|
|
1484
|
+
# The query type is only used for indexed FLE 2 encryption.
|
|
1485
|
+
#
|
|
1486
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
1487
|
+
# @param [ String ] query_type Type of the query.
|
|
1488
|
+
# @param [ Integer ] len The length of the query type string.
|
|
1489
|
+
#
|
|
1490
|
+
# @return [ Boolean ] Whether setting this option succeeded.
|
|
1491
|
+
attach_function(
|
|
1492
|
+
:mongocrypt_ctx_setopt_query_type,
|
|
1493
|
+
[
|
|
1494
|
+
:pointer,
|
|
1495
|
+
:string,
|
|
1496
|
+
:int
|
|
1497
|
+
],
|
|
1498
|
+
:bool
|
|
1499
|
+
)
|
|
1500
|
+
|
|
1501
|
+
# Set the query type to use for FLE 2 explicit encryption.
|
|
1502
|
+
# The query type is only used for indexed FLE 2 encryption.
|
|
1503
|
+
#
|
|
1504
|
+
# @param [ Mongo::Crypt::Context ] context Explicit encryption context.
|
|
1505
|
+
# @param [ String ] :mongocrypt_query_type query_type Type of the query.
|
|
1506
|
+
#
|
|
1507
|
+
# @raise [ Mongo::Error::CryptError ] If the operation failed.
|
|
1508
|
+
def self.ctx_setopt_query_type(context, query_type)
|
|
1509
|
+
check_ctx_status(context) do
|
|
1510
|
+
mongocrypt_ctx_setopt_query_type(context.ctx_p, query_type, -1)
|
|
1511
|
+
end
|
|
1512
|
+
end
|
|
1513
|
+
|
|
1514
|
+
# @!method self.mongocrypt_ctx_setopt_contention_factor(ctx, contention_factor)
|
|
1515
|
+
# @api private
|
|
1516
|
+
#
|
|
1517
|
+
# Set the contention factor used for explicit encryption.
|
|
1518
|
+
# The contention factor is only used for indexed FLE 2 encryption.
|
|
1519
|
+
#
|
|
1520
|
+
# @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
|
|
1521
|
+
# @param [ int64 ] contention_factor
|
|
1522
|
+
#
|
|
1523
|
+
# @return [ Boolean ] Whether setting this option succeeded.
|
|
1524
|
+
attach_function(
|
|
1525
|
+
:mongocrypt_ctx_setopt_contention_factor,
|
|
1526
|
+
[
|
|
1527
|
+
:pointer,
|
|
1528
|
+
:int64
|
|
1529
|
+
],
|
|
1530
|
+
:bool
|
|
1531
|
+
)
|
|
1532
|
+
|
|
1533
|
+
# Set the contention factor used for explicit encryption.
|
|
1534
|
+
# The contention factor is only used for indexed FLE 2 encryption.
|
|
1535
|
+
#
|
|
1536
|
+
# @param [ Mongo::Crypt::Context ] context Explicit encryption context.
|
|
1537
|
+
# @param [ Integer ] factor Contention factor used for explicit encryption.
|
|
1538
|
+
#
|
|
1539
|
+
# @raise [ Mongo::Error::CryptError ] If the operation failed.
|
|
1540
|
+
def self.ctx_setopt_contention_factor(context, factor)
|
|
1541
|
+
check_ctx_status(context) do
|
|
1542
|
+
mongocrypt_ctx_setopt_contention_factor(context.ctx_p, factor)
|
|
1543
|
+
end
|
|
1544
|
+
end
|
|
1545
|
+
|
|
1546
|
+
# Raise a Mongo::Error::CryptError based on the status of the underlying
|
|
1547
|
+
# mongocrypt_t object.
|
|
1548
|
+
#
|
|
1549
|
+
# @return [ nil ] Always nil.
|
|
1550
|
+
def self.check_status(handle)
|
|
1551
|
+
unless yield
|
|
1552
|
+
status = Status.new
|
|
1553
|
+
|
|
1554
|
+
mongocrypt_status(handle.ref, status.ref)
|
|
1555
|
+
status.raise_crypt_error
|
|
1556
|
+
end
|
|
1557
|
+
end
|
|
1558
|
+
|
|
1559
|
+
# Raise a Mongo::Error::CryptError based on the status of the underlying
|
|
1560
|
+
# mongocrypt_ctx_t object.
|
|
1561
|
+
#
|
|
1562
|
+
# @return [ nil ] Always nil.
|
|
1563
|
+
def self.check_ctx_status(context)
|
|
1564
|
+
if block_given?
|
|
1565
|
+
do_raise = !yield
|
|
1566
|
+
else
|
|
1567
|
+
do_raise = true
|
|
1568
|
+
end
|
|
1569
|
+
|
|
1570
|
+
if do_raise
|
|
1571
|
+
status = Status.new
|
|
1572
|
+
|
|
1573
|
+
mongocrypt_ctx_status(context.ctx_p, status.ref)
|
|
1574
|
+
status.raise_crypt_error
|
|
1575
|
+
end
|
|
1576
|
+
end
|
|
1577
|
+
|
|
1578
|
+
# Checks that the specified data is a Hash before serializing
|
|
1579
|
+
# it to BSON to prevent errors from libmongocrypt
|
|
1580
|
+
#
|
|
1581
|
+
# @note All BSON::Document instances are also Hash instances
|
|
1582
|
+
#
|
|
1583
|
+
# @param [ Object ] data The data to be passed to libmongocrypt
|
|
1584
|
+
#
|
|
1585
|
+
# @raise [ Mongo::Error::CryptError ] If the data is not a Hash
|
|
1586
|
+
def self.validate_document(data)
|
|
1587
|
+
return if data.is_a?(Hash)
|
|
1588
|
+
|
|
1589
|
+
if data.nil?
|
|
1590
|
+
message = "Attempted to pass nil data to libmongocrypt. " +
|
|
1591
|
+
"Data must be a Hash"
|
|
1592
|
+
else
|
|
1593
|
+
message = "Attempted to pass invalid data to libmongocrypt: #{data} " +
|
|
1594
|
+
"Data must be a Hash"
|
|
1595
|
+
end
|
|
1596
|
+
|
|
1597
|
+
raise Error::CryptError.new(message)
|
|
1598
|
+
end
|
|
1599
|
+
end
|
|
1600
|
+
end
|
|
1601
|
+
end
|