mongo 2.17.3 → 2.18.0.beta1

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 (622) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.md +21 -37
  4. data/lib/mongo/auth/base.rb +8 -1
  5. data/lib/mongo/auth.rb +12 -1
  6. data/lib/mongo/bulk_write/result.rb +10 -1
  7. data/lib/mongo/bulk_write/result_combiner.rb +2 -4
  8. data/lib/mongo/bulk_write.rb +108 -28
  9. data/lib/mongo/client.rb +114 -12
  10. data/lib/mongo/client_encryption.rb +30 -9
  11. data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
  12. data/lib/mongo/cluster.rb +20 -24
  13. data/lib/mongo/collection/helpers.rb +43 -0
  14. data/lib/mongo/collection/queryable_encryption.rb +122 -0
  15. data/lib/mongo/collection/view/aggregation.rb +19 -16
  16. data/lib/mongo/collection/view/change_stream.rb +56 -23
  17. data/lib/mongo/collection/view/explainable.rb +1 -1
  18. data/lib/mongo/collection/view/iterable.rb +2 -3
  19. data/lib/mongo/collection/view/map_reduce.rb +18 -9
  20. data/lib/mongo/collection/view/readable.rb +19 -23
  21. data/lib/mongo/collection/view/writable.rb +133 -40
  22. data/lib/mongo/collection.rb +108 -48
  23. data/lib/mongo/config/options.rb +62 -0
  24. data/lib/mongo/config/validators/option.rb +26 -0
  25. data/lib/mongo/config.rb +31 -0
  26. data/lib/mongo/crypt/auto_encrypter.rb +79 -6
  27. data/lib/mongo/crypt/binding.rb +395 -143
  28. data/lib/mongo/crypt/context.rb +5 -2
  29. data/lib/mongo/crypt/data_key_context.rb +7 -104
  30. data/lib/mongo/crypt/encryption_io.rb +28 -60
  31. data/lib/mongo/crypt/explicit_encrypter.rb +27 -25
  32. data/lib/mongo/crypt/explicit_encryption_context.rb +31 -3
  33. data/lib/mongo/crypt/handle.rb +102 -79
  34. data/lib/mongo/crypt/hooks.rb +25 -2
  35. data/lib/mongo/crypt/kms/aws.rb +128 -0
  36. data/lib/mongo/crypt/kms/azure.rb +136 -0
  37. data/lib/mongo/crypt/kms/credentials.rb +81 -0
  38. data/lib/mongo/crypt/kms/gcp.rb +182 -0
  39. data/lib/mongo/crypt/kms/kmip.rb +110 -0
  40. data/lib/mongo/crypt/kms/local.rb +74 -0
  41. data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
  42. data/lib/mongo/crypt/kms.rb +117 -0
  43. data/lib/mongo/crypt.rb +1 -0
  44. data/lib/mongo/cursor/kill_spec.rb +27 -6
  45. data/lib/mongo/cursor.rb +21 -16
  46. data/lib/mongo/database/view.rb +6 -3
  47. data/lib/mongo/database.rb +73 -12
  48. data/lib/mongo/dbref.rb +1 -105
  49. data/lib/mongo/error/bulk_write_error.rb +31 -4
  50. data/lib/mongo/error/invalid_config_option.rb +20 -0
  51. data/lib/mongo/error/invalid_replacement_document.rb +27 -9
  52. data/lib/mongo/error/invalid_update_document.rb +27 -7
  53. data/lib/mongo/error/labelable.rb +72 -0
  54. data/lib/mongo/error/missing_connection.rb +25 -0
  55. data/lib/mongo/error/notable.rb +7 -0
  56. data/lib/mongo/error/operation_failure.rb +34 -86
  57. data/lib/mongo/error/read_write_retryable.rb +108 -0
  58. data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
  59. data/lib/mongo/error.rb +5 -37
  60. data/lib/mongo/index/view.rb +22 -7
  61. data/lib/mongo/monitoring/event/command_failed.rb +8 -2
  62. data/lib/mongo/monitoring/event/command_started.rb +1 -1
  63. data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
  64. data/lib/mongo/monitoring/publishable.rb +9 -5
  65. data/lib/mongo/operation/collections_info/result.rb +5 -2
  66. data/lib/mongo/operation/command/op_msg.rb +6 -0
  67. data/lib/mongo/operation/context.rb +24 -6
  68. data/lib/mongo/operation/count/op_msg.rb +4 -1
  69. data/lib/mongo/operation/create/op_msg.rb +16 -1
  70. data/lib/mongo/operation/create_index/op_msg.rb +2 -1
  71. data/lib/mongo/operation/delete/op_msg.rb +1 -0
  72. data/lib/mongo/operation/delete.rb +0 -1
  73. data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
  74. data/lib/mongo/operation/get_more/command_builder.rb +5 -1
  75. data/lib/mongo/operation/insert/bulk_result.rb +5 -1
  76. data/lib/mongo/operation/insert/command.rb +0 -4
  77. data/lib/mongo/operation/insert/op_msg.rb +6 -3
  78. data/lib/mongo/operation/insert/result.rb +6 -3
  79. data/lib/mongo/operation/insert.rb +0 -1
  80. data/lib/mongo/operation/kill_cursors.rb +0 -1
  81. data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
  82. data/lib/mongo/operation/map_reduce/result.rb +16 -0
  83. data/lib/mongo/operation/result.rb +21 -5
  84. data/lib/mongo/operation/shared/executable.rb +21 -6
  85. data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
  86. data/lib/mongo/operation/shared/response_handling.rb +6 -5
  87. data/lib/mongo/operation/shared/sessions_supported.rb +3 -7
  88. data/lib/mongo/operation/shared/write.rb +18 -12
  89. data/lib/mongo/operation/update/op_msg.rb +2 -1
  90. data/lib/mongo/operation/update.rb +0 -1
  91. data/lib/mongo/protocol/caching_hash.rb +69 -0
  92. data/lib/mongo/protocol/msg.rb +37 -1
  93. data/lib/mongo/protocol.rb +1 -0
  94. data/lib/mongo/query_cache.rb +15 -0
  95. data/lib/mongo/retryable.rb +78 -30
  96. data/lib/mongo/server/connection.rb +33 -0
  97. data/lib/mongo/server/connection_base.rb +2 -0
  98. data/lib/mongo/server/connection_common.rb +4 -1
  99. data/lib/mongo/server/connection_pool.rb +69 -42
  100. data/lib/mongo/server/description/features.rb +3 -1
  101. data/lib/mongo/server/description.rb +7 -2
  102. data/lib/mongo/server/monitor/connection.rb +5 -10
  103. data/lib/mongo/server/monitor.rb +21 -13
  104. data/lib/mongo/server/push_monitor.rb +9 -3
  105. data/lib/mongo/server.rb +9 -5
  106. data/lib/mongo/session/session_pool.rb +8 -0
  107. data/lib/mongo/session.rb +111 -35
  108. data/lib/mongo/socket/ocsp_verifier.rb +4 -5
  109. data/lib/mongo/socket/tcp.rb +3 -0
  110. data/lib/mongo/srv/resolver.rb +24 -3
  111. data/lib/mongo/uri/options_mapper.rb +2 -0
  112. data/lib/mongo/uri/srv_protocol.rb +1 -1
  113. data/lib/mongo/uri.rb +20 -0
  114. data/lib/mongo/version.rb +1 -1
  115. data/lib/mongo.rb +20 -0
  116. data/mongo.gemspec +10 -4
  117. data/spec/README.md +5 -5
  118. data/spec/integration/aws_lambda_examples_spec.rb +68 -0
  119. data/spec/integration/bulk_write_error_message_spec.rb +32 -0
  120. data/spec/integration/bulk_write_spec.rb +0 -16
  121. data/spec/integration/change_stream_spec.rb +6 -5
  122. data/spec/integration/client_construction_spec.rb +1 -1
  123. data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
  124. data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +18 -19
  125. data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
  126. data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
  127. data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
  128. data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
  129. data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
  130. data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
  131. data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
  132. data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
  133. data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
  134. data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
  135. data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
  136. data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
  137. data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +394 -0
  138. data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
  139. data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
  140. data/spec/integration/client_side_encryption/views_spec.rb +1 -1
  141. data/spec/integration/client_update_spec.rb +2 -2
  142. data/spec/integration/crud_spec.rb +12 -0
  143. data/spec/integration/cursor_pinning_spec.rb +3 -3
  144. data/spec/integration/fork_reconnect_spec.rb +15 -8
  145. data/spec/integration/grid_fs_bucket_spec.rb +3 -3
  146. data/spec/integration/ocsp_verifier_spec.rb +1 -0
  147. data/spec/integration/query_cache_spec.rb +34 -30
  148. data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
  149. data/spec/integration/sdam_events_spec.rb +0 -40
  150. data/spec/integration/server_monitor_spec.rb +2 -1
  151. data/spec/integration/size_limit_spec.rb +4 -1
  152. data/spec/integration/snapshot_query_examples_spec.rb +127 -0
  153. data/spec/integration/srv_monitoring_spec.rb +37 -0
  154. data/spec/integration/step_down_spec.rb +20 -4
  155. data/spec/integration/transaction_pinning_spec.rb +2 -2
  156. data/spec/integration/versioned_api_examples_spec.rb +37 -31
  157. data/spec/lite_spec_helper.rb +14 -5
  158. data/spec/mongo/address/ipv6_spec.rb +7 -0
  159. data/spec/mongo/address_spec.rb +7 -0
  160. data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
  161. data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
  162. data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
  163. data/spec/mongo/bulk_write/result_spec.rb +15 -1
  164. data/spec/mongo/bulk_write_spec.rb +128 -20
  165. data/spec/mongo/client_construction_spec.rb +141 -7
  166. data/spec/mongo/client_encryption_spec.rb +11 -11
  167. data/spec/mongo/client_spec.rb +297 -1
  168. data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
  169. data/spec/mongo/cluster_spec.rb +0 -44
  170. data/spec/mongo/collection/view/aggregation_spec.rb +2 -2
  171. data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
  172. data/spec/mongo/collection/view/readable_spec.rb +35 -56
  173. data/spec/mongo/collection/view/writable_spec.rb +144 -32
  174. data/spec/mongo/collection_crud_spec.rb +63 -13
  175. data/spec/mongo/config/options_spec.rb +75 -0
  176. data/spec/mongo/config_spec.rb +73 -0
  177. data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
  178. data/spec/mongo/crypt/auto_encrypter_spec.rb +106 -0
  179. data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
  180. data/spec/mongo/crypt/binding/context_spec.rb +99 -17
  181. data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
  182. data/spec/mongo/crypt/binding/version_spec.rb +25 -0
  183. data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
  184. data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
  185. data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
  186. data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
  187. data/spec/mongo/crypt/explicit_encryption_context_spec.rb +89 -1
  188. data/spec/mongo/crypt/handle_spec.rb +47 -169
  189. data/spec/mongo/crypt/hooks_spec.rb +30 -0
  190. data/spec/mongo/crypt/kms/credentials_spec.rb +404 -0
  191. data/spec/mongo/crypt/kms_spec.rb +59 -0
  192. data/spec/mongo/cursor_spec.rb +37 -51
  193. data/spec/mongo/database_spec.rb +66 -1
  194. data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
  195. data/spec/mongo/index/view_spec.rb +69 -0
  196. data/spec/mongo/operation/create/op_msg_spec.rb +286 -0
  197. data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
  198. data/spec/mongo/operation/delete_spec.rb +0 -30
  199. data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
  200. data/spec/mongo/operation/insert_spec.rb +0 -32
  201. data/spec/mongo/operation/result_spec.rb +20 -0
  202. data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
  203. data/spec/mongo/operation/update_spec.rb +0 -29
  204. data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
  205. data/spec/mongo/protocol/msg_spec.rb +41 -0
  206. data/spec/mongo/query_cache_spec.rb +1 -0
  207. data/spec/mongo/retryable_spec.rb +32 -3
  208. data/spec/mongo/server/connection_auth_spec.rb +3 -1
  209. data/spec/mongo/server/connection_common_spec.rb +13 -1
  210. data/spec/mongo/server/connection_pool_spec.rb +94 -49
  211. data/spec/mongo/server/connection_spec.rb +50 -159
  212. data/spec/mongo/server/description/features_spec.rb +24 -0
  213. data/spec/mongo/server/push_monitor_spec.rb +2 -8
  214. data/spec/mongo/session_spec.rb +26 -6
  215. data/spec/mongo/session_transaction_spec.rb +2 -1
  216. data/spec/mongo/socket/ssl_spec.rb +15 -4
  217. data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
  218. data/spec/mongo/uri_spec.rb +25 -0
  219. data/spec/runners/connection_string.rb +8 -0
  220. data/spec/runners/crud/operation.rb +12 -3
  221. data/spec/runners/crud/requirement.rb +3 -3
  222. data/spec/runners/crud/spec.rb +5 -0
  223. data/spec/runners/crud/verifier.rb +6 -0
  224. data/spec/runners/transactions/test.rb +33 -14
  225. data/spec/runners/transactions.rb +9 -6
  226. data/spec/runners/unified/assertions.rb +59 -10
  227. data/spec/runners/unified/change_stream_operations.rb +9 -0
  228. data/spec/runners/unified/crud_operations.rb +50 -2
  229. data/spec/runners/unified/ddl_operations.rb +20 -0
  230. data/spec/runners/unified/error.rb +2 -1
  231. data/spec/runners/unified/support_operations.rb +5 -2
  232. data/spec/runners/unified/test.rb +19 -4
  233. data/spec/runners/unified.rb +9 -2
  234. data/spec/shared/lib/mrss/constraints.rb +10 -17
  235. data/spec/shared/lib/mrss/docker_runner.rb +21 -3
  236. data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
  237. data/spec/shared/lib/mrss/session_registry.rb +69 -0
  238. data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
  239. data/spec/shared/share/Dockerfile.erb +56 -54
  240. data/spec/shared/shlib/config.sh +27 -0
  241. data/spec/shared/shlib/distro.sh +2 -1
  242. data/spec/shared/shlib/server.sh +46 -21
  243. data/spec/shared/shlib/set_env.sh +40 -5
  244. data/spec/spec_helper.rb +0 -1
  245. data/spec/spec_tests/crud_spec.rb +0 -10
  246. data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
  247. data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
  248. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
  249. data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1068 -0
  250. data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
  251. data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
  252. data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
  253. data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
  254. data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
  255. data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
  256. data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
  257. data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
  258. data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
  259. data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
  260. data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
  261. data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
  262. data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
  263. data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
  264. data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
  265. data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
  266. data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
  267. data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
  268. data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
  269. data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
  270. data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
  271. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
  272. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
  273. data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
  274. data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
  275. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
  276. data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
  277. data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
  278. data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
  279. data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
  280. data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
  281. data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
  282. data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
  283. data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
  284. data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
  285. data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
  286. data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
  287. data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
  288. data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
  289. data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
  290. data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
  291. data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
  292. data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
  293. data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
  294. data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
  295. data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
  296. data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
  297. data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
  298. data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
  299. data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
  300. data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
  301. data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
  302. data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
  303. data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
  304. data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
  305. data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
  306. data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
  307. data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
  308. data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
  309. data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
  310. data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
  311. data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
  312. data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
  313. data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
  314. data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
  315. data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
  316. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
  317. data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
  318. data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
  319. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
  320. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
  321. data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
  322. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
  323. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
  324. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
  325. data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
  326. data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
  327. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
  328. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
  329. data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
  330. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
  331. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
  332. data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
  333. data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
  334. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
  335. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
  336. data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
  337. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
  338. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
  339. data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
  340. data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
  341. data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
  342. data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
  343. data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
  344. data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
  345. data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
  346. data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
  347. data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
  348. data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
  349. data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
  350. data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
  351. data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
  352. data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
  353. data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
  354. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
  355. data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
  356. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
  357. data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
  358. data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
  359. data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
  360. data/spec/spec_tests/data/crud_unified/find.yml +68 -0
  361. data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
  362. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
  363. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
  364. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
  365. data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
  366. data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
  367. data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
  368. data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
  369. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
  370. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
  371. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
  372. data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
  373. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
  374. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
  375. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
  376. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
  377. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
  378. data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
  379. data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
  380. data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
  381. data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
  382. data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
  383. data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
  384. data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
  385. data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
  386. data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
  387. data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
  388. data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
  389. data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
  390. data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
  391. data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
  392. data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
  393. data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
  394. data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
  395. data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
  396. data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
  397. data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
  398. data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
  399. data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
  400. data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
  401. data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
  402. data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
  403. data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
  404. data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
  405. data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
  406. data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
  407. data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
  408. data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
  409. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
  410. data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
  411. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
  412. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
  413. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
  414. data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
  415. data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
  416. data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
  417. data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
  418. data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
  419. data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
  420. data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
  421. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
  422. data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
  423. data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
  424. data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
  425. data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
  426. data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
  427. data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
  428. data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
  429. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
  430. data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
  431. data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
  432. data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
  433. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
  434. data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
  435. data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
  436. data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
  437. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
  438. data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
  439. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
  440. data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
  441. data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
  442. data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
  443. data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
  444. data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
  445. data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
  446. data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
  447. data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
  448. data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
  449. data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
  450. data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
  451. data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
  452. data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
  453. data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
  454. data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
  455. data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
  456. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
  457. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
  458. data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
  459. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
  460. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
  461. data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
  462. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
  463. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
  464. data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
  465. data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
  466. data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
  467. data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
  468. data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
  469. data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
  470. data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
  471. data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
  472. data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
  473. data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
  474. data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
  475. data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
  476. data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
  477. data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
  478. data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
  479. data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
  480. data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
  481. data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
  482. data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
  483. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
  484. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
  485. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
  486. data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
  487. data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
  488. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
  489. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
  490. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
  491. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
  492. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
  493. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
  494. data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
  495. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
  496. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
  497. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
  498. data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
  499. data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
  500. data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
  501. data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
  502. data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
  503. data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
  504. data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
  505. data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
  506. data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
  507. data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
  508. data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
  509. data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
  510. data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
  511. data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
  512. data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
  513. data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
  514. data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
  515. data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
  516. data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
  517. data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
  518. data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
  519. data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
  520. data/spec/spec_tests/retryable_reads_spec.rb +4 -1
  521. data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
  522. data/spec/spec_tests/retryable_writes_spec.rb +4 -1
  523. data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
  524. data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
  525. data/spec/spec_tests/unified_spec.rb +6 -1
  526. data/spec/stress/connection_pool_timing_spec.rb +2 -1
  527. data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
  528. data/spec/support/authorization.rb +1 -1
  529. data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
  530. data/spec/support/certificates/atlas-ocsp.crt +106 -101
  531. data/spec/support/cluster_tools.rb +1 -1
  532. data/spec/support/common_shortcuts.rb +22 -0
  533. data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
  534. data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
  535. data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
  536. data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
  537. data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
  538. data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
  539. data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
  540. data/spec/support/crypt/corpus/corpus.json +4999 -37
  541. data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
  542. data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
  543. data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
  544. data/spec/support/crypt/encryptedFields.json +33 -0
  545. data/spec/support/crypt/keys/key1-document.json +30 -0
  546. data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
  547. data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
  548. data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
  549. data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
  550. data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
  551. data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
  552. data/spec/support/crypt.rb +207 -6
  553. data/spec/support/macros.rb +18 -0
  554. data/spec/support/mongos_macros.rb +17 -0
  555. data/spec/support/shared/scram_conversation.rb +2 -1
  556. data/spec/support/shared/session.rb +13 -7
  557. data/spec/support/spec_config.rb +82 -1
  558. data/spec/support/utils.rb +25 -4
  559. data.tar.gz.sig +0 -0
  560. metadata +1468 -1214
  561. metadata.gz.sig +0 -0
  562. data/lib/mongo/operation/delete/legacy.rb +0 -64
  563. data/lib/mongo/operation/insert/legacy.rb +0 -68
  564. data/lib/mongo/operation/update/legacy/result.rb +0 -112
  565. data/lib/mongo/operation/update/legacy.rb +0 -76
  566. data/spec/mongo/dbref_spec.rb +0 -152
  567. data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
  568. data/spec/spec_tests/change_streams_spec.rb +0 -93
  569. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
  570. data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
  571. data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
  572. data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
  573. data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
  574. data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
  575. data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
  576. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
  577. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
  578. data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
  579. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
  580. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
  581. data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
  582. data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
  583. data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
  584. data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
  585. data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
  586. data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
  587. data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
  588. data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
  589. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
  590. data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
  591. data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
  592. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
  593. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
  594. data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
  595. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
  596. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
  597. data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
  598. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
  599. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
  600. data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
  601. data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
  602. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
  603. data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
  604. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
  605. data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
  606. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
  607. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
  608. data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
  609. data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
  610. data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
  611. data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
  612. data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
  613. data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
  614. data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
  615. data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
  616. data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
  617. data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
  618. data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
  619. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
  620. data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
  621. data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
  622. data/spec/support/session_registry.rb +0 -55
