plugins/python/sudo_module: let a reject also supply error message
Same as sudo.PluginError exception, have a sudo.PluginReject exception as well. Added common base exception as well.
This commit is contained in:

committed by
Todd C. Miller

parent
d1f94c857c
commit
b165242035
@@ -111,14 +111,26 @@ _import_module(const char *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
python_plugin_handle_plugin_error_exception(struct PluginContext *plugin_ctx)
|
python_plugin_handle_plugin_error_exception(PyObject **py_result, struct PluginContext *plugin_ctx)
|
||||||
{
|
{
|
||||||
debug_decl(python_plugin_handle_plugin_error_exception, PYTHON_DEBUG_INTERNAL);
|
debug_decl(python_plugin_handle_plugin_error_exception, PYTHON_DEBUG_INTERNAL);
|
||||||
|
|
||||||
free(plugin_ctx->callback_error);
|
free(plugin_ctx->callback_error);
|
||||||
plugin_ctx->callback_error = NULL;
|
plugin_ctx->callback_error = NULL;
|
||||||
|
|
||||||
if (PyErr_Occurred() && PyErr_ExceptionMatches(sudo_exc_PluginError)) {
|
if (PyErr_Occurred()) {
|
||||||
|
int rc = SUDO_RC_ERROR;
|
||||||
|
if (PyErr_ExceptionMatches(sudo_exc_PluginReject)) {
|
||||||
|
rc = SUDO_RC_REJECT;
|
||||||
|
} else if (!PyErr_ExceptionMatches(sudo_exc_PluginError)) {
|
||||||
|
debug_return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (py_result != NULL) {
|
||||||
|
Py_CLEAR(*py_result);
|
||||||
|
*py_result = PyLong_FromLong(rc);
|
||||||
|
}
|
||||||
|
|
||||||
PyObject *py_type = NULL, *py_message = NULL, *py_traceback = NULL;
|
PyObject *py_type = NULL, *py_message = NULL, *py_traceback = NULL;
|
||||||
PyErr_Fetch(&py_type, &py_message, &py_traceback);
|
PyErr_Fetch(&py_type, &py_message, &py_traceback);
|
||||||
|
|
||||||
@@ -155,7 +167,7 @@ python_plugin_construct_custom(struct PluginContext *plugin_ctx, PyObject *py_kw
|
|||||||
py_args, py_kwargs, PYTHON_DEBUG_PY_CALLS);
|
py_args, py_kwargs, PYTHON_DEBUG_PY_CALLS);
|
||||||
|
|
||||||
plugin_ctx->py_instance = PyObject_Call(plugin_ctx->py_class, py_args, py_kwargs);
|
plugin_ctx->py_instance = PyObject_Call(plugin_ctx->py_class, py_args, py_kwargs);
|
||||||
python_plugin_handle_plugin_error_exception(plugin_ctx);
|
python_plugin_handle_plugin_error_exception(NULL, plugin_ctx);
|
||||||
|
|
||||||
py_debug_python_result(python_plugin_name(plugin_ctx), "__init__",
|
py_debug_python_result(python_plugin_name(plugin_ctx), "__init__",
|
||||||
plugin_ctx->py_instance, PYTHON_DEBUG_PY_CALLS);
|
plugin_ctx->py_instance, PYTHON_DEBUG_PY_CALLS);
|
||||||
@@ -429,7 +441,7 @@ python_plugin_api_call(struct PluginContext *plugin_ctx, const char *func_name,
|
|||||||
py_debug_python_result(python_plugin_name(plugin_ctx), func_name,
|
py_debug_python_result(python_plugin_name(plugin_ctx), func_name,
|
||||||
py_result, PYTHON_DEBUG_PY_CALLS);
|
py_result, PYTHON_DEBUG_PY_CALLS);
|
||||||
|
|
||||||
python_plugin_handle_plugin_error_exception(plugin_ctx);
|
python_plugin_handle_plugin_error_exception(&py_result, plugin_ctx);
|
||||||
|
|
||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
py_log_last_error(NULL);
|
py_log_last_error(NULL);
|
||||||
|
@@ -31,7 +31,9 @@ PyAPI_FUNC(PyObject *) PyStructSequence_GetItem(PyObject *, Py_ssize_t);
|
|||||||
|
|
||||||
// exceptions:
|
// exceptions:
|
||||||
PyObject *sudo_exc_SudoException;
|
PyObject *sudo_exc_SudoException;
|
||||||
|
PyObject *sudo_exc_PluginException;
|
||||||
PyObject *sudo_exc_PluginError;
|
PyObject *sudo_exc_PluginError;
|
||||||
|
PyObject *sudo_exc_PluginReject;
|
||||||
static PyObject *sudo_exc_ConversationInterrupted;
|
static PyObject *sudo_exc_ConversationInterrupted;
|
||||||
|
|
||||||
// the methods exposed in the "sudo" python module
|
// the methods exposed in the "sudo" python module
|
||||||
@@ -563,7 +565,11 @@ sudo_module_init(void)
|
|||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
MODULE_ADD_EXCEPTION(SudoException, NULL);
|
MODULE_ADD_EXCEPTION(SudoException, NULL);
|
||||||
MODULE_ADD_EXCEPTION(PluginError, NULL);
|
|
||||||
|
MODULE_ADD_EXCEPTION(PluginException, NULL);
|
||||||
|
MODULE_ADD_EXCEPTION(PluginError, EXC_VAR(PluginException));
|
||||||
|
MODULE_ADD_EXCEPTION(PluginReject, EXC_VAR(PluginException));
|
||||||
|
|
||||||
MODULE_ADD_EXCEPTION(ConversationInterrupted, EXC_VAR(SudoException));
|
MODULE_ADD_EXCEPTION(ConversationInterrupted, EXC_VAR(SudoException));
|
||||||
|
|
||||||
#define MODULE_REGISTER_ENUM(name, key_values) \
|
#define MODULE_REGISTER_ENUM(name, key_values) \
|
||||||
|
@@ -23,8 +23,10 @@
|
|||||||
|
|
||||||
extern PyObject *sudo_exc_SudoException; // Base exception for the sudo module problems
|
extern PyObject *sudo_exc_SudoException; // Base exception for the sudo module problems
|
||||||
|
|
||||||
// This is for the python plugins to report errors for us
|
// This is for the python plugins to report error messages for us
|
||||||
extern PyObject *sudo_exc_PluginError;
|
extern PyObject *sudo_exc_PluginException; // base exception of the following:
|
||||||
|
extern PyObject *sudo_exc_PluginReject; // a reject with message
|
||||||
|
extern PyObject *sudo_exc_PluginError; // an error with message
|
||||||
|
|
||||||
extern PyTypeObject *sudo_type_Plugin;
|
extern PyTypeObject *sudo_type_Plugin;
|
||||||
extern PyTypeObject *sudo_type_ConvMessage;
|
extern PyTypeObject *sudo_type_ConvMessage;
|
||||||
|
Reference in New Issue
Block a user