mirror of
				https://github.com/django/django.git
				synced 2025-11-04 05:35:37 +00:00 
			
		
		
		
	Fixed #26698 -- Fixed PostgreSQL dbshell crash on an empty database name.
This commit is contained in:
		
							parent
							
								
									4a4d7f980e
								
							
						
					
					
						commit
						19ff506878
					
				
					 3 changed files with 36 additions and 33 deletions
				
			
		| 
						 | 
					@ -17,14 +17,14 @@ class DatabaseClient(BaseDatabaseClient):
 | 
				
			||||||
    executable_name = 'psql'
 | 
					    executable_name = 'psql'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def runshell_db(cls, settings_dict):
 | 
					    def runshell_db(cls, conn_params):
 | 
				
			||||||
        args = [cls.executable_name]
 | 
					        args = [cls.executable_name]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        host = settings_dict.get('HOST', '')
 | 
					        host = conn_params.get('host', '')
 | 
				
			||||||
        port = settings_dict.get('PORT', '')
 | 
					        port = conn_params.get('port', '')
 | 
				
			||||||
        name = settings_dict.get('NAME', '')
 | 
					        dbname = conn_params.get('database', '')
 | 
				
			||||||
        user = settings_dict.get('USER', '')
 | 
					        user = conn_params.get('user', '')
 | 
				
			||||||
        passwd = settings_dict.get('PASSWORD', '')
 | 
					        passwd = conn_params.get('password', '')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if user:
 | 
					        if user:
 | 
				
			||||||
            args += ['-U', user]
 | 
					            args += ['-U', user]
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,7 @@ class DatabaseClient(BaseDatabaseClient):
 | 
				
			||||||
            args += ['-h', host]
 | 
					            args += ['-h', host]
 | 
				
			||||||
        if port:
 | 
					        if port:
 | 
				
			||||||
            args += ['-p', str(port)]
 | 
					            args += ['-p', str(port)]
 | 
				
			||||||
        args += [name]
 | 
					        args += [dbname]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        temp_pgpass = None
 | 
					        temp_pgpass = None
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
| 
						 | 
					@ -43,7 +43,7 @@ class DatabaseClient(BaseDatabaseClient):
 | 
				
			||||||
                    print_(
 | 
					                    print_(
 | 
				
			||||||
                        _escape_pgpass(host) or '*',
 | 
					                        _escape_pgpass(host) or '*',
 | 
				
			||||||
                        str(port) or '*',
 | 
					                        str(port) or '*',
 | 
				
			||||||
                        _escape_pgpass(name) or '*',
 | 
					                        _escape_pgpass(dbname) or '*',
 | 
				
			||||||
                        _escape_pgpass(user) or '*',
 | 
					                        _escape_pgpass(user) or '*',
 | 
				
			||||||
                        _escape_pgpass(passwd),
 | 
					                        _escape_pgpass(passwd),
 | 
				
			||||||
                        file=temp_pgpass,
 | 
					                        file=temp_pgpass,
 | 
				
			||||||
| 
						 | 
					@ -63,4 +63,4 @@ class DatabaseClient(BaseDatabaseClient):
 | 
				
			||||||
                    del os.environ['PGPASSFILE']
 | 
					                    del os.environ['PGPASSFILE']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def runshell(self):
 | 
					    def runshell(self):
 | 
				
			||||||
        DatabaseClient.runshell_db(self.connection.settings_dict)
 | 
					        DatabaseClient.runshell_db(self.connection.get_connection_params())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,3 +23,6 @@ Bugfixes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Fixed ``HStoreField`` to raise a ``ValidationError`` instead of crashing on
 | 
					* Fixed ``HStoreField`` to raise a ``ValidationError`` instead of crashing on
 | 
				
			||||||
  non-dictionary JSON input (:ticket:`26672`).
 | 
					  non-dictionary JSON input (:ticket:`26672`).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Fixed ``dbshell`` crash on PostgreSQL with an empty database name
 | 
				
			||||||
 | 
					  (:ticket:`26698`).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,11 +37,11 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
 | 
				
			||||||
    def test_basic(self):
 | 
					    def test_basic(self):
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            self._run_it({
 | 
					            self._run_it({
 | 
				
			||||||
                'NAME': 'dbname',
 | 
					                'database': 'dbname',
 | 
				
			||||||
                'USER': 'someuser',
 | 
					                'user': 'someuser',
 | 
				
			||||||
                'PASSWORD': 'somepassword',
 | 
					                'password': 'somepassword',
 | 
				
			||||||
                'HOST': 'somehost',
 | 
					                'host': 'somehost',
 | 
				
			||||||
                'PORT': 444,
 | 
					                'port': '444',
 | 
				
			||||||
            }), (
 | 
					            }), (
 | 
				
			||||||
                ['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
 | 
					                ['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
 | 
				
			||||||
                b'somehost:444:dbname:someuser:somepassword',
 | 
					                b'somehost:444:dbname:someuser:somepassword',
 | 
				
			||||||
| 
						 | 
					@ -51,10 +51,10 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
 | 
				
			||||||
    def test_nopass(self):
 | 
					    def test_nopass(self):
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            self._run_it({
 | 
					            self._run_it({
 | 
				
			||||||
                'NAME': 'dbname',
 | 
					                'database': 'dbname',
 | 
				
			||||||
                'USER': 'someuser',
 | 
					                'user': 'someuser',
 | 
				
			||||||
                'HOST': 'somehost',
 | 
					                'host': 'somehost',
 | 
				
			||||||
                'PORT': 444,
 | 
					                'port': '444',
 | 
				
			||||||
            }), (
 | 
					            }), (
 | 
				
			||||||
                ['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
 | 
					                ['psql', '-U', 'someuser', '-h', 'somehost', '-p', '444', 'dbname'],
 | 
				
			||||||
                None,
 | 
					                None,
 | 
				
			||||||
| 
						 | 
					@ -64,11 +64,11 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
 | 
				
			||||||
    def test_column(self):
 | 
					    def test_column(self):
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            self._run_it({
 | 
					            self._run_it({
 | 
				
			||||||
                'NAME': 'dbname',
 | 
					                'database': 'dbname',
 | 
				
			||||||
                'USER': 'some:user',
 | 
					                'user': 'some:user',
 | 
				
			||||||
                'PASSWORD': 'some:password',
 | 
					                'password': 'some:password',
 | 
				
			||||||
                'HOST': '::1',
 | 
					                'host': '::1',
 | 
				
			||||||
                'PORT': 444,
 | 
					                'port': '444',
 | 
				
			||||||
            }), (
 | 
					            }), (
 | 
				
			||||||
                ['psql', '-U', 'some:user', '-h', '::1', '-p', '444', 'dbname'],
 | 
					                ['psql', '-U', 'some:user', '-h', '::1', '-p', '444', 'dbname'],
 | 
				
			||||||
                b'\\:\\:1:444:dbname:some\\:user:some\\:password',
 | 
					                b'\\:\\:1:444:dbname:some\\:user:some\\:password',
 | 
				
			||||||
| 
						 | 
					@ -78,11 +78,11 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
 | 
				
			||||||
    def test_escape_characters(self):
 | 
					    def test_escape_characters(self):
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            self._run_it({
 | 
					            self._run_it({
 | 
				
			||||||
                'NAME': 'dbname',
 | 
					                'database': 'dbname',
 | 
				
			||||||
                'USER': 'some\\user',
 | 
					                'user': 'some\\user',
 | 
				
			||||||
                'PASSWORD': 'some\\password',
 | 
					                'password': 'some\\password',
 | 
				
			||||||
                'HOST': 'somehost',
 | 
					                'host': 'somehost',
 | 
				
			||||||
                'PORT': 444,
 | 
					                'port': '444',
 | 
				
			||||||
            }), (
 | 
					            }), (
 | 
				
			||||||
                ['psql', '-U', 'some\\user', '-h', 'somehost', '-p', '444', 'dbname'],
 | 
					                ['psql', '-U', 'some\\user', '-h', 'somehost', '-p', '444', 'dbname'],
 | 
				
			||||||
                b'somehost:444:dbname:some\\\\user:some\\\\password',
 | 
					                b'somehost:444:dbname:some\\\\user:some\\\\password',
 | 
				
			||||||
| 
						 | 
					@ -106,11 +106,11 @@ class PostgreSqlDbshellCommandTestCase(SimpleTestCase):
 | 
				
			||||||
                self.skipTest("Your locale can't run this test.")
 | 
					                self.skipTest("Your locale can't run this test.")
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            self._run_it({
 | 
					            self._run_it({
 | 
				
			||||||
                'NAME': 'dbname',
 | 
					                'database': 'dbname',
 | 
				
			||||||
                'USER': username_str,
 | 
					                'user': username_str,
 | 
				
			||||||
                'PASSWORD': password_str,
 | 
					                'password': password_str,
 | 
				
			||||||
                'HOST': 'somehost',
 | 
					                'host': 'somehost',
 | 
				
			||||||
                'PORT': 444,
 | 
					                'port': '444',
 | 
				
			||||||
            }), (
 | 
					            }), (
 | 
				
			||||||
                ['psql', '-U', username_str, '-h', 'somehost', '-p', '444', 'dbname'],
 | 
					                ['psql', '-U', username_str, '-h', 'somehost', '-p', '444', 'dbname'],
 | 
				
			||||||
                pgpass_bytes,
 | 
					                pgpass_bytes,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue