Skip to content

Commit 82c6bdb

Browse files
committed
PYTHON-1526 - Update SCRAM-SHA-256 for spec change
1 parent 1e6b7f7 commit 82c6bdb

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

pymongo/auth.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,12 @@ def _parse_scram_response(response):
197197
def _authenticate_scram(credentials, sock_info, mechanism):
198198
"""Authenticate using SCRAM."""
199199

200+
username = credentials.username
200201
if mechanism == 'SCRAM-SHA-256':
201202
digestmod = sha256
202-
username = saslprep(credentials.username)
203203
data = saslprep(credentials.password).encode("utf-8")
204204
else:
205205
digestmod = sha1
206-
username = credentials.username
207206
data = _password_digest(username, credentials.password).encode("utf-8")
208207
source = credentials.source
209208

test/test_auth.py

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from pymongo.auth import HAVE_KERBEROS, _build_credentials_tuple
3131
from pymongo.errors import OperationFailure
3232
from pymongo.read_preferences import ReadPreference
33-
from pymongo.saslprep import saslprep, HAVE_STRINGPREP
33+
from pymongo.saslprep import HAVE_STRINGPREP
3434
from test import client_context, SkipTest, unittest, Version
3535
from test.utils import (delay,
3636
ignore_deprecations,
@@ -460,29 +460,64 @@ def test_scram(self):
460460
'not-a-user', 'pwd')
461461

462462
if HAVE_STRINGPREP:
463+
# Test the use of SASLprep on passwords. For example,
464+
# saslprep(u'\u2136') becomes u'IV' and saslprep(u'I\u00ADX')
465+
# becomes u'IX'. SASLprep is only supported when the standard
466+
# library provides stringprep.
463467
client_context.create_user(
464468
'testscram',
465-
saslprep(u'\u2168'),
466469
u'\u2168',
470+
u'\u2163',
467471
roles=['dbOwner'],
468472
mechanisms=['SCRAM-SHA-256'])
469473

474+
client_context.create_user(
475+
'testscram',
476+
u'IX',
477+
u'IX',
478+
roles=['dbOwner'],
479+
mechanisms=['SCRAM-SHA-256'])
480+
481+
self.assertTrue(
482+
client.testscram.authenticate(u'\u2168', u'\u2163'))
483+
client.testscram.command('dbstats')
484+
client.testscram.logout()
485+
self.assertTrue(
486+
client.testscram.authenticate(
487+
u'\u2168', u'\u2163', mechanism='SCRAM-SHA-256'))
488+
client.testscram.command('dbstats')
489+
client.testscram.logout()
490+
self.assertTrue(
491+
client.testscram.authenticate(u'\u2168', u'IV'))
492+
client.testscram.command('dbstats')
493+
client.testscram.logout()
494+
470495
self.assertTrue(
471-
client.testscram.authenticate(u'\u2168', u'\u2168'))
496+
client.testscram.authenticate(u'IX', u'I\u00ADX'))
472497
client.testscram.command('dbstats')
473498
client.testscram.logout()
474499
self.assertTrue(
475500
client.testscram.authenticate(
476-
u'\u2168', u'\u2168', mechanism='SCRAM-SHA-256'))
501+
u'IX', u'I\u00ADX', mechanism='SCRAM-SHA-256'))
502+
client.testscram.command('dbstats')
503+
client.testscram.logout()
504+
self.assertTrue(
505+
client.testscram.authenticate(u'IX', u'IX'))
477506
client.testscram.command('dbstats')
478507
client.testscram.logout()
479-
self.assertRaises(
480-
OperationFailure,
481-
client.testscram.authenticate,
482-
u'\u2168', u'\u2168', mechanism='SCRAM-SHA-1')
483508

484509
client = rs_or_single_client_noauth(
485-
u'mongodb://\u2168:\u2168@%s:%d/testscram' % (host, port))
510+
u'mongodb://\u2168:\u2163@%s:%d/testscram' % (host, port))
511+
client.testscram.command('dbstats')
512+
client = rs_or_single_client_noauth(
513+
u'mongodb://\u2168:IV@%s:%d/testscram' % (host, port))
514+
client.testscram.command('dbstats')
515+
516+
client = rs_or_single_client_noauth(
517+
u'mongodb://IX:I\u00ADX@%s:%d/testscram' % (host, port))
518+
client.testscram.command('dbstats')
519+
client = rs_or_single_client_noauth(
520+
u'mongodb://IX:IX@%s:%d/testscram' % (host, port))
486521
client.testscram.command('dbstats')
487522

488523
self.listener.results.clear()

0 commit comments

Comments
 (0)