Skip to content

Commit

Permalink
[1.9.x] Fixed #26698 -- Fixed PostgreSQL dbshell crash on an empty da…
Browse files Browse the repository at this point in the history
…tabase name.

Backport of 19ff506 from master
  • Loading branch information
mieciu authored and timgraham committed Jun 3, 2016
1 parent 6d0c9f9 commit 5d60eb8
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 33 deletions.
18 changes: 9 additions & 9 deletions django/db/backends/postgresql/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,22 @@ class DatabaseClient(BaseDatabaseClient):
executable_name = 'psql'

@classmethod
def runshell_db(cls, settings_dict):
def runshell_db(cls, conn_params):
args = [cls.executable_name]

host = settings_dict.get('HOST', '')
port = settings_dict.get('PORT', '')
name = settings_dict.get('NAME', '')
user = settings_dict.get('USER', '')
passwd = settings_dict.get('PASSWORD', '')
host = conn_params.get('host', '')
port = conn_params.get('port', '')
dbname = conn_params.get('database', '')
user = conn_params.get('user', '')
passwd = conn_params.get('password', '')

if user:
args += ['-U', user]
if host:
args += ['-h', host]
if port:
args += ['-p', str(port)]
args += [name]
args += [dbname]

temp_pgpass = None
try:
Expand All @@ -43,7 +43,7 @@ def runshell_db(cls, settings_dict):
print_(
_escape_pgpass(host) or '*',
str(port) or '*',
_escape_pgpass(name) or '*',
_escape_pgpass(dbname) or '*',
_escape_pgpass(user) or '*',
_escape_pgpass(passwd),
file=temp_pgpass,
Expand All @@ -63,4 +63,4 @@ def runshell_db(cls, settings_dict):
del os.environ['PGPASSFILE']

def runshell(self):
DatabaseClient.runshell_db(self.connection.settings_dict)
DatabaseClient.runshell_db(self.connection.get_connection_params())
3 changes: 3 additions & 0 deletions docs/releases/1.9.7.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,6 @@ Bugfixes

* Fixed ``HStoreField`` to raise a ``ValidationError`` instead of crashing on
non-dictionary JSON input (:ticket:`26672`).

* Fixed ``dbshell`` crash on PostgreSQL with an empty database name
(:ticket:`26698`).
48 changes: 24 additions & 24 deletions tests/dbshell/test_postgresql_psycopg2.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ def _mock_subprocess_call(*args):
def test_basic(self):
self.assertEqual(
self._run_it({
'NAME': 'dbname',
'USER': 'someuser',
'PASSWORD': 'somepassword',
'HOST': 'somehost',
'PORT': 444,
'database': 'dbname',
'user': 'someuser',
'password': 'somepassword',
'host': 'somehost',
'port': '444',
}), (
['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
b'somehost:444:dbname:someuser:somepassword',
Expand All @@ -51,10 +51,10 @@ def test_basic(self):
def test_nopass(self):
self.assertEqual(
self._run_it({
'NAME': 'dbname',
'USER': 'someuser',
'HOST': 'somehost',
'PORT': 444,
'database': 'dbname',
'user': 'someuser',
'host': 'somehost',
'port': '444',
}), (
['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
None,
Expand All @@ -64,11 +64,11 @@ def test_nopass(self):
def test_column(self):
self.assertEqual(
self._run_it({
'NAME': 'dbname',
'USER': 'some:user',
'PASSWORD': 'some:password',
'HOST': '::1',
'PORT': 444,
'database': 'dbname',
'user': 'some:user',
'password': 'some:password',
'host': '::1',
'port': '444',
}), (
['psql', '-U', 'some:user', '-h', '::1', '-p', '444', 'dbname'],
b'\\:\\:1:444:dbname:some\\:user:some\\:password',
Expand All @@ -78,11 +78,11 @@ def test_column(self):
def test_escape_characters(self):
self.assertEqual(
self._run_it({
'NAME': 'dbname',
'USER': 'some\\user',
'PASSWORD': 'some\\password',
'HOST': 'somehost',
'PORT': 444,
'database': 'dbname',
'user': 'some\\user',
'password': 'some\\password',
'host': 'somehost',
'port': '444',
}), (
['psql', '-U', 'some\\user', '-h', 'somehost', '-p', '444', 'dbname'],
b'somehost:444:dbname:some\\\\user:some\\\\password',
Expand All @@ -106,11 +106,11 @@ def test_accent(self):
self.skipTest("Your locale can't run this test.")
self.assertEqual(
self._run_it({
'NAME': 'dbname',
'USER': username_str,
'PASSWORD': password_str,
'HOST': 'somehost',
'PORT': 444,
'database': 'dbname',
'user': username_str,
'password': password_str,
'host': 'somehost',
'port': '444',
}), (
['psql', '-U', username_str, '-h', 'somehost', '-p', '444', 'dbname'],
pgpass_bytes,
Expand Down

0 comments on commit 5d60eb8

Please sign in to comment.