@@ -16,20 +16,28 @@
16
16
  # limitations under the License.
17
17
 
18
18
  unless ENV['LIBMONGOCRYPT_PATH']
19
- # It seems that MRI maintains autoload configuration for a module until
20
- # that module is defined, but JRuby removes autoload configuration as soon
21
- # as the referenced file is attempted to be loaded, even if the module
22
- # never ends up being defined.
23
- if BSON::Environment.jruby?
24
- module Mongo
25
- module Crypt
26
- autoload :Binding, 'mongo/crypt/binding'
19
+ begin
20
+ require 'libmongocrypt_helper'
21
+ rescue LoadError => e
22
+ # It seems that MRI maintains autoload configuration for a module until
23
+ # that module is defined, but JRuby removes autoload configuration as soon
24
+ # as the referenced file is attempted to be loaded, even if the module
25
+ # never ends up being defined.
26
+ if BSON::Environment.jruby?
27
+ module Mongo
28
+ module Crypt
29
+ autoload :Binding, 'mongo/crypt/binding'
30
+ end
27
31
  end
28
32
  end
29
- end
30
33
 
31
- raise LoadError, "Cannot load Mongo::Crypt::Binding because there is no path " +
32
- "to libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable."
34
+ # JRuby 9.3.2.0 replaces a LoadError with our custom message with a
35
+ # generic NameError, when this load is attempted as part of autoloading
36
+ # process. JRuby 9.2.20.0 propagates LoadError as expected.
37
+ raise LoadError, "Cannot load Mongo::Crypt::Binding because there is no path " +
38
+ "to libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable " +
39
+ "and libmongocrypt-helper is not installed: #{e.class}: #{e}"
40
+ end
33
41
  end
