|
|
@@ -25,53 +25,49 @@ ScriptEngine* createScriptEngine(std::string extension) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Global warning message for script security |
|
|
|
bool securityRequested = false; |
|
|
|
bool securityAccepted = false; |
|
|
|
|
|
|
|
json_t *settingsToJson() { |
|
|
|
json_t *rootJ = json_object(); |
|
|
|
json_object_set_new(rootJ, "securityAccepted", json_boolean(securityAccepted)); |
|
|
|
return rootJ; |
|
|
|
} |
|
|
|
|
|
|
|
void settingsFromJson(json_t *rootJ) { |
|
|
|
json_t *securityAcceptedJ = json_object_get(rootJ, "securityAccepted"); |
|
|
|
if (securityAcceptedJ) |
|
|
|
securityAccepted = json_boolean_value(securityAcceptedJ); |
|
|
|
} |
|
|
|
|
|
|
|
void settingsLoad() { |
|
|
|
// Load plugin settings |
|
|
|
std::string filename = asset::user("VCV-Prototype.json"); |
|
|
|
FILE *file = fopen(filename.c_str(), "r"); |
|
|
|
if (!file) { |
|
|
|
return; |
|
|
|
} |
|
|
|
DEFER({ |
|
|
|
fclose(file); |
|
|
|
}); |
|
|
|
|
|
|
|
json_error_t error; |
|
|
|
json_t *rootJ = json_loadf(file, 0, &error); |
|
|
|
if (rootJ) { |
|
|
|
settingsFromJson(rootJ); |
|
|
|
json_decref(rootJ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void settingsSave() { |
|
|
|
json_t *rootJ = settingsToJson(); |
|
|
|
|
|
|
|
std::string filename = asset::user("VCV-Prototype.json"); |
|
|
|
FILE *file = fopen(filename.c_str(), "w"); |
|
|
|
if (file) { |
|
|
|
json_dumpf(rootJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9)); |
|
|
|
fclose(file); |
|
|
|
} |
|
|
|
|
|
|
|
json_decref(rootJ); |
|
|
|
} |
|
|
|
// json_t *settingsToJson() { |
|
|
|
// json_t *rootJ = json_object(); |
|
|
|
// json_object_set_new(rootJ, "securityAccepted", json_boolean(securityAccepted)); |
|
|
|
// return rootJ; |
|
|
|
// } |
|
|
|
|
|
|
|
// void settingsFromJson(json_t *rootJ) { |
|
|
|
// json_t *securityAcceptedJ = json_object_get(rootJ, "securityAccepted"); |
|
|
|
// if (securityAcceptedJ) |
|
|
|
// securityAccepted = json_boolean_value(securityAcceptedJ); |
|
|
|
// } |
|
|
|
|
|
|
|
// void settingsLoad() { |
|
|
|
// // Load plugin settings |
|
|
|
// std::string filename = asset::user("VCV-Prototype.json"); |
|
|
|
// FILE *file = fopen(filename.c_str(), "r"); |
|
|
|
// if (!file) { |
|
|
|
// return; |
|
|
|
// } |
|
|
|
// DEFER({ |
|
|
|
// fclose(file); |
|
|
|
// }); |
|
|
|
|
|
|
|
// json_error_t error; |
|
|
|
// json_t *rootJ = json_loadf(file, 0, &error); |
|
|
|
// if (rootJ) { |
|
|
|
// settingsFromJson(rootJ); |
|
|
|
// json_decref(rootJ); |
|
|
|
// } |
|
|
|
// } |
|
|
|
|
|
|
|
// void settingsSave() { |
|
|
|
// json_t *rootJ = settingsToJson(); |
|
|
|
|
|
|
|
// std::string filename = asset::user("VCV-Prototype.json"); |
|
|
|
// FILE *file = fopen(filename.c_str(), "w"); |
|
|
|
// if (file) { |
|
|
|
// json_dumpf(rootJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9)); |
|
|
|
// fclose(file); |
|
|
|
// } |
|
|
|
|
|
|
|
// json_decref(rootJ); |
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
struct Prototype : Module { |
|
|
@@ -97,8 +93,6 @@ struct Prototype : Module { |
|
|
|
std::string message; |
|
|
|
std::string path; |
|
|
|
std::string script; |
|
|
|
/** Script that has not yet been approved to load */ |
|
|
|
std::string securityScript; |
|
|
|
std::string engineName; |
|
|
|
std::mutex scriptMutex; |
|
|
|
ScriptEngine* scriptEngine = NULL; |
|
|
@@ -109,6 +103,11 @@ struct Prototype : Module { |
|
|
|
|
|
|
|
efsw_watcher efsw = NULL; |
|
|
|
|
|
|
|
/** Script that has not yet been approved to load */ |
|
|
|
std::string securityScript; |
|
|
|
bool securityRequested = false; |
|
|
|
bool securityAccepted = false; |
|
|
|
|
|
|
|
Prototype() { |
|
|
|
config(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS); |
|
|
|
for (int i = 0; i < NUM_ROWS; i++) |
|
|
@@ -563,12 +562,12 @@ struct PrototypeWidget : ModuleWidget { |
|
|
|
} |
|
|
|
|
|
|
|
void step() override { |
|
|
|
if (securityRequested) { |
|
|
|
if (osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK_CANCEL, "VCV Prototype is about to load a script from a patch or module preset. Running Prototype scripts from untrusted sources may compromise your computer and personal information. Proceed and don't display this message again?")) { |
|
|
|
securityAccepted = true; |
|
|
|
settingsSave(); |
|
|
|
Prototype* module = dynamic_cast<Prototype*>(this->module); |
|
|
|
if (module && module->securityRequested) { |
|
|
|
if (osdialog_message(OSDIALOG_WARNING, OSDIALOG_OK_CANCEL, "VCV Prototype is requesting to run a script from a patch or module preset. Running Prototype scripts from untrusted sources may compromise your computer and personal information. Proceed and run script?")) { |
|
|
|
module->securityAccepted = true; |
|
|
|
} |
|
|
|
securityRequested = false; |
|
|
|
module->securityRequested = false; |
|
|
|
} |
|
|
|
ModuleWidget::step(); |
|
|
|
} |
|
|
@@ -578,6 +577,4 @@ void init(Plugin* p) { |
|
|
|
pluginInstance = p; |
|
|
|
|
|
|
|
p->addModel(createModel<Prototype, PrototypeWidget>("Prototype")); |
|
|
|
|
|
|
|
settingsLoad(); |
|
|
|
} |