mongo 2.11.4 → 2.12.3
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.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/README.md +2 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/address.rb +44 -19
- data/lib/mongo/auth.rb +1 -0
- data/lib/mongo/auth/credential_cache.rb +51 -0
- data/lib/mongo/auth/scram/conversation.rb +20 -16
- data/lib/mongo/auth/user.rb +0 -8
- data/lib/mongo/auth/user/view.rb +4 -4
- data/lib/mongo/background_thread.rb +1 -1
- data/lib/mongo/bulk_write.rb +5 -5
- data/lib/mongo/client.rb +143 -14
- data/lib/mongo/client_encryption.rb +103 -0
- data/lib/mongo/cluster.rb +8 -4
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
- data/lib/mongo/cluster/sdam_flow.rb +54 -58
- data/lib/mongo/collection.rb +3 -3
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +12 -3
- data/lib/mongo/collection/view/iterable.rb +14 -5
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +9 -7
- data/lib/mongo/collection/view/writable.rb +7 -7
- data/lib/mongo/crypt.rb +33 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +40 -0
- data/lib/mongo/crypt/auto_encrypter.rb +179 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
- data/lib/mongo/crypt/binary.rb +155 -0
- data/lib/mongo/crypt/binding.rb +1229 -0
- data/lib/mongo/crypt/context.rb +135 -0
- data/lib/mongo/crypt/data_key_context.rb +162 -0
- data/lib/mongo/crypt/encryption_io.rb +289 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
- data/lib/mongo/crypt/handle.rb +315 -0
- data/lib/mongo/crypt/hooks.rb +90 -0
- data/lib/mongo/crypt/kms_context.rb +67 -0
- data/lib/mongo/crypt/status.rb +131 -0
- data/lib/mongo/cursor.rb +64 -32
- data/lib/mongo/database.rb +23 -6
- data/lib/mongo/database/view.rb +13 -4
- data/lib/mongo/dbref.rb +9 -2
- data/lib/mongo/error.rb +5 -1
- data/lib/mongo/error/bulk_write_error.rb +16 -14
- data/lib/mongo/error/crypt_error.rb +31 -0
- data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
- data/lib/mongo/error/kms_error.rb +22 -0
- data/lib/mongo/error/max_bson_size.rb +14 -3
- data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
- data/lib/mongo/error/no_server_available.rb +8 -3
- data/lib/mongo/error/notable.rb +0 -15
- data/lib/mongo/error/operation_failure.rb +1 -0
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/grid/file.rb +5 -0
- data/lib/mongo/grid/file/chunk.rb +2 -0
- data/lib/mongo/grid/file/info.rb +3 -2
- data/lib/mongo/grid/fs_bucket.rb +15 -13
- data/lib/mongo/grid/stream/write.rb +9 -3
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
- data/lib/mongo/monitoring/event/command_started.rb +6 -1
- data/lib/mongo/operation/collections_info.rb +6 -3
- data/lib/mongo/operation/delete/op_msg.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -1
- data/lib/mongo/operation/get_more/op_msg.rb +4 -1
- data/lib/mongo/operation/insert/command.rb +3 -2
- data/lib/mongo/operation/insert/legacy.rb +3 -2
- data/lib/mongo/operation/insert/op_msg.rb +3 -3
- data/lib/mongo/operation/result.rb +36 -27
- data/lib/mongo/operation/shared/executable.rb +11 -9
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
- data/lib/mongo/operation/shared/read_preference_supported.rb +68 -19
- data/lib/mongo/operation/shared/response_handling.rb +1 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +44 -3
- data/lib/mongo/operation/shared/write.rb +17 -10
- data/lib/mongo/operation/update/op_msg.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +2 -1
- data/lib/mongo/protocol/compressed.rb +6 -5
- data/lib/mongo/protocol/insert.rb +3 -1
- data/lib/mongo/protocol/message.rb +94 -15
- data/lib/mongo/protocol/msg.rb +207 -37
- data/lib/mongo/protocol/query.rb +7 -9
- data/lib/mongo/protocol/serializers.rb +43 -15
- data/lib/mongo/retryable.rb +1 -1
- data/lib/mongo/server.rb +10 -4
- data/lib/mongo/server/connection.rb +20 -9
- data/lib/mongo/server/connection_base.rb +118 -18
- data/lib/mongo/server/connection_common.rb +61 -0
- data/lib/mongo/server/connection_pool.rb +37 -1
- data/lib/mongo/server/connection_pool/populator.rb +1 -1
- data/lib/mongo/server/description.rb +9 -11
- data/lib/mongo/server/monitor.rb +2 -0
- data/lib/mongo/server/monitor/connection.rb +3 -18
- data/lib/mongo/server/pending_connection.rb +2 -1
- data/lib/mongo/session.rb +3 -3
- data/lib/mongo/session/session_pool.rb +8 -3
- data/lib/mongo/socket.rb +29 -16
- data/lib/mongo/socket/ssl.rb +23 -8
- data/lib/mongo/socket/tcp.rb +12 -3
- data/lib/mongo/srv/monitor.rb +73 -42
- data/lib/mongo/srv/result.rb +0 -1
- data/lib/mongo/timeout.rb +49 -0
- data/lib/mongo/uri.rb +30 -1
- data/lib/mongo/uri/srv_protocol.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -3
- data/spec/README.md +228 -7
- data/spec/integration/auth_spec.rb +53 -0
- data/spec/integration/bulk_write_spec.rb +19 -0
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
- data/spec/integration/client_construction_spec.rb +100 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +353 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +303 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +72 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +79 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +221 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +601 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +187 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +78 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +63 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +233 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +165 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +141 -0
- data/spec/integration/client_side_encryption/views_spec.rb +44 -0
- data/spec/integration/client_update_spec.rb +154 -0
- data/spec/integration/command_monitoring_spec.rb +3 -1
- data/spec/integration/command_spec.rb +44 -10
- data/spec/integration/connection_spec.rb +57 -0
- data/spec/integration/crud_spec.rb +89 -0
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/read_preference_spec.rb +26 -0
- data/spec/integration/reconnect_spec.rb +7 -6
- data/spec/integration/size_limit_spec.rb +111 -0
- data/spec/integration/srv_monitoring_spec.rb +16 -8
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/kerberos/kerberos_spec.rb +87 -0
- data/spec/lite_spec_helper.rb +34 -29
- data/spec/mongo/auth/cr_spec.rb +8 -0
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
- data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
- data/spec/mongo/auth/scram_spec.rb +45 -35
- data/spec/mongo/auth/user/view_spec.rb +3 -6
- data/spec/mongo/auth/x509_spec.rb +5 -1
- data/spec/mongo/bulk_write/result_spec.rb +11 -7
- data/spec/mongo/client_construction_spec.rb +206 -2
- data/spec/mongo/client_encryption_spec.rb +405 -0
- data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
- data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
- data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
- data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_spec.rb +28 -9
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +187 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
- data/spec/mongo/crypt/binary_spec.rb +115 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
- data/spec/mongo/crypt/binding/context_spec.rb +257 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
- data/spec/mongo/crypt/binding/status_spec.rb +99 -0
- data/spec/mongo/crypt/binding/version_spec.rb +22 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
- data/spec/mongo/crypt/handle_spec.rb +232 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
- data/spec/mongo/crypt/status_spec.rb +152 -0
- data/spec/mongo/cursor_spec.rb +24 -4
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/error/bulk_write_error_spec.rb +49 -0
- data/spec/mongo/error/crypt_error_spec.rb +26 -0
- data/spec/mongo/error/max_bson_size_spec.rb +35 -0
- data/spec/mongo/error/no_server_available_spec.rb +11 -1
- data/spec/mongo/error/notable_spec.rb +59 -0
- data/spec/mongo/error/operation_failure_spec.rb +6 -6
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +3 -3
- data/spec/mongo/operation/create_index_spec.rb +3 -3
- data/spec/mongo/operation/create_user_spec.rb +3 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
- data/spec/mongo/operation/delete_spec.rb +7 -7
- data/spec/mongo/operation/drop_index_spec.rb +2 -2
- data/spec/mongo/operation/find/legacy_spec.rb +2 -1
- data/spec/mongo/operation/get_more_spec.rb +1 -1
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/insert_spec.rb +12 -12
- data/spec/mongo/operation/map_reduce_spec.rb +2 -2
- data/spec/mongo/operation/read_preference_legacy_spec.rb +351 -0
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +194 -0
- data/spec/mongo/operation/remove_user_spec.rb +3 -3
- data/spec/mongo/operation/update/bulk_spec.rb +6 -6
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
- data/spec/mongo/operation/update_spec.rb +7 -7
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/protocol/compressed_spec.rb +2 -3
- data/spec/mongo/protocol/delete_spec.rb +9 -8
- data/spec/mongo/protocol/get_more_spec.rb +9 -8
- data/spec/mongo/protocol/insert_spec.rb +9 -8
- data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
- data/spec/mongo/protocol/msg_spec.rb +57 -53
- data/spec/mongo/protocol/query_spec.rb +12 -12
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/protocol/update_spec.rb +10 -9
- data/spec/mongo/server/connection_pool_spec.rb +1 -1
- data/spec/mongo/server/connection_spec.rb +28 -7
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/srv/monitor_spec.rb +88 -69
- data/spec/mongo/timeout_spec.rb +85 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
- data/spec/mongo/uri_spec.rb +52 -5
- data/spec/mongo/write_concern_spec.rb +13 -1
- data/spec/{support → runners}/auth.rb +14 -1
- data/spec/{support → runners}/change_streams.rb +1 -1
- data/spec/{support → runners}/change_streams/operation.rb +0 -0
- data/spec/{support → runners}/cmap.rb +1 -1
- data/spec/{support → runners}/cmap/verifier.rb +0 -0
- data/spec/{support → runners}/command_monitoring.rb +0 -0
- data/spec/runners/connection_string.rb +358 -4
- data/spec/{support → runners}/crud.rb +9 -9
- data/spec/{support → runners}/crud/context.rb +0 -0
- data/spec/{support → runners}/crud/operation.rb +7 -3
- data/spec/{support → runners}/crud/outcome.rb +0 -0
- data/spec/{support → runners}/crud/requirement.rb +1 -1
- data/spec/{support → runners}/crud/spec.rb +12 -1
- data/spec/{support → runners}/crud/test.rb +0 -0
- data/spec/{support → runners}/crud/test_base.rb +0 -0
- data/spec/{support → runners}/crud/verifier.rb +10 -12
- data/spec/{support → runners}/gridfs.rb +0 -0
- data/spec/{support → runners}/sdam_monitoring.rb +0 -0
- data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
- data/spec/{support → runners}/server_selection.rb +0 -0
- data/spec/{support → runners}/server_selection_rtt.rb +0 -0
- data/spec/{support → runners}/transactions.rb +9 -11
- data/spec/{support → runners}/transactions/context.rb +0 -0
- data/spec/{support → runners}/transactions/operation.rb +0 -0
- data/spec/{support → runners}/transactions/spec.rb +0 -0
- data/spec/{support → runners}/transactions/test.rb +37 -5
- data/spec/spec_helper.rb +0 -5
- data/spec/spec_tests/auth_spec.rb +3 -3
- data/spec/spec_tests/client_side_encryption_spec.rb +8 -0
- data/spec/spec_tests/connection_string_spec.rb +1 -1
- data/spec/spec_tests/data/auth/connection-string.yml +13 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -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 +61 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
- data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
- 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/{secondary_wrong_set_name_with_primary_second.yml → ruby_secondary_wrong_set_name_with_primary_second.yml} +0 -0
- data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
- 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/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_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_removal.yml +20 -16
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
- data/spec/spec_tests/uri_options_spec.rb +6 -8
- data/spec/stress/connection_pool_timing_spec.rb +6 -3
- data/spec/support/certificates/README.md +4 -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 +19 -3
- data/spec/support/cluster_config.rb +9 -1
- data/spec/support/cluster_tools.rb +6 -1
- data/spec/support/common_shortcuts.rb +12 -0
- data/spec/support/constraints.rb +16 -0
- data/spec/support/crypt.rb +154 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
- data/spec/support/crypt/corpus/corpus.json +3657 -0
- data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -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/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_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/lite_constraints.rb +19 -1
- data/spec/support/matchers.rb +19 -0
- data/spec/support/shared/protocol.rb +2 -0
- data/spec/support/spec_config.rb +53 -13
- data/spec/support/utils.rb +140 -10
- metadata +894 -687
- metadata.gz.sig +0 -0
- data/lib/mongo/cluster/srv_monitor.rb +0 -127
- data/lib/mongo/srv/warning_result.rb +0 -35
- data/spec/enterprise_auth/kerberos_spec.rb +0 -58
- data/spec/mongo/cluster/srv_monitor_spec.rb +0 -214
- data/spec/mongo/operation/read_preference_spec.rb +0 -245
- data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
- data/spec/support/connection_string.rb +0 -354
@@ -0,0 +1,303 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Auto Encryption' do
|
4
|
+
require_libmongocrypt
|
5
|
+
require_enterprise
|
6
|
+
min_server_fcv '4.2'
|
7
|
+
|
8
|
+
# Diagnostics of leaked background threads only, these tests do not
|
9
|
+
# actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
|
10
|
+
clean_slate
|
11
|
+
|
12
|
+
include_context 'define shared FLE helpers'
|
13
|
+
include_context 'with local kms_providers'
|
14
|
+
|
15
|
+
let(:subscriber) { EventSubscriber.new }
|
16
|
+
let(:db_name) { 'auto_encryption' }
|
17
|
+
|
18
|
+
let(:encryption_client) do
|
19
|
+
new_local_client(
|
20
|
+
SpecConfig.instance.addresses,
|
21
|
+
SpecConfig.instance.test_options.merge(
|
22
|
+
auto_encryption_options: {
|
23
|
+
kms_providers: kms_providers,
|
24
|
+
key_vault_namespace: key_vault_namespace,
|
25
|
+
schema_map: { "auto_encryption.users" => schema_map },
|
26
|
+
# Spawn mongocryptd on non-default port for sharded cluster tests
|
27
|
+
extra_options: extra_options,
|
28
|
+
},
|
29
|
+
database: db_name
|
30
|
+
),
|
31
|
+
).tap do |client|
|
32
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
before(:each) do
|
37
|
+
key_vault_collection.drop
|
38
|
+
key_vault_collection.insert_one(data_key)
|
39
|
+
|
40
|
+
encryption_client['users'].drop
|
41
|
+
result = encryption_client['users'].insert_one(ssn: ssn, age: 23)
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:started_event) do
|
45
|
+
subscriber.started_events.find do |event|
|
46
|
+
event.command_name == command_name && event.database_name == db_name
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
let(:succeeded_event) do
|
51
|
+
subscriber.succeeded_events.find do |event|
|
52
|
+
event.command_name == command_name && event.database_name == db_name
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
let(:key_vault_list_collections_event) do
|
57
|
+
subscriber.started_events.find do |event|
|
58
|
+
event.command_name == 'listCollections' && event.database_name == key_vault_db
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
shared_examples 'it has an encrypted key_vault_client' do
|
63
|
+
it 'registers a listCollections event on the key vault client' do
|
64
|
+
expect(key_vault_list_collections_event).not_to be_nil
|
65
|
+
expect(key_vault_list_collections_event.command['$db']).to eq(key_vault_db)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#aggregate' do
|
70
|
+
let(:command_name) { 'aggregate' }
|
71
|
+
|
72
|
+
before do
|
73
|
+
encryption_client['users'].aggregate([{ '$match' => { 'ssn' => ssn } }]).first
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'has encrypted data in command monitoring' do
|
77
|
+
# Command started event occurs after ssn is encrypted
|
78
|
+
expect(
|
79
|
+
started_event.command["pipeline"].first["$match"]["ssn"]["$eq"]
|
80
|
+
).to be_ciphertext
|
81
|
+
|
82
|
+
# Command succeeded event occurs before ssn is decrypted
|
83
|
+
expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
|
84
|
+
end
|
85
|
+
|
86
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#count' do
|
90
|
+
let(:command_name) { 'count' }
|
91
|
+
|
92
|
+
before do
|
93
|
+
encryption_client['users'].count(ssn: ssn)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'has encrypted data in command monitoring' do
|
97
|
+
# Command started event occurs after ssn is encrypted
|
98
|
+
# Command succeeded event does not contain any data to be decrypted
|
99
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
100
|
+
end
|
101
|
+
|
102
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#distinct' do
|
106
|
+
let(:command_name) { 'distinct' }
|
107
|
+
|
108
|
+
before do
|
109
|
+
encryption_client['users'].distinct(:ssn)
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'has encrypted data in command monitoring' do
|
113
|
+
# Command started event does not contain any data to be encrypted
|
114
|
+
# Command succeeded event occurs before ssn is decrypted
|
115
|
+
expect(succeeded_event.reply["values"].first).to be_ciphertext
|
116
|
+
end
|
117
|
+
|
118
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#delete_one' do
|
122
|
+
let(:command_name) { 'delete' }
|
123
|
+
|
124
|
+
before do
|
125
|
+
encryption_client['users'].delete_one(ssn: ssn)
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'has encrypted data in command monitoring' do
|
129
|
+
# Command started event occurs after ssn is encrypted
|
130
|
+
# Command succeeded event does not contain any data to be decrypted
|
131
|
+
expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
132
|
+
end
|
133
|
+
|
134
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
135
|
+
end
|
136
|
+
|
137
|
+
describe '#delete_many' do
|
138
|
+
let(:command_name) { 'delete' }
|
139
|
+
|
140
|
+
before do
|
141
|
+
encryption_client['users'].delete_many(ssn: ssn)
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'has encrypted data in command monitoring' do
|
145
|
+
# Command started event occurs after ssn is encrypted
|
146
|
+
# Command succeeded event does not contain any data to be decrypted
|
147
|
+
expect(started_event.command["deletes"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
148
|
+
end
|
149
|
+
|
150
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
151
|
+
end
|
152
|
+
|
153
|
+
describe '#find' do
|
154
|
+
let(:command_name) { 'find' }
|
155
|
+
|
156
|
+
before do
|
157
|
+
encryption_client['users'].find(ssn: ssn).first
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'has encrypted data in command monitoring' do
|
161
|
+
# Command started event occurs after ssn is encrypted
|
162
|
+
expect(started_event.command["filter"]["ssn"]["$eq"]).to be_ciphertext
|
163
|
+
|
164
|
+
# Command succeeded event occurs before ssn is decrypted
|
165
|
+
expect(succeeded_event.reply["cursor"]["firstBatch"].first["ssn"]).to be_ciphertext
|
166
|
+
end
|
167
|
+
|
168
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
169
|
+
end
|
170
|
+
|
171
|
+
describe '#find_one_and_delete' do
|
172
|
+
let(:command_name) { 'findAndModify' }
|
173
|
+
|
174
|
+
before do
|
175
|
+
encryption_client['users'].find_one_and_delete(ssn: ssn)
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'has encrypted data in command monitoring' do
|
179
|
+
# Command started event occurs after ssn is encrypted
|
180
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
181
|
+
|
182
|
+
# Command succeeded event occurs before ssn is decrypted
|
183
|
+
expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
|
184
|
+
end
|
185
|
+
|
186
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
187
|
+
end
|
188
|
+
|
189
|
+
describe '#find_one_and_replace' do
|
190
|
+
let(:command_name) { 'findAndModify' }
|
191
|
+
|
192
|
+
before do
|
193
|
+
encryption_client['users'].find_one_and_replace(
|
194
|
+
{ ssn: ssn },
|
195
|
+
{ ssn: '555-555-5555' }
|
196
|
+
)
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'has encrypted data in command monitoring' do
|
200
|
+
# Command started event occurs after ssn is encrypted
|
201
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
202
|
+
expect(started_event.command["update"]["ssn"]).to be_ciphertext
|
203
|
+
|
204
|
+
# Command succeeded event occurs before ssn is decrypted
|
205
|
+
expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
|
206
|
+
end
|
207
|
+
|
208
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
209
|
+
end
|
210
|
+
|
211
|
+
describe '#find_one_and_update' do
|
212
|
+
let(:command_name) { 'findAndModify' }
|
213
|
+
|
214
|
+
before do
|
215
|
+
encryption_client['users'].find_one_and_update(
|
216
|
+
{ ssn: ssn },
|
217
|
+
{ ssn: '555-555-5555' }
|
218
|
+
)
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'has encrypted data in command monitoring' do
|
222
|
+
|
223
|
+
# Command started event occurs after ssn is encrypted
|
224
|
+
expect(started_event.command["query"]["ssn"]["$eq"]).to be_ciphertext
|
225
|
+
expect(started_event.command["update"]["ssn"]).to be_ciphertext
|
226
|
+
|
227
|
+
# Command succeeded event occurs before ssn is decrypted
|
228
|
+
expect(succeeded_event.reply["value"]["ssn"]).to be_ciphertext
|
229
|
+
end
|
230
|
+
|
231
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
232
|
+
end
|
233
|
+
|
234
|
+
describe '#insert_one' do
|
235
|
+
let(:command_name) { 'insert' }
|
236
|
+
|
237
|
+
before do
|
238
|
+
encryption_client['users'].insert_one(ssn: ssn)
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'has encrypted data in command monitoring' do
|
242
|
+
# Command started event occurs after ssn is encrypted
|
243
|
+
# Command succeeded event does not contain any data to be decrypted
|
244
|
+
expect(started_event.command["documents"].first["ssn"]).to be_ciphertext
|
245
|
+
end
|
246
|
+
|
247
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
248
|
+
end
|
249
|
+
|
250
|
+
describe '#replace_one' do
|
251
|
+
let(:command_name) { 'update' }
|
252
|
+
|
253
|
+
before do
|
254
|
+
encryption_client['users'].replace_one(
|
255
|
+
{ ssn: ssn },
|
256
|
+
{ ssn: '555-555-5555' }
|
257
|
+
)
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'has encrypted data in command monitoring' do
|
261
|
+
# Command started event occurs after ssn is encrypted
|
262
|
+
# Command succeeded event does not contain any data to be decrypted
|
263
|
+
expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
264
|
+
expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
|
265
|
+
end
|
266
|
+
|
267
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
268
|
+
end
|
269
|
+
|
270
|
+
describe '#update_one' do
|
271
|
+
let(:command_name) { 'update' }
|
272
|
+
|
273
|
+
before do
|
274
|
+
encryption_client['users'].update_one({ ssn: ssn }, { ssn: '555-555-5555' })
|
275
|
+
end
|
276
|
+
|
277
|
+
it 'has encrypted data in command monitoring' do
|
278
|
+
# Command started event occurs after ssn is encrypted
|
279
|
+
# Command succeeded event does not contain any data to be decrypted
|
280
|
+
expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
281
|
+
expect(started_event.command["updates"].first["u"]["ssn"]).to be_ciphertext
|
282
|
+
end
|
283
|
+
|
284
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
285
|
+
end
|
286
|
+
|
287
|
+
describe '#update_many' do
|
288
|
+
let(:command_name) { 'update' }
|
289
|
+
|
290
|
+
before do
|
291
|
+
# update_many does not support replacement-style updates
|
292
|
+
encryption_client['users'].update_many({ ssn: ssn }, { "$inc" => { :age => 1 } })
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'has encrypted data in command monitoring' do
|
296
|
+
# Command started event occurs after ssn is encrypted
|
297
|
+
# Command succeeded event does not contain any data to be decrypted
|
298
|
+
expect(started_event.command["updates"].first["q"]["ssn"]["$eq"]).to be_ciphertext
|
299
|
+
end
|
300
|
+
|
301
|
+
it_behaves_like 'it has an encrypted key_vault_client'
|
302
|
+
end
|
303
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Auto Encryption' do
|
4
|
+
require_libmongocrypt
|
5
|
+
min_server_fcv '4.2'
|
6
|
+
require_enterprise
|
7
|
+
|
8
|
+
include_context 'define shared FLE helpers'
|
9
|
+
include_context 'with local kms_providers'
|
10
|
+
|
11
|
+
context 'with an invalid mongocryptd spawn path' do
|
12
|
+
let(:client) do
|
13
|
+
new_local_client(
|
14
|
+
SpecConfig.instance.addresses,
|
15
|
+
SpecConfig.instance.test_options.merge(
|
16
|
+
auto_encryption_options: {
|
17
|
+
kms_providers: kms_providers,
|
18
|
+
key_vault_namespace: key_vault_namespace,
|
19
|
+
schema_map: { 'auto_encryption.users' => schema_map },
|
20
|
+
extra_options: {
|
21
|
+
mongocryptd_spawn_path: 'echo hello world',
|
22
|
+
mongocryptd_spawn_args: []
|
23
|
+
}
|
24
|
+
},
|
25
|
+
database: 'auto_encryption'
|
26
|
+
),
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:server_selector) { double("ServerSelector") }
|
31
|
+
let(:cluster) { double("Cluster") }
|
32
|
+
|
33
|
+
before do
|
34
|
+
key_vault_collection.drop
|
35
|
+
key_vault_collection.insert_one(data_key)
|
36
|
+
|
37
|
+
allow(server_selector).to receive(:name)
|
38
|
+
allow(server_selector).to receive(:server_selection_timeout)
|
39
|
+
allow(server_selector).to receive(:local_threshold)
|
40
|
+
allow(cluster).to receive(:summary)
|
41
|
+
|
42
|
+
# Raise a server selection error on intent-to-encrypt commands to mock
|
43
|
+
# what would happen if mongocryptd hadn't already been spawned. It is
|
44
|
+
# necessary to mock this behavior because it is likely that another test
|
45
|
+
# will have already spawned mongocryptd, causing this test to fail.
|
46
|
+
allow_any_instance_of(Mongo::Database)
|
47
|
+
.to receive(:command)
|
48
|
+
.with(
|
49
|
+
hash_including(
|
50
|
+
'insert' => 'users',
|
51
|
+
'$db' => 'auto_encryption',
|
52
|
+
'ordered' => true,
|
53
|
+
'lsid' => kind_of(Hash),
|
54
|
+
'documents' => kind_of(Array),
|
55
|
+
'jsonSchema' => kind_of(Hash),
|
56
|
+
'isRemoteSchema' => false,
|
57
|
+
),
|
58
|
+
{ execution_options: { deserialize_as_bson: true } },
|
59
|
+
)
|
60
|
+
.and_raise(Mongo::Error::NoServerAvailable.new(server_selector, cluster))
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'raises an exception when trying to perform auto encryption' do
|
64
|
+
expect do
|
65
|
+
client['users'].insert_one(ssn: ssn)
|
66
|
+
end.to raise_error(
|
67
|
+
Mongo::Error::MongocryptdSpawnError,
|
68
|
+
/Failed to spawn mongocryptd at the path "echo hello world" with arguments/
|
69
|
+
)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Auto Encryption' do
|
4
|
+
require_libmongocrypt
|
5
|
+
max_server_version '4.0'
|
6
|
+
|
7
|
+
# Diagnostics of leaked background threads only, these tests do not
|
8
|
+
# actually require a clean slate. https://jira.mongodb.org/browse/RUBY-2138
|
9
|
+
clean_slate
|
10
|
+
|
11
|
+
include_context 'define shared FLE helpers'
|
12
|
+
|
13
|
+
let(:encryption_client) do
|
14
|
+
new_local_client(
|
15
|
+
SpecConfig.instance.addresses,
|
16
|
+
SpecConfig.instance.test_options.merge(
|
17
|
+
auto_encryption_options: {
|
18
|
+
kms_providers: kms_providers,
|
19
|
+
key_vault_namespace: key_vault_namespace,
|
20
|
+
# Must use local schema map because server versions older than 4.2
|
21
|
+
# do not support jsonSchema collection validator.
|
22
|
+
schema_map: { 'auto_encryption.users' => schema_map },
|
23
|
+
bypass_auto_encryption: bypass_auto_encryption,
|
24
|
+
# Spawn mongocryptd on non-default port for sharded cluster tests
|
25
|
+
extra_options: extra_options,
|
26
|
+
},
|
27
|
+
database: 'auto_encryption'
|
28
|
+
),
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:bypass_auto_encryption) { false }
|
33
|
+
let(:client) { authorized_client.use('auto_encryption') }
|
34
|
+
|
35
|
+
let(:encrypted_ssn_binary) do
|
36
|
+
BSON::Binary.new(Base64.decode64(encrypted_ssn), :ciphertext)
|
37
|
+
end
|
38
|
+
|
39
|
+
shared_examples 'it decrypts but does not encrypt on wire version < 8' do
|
40
|
+
before do
|
41
|
+
client['users'].drop
|
42
|
+
client['users'].insert_one(ssn: encrypted_ssn_binary)
|
43
|
+
|
44
|
+
key_vault_collection.drop
|
45
|
+
key_vault_collection.insert_one(data_key)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'raises an exception when trying to encrypt' do
|
49
|
+
expect do
|
50
|
+
encryption_client['users'].find(ssn: ssn).first
|
51
|
+
end.to raise_error(Mongo::Error::CryptError, /Auto-encryption requires a minimum MongoDB version of 4.2/)
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'with bypass_auto_encryption=true' do
|
55
|
+
let(:bypass_auto_encryption) { true }
|
56
|
+
|
57
|
+
it 'does not raise an exception but doesn\'t encrypt' do
|
58
|
+
document = encryption_client['users'].find(ssn: ssn).first
|
59
|
+
expect(document).to be_nil
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'still decrypts' do
|
63
|
+
document = encryption_client['users'].find(ssn: encrypted_ssn_binary).first
|
64
|
+
# ssn field is still decrypted
|
65
|
+
expect(document['ssn']).to eq(ssn)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'with AWS kms provider' do
|
71
|
+
include_context 'with AWS kms_providers'
|
72
|
+
it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'with local kms provider' do
|
76
|
+
include_context 'with local kms_providers'
|
77
|
+
it_behaves_like 'it decrypts but does not encrypt on wire version < 8'
|
78
|
+
end
|
79
|
+
end
|