mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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 @@ def test_check_connection_thread(self): | ||||||
|             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 @@ def test_column_access(self): | ||||||
|             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
	
	 Erlend Egeberg Aasland
						Erlend Egeberg Aasland