34
42
 
35
43
  require 'ffi'
@@ -50,15 +58,33 @@ module Mongo
50
58
  class Binding
51
59
  extend FFI::Library
52
60
 
53
- begin
54
- ffi_lib ENV['LIBMONGOCRYPT_PATH']
55
- rescue LoadError => e
56
- Crypt.reset_autoload
57
- raise LoadError, "Cannot load Mongo::Crypt::Binding because the path to " +
58
- "libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable " +
59
- "is invalid: #{ENV['LIBMONGOCRYPT_PATH']}\n\n#{e.class}: #{e.message}"
61
+ if ENV['LIBMONGOCRYPT_PATH']
62
+ begin
63
+ ffi_lib ENV['LIBMONGOCRYPT_PATH']
64
+ rescue LoadError => e
65
+ Crypt.reset_autoload
66
+ raise LoadError, "Cannot load Mongo::Crypt::Binding because the path to " +
67
+ "libmongocrypt specified in the LIBMONGOCRYPT_PATH environment variable " +
68
+ "is invalid: #{ENV['LIBMONGOCRYPT_PATH']}\n\n#{e.class}: #{e.message}"
69
+ end
70
+ else
71
+ begin
72
+ ffi_lib LibmongocryptHelper.libmongocrypt_path
73
+ rescue LoadError => e
74
+ Crypt.reset_autoload
75
+ raise LoadError, "Cannot load Mongo::Crypt::Binding because the path to " +
76
+ "libmongocrypt specified in libmongocrypt-helper " +
77
+ "is invalid: #{LibmongocryptHelper.libmongocrypt_path}\n\n#{e.class}: #{e.message}"
78
+ end
60
79
  end
