mirror of
https://github.com/python/cpython.git
synced 2025-09-18 14:40:43 +00:00
bpo-44491: Allow clearing the sqlite3 authoriser callback (GH-26863)
This commit is contained in:
parent
18ba1ff6a4
commit
b19f455339
6 changed files with 33 additions and 6 deletions
|
@ -430,6 +430,11 @@ Connection Objects
|
||||||
argument and the meaning of the second and third argument depending on the first
|
argument and the meaning of the second and third argument depending on the first
|
||||||
one. All necessary constants are available in the :mod:`sqlite3` module.
|
one. All necessary constants are available in the :mod:`sqlite3` module.
|
||||||
|
|
||||||
|
Passing :const:`None` as *authorizer_callback* will disable the authorizer.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.11
|
||||||
|
Added support for disabling the authorizer using :const:`None`.
|
||||||
|
|
||||||
|
|
||||||
.. method:: set_progress_handler(handler, n)
|
.. method:: set_progress_handler(handler, n)
|
||||||
|
|
||||||
|
|
|
@ -106,6 +106,14 @@ math
|
||||||
Dickinson in :issue:`44339`.)
|
Dickinson in :issue:`44339`.)
|
||||||
|
|
||||||
|
|
||||||
|
sqlite3
|
||||||
|
-------
|
||||||
|
|
||||||
|
* You can now disable the authorizer by passing :const:`None` to
|
||||||
|
:meth:`~sqlite3.Connection.set_authorizer`.
|
||||||
|
(Contributed by Erlend E. Aasland in :issue:`44491`.)
|
||||||
|
|
||||||
|
|
||||||
Removed
|
Removed
|
||||||
=======
|
=======
|
||||||
* :class:`smtpd.MailmanProxy` is now removed as it is unusable without
|
* :class:`smtpd.MailmanProxy` is now removed as it is unusable without
|
||||||
|
|
|
@ -652,6 +652,7 @@ class ThreadTests(unittest.TestCase):
|
||||||
lambda: self.con.rollback(),
|
lambda: self.con.rollback(),
|
||||||
lambda: self.con.close(),
|
lambda: self.con.close(),
|
||||||
lambda: self.con.set_trace_callback(None),
|
lambda: self.con.set_trace_callback(None),
|
||||||
|
lambda: self.con.set_authorizer(None),
|
||||||
lambda: self.con.create_collation("foo", None),
|
lambda: self.con.create_collation("foo", None),
|
||||||
]
|
]
|
||||||
for fn in fns:
|
for fn in fns:
|
||||||
|
|
|
@ -522,6 +522,12 @@ class AuthorizerTests(unittest.TestCase):
|
||||||
self.con.execute("select c2 from t1")
|
self.con.execute("select c2 from t1")
|
||||||
self.assertIn('prohibited', str(cm.exception))
|
self.assertIn('prohibited', str(cm.exception))
|
||||||
|
|
||||||
|
def test_clear_authorizer(self):
|
||||||
|
self.con.set_authorizer(None)
|
||||||
|
self.con.execute("select * from t2")
|
||||||
|
self.con.execute("select c2 from t1")
|
||||||
|
|
||||||
|
|
||||||
class AuthorizerRaiseExceptionTests(AuthorizerTests):
|
class AuthorizerRaiseExceptionTests(AuthorizerTests):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def authorizer_cb(action, arg1, arg2, dbname, source):
|
def authorizer_cb(action, arg1, arg2, dbname, source):
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Allow clearing the :mod:`sqlite3` authorizer callback by passing
|
||||||
|
:const:``None`` to :meth:`~sqlite3.Connection.set_authorizer`. Patch by
|
||||||
|
Erlend E. Aasland.
|
|
@ -1053,20 +1053,24 @@ pysqlite_connection_set_authorizer_impl(pysqlite_Connection *self,
|
||||||
PyObject *authorizer_cb)
|
PyObject *authorizer_cb)
|
||||||
/*[clinic end generated code: output=f18ba575d788b35c input=df079724c020d2f2]*/
|
/*[clinic end generated code: output=f18ba575d788b35c input=df079724c020d2f2]*/
|
||||||
{
|
{
|
||||||
int rc;
|
|
||||||
|
|
||||||
if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = sqlite3_set_authorizer(self->db, _authorizer_callback, (void*)authorizer_cb);
|
int rc;
|
||||||
|
if (authorizer_cb == Py_None) {
|
||||||
|
rc = sqlite3_set_authorizer(self->db, NULL, NULL);
|
||||||
|
Py_XSETREF(self->function_pinboard_authorizer_cb, NULL);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Py_INCREF(authorizer_cb);
|
||||||
|
Py_XSETREF(self->function_pinboard_authorizer_cb, authorizer_cb);
|
||||||
|
rc = sqlite3_set_authorizer(self->db, _authorizer_callback, authorizer_cb);
|
||||||
|
}
|
||||||
if (rc != SQLITE_OK) {
|
if (rc != SQLITE_OK) {
|
||||||
PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback");
|
PyErr_SetString(pysqlite_OperationalError, "Error setting authorizer callback");
|
||||||
Py_XSETREF(self->function_pinboard_authorizer_cb, NULL);
|
Py_XSETREF(self->function_pinboard_authorizer_cb, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
|
||||||
Py_INCREF(authorizer_cb);
|
|
||||||
Py_XSETREF(self->function_pinboard_authorizer_cb, authorizer_cb);
|
|
||||||
}
|
}
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue