mongo 1.12.5 → 2.0.0

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 (475) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CONTRIBUTING.md +64 -0
  4. data/LICENSE +1 -1
  5. data/README.md +21 -126
  6. data/Rakefile +39 -21
  7. data/bin/mongo_console +6 -38
  8. data/lib/mongo/address/ipv4.rb +85 -0
  9. data/lib/mongo/address/ipv6.rb +85 -0
  10. data/lib/mongo/address/unix.rb +76 -0
  11. data/lib/mongo/address.rb +111 -0
  12. data/lib/mongo/auth/cr/conversation.rb +119 -0
  13. data/lib/mongo/auth/cr.rb +44 -0
  14. data/lib/mongo/auth/executable.rb +52 -0
  15. data/lib/mongo/auth/ldap/conversation.rb +92 -0
  16. data/lib/mongo/auth/ldap.rb +48 -0
  17. data/lib/mongo/auth/roles.rb +104 -0
  18. data/lib/mongo/auth/scram/conversation.rb +450 -0
  19. data/lib/mongo/auth/scram.rb +53 -0
  20. data/lib/mongo/auth/user/view.rb +102 -0
  21. data/lib/mongo/auth/user.rb +159 -0
  22. data/lib/mongo/auth/x509/conversation.rb +92 -0
  23. data/lib/mongo/auth/x509.rb +48 -0
  24. data/lib/mongo/auth.rb +108 -0
  25. data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
  26. data/lib/mongo/bulk_write/deletable.rb +60 -0
  27. data/lib/mongo/bulk_write/insertable.rb +52 -0
  28. data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
  29. data/lib/mongo/bulk_write/replacable.rb +57 -0
  30. data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
  31. data/lib/mongo/bulk_write/updatable.rb +68 -0
  32. data/lib/mongo/bulk_write.rb +52 -0
  33. data/lib/mongo/client.rb +246 -0
  34. data/lib/mongo/cluster/topology/replica_set.rb +160 -0
  35. data/lib/mongo/cluster/topology/sharded.rb +132 -0
  36. data/lib/mongo/cluster/topology/standalone.rb +132 -0
  37. data/lib/mongo/cluster/topology/unknown.rb +155 -0
  38. data/lib/mongo/cluster/topology.rb +60 -0
  39. data/lib/mongo/cluster.rb +203 -0
  40. data/lib/mongo/collection/view/aggregation.rb +108 -0
  41. data/lib/mongo/collection/view/explainable.rb +49 -0
  42. data/lib/mongo/collection/view/immutable.rb +43 -0
  43. data/lib/mongo/collection/view/iterable.rb +48 -0
  44. data/lib/mongo/collection/view/map_reduce.rb +191 -0
  45. data/lib/mongo/collection/view/readable.rb +363 -0
  46. data/lib/mongo/collection/view/writable.rb +185 -0
  47. data/lib/mongo/collection/view.rb +169 -0
  48. data/lib/mongo/collection.rb +130 -1101
  49. data/lib/mongo/cursor.rb +78 -681
  50. data/lib/mongo/database/view.rb +101 -0
  51. data/lib/mongo/database.rb +224 -0
  52. data/lib/mongo/error/bulk_write_error.rb +41 -0
  53. data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
  54. data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
  55. data/lib/mongo/error/invalid_collection_name.rb +39 -0
  56. data/lib/mongo/error/invalid_database_name.rb +39 -0
  57. data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
  58. data/lib/mongo/error/invalid_file.rb +38 -0
  59. data/lib/mongo/error/invalid_nonce.rb +46 -0
  60. data/lib/mongo/error/invalid_replacement_document.rb +39 -0
  61. data/lib/mongo/error/invalid_signature.rb +47 -0
  62. data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
  63. data/lib/mongo/error/max_bson_size.rb +40 -0
  64. data/lib/mongo/error/max_message_size.rb +42 -0
  65. data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
  66. data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
  67. data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
  68. data/lib/mongo/error/parser.rb +77 -0
  69. data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
  70. data/lib/mongo/error/socket_timeout_error.rb +23 -0
  71. data/lib/mongo/error/unsupported_features.rb +43 -0
  72. data/lib/mongo/error.rb +82 -0
  73. data/lib/mongo/event/listeners.rb +63 -0
  74. data/lib/mongo/event/primary_elected.rb +53 -0
  75. data/lib/mongo/event/publisher.rb +42 -0
  76. data/lib/mongo/event/server_added.rb +53 -0
  77. data/lib/mongo/event/server_removed.rb +53 -0
  78. data/lib/mongo/event/subscriber.rb +41 -0
  79. data/lib/mongo/event.rb +40 -0
  80. data/lib/mongo/grid/file/chunk.rb +184 -0
  81. data/lib/mongo/grid/file/metadata.rb +229 -0
  82. data/lib/mongo/grid/file.rb +106 -0
  83. data/lib/mongo/grid/fs.rb +149 -0
  84. data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
  85. data/lib/mongo/index/view.rb +261 -0
  86. data/lib/mongo/index.rb +64 -0
  87. data/lib/mongo/loggable.rb +126 -0
  88. data/lib/mongo/logger.rb +132 -0
  89. data/lib/mongo/operation/aggregate/result.rb +88 -0
  90. data/lib/mongo/operation/aggregate.rb +100 -0
  91. data/lib/mongo/operation/command.rb +62 -0
  92. data/lib/mongo/operation/executable.rb +105 -0
  93. data/lib/mongo/operation/kill_cursors.rb +39 -0
  94. data/lib/mongo/operation/limited.rb +37 -0
  95. data/lib/mongo/operation/list_collections/result.rb +114 -0
  96. data/lib/mongo/operation/list_indexes/result.rb +118 -0
  97. data/lib/mongo/operation/map_reduce/result.rb +122 -0
  98. data/lib/mongo/operation/map_reduce.rb +96 -0
  99. data/lib/mongo/operation/read/collections_info.rb +67 -0
  100. data/lib/mongo/operation/read/get_more.rb +71 -0
  101. data/lib/mongo/operation/read/indexes.rb +68 -0
  102. data/lib/mongo/operation/read/list_collections.rb +75 -0
  103. data/lib/mongo/operation/read/list_indexes.rb +77 -0
  104. data/lib/mongo/operation/read/query.rb +71 -0
  105. data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
  106. data/lib/mongo/operation/read_preferrable.rb +34 -0
  107. data/lib/mongo/operation/result.rb +259 -0
  108. data/lib/mongo/operation/specifiable.rb +397 -0
  109. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
  110. data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
  111. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
  112. data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
  113. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
  114. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
  115. data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
  116. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
  117. data/lib/mongo/operation/write/bulk.rb +17 -0
  118. data/lib/mongo/operation/write/command/create_index.rb +50 -0
  119. data/lib/mongo/operation/write/command/create_user.rb +43 -0
  120. data/lib/mongo/operation/write/command/delete.rb +56 -0
  121. data/lib/mongo/operation/write/command/drop_index.rb +51 -0
  122. data/lib/mongo/operation/write/command/insert.rb +55 -0
  123. data/lib/mongo/operation/write/command/remove_user.rb +42 -0
  124. data/lib/mongo/operation/write/command/update.rb +60 -0
  125. data/lib/mongo/operation/write/command/writable.rb +61 -0
  126. data/lib/mongo/operation/write/command.rb +22 -0
  127. data/lib/mongo/operation/write/create_index.rb +89 -0
  128. data/lib/mongo/operation/write/create_user.rb +75 -0
  129. data/lib/mongo/operation/write/delete/result.rb +40 -0
  130. data/lib/mongo/operation/write/delete.rb +93 -0
  131. data/lib/mongo/operation/write/drop_index.rb +62 -0
  132. data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
  133. data/lib/mongo/operation/write/insert.rb +90 -0
  134. data/lib/mongo/operation/write/remove_user.rb +70 -0
  135. data/lib/mongo/operation/write/update/result.rb +160 -0
  136. data/lib/mongo/operation/write/update.rb +103 -0
  137. data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
  138. data/lib/mongo/operation.rb +25 -0
  139. data/lib/mongo/options/mapper.rb +78 -0
  140. data/lib/mongo/options.rb +15 -0
  141. data/lib/mongo/protocol/bit_vector.rb +61 -0
  142. data/lib/mongo/protocol/delete.rb +94 -0
  143. data/lib/mongo/protocol/get_more.rb +99 -0
  144. data/lib/mongo/protocol/insert.rb +99 -0
  145. data/lib/mongo/protocol/kill_cursors.rb +74 -0
  146. data/lib/mongo/protocol/message.rb +252 -0
  147. data/lib/mongo/protocol/query.rb +147 -0
  148. data/lib/mongo/protocol/reply.rb +72 -0
  149. data/lib/mongo/protocol/serializers.rb +180 -0
  150. data/lib/mongo/protocol/update.rb +111 -0
  151. data/lib/mongo/protocol.rb +15 -0
  152. data/lib/mongo/server/connectable.rb +110 -0
  153. data/lib/mongo/server/connection.rb +134 -0
  154. data/lib/mongo/server/connection_pool/queue.rb +182 -0
  155. data/lib/mongo/server/connection_pool.rb +141 -0
  156. data/lib/mongo/server/context.rb +66 -0
  157. data/lib/mongo/server/description/features.rb +85 -0
  158. data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
  159. data/lib/mongo/server/description/inspector/server_added.rb +59 -0
  160. data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
  161. data/lib/mongo/server/description/inspector.rb +79 -0
  162. data/lib/mongo/server/description.rb +450 -0
  163. data/lib/mongo/server/monitor/connection.rb +89 -0
  164. data/lib/mongo/server/monitor.rb +176 -0
  165. data/lib/mongo/server.rb +163 -0
  166. data/lib/mongo/server_selector/nearest.rb +94 -0
  167. data/lib/mongo/server_selector/primary.rb +88 -0
  168. data/lib/mongo/server_selector/primary_preferred.rb +94 -0
  169. data/lib/mongo/server_selector/secondary.rb +91 -0
  170. data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
  171. data/lib/mongo/server_selector/selectable.rb +209 -0
  172. data/lib/mongo/server_selector.rb +81 -0
  173. data/lib/mongo/socket/ssl.rb +130 -0
  174. data/lib/mongo/socket/tcp.rb +69 -0
  175. data/lib/mongo/socket/unix.rb +64 -0
  176. data/lib/mongo/socket.rb +179 -0
  177. data/lib/mongo/uri.rb +504 -0
  178. data/lib/mongo/version.rb +21 -0
  179. data/lib/mongo/write_concern/acknowledged.rb +52 -0
  180. data/lib/mongo/write_concern/normalizable.rb +51 -0
  181. data/lib/mongo/write_concern/unacknowledged.rb +55 -0
  182. data/lib/mongo/write_concern.rb +99 -0
  183. data/lib/mongo.rb +24 -82
  184. data/mongo.gemspec +17 -14
  185. data/spec/certificates/ca.pem +17 -0
  186. data/spec/certificates/client.pem +101 -0
  187. data/spec/certificates/crl.pem +10 -0
  188. data/spec/certificates/crl_client_revoked.pem +12 -0
  189. data/spec/certificates/password_protected.pem +51 -0
  190. data/spec/certificates/server.pem +34 -0
  191. data/spec/mongo/address/ipv4_spec.rb +74 -0
  192. data/spec/mongo/address/ipv6_spec.rb +74 -0
  193. data/spec/mongo/address/unix_spec.rb +30 -0
  194. data/spec/mongo/address_spec.rb +206 -0
  195. data/spec/mongo/auth/cr_spec.rb +59 -0
  196. data/spec/mongo/auth/ldap_spec.rb +40 -0
  197. data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
  198. data/spec/mongo/auth/scram_spec.rb +55 -0
  199. data/spec/mongo/auth/user/view_spec.rb +76 -0
  200. data/spec/mongo/auth/user_spec.rb +190 -0
  201. data/spec/mongo/auth/x509_spec.rb +40 -0
  202. data/spec/mongo/auth_spec.rb +65 -0
  203. data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
  204. data/spec/mongo/client_spec.rb +564 -0
  205. data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
  206. data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
  207. data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
  208. data/spec/mongo/cluster/topology_spec.rb +65 -0
  209. data/spec/mongo/cluster_spec.rb +129 -0
  210. data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
  211. data/spec/mongo/collection/view/explainable_spec.rb +32 -0
  212. data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
  213. data/spec/mongo/collection/view/readable_spec.rb +603 -0
  214. data/spec/mongo/collection/view/writable_spec.rb +679 -0
  215. data/spec/mongo/collection/view_spec.rb +530 -0
  216. data/spec/mongo/collection_spec.rb +362 -0
  217. data/spec/mongo/crud_spec.rb +42 -0
  218. data/spec/mongo/cursor_spec.rb +295 -0
  219. data/spec/mongo/database_spec.rb +302 -0
  220. data/spec/mongo/error/parser_spec.rb +119 -0
  221. data/spec/mongo/event/publisher_spec.rb +50 -0
  222. data/spec/mongo/event/subscriber_spec.rb +34 -0
  223. data/spec/mongo/grid/file/chunk_spec.rb +226 -0
  224. data/spec/mongo/grid/file/metadata_spec.rb +92 -0
  225. data/spec/mongo/grid/file_spec.rb +172 -0
  226. data/spec/mongo/grid/fs_spec.rb +129 -0
  227. data/spec/mongo/index/view_spec.rb +330 -0
  228. data/spec/mongo/loggable_spec.rb +62 -0
  229. data/spec/mongo/logger_spec.rb +97 -0
  230. data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
  231. data/spec/mongo/operation/aggregate_spec.rb +127 -0
  232. data/spec/mongo/operation/command_spec.rb +98 -0
  233. data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
  234. data/spec/mongo/operation/limited_spec.rb +50 -0
  235. data/spec/mongo/operation/map_reduce_spec.rb +143 -0
  236. data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
  237. data/spec/mongo/operation/read/get_more_spec.rb +81 -0
  238. data/spec/mongo/operation/read/indexes_spec.rb +31 -0
  239. data/spec/mongo/operation/read/query_spec.rb +84 -0
  240. data/spec/mongo/operation/result_spec.rb +275 -0
  241. data/spec/mongo/operation/specifiable_spec.rb +53 -0
  242. data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
  243. data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
  244. data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
  245. data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
  246. data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
  247. data/spec/mongo/operation/write/command/update_spec.rb +109 -0
  248. data/spec/mongo/operation/write/create_index_spec.rb +63 -0
  249. data/spec/mongo/operation/write/create_user_spec.rb +44 -0
  250. data/spec/mongo/operation/write/delete_spec.rb +186 -0
  251. data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
  252. data/spec/mongo/operation/write/insert_spec.rb +244 -0
  253. data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
  254. data/spec/mongo/operation/write/response_spec.rb +85 -0
  255. data/spec/mongo/operation/write/update_spec.rb +228 -0
  256. data/spec/mongo/protocol/delete_spec.rb +167 -0
  257. data/spec/mongo/protocol/get_more_spec.rb +146 -0
  258. data/spec/mongo/protocol/insert_spec.rb +161 -0
  259. data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
  260. data/spec/mongo/protocol/query_spec.rb +285 -0
  261. data/spec/mongo/protocol/reply_spec.rb +157 -0
  262. data/spec/mongo/protocol/update_spec.rb +186 -0
  263. data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
  264. data/spec/mongo/server/connection_pool_spec.rb +120 -0
  265. data/spec/mongo/server/connection_spec.rb +312 -0
  266. data/spec/mongo/server/description/features_spec.rb +138 -0
  267. data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
  268. data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
  269. data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
  270. data/spec/mongo/server/description_spec.rb +510 -0
  271. data/spec/mongo/server/monitor_spec.rb +144 -0
  272. data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
  273. data/spec/mongo/server_selection_rtt_spec.rb +104 -0
  274. data/spec/mongo/server_selection_spec.rb +89 -0
  275. data/spec/mongo/server_selector/nearest_spec.rb +250 -0
  276. data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
  277. data/spec/mongo/server_selector/primary_spec.rb +114 -0
  278. data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
  279. data/spec/mongo/server_selector/secondary_spec.rb +196 -0
  280. data/spec/mongo/server_selector_spec.rb +101 -0
  281. data/spec/mongo/server_spec.rb +131 -0
  282. data/spec/mongo/uri_spec.rb +517 -0
  283. data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
  284. data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
  285. data/spec/spec_helper.rb +133 -0
  286. data/spec/support/authorization.rb +247 -0
  287. data/spec/support/crud/read.rb +144 -0
  288. data/spec/support/crud/write.rb +214 -0
  289. data/spec/support/crud.rb +203 -0
  290. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  291. data/spec/support/crud_tests/read/count.yml +37 -0
  292. data/spec/support/crud_tests/read/distinct.yml +33 -0
  293. data/spec/support/crud_tests/read/find.yml +50 -0
  294. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  295. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  296. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  297. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  298. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  299. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  300. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  301. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  302. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  303. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  304. data/spec/support/helpers.rb +140 -0
  305. data/spec/support/matchers.rb +37 -0
  306. data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
  307. data/spec/support/sdam/rs/discover_passives.yml +41 -0
  308. data/spec/support/sdam/rs/discover_primary.yml +40 -0
  309. data/spec/support/sdam/rs/discover_secondary.yml +41 -0
  310. data/spec/support/sdam/rs/discovery.yml +195 -0
  311. data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
  312. data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
  313. data/spec/support/sdam/rs/member_reconfig.yml +68 -0
  314. data/spec/support/sdam/rs/member_standalone.yml +60 -0
  315. data/spec/support/sdam/rs/new_primary.yml +74 -0
  316. data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
  317. data/spec/support/sdam/rs/non_rs_member.yml +31 -0
  318. data/spec/support/sdam/rs/normalize_case.yml +49 -0
  319. data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
  320. data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
  321. data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
  322. data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
  323. data/spec/support/sdam/rs/response_from_removed.yml +63 -0
  324. data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
  325. data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
  326. data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
  327. data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
  328. data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
  329. data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
  330. data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
  331. data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
  332. data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
  333. data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
  334. data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
  335. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
  336. data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
  337. data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
  338. data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
  339. data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
  340. data/spec/support/sdam/single/not_ok_response.yml +39 -0
  341. data/spec/support/sdam/single/standalone_removed.yml +32 -0
  342. data/spec/support/sdam/single/unavailable_seed.yml +28 -0
  343. data/spec/support/server_discovery_and_monitoring.rb +167 -0
  344. data/spec/support/server_selection/rtt/first_value.yml +4 -0
  345. data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
  346. data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
  347. data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
  348. data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
  349. data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
  350. data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
  351. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
  352. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
  353. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
  354. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
  355. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
  356. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
  357. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
  358. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
  359. data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
  360. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
  361. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
  362. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
  363. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
  364. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
  365. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
  366. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
  367. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
  368. data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
  369. data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
  370. data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
  371. data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
  372. data/spec/support/server_selection.rb +157 -0
  373. data/spec/support/server_selection_rtt.rb +41 -0
  374. data/spec/support/shared/bulk_write.rb +535 -0
  375. data/spec/support/shared/cursor.rb +38 -0
  376. data/spec/support/shared/operation.rb +77 -0
  377. data/spec/support/shared/protocol.rb +31 -0
  378. data/spec/support/shared/server_selector.rb +111 -0
  379. data/spec/support/shared/socket.rb +82 -0
  380. data/spec/support/travis.rb +14 -0
  381. data.tar.gz.sig +2 -3
  382. metadata +583 -186
  383. metadata.gz.sig +0 -0
  384. data/VERSION +0 -1
  385. data/lib/mongo/bulk_write_collection_view.rb +0 -387
  386. data/lib/mongo/collection_writer.rb +0 -364
  387. data/lib/mongo/connection/node.rb +0 -249
  388. data/lib/mongo/connection/pool.rb +0 -340
  389. data/lib/mongo/connection/pool_manager.rb +0 -320
  390. data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
  391. data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
  392. data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
  393. data/lib/mongo/connection/socket/unix_socket.rb +0 -39
  394. data/lib/mongo/db.rb +0 -808
  395. data/lib/mongo/exception.rb +0 -145
  396. data/lib/mongo/functional/authentication.rb +0 -455
  397. data/lib/mongo/functional/logging.rb +0 -85
  398. data/lib/mongo/functional/read_preference.rb +0 -183
  399. data/lib/mongo/functional/scram.rb +0 -556
  400. data/lib/mongo/functional/uri_parser.rb +0 -409
  401. data/lib/mongo/functional/write_concern.rb +0 -66
  402. data/lib/mongo/gridfs/grid.rb +0 -112
  403. data/lib/mongo/gridfs/grid_ext.rb +0 -53
  404. data/lib/mongo/gridfs/grid_file_system.rb +0 -163
  405. data/lib/mongo/gridfs/grid_io.rb +0 -484
  406. data/lib/mongo/legacy.rb +0 -140
  407. data/lib/mongo/mongo_client.rb +0 -697
  408. data/lib/mongo/mongo_replica_set_client.rb +0 -535
  409. data/lib/mongo/mongo_sharded_client.rb +0 -159
  410. data/lib/mongo/networking.rb +0 -372
  411. data/lib/mongo/utils/conversions.rb +0 -110
  412. data/lib/mongo/utils/core_ext.rb +0 -70
  413. data/lib/mongo/utils/server_version.rb +0 -69
  414. data/lib/mongo/utils/support.rb +0 -80
  415. data/test/functional/authentication_test.rb +0 -39
  416. data/test/functional/bulk_api_stress_test.rb +0 -133
  417. data/test/functional/bulk_write_collection_view_test.rb +0 -1198
  418. data/test/functional/client_test.rb +0 -627
  419. data/test/functional/collection_test.rb +0 -2175
  420. data/test/functional/collection_writer_test.rb +0 -83
  421. data/test/functional/conversions_test.rb +0 -163
  422. data/test/functional/cursor_fail_test.rb +0 -57
  423. data/test/functional/cursor_message_test.rb +0 -56
  424. data/test/functional/cursor_test.rb +0 -683
  425. data/test/functional/db_api_test.rb +0 -835
  426. data/test/functional/db_test.rb +0 -348
  427. data/test/functional/grid_file_system_test.rb +0 -285
  428. data/test/functional/grid_io_test.rb +0 -252
  429. data/test/functional/grid_test.rb +0 -273
  430. data/test/functional/pool_test.rb +0 -136
  431. data/test/functional/safe_test.rb +0 -98
  432. data/test/functional/support_test.rb +0 -62
  433. data/test/functional/timeout_test.rb +0 -60
  434. data/test/functional/uri_test.rb +0 -446
  435. data/test/functional/write_concern_test.rb +0 -118
  436. data/test/helpers/general.rb +0 -50
  437. data/test/helpers/test_unit.rb +0 -476
  438. data/test/replica_set/authentication_test.rb +0 -37
  439. data/test/replica_set/basic_test.rb +0 -189
  440. data/test/replica_set/client_test.rb +0 -393
  441. data/test/replica_set/connection_test.rb +0 -138
  442. data/test/replica_set/count_test.rb +0 -66
  443. data/test/replica_set/cursor_test.rb +0 -220
  444. data/test/replica_set/insert_test.rb +0 -157
  445. data/test/replica_set/max_values_test.rb +0 -151
  446. data/test/replica_set/pinning_test.rb +0 -105
  447. data/test/replica_set/query_test.rb +0 -73
  448. data/test/replica_set/read_preference_test.rb +0 -219
  449. data/test/replica_set/refresh_test.rb +0 -211
  450. data/test/replica_set/replication_ack_test.rb +0 -95
  451. data/test/sharded_cluster/basic_test.rb +0 -203
  452. data/test/shared/authentication/basic_auth_shared.rb +0 -260
  453. data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
  454. data/test/shared/authentication/gssapi_shared.rb +0 -176
  455. data/test/shared/authentication/sasl_plain_shared.rb +0 -96
  456. data/test/shared/authentication/scram_shared.rb +0 -92
  457. data/test/shared/ssl_shared.rb +0 -235
  458. data/test/test_helper.rb +0 -61
  459. data/test/threading/basic_test.rb +0 -120
  460. data/test/tools/mongo_config.rb +0 -708
  461. data/test/tools/mongo_config_test.rb +0 -160
  462. data/test/unit/client_test.rb +0 -381
  463. data/test/unit/collection_test.rb +0 -166
  464. data/test/unit/connection_test.rb +0 -335
  465. data/test/unit/cursor_test.rb +0 -307
  466. data/test/unit/db_test.rb +0 -136
  467. data/test/unit/grid_test.rb +0 -76
  468. data/test/unit/mongo_sharded_client_test.rb +0 -48
  469. data/test/unit/node_test.rb +0 -93
  470. data/test/unit/pool_manager_test.rb +0 -111
  471. data/test/unit/read_pref_test.rb +0 -406
  472. data/test/unit/read_test.rb +0 -159
  473. data/test/unit/safe_test.rb +0 -158
  474. data/test/unit/sharding_pool_manager_test.rb +0 -84
  475. data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,450 @@