61
80
 
81
+ # Minimum version of libmongocrypt required by this version of the driver.
82
+ # An attempt to use the driver with any previous version of libmongocrypt
83
+ # will cause a `LoadError`.
84
+ #
85
+ # @api private
86
+ MIN_LIBMONGOCRYPT_VERSION = Gem::Version.new("1.5.0.alpha")
87
+
62
88
  # @!method self.mongocrypt_version(len)
63
89
  # @api private
64
90
  #
@@ -68,6 +94,23 @@ module Mongo
68
94
  # @return [ String ] A version string for libmongocrypt.
69
95
  attach_function :mongocrypt_version, [:pointer], :string
70
96
 
97
+ # Validates if provided version of libmongocrypt is valid, i.e. equal or
98
+ # greater than minimum required version. Raises a LoadError if not.
99
+ #
100
+ # @param [ String ] lmc_version String representing libmongocrypt version.
101
+ #
102
+ # @raise [ LoadError ] if given version is lesser than minimum required version.
103
+ #
104
+ # @api private
105
+ def self.validate_version(lmc_version)
106
+ if (actual_version = Gem::Version.new(lmc_version)) < MIN_LIBMONGOCRYPT_VERSION
107
+ raise LoadError, "libmongocrypt version #{MIN_LIBMONGOCRYPT_VERSION} or above is required, " +
108
+ "but version #{actual_version} was found."
109
+ end
110
+ end
111
+
112
+ validate_version(mongocrypt_version(nil))
113
+
71
114
  # @!method self.mongocrypt_binary_new
