mongo 2.11.6 → 2.12.0.rc0
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 +2 -2
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/mongo.rb +3 -0
- data/lib/mongo/address.rb +13 -2
- 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 +126 -11
- data/lib/mongo/client_encryption.rb +103 -0
- data/lib/mongo/cluster.rb +2 -2
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
- data/lib/mongo/cluster/sdam_flow.rb +54 -58
- data/lib/mongo/cluster/srv_monitor.rb +1 -1
- 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 +7 -9
- data/lib/mongo/collection/view/writable.rb +7 -7
- data/lib/mongo/crypt.rb +33 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
- data/lib/mongo/crypt/auto_encrypter.rb +169 -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 +1162 -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 +283 -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 +293 -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 +13 -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/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/operation_failure.rb +1 -0
- data/lib/mongo/grid/file.rb +0 -5
- data/lib/mongo/grid/file/chunk.rb +0 -2
- data/lib/mongo/grid/file/info.rb +2 -1
- data/lib/mongo/grid/fs_bucket.rb +13 -15
- data/lib/mongo/grid/stream/write.rb +3 -9
- data/lib/mongo/index/view.rb +3 -3
- 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 +2 -2
- data/lib/mongo/operation/insert/legacy.rb +2 -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 +10 -8
- 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/write.rb +17 -10
- data/lib/mongo/operation/update/op_msg.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +6 -5
- data/lib/mongo/protocol/insert.rb +3 -1
- data/lib/mongo/protocol/message.rb +72 -8
- data/lib/mongo/protocol/msg.rb +191 -37
- data/lib/mongo/protocol/query.rb +7 -9
- data/lib/mongo/protocol/serializers.rb +6 -2
- data/lib/mongo/server.rb +10 -4
- data/lib/mongo/server/connection.rb +20 -9
- data/lib/mongo/server/connection_base.rb +81 -12
- data/lib/mongo/server/connection_common.rb +61 -0
- data/lib/mongo/server/connection_pool.rb +37 -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 +2 -2
- 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/timeout.rb +49 -0
- data/lib/mongo/uri.rb +30 -1
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/README.md +134 -7
- data/spec/integration/auth_spec.rb +53 -0
- data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
- data/spec/integration/client_construction_spec.rb +76 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
- data/spec/integration/client_side_encryption/views_spec.rb +42 -0
- data/spec/integration/client_update_spec.rb +120 -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/reconnect_spec.rb +7 -6
- data/spec/integration/size_limit_spec.rb +94 -0
- data/spec/integration/srv_monitoring_spec.rb +14 -6
- data/spec/lite_spec_helper.rb +31 -22
- 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/x509_spec.rb +5 -1
- data/spec/mongo/client_construction_spec.rb +206 -3
- data/spec/mongo/client_encryption_spec.rb +408 -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 +4 -33
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -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 +198 -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/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/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 +1 -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/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/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 +4 -4
- 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 +13 -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 +85 -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 +61 -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 +168 -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/common_shortcuts.rb +12 -0
- data/spec/support/constraints.rb +16 -0
- data/spec/support/crypt.rb +140 -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 +17 -1
- data/spec/support/matchers.rb +19 -0
- data/spec/support/shared/protocol.rb +2 -0
- data/spec/support/spec_config.rb +43 -13
- data/spec/support/utils.rb +132 -10
- metadata +277 -81
- metadata.gz.sig +0 -0
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/zlib_compression_spec.rb +0 -25
- data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
- data/spec/support/connection_string.rb +0 -354
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Client-Side Encryption' do
|
4
|
+
describe 'Prose tests: Data key and double encryption' do
|
5
|
+
require_libmongocrypt
|
6
|
+
require_enterprise
|
7
|
+
min_server_fcv '4.2'
|
8
|
+
|
9
|
+
include_context 'define shared FLE helpers'
|
10
|
+
|
11
|
+
let(:client) do
|
12
|
+
new_local_client(
|
13
|
+
SpecConfig.instance.addresses,
|
14
|
+
SpecConfig.instance.test_options
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:client_encrypted) do
|
19
|
+
new_local_client(
|
20
|
+
SpecConfig.instance.addresses,
|
21
|
+
SpecConfig.instance.test_options.merge(
|
22
|
+
auto_encryption_options: {
|
23
|
+
kms_providers: local_kms_providers,
|
24
|
+
key_vault_namespace: 'admin.datakeys',
|
25
|
+
},
|
26
|
+
database: :db,
|
27
|
+
)
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
before do
|
32
|
+
client.use(:db)[:view].drop
|
33
|
+
client.use(:db).database.command(create: "view", viewOn: "coll")
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'does not perform encryption on views' do
|
37
|
+
expect do
|
38
|
+
client_encrypted[:view].insert_one({})
|
39
|
+
end.to raise_error(Mongo::Error::CryptError, /cannot auto encrypt a view/)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mongo::Client do
|
4
|
+
clean_slate
|
5
|
+
|
6
|
+
context 'auto encryption options' do
|
7
|
+
require_libmongocrypt
|
8
|
+
min_server_fcv '4.2'
|
9
|
+
require_enterprise
|
10
|
+
|
11
|
+
include_context 'define shared FLE helpers'
|
12
|
+
include_context 'with local kms_providers'
|
13
|
+
|
14
|
+
before do
|
15
|
+
authorized_client.use(:admin)[:datakeys].drop
|
16
|
+
authorized_client.use(:admin)[:datakeys].insert_one(data_key)
|
17
|
+
authorized_client.use(:auto_encryption)[:users].drop
|
18
|
+
authorized_client.use(:auto_encryption)[:users,
|
19
|
+
{
|
20
|
+
'validator' => { '$jsonSchema' => schema_map }
|
21
|
+
}
|
22
|
+
].create
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#with' do
|
26
|
+
let(:old_client) do
|
27
|
+
new_local_client(
|
28
|
+
SpecConfig.instance.addresses,
|
29
|
+
SpecConfig.instance.test_options.merge(
|
30
|
+
auto_encryption_options: {
|
31
|
+
kms_providers: kms_providers,
|
32
|
+
key_vault_namespace: key_vault_namespace,
|
33
|
+
},
|
34
|
+
database: :auto_encryption
|
35
|
+
),
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
let!(:new_client) do
|
40
|
+
old_client.with(auto_encryption_options: new_auto_encryption_options)
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with new auto_encryption_options' do
|
44
|
+
let(:new_auto_encryption_options) do
|
45
|
+
{
|
46
|
+
kms_providers: kms_providers,
|
47
|
+
key_vault_namespace: key_vault_namespace,
|
48
|
+
schema_map: { 'auto_encryption.users' => schema_map },
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'creates a new client' do
|
53
|
+
expect(new_client).not_to eq(old_client)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'maintains the old client\'s auto encryption options' do
|
57
|
+
expect(old_client.encrypter.options[:schema_map]).to be_nil
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'updates the client\'s auto encryption options' do
|
61
|
+
expect(new_client.encrypter.options[:schema_map]).to eq('auto_encryption.users' => schema_map)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'shares a cluster with the old client' do
|
65
|
+
expect(old_client.cluster).to eq(new_client.cluster)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'allows the original client to keep encrypting' do
|
69
|
+
old_client[:users].insert_one(ssn: ssn)
|
70
|
+
document = authorized_client.use(:auto_encryption)[:users].find.first
|
71
|
+
expect(document['ssn']).to be_ciphertext
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'allows the new client to keep encrypting' do
|
75
|
+
old_client[:users].insert_one(ssn: ssn)
|
76
|
+
document = authorized_client.use(:auto_encryption)[:users].find.first
|
77
|
+
expect(document['ssn']).to be_ciphertext
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with nil auto_encryption_options' do
|
82
|
+
let(:new_auto_encryption_options) { nil }
|
83
|
+
|
84
|
+
it 'removes auto encryption options' do
|
85
|
+
expect(new_client.encrypter).to be_nil
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'allows original client to keep encrypting' do
|
89
|
+
old_client[:users].insert_one(ssn: ssn)
|
90
|
+
document = authorized_client.use(:auto_encryption)[:users].find.first
|
91
|
+
expect(document['ssn']).to be_ciphertext
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#use' do
|
97
|
+
let(:old_client) do
|
98
|
+
new_local_client(
|
99
|
+
SpecConfig.instance.addresses,
|
100
|
+
SpecConfig.instance.test_options.merge(
|
101
|
+
auto_encryption_options: {
|
102
|
+
kms_providers: kms_providers,
|
103
|
+
key_vault_namespace: key_vault_namespace,
|
104
|
+
}
|
105
|
+
)
|
106
|
+
)
|
107
|
+
end
|
108
|
+
|
109
|
+
let(:new_client) do
|
110
|
+
old_client.use(:auto_encryption)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'creates a new client with encryption enabled' do
|
114
|
+
new_client[:users].insert_one(ssn: ssn)
|
115
|
+
document = authorized_client.use(:auto_encryption)[:users].find.first
|
116
|
+
expect(document['ssn']).to be_ciphertext
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -21,6 +21,7 @@ describe 'Command monitoring' do
|
|
21
21
|
started_event = started_events.first
|
22
22
|
expect(started_event.command_name).to eql('ismaster')
|
23
23
|
expect(started_event.address).to be_a(Mongo::Address)
|
24
|
+
expect(started_event.command).to have_key('$db')
|
24
25
|
|
25
26
|
succeeded_events = subscriber.succeeded_events.select do |event|
|
26
27
|
event.command_name == 'ismaster'
|
@@ -30,6 +31,7 @@ describe 'Command monitoring' do
|
|
30
31
|
expect(succeeded_event.command_name).to eql('ismaster')
|
31
32
|
expect(succeeded_event.reply).to be_a(BSON::Document)
|
32
33
|
expect(succeeded_event.reply['ismaster']).to eql(true)
|
34
|
+
expect(succeeded_event.reply['ok']).to eq(1)
|
33
35
|
expect(succeeded_event.address).to be_a(Mongo::Address)
|
34
36
|
expect(succeeded_event.duration).to be_a(Float)
|
35
37
|
|
@@ -109,7 +111,7 @@ describe 'Command monitoring' do
|
|
109
111
|
|
110
112
|
subscriber.clear_events!
|
111
113
|
expect do
|
112
|
-
command.execute(server)
|
114
|
+
command.execute(server, client: nil)
|
113
115
|
end.to raise_error(Mongo::Error::OperationFailure, /Not enough data-bearing nodes \(100\)/)
|
114
116
|
|
115
117
|
expect(subscriber.started_events.length).to eq(1)
|
@@ -47,7 +47,10 @@ describe 'Command' do
|
|
47
47
|
|
48
48
|
let(:expected_payload) do
|
49
49
|
{
|
50
|
-
'command' => {
|
50
|
+
'command' => {
|
51
|
+
'commitTransaction' => 1,
|
52
|
+
'$db' => 'admin',
|
53
|
+
},
|
51
54
|
'command_name' => 'commitTransaction',
|
52
55
|
'database_name' => 'admin',
|
53
56
|
'request_id' => 42,
|
@@ -75,6 +78,7 @@ describe 'Command' do
|
|
75
78
|
'commitTransaction' => 1,
|
76
79
|
'lsid' => session.session_id,
|
77
80
|
'txnNumber' => BSON::Int64.new(123),
|
81
|
+
'$db' => 'admin',
|
78
82
|
},
|
79
83
|
'command_name' => 'commitTransaction',
|
80
84
|
'database_name' => 'admin',
|
@@ -93,6 +97,7 @@ describe 'Command' do
|
|
93
97
|
let(:expected_payload) do
|
94
98
|
{
|
95
99
|
'command' => {
|
100
|
+
'$db' => 'admin',
|
96
101
|
'commitTransaction' => 1,
|
97
102
|
'writeConcern' => {'w' => 'majority'},
|
98
103
|
},
|
@@ -121,17 +126,46 @@ describe 'Command' do
|
|
121
126
|
)
|
122
127
|
end
|
123
128
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
129
|
+
context 'OP_MSG-capable servers' do
|
130
|
+
min_server_fcv '3.6'
|
131
|
+
|
132
|
+
let(:expected_payload) do
|
133
|
+
{
|
134
|
+
'command' => {
|
135
|
+
'$db' => 'foo',
|
136
|
+
'find' => 'collection_name',
|
137
|
+
},
|
138
|
+
'command_name' => 'find',
|
139
|
+
'database_name' => 'foo',
|
140
|
+
'request_id' => 42,
|
141
|
+
}
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'returns expected payload' do
|
145
|
+
expect(payload).to eq(expected_payload)
|
146
|
+
end
|
131
147
|
end
|
132
148
|
|
133
|
-
|
134
|
-
|
149
|
+
# Servers using legacy wire protocol message do not have $db in payload.
|
150
|
+
# $db is added to the payload later when the command monitoring event is
|
151
|
+
# published.
|
152
|
+
context 'pre-OP_MSG servers' do
|
153
|
+
max_server_version '3.4'
|
154
|
+
|
155
|
+
let(:expected_payload) do
|
156
|
+
{
|
157
|
+
'command' => {
|
158
|
+
'find' => 'collection_name',
|
159
|
+
},
|
160
|
+
'command_name' => 'find',
|
161
|
+
'database_name' => 'foo',
|
162
|
+
'request_id' => 42,
|
163
|
+
}
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'returns expected payload' do
|
167
|
+
expect(payload).to eq(expected_payload)
|
168
|
+
end
|
135
169
|
end
|
136
170
|
end
|
137
171
|
|
@@ -168,6 +168,63 @@ describe 'Connections' do
|
|
168
168
|
it_behaves_like 'is 1 per connection'
|
169
169
|
end
|
170
170
|
end
|
171
|
+
|
172
|
+
context 'when socket connection fails' do
|
173
|
+
|
174
|
+
before do
|
175
|
+
server
|
176
|
+
end
|
177
|
+
|
178
|
+
let(:socket_cls) { ::Socket }
|
179
|
+
|
180
|
+
let(:socket) do
|
181
|
+
double('socket').tap do |socket|
|
182
|
+
allow(socket).to receive(:setsockopt)
|
183
|
+
allow(socket).to receive(:set_encoding)
|
184
|
+
allow(socket).to receive(:getsockopt)
|
185
|
+
expect(socket).to receive(:connect).and_raise(IOError, 'test error')
|
186
|
+
|
187
|
+
# This test is testing for the close call:
|
188
|
+
expect(socket).to receive(:close)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
it 'closes the socket' do
|
193
|
+
RSpec::Mocks.with_temporary_scope do
|
194
|
+
expect(::Socket).to receive(:new).with(
|
195
|
+
Socket::AF_INET, Socket::SOCK_STREAM, 0).and_return(socket)
|
196
|
+
|
197
|
+
lambda do
|
198
|
+
connection.connect!
|
199
|
+
end.should raise_error(Mongo::Error::SocketError, /test error/)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'with tls' do
|
204
|
+
require_tls
|
205
|
+
|
206
|
+
let(:socket) do
|
207
|
+
double('socket').tap do |socket|
|
208
|
+
allow(socket).to receive(:hostname=)
|
209
|
+
allow(socket).to receive(:sync_close=)
|
210
|
+
expect(socket).to receive(:connect).and_raise(IOError, 'test error')
|
211
|
+
|
212
|
+
# This test is testing for the close call:
|
213
|
+
expect(socket).to receive(:close)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'closes the SSL socket' do
|
218
|
+
RSpec::Mocks.with_temporary_scope do
|
219
|
+
expect(OpenSSL::SSL::SSLSocket).to receive(:new).and_return(socket)
|
220
|
+
|
221
|
+
lambda do
|
222
|
+
connection.connect!
|
223
|
+
end.should raise_error(Mongo::Error::SocketError, /test error/)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
171
228
|
end
|
172
229
|
|
173
230
|
describe 'wire protocol version range update' do
|
@@ -54,9 +54,7 @@ describe 'Client after reconnect' do
|
|
54
54
|
context 'SRV monitor thread' do
|
55
55
|
|
56
56
|
let(:uri) do
|
57
|
-
"mongodb+srv://test1.test.build.10gen.cc/?tls=#{SpecConfig.instance.ssl?}
|
58
|
-
puts "Constructed URI: #{uri}"
|
59
|
-
end
|
57
|
+
"mongodb+srv://test1.test.build.10gen.cc/?tls=#{SpecConfig.instance.ssl?}"
|
60
58
|
end
|
61
59
|
|
62
60
|
# Debug logging to troubleshoot failures in Evergreen
|
@@ -68,8 +66,8 @@ describe 'Client after reconnect' do
|
|
68
66
|
|
69
67
|
let(:client) do
|
70
68
|
ClientRegistry.instance.register_local_client(
|
71
|
-
Mongo::Client.new(uri,
|
72
|
-
logger: logger))
|
69
|
+
Mongo::Client.new(uri, SpecConfig.instance.ssl_options.merge(
|
70
|
+
server_selection_timeout: 3.86, logger: logger)))
|
73
71
|
end
|
74
72
|
|
75
73
|
let(:wait_for_discovery) do
|
@@ -134,7 +132,10 @@ describe 'Client after reconnect' do
|
|
134
132
|
|
135
133
|
let(:client) do
|
136
134
|
ClientRegistry.instance.register_local_client(
|
137
|
-
Mongo::Client.new(uri,
|
135
|
+
Mongo::Client.new(uri,
|
136
|
+
timeout: 5,
|
137
|
+
connect_timeout: 5,
|
138
|
+
server_selection_timeout: 3.89,
|
138
139
|
resolv_options: {
|
139
140
|
nameserver: 'localhost',
|
140
141
|
nameserver_port: [['localhost', 5300], ['127.0.0.1', 5300]],
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'BSON & command size limits' do
|
4
|
+
let(:max_document_size) { 16*1024*1024 }
|
5
|
+
|
6
|
+
before do
|
7
|
+
authorized_collection.delete_many
|
8
|
+
end
|
9
|
+
|
10
|
+
# This test uses a large document that is significantly smaller than the
|
11
|
+
# size limit. It is a basic sanity check.
|
12
|
+
it 'allows user-provided documents to be 15MiB' do
|
13
|
+
document = { key: 'a' * 15*1024*1024, _id: 'foo' }
|
14
|
+
|
15
|
+
authorized_collection.insert_one(document)
|
16
|
+
end
|
17
|
+
|
18
|
+
# This test uses a large document that is significantly larger than the
|
19
|
+
# size limit. It is a basic sanity check.
|
20
|
+
it 'fails single write of oversized documents' do
|
21
|
+
document = { key: 'a' * 17*1024*1024, _id: 'foo' }
|
22
|
+
|
23
|
+
lambda do
|
24
|
+
authorized_collection.insert_one(document)
|
25
|
+
end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
|
26
|
+
end
|
27
|
+
|
28
|
+
# This test checks our bulk write splitting when documents are not close
|
29
|
+
# to the limit, but where splitting is definitely required.
|
30
|
+
it 'allows split bulk write of medium sized documents' do
|
31
|
+
# 8 documents of 4 MiB each = 32 MiB total data, should be split over
|
32
|
+
# either 2 or 3 bulk writes depending on how well the driver splits
|
33
|
+
documents = []
|
34
|
+
1.upto(8) do |index|
|
35
|
+
documents << { key: 'a' * 4*1024*1024, _id: "in#{index}" }
|
36
|
+
end
|
37
|
+
|
38
|
+
authorized_collection.insert_many(documents)
|
39
|
+
authorized_collection.count_documents({}).should == 8
|
40
|
+
end
|
41
|
+
|
42
|
+
# This test ensures that document which are too big definitely fail insertion.
|
43
|
+
it 'fails bulk write of oversized documents' do
|
44
|
+
documents = []
|
45
|
+
1.upto(3) do |index|
|
46
|
+
documents << { key: 'a' * 17*1024*1024, _id: "in#{index}" }
|
47
|
+
end
|
48
|
+
|
49
|
+
lambda do
|
50
|
+
authorized_collection.insert_many(documents)
|
51
|
+
end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
|
52
|
+
authorized_collection.count_documents({}).should == 0
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'allows user-provided documents to be exactly 16MiB' do
|
56
|
+
# The document must contain the _id field, otherwise the server will
|
57
|
+
# add it which will increase the size of the document as persisted by
|
58
|
+
# the server.
|
59
|
+
document = { key: 'a' * (max_document_size - 28), _id: 'foo' }
|
60
|
+
expect(document.to_bson.length).to eq(max_document_size)
|
61
|
+
|
62
|
+
authorized_collection.insert_one(document)
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'fails on the server when a document larger than 16MiB is inserted' do
|
66
|
+
document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
|
67
|
+
expect(document.to_bson.length).to eq(max_document_size+1)
|
68
|
+
|
69
|
+
lambda do
|
70
|
+
authorized_collection.insert_one(document)
|
71
|
+
end.should raise_error(Mongo::Error::OperationFailure, /object to insert too large/)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'fails in the driver when a document larger than 16MiB+16KiB is inserted' do
|
75
|
+
document = { key: 'a' * (max_document_size - 27 + 16*1024), _id: 'foo' }
|
76
|
+
expect(document.to_bson.length).to eq(max_document_size+16*1024+1)
|
77
|
+
|
78
|
+
lambda do
|
79
|
+
authorized_collection.insert_one(document)
|
80
|
+
end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'allows bulk writes of multiple documents of exactly 16 MiB each' do
|
84
|
+
documents = []
|
85
|
+
1.upto(3) do |index|
|
86
|
+
document = { key: 'a' * (max_document_size - 28), _id: "in#{index}" }
|
87
|
+
expect(document.to_bson.length).to eq(max_document_size)
|
88
|
+
documents << document
|
89
|
+
end
|
90
|
+
|
91
|
+
authorized_collection.insert_many(documents)
|
92
|
+
authorized_collection.count_documents({}).should == 3
|
93
|
+
end
|
94
|
+
end
|