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.
Files changed (327) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +2 -2
  3. data.tar.gz.sig +0 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/lib/mongo.rb +3 -0
  6. data/lib/mongo/address.rb +13 -2
  7. data/lib/mongo/auth.rb +1 -0
  8. data/lib/mongo/auth/credential_cache.rb +51 -0
  9. data/lib/mongo/auth/scram/conversation.rb +20 -16
  10. data/lib/mongo/auth/user.rb +0 -8
  11. data/lib/mongo/auth/user/view.rb +4 -4
  12. data/lib/mongo/background_thread.rb +1 -1
  13. data/lib/mongo/bulk_write.rb +5 -5
  14. data/lib/mongo/client.rb +126 -11
  15. data/lib/mongo/client_encryption.rb +103 -0
  16. data/lib/mongo/cluster.rb +2 -2
  17. data/lib/mongo/cluster/reapers/cursor_reaper.rb +18 -6
  18. data/lib/mongo/cluster/sdam_flow.rb +54 -58
  19. data/lib/mongo/cluster/srv_monitor.rb +1 -1
  20. data/lib/mongo/collection.rb +3 -3
  21. data/lib/mongo/collection/view.rb +1 -1
  22. data/lib/mongo/collection/view/aggregation.rb +1 -1
  23. data/lib/mongo/collection/view/change_stream.rb +12 -3
  24. data/lib/mongo/collection/view/iterable.rb +14 -5
  25. data/lib/mongo/collection/view/map_reduce.rb +2 -2
  26. data/lib/mongo/collection/view/readable.rb +7 -9
  27. data/lib/mongo/collection/view/writable.rb +7 -7
  28. data/lib/mongo/crypt.rb +33 -0
  29. data/lib/mongo/crypt/auto_decryption_context.rb +42 -0
  30. data/lib/mongo/crypt/auto_encrypter.rb +169 -0
  31. data/lib/mongo/crypt/auto_encryption_context.rb +44 -0
  32. data/lib/mongo/crypt/binary.rb +155 -0
  33. data/lib/mongo/crypt/binding.rb +1162 -0
  34. data/lib/mongo/crypt/context.rb +135 -0
  35. data/lib/mongo/crypt/data_key_context.rb +162 -0
  36. data/lib/mongo/crypt/encryption_io.rb +283 -0
  37. data/lib/mongo/crypt/explicit_decryption_context.rb +40 -0
  38. data/lib/mongo/crypt/explicit_encrypter.rb +117 -0
  39. data/lib/mongo/crypt/explicit_encryption_context.rb +89 -0
  40. data/lib/mongo/crypt/handle.rb +293 -0
  41. data/lib/mongo/crypt/hooks.rb +90 -0
  42. data/lib/mongo/crypt/kms_context.rb +67 -0
  43. data/lib/mongo/crypt/status.rb +131 -0
  44. data/lib/mongo/cursor.rb +64 -32
  45. data/lib/mongo/database.rb +13 -6
  46. data/lib/mongo/database/view.rb +13 -4
  47. data/lib/mongo/dbref.rb +9 -2
  48. data/lib/mongo/error.rb +5 -1
  49. data/lib/mongo/error/crypt_error.rb +31 -0
  50. data/lib/mongo/error/{failed_stringprep_validation.rb → failed_string_prep_validation.rb} +0 -0
  51. data/lib/mongo/error/invalid_cursor_operation.rb +27 -0
  52. data/lib/mongo/error/kms_error.rb +22 -0
  53. data/lib/mongo/error/max_bson_size.rb +14 -3
  54. data/lib/mongo/error/mongocryptd_spawn_error.rb +22 -0
  55. data/lib/mongo/error/no_server_available.rb +8 -3
  56. data/lib/mongo/error/operation_failure.rb +1 -0
  57. data/lib/mongo/grid/file.rb +0 -5
  58. data/lib/mongo/grid/file/chunk.rb +0 -2
  59. data/lib/mongo/grid/file/info.rb +2 -1
  60. data/lib/mongo/grid/fs_bucket.rb +13 -15
  61. data/lib/mongo/grid/stream/write.rb +3 -9
  62. data/lib/mongo/index/view.rb +3 -3
  63. data/lib/mongo/monitoring/event/command_started.rb +6 -1
  64. data/lib/mongo/operation/collections_info.rb +6 -3
  65. data/lib/mongo/operation/delete/op_msg.rb +1 -1
  66. data/lib/mongo/operation/find/op_msg.rb +4 -1
  67. data/lib/mongo/operation/get_more/op_msg.rb +4 -1
  68. data/lib/mongo/operation/insert/command.rb +2 -2
  69. data/lib/mongo/operation/insert/legacy.rb +2 -2
  70. data/lib/mongo/operation/insert/op_msg.rb +3 -3
  71. data/lib/mongo/operation/result.rb +36 -27
  72. data/lib/mongo/operation/shared/executable.rb +10 -8
  73. data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
  74. data/lib/mongo/operation/shared/op_msg_or_command.rb +2 -2
  75. data/lib/mongo/operation/shared/op_msg_or_find_command.rb +2 -2
  76. data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +2 -2
  77. data/lib/mongo/operation/shared/write.rb +17 -10
  78. data/lib/mongo/operation/update/op_msg.rb +1 -1
  79. data/lib/mongo/protocol/compressed.rb +6 -5
  80. data/lib/mongo/protocol/insert.rb +3 -1
  81. data/lib/mongo/protocol/message.rb +72 -8
  82. data/lib/mongo/protocol/msg.rb +191 -37
  83. data/lib/mongo/protocol/query.rb +7 -9
  84. data/lib/mongo/protocol/serializers.rb +6 -2
  85. data/lib/mongo/server.rb +10 -4
  86. data/lib/mongo/server/connection.rb +20 -9
  87. data/lib/mongo/server/connection_base.rb +81 -12
  88. data/lib/mongo/server/connection_common.rb +61 -0
  89. data/lib/mongo/server/connection_pool.rb +37 -1
  90. data/lib/mongo/server/description.rb +9 -11
  91. data/lib/mongo/server/monitor.rb +2 -0
  92. data/lib/mongo/server/monitor/connection.rb +3 -18
  93. data/lib/mongo/server/pending_connection.rb +2 -1
  94. data/lib/mongo/session.rb +2 -2
  95. data/lib/mongo/session/session_pool.rb +8 -3
  96. data/lib/mongo/socket.rb +29 -16
  97. data/lib/mongo/socket/ssl.rb +23 -8
  98. data/lib/mongo/socket/tcp.rb +12 -3
  99. data/lib/mongo/timeout.rb +49 -0
  100. data/lib/mongo/uri.rb +30 -1
  101. data/lib/mongo/version.rb +1 -1
  102. data/mongo.gemspec +1 -1
  103. data/spec/README.md +134 -7
  104. data/spec/integration/auth_spec.rb +53 -0
  105. data/spec/integration/{client_options_spec.rb → client_authentication_options_spec.rb} +10 -10
  106. data/spec/integration/client_construction_spec.rb +76 -1
  107. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +351 -0
  108. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +301 -0
  109. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +71 -0
  110. data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +76 -0
  111. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +216 -0
  112. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +600 -0
  113. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +183 -0
  114. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +74 -0
  115. data/spec/integration/client_side_encryption/client_close_spec.rb +59 -0
  116. data/spec/integration/client_side_encryption/corpus_spec.rb +228 -0
  117. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +132 -0
  118. data/spec/integration/client_side_encryption/data_key_spec.rb +163 -0
  119. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +114 -0
  120. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +137 -0
  121. data/spec/integration/client_side_encryption/views_spec.rb +42 -0
  122. data/spec/integration/client_update_spec.rb +120 -0
  123. data/spec/integration/command_monitoring_spec.rb +3 -1
  124. data/spec/integration/command_spec.rb +44 -10
  125. data/spec/integration/connection_spec.rb +57 -0
  126. data/spec/integration/reconnect_spec.rb +7 -6
  127. data/spec/integration/size_limit_spec.rb +94 -0
  128. data/spec/integration/srv_monitoring_spec.rb +14 -6
  129. data/spec/lite_spec_helper.rb +31 -22
  130. data/spec/mongo/auth/cr_spec.rb +8 -0
  131. data/spec/mongo/auth/ldap_spec.rb +5 -1
  132. data/spec/mongo/auth/scram/conversation_spec.rb +5 -6
  133. data/spec/mongo/auth/scram/negotiation_spec.rb +74 -75
  134. data/spec/mongo/auth/scram_spec.rb +45 -35
  135. data/spec/mongo/auth/x509_spec.rb +5 -1
  136. data/spec/mongo/client_construction_spec.rb +206 -3
  137. data/spec/mongo/client_encryption_spec.rb +408 -0
  138. data/spec/mongo/cluster/cursor_reaper_spec.rb +12 -8
  139. data/spec/mongo/cluster/socket_reaper_spec.rb +14 -3
  140. data/spec/mongo/collection/view/aggregation_spec.rb +0 -2
  141. data/spec/mongo/collection/view/change_stream_spec.rb +7 -7
  142. data/spec/mongo/collection/view/map_reduce_spec.rb +3 -3
  143. data/spec/mongo/collection/view_spec.rb +1 -1
  144. data/spec/mongo/collection_spec.rb +4 -33
  145. data/spec/mongo/crypt/auto_decryption_context_spec.rb +90 -0
  146. data/spec/mongo/crypt/auto_encrypter_spec.rb +182 -0
  147. data/spec/mongo/crypt/auto_encryption_context_spec.rb +107 -0
  148. data/spec/mongo/crypt/binary_spec.rb +115 -0
  149. data/spec/mongo/crypt/binding/binary_spec.rb +56 -0
  150. data/spec/mongo/crypt/binding/context_spec.rb +257 -0
  151. data/spec/mongo/crypt/binding/helpers_spec.rb +46 -0
  152. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +144 -0
  153. data/spec/mongo/crypt/binding/status_spec.rb +99 -0
  154. data/spec/mongo/crypt/binding/version_spec.rb +22 -0
  155. data/spec/mongo/crypt/binding_unloaded_spec.rb +20 -0
  156. data/spec/mongo/crypt/data_key_context_spec.rb +213 -0
  157. data/spec/mongo/crypt/encryption_io_spec.rb +136 -0
  158. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +72 -0
  159. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +170 -0
  160. data/spec/mongo/crypt/handle_spec.rb +198 -0
  161. data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +108 -0
  162. data/spec/mongo/crypt/status_spec.rb +152 -0
  163. data/spec/mongo/cursor_spec.rb +24 -4
  164. data/spec/mongo/database_spec.rb +20 -0
  165. data/spec/mongo/error/crypt_error_spec.rb +26 -0
  166. data/spec/mongo/error/max_bson_size_spec.rb +35 -0
  167. data/spec/mongo/error/no_server_available_spec.rb +11 -1
  168. data/spec/mongo/error/operation_failure_spec.rb +6 -6
  169. data/spec/mongo/operation/aggregate_spec.rb +1 -1
  170. data/spec/mongo/operation/collections_info_spec.rb +1 -1
  171. data/spec/mongo/operation/command_spec.rb +3 -3
  172. data/spec/mongo/operation/create_index_spec.rb +3 -3
  173. data/spec/mongo/operation/create_user_spec.rb +3 -3
  174. data/spec/mongo/operation/delete/bulk_spec.rb +6 -6
  175. data/spec/mongo/operation/delete/op_msg_spec.rb +1 -6
  176. data/spec/mongo/operation/delete_spec.rb +7 -7
  177. data/spec/mongo/operation/drop_index_spec.rb +2 -2
  178. data/spec/mongo/operation/find/legacy_spec.rb +1 -1
  179. data/spec/mongo/operation/get_more_spec.rb +1 -1
  180. data/spec/mongo/operation/indexes_spec.rb +1 -1
  181. data/spec/mongo/operation/insert/bulk_spec.rb +7 -7
  182. data/spec/mongo/operation/insert/op_msg_spec.rb +3 -6
  183. data/spec/mongo/operation/insert_spec.rb +12 -12
  184. data/spec/mongo/operation/map_reduce_spec.rb +2 -2
  185. data/spec/mongo/operation/remove_user_spec.rb +3 -3
  186. data/spec/mongo/operation/update/bulk_spec.rb +6 -6
  187. data/spec/mongo/operation/update/op_msg_spec.rb +3 -6
  188. data/spec/mongo/operation/update_spec.rb +7 -7
  189. data/spec/mongo/operation/update_user_spec.rb +1 -1
  190. data/spec/mongo/protocol/compressed_spec.rb +2 -3
  191. data/spec/mongo/protocol/delete_spec.rb +9 -8
  192. data/spec/mongo/protocol/get_more_spec.rb +9 -8
  193. data/spec/mongo/protocol/insert_spec.rb +9 -8
  194. data/spec/mongo/protocol/kill_cursors_spec.rb +6 -5
  195. data/spec/mongo/protocol/msg_spec.rb +57 -53
  196. data/spec/mongo/protocol/query_spec.rb +12 -12
  197. data/spec/mongo/protocol/registry_spec.rb +1 -1
  198. data/spec/mongo/protocol/reply_spec.rb +1 -1
  199. data/spec/mongo/protocol/update_spec.rb +10 -9
  200. data/spec/mongo/server/connection_pool_spec.rb +1 -1
  201. data/spec/mongo/server/connection_spec.rb +28 -7
  202. data/spec/mongo/socket_spec.rb +1 -1
  203. data/spec/mongo/timeout_spec.rb +85 -0
  204. data/spec/mongo/uri/srv_protocol_spec.rb +2 -2
  205. data/spec/mongo/uri_spec.rb +52 -5
  206. data/spec/mongo/write_concern_spec.rb +13 -1
  207. data/spec/{support → runners}/auth.rb +14 -1
  208. data/spec/{support → runners}/change_streams.rb +1 -1
  209. data/spec/{support → runners}/change_streams/operation.rb +0 -0
  210. data/spec/{support → runners}/cmap.rb +1 -1
  211. data/spec/{support → runners}/cmap/verifier.rb +0 -0
  212. data/spec/{support → runners}/command_monitoring.rb +0 -0
  213. data/spec/runners/connection_string.rb +358 -4
  214. data/spec/{support → runners}/crud.rb +9 -9
  215. data/spec/{support → runners}/crud/context.rb +0 -0
  216. data/spec/{support → runners}/crud/operation.rb +7 -3
  217. data/spec/{support → runners}/crud/outcome.rb +0 -0
  218. data/spec/{support → runners}/crud/requirement.rb +1 -1
  219. data/spec/{support → runners}/crud/spec.rb +12 -1
  220. data/spec/{support → runners}/crud/test.rb +0 -0
  221. data/spec/{support → runners}/crud/test_base.rb +0 -0
  222. data/spec/{support → runners}/crud/verifier.rb +10 -12
  223. data/spec/{support → runners}/gridfs.rb +0 -0
  224. data/spec/{support → runners}/sdam_monitoring.rb +0 -0
  225. data/spec/{support → runners}/server_discovery_and_monitoring.rb +0 -0
  226. data/spec/{support → runners}/server_selection.rb +0 -0
  227. data/spec/{support → runners}/server_selection_rtt.rb +0 -0
  228. data/spec/{support → runners}/transactions.rb +4 -4
  229. data/spec/{support → runners}/transactions/context.rb +0 -0
  230. data/spec/{support → runners}/transactions/operation.rb +0 -0
  231. data/spec/{support → runners}/transactions/spec.rb +0 -0
  232. data/spec/{support → runners}/transactions/test.rb +37 -5
  233. data/spec/spec_helper.rb +0 -5
  234. data/spec/spec_tests/auth_spec.rb +3 -3
  235. data/spec/spec_tests/client_side_encryption_spec.rb +13 -0
  236. data/spec/spec_tests/connection_string_spec.rb +1 -1
  237. data/spec/spec_tests/data/auth/connection-string.yml +13 -0
  238. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
  239. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
  240. data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
  241. data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
  242. data/spec/spec_tests/data/client_side_encryption/bulk.yml +85 -0
  243. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
  244. data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
  245. data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
  246. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
  247. data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
  248. data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
  249. data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
  250. data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
  251. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
  252. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
  253. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
  254. data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
  255. data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
  256. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
  257. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
  258. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
  259. data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
  260. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
  261. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
  262. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +61 -0
  263. data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
  264. data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
  265. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
  266. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +168 -0
  267. data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +1 -4
  268. data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +21 -0
  269. data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -4
  270. data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +1 -1
  271. data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +73 -0
  272. data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +1 -2
  273. data/spec/spec_tests/data/sdam/rs/repeated.yml +101 -0
  274. data/spec/spec_tests/data/sdam/rs/{primary_address_change.yml → ruby_primary_address_change.yml} +2 -0
  275. 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
  276. data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +27 -0
  277. data/spec/spec_tests/data/sdam/sharded/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  278. data/spec/spec_tests/data/sdam/sharded/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  279. data/spec/spec_tests/data/sdam/single/{primary_address_change.yml → ruby_primary_different_address.yml} +1 -1
  280. data/spec/spec_tests/data/sdam/single/{primary_mismatched_me.yml → ruby_primary_mismatched_me.yml} +1 -1
  281. data/spec/spec_tests/data/sdam_monitoring/{replica_set_with_primary_change.yml → replica_set_primary_address_change.yml} +27 -5
  282. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +26 -74
  283. data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +20 -16
  284. data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
  285. data/spec/spec_tests/data/transactions/pin-mongos.yml +2 -3
  286. data/spec/spec_tests/data/uri_options/auth-options.yml +10 -0
  287. data/spec/spec_tests/data/uri_options/tls-options.yml +75 -4
  288. data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
  289. data/spec/spec_tests/uri_options_spec.rb +6 -8
  290. data/spec/stress/connection_pool_timing_spec.rb +6 -3
  291. data/spec/support/certificates/README.md +4 -0
  292. data/spec/support/certificates/server-second-level-bundle.pem +77 -77
  293. data/spec/support/certificates/server-second-level.crt +52 -52
  294. data/spec/support/certificates/server-second-level.key +25 -25
  295. data/spec/support/certificates/server-second-level.pem +77 -77
  296. data/spec/support/client_registry.rb +19 -3
  297. data/spec/support/cluster_config.rb +9 -1
  298. data/spec/support/common_shortcuts.rb +12 -0
  299. data/spec/support/constraints.rb +16 -0
  300. data/spec/support/crypt.rb +140 -0
  301. data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
  302. data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
  303. data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
  304. data/spec/support/crypt/corpus/corpus.json +3657 -0
  305. data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
  306. data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
  307. data/spec/support/crypt/data_keys/key_document_local.json +31 -0
  308. data/spec/support/crypt/external/external-key.json +31 -0
  309. data/spec/support/crypt/external/external-schema.json +19 -0
  310. data/spec/support/crypt/limits/limits-doc.json +102 -0
  311. data/spec/support/crypt/limits/limits-key.json +31 -0
  312. data/spec/support/crypt/limits/limits-schema.json +1405 -0
  313. data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
  314. data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
  315. data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
  316. data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
  317. data/spec/support/lite_constraints.rb +17 -1
  318. data/spec/support/matchers.rb +19 -0
  319. data/spec/support/shared/protocol.rb +2 -0
  320. data/spec/support/spec_config.rb +43 -13
  321. data/spec/support/utils.rb +132 -10
  322. metadata +277 -81
  323. metadata.gz.sig +0 -0
  324. data/spec/integration/grid_fs_bucket_spec.rb +0 -48
  325. data/spec/integration/zlib_compression_spec.rb +0 -25
  326. data/spec/spec_tests/data/sdam/sharded/single_mongos.yml +0 -33
  327. data/spec/support/connection_string.rb +0 -354