72
115
  # @api private
73
116
  #
@@ -253,69 +296,36 @@ module Mongo
253
296
  end
254
297
  end
255
298
 
256
- # @!method self.mongocrypt_setopt_kms_provider_aws(crypt, aws_access_key_id, aws_access_key_id_len, aws_secret_access_key, aws_secret_access_key_len)
299
+ # @!method self.mongocrypt_setopt_kms_providers(crypt, kms_providers)
257
300
  # @api private
258
301
  #
259
- # Configure mongocrypt_t object with AWS KMS provider options.
302
+ # Configure KMS providers with a BSON document.
260
303
  # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
261
- # @param [ String ] aws_access_key_id The AWS access key id.
262
- # @param [ Integer ] aws_access_key_id_len The length of the AWS access
263
- # key string (or -1 for a null-terminated string).
264
- # @param [ String ] aws_secret_access_key The AWS secret access key.
265
- # @param [ Integer ] aws_secret_access_key_len The length of the AWS
266
- # secret access key (or -1 for a null-terminated string).
267
- # @return [ Boolean ] Returns whether the option was set successfully.
268
- attach_function(
269
- :mongocrypt_setopt_kms_provider_aws,
270
- [:pointer, :string, :int, :string, :int],
271
- :bool
272
- )
273
-
274
- # Configure the Handle object with AWS KMS provider options
275
- #
276
- # @param [ Mongo::Crypt::Handle ] handle
277
- # @param [ String ] aws_access_key The AWS access key
278
- # @param [ String ] aws_secret_access_key The AWS secret access key
279
- #
280
- # @raise [ Mongo::Error::CryptError ] If the option is not set successfully
281
- def self.setopt_kms_provider_aws(handle,
282
- aws_access_key, aws_secret_access_key
283
- )
284
- check_status(handle) do
285
- mongocrypt_setopt_kms_provider_aws(
286
- handle.ref,
287
- aws_access_key,
288
- -1,
289
- aws_secret_access_key,
290
- -1
291
- )
292
- end
293
- end
294
-
295
- # @!method self.mongocrypt_setopt_kms_provider_local(crypt, key)
296
- # @api private
304
+ # @param [ FFI::Pointer ] kms_providers A pointer to a
305
+ # mongocrypt_binary_t object that references a BSON document mapping
306
+ # the KMS provider names to credentials.
307
+ # @note Do not initialize ctx before calling this method.
297
308
  #
298
- # Configure mongocrypt_t object to take local KSM provider options.
299
- # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
300
- # @param [ FFI::Pointer ] key A pointer to a mongocrypt_binary_t object
301
- # that references the 96-byte local master key.
302
- # @return [ Boolean ] Returns whether the option was set successfully.
309
+ # @returns [ true | false ] Returns whether the options was set successfully.
303
310
  attach_function(
304
- :mongocrypt_setopt_kms_provider_local,
311
+ :mongocrypt_setopt_kms_providers,
305
312
  [:pointer, :pointer],
306
313
  :bool
307
314
  )
308
315
 
309
- # Set local KMS provider options on the Mongo::Crypt::Handle object
316
+ # Set KMS providers options on the Mongo::Crypt::Handle object
310
317
  #
311
318
  # @param [ Mongo::Crypt::Handle ] handle
312
- # @param [ String ] master_key The 96-byte local KMS master key
319
+ # @param [ BSON::Document ] kms_providers BSON document mapping
320
+ # the KMS provider names to credentials.
313
321
  #
314
322
  # @raise [ Mongo::Error::CryptError ] If the option is not set successfully
315
- def self.setopt_kms_provider_local(handle, master_key)
316
- Binary.wrap_string(master_key) do |master_key_p|
323
+ def self.setopt_kms_providers(handle, kms_providers)
324
+ validate_document(kms_providers)
325
+ data = kms_providers.to_bson.to_s
326
+ Binary.wrap_string(data) do |data_p|
317
327
  check_status(handle) do
318
- mongocrypt_setopt_kms_provider_local(handle.ref, master_key_p)
328
+ mongocrypt_setopt_kms_providers(handle.ref, data_p)
319
329
  end
320
330
  end
321
331
  end
@@ -496,95 +506,36 @@ module Mongo
496
506
  end
497
507
  end
498
508
 
