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,136 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Mongo::Crypt::EncryptionIO do
|
5
|
+
let(:subject) do
|
6
|
+
described_class.new(
|
7
|
+
key_vault_namespace: 'foo.bar',
|
8
|
+
key_vault_client: authorized_client,
|
9
|
+
mongocryptd_options: mongocryptd_options,
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#spawn_mongocryptd' do
|
14
|
+
context 'no spawn path' do
|
15
|
+
let(:mongocryptd_options) do
|
16
|
+
{
|
17
|
+
mongocryptd_spawn_args: ['test'],
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'fails with an exception' do
|
22
|
+
lambda do
|
23
|
+
subject.send(:spawn_mongocryptd)
|
24
|
+
end.should raise_error(ArgumentError, /Cannot spawn mongocryptd process when no.*mongocryptd_spawn_path/)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'no spawn args' do
|
29
|
+
let(:mongocryptd_options) do
|
30
|
+
{
|
31
|
+
mongocryptd_spawn_path: 'echo',
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'fails with an exception' do
|
36
|
+
lambda do
|
37
|
+
subject.send(:spawn_mongocryptd)
|
38
|
+
end.should raise_error(ArgumentError, /Cannot spawn mongocryptd process when no.*mongocryptd_spawn_args/)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'empty array for spawn args' do
|
43
|
+
let(:mongocryptd_options) do
|
44
|
+
{
|
45
|
+
mongocryptd_spawn_path: 'echo',
|
46
|
+
mongocryptd_spawn_args: [],
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'fails with an exception' do
|
51
|
+
lambda do
|
52
|
+
subject.send(:spawn_mongocryptd)
|
53
|
+
end.should raise_error(ArgumentError, /Cannot spawn mongocryptd process when no.*mongocryptd_spawn_args/)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'good spawn path and args' do
|
58
|
+
let(:mongocryptd_options) do
|
59
|
+
{
|
60
|
+
mongocryptd_spawn_path: 'echo',
|
61
|
+
mongocryptd_spawn_args: ['hi'],
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'spawns' do
|
66
|
+
subject.send(:spawn_mongocryptd)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context '-- for args to emulate no args' do
|
71
|
+
let(:mongocryptd_options) do
|
72
|
+
{
|
73
|
+
mongocryptd_spawn_path: 'echo',
|
74
|
+
mongocryptd_spawn_args: ['--'],
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'spawns' do
|
79
|
+
subject.send(:spawn_mongocryptd)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe '#mark_command' do
|
85
|
+
let(:mock_client) do
|
86
|
+
double('mongocryptd client').tap do |client|
|
87
|
+
database = double('mock database')
|
88
|
+
expect(database).to receive(:command).and_raise(Mongo::Error::NoServerAvailable.new(Mongo::ServerSelector::Primary.new, nil, 'test message'))
|
89
|
+
allow(database).to receive(:command).and_return([])
|
90
|
+
expect(client).to receive(:database).at_least(:once).and_return(database)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
let(:base_options) do
|
95
|
+
{
|
96
|
+
mongocryptd_spawn_path: 'echo',
|
97
|
+
mongocryptd_spawn_args: ['--'],
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
let(:subject) do
|
102
|
+
described_class.new(
|
103
|
+
mongocryptd_client: mock_client,
|
104
|
+
key_vault_namespace: 'foo.bar',
|
105
|
+
key_vault_client: authorized_client,
|
106
|
+
mongocryptd_options: mongocryptd_options,
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
context ':mongocryptd_bypass_spawn not given' do
|
111
|
+
let(:mongocryptd_options) do
|
112
|
+
base_options
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'spawns' do
|
116
|
+
expect(subject).to receive(:spawn_mongocryptd)
|
117
|
+
subject.mark_command({})
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context ':mongocryptd_bypass_spawn given' do
|
122
|
+
let(:mongocryptd_options) do
|
123
|
+
base_options.merge(
|
124
|
+
mongocryptd_bypass_spawn: true,
|
125
|
+
)
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'does not spawn' do
|
129
|
+
expect(subject).not_to receive(:spawn_mongocryptd)
|
130
|
+
lambda do
|
131
|
+
subject.mark_command({})
|
132
|
+
end.should raise_error(Mongo::Error::NoServerAvailable, /test message/)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'lite_spec_helper'
|
3
|
+
|
4
|
+
describe Mongo::Crypt::ExplicitDecryptionContext do
|
5
|
+
require_libmongocrypt
|
6
|
+
include_context 'define shared FLE helpers'
|
7
|
+
|
8
|
+
let(:mongocrypt) { Mongo::Crypt::Handle.new(kms_providers, logger: logger) }
|
9
|
+
let(:context) { described_class.new(mongocrypt, io, value) }
|
10
|
+
let(:logger) { nil }
|
11
|
+
let(:io) { double("Mongo::ClientEncryption::IO") }
|
12
|
+
|
13
|
+
# A binary string representing a value previously encrypted by libmongocrypt
|
14
|
+
let(:encrypted_data) do
|
15
|
+
"\x01\xDF2~\x89\xD2+N}\x84;i(\xE5\xF4\xBF \x024\xE5\xD2\n\x9E\x97\x9F\xAF\x9D\xC7\xC9\x1A\a\x87z\xAE_;r\xAC\xA9\xF6n\x1D\x0F\xB5\xB1#O\xB7\xCA\xEE$/\xF1\xFA\b\xA7\xEC\xDB\xB6\xD4\xED\xEAMw3+\xBBv\x18\x97\xF9\x99\xD5\x13@\x80y\n{\x19R\xD3\xF0\xA1C\x05\xF7)\x93\x9Bh\x8AA.\xBB\xD3&\xEA"
|
16
|
+
end
|
17
|
+
|
18
|
+
let(:value) do
|
19
|
+
{ 'v': BSON::Binary.new(encrypted_data, :ciphertext) }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#initialize' do
|
23
|
+
context 'when mongocrypt is initialized with local KMS provider options' do
|
24
|
+
include_context 'with local kms_providers'
|
25
|
+
|
26
|
+
it 'initializes context' do
|
27
|
+
expect do
|
28
|
+
context
|
29
|
+
end.not_to raise_error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'when mongocrypt is initialized with AWS KMS provider options' do
|
34
|
+
include_context 'with AWS kms_providers'
|
35
|
+
|
36
|
+
it 'initializes context' do
|
37
|
+
expect do
|
38
|
+
context
|
39
|
+
end.not_to raise_error
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with verbose logging' do
|
44
|
+
include_context 'with local kms_providers'
|
45
|
+
|
46
|
+
before(:all) do
|
47
|
+
# Logging from libmongocrypt requires the C library to be built with the -DENABLE_TRACE=ON
|
48
|
+
# option; none of the pre-built packages on Evergreen have been built with logging enabled.
|
49
|
+
#
|
50
|
+
# It is still useful to be able to run these tests locally to confirm that logging is working
|
51
|
+
# while debugging any problems.
|
52
|
+
#
|
53
|
+
# For now, skip this test by default and revisit once we have determined how we want to
|
54
|
+
# package libmongocrypt with the Ruby driver (see: https://jira.mongodb.org/browse/RUBY-1966)
|
55
|
+
skip "These tests require libmongocrypt to be built with the '-DENABLE_TRACE=ON' cmake option." +
|
56
|
+
" They also require the MONGOCRYPT_TRACE environment variable to be set to 'ON'."
|
57
|
+
end
|
58
|
+
|
59
|
+
let(:logger) do
|
60
|
+
::Logger.new($stdout).tap do |logger|
|
61
|
+
logger.level = ::Logger::DEBUG
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'receives log messages from libmongocrypt' do
|
66
|
+
expect(logger).to receive(:debug).with(/mongocrypt_ctx_explicit_decrypt_init/)
|
67
|
+
|
68
|
+
context
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,170 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'lite_spec_helper'
|
3
|
+
|
4
|
+
describe Mongo::Crypt::ExplicitEncryptionContext do
|
5
|
+
require_libmongocrypt
|
6
|
+
include_context 'define shared FLE helpers'
|
7
|
+
|
8
|
+
let(:mongocrypt) { Mongo::Crypt::Handle.new(kms_providers, logger: logger) }
|
9
|
+
let(:context) { described_class.new(mongocrypt, io, value, options) }
|
10
|
+
|
11
|
+
let(:logger) { nil }
|
12
|
+
|
13
|
+
let(:io) { double("Mongo::ClientEncryption::IO") }
|
14
|
+
let(:value) { { 'v': 'Hello, world!' } }
|
15
|
+
|
16
|
+
let(:options) do
|
17
|
+
{
|
18
|
+
key_id: key_id,
|
19
|
+
key_alt_name: key_alt_name,
|
20
|
+
algorithm: algorithm
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#initialize' do
|
25
|
+
shared_examples 'a functioning ExplicitEncryptionContext' do
|
26
|
+
context 'with nil key_id and key_alt_name options' do
|
27
|
+
let(:key_id) { nil }
|
28
|
+
let(:key_alt_name) { nil }
|
29
|
+
|
30
|
+
it 'raises an exception' do
|
31
|
+
expect do
|
32
|
+
context
|
33
|
+
end.to raise_error(ArgumentError, /:key_id and :key_alt_name options cannot both be nil/)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with both key_id and key_alt_name options' do
|
38
|
+
it 'raises an exception' do
|
39
|
+
expect do
|
40
|
+
context
|
41
|
+
end.to raise_error(ArgumentError, /:key_id and :key_alt_name options cannot both be present/)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with invalid key_id' do
|
46
|
+
let(:key_id) { 'random string' }
|
47
|
+
let(:key_alt_name) { nil }
|
48
|
+
|
49
|
+
it 'raises an exception' do
|
50
|
+
expect do
|
51
|
+
context
|
52
|
+
end.to raise_error(ArgumentError, /Expected the :key_id option to be a BSON::Binary object/)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'with invalid key_alt_name' do
|
57
|
+
let(:key_id) { nil }
|
58
|
+
let(:key_alt_name) { 5 }
|
59
|
+
|
60
|
+
it 'raises an exception' do
|
61
|
+
expect do
|
62
|
+
context
|
63
|
+
end.to raise_error(ArgumentError, /key_alt_name option must be a String/)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'with valid key_alt_name' do
|
68
|
+
let(:key_id) { nil }
|
69
|
+
|
70
|
+
context 'with nil algorithm' do
|
71
|
+
let(:algorithm) { nil }
|
72
|
+
|
73
|
+
it 'raises exception' do
|
74
|
+
expect do
|
75
|
+
context
|
76
|
+
end.to raise_error(Mongo::Error::CryptError, /passed null algorithm/)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'with invalid algorithm' do
|
81
|
+
let(:algorithm) { 'unsupported-algorithm' }
|
82
|
+
|
83
|
+
it 'raises an exception' do
|
84
|
+
expect do
|
85
|
+
context
|
86
|
+
end.to raise_error(Mongo::Error::CryptError, /unsupported algorithm/)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'initializes context' do
|
91
|
+
expect do
|
92
|
+
context
|
93
|
+
end.not_to raise_error
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'with valid key_id' do
|
98
|
+
let(:key_alt_name) { nil }
|
99
|
+
|
100
|
+
context 'with nil algorithm' do
|
101
|
+
let(:algorithm) { nil }
|
102
|
+
|
103
|
+
it 'raises exception' do
|
104
|
+
expect do
|
105
|
+
context
|
106
|
+
end.to raise_error(Mongo::Error::CryptError, /passed null algorithm/)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'with invalid algorithm' do
|
111
|
+
let(:algorithm) { 'unsupported-algorithm' }
|
112
|
+
|
113
|
+
it 'raises an exception' do
|
114
|
+
expect do
|
115
|
+
context
|
116
|
+
end.to raise_error(Mongo::Error::CryptError, /unsupported algorithm/)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'initializes context' do
|
121
|
+
expect do
|
122
|
+
context
|
123
|
+
end.not_to raise_error
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when mongocrypt is initialized with AWS KMS provider options' do
|
129
|
+
include_context 'with AWS kms_providers'
|
130
|
+
it_behaves_like 'a functioning ExplicitEncryptionContext'
|
131
|
+
end
|
132
|
+
|
133
|
+
context 'when mongocrypt is initialized with local KMS provider options' do
|
134
|
+
include_context 'with local kms_providers'
|
135
|
+
it_behaves_like 'a functioning ExplicitEncryptionContext'
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'with verbose logging' do
|
139
|
+
include_context 'with local kms_providers'
|
140
|
+
|
141
|
+
before(:all) do
|
142
|
+
# Logging from libmongocrypt requires the C library to be built with the -DENABLE_TRACE=ON
|
143
|
+
# option; none of the pre-built packages on Evergreen have been built with logging enabled.
|
144
|
+
#
|
145
|
+
# It is still useful to be able to run these tests locally to confirm that logging is working
|
146
|
+
# while debugging any problems.
|
147
|
+
#
|
148
|
+
# For now, skip this test by default and revisit once we have determined how we want to
|
149
|
+
# package libmongocrypt with the Ruby driver (see: https://jira.mongodb.org/browse/RUBY-1966)
|
150
|
+
skip "These tests require libmongocrypt to be built with the '-DENABLE_TRACE=ON' cmake option." +
|
151
|
+
" They also require the MONGOCRYPT_TRACE environment variable to be set to 'ON'."
|
152
|
+
end
|
153
|
+
|
154
|
+
let(:key_alt_name) { nil }
|
155
|
+
let(:logger) do
|
156
|
+
::Logger.new($stdout).tap do |logger|
|
157
|
+
logger.level = ::Logger::DEBUG
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'receives log messages from libmongocrypt' do
|
162
|
+
expect(logger).to receive(:debug).with(/mongocrypt_ctx_setopt_key_id/)
|
163
|
+
expect(logger).to receive(:debug).with(/mongocrypt_ctx_setopt_algorithm/)
|
164
|
+
expect(logger).to receive(:debug).with(/mongocrypt_ctx_explicit_encrypt_init/)
|
165
|
+
|
166
|
+
context
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,198 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
require 'base64'
|
3
|
+
require 'lite_spec_helper'
|
4
|
+
|
5
|
+
describe Mongo::Crypt::Handle do
|
6
|
+
require_libmongocrypt
|
7
|
+
include_context 'define shared FLE helpers'
|
8
|
+
|
9
|
+
describe '#initialize' do
|
10
|
+
let(:handle) { described_class.new(kms_providers, schema_map: schema_map) }
|
11
|
+
let(:schema_map) { nil }
|
12
|
+
|
13
|
+
shared_examples 'a functioning Mongo::Crypt::Handle' do
|
14
|
+
context 'with valid schema map' do
|
15
|
+
it 'does not raise an exception' do
|
16
|
+
expect { handle }.not_to raise_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with invalid schema map' do
|
21
|
+
let(:schema_map) { '' }
|
22
|
+
|
23
|
+
it 'raises an exception' do
|
24
|
+
expect { handle }.to raise_error(ArgumentError, /schema_map must be a Hash or nil/)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with nil schema map' do
|
29
|
+
let(:schema_map) { nil }
|
30
|
+
|
31
|
+
it 'does not raise an exception' do
|
32
|
+
expect { handle }.not_to raise_error
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with empty kms_providers' do
|
38
|
+
let(:kms_providers) { {} }
|
39
|
+
|
40
|
+
it 'raises an exception' do
|
41
|
+
expect { handle }.to raise_error(ArgumentError, /must have one of the following keys: :aws, :local/)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'with invalid aws kms_providers' do
|
46
|
+
let(:kms_providers) { { aws: {} } }
|
47
|
+
|
48
|
+
it 'raises an exception' do
|
49
|
+
expect { handle }.to raise_error(ArgumentError, /kms_providers with :aws key must be in the format: { aws: { access_key_id: 'YOUR-ACCESS-KEY-ID', secret_access_key: 'SECRET-ACCESS-KEY' } }/)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with invalid kms_providers key' do
|
54
|
+
let(:kms_providers) { { random_kms_provider: {} } }
|
55
|
+
|
56
|
+
it 'raises an exception' do
|
57
|
+
expect { handle }.to raise_error(ArgumentError, /must have one of the following keys: :aws, :local/)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'with empty local kms_providers' do
|
62
|
+
let(:kms_providers) { { local: {} } }
|
63
|
+
|
64
|
+
it 'raises an exception' do
|
65
|
+
expect { handle }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context 'with invalid local kms_providers' do
|
70
|
+
let(:kms_providers) { { local: { invalid_key: 'Some stuff' } } }
|
71
|
+
|
72
|
+
it 'raises an exception' do
|
73
|
+
expect { handle }.to raise_error(ArgumentError, /kms_providers with :local key must be in the format: { local: { key: 'MASTER-KEY' } }/)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with invalid local kms master key' do
|
78
|
+
let(:kms_providers) do
|
79
|
+
{
|
80
|
+
local: {
|
81
|
+
key: 'ruby' * 23 # NOT 96 bytes
|
82
|
+
}
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'raises an exception' do
|
87
|
+
expect { handle }.to raise_error(Mongo::Error::CryptError, 'local key must be 96 bytes (libmongocrypt error code 1)')
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'with valid local kms_providers' do
|
92
|
+
include_context 'with local kms_providers'
|
93
|
+
it_behaves_like 'a functioning Mongo::Crypt::Handle'
|
94
|
+
end
|
95
|
+
|
96
|
+
context 'with nil AWS kms_provider' do
|
97
|
+
let(:kms_providers) {
|
98
|
+
{
|
99
|
+
aws: nil
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
it 'raises an exception' do
|
104
|
+
expect do
|
105
|
+
handle
|
106
|
+
end.to raise_error(ArgumentError, /The :aws KMS provider must not be nil/)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'with empty AWS kms_provider' do
|
111
|
+
let(:kms_providers) {
|
112
|
+
{
|
113
|
+
aws: {}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
it 'raises an exception' do
|
118
|
+
expect do
|
119
|
+
handle
|
120
|
+
end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'with nil AWS access_key_id' do
|
125
|
+
let(:kms_providers) {
|
126
|
+
{
|
127
|
+
aws: {
|
128
|
+
access_key_id: nil,
|
129
|
+
secret_access_key: SpecConfig.instance.fle_aws_secret
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
it 'raises an exception' do
|
135
|
+
expect do
|
136
|
+
handle
|
137
|
+
end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'with non-string AWS access_key_id' do
|
142
|
+
let(:kms_providers) {
|
143
|
+
{
|
144
|
+
aws: {
|
145
|
+
access_key_id: 5,
|
146
|
+
secret_access_key: SpecConfig.instance.fle_aws_secret
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
it 'raises an exception' do
|
152
|
+
expect do
|
153
|
+
handle
|
154
|
+
end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
context 'with nil AWS secret_access_key' do
|
160
|
+
let(:kms_providers) {
|
161
|
+
{
|
162
|
+
aws: {
|
163
|
+
access_key_id: SpecConfig.instance.fle_aws_key,
|
164
|
+
secret_access_key: nil
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
it 'raises an exception' do
|
170
|
+
expect do
|
171
|
+
handle
|
172
|
+
end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context 'with non-string AWS secret_access_key' do
|
177
|
+
let(:kms_providers) {
|
178
|
+
{
|
179
|
+
aws: {
|
180
|
+
access_key_id: SpecConfig.instance.fle_aws_key,
|
181
|
+
secret_access_key: 5
|
182
|
+
}
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
it 'raises an exception' do
|
187
|
+
expect do
|
188
|
+
handle
|
189
|
+
end.to raise_error(ArgumentError, /The specified aws kms_providers option is invalid/)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context 'with valid AWS kms_providers' do
|
194
|
+
include_context 'with AWS kms_providers'
|
195
|
+
it_behaves_like 'a functioning Mongo::Crypt::Handle'
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|