Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_global.h5
-rw-r--r--source/blender/editors/space_script/script_edit.c21
-rw-r--r--source/blender/editors/space_script/script_intern.h1
-rw-r--r--source/blender/editors/space_script/script_ops.c1
-rw-r--r--source/blender/python/intern/bpy_app.c16
-rw-r--r--source/blender/python/intern/bpy_driver.c8
-rw-r--r--source/blender/python/intern/bpy_interface.c11
-rw-r--r--source/blender/windowmanager/SConscript3
-rw-r--r--source/blender/windowmanager/intern/wm_files.c2
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c29
10 files changed, 84 insertions, 13 deletions
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index a0c6bcd4a5b..8a55d3e8a17 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -93,6 +93,9 @@ typedef struct Global {
/* save the allowed windowstate of blender when using -W or -w (GHOST_TWindowState) */
int windowstate;
+
+ /* message to use when autoexec fails */
+ char autoexec_fail[200];
} Global;
/* **************** GLOBAL ********************* */
@@ -109,6 +112,8 @@ typedef struct Global {
#define G_SCRIPT_AUTOEXEC (1 << 13)
#define G_SCRIPT_OVERRIDE_PREF (1 << 14) /* when this flag is set ignore the userprefs */
+#define G_SCRIPT_AUTOEXEC_FAIL (1 << 15)
+#define G_SCRIPT_AUTOEXEC_FAIL_QUIET (1 << 16)
/* #define G_NOFROZEN (1 << 17) also removed */
/* #define G_GREASEPENCIL (1 << 17) also removed */
diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index 96008004ee4..8074ec57474 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -36,6 +36,7 @@
#include "BLI_utildefines.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -110,3 +111,23 @@ void SCRIPT_OT_reload(wmOperatorType *ot)
/* api callbacks */
ot->exec = script_reload_exec;
}
+
+static int script_autoexec_warn_clear_exec(bContext *UNUSED(C), wmOperator *UNUSED(op))
+{
+ G.f |= G_SCRIPT_AUTOEXEC_FAIL_QUIET;
+ return OPERATOR_FINISHED;
+}
+
+void SCRIPT_OT_autoexec_warn_clear(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Continue Untrusted";
+ ot->description = "Ignore autoexec warning";
+ ot->idname = "SCRIPT_OT_autoexec_warn_clear";
+
+ /* flags */
+ ot->flag = OPTYPE_INTERNAL;
+
+ /* api callbacks */
+ ot->exec = script_autoexec_warn_clear_exec;
+}
diff --git a/source/blender/editors/space_script/script_intern.h b/source/blender/editors/space_script/script_intern.h
index 00863863994..cef6082aa1c 100644
--- a/source/blender/editors/space_script/script_intern.h
+++ b/source/blender/editors/space_script/script_intern.h
@@ -40,6 +40,7 @@ void script_keymap(struct wmKeyConfig *keyconf);
/* script_edit.c */
void SCRIPT_OT_reload(struct wmOperatorType *ot);
void SCRIPT_OT_python_file_run(struct wmOperatorType *ot);
+void SCRIPT_OT_autoexec_warn_clear(struct wmOperatorType *ot);
#endif /* __SCRIPT_INTERN_H__ */
diff --git a/source/blender/editors/space_script/script_ops.c b/source/blender/editors/space_script/script_ops.c
index 57a1112a832..7398126a8e5 100644
--- a/source/blender/editors/space_script/script_ops.c
+++ b/source/blender/editors/space_script/script_ops.c
@@ -56,6 +56,7 @@ void script_operatortypes(void)
{
WM_operatortype_append(SCRIPT_OT_python_file_run);
WM_operatortype_append(SCRIPT_OT_reload);
+ WM_operatortype_append(SCRIPT_OT_autoexec_warn_clear);
}
void script_keymap(wmKeyConfig *keyconf)
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index 17dafc4ac52..2edb0aee783 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -219,6 +219,12 @@ static int bpy_app_debug_value_set(PyObject *UNUSED(self), PyObject *value, void
return 0;
}
+static PyObject *bpy_app_global_flag_get(PyObject *UNUSED(self), void *closure)
+{
+ const int flag = GET_INT_FROM_POINTER(closure);
+ return PyBool_FromLong(G.f & flag);
+}
+
PyDoc_STRVAR(bpy_app_tempdir_doc,
"String, the temp directory used by blender (read-only)"
);
@@ -243,6 +249,11 @@ static PyObject *bpy_app_driver_dict_get(PyObject *UNUSED(self), void *UNUSED(cl
return bpy_pydriver_Dict;
}
+static PyObject *bpy_app_autoexec_fail_message_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+ return PyC_UnicodeFromByte(G.autoexec_fail);
+}
+
static PyGetSetDef bpy_app_getsets[] = {
{(char *)"debug", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG},
@@ -256,6 +267,11 @@ static PyGetSetDef bpy_app_getsets[] = {
{(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)bpy_app_debug_value_doc, NULL},
{(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)bpy_app_tempdir_doc, NULL},
{(char *)"driver_namespace", bpy_app_driver_dict_get, NULL, (char *)bpy_app_driver_dict_doc, NULL},
+
+ /* security */
+ {(char *)"autoexec_fail", bpy_app_global_flag_get, NULL, NULL, (void *)G_SCRIPT_AUTOEXEC_FAIL},
+ {(char *)"autoexec_fail_quiet", bpy_app_global_flag_get, NULL, NULL, (void *)G_SCRIPT_AUTOEXEC_FAIL_QUIET},
+ {(char *)"autoexec_fail_message", bpy_app_autoexec_fail_message_get, NULL, NULL, NULL},
{NULL, NULL, NULL, NULL, NULL}
};
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index 72bfda89b64..e7c0b7b8811 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -37,6 +37,7 @@
#include "BLI_listbase.h"
#include "BLI_math_base.h"
+#include "BLI_string.h"
#include "BKE_fcurve.h"
#include "BKE_global.h"
@@ -189,7 +190,12 @@ float BPY_driver_exec(ChannelDriver *driver, const float evaltime)
return 0.0f;
if (!(G.f & G_SCRIPT_AUTOEXEC)) {
- printf("skipping driver '%s', automatic scripts are disabled\n", driver->expression);
+ if (!(G.f & G_SCRIPT_AUTOEXEC_FAIL_QUIET)) {
+ G.f |= G_SCRIPT_AUTOEXEC_FAIL;
+ BLI_snprintf(G.autoexec_fail, sizeof(G.autoexec_fail), "Driver '%s'", driver->expression);
+
+ printf("skipping driver '%s', automatic scripts are disabled\n", driver->expression);
+ }
return 0.0f;
}
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 75827ce8bbf..c39168779fd 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -398,6 +398,10 @@ void BPY_python_end(void)
void BPY_python_reset(bContext *C)
{
+ /* unrelated security stuff */
+ G.f &= ~(G_SCRIPT_AUTOEXEC_FAIL | G_SCRIPT_AUTOEXEC_FAIL_QUIET);
+ G.autoexec_fail[0] = '\0';
+
BPY_driver_reset();
BPY_app_handlers_reset(false);
BPY_modules_load_user(C);
@@ -725,7 +729,12 @@ void BPY_modules_load_user(bContext *C)
for (text = bmain->text.first; text; text = text->id.next) {
if (text->flags & TXT_ISSCRIPT && BLI_testextensie(text->id.name + 2, ".py")) {
if (!(G.f & G_SCRIPT_AUTOEXEC)) {
- printf("scripts disabled for \"%s\", skipping '%s'\n", bmain->name, text->id.name + 2);
+ if (!(G.f & G_SCRIPT_AUTOEXEC_FAIL_QUIET)) {
+ G.f |= G_SCRIPT_AUTOEXEC_FAIL;
+ BLI_snprintf(G.autoexec_fail, sizeof(G.autoexec_fail), "Register Text '%s'", text->id.name + 2);
+
+ printf("scripts disabled for \"%s\", skipping '%s'\n", bmain->name, text->id.name + 2);
+ }
}
else {
PyObject *module = bpy_text_import(text);
diff --git a/source/blender/windowmanager/SConscript b/source/blender/windowmanager/SConscript
index 3a813d7d598..0a2f48f0488 100644
--- a/source/blender/windowmanager/SConscript
+++ b/source/blender/windowmanager/SConscript
@@ -78,4 +78,7 @@ if env['WITH_BF_INTERNATIONAL']:
if env['WITH_BF_COMPOSITOR']:
defs.append("WITH_COMPOSITOR")
+if env['WITH_BF_PYTHON_SECURITY']:
+ defs.append("WITH_PYTHON_SECURITY")
+
env.BlenderLib ( 'bf_windowmanager', sources, Split(incs), defines=defs, libtype=['core'], priority=[5] )
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index c372e2d1ce6..f9e93118033 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -541,7 +541,7 @@ int wm_homefile_read(bContext *C, ReportList *UNUSED(reports), short from_memory
success = BKE_read_file_from_memory(C, datatoc_startup_blend, datatoc_startup_blend_size, NULL);
if (wmbase.first == NULL) wm_clear_default_size(C);
-#ifdef WITH_PYTHON_SECURITY /* not default */
+#ifdef WITH_PYTHON_SECURITY
/* use alternative setting for security nuts
* otherwise we'd need to patch the binary blob - startup.blend.c */
U.flag |= USER_SCRIPT_AUTOEXEC_DISABLE;
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 423ddfcc568..d832e84d7f0 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -1916,19 +1916,26 @@ static void WM_OT_read_factory_settings(wmOperatorType *ot)
/* *************** open file **************** */
-static void open_set_load_ui(wmOperator *op)
+static void open_set_load_ui(wmOperator *op, bool use_prefs)
{
- if (!RNA_struct_property_is_set(op->ptr, "load_ui"))
- RNA_boolean_set(op->ptr, "load_ui", !(U.flag & USER_FILENOUI));
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "load_ui");
+ if (!RNA_property_is_set(op->ptr, prop)) {
+ RNA_property_boolean_set(op->ptr, prop, use_prefs ?
+ (U.flag & USER_FILENOUI) == 0 :
+ (G.fileflags |= G_FILE_NO_UI) == 0);
+ }
}
-static void open_set_use_scripts(wmOperator *op)
+static void open_set_use_scripts(wmOperator *op, bool use_prefs)
{
- if (!RNA_struct_property_is_set(op->ptr, "use_scripts")) {
+ PropertyRNA *prop = RNA_struct_find_property(op->ptr, "use_scripts");
+ if (!RNA_property_is_set(op->ptr, prop)) {
/* use G_SCRIPT_AUTOEXEC rather than the userpref because this means if
* the flag has been disabled from the command line, then opening
* from the menu wont enable this setting. */
- RNA_boolean_set(op->ptr, "use_scripts", (G.f & G_SCRIPT_AUTOEXEC));
+ RNA_property_boolean_set(op->ptr, prop, use_prefs ?
+ (U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0 :
+ (G.f & G_SCRIPT_AUTOEXEC) != 0);
}
}
@@ -1951,8 +1958,8 @@ static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, const wmEvent *U
}
RNA_string_set(op->ptr, "filepath", openname);
- open_set_load_ui(op);
- open_set_use_scripts(op);
+ open_set_load_ui(op, true);
+ open_set_use_scripts(op, true);
WM_event_add_fileselect(C, op);
@@ -1964,8 +1971,10 @@ static int wm_open_mainfile_exec(bContext *C, wmOperator *op)
char path[FILE_MAX];
RNA_string_get(op->ptr, "filepath", path);
- open_set_load_ui(op);
- open_set_use_scripts(op);
+
+ /* re-use last loaded setting so we can reload a file without changing */
+ open_set_load_ui(op, false);
+ open_set_use_scripts(op, false);
if (RNA_boolean_get(op->ptr, "load_ui"))
G.fileflags &= ~G_FILE_NO_UI;