499
- # @!method self.mongocrypt_ctx_setopt_masterkey_aws(ctx, region, region_len, arn, arn_len)
500
- # @api private
501
- #
502
- # Configure the ctx to take a master key from AWS.
503
- # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_object.
504
- # @param [ String ] region The AWS region.
505
- # @param [ Integer ] region_len The length of the region string (or -1
506
- # for a null-terminated string).
507
- # @param [ String ] arn The Amazon Resource Name (ARN) of the mater key.
508
- # @param [ Integer ] arn_len The length of the ARN (or -1 for a
509
- # null-terminated string).
510
- # @return [ Boolean ] Returns whether the option was set successfully.
511
- attach_function(
512
- :mongocrypt_ctx_setopt_masterkey_aws,
513
- [:pointer, :string, :int, :string, :int],
514
- :bool
515
- )
516
-
517
- # Configure the Context object to take a master key from AWS
518
- #
519
- # @param [ Mongo::Crypt::Context ] context
520
- # @param [ String ] region The AWS region (e.g. "us-east-2")
521
- # @param [ String ] arn The master key Amazon Resource Name
522
- #
523
- # @raise [ Mongo::Error::CryptError ] If the operation failed
524
- def self.ctx_setopt_master_key_aws(context, region, arn)
525
- check_ctx_status(context) do
526
- mongocrypt_ctx_setopt_masterkey_aws(
527
- context.ctx_p,
528
- region,
529
- -1,
530
- arn,
531
- -1
532
- )
533
- end
534
- end
535
-
536
- # @!method self.mongocrypt_ctx_setopt_masterkey_aws_endpoint(ctx, endpoint, endpoint_len)
537
- # @api private
538
- #
539
- # Set a custom endpoint at which to fetch the AWS master key
540
- # @param [ FFI::Pointer ] ctx
541
- # @param [ String ] endpoint The custom endpoint.
542
- # @param [ Integer ] endpoint_len The length of the endpoint string (or
543
- # -1 for a null-terminated string).
544
- # @return [ Boolean ] Returns whether the option was set successfully.
545
- attach_function(
546
- :mongocrypt_ctx_setopt_masterkey_aws_endpoint,
547
- [:pointer, :string, :int],
548
- :bool
549
- )
550
-
551
- # Configure the Context object to take a master key from AWS
552
- #
553
- # @param [ Mongo::Crypt::Context ] context
554
- # @param [ String ] endpoint The custom AWS master key endpoint
555
- #
556
- # @raise [ Mongo::Error::CryptError ] If the operation failed
557
- def self.ctx_setopt_master_key_aws_endpoint(context, endpoint)
558
- check_ctx_status(context) do
559
- mongocrypt_ctx_setopt_masterkey_aws_endpoint(
560
- context.ctx_p,
561
- endpoint,
562
- -1,
563
- )
564
- end
565
- end
566
-
567
- # @!method self.mongocrypt_ctx_setopt_masterkey_local(ctx)
509
+ # @!method self.mongocrypt_ctx_setopt_key_encryption_key(ctx)
568
510
  # @api private
569
511
  #
570
- # Set the ctx to take a local master key.
512
+ # Set key encryption key document for creating a data key.
571
513
  # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
514
+ # @param [ FFI::Pointer ] bin A pointer to a mongocrypt_binary_t
515
+ # object that references a BSON document representing the key
516
+ # encryption key document with an additional "provider" field.
572
517
  # @note Do not initialize ctx before calling this method.
573
518
  # @return [ Boolean ] Whether the option was successfully set.
574
519
  attach_function(
575
- :mongocrypt_ctx_setopt_masterkey_local,
576
- [:pointer],
520
+ :mongocrypt_ctx_setopt_key_encryption_key,
521
+ [:pointer, :pointer],
577
522
  :bool
578
523
  )
579
524
 
580
- # Tell the Context object to read the master key from local KMS options
525
+ # Set key encryption key document for creating a data key.
581
526
  #
582
527
  # @param [ Mongo::Crypt::Context ] context
528
+ # @param [ BSON::Document ] key_document BSON document representing the key
529
+ # encryption key document with an additional "provider" field.
583
530
  #
584
531
  # @raise [ Mongo::Error::CryptError ] If the operation failed
585
- def self.ctx_setopt_master_key_local(context)
586
- check_ctx_status(context) do
587
- mongocrypt_ctx_setopt_masterkey_local(context.ctx_p)
532
+ def self.ctx_setopt_key_encryption_key(context, key_document)
533
+ validate_document(key_document)
534
+ data = key_document.to_bson.to_s
535
+ Binary.wrap_string(data) do |data_p|
536
+ check_ctx_status(context) do
537
+ mongocrypt_ctx_setopt_key_encryption_key(context.ctx_p, data_p)
538
+ end
588
539
  end
589
540
  end
590
541
 
@@ -850,6 +801,58 @@ module Mongo
850
801
  end
851
802
  end
852
803
 
804
+ # @!method self.mongocrypt_kms_ctx_get_kms_provider(crypt, kms_providers)
805
+ # @api private
806
+ #
807
+ # Get the KMS provider identifier associated with this KMS request.
808
+ #
809
+ # This is used to conditionally configure TLS connections based on the KMS
810
+ # request. It is useful for KMIP, which authenticates with a client
811
+ # certificate.
812
+ #
813
+ # @param [ FFI::Pointer ] kms Pointer mongocrypt_kms_ctx_t object.
814
+ # @param [ FFI::Pointer ] len (outparam) Receives the length of the
815
+ # returned string. It may be NULL. If it is not NULL, it is set to
816
+ # the length of the returned string without the NULL terminator.
817
+ #
818
+ # @returns [ FFI::Pointer ] One of the NULL terminated static strings: "aws", "azure", "gcp", or
819
+ # "kmip".
820
+ attach_function(
821
+ :mongocrypt_kms_ctx_get_kms_provider,
822
+ [:pointer, :pointer],
823
+ :pointer
824
+ )
825
+
826
+ # Get the KMS provider identifier associated with this KMS request.
827
+ #
828
+ # This is used to conditionally configure TLS connections based on the KMS
829
+ # request. It is useful for KMIP, which authenticates with a client
830
+ # certificate.
831
+ #
832
+ # @param [ FFI::Pointer ] kms Pointer mongocrypt_kms_ctx_t object.
833
+ #
834
+ # @returns [ Symbol | nil ] KMS provider identifier.
835
+ def self.kms_ctx_get_kms_provider(kms_context)
836
+ len_ptr = FFI::MemoryPointer.new(:uint32, 1)
837
+ provider = mongocrypt_kms_ctx_get_kms_provider(
838
+ kms_context.kms_ctx_p,
839
+ len_ptr
840
+ )
841
+ if len_ptr.nil?
842
+ nil
843
+ else
844
+ len = if BSON::Environment.jruby?
845
+ # JRuby FFI implementation does not have `read(type)` method, but it
846
+ # has this `get_uint32`.
847
+ len_ptr.get_uint32
848
+ else
849
+ # For MRI we use a documented `read` method - https://www.rubydoc.info/github/ffi/ffi/FFI%2FPointer:read
850
+ len_ptr.read(:uint32)
851
+ end
852
+ provider.read_string(len).to_sym
853
+ end
854
+ end
855
+
853
856
  # @!method self.mongocrypt_kms_ctx_message(kms, msg)
854
857
  # @api private
855
858
  #
@@ -1174,6 +1177,255 @@ module Mongo
1174
1177
  end
1175
1178
  end
1176
1179
 
1180
+ # @!method self.mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(crypt, sign_rsaes_pkcs1_v1_5, ctx=nil)
1181
+ # @api private
1182
+ #
1183
+ # Set a crypto hook for the RSASSA-PKCS1-v1_5 algorithm with a SHA-256 hash.
1184
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1185
+ # @param [ Proc ] sign_rsaes_pkcs1_v1_5 A RSASSA-PKCS1-v1_5 signing method.
1186
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1187
+ # that may have been set when hooks were enabled.
1188
+ # @return [ Boolean ] Whether setting this option succeeded.
1189
+ attach_function(
1190
+ :mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5,
1191
+ [
1192
+ :pointer,
1193
+ :mongocrypt_hmac_fn,
1194
+ :pointer
1195
+ ],
1196
+ :bool
1197
+ )
1198
+
1199
+ # Set a crypto hook for the RSASSA-PKCS1-v1_5 algorithm with
1200
+ # a SHA-256 hash oh the Handle.
1201
+ #
1202
+ # @param [ Mongo::Crypt::Handle ] handle
1203
+ # @param [ Method ] rsaes_pkcs_signature_cb A RSASSA-PKCS1-v1_5 signing method.
1204
+ #
1205
+ # @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
1206
+ def self.setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(
1207
+ handle,
1208
+ rsaes_pkcs_signature_cb
1209
+ )
1210
+ check_status(handle) do
1211
+ mongocrypt_setopt_crypto_hook_sign_rsaes_pkcs1_v1_5(
1212
+ handle.ref,
1213
+ rsaes_pkcs_signature_cb,
1214
+ nil
1215
+ )
1216
+ end
1217
+ end
1218
+
1219
+ # @!method self.mongocrypt_setopt_encrypted_field_config_map(crypt, efc_map)
1220
+ # @api private
1221
+ #
1222
+ # Set a local EncryptedFieldConfigMap for encryption.
1223
+ #
1224
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1225
+ # @param [ FFI::Pointer ] efc_map A pointer to mongocrypt_binary_t object that
1226
+ # references a BSON document representing the EncryptedFieldConfigMap
1227
+ # supplied by the user. The keys are collection namespaces and values are
1228
+ # EncryptedFieldConfigMap documents.
1229
+ #
1230
+ # @return [ Boolean ] Whether the operation succeeded.
1231
+ attach_function(
1232
+ :mongocrypt_setopt_encrypted_field_config_map,
1233
+ [
1234
+ :pointer,
1235
+ :pointer
1236
+ ],
1237
+ :bool
1238
+ )
1239
+
1240
+ # Set a local EncryptedFieldConfigMap for encryption.
1241
+ #
1242
+ # @param [ Mongo::Crypt::Handle ] handle
1243
+ # @param [ BSON::Document ] efc_map A BSON document representing
1244
+ # the EncryptedFieldConfigMap supplied by the user.
1245
+ # The keys are collection namespaces and values are
1246
+ # EncryptedFieldConfigMap documents.
1247
+ #
1248
+ # @raise [ Mongo::Error::CryptError ] If the operation failed.
1249
+ def self.setopt_encrypted_field_config_map(handle, efc_map)
1250
+ validate_document(efc_map)
1251
+ data = efc_map.to_bson.to_s
1252
+ Binary.wrap_string(data) do |data_p|
1253
+ check_status(handle) do
1254
+ mongocrypt_setopt_encrypted_field_config_map(
1255
+ handle.ref,
1256
+ data_p
1257
+ )
1258
+ end
1259
+ end
1260
+ end
1261
+
1262
+ # @!method self.mongocrypt_setopt_bypass_query_analysis(crypt)
1263
+ # @api private
1264
+ #
1265
+ # Opt into skipping query analysis.
1266
+ #
1267
+ # If opted in:
1268
+ # - The csfle shared library will not attempt to be loaded.
1269
+ # - A mongocrypt_ctx_t will never enter the MONGOCRYPT_CTX_NEED_MARKINGS state.
1270
+ #
1271
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1272
+ attach_function(:mongocrypt_setopt_bypass_query_analysis, [:pointer], :void)
1273
+
1274
+ # Opt-into skipping query analysis.
1275
+ #
1276
+ # If opted in:
1277
+ # - The csfle shared library will not attempt to be loaded.
1278
+ # - A mongocrypt_ctx_t will never enter the MONGOCRYPT_CTX_NEED_MARKINGS state.
1279
+ #
1280
+ # @param [ Mongo::Crypt::Handle ] handle
1281
+ def self.setopt_bypass_query_analysis(handle)
1282
+ mongocrypt_setopt_bypass_query_analysis(handle.ref)
1283
+ end
1284
+
1285
+ # @!method self.mongocrypt_setopt_aes_256_ctr(crypt, aes_256_ctr_encrypt, aes_256_ctr_decrypt, ctx)
1286
+ # @api private
1287
+ #
1288
+ # Set a crypto hook for the AES256-CTR operations.
1289
+ #
1290
+ # @param [ FFI::Pointer ] crypt A pointer to a mongocrypt_t object.
1291
+ # @param [ Proc ] aes_enc_fn An AES-CTR encryption method.
1292
+ # @param [ Proc ] aes_dec_fn An AES-CTR decryption method.
1293
+ # @param [ FFI::Pointer | nil ] ctx An optional pointer to a context object
1294
+ # that may have been set when hooks were enabled.
1295
+ # @return [ Boolean ] Whether setting this option succeeded.
1296
+ attach_function(
1297
+ :mongocrypt_setopt_aes_256_ctr,
1298
+ [
1299
+ :pointer,
1300
+ :mongocrypt_crypto_fn,
1301
+ :mongocrypt_crypto_fn,
1302
+ :pointer
1303
+ ],
1304
+ :bool
1305
+ )
1306
+
1307
+ # Set a crypto hook for the AES256-CTR operations.
1308
+ #
1309
+ # @param [ Mongo::Crypt::Handle ] handle
1310
+ # @param [ Method ] aes_encrypt_cb An AES-CTR encryption method
1311
+ # @param [ Method ] aes_decrypt_cb A AES-CTR decryption method
1312
+ #
1313
+ # @raise [ Mongo::Error::CryptError ] If the callbacks aren't set successfully
1314
+ def self.setopt_aes_256_ctr(handle, aes_ctr_encrypt_cb, aes_ctr_decrypt_cb)
1315
+ check_status(handle) do
1316
+ mongocrypt_setopt_aes_256_ctr(handle.ref,
1317
+ aes_ctr_encrypt_cb, aes_ctr_decrypt_cb, nil
1318
+ )
1319
+ end
1320
+ end
1321
+
1322
+ enum :mongocrypt_index_type, [
1323
+ :none, 1,
1324
+ :equality
1325
+ ]
1326
+
1327
+ # @!method self.mongocrypt_ctx_setopt_index_type(ctx, mongocrypt_index_type)
1328
+ # @api private
1329
+ #
1330
+ # Set the index type used for explicit encryption.
1331
+ # The index type is only used for FLE 2 encryption.
1332
+ #
1333
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1334
+ # @param[ mongocrypt_index_type ] index_type Type of the index.
1335
+ #
1336
+ # @return [ Boolean ] Whether setting this option succeeded.
1337
+ attach_function(
1338
+ :mongocrypt_ctx_setopt_index_type,
1339
+ [
1340
+ :pointer,
1341
+ :mongocrypt_index_type
1342
+ ],
1343
+ :bool
1344
+ )
1345
+
1346
+ # Set the index type used for explicit encryption.
1347
+ # The index type is only used for FLE 2 encryption.
1348
+ #
1349
+ # @param [ Mongo::Crypt::Context ] context Explicit encryption context.
1350
+ # @param [ Symbol ] :mongocrypt_index_type index_type Type of the index.
1351
+ # Allowed values are :none, :equality.
1352
+ #
1353
+ # @raise [ Mongo::Error::CryptError ] If the operation failed.
1354
+ def self.ctx_setopt_index_type(context, index_type)
1355
+ check_ctx_status(context) do
1356
+ mongocrypt_ctx_setopt_index_type(context.ctx_p, index_type)
1357
+ end
1358
+ end
1359
+
1360
+ enum :mongocrypt_query_type, [
1361
+ :equality, 1
1362
+ ]
1363
+
1364
+ # @!method self.mongocrypt_ctx_setopt_query_type(ctx, mongocrypt_query_type)
1365
+ # @api private
1366
+ #
1367
+ # Set the query type to use for FLE 2 explicit encryption.
1368
+ # The query type is only used for indexed FLE 2 encryption.
1369
+ #
1370
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1371
+ # @param [ mongocrypt_query_type ] query_type Type of the query.
1372
+ #
1373
+ # @return [ Boolean ] Whether setting this option succeeded.
1374
+ attach_function(
1375
+ :mongocrypt_ctx_setopt_query_type,
1376
+ [
1377
+ :pointer,
1378
+ :mongocrypt_query_type
1379
+ ],
1380
+ :bool
1381
+ )
1382
+
1383
+ # Set the query type to use for FLE 2 explicit encryption.
1384
+ # The query type is only used for indexed FLE 2 encryption.
1385
+ #
1386
+ # @param [ Mongo::Crypt::Context ] context Explicit encryption context.
1387
+ # @param [ Symbol ] :mongocrypt_query_type query_type Type of the query.
1388
+ # Allowed value is :equality.
1389
+ #
1390
+ # @raise [ Mongo::Error::CryptError ] If the operation failed.
1391
+ def self.ctx_setopt_query_type(context, query_type)
1392
+ check_ctx_status(context) do
1393
+ mongocrypt_ctx_setopt_query_type(context.ctx_p, query_type)
1394
+ end
1395
+ end
1396
+
1397
+ # @!method self.mongocrypt_ctx_setopt_contention_factor(ctx, contention_factor)
1398
+ # @api private
1399
+ #
1400
+ # Set the contention factor used for explicit encryption.
1401
+ # The contention factor is only used for indexed FLE 2 encryption.
1402
+ #
1403
+ # @param [ FFI::Pointer ] ctx A pointer to a mongocrypt_ctx_t object.
1404
+ # @param [ int64 ] contention_factor
1405
+ #
1406
+ # @return [ Boolean ] Whether setting this option succeeded.
1407
+ attach_function(
1408
+ :mongocrypt_ctx_setopt_contention_factor,
1409
+ [
1410
+ :pointer,
1411
+ :int64
1412
+ ],
1413
+ :bool
1414
+ )
1415
+
1416
+ # Set the contention factor used for explicit encryption.
1417
+ # The contention factor is only used for indexed FLE 2 encryption.
1418
+ #
1419
+ # @param [ Mongo::Crypt::Context ] context Explicit encryption context.
1420
+ # @param [ Integer ] factor Contention factor used for explicit encryption.
1421
+ #
1422
+ # @raise [ Mongo::Error::CryptError ] If the operation failed.
1423
+ def self.ctx_setopt_contention_factor(context, factor)
1424
+ check_ctx_status(context) do
1425
+ mongocrypt_ctx_setopt_contention_factor(context.ctx_p, factor)
1426
+ end
1427
+ end
1428
+
1177
1429
  # Raise a Mongo::Error::CryptError based on the status of the underlying