@@ -0,0 +1,526 @@
1
+ runOn:
2
+ - minServerVersion: "4.1.10"
3
+ database_name: &database_name "default"
4
+ collection_name: &collection_name "default"
5
+
6
+ data:
7
+ - &doc0_encrypted { _id: 1, encrypted_string: {'$binary': {'base64': 'AQAAAAAAAAAAAAAAAAAAAAACwj+3zkv2VM+aTfk60RqhXq6a/77WlLwu/BxXFkL7EppGsju/m8f0x5kBDD3EZTtGALGXlym5jnpZAoSIkswHoA==', 'subType': '06'}} }
8
+ - &doc1_encrypted { _id: 2, encrypted_string: {'$binary': {'base64': 'AQAAAAAAAAAAAAAAAAAAAAACDdw4KFz3ZLquhsbt7RmDjD0N67n0uSXx7IGnQNCLeIKvot6s/ouI21Eo84IOtb6lhwUNPlSEBNY0/hbszWAKJg==', 'subType': '06'}} }
9
+ json_schema: {'properties': {'encrypted_w_altname': {'encrypt': {'keyId': '/altname', 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'}}, 'encrypted_string': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'}}, 'random': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Random'}}, 'encrypted_string_equivalent': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'}}}, 'bsonType': 'object'}
10
+ key_vault_data: [{'status': 1, '_id': {'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}, 'masterKey': {'provider': 'aws', 'key': 'arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0', 'region': 'us-east-1'}, 'updateDate': {'$date': {'$numberLong': '1552949630483'}}, 'keyMaterial': {'$binary': {'base64': 'AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEqnsxXlR51T5EbEVezUqqKAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDHa4jo6yp0Z18KgbUgIBEIB74sKxWtV8/YHje5lv5THTl0HIbhSwM6EqRlmBiFFatmEWaeMk4tO4xBX65eq670I5TWPSLMzpp8ncGHMmvHqRajNBnmFtbYxN3E3/WjxmdbOOe+OXpnGJPcGsftc7cB2shRfA4lICPnE26+oVNXT6p0Lo20nY5XC7jyCO', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1552949630483'}}, 'keyAltNames': ['altname', 'another_altname']}]
11
+
12
+ # TODO: I could see an argument against having these tests of mongocryptd as part
13
+ # of driver tests. When mongocryptd introduces support for these operators, these
14
+ # tests will fail. But it's also easy enough to remove these tests when that happens.
15
+
16
+ tests:
17
+ - description: "$text unconditionally fails"
18
+ clientOptions:
19
+ autoEncryptOpts:
20
+ kmsProviders:
21
+ aws: {} # Credentials filled in from environment.
22
+ operations:
23
+ - name: find
24
+ arguments:
25
+ filter:
26
+ { $text: { $search: "search text" } }
27
+ result:
28
+ errorContains: "Unsupported match expression operator for encryption"
29
+ - description: "$where unconditionally fails"
30
+ clientOptions:
31
+ autoEncryptOpts:
32
+ kmsProviders:
33
+ aws: {} # Credentials filled in from environment.
34
+ operations:
35
+ - name: find
36
+ arguments:
37
+ filter:
38
+ { $where: { $code: "function() { return true }" } }
39
+ result:
40
+ errorContains: "Unsupported match expression operator for encryption"
41
+ - description: "$bit operators succeed on unencrypted, error on encrypted"
42
+ clientOptions:
43
+ autoEncryptOpts:
44
+ kmsProviders:
45
+ aws: {} # Credentials filled in from environment.
46
+ operations:
47
+ - name: find
48
+ arguments:
49
+ filter: { unencrypted: { $bitsAllClear: 35 }}
50
+ result: []
51
+ - name: find
52
+ arguments:
53
+ filter: { encrypted_string: { $bitsAllClear: 35 }}
54
+ result:
55
+ errorContains: "Invalid match expression operator on encrypted field"
56
+ - name: find
57
+ arguments:
58
+ filter: { unencrypted: { $bitsAllSet: 35 }}
59
+ result: []
60
+ - name: find
61
+ arguments:
62
+ filter: { encrypted_string: { $bitsAllSet: 35 }}
63
+ result:
64
+ errorContains: "Invalid match expression operator on encrypted field"
65
+ - name: find
66
+ arguments:
67
+ filter: { unencrypted: { $bitsAnyClear: 35 }}
68
+ result: []
69
+ - name: find
70
+ arguments:
71
+ filter: { encrypted_string: { $bitsAnyClear: 35 }}
72
+ result:
73
+ errorContains: "Invalid match expression operator on encrypted field"
74
+ - name: find
75
+ arguments:
76
+ filter: { unencrypted: { $bitsAnySet: 35 }}
77
+ result: []
78
+ - name: find
79
+ arguments:
80
+ filter: { encrypted_string: { $bitsAnySet: 35 }}
81
+ result:
82
+ errorContains: "Invalid match expression operator on encrypted field"
83
+ - description: "geo operators succeed on unencrypted, error on encrypted"
84
+ clientOptions:
85
+ autoEncryptOpts:
86
+ kmsProviders:
87
+ aws: {} # Credentials filled in from environment.
88
+ operations:
89
+ - name: find
90
+ arguments:
91
+ filter: { unencrypted: { $near: [0,0] }}
92
+ result:
93
+ # Still an error because no geo index, but from mongod - not mongocryptd.
94
+ errorContains: "unable to find index"
95
+ - name: find
96
+ arguments:
97
+ filter: { encrypted_string: { $near: [0,0] }}
98
+ result:
99
+ errorContains: "Invalid match expression operator on encrypted field"
100
+ - name: find
101
+ arguments:
102
+ filter: { unencrypted: { $nearSphere: [0,0] }}
103
+ result:
104
+ # Still an error because no geo index, but from mongod - not mongocryptd.
105
+ errorContains: "unable to find index"
106
+ - name: find
107
+ arguments:
108
+ filter: { encrypted_string: { $nearSphere: [0,0] }}
109
+ result:
110
+ errorContains: "Invalid match expression operator on encrypted field"
111
+ - name: find
112
+ arguments:
113
+ filter: { unencrypted: { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [[ [0,0], [1,0], [1,1], [0,0] ]] }} }}
114
+ result: []
115
+ - name: find
116
+ arguments:
117
+ filter: { encrypted_string: { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [[ [0,0], [1,0], [1,1], [0,0] ]] }} }}
118
+ result:
119
+ errorContains: "Invalid match expression operator on encrypted field"
120
+ - name: find
121
+ arguments:
122
+ filter: { unencrypted: { $geoWithin: { $geometry: { type: "Polygon", coordinates: [[ [0,0], [1,0], [1,1], [0,0] ]] }} }}
123
+ result: []
124
+ - name: find
125
+ arguments:
126
+ filter: { encrypted_string: { $geoWithin: { $geometry: { type: "Polygon", coordinates: [[ [0,0], [1,0], [1,1], [0,0] ]] }} }}
127
+ result:
128
+ errorContains: "Invalid match expression operator on encrypted field"
129
+ - description: "inequality operators succeed on unencrypted, error on encrypted"
130
+ clientOptions:
131
+ autoEncryptOpts:
132
+ kmsProviders:
133
+ aws: {} # Credentials filled in from environment.
134
+ operations:
135
+ - name: find
136
+ arguments:
137
+ filter: { unencrypted: { $gt: 1 }}
138
+ result: []
139
+ - name: find
140
+ arguments:
141
+ filter: { encrypted_string: { $gt: 1 }}
142
+ result:
143
+ errorContains: "Invalid match expression operator on encrypted field"
144
+ - name: find
145
+ arguments:
146
+ filter: { unencrypted: { $lt: 1 }}
147
+ result: []
148
+ - name: find
149
+ arguments:
150
+ filter: { encrypted_string: { $lt: 1 }}
151
+ result:
152
+ errorContains: "Invalid match expression operator on encrypted field"
153
+ - name: find
154
+ arguments:
155
+ filter: { unencrypted: { $gte: 1 }}
156
+ result: []
157
+ - name: find
158
+ arguments:
159
+ filter: { encrypted_string: { $gte: 1 }}
160
+ result:
161
+ errorContains: "Invalid match expression operator on encrypted field"
162
+ - name: find
163
+ arguments:
164
+ filter: { unencrypted: { $lte: 1 }}
165
+ result: []
166
+ - name: find
167
+ arguments:
168
+ filter: { encrypted_string: { $lte: 1 }}
169
+ result:
170
+ errorContains: "Invalid match expression operator on encrypted field"
171
+ - description: "other misc operators succeed on unencrypted, error on encrypted"
172
+ clientOptions:
173
+ autoEncryptOpts:
174
+ kmsProviders:
175
+ aws: {} # Credentials filled in from environment.
176
+ operations:
177
+ - name: find
178
+ arguments:
179
+ filter: { unencrypted: { $mod: [3, 1] }}
180
+ result: []
181
+ - name: find
182
+ arguments:
183
+ filter: { encrypted_string: { $mod: [3, 1] }}
184
+ result:
185
+ errorContains: "Invalid match expression operator on encrypted field"
186
+ - name: find
187
+ arguments:
188
+ filter: { unencrypted: { $regex: "pattern", $options: "" }}
189
+ result: []
190
+ - name: find
191
+ arguments:
192
+ filter: { encrypted_string: { $regex: "pattern", $options: "" }}
193
+ result:
194
+ errorContains: "Invalid match expression operator on encrypted field"
195
+ - name: find
196
+ arguments:
197
+ filter: { unencrypted: { $size: 2 }}
198
+ result: []
199
+ - name: find
200
+ arguments:
201
+ filter: { encrypted_string: { $size: 2 }}
202
+ result:
203
+ errorContains: "Invalid match expression operator on encrypted field"
204
+ - name: find
205
+ arguments:
206
+ filter: { unencrypted: { $type: 2 }}
207
+ result: []
208
+ - name: find
209
+ arguments:
210
+ filter: { encrypted_string: { $type: 2 }}
211
+ result:
212
+ errorContains: "Invalid match expression operator on encrypted field"
213
+ - name: find
214
+ arguments:
215
+ filter: { unencrypted: { $eq: null }}
216
+ result:
217
+ - &doc0 { _id: 1, encrypted_string: "string0" }
218
+ - &doc1 { _id: 2, encrypted_string: "string1" }
219
+ - name: find
220
+ arguments:
221
+ filter: { encrypted_string: { $eq: null }}
222
+ result:
223
+ errorContains: "Illegal equality to null predicate for encrypted field"
224
+ - name: find
225
+ arguments:
226
+ filter: { unencrypted: { $in: [null] }}
227
+ result:
228
+ - *doc0
229
+ - *doc1
230
+ - name: find
231
+ arguments:
232
+ filter: { encrypted_string: { $in: [null] }}
233
+ result:
234
+ errorContains: "Illegal equality to null inside $in against an encrypted field"
235
+ - description: "$addToSet succeeds on unencrypted, error on encrypted"
236
+ clientOptions:
237
+ autoEncryptOpts:
238
+ kmsProviders:
239
+ aws: {} # Credentials filled in from environment.
240
+ operations:
241
+ - name: updateOne
242
+ arguments:
243
+ filter: { }
244
+ update: { $addToSet: { "unencrypted": ["a"]}}
245
+ result:
246
+ matchedCount: 1
247
+ modifiedCount: 1
248
+ upsertedCount: 0
249
+ - name: updateOne
250
+ arguments:
251
+ filter: { }
252
+ update: { $addToSet: { "encrypted_string": ["a"]}}
253
+ result:
254
+ errorContains: "$addToSet not allowed on encrypted values"
255
+ - description: "$inc succeeds on unencrypted, error on encrypted"
256
+ clientOptions:
257
+ autoEncryptOpts:
258
+ kmsProviders:
259
+ aws: {} # Credentials filled in from environment.
260
+ operations:
261
+ - name: updateOne
262
+ arguments:
263
+ filter: { }
264
+ update: { $inc: { "unencrypted": 1}}
265
+ result:
266
+ matchedCount: 1
267
+ modifiedCount: 1
268
+ upsertedCount: 0
269
+ - name: updateOne
270
+ arguments:
271
+ filter: { }
272
+ update: { $inc: { "encrypted_string": 1}}
273
+ result:
274
+ errorContains: "$inc and $mul not allowed on encrypted values"
275
+ - description: "$mul succeeds on unencrypted, error on encrypted"
276
+ clientOptions:
277
+ autoEncryptOpts:
278
+ kmsProviders:
279
+ aws: {} # Credentials filled in from environment.
280
+ operations:
281
+ - name: updateOne
282
+ arguments:
283
+ filter: { }
284
+ update: { $mul: { "unencrypted": 1}}
285
+ result:
286
+ matchedCount: 1
287
+ modifiedCount: 1
288
+ upsertedCount: 0
289
+ - name: updateOne
290
+ arguments:
291
+ filter: { }
292
+ update: { $mul: { "encrypted_string": 1}}
293
+ result:
294
+ errorContains: "$inc and $mul not allowed on encrypted values"
295
+ - description: "$max succeeds on unencrypted, error on encrypted"
296
+ clientOptions:
297
+ autoEncryptOpts:
298
+ kmsProviders:
299
+ aws: {} # Credentials filled in from environment.
300
+ operations:
301
+ - name: updateOne
302
+ arguments:
303
+ filter: { }
304
+ update: { $max: { "unencrypted": 1}}
305
+ result:
306
+ matchedCount: 1
307
+ modifiedCount: 1
308
+ upsertedCount: 0
309
+ - name: updateOne
310
+ arguments:
311
+ filter: { }
312
+ update: { $max: { "encrypted_string": 1}}
313
+ result:
314
+ errorContains: "$max and $min not allowed on encrypted values"
315
+ - description: "$min succeeds on unencrypted, error on encrypted"
316
+ clientOptions:
317
+ autoEncryptOpts:
318
+ kmsProviders:
319
+ aws: {} # Credentials filled in from environment.
320
+ operations:
321
+ - name: updateOne
322
+ arguments:
323
+ filter: { }
324
+ update: { $min: { "unencrypted": 1}}
325
+ result:
326
+ matchedCount: 1
327
+ modifiedCount: 1
328
+ upsertedCount: 0
329
+ - name: updateOne
330
+ arguments:
331
+ filter: { }
332
+ update: { $min: { "encrypted_string": 1}}
333
+ result:
334
+ errorContains: "$max and $min not allowed on encrypted values"
335
+ - description: "$currentDate succeeds on unencrypted, error on encrypted"
336
+ clientOptions:
337
+ autoEncryptOpts:
338
+ kmsProviders:
339
+ aws: {} # Credentials filled in from environment.
340
+ operations:
341
+ - name: updateOne
342
+ arguments:
343
+ filter: { }
344
+ update: { $currentDate: { "unencrypted": true}}
345
+ result:
346
+ matchedCount: 1
347
+ modifiedCount: 1
348
+ upsertedCount: 0
349
+ - name: updateOne
350
+ arguments:
351
+ filter: { }
352
+ update: { $currentDate: { "encrypted_string": true }}
353
+ result:
354
+ errorContains: "$currentDate not allowed on encrypted values"
355
+ - description: "$pop succeeds on unencrypted, error on encrypted"
356
+ clientOptions:
357
+ autoEncryptOpts:
358
+ kmsProviders:
359
+ aws: {} # Credentials filled in from environment.
360
+ operations:
361
+ - name: updateOne
362
+ arguments:
363
+ filter: { }
364
+ update: { $pop: { "unencrypted": 1}}
365
+ result:
366
+ matchedCount: 1
367
+ modifiedCount: 0
368
+ upsertedCount: 0
369
+ - name: updateOne
370
+ arguments:
371
+ filter: { }
372
+ update: { $pop: { "encrypted_string": 1 }}
373
+ result:
374
+ errorContains: "$pop not allowed on encrypted values"
375
+ - description: "$pull succeeds on unencrypted, error on encrypted"
376
+ clientOptions:
377
+ autoEncryptOpts:
378
+ kmsProviders:
379
+ aws: {} # Credentials filled in from environment.
380
+ operations:
381
+ - name: updateOne
382
+ arguments:
383
+ filter: { }
384
+ update: { $pull: { "unencrypted": 1}}
385
+ result:
386
+ matchedCount: 1
387
+ modifiedCount: 0
388
+ upsertedCount: 0
389
+ - name: updateOne
390
+ arguments:
391
+ filter: { }
392
+ update: { $pull: { "encrypted_string": 1 }}
393
+ result:
394
+ errorContains: "$pull not allowed on encrypted values"
395
+ - description: "$pullAll succeeds on unencrypted, error on encrypted"
396
+ clientOptions:
397
+ autoEncryptOpts:
398
+ kmsProviders:
399
+ aws: {} # Credentials filled in from environment.
400
+ operations:
401
+ - name: updateOne
402
+ arguments:
403
+ filter: { }
404
+ update: { $pullAll: { "unencrypted": [1] }}
405
+ result:
406
+ matchedCount: 1
407
+ modifiedCount: 0
408
+ upsertedCount: 0
409
+ - name: updateOne
410
+ arguments:
411
+ filter: { }
412
+ update: { $pullAll: { "encrypted_string": [1] }}
413
+ result:
414
+ errorContains: "$pullAll not allowed on encrypted values"
415
+ - description: "$push succeeds on unencrypted, error on encrypted"
416
+ clientOptions:
417
+ autoEncryptOpts:
418
+ kmsProviders:
419
+ aws: {} # Credentials filled in from environment.
420
+ operations:
421
+ - name: updateOne
422
+ arguments:
423
+ filter: { }
424
+ update: { $push: { "unencrypted": 1}}
425
+ result:
426
+ matchedCount: 1
427
+ modifiedCount: 1
428
+ upsertedCount: 0
429
+ - name: updateOne
430
+ arguments:
431
+ filter: { }
432
+ update: { $push: { "encrypted_string": 1 }}
433
+ result:
434
+ errorContains: "$push not allowed on encrypted values"
435
+ - description: "array filters on encrypted fields does not error in mongocryptd, but errors in mongod"
436
+ clientOptions:
437
+ autoEncryptOpts:
438
+ kmsProviders:
439
+ aws: {} # Credentials filled in from environment.
440
+ operations:
441
+ - name: updateOne
442
+ arguments:
443
+ filter: { }
444
+ update: { $set : { "encrypted_string.$[i].x": 1 }}
445
+ arrayFilters: [{ i.x: 1 }]
446
+ result:
447
+ errorContains: "Array update operations not allowed on encrypted values"
448
+ - description: "positional operator succeeds on unencrypted, errors on encrypted"
449
+ clientOptions:
450
+ autoEncryptOpts:
451
+ kmsProviders:
452
+ aws: {} # Credentials filled in from environment.
453
+ operations:
454
+ - name: updateOne
455
+ arguments:
456
+ filter: { "unencrypted": 1 }
457
+ update: { $set : { "unencrypted.$": 1 }}
458
+ result:
459
+ matchedCount: 0
460
+ modifiedCount: 0
461
+ upsertedCount: 0
462
+ - name: updateOne
463
+ arguments:
464
+ filter: { "encrypted_string": "abc" }
465
+ update: { $set : { "encrypted_string.$": "abc" }}
466
+ result:
467
+ errorContains: "Cannot encrypt fields below '$' positional update operator"
468
+ - description: "an update that would produce an array on an encrypted field errors"
469
+ clientOptions:
470
+ autoEncryptOpts:
471
+ kmsProviders:
472
+ aws: {} # Credentials filled in from environment.
473
+ operations:
474
+ - name: updateOne
475
+ arguments:
476
+ filter: { }
477
+ update: { $set : { "encrypted_string": [1,2] }}
478
+ result:
479
+ errorContains: "Cannot encrypt element of type array"
480
+ - description: "an insert with encrypted field on _id errors"
481
+ clientOptions:
482
+ autoEncryptOpts:
483
+ kmsProviders:
484
+ aws: {} # Credentials filled in from environment.
485
+ schemaMap:
486
+ "default.default": {'properties': {'_id': {'encrypt': {'keyId': [{'$binary': {'base64': 'AAAAAAAAAAAAAAAAAAAAAA==', 'subType': '04'}}], 'bsonType': 'string', 'algorithm': 'AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic'}}}}
487
+ operations:
488
+ - name: insertOne
489
+ arguments:
490
+ document: { _id: 1 }
491
+ result:
492
+ errorContains: "Invalid schema containing the 'encrypt' keyword."
493
+ - description: "an insert with an array value for an encrypted field fails"
494
+ clientOptions:
495
+ autoEncryptOpts:
496
+ kmsProviders:
497
+ aws: {} # Credentials filled in from environment.
498
+ operations:
499
+ - name: insertOne
500
+ arguments:
501
+ document: { encrypted_string: [ "123", "456"] }
502
+ result:
503
+ errorContains: "Cannot encrypt element of type array"
504
+ - description: "an insert with a Timestamp(0,0) value in the top-level fails"
505
+ clientOptions:
506
+ autoEncryptOpts:
507
+ kmsProviders:
508
+ aws: {} # Credentials filled in from environment.
509
+ operations:
510
+ - name: insertOne
511
+ arguments:
512
+ document: { random: {"$timestamp": {"t": 0, "i": 0 }} }
513
+ result:
514
+ errorContains: "A command that inserts cannot supply Timestamp(0, 0) for an encrypted"
515
+ - description: "distinct with the key referring to a field where the keyID is a JSON Pointer errors"
516
+ clientOptions:
517
+ autoEncryptOpts:
518
+ kmsProviders:
519
+ aws: {} # Credentials filled in from environment.
520
+ operations:
521
+ - name: distinct
522
+ arguments:
523
+ filter: {}
524
+ fieldName: "encrypted_w_altname"
525
+ result:
526
+ errorContains: "The distinct key is not allowed to be marked for encryption with a non-UUID keyId"