bpo-44491: Allow clearing the sqlite3 authoriser callback (GH-26863)

This commit is contained in:
Erlend Egeberg Aasland 2021-06-24 16:35:57 +02:00 committed by GitHub
parent 18ba1ff6a4
commit b19f455339
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 33 additions and 6 deletions

View file

@ -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)

View file

@ -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

View file

@ -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:

View file

@ -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):

View file

@ -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.

View file

@ -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;
} }