1178
1430
  # mongocrypt_t object.
1179
1431
  #
@@ -35,13 +35,14 @@ module Mongo
35
35
  # that implements driver I/O methods required to run the
36
36
  # state machine.
37
37
  def initialize(mongocrypt_handle, io)
38
+ @mongocrypt_handle = mongocrypt_handle
38
39
  # Ideally, this level of the API wouldn't be passing around pointer
39
40
  # references between objects, so this method signature is subject to change.
40
41
 
41
42
  # FFI::AutoPointer uses a custom release strategy to automatically free
42
43
  # the pointer once this object goes out of scope
43
44
  @ctx_p = FFI::AutoPointer.new(
44
- Binding.mongocrypt_ctx_new(mongocrypt_handle.ref),
45
+ Binding.mongocrypt_ctx_new(@mongocrypt_handle.ref),
45
46
  Binding.method(:mongocrypt_ctx_destroy)
46
47
  )
47
48
 
@@ -103,7 +104,9 @@ module Mongo
103
104
  mongocrypt_done
104
105
  when :need_kms
105
106
  while kms_context = Binding.ctx_next_kms_ctx(self) do
106
- @encryption_io.feed_kms(kms_context)
107
+ provider = Binding.kms_ctx_get_kms_provider(kms_context)
108
+ tls_options = @mongocrypt_handle.kms_tls_options(provider)
109
+ @encryption_io.feed_kms(kms_context, tls_options)
107
110
  end
108
111
 
109
112
  Binding.ctx_kms_done(self)