1
+ # Copyright (C) 2014 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'base64'
16
+
17
+ module Mongo
18
+ module Auth
19
+ class SCRAM
20
+
21
+ # Defines behaviour around a single SCRAM-SHA-1 conversation between the
22
+ # client and server.
23
+ #
24
+ # @since 2.0.0
25
+ class Conversation
26
+
27
+ # The base client continue message.
28
+ #
29
+ # @since 2.0.0
30
+ CLIENT_CONTINUE_MESSAGE = { saslContinue: 1 }.freeze
31
+
32
+ # The base client first message.
33
+ #
34
+ # @since 2.0.0
35
+ CLIENT_FIRST_MESSAGE = { saslStart: 1, autoAuthorize: 1 }.freeze
36
+
37
+ # The client key string.
38
+ #
39
+ # @since 2.0.0
40
+ CLIENT_KEY = 'Client Key'.freeze
41
+
42
+ # The digest to use for encryption.
43
+ #
44
+ # @since 2.0.0
45
+ DIGEST = OpenSSL::Digest::SHA1.new.freeze
46
+
47
+ # The key for the done field in the responses.
48
+ #
49
+ # @since 2.0.0
50
+ DONE = 'done'.freeze
51
+
52
+ # The conversation id field.
53
+ #
54
+ # @since 2.0.0
55
+ ID = 'conversationId'.freeze
56
+
57
+ # The iterations key in the responses.
58
+ #
59
+ # @since 2.0.0
60
+ ITERATIONS = /i=(\d+)/.freeze
61
+
62
+ # The payload field.
63
+ #
64
+ # @since 2.0.0
65
+ PAYLOAD = 'payload'.freeze
66
+
67
+ # The rnonce key in the responses.
68
+ #
69
+ # @since 2.0.0
70
+ RNONCE = /r=([^,]*)/.freeze
71
+
72
+ # The salt key in the responses.
73
+ #
74
+ # @since 2.0.0
75
+ SALT = /s=([^,]*)/.freeze
76
+
77
+ # The server key string.
78
+ #
79
+ # @since 2.0.0
80
+ SERVER_KEY = 'Server Key'.freeze
81
+
82
+ # The server signature verifier in the response.
83
+ #
84
+ # @since 2.0.0
85
+ VERIFIER = /v=([^,]*)/.freeze
86
+
87
+ # @return [ String ] nonce The initial user nonce.
88
+ attr_reader :nonce
89
+
90
+ # @return [ Protocol::Reply ] reply The current reply in the
91
+ # conversation.
92
+ attr_reader :reply
93
+
94
+ # @return [ User ] user The user for the conversation.
95
+ attr_reader :user
96
+
97
+ # Continue the SCRAM conversation. This sends the client final message
98
+ # to the server after setting the reply from the previous server
99
+ # communication.
100
+ #
101
+ # @example Continue the conversation.
102
+ # conversation.continue(reply)
103
+ #
104
+ # @param [ Protocol::Reply ] reply The reply of the previous
105
+ # message.
106
+ #
107
+ # @return [ Protocol::Query ] The next message to send.
108
+ #
109
+ # @since 2.0.0
110
+ def continue(reply)
111
+ validate_first_message!(reply)
112
+ Protocol::Query.new(
113
+ Database::ADMIN,
114
+ Database::COMMAND,
115
+ CLIENT_CONTINUE_MESSAGE.merge(payload: client_final_message, conversationId: id),
116
+ limit: -1
117
+ )
118
+ end
119
+
120
+ # Finalize the SCRAM conversation. This is meant to be iterated until
121
+ # the provided reply indicates the conversation is finished.
122
+ #
123
+ # @example Finalize the conversation.
124
+ # conversation.finalize(reply)
125
+ #
126
+ # @param [ Protocol::Reply ] reply The reply of the previous
127
+ # message.
128
+ #
129
+ # @return [ Protocol::Query ] The next message to send.
130
+ #
131
+ # @since 2.0.0
132
+ def finalize(reply)
133
+ validate_final_message!(reply)
134
+ Protocol::Query.new(
135
+ Database::ADMIN,
136
+ Database::COMMAND,
137
+ CLIENT_CONTINUE_MESSAGE.merge(payload: client_empty_message, conversationId: id),
138
+ limit: -1
139
+ )
140
+ end
141
+
142
+ # Start the SCRAM conversation. This returns the first message that
143
+ # needs to be send to the server.
144
+ #
145
+ # @example Start the conversation.
146
+ # conversation.start
147
+ #
148
+ # @return [ Protocol::Query ] The first SCRAM conversation message.
149
+ #
150
+ # @since 2.0.0
151
+ def start
152
+ Protocol::Query.new(
153
+ Database::ADMIN,
154
+ Database::COMMAND,
155
+ CLIENT_FIRST_MESSAGE.merge(payload: client_first_message, mechanism: SCRAM::MECHANISM),
156
+ limit: -1
157
+ )
158
+ end
159
+
160
+ # Get the id of the conversation.
161
+ #
162
+ # @example Get the id of the conversation.
163
+ # conversation.id
164
+ #
165
+ # @return [ Integer ] The conversation id.
166
+ #
167
+ # @since 2.0.0
168
+ def id
169
+ reply.documents[0][ID]
170
+ end
171
+
172
+ # Create the new conversation.
173
+ #
174
+ # @example Create the new coversation.
175
+ # Conversation.new(user)
176
+ #
177
+ # @param [ Auth::User ] user The user to converse about.
178
+ #
179
+ # @since 2.0.0
180
+ def initialize(user)
181
+ @user = user
182
+ @nonce = SecureRandom.base64
183
+ end
184
+
185
+ private
186
+
187
+ # Auth message algorithm implementation.
188
+ #
189
+ # @api private
190
+ #
191
+ # @see http://tools.ietf.org/html/rfc5802#section-3
192
+ #
193
+ # @since 2.0.0
194
+ def auth_message
195
+ @auth_message ||= "#{first_bare},#{reply.documents[0][PAYLOAD].data},#{without_proof}"
196
+ end
197
+
198
+ # Get the empty client message.
199
+ #
200
+ # @api private
201
+ #
202
+ # @since 2.0.0
203
+ def client_empty_message
204
+ BSON::Binary.new('')
205
+ end
206
+
207
+ # Get the final client message.
208
+ #
209
+ # @api private
210
+ #
211
+ # @see http://tools.ietf.org/html/rfc5802#section-3
212
+ #
213
+ # @since 2.0.0
214
+ def client_final_message
215
+ BSON::Binary.new("#{without_proof},p=#{client_final}")
216
+ end
217
+
218
+ # Get the client first message
219
+ #
220
+ # @api private
221
+ #
222
+ # @see http://tools.ietf.org/html/rfc5802#section-3
223
+ #
224
+ # @since 2.0.0
225
+ def client_first_message
226
+ BSON::Binary.new("n,,#{first_bare}")
227
+ end
228
+
229
+ # Client final implementation.
230
+ #
231
+ # @api private
232
+ #
233
+ # @see http://tools.ietf.org/html/rfc5802#section-7
234
+ #
235
+ # @since 2.0.0
236
+ def client_final
237
+ @client_final ||= client_proof(client_key, client_signature(stored_key(client_key), auth_message))
238
+ end
239
+
240
+ # Client key algorithm implementation.
241
+ #
242
+ # @api private
243
+ #
244
+ # @see http://tools.ietf.org/html/rfc5802#section-3
245
+ #
246
+ # @since 2.0.0
247
+ def client_key
248
+ @client_key ||= hmac(salted_password, CLIENT_KEY)
249
+ end
250
+
251
+ # Client proof algorithm implementation.
252
+ #
253
+ # @api private
254
+ #
255
+ # @see http://tools.ietf.org/html/rfc5802#section-3
256
+ #
257
+ # @since 2.0.0
258
+ def client_proof(key, signature)
259
+ @client_proof ||= Base64.strict_encode64(xor(key, signature))
260
+ end
261
+
262
+ # Client signature algorithm implementation.
263
+ #
264
+ # @api private
265
+ #
266
+ # @see http://tools.ietf.org/html/rfc5802#section-3
267
+ #
268
+ # @since 2.0.0
269
+ def client_signature(key, message)
270
+ @client_signature ||= hmac(key, message)
271
+ end
272
+
273
+ # First bare implementation.
274
+ #
275
+ # @api private
276
+ #
277
+ # @see http://tools.ietf.org/html/rfc5802#section-7
278
+ #
279
+ # @since 2.0.0
280
+ def first_bare
281
+ @first_bare ||= "n=#{user.encoded_name},r=#{nonce}"
282
+ end
283
+
284
+ # H algorithm implementation.
285
+ #
286
+ # @api private
287
+ #
288
+ # @see http://tools.ietf.org/html/rfc5802#section-2.2
289
+ #
290
+ # @since 2.0.0
291
+ def h(string)
292
+ DIGEST.digest(string)
293
+ end
294
+
295
+ # HI algorithm implementation.
296
+ #
297
+ # @api private
298
+ #
299
+ # @see http://tools.ietf.org/html/rfc5802#section-2.2
300
+ #
301
+ # @since 2.0.0
302
+ def hi(data)
303
+ OpenSSL::PKCS5.pbkdf2_hmac_sha1(
304
+ data,
305
+ Base64.strict_decode64(salt),
306
+ iterations,
307
+ DIGEST.size
308
+ )
309
+ end
310
+
311
+ # HMAC algorithm implementation.
312
+ #
313
+ # @api private
314
+ #
315
+ # @see http://tools.ietf.org/html/rfc5802#section-2.2
316
+ #
317
+ # @since 2.0.0
318
+ def hmac(data, key)
319
+ OpenSSL::HMAC.digest(DIGEST, data, key)
320
+ end
321
+
322
+ # Get the iterations from the server response.
323
+ #
324
+ # @api private
325
+ #
326
+ # @since 2.0.0
327
+ def iterations
328
+ @iterations ||= payload_data.match(ITERATIONS)[1].to_i
329
+ end
330
+
331
+ # Get the data from the returned payload.
332
+ #
333
+ # @api private
334
+ #
335
+ # @since 2.0.0
336
+ def payload_data
337
+ reply.documents[0][PAYLOAD].data
338
+ end
339
+
340
+ # Get the server nonce from the payload.
341
+ #
342
+ # @api private
343
+ #
344
+ # @since 2.0.0
345
+ def rnonce
346
+ @rnonce ||= payload_data.match(RNONCE)[1]
347
+ end
348
+
349
+ # Gets the salt from the server response.
350
+ #
351
+ # @api private
352
+ #
353
+ # @since 2.0.0
354
+ def salt
355
+ @salt ||= payload_data.match(SALT)[1]
356
+ end
357
+
358
+ # Salted password algorithm implementation.
359
+ #
360
+ # @api private
361
+ #
362
+ # @see http://tools.ietf.org/html/rfc5802#section-3
363
+ #
364
+ # @since 2.0.0
365
+ def salted_password
366
+ @salted_password ||= hi(user.hashed_password)
367
+ end
368
+
369
+ # Server key algorithm implementation.
370
+ #
371
+ # @api private
372
+ #
373
+ # @see http://tools.ietf.org/html/rfc5802#section-3
374
+ #
375
+ # @since 2.0.0
376
+ def server_key
377
+ @server_key ||= hmac(salted_password, SERVER_KEY)
378
+ end
379
+
380
+ # Server signature algorithm implementation.
381
+ #
382
+ # @api private
383
+ #
384
+ # @see http://tools.ietf.org/html/rfc5802#section-3
385
+ #
386
+ # @since 2.0.0
387
+ def server_signature
388
+ @server_signature ||= Base64.strict_encode64(hmac(server_key, auth_message))
389
+ end
390
+
391
+ # Stored key algorithm implementation.
392
+ #
393
+ # @api private
394
+ #
395
+ # @see http://tools.ietf.org/html/rfc5802#section-3
396
+ #
397
+ # @since 2.0.0
398
+ def stored_key(key)
399
+ h(key)
400
+ end
401
+
402
+ # Get the verifier token from the server response.
403
+ #
404
+ # @api private
405
+ #
406
+ # @since 2.0.0
407
+ def verifier
408
+ @verifier ||= payload_data.match(VERIFIER)[1]
409
+ end
410
+
411
+ # Get the without proof message.
412
+ #
413
+ # @api private
414
+ #
415
+ # @see http://tools.ietf.org/html/rfc5802#section-7
416
+ #
417
+ # @since 2.0.0
418
+ def without_proof
419
+ @withoout_proof ||= "c=biws,r=#{rnonce}"
420
+ end
421
+
422
+ # XOR operation for two strings.
423
+ #
424
+ # @api private
425
+ #
426
+ # @since 2.0.0
427
+ def xor(first, second)
428
+ first.bytes.zip(second.bytes).map{ |(a,b)| (a ^ b).chr }.join('')
429
+ end
430
+
431
+ def validate_final_message!(reply)
432
+ validate!(reply)
433
+ unless verifier == server_signature
434
+ raise Error::InvalidSignature.new(verifier, server_signature)
435
+ end
436
+ end
437
+
438
+ def validate_first_message!(reply)
439
+ validate!(reply)
440
+ raise Error::InvalidNonce.new(nonce, rnonce) unless rnonce.start_with?(nonce)
441
+ end
442
+
443
+ def validate!(reply)
444
+ raise Unauthorized.new(user) unless reply.documents[0]['ok'] == 1
445
+ @reply = reply
446
+ end
447
+ end
448
+ end
449
+ end
450
+ end
@@ -0,0 +1,53 @@
1
+ # Copyright (C) 2014 MongoDB Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'mongo/auth/scram/conversation'
16
+
17
+ module Mongo
18
+ module Auth
19
+
20
+ # Defines behaviour for SCRAM-SHA1 authentication.
21
+ #
22
+ # @since 2.0.0
23
+ class SCRAM
24
+ include Executable
25
+
26
+ # The authentication mechinism string.
27
+ #
28
+ # @since 2.0.0
29
+ MECHANISM = 'SCRAM-SHA-1'.freeze
30
+
31
+ # Log the user in on the given connection.
32
+ #
33
+ # @example Log the user in.
34
+ # user.login(connection)
35
+ #
36
+ # @param [ Mongo::Connection ] connection The connection to log into.
37
+ # on.
38
+ #
39
+ # @return [ Protocol::Reply ] The authentication response.
40
+ #
41
+ # @since 2.0.0
42
+ def login(connection)
43
+ conversation = Conversation.new(user)
44
+ reply = connection.dispatch([ conversation.start ])
45
+ reply = connection.dispatch([ conversation.continue(reply) ])
46
+ until reply.documents[0][Conversation::DONE]
47
+ reply = connection.dispatch([ conversation.finalize(reply) ])
48
+ end
49
+ reply
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,102 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Auth
17
+ class User
18
+
19
+ # Defines behaviour for user related operation on databases.
20
+ #
21
+ # @since 2.0.0
22
+ class View
23
+ extend Forwardable
24
+
25
+ # @return [ Database ] database The view's database.
26
+ attr_reader :database
27
+
28
+ def_delegators :database, :cluster, :read_preference
29
+ def_delegators :cluster, :next_primary
30
+
31
+ # Create a new user in the database.
32
+ #
33
+ # @example Create a new read/write user.
34
+ # view.create('user', password: 'password', roles: [ 'readWrite' ])
35
+ #
36
+ # @param [ Auth::User, String ] user_or_name The user object or user name.
37
+ # @param [ Hash ] options The user options.
38
+ #
39
+ # @return [ Result ] The command response.
40
+ #
41
+ # @since 2.0.0
42
+ def create(user_or_name, options = {})
43
+ user = generate(user_or_name, options)
44
+ Operation::Write::CreateUser.new(
45
+ user: user,
46
+ db_name: database.name
47
+ ).execute(next_primary.context)
48
+ end
49
+
50
+ # Initialize the new user view.
51
+ #
52
+ # @example Initialize the user view.
53
+ # View::User.new(database)
54
+ #
55
+ # @param [ Mongo::Database ] database The database the view is for.
56
+ #
57
+ # @since 2.0.0
58
+ def initialize(database)
59
+ @database = database
60
+ end
61
+
62
+ # Remove a user from the database.
63
+ #
64
+ # @example Remove the user from the database.
65
+ # view.remove('user')
66
+ #
67
+ # @param [ String ] name The user name.
68
+ #
69
+ # @return [ Result ] The command response.
70
+ #
71
+ # @since 2.0.0
72
+ def remove(name)
73
+ Operation::Write::RemoveUser.new(
74
+ user_name: name,
75
+ db_name: database.name
76
+ ).execute(next_primary.context)
77
+ end
78
+
79
+ # Update a user in the database.
80
+ #
81
+ # @example Update a user.
82
+ # view.update('name', password: 'testpwd')
83
+ #
84
+ # @param [ Auth::User, String ] user_or_name The user object or user name.
85
+ # @param [ Hash ] options The user options.
86
+ #
87
+ # @return [ Result ] The response.
88
+ #
89
+ # @since 2.0.0
90
+ def update(user_or_name, options = {})
91
+
92
+ end
93
+
94
+ private
95
+
96
+ def generate(user, options)
97
+ user.is_a?(String) ? Auth::User.new({ user: user }.merge(options)) : user
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end