Browse Source

Fixed #18790 -- Encoded database password on Python 2

Thanks thcourbon@gmail.com for the report.
Claude Paroz 12 years ago
parent
commit
859aa2a6c4

+ 2 - 1
django/db/backends/mysql/base.py

@@ -37,6 +37,7 @@ from django.db.backends.mysql.client import DatabaseClient
 from django.db.backends.mysql.creation import DatabaseCreation
 from django.db.backends.mysql.introspection import DatabaseIntrospection
 from django.db.backends.mysql.validation import DatabaseValidation
+from django.utils.encoding import force_str
 from django.utils.functional import cached_property
 from django.utils.safestring import SafeBytes, SafeText
 from django.utils import six
@@ -390,7 +391,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
             if settings_dict['NAME']:
                 kwargs['db'] = settings_dict['NAME']
             if settings_dict['PASSWORD']:
-                kwargs['passwd'] = settings_dict['PASSWORD']
+                kwargs['passwd'] = force_str(settings_dict['PASSWORD'])
             if settings_dict['HOST'].startswith('/'):
                 kwargs['unix_socket'] = settings_dict['HOST']
             elif settings_dict['HOST']:

+ 2 - 1
django/db/backends/postgresql_psycopg2/base.py

@@ -13,6 +13,7 @@ from django.db.backends.postgresql_psycopg2.client import DatabaseClient
 from django.db.backends.postgresql_psycopg2.creation import DatabaseCreation
 from django.db.backends.postgresql_psycopg2.version import get_version
 from django.db.backends.postgresql_psycopg2.introspection import DatabaseIntrospection
+from django.utils.encoding import force_str
 from django.utils.log import getLogger
 from django.utils.safestring import SafeText, SafeBytes
 from django.utils import six
@@ -172,7 +173,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
             if settings_dict['USER']:
                 conn_params['user'] = settings_dict['USER']
             if settings_dict['PASSWORD']:
-                conn_params['password'] = settings_dict['PASSWORD']
+                conn_params['password'] = force_str(settings_dict['PASSWORD'])
             if settings_dict['HOST']:
                 conn_params['host'] = settings_dict['HOST']
             if settings_dict['PORT']:

+ 13 - 0
tests/regressiontests/backends/tests.py

@@ -401,6 +401,19 @@ class BackendTestCase(TestCase):
         self.assertEqual(list(cursor.fetchmany(2)), [('Jane', 'Doe'), ('John', 'Doe')])
         self.assertEqual(list(cursor.fetchall()), [('Mary', 'Agnelline'), ('Peter', 'Parker')])
 
+    def test_unicode_password(self):
+        old_password = connection.settings_dict['PASSWORD']
+        connection.settings_dict['PASSWORD'] = "françois"
+        try:
+            cursor = connection.cursor()
+        except backend.Database.DatabaseError:
+            # As password is probably wrong, a database exception is expected
+            pass
+        except Exception as e:
+            self.fail("Unexpected error raised with unicode password: %s" % e)
+        finally:
+            connection.settings_dict['PASSWORD'] = old_password
+
     def test_database_operations_helper_class(self):
         # Ticket #13630
         self.assertTrue(hasattr(connection, 'ops'))