From 24a9633edc33872d13c09d30a1062b1f83d15976 Mon Sep 17 00:00:00 2001 From: RussellLuo Date: Mon, 20 Apr 2015 16:03:25 +0800 Subject: [PATCH 1/4] Override `authentication_source` by "authSource" in URI --- mongoengine/connection.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mongoengine/connection.py b/mongoengine/connection.py index dcecdd9a..5e18efb7 100644 --- a/mongoengine/connection.py +++ b/mongoengine/connection.py @@ -1,4 +1,3 @@ -import pymongo from pymongo import MongoClient, MongoReplicaSetClient, uri_parser @@ -58,8 +57,11 @@ def register_connection(alias, name=None, host=None, port=None, 'password': uri_dict.get('password'), 'read_preference': read_preference, }) - if "replicaSet" in conn_settings['host']: + uri_options = uri_dict['options'] + if 'replicaset' in uri_options: conn_settings['replicaSet'] = True + if 'authsource' in uri_options: + conn_settings['authentication_source'] = uri_options['authsource'] # Deprecated parameters that should not be passed on kwargs.pop('slaves', None) From 6eb0bc50e237fb47e0ffa97b9d79c1cccd3bc61a Mon Sep 17 00:00:00 2001 From: RussellLuo Date: Sat, 25 Apr 2015 08:01:24 +0800 Subject: [PATCH 2/4] Add a test for "authSource" feature --- tests/test_connection.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index 2b325843..aa7d5960 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -11,7 +11,10 @@ import datetime import pymongo from bson.tz_util import utc -from mongoengine import * +from mongoengine import ( + connect, register_connection, + Document, DateTimeField +) import mongoengine.connection from mongoengine.connection import get_db, get_connection, ConnectionError @@ -101,6 +104,38 @@ class ConnectionTest(unittest.TestCase): c.admin.system.users.remove({}) c.mongoenginetest.system.users.remove({}) + def test_connect_uri_with_authsource(self): + """Ensure that the connect() method works well with + the option `authSource` in URI. + """ + # Create users + c = connect(db='mongoenginetest', alias='test') + c.admin.system.users.remove({}) + c.admin.add_user('username', 'password') + + # Authentication fails without "authSource" + self.assertRaises( + ConnectionError, connect, 'mongoenginetest', + host='mongodb://username:password@localhost/mongoenginetest' + ) + + # Authentication succeeds with "authSource" + connect( + 'mongoenginetest', + host=('mongodb://username:password@localhost/' + 'mongoenginetest?authSource=admin') + ) + + conn = get_connection('test') + self.assertTrue(isinstance(conn, pymongo.mongo_client.MongoClient)) + + db = get_db('test') + self.assertTrue(isinstance(db, pymongo.database.Database)) + self.assertEqual(db.name, 'mongoenginetest') + + # Clear all users + c.admin.system.users.remove({}) + def test_register_connection(self): """Ensure that connections with different aliases may be registered. """ From b847bc0abab9cfaece3bbf17dbd5947875cbcc02 Mon Sep 17 00:00:00 2001 From: RussellLuo Date: Sat, 25 Apr 2015 10:22:24 +0800 Subject: [PATCH 3/4] Make `test_connect_uri_with_authsource` to focus on the key point --- tests/test_connection.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index aa7d5960..9204d80c 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -109,27 +109,24 @@ class ConnectionTest(unittest.TestCase): the option `authSource` in URI. """ # Create users - c = connect(db='mongoenginetest', alias='test') + c = connect('mongoenginetest') c.admin.system.users.remove({}) c.admin.add_user('username', 'password') # Authentication fails without "authSource" self.assertRaises( - ConnectionError, connect, 'mongoenginetest', + ConnectionError, connect, 'mongoenginetest', alias='test1', host='mongodb://username:password@localhost/mongoenginetest' ) + self.assertRaises(ConnectionError, get_db, 'test1') # Authentication succeeds with "authSource" connect( - 'mongoenginetest', + 'mongoenginetest', alias='test2', host=('mongodb://username:password@localhost/' 'mongoenginetest?authSource=admin') ) - - conn = get_connection('test') - self.assertTrue(isinstance(conn, pymongo.mongo_client.MongoClient)) - - db = get_db('test') + db = get_db('test2') self.assertTrue(isinstance(db, pymongo.database.Database)) self.assertEqual(db.name, 'mongoenginetest') From 27111e7b29e1b8918c6b52d0a79a1fdc72301e96 Mon Sep 17 00:00:00 2001 From: RussellLuo Date: Sat, 25 Apr 2015 20:57:26 +0800 Subject: [PATCH 4/4] Update changelog for added `authSource` support --- docs/changelog.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index 3dbcc2f8..40df0419 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog Changes in 0.9.X - DEV ====================== +- Added support for specifying authentication source as option `authSource` in URI. #967 - Fixed mark_as_changed to handle higher/lower level fields changed. #927 - ListField of embedded docs doesn't set the _instance attribute when iterating over it #914 - Support += and *= for ListField #595