[Django] #29199: Oracle backend won't connect if password contains '@'

6 views
Skip to first unread message

Django

unread,
Mar 7, 2018, 4:16:35 PM3/7/18
to django-...@googlegroups.com
#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane | Owner: nobody
Allgeier |
Type: | Status: new
Uncategorized |
Component: Database | Version: 2.0
layer (models, ORM) |
Severity: Normal | Keywords: oracle
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
Using this DATABASES config in settings.py:
{{{
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'mydsn',
'USER': 'valid_username',
'PASSWORD': 'p@ssword',
'HOST': '',
'PORT': '',
}
}
}}}

I get this traceback:
{{{
Unhandled exception in thread started by <function
check_errors.<locals>.wrapper at 0x7fab58f99ae8>
Traceback (most recent call last):
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/base/base.py", line 216, in ensure_connection
self.connect()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/base/base.py", line 194, in connect
self.connection = self.get_new_connection(conn_params)
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/oracle/base.py", line 208, in
get_new_connection
return Database.connect(self._connect_string(), **conn_params)
cx_Oracle.DatabaseError: ORA-12154: TNS:could not resolve the connect
identifier specified

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/utils/autoreload.py", line 225, in wrapper
fn(*args, **kwargs)
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/core/management/commands/runserver.py", line 123, in
inner_run
self.check_migrations()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/core/management/base.py", line 427, in check_migrations
executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/migrations/executor.py", line 18, in __init__
self.loader = MigrationLoader(self.connection)
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/migrations/loader.py", line 49, in __init__
self.build_graph()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/migrations/loader.py", line 206, in build_graph
self.applied_migrations = recorder.applied_migrations()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/migrations/recorder.py", line 61, in applied_migrations
if self.has_table():
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/migrations/recorder.py", line 44, in has_table
return self.Migration._meta.db_table in
self.connection.introspection.table_names(self.connection.cursor())
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/base/base.py", line 255, in cursor
return self._cursor()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/base/base.py", line 232, in _cursor
self.ensure_connection()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/base/base.py", line 216, in ensure_connection
self.connect()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/base/base.py", line 216, in ensure_connection
self.connect()
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/base/base.py", line 194, in connect
self.connection = self.get_new_connection(conn_params)
File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
packages/django/db/backends/oracle/base.py", line 208, in
get_new_connection
return Database.connect(self._connect_string(), **conn_params)
django.db.utils.DatabaseError: ORA-12154: TNS:could not resolve the
connect identifier specified
}}}

After delving into the Oracle backend, I realized that Django is calling
the cx_Oracle.connect() function like so:
(django/db/backends/oracle/base.py line 208)
{{{
Database.connect('valid_username/p@ssword@mydsn')
}}}
You can probably guess why cx_Oracle doesn't like this. As far as I can
tell, there's no possible way to work around this bug without directly
editing Django's (or cx_Oracle's) code.
The following connection method works just fine:
{{{
Database.connect('valid_username', 'p@ssword', 'mydsn')
}}}

I should also mention that there have been
[https://stackoverflow.com/q/25767485 others] that have this issue. In my
case, the bureaucracy at my company won't allow me to choose my own
password, so fixing Django is my only option.

--
Ticket URL: <https://code.djangoproject.com/ticket/29199>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Mar 7, 2018, 4:28:23 PM3/7/18
to django-...@googlegroups.com
#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane Allgeier | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 2.0
(models, ORM) |
Severity: Normal | Resolution:
Keywords: oracle | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Shane Allgeier):

* type: Uncategorized => Bug


Old description:

New description:

The Oracle backend won't connect if password contains '@'.

For example, using this DATABASES config in settings.py:

--

--
Ticket URL: <https://code.djangoproject.com/ticket/29199#comment:1>

Django

unread,
Mar 9, 2018, 1:38:09 AM3/9/18
to django-...@googlegroups.com
#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane Allgeier | Owner: felixxm
Type: Bug | Status: assigned
Component: Database layer | Version: master

(models, ORM) |
Severity: Normal | Resolution:
Keywords: oracle | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by felixxm):

* status: new => assigned
* owner: nobody => felixxm
* version: 2.0 => master
* stage: Unreviewed => Accepted


--
Ticket URL: <https://code.djangoproject.com/ticket/29199#comment:2>

Django

unread,
Mar 9, 2018, 11:16:04 AM3/9/18
to django-...@googlegroups.com
#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane Allgeier | Owner: felixxm
Type: Bug | Status: assigned
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution:
Keywords: oracle | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by felixxm):

* has_patch: 0 => 1


Comment:

[https://github.com/django/django/pull/9768 PR]

--
Ticket URL: <https://code.djangoproject.com/ticket/29199#comment:3>

Django

unread,
Mar 9, 2018, 6:07:17 PM3/9/18
to django-...@googlegroups.com
#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane Allgeier | Owner: felixxm
Type: Bug | Status: assigned
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution:
Keywords: oracle | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by Shane Allgeier):

Patch looks good to me. Any chance we can get this backported to the older
versions? At least Django 1.11 since that's the last version that supports
Oracle 11.2.

Thanks for the patch, felixxm!

--
Ticket URL: <https://code.djangoproject.com/ticket/29199#comment:4>

Django

unread,
Mar 13, 2018, 12:04:01 PM3/13/18
to django-...@googlegroups.com
#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane Allgeier | Owner: felixxm
Type: Bug | Status: assigned
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution:
Keywords: oracle | Triage Stage: Ready for
| checkin
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Tim Graham):

* stage: Accepted => Ready for checkin


Comment:

This doesn't qualify for a backport based on our
[https://docs.djangoproject.com/en/dev/internals/release-process
/#supported-versions supported versions policy].

--
Ticket URL: <https://code.djangoproject.com/ticket/29199#comment:5>

Django

unread,
Mar 13, 2018, 2:06:56 PM3/13/18
to django-...@googlegroups.com
#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane Allgeier | Owner: felixxm
Type: Bug | Status: closed

Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution: fixed

Keywords: oracle | Triage Stage: Ready for
| checkin
Has patch: 1 | Needs documentation: 0

Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by GitHub <noreply@…>):

* status: assigned => closed
* resolution: => fixed


Comment:

In [changeset:"acfc650f2a6e4a79e80237eabfa923ea3a05d709" acfc650f]:
{{{
#!CommitTicketReference repository=""
revision="acfc650f2a6e4a79e80237eabfa923ea3a05d709"
Fixed #29199 -- Fixed crash when database user password contains @ sign on
Oracle.

Thanks Shane Allgeier for the report and Tim Graham for the review.
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/29199#comment:6>

Reply all
Reply to author
Forward
0 new messages