Compare commits

..
Author SHA1 Message Date
Ian Chua 15aa9fe6c3 fix: avoid substring denies in audit path keywords 2026-10-07 15:11:55 +08:00
40 changed files with 138 additions and 119 deletions
+4 -6
View File
@@ -4,17 +4,15 @@ OrcaSlicer — open-source C++17 3D slicer. wxWidgets GUI, CMake build system.
## Build Commands ## Build Commands
Build the Release configuration unless asked otherwise.
```bash ```bash
# macOS # macOS
cmake --build build/arm64 --config Release --target all -- cmake --build build/arm64 --config RelWithDebInfo --target all --
# Linux # Linux
cmake --build build --config Release --target all -- cmake --build build --config RelWithDebInfo --target all --
# Windows # Windows (replace %build_type% with Debug/Release/RelWithDebInfo)
cmake --build . --config Release --target ALL_BUILD -- -m cmake --build . --config %build_type% --target ALL_BUILD -- -m
``` ```
## Testing ## Testing
+2 -2
View File
@@ -974,8 +974,8 @@ bool AMSMaterialsSetting::Show(bool show)
static void _collect_filament_info(const wxString& shown_name, static void _collect_filament_info(const wxString& shown_name,
const Preset& filament, const Preset& filament,
std::unordered_map<wxString, wxString>& query_filament_vendors, unordered_map<wxString, wxString>& query_filament_vendors,
std::unordered_map<wxString, wxString>& query_filament_types) unordered_map<wxString, wxString>& query_filament_types)
{ {
query_filament_vendors[shown_name] = filament.config.get_filament_vendor(); query_filament_vendors[shown_name] = filament.config.get_filament_vendor();
query_filament_types[shown_name] = filament.config.get_filament_type(); query_filament_types[shown_name] = filament.config.get_filament_type();
+3 -3
View File
@@ -856,14 +856,14 @@ void AuxiliaryPanel::Split(const std::string &src, const std::string &separator,
dest.clear(); dest.clear();
index = str.find_first_of(separator, start); index = str.find_first_of(separator, start);
do { do {
if (index != std::string::npos) { if (index != string::npos) {
substring = str.substr(start, index - start); substring = str.substr(start, index - start);
dest.push_back(substring); dest.push_back(substring);
start = index + separator.size(); start = index + separator.size();
index = str.find(separator, start); index = str.find(separator, start);
if (start == std::string::npos) break; if (start == string::npos) break;
} }
} while (index != std::string::npos); } while (index != string::npos);
// the last part // the last part
substring = str.substr(start); substring = str.substr(start);
@@ -1307,7 +1307,7 @@ void CalibrationPresetPage::stripWhiteSpace(std::string& str)
{ {
if (str == "") { return; } if (str == "") { return; }
std::string::iterator cur_it; string::iterator cur_it;
cur_it = str.begin(); cur_it = str.begin();
while (cur_it != str.end()) { while (cur_it != str.end()) {
@@ -2597,7 +2597,7 @@ void CalibrationPresetPage::update_multi_extruder_filament_combobox(const std::s
int ams_id_int = 0; int ams_id_int = 0;
try { try {
if (!ams_id.empty()) if (!ams_id.empty())
ams_id_int = std::stoi(ams_id.c_str()); ams_id_int = stoi(ams_id.c_str());
} catch (...) {} } catch (...) {}
@@ -2685,7 +2685,7 @@ void CalibrationPresetPage::update_filament_combobox(std::string ams_id)
int ams_id_int = 0; int ams_id_int = 0;
try { try {
if (!ams_id.empty()) if (!ams_id.empty())
ams_id_int = std::stoi(ams_id.c_str()); ams_id_int = stoi(ams_id.c_str());
} catch (...) {} } catch (...) {}
+4 -4
View File
@@ -347,7 +347,7 @@ static std::string get_curr_timestmp()
// return timestampString; // return timestampString;
} }
static void get_filament_compatible_printer(Preset* preset, std::vector<std::string>& printers) static void get_filament_compatible_printer(Preset* preset, vector<std::string>& printers)
{ {
auto compatible_printers = dynamic_cast<ConfigOptionStrings *>(preset->config.option("compatible_printers")); auto compatible_printers = dynamic_cast<ConfigOptionStrings *>(preset->config.option("compatible_printers"));
if (compatible_printers == nullptr) return; if (compatible_printers == nullptr) return;
@@ -1581,7 +1581,7 @@ void CreateFilamentPresetDialog::sort_printer_by_nozzle(std::vector<std::pair<st
{ {
std::unordered_map<std::string, float> nozzle_diameter = nozzle_diameter_map; std::unordered_map<std::string, float> nozzle_diameter = nozzle_diameter_map;
std::sort(printer_name_to_filament_preset.begin(), printer_name_to_filament_preset.end(), std::sort(printer_name_to_filament_preset.begin(), printer_name_to_filament_preset.end(),
[&nozzle_diameter](const std::pair<std::string, T> &a, const std::pair<std::string, T> &b) { [&nozzle_diameter](const std::pair<string, T> &a, const std::pair<string, T> &b) {
size_t nozzle_index_a = a.first.find(" nozzle"); size_t nozzle_index_a = a.first.find(" nozzle");
size_t nozzle_index_b = b.first.find(" nozzle"); size_t nozzle_index_b = b.first.find(" nozzle");
if (nozzle_index_a == std::string::npos || nozzle_index_b == std::string::npos) return a.first < b.first; if (nozzle_index_a == std::string::npos || nozzle_index_b == std::string::npos) return a.first < b.first;
@@ -3143,7 +3143,7 @@ void CreatePrinterPresetDialog::set_current_visible_printer()
wxArrayString CreatePrinterPresetDialog::printer_preset_sort_with_nozzle_diameter(const VendorProfile &vendor_profile, float nozzle_diameter) wxArrayString CreatePrinterPresetDialog::printer_preset_sort_with_nozzle_diameter(const VendorProfile &vendor_profile, float nozzle_diameter)
{ {
std::vector<std::pair<float, std::string>> preset_sort; std::vector<pair<float, std::string>> preset_sort;
auto get_nozzle_size_for_printer_model = [this](const std::string & model_name) -> size_t { auto get_nozzle_size_for_printer_model = [this](const std::string & model_name) -> size_t {
auto iter = m_printer_name_to_preset.find(model_name); auto iter = m_printer_name_to_preset.find(model_name);
@@ -4964,7 +4964,7 @@ wxBoxSizer *CreatePresetForPrinterDialog::create_selected_filament_preset_sizer(
m_selected_printer->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) { m_selected_printer->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &e) {
wxString printer_name = m_selected_printer->GetStringSelection(); wxString printer_name = m_selected_printer->GetStringSelection();
std::unordered_map<std::string, std::vector<std::shared_ptr<Preset>>>::iterator filament_iter = m_printer_compatible_filament_presets.find(into_u8(printer_name)); std::unordered_map<string, std::vector<std::shared_ptr<Preset>>>::iterator filament_iter = m_printer_compatible_filament_presets.find(into_u8(printer_name));
if (m_printer_compatible_filament_presets.end() != filament_iter) { if (m_printer_compatible_filament_presets.end() != filament_iter) {
filament_choice_to_filament_preset.clear(); filament_choice_to_filament_preset.clear();
wxArrayString filament_choices; wxArrayString filament_choices;
+1 -1
View File
@@ -160,7 +160,7 @@ DevAms::~DevAms()
m_trays.clear(); m_trays.clear();
} }
static std::unordered_map<int, wxString> s_ams_display_formats = { static unordered_map<int, wxString> s_ams_display_formats = {
{DevAms::AMS, "AMS-%d"}, {DevAms::AMS, "AMS-%d"},
{DevAms::AMS_LITE, "AMS Lite-%d"}, {DevAms::AMS_LITE, "AMS Lite-%d"},
{DevAms::N3F, "AMS 2 PRO-%d"}, {DevAms::N3F, "AMS 2 PRO-%d"},
@@ -250,7 +250,7 @@ int DevNozzleMappingCtrl::CtrlGetAutoNozzleMappingV1(Slic3r::GUI::Plater* plater
void DevNozzleMappingCtrl::ParseAutoNozzleMapping(const json& print_jj) void DevNozzleMappingCtrl::ParseAutoNozzleMapping(const json& print_jj)
{ {
if (print_jj.contains("command") && print_jj["command"].get<std::string>() == "get_auto_nozzle_mapping") { if (print_jj.contains("command") && print_jj["command"].get<string>() == "get_auto_nozzle_mapping") {
if (print_jj.contains("sequence_id") && print_jj["sequence_id"] == m_sequence_id) { if (print_jj.contains("sequence_id") && print_jj["sequence_id"] == m_sequence_id) {
Clear(); Clear();
DevJsonValParser::ParseVal(print_jj, "result", m_result); DevJsonValParser::ParseVal(print_jj, "result", m_result);
@@ -426,7 +426,7 @@ void DevNozzleSystem::ClearNozzles()
// ---- parsing ---------------------------------------------------------------------------------------- // ---- parsing ----------------------------------------------------------------------------------------
static std::unordered_map<std::string, NozzleFlowType> _str2_nozzle_flow_type = { static unordered_map<string, NozzleFlowType> _str2_nozzle_flow_type = {
{"S", NozzleFlowType::S_FLOW}, {"S", NozzleFlowType::S_FLOW},
{"H", NozzleFlowType::H_FLOW}, {"H", NozzleFlowType::H_FLOW},
{"A", NozzleFlowType::S_FLOW}, {"A", NozzleFlowType::S_FLOW},
@@ -436,7 +436,7 @@ static std::unordered_map<std::string, NozzleFlowType> _str2_nozzle_flow_type =
{"B", NozzleFlowType::E_FLOW}, // E3D High Flow -> nvtE3DHighFlow {"B", NozzleFlowType::E_FLOW}, // E3D High Flow -> nvtE3DHighFlow
}; };
static std::unordered_map<std::string, NozzleType> _str2_nozzle_type = { static unordered_map<string, NozzleType> _str2_nozzle_type = {
{"00", NozzleType::ntStainlessSteel}, {"00", NozzleType::ntStainlessSteel},
{"01", NozzleType::ntHardenedSteel}, {"01", NozzleType::ntHardenedSteel},
{"05", NozzleType::ntTungstenCarbide} {"05", NozzleType::ntTungstenCarbide}
+1 -1
View File
@@ -368,7 +368,7 @@ wxString DeviceErrorDialog::parse_error_level(int error_code)
} }
} }
static const std::unordered_set<std::string> s_jump_liveview_error_codes = { "0300-8003", "0300-8002", "0300-800A"}; static const std::unordered_set<string> s_jump_liveview_error_codes = { "0300-8003", "0300-8002", "0300-800A"};
wxString DeviceErrorDialog::show_error_code(int error_code) wxString DeviceErrorDialog::show_error_code(int error_code)
{ {
if (m_error_code == error_code) { return wxEmptyString;} if (m_error_code == error_code) { return wxEmptyString;}
+1 -2
View File
@@ -110,7 +110,6 @@ using json = nlohmann::json;
class wxWindow; class wxWindow;
namespace fs = boost::filesystem; namespace fs = boost::filesystem;
using namespace std::chrono_literals;
#define CALI_DEBUG #define CALI_DEBUG
#define MINUTE_30 1800000 //ms #define MINUTE_30 1800000 //ms
@@ -3104,7 +3103,7 @@ int MachineObject::parse_json(std::string tunnel, std::string payload, bool key_
DevFirmwareVersionInfo ver_info; DevFirmwareVersionInfo ver_info;
ver_info.name = (*it)["name"].get<std::string>(); ver_info.name = (*it)["name"].get<std::string>();
if ((*it).contains("product_name")) if ((*it).contains("product_name"))
ver_info.product_name = wxString::FromUTF8((*it)["product_name"].get<std::string>()); ver_info.product_name = wxString::FromUTF8((*it)["product_name"].get<string>());
if ((*it).contains("sw_ver")) if ((*it).contains("sw_ver"))
ver_info.sw_ver = (*it)["sw_ver"].get<std::string>(); ver_info.sw_ver = (*it)["sw_ver"].get<std::string>();
if ((*it).contains("sw_new_ver")) if ((*it).contains("sw_new_ver"))
+3 -3
View File
@@ -294,8 +294,8 @@ wxDataViewItem EditGCodeDialog::add_presets_placeholders()
// Orca: create subgroups from the pages of the tabs // Orca: create subgroups from the pages of the tabs
auto init_from_tab = [this, full_config](wxDataViewItem parent, Tab* tab, const std::set<std::string>& preset_keys){ auto init_from_tab = [this, full_config](wxDataViewItem parent, Tab* tab, const set<string>& preset_keys){
std::set extra_keys(preset_keys); set extra_keys(preset_keys);
for (const auto& page : tab->m_pages) { for (const auto& page : tab->m_pages) {
// ORCA: Pull icons from tabs for subgroups, icons are hidden on tabs // ORCA: Pull icons from tabs for subgroups, icons are hidden on tabs
std::string icon_name = "empty"; // use empty icon if not defined std::string icon_name = "empty"; // use empty icon if not defined
@@ -549,7 +549,7 @@ void ParamsNode::RefreshSearch(const wxString& search_text)
if (GetEnabledChildren().empty()) if (GetEnabledChildren().empty())
if (auto pos = text.find(search_text); IsParamNode() && pos != wxString::npos) { if (auto pos = text.find(search_text); IsParamNode() && pos != wxString::npos) {
m_highlight_index = make_unique<std::pair<int, int>>(pos, search_text.Len()); m_highlight_index = make_unique<pair<int, int>>(pos, search_text.Len());
Enable(); Enable();
} else { } else {
Disable(); Disable();
+4 -4
View File
@@ -702,11 +702,11 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
set_value(str, true); set_value(str, true);
} }
} else if (m_opt.opt_key == "sparse_infill_rotate_template" || m_opt.opt_key == "solid_infill_rotate_template") { } else if (m_opt.opt_key == "sparse_infill_rotate_template" || m_opt.opt_key == "solid_infill_rotate_template") {
std::string ustr(str.utf8_string()); string ustr(str.utf8_string());
if (!ConfigOptionFloats::validate_string(ustr)) { if (!ConfigOptionFloats::validate_string(ustr)) {
std::string v; string v;
std::smatch match; std::smatch match;
std::string ps = (m_opt.opt_key == "sparse_infill_rotate_template") ? string ps = (m_opt.opt_key == "sparse_infill_rotate_template") ?
u8"[BT][!]?|[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[BT]?[!*]?" : u8"[BT][!]?|[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[BT]?[!*]?" :
u8"[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[!*]?"; u8"[#][\\d]+[!]?|[+\\-]?[\\d.]+[%]?[*]?[\\d]*[/NnZz$LlUuQq~^|#]?[+\\-]?[\\d.]*[%#\'\"cm]?[m]?[!*]?";
@@ -729,7 +729,7 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
} }
break; break;
} else if (m_opt.opt_key == "extra_solid_infills") { } else if (m_opt.opt_key == "extra_solid_infills") {
std::string ustr(str.utf8_string()); string ustr(str.utf8_string());
// New rule: accept either interval form (N or N#K) or explicit list (e.g. 1,7,9), with optional quotes. // New rule: accept either interval form (N or N#K) or explicit list (e.g. 1,7,9), with optional quotes.
const std::regex rx_interval(u8R"(^\s*['"]?\s*\d+\s*(?:#\s*\d*)?\s*['"]?\s*$)"); const std::regex rx_interval(u8R"(^\s*['"]?\s*\d+\s*(?:#\s*\d*)?\s*['"]?\s*$)");
// List entries may be plain numbers or number with optional #K count, e.g., 5, 9#2, 18 // List entries may be plain numbers or number with optional #K count, e.g., 5, 9#2, 18
+1 -3
View File
@@ -94,8 +94,6 @@
#include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp" #include "slic3r/GUI/Gizmos/GizmoObjectManipulation.hpp"
#include "slic3r/GUI/PartPlate.hpp" #include "slic3r/GUI/PartPlate.hpp"
using namespace std::string_view_literals;
namespace Slic3r { class PrintBase; } namespace Slic3r { class PrintBase; }
@@ -3186,7 +3184,7 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding)
float ams_item_height = 0; float ams_item_height = 0;
float filament_group_item_align_width = 0; float filament_group_item_align_width = 0;
{ {
float three_words_width = imgui.calc_text_size("ABC"sv).x; float three_words_width = imgui.calc_text_size(std::string_view("ABC")).x;
const int line_capacity = 4; const int line_capacity = 4;
for (const auto& extruder_filaments : {m_left_extruder_filament,m_right_extruder_filament }) for (const auto& extruder_filaments : {m_left_extruder_filament,m_right_extruder_filament })
-2
View File
@@ -177,8 +177,6 @@ extern wxPopupWindow* wxCurrentPopupWindow;
#endif #endif
#endif #endif
using namespace std::string_view_literals;
static constexpr const float TRACKBALLSIZE = 0.8f; static constexpr const float TRACKBALLSIZE = 0.8f;
static Slic3r::ColorRGBA DEFAULT_BG_LIGHT_COLOR = { 0.906f, 0.906f, 0.906f, 1.0f }; static Slic3r::ColorRGBA DEFAULT_BG_LIGHT_COLOR = { 0.906f, 0.906f, 0.906f, 1.0f };
+3 -3
View File
@@ -9040,7 +9040,7 @@ std::map<std::string, std::string> GUI_App::get_delete_cache_presets_lock()
void GUI_App::process_delete_presets() void GUI_App::process_delete_presets()
{ {
std::map<std::string, std::string> delete_cache_presets = get_delete_cache_presets_lock(); std::map<string, string> delete_cache_presets = get_delete_cache_presets_lock();
for (auto it = delete_cache_presets.begin(); it != delete_cache_presets.end();) { for (auto it = delete_cache_presets.begin(); it != delete_cache_presets.end();) {
if (it->first.empty()) continue; if (it->first.empty()) continue;
std::string del_setting_id = it->first; std::string del_setting_id = it->first;
@@ -10068,7 +10068,7 @@ bool is_soluble_filament(int extruder_id)
return support_option->get_at(0); return support_option->get_at(0);
}; };
bool has_filaments(const std::vector<std::string>& model_filaments) { bool has_filaments(const std::vector<string>& model_filaments) {
auto &filament_presets = Slic3r::GUI::wxGetApp().preset_bundle->filament_presets; auto &filament_presets = Slic3r::GUI::wxGetApp().preset_bundle->filament_presets;
if (!Slic3r::GUI::wxGetApp().plater()) return false; if (!Slic3r::GUI::wxGetApp().plater()) return false;
auto model_objects = Slic3r::GUI::wxGetApp().plater()->model().objects; auto model_objects = Slic3r::GUI::wxGetApp().plater()->model().objects;
@@ -10103,7 +10103,7 @@ bool is_support_filament(int extruder_id, bool strict_check)
Slic3r::ConfigOptionBools *support_option = dynamic_cast<Slic3r::ConfigOptionBools *>(filament->config.option("filament_is_support")); Slic3r::ConfigOptionBools *support_option = dynamic_cast<Slic3r::ConfigOptionBools *>(filament->config.option("filament_is_support"));
if(!strict_check &&(filament_type == "PETG" || filament_type == "PLA")) { if(!strict_check &&(filament_type == "PETG" || filament_type == "PLA")) {
std::vector<std::string> model_filaments; std::vector<string> model_filaments;
if (filament_type == "PETG") if (filament_type == "PETG")
model_filaments.emplace_back("PLA"); model_filaments.emplace_back("PLA");
else { else {
+2 -2
View File
@@ -1108,7 +1108,7 @@ void ObjectList::update_name_column_width() const
} }
} }
GetColumn(colName)->SetWidth(std::max(0, client_size.x - (others_width)*em)); GetColumn(colName)->SetWidth(max(0, client_size.x - (others_width)*em));
} }
void ObjectList::set_filament_column_hidden(const bool hide) const void ObjectList::set_filament_column_hidden(const bool hide) const
@@ -3970,7 +3970,7 @@ wxDataViewItem ObjectList::add_settings_item(wxDataViewItem parent_item, const D
if (config->opt_float("layer_height") == object_cfg->opt_float("layer_height")) { if (config->opt_float("layer_height") == object_cfg->opt_float("layer_height")) {
SettingsFactory::Bundle new_cat_options; SettingsFactory::Bundle new_cat_options;
for (auto cat_opt : cat_options) { for (auto cat_opt : cat_options) {
std::vector<std::string> temp; std::vector<string> temp;
for (auto value : cat_opt.second) { for (auto value : cat_opt.second) {
if (value != "layer_height") if (value != "layer_height")
temp.push_back(value); temp.push_back(value);
@@ -44,8 +44,6 @@
#define MAX_NUM 9999.99 #define MAX_NUM 9999.99
#define MAX_SIZE std::string_view{"9999.99"} #define MAX_SIZE std::string_view{"9999.99"}
using namespace std::string_view_literals;
namespace Slic3r namespace Slic3r
{ {
namespace GUI namespace GUI
+7 -7
View File
@@ -33,7 +33,7 @@ static const char* HMS_LOCAL_IMG_PATH = "hms/local_image";
// the local HMS info // the local HMS info
// Orca: dev-id-type set trimmed to the devices Orca ships local HMS images for // Orca: dev-id-type set trimmed to the devices Orca ships local HMS images for
static std::unordered_set<std::string> package_dev_id_types {"094", "239", "093", "22E"}; static unordered_set<string> package_dev_id_types {"094", "239", "093", "22E"};
// Orca: HMS should be disabled when stealth mode is on or networking is not installed // Orca: HMS should be disabled when stealth mode is on or networking is not installed
static bool should_disable_hms() static bool should_disable_hms()
@@ -345,17 +345,17 @@ wxString HMSQuery::query_hms_msg(const std::string& dev_id, const std::string& l
return _query_hms_msg(dev_id.substr(0, 3), long_error_code, lang_code); return _query_hms_msg(dev_id.substr(0, 3), long_error_code, lang_code);
} }
std::string HMSQuery::get_dev_id_type(const MachineObject* obj) const string HMSQuery::get_dev_id_type(const MachineObject* obj) const
{ {
if (obj) if (obj)
{ {
return obj->get_dev_id().substr(0, 3); return obj->get_dev_id().substr(0, 3);
} }
return std::string(); return string();
} }
wxString HMSQuery::_query_hms_msg(const std::string& dev_id_type, const std::string& long_error_code, const std::string& lang_code) wxString HMSQuery::_query_hms_msg(const string& dev_id_type, const string& long_error_code, const string& lang_code)
{ {
if (long_error_code.empty()) if (long_error_code.empty())
{ {
@@ -426,9 +426,9 @@ wxString HMSQuery::_query_hms_msg(const std::string& dev_id_type, const std::str
return wxEmptyString; return wxEmptyString;
} }
bool HMSQuery::_is_internal_error(const std::string &dev_id_type, bool HMSQuery::_is_internal_error(const string &dev_id_type,
const std::string &error_code, const string &error_code,
const std::string &lang_code) const string &lang_code)
{ {
init_hms_info(dev_id_type); init_hms_info(dev_id_type);
auto iter = m_hms_info_jsons.find(dev_id_type); auto iter = m_hms_info_jsons.find(dev_id_type);
+1 -1
View File
@@ -335,7 +335,7 @@ void PrintJob::process(Ctl &ctl)
auto origin_profile_id = model_info->metadata_items.find(BBL_DESIGNER_PROFILE_ID_TAG); auto origin_profile_id = model_info->metadata_items.find(BBL_DESIGNER_PROFILE_ID_TAG);
if (origin_profile_id != model_info->metadata_items.end()) { if (origin_profile_id != model_info->metadata_items.end()) {
try { try {
params.origin_profile_id = std::stoi(origin_profile_id->second.c_str()); params.origin_profile_id = stoi(origin_profile_id->second.c_str());
} }
catch(...) {} catch(...) {}
} }
+5 -5
View File
@@ -536,12 +536,12 @@ void NotificationManager::PopNotification::count_lines()
return; return;
// handle with marks // handle with marks
if (pos_start == std::string::npos && pos_end == std::string::npos) { if (pos_start == string::npos && pos_end == string::npos) {
pos_start = text.find(error_start); pos_start = text.find(error_start);
if (pos_start != std::string::npos) { if (pos_start != string::npos) {
text.erase(pos_start, error_start.length()); text.erase(pos_start, error_start.length());
pos_end = text.find(error_end); pos_end = text.find(error_end);
if (pos_end != std::string::npos) { if (pos_end != string::npos) {
text.erase(pos_end, error_end.length()); text.erase(pos_end, error_end.length());
} }
} }
@@ -675,7 +675,7 @@ void NotificationManager::PopNotification::bbl_render_block_notif_text(ImGuiWrap
if (m_text1.size() > m_endlines[i]) if (m_text1.size() > m_endlines[i])
last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0); last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0);
if (pos_start != std::string::npos && pos_end != std::string::npos && m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) { if (pos_start != string::npos && pos_end != string::npos && m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) {
push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity); push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity);
imgui.text(line.c_str()); imgui.text(line.c_str());
ImGui::PopStyleColor(); ImGui::PopStyleColor();
@@ -737,7 +737,7 @@ void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, cons
if (m_text1.size() > m_endlines[i]) if (m_text1.size() > m_endlines[i])
last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0); last_end += (m_text1[m_endlines[i]] == '\n' || m_text1[m_endlines[i]] == ' ' ? 1 : 0);
if (pos_start != std::string::npos && pos_end != std::string::npos&& m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) { if (pos_start != string::npos && pos_end != string::npos&& m_endlines[i] - line.length() >= pos_start && m_endlines[i] <= pos_end) {
push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity); push_style_color(ImGuiCol_Text, m_ErrorColor, m_state == EState::FadingOut, m_current_fade_opacity);
imgui.text(line.c_str()); imgui.text(line.c_str());
ImGui::PopStyleColor(); ImGui::PopStyleColor();
+4 -4
View File
@@ -86,7 +86,7 @@ PartSkipDialog::PartSkipDialog(wxWindow *parent) : DPIDialog(parent, wxID_ANY, _
{ {
std::time_t t = std::time(0); std::time_t t = std::time(0);
std::stringstream buf; std::stringstream buf;
buf << std::put_time(std::localtime(&t), "%a_%b_%d_%H_%M_%S/"); buf << put_time(std::localtime(&t), "%a_%b_%d_%H_%M_%S/");
m_timestamp = buf.str(); m_timestamp = buf.str();
SetBackgroundColour(*wxWHITE); SetBackgroundColour(*wxWHITE);
@@ -402,7 +402,7 @@ std::string PartSkipDialog::create_tmp_path()
return tmp_path; return tmp_path;
} }
bool PartSkipDialog::is_local_file_existed(const std::vector<std::string> &local_paths) bool PartSkipDialog::is_local_file_existed(const std::vector<string> &local_paths)
{ {
for (auto path : local_paths) { for (auto path : local_paths) {
if (!std::filesystem::exists(path)) { return false; } if (!std::filesystem::exists(path)) { return false; }
@@ -703,8 +703,8 @@ void PartSkipDialog::InitDialogUI()
m_parts_state.clear(); m_parts_state.clear();
m_parts_name.clear(); m_parts_name.clear();
std::string pick_img = m_local_paths[0]; string pick_img = m_local_paths[0];
std::string slice_info = m_local_paths[2]; string slice_info = m_local_paths[2];
m_switch_drag_btn->SetIcon("canvas_drag"); m_switch_drag_btn->SetIcon("canvas_drag");
m_switch_drag_btn->SetBackgroundColor(*wxWHITE); m_switch_drag_btn->SetBackgroundColor(*wxWHITE);
+3 -3
View File
@@ -139,11 +139,11 @@ private:
boost::shared_ptr<PrinterFileSystem> m_file_sys; boost::shared_ptr<PrinterFileSystem> m_file_sys;
std::string m_timestamp; std::string m_timestamp;
std::string m_tmp_path; std::string m_tmp_path;
std::vector<std::string> m_local_paths; std::vector<string> m_local_paths;
std::vector<std::string> m_target_paths; std::vector<string> m_target_paths;
std::string create_tmp_path(); std::string create_tmp_path();
bool is_local_file_existed(const std::vector<std::string> &local_paths); bool is_local_file_existed(const std::vector<string> &local_paths);
void DownloadPartsFile(); void DownloadPartsFile();
void OnFileSystemEvent(wxCommandEvent &event); void OnFileSystemEvent(wxCommandEvent &event);
+4 -4
View File
@@ -357,7 +357,7 @@ wxDEFINE_EVENT(EVT_NOTICE_FULL_SCREEN_CHANGED, IntEvent);
#define PRINTER_PANEL_RADIUS (6) // ORCA #define PRINTER_PANEL_RADIUS (6) // ORCA
#define BTN_SYNC_SIZE (wxSize(FromDIP(96), FromDIP(98))) #define BTN_SYNC_SIZE (wxSize(FromDIP(96), FromDIP(98)))
static std::string get_diameter_string(float diameter) static string get_diameter_string(float diameter)
{ {
std::ostringstream stream; // ORCA ensure 0.25 returned as 0.25. previous code returned as 0.2 because of std::setprecision(1) std::ostringstream stream; // ORCA ensure 0.25 returned as 0.25. previous code returned as 0.2 because of std::setprecision(1)
stream << std::fixed << std::setprecision(2) << diameter; // Use 2 decimals to capture 0.25 / 0.15 reliably stream << std::fixed << std::setprecision(2) << diameter; // Use 2 decimals to capture 0.25 / 0.15 reliably
@@ -6323,7 +6323,7 @@ void Sidebar::sync_ams_list(bool is_from_big_sync_btn)
} }
// BBS:Record consumables information before synchronization // BBS:Record consumables information before synchronization
std::vector<std::string> color_before_sync; std::vector<string> color_before_sync;
std::vector<bool> is_support_before; std::vector<bool> is_support_before;
DynamicPrintConfig& project_config = wxGetApp().preset_bundle->project_config; DynamicPrintConfig& project_config = wxGetApp().preset_bundle->project_config;
ConfigOptionStrings* color_opt = project_config.option<ConfigOptionStrings>("filament_colour"); ConfigOptionStrings* color_opt = project_config.option<ConfigOptionStrings>("filament_colour");
@@ -12762,7 +12762,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
Vec3d old_plate_pos = old_plate->get_center_origin(); Vec3d old_plate_pos = old_plate->get_center_origin();
// BBS: Save the model in the current platelist // BBS: Save the model in the current platelist
std::vector<std::vector<int> > plate_object; std::vector<vector<int> > plate_object;
for (size_t i = 0; i < old_plate_list.get_plate_count(); ++i) { for (size_t i = 0; i < old_plate_list.get_plate_count(); ++i) {
PartPlate* plate = old_plate_list.get_plate(i); PartPlate* plate = old_plate_list.get_plate(i);
std::vector<int> obj_idxs; std::vector<int> obj_idxs;
@@ -17975,7 +17975,7 @@ bool Plater::load_files(const wxArrayString& filenames)
// Orca: Iters through given paths and imports files from zip then remove zip from paths // Orca: Iters through given paths and imports files from zip then remove zip from paths
// returns true if zip files were found // returns true if zip files were found
auto handle_zips = [this](std::vector<fs::path>& paths) { // NOLINT(*-no-recursion) - Recursion is intended and should be managed properly auto handle_zips = [this](vector<fs::path>& paths) { // NOLINT(*-no-recursion) - Recursion is intended and should be managed properly
bool res = false; bool res = false;
for (auto it = paths.begin(); it != paths.end();) { for (auto it = paths.begin(); it != paths.end();) {
if (boost::algorithm::iends_with(it->string(), ".zip")) { if (boost::algorithm::iends_with(it->string(), ".zip")) {
+2 -2
View File
@@ -378,7 +378,7 @@ wxBoxSizer *PreferencesDialog::create_item_combobox(wxString title, wxString too
auto current_setting = app_config->get(param); auto current_setting = app_config->get(param);
if (!current_setting.empty()) { if (!current_setting.empty()) {
auto compare = [current_setting](std::string possible_setting) { return current_setting == possible_setting; }; auto compare = [current_setting](string possible_setting) { return current_setting == possible_setting; };
auto iterator = find_if(config_name_index.begin(), config_name_index.end(), compare); auto iterator = find_if(config_name_index.begin(), config_name_index.end(), compare);
if (iterator != config_name_index.end()) if (iterator != config_name_index.end())
current_index = static_cast<unsigned int>(iterator - config_name_index.begin()); current_index = static_cast<unsigned int>(iterator - config_name_index.begin());
@@ -1714,7 +1714,7 @@ void PreferencesDialog::create_items()
g_sizer->Add(create_item_title(_L("Project")), 1, wxEXPAND); g_sizer->Add(create_item_title(_L("Project")), 1, wxEXPAND);
std::vector<wxString> projectLoadSettingsBehaviourOptions = {_L("Load All"), _L("Ask When Relevant"), _L("Always Ask"), _L("Load Geometry Only")}; std::vector<wxString> projectLoadSettingsBehaviourOptions = {_L("Load All"), _L("Ask When Relevant"), _L("Always Ask"), _L("Load Geometry Only")};
std::vector<std::string> projectLoadSettingsConfigOptions = { OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_ALL, OPTION_PROJECT_LOAD_BEHAVIOUR_ASK_WHEN_RELEVANT, OPTION_PROJECT_LOAD_BEHAVIOUR_ALWAYS_ASK, OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_GEOMETRY }; std::vector<string> projectLoadSettingsConfigOptions = { OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_ALL, OPTION_PROJECT_LOAD_BEHAVIOUR_ASK_WHEN_RELEVANT, OPTION_PROJECT_LOAD_BEHAVIOUR_ALWAYS_ASK, OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_GEOMETRY };
auto item_project_load = create_item_combobox(_L("Load behavior"), _L("Should printer/filament/process settings be loaded when opening a 3MF file?"), SETTING_PROJECT_LOAD_BEHAVIOUR, projectLoadSettingsBehaviourOptions, projectLoadSettingsConfigOptions); auto item_project_load = create_item_combobox(_L("Load behavior"), _L("Should printer/filament/process settings be loaded when opening a 3MF file?"), SETTING_PROJECT_LOAD_BEHAVIOUR, projectLoadSettingsBehaviourOptions, projectLoadSettingsConfigOptions);
g_sizer->Add(item_project_load); g_sizer->Add(item_project_load);
+1 -1
View File
@@ -239,7 +239,7 @@ void ProjectPanel::on_reload(wxCommandEvent& evt)
} }
bool has_content = false; bool has_content = false;
for (const std::string& v : { for (const string& v : {
update_type, update_type,
license, license,
model_name, model_name,
+4 -4
View File
@@ -182,7 +182,7 @@ std::string get_nozzle_volume_type_cloud_string(NozzleVolumeType nozzle_volume_t
static int s_nozzle_mapping_last_request_time = 0; static int s_nozzle_mapping_last_request_time = 0;
std::vector<wxString> SelectMachineDialog::MACHINE_BED_TYPE_STRING; std::vector<wxString> SelectMachineDialog::MACHINE_BED_TYPE_STRING;
std::vector<std::string> SelectMachineDialog::MachineBedTypeString; std::vector<string> SelectMachineDialog::MachineBedTypeString;
void SelectMachineDialog::init_machine_bed_types() void SelectMachineDialog::init_machine_bed_types()
{ {
if (MACHINE_BED_TYPE_STRING.size() == 0) { if (MACHINE_BED_TYPE_STRING.size() == 0) {
@@ -2748,8 +2748,8 @@ void SelectMachineDialog::on_ok_btn(wxCommandEvent &event)
std::vector<ConfirmBeforeSendInfo> confirm_text; std::vector<ConfirmBeforeSendInfo> confirm_text;
// check more than one using in same external spool // check more than one using in same external spool
std::unordered_set<std::string> main_external_spool_filas; std::unordered_set<string> main_external_spool_filas;
std::unordered_set<std::string> deputy_external_spool_filas; std::unordered_set<string> deputy_external_spool_filas;
for (const auto& mapping_info : m_ams_mapping_result) { for (const auto& mapping_info : m_ams_mapping_result) {
if (mapping_info.ams_id == VIRTUAL_AMS_MAIN_ID_STR){ if (mapping_info.ams_id == VIRTUAL_AMS_MAIN_ID_STR){
main_external_spool_filas.insert(mapping_info.filament_id); main_external_spool_filas.insert(mapping_info.filament_id);
@@ -5239,7 +5239,7 @@ void SelectMachineDialog::update_show_status(MachineObject* obj_)
/*Check high temperture slicing*/ /*Check high temperture slicing*/
if (m_print_type == PrintFromType::FROM_NORMAL) { if (m_print_type == PrintFromType::FROM_NORMAL) {
std::set<std::string> high_temp_filaments; std::set<string> high_temp_filaments;
std::unordered_set<int> known_fila_soften_extruders; std::unordered_set<int> known_fila_soften_extruders;
std::unordered_set<int> unknown_fila_soften_extruders; std::unordered_set<int> unknown_fila_soften_extruders;
auto preset_full_config = wxGetApp().preset_bundle->full_config(); auto preset_full_config = wxGetApp().preset_bundle->full_config();
+1 -1
View File
@@ -337,7 +337,7 @@ private:
wxColour m_colour_bold_color{wxColour(38, 46, 48)}; wxColour m_colour_bold_color{wxColour(38, 46, 48)};
StateColor m_btn_bg_enable; StateColor m_btn_bg_enable;
std::unordered_map<std::string, PrintOption*> m_checkbox_list; std::unordered_map<string, PrintOption*> m_checkbox_list;
std::list<PrintOption*> m_checkbox_list_order; std::list<PrintOption*> m_checkbox_list_order;
std::shared_ptr<int> m_token = std::make_shared<int>(0); std::shared_ptr<int> m_token = std::make_shared<int>(0);
+1 -1
View File
@@ -126,7 +126,7 @@ void SendToPrinterDialog::stripWhiteSpace(std::string& str)
{ {
if (str == "") { return; } if (str == "") { return; }
std::string::iterator cur_it; string::iterator cur_it;
cur_it = str.begin(); cur_it = str.begin();
while (cur_it != str.end()) { while (cur_it != str.end()) {
+2 -2
View File
@@ -171,7 +171,7 @@ public:
std::string current_nozzle_loc = ""; std::string current_nozzle_loc = "";
wxColour m_colour; wxColour m_colour;
std::string m_file_name; string m_file_name;
bool m_ams_loading{false}; bool m_ams_loading{false};
void doRender(wxDC &dc); void doRender(wxDC &dc);
ExtruderImage(wxWindow *parent, wxWindowID id, int nozzle_num, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize); ExtruderImage(wxWindow *parent, wxWindowID id, int nozzle_num, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize);
@@ -244,7 +244,7 @@ protected:
{ {
wxString local_image_url; //local image path wxString local_image_url; //local image path
std::string img_url_paths; // oss url path std::string img_url_paths; // oss url path
std::vector<wxPanel *> image_broad; vector<wxPanel *> image_broad;
bool is_selected; bool is_selected;
bool is_uploaded; // load bool is_uploaded; // load
wxBoxSizer * image_tb_broad = nullptr; wxBoxSizer * image_tb_broad = nullptr;
+2 -2
View File
@@ -1576,7 +1576,7 @@ bool SyncAmsInfoDialog::is_nozzle_type_match(DevExtderSystem data, wxString &err
} }
} }
std::vector<int> map_extruders = {1, 0}; vector<int> map_extruders = {1, 0};
// The default two extruders are left, right, but the order of the extruders on the machine is right, left. // The default two extruders are left, right, but the order of the extruders on the machine is right, left.
std::vector<std::string> flow_type_of_machine; std::vector<std::string> flow_type_of_machine;
@@ -1676,7 +1676,7 @@ void SyncAmsInfoDialog::stripWhiteSpace(std::string &str)
{ {
if (str == "") { return; } if (str == "") { return; }
std::string::iterator cur_it; string::iterator cur_it;
cur_it = str.begin(); cur_it = str.begin();
while (cur_it != str.end()) { while (cur_it != str.end()) {
+1 -1
View File
@@ -2257,7 +2257,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
wxGetApp().plater()->update(); wxGetApp().plater()->update();
} }
std::string opt_key_without_idx = opt_key.substr(0, opt_key.find('#')); string opt_key_without_idx = opt_key.substr(0, opt_key.find('#'));
if (opt_key_without_idx == "long_retractions_when_cut") { if (opt_key_without_idx == "long_retractions_when_cut") {
unsigned char activate = boost::any_cast<unsigned char>(value); unsigned char activate = boost::any_cast<unsigned char>(value);
+5 -5
View File
@@ -1682,13 +1682,13 @@ int GuideFrame::SaveProfileData()
return 0; return 0;
} }
void StringReplace(std::string &strBase, std::string strSrc, std::string strDes) void StringReplace(string &strBase, string strSrc, string strDes)
{ {
std::string::size_type pos = 0; string::size_type pos = 0;
std::string::size_type srcLen = strSrc.size(); string::size_type srcLen = strSrc.size();
std::string::size_type desLen = strDes.size(); string::size_type desLen = strDes.size();
pos = strBase.find(strSrc, pos); pos = strBase.find(strSrc, pos);
while ((pos != std::string::npos)) { while ((pos != string::npos)) {
strBase.replace(pos, srcLen, strDes); strBase.replace(pos, srcLen, strDes);
pos = strBase.find(strSrc, (pos + desLen)); pos = strBase.find(strSrc, (pos + desLen));
} }
+1 -1
View File
@@ -1052,7 +1052,7 @@ void AMSControl::UpdateAms(const std::string &series_name,
/*update humidity popup*/ /*update humidity popup*/
if (m_percent_humidity_dry_popup->IsShown()) if (m_percent_humidity_dry_popup->IsShown())
{ {
std::string target_id = m_percent_humidity_dry_popup->get_owner_ams_id(); string target_id = m_percent_humidity_dry_popup->get_owner_ams_id();
for (const auto& the_info : ams_info) for (const auto& the_info : ams_info)
{ {
if (target_id == the_info.ams_id) if (target_id == the_info.ams_id)
+2 -2
View File
@@ -63,7 +63,7 @@ protected:
std::string m_dev_id; std::string m_dev_id;
std::vector<std::vector<std::string>> m_item_ids{ {}, {} }; std::vector<std::vector<std::string>> m_item_ids{ {}, {} };
std::vector<std::pair<std::string, std::string>> pair_id; std::vector<std::pair<string, string>> pair_id;
int m_total_ext_count = 1; int m_total_ext_count = 1;
AMSextruder *m_extruder{nullptr}; AMSextruder *m_extruder{nullptr};
@@ -181,7 +181,7 @@ public:
std::tuple<bool, bool> isFilaSwitchReady(); std::tuple<bool, bool> isFilaSwitchReady();
void show_switcher_status(bool show); void show_switcher_status(bool show);
void UpdatePassRoad(std::string ams_id, AMSPassRoadType type, AMSPassRoadSTEP step); void UpdatePassRoad(string ams_id, AMSPassRoadType type, AMSPassRoadSTEP step);
void CreateAms(); void CreateAms();
void CreateAmsDoubleNozzle(const std::string &series_name, const std::string& printer_type); void CreateAmsDoubleNozzle(const std::string &series_name, const std::string& printer_type);
void CreateAmsSingleNozzle(const std::string &series_name, const std::string &printer_type); void CreateAmsSingleNozzle(const std::string &series_name, const std::string &printer_type);
+3 -3
View File
@@ -634,7 +634,7 @@ void AMSextruderImage::doRender(wxDC &dc)
} }
AMSextruderImage::AMSextruderImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos) AMSextruderImage::AMSextruderImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos)
{ {
wxWindow::Create(parent, id, pos, size); wxWindow::Create(parent, id, pos, size);
SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
@@ -823,7 +823,7 @@ void SwitcherImage::doRender(wxDC &dc)
Layout(); Layout();
} }
SwitcherImage::SwitcherImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos) SwitcherImage::SwitcherImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos)
{ {
wxWindow::Create(parent, id, pos, size); wxWindow::Create(parent, id, pos, size);
SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE)); SetBackgroundColour(StateColor::darkModeColorFor(*wxWHITE));
@@ -899,7 +899,7 @@ void AMSextruder::OnAmsLoading(bool load, int nozzle_id, wxColour col /*= AMS_CO
} }
/*return true if something is updated*/ /*return true if something is updated*/
bool AMSextruder::updateNozzleNum(int nozzle_num, const std::string& series_name) bool AMSextruder::updateNozzleNum(int nozzle_num, const string& series_name)
{ {
if (m_nozzle_num == nozzle_num && m_series_name == series_name) return false; if (m_nozzle_num == nozzle_num && m_series_name == series_name) return false;
m_series_name = series_name; m_series_name = series_name;
+6 -6
View File
@@ -393,10 +393,10 @@ public:
bool m_show_state = {false}; bool m_show_state = {false};
wxColour m_colour; wxColour m_colour;
ScalableBitmap m_ams_extruder; ScalableBitmap m_ams_extruder;
std::string m_file_name; string m_file_name;
bool m_ams_loading{ false }; bool m_ams_loading{ false };
void doRender(wxDC &dc); void doRender(wxDC &dc);
AMSextruderImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition); AMSextruderImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition);
~AMSextruderImage(); ~AMSextruderImage();
}; };
@@ -444,10 +444,10 @@ public:
bool m_show_state = {false}; bool m_show_state = {false};
wxColour m_colour; wxColour m_colour;
ScalableBitmap m_switcher; ScalableBitmap m_switcher;
std::string m_file_name; string m_file_name;
// bool m_ams_loading{ false }; // bool m_ams_loading{ false };
void doRender(wxDC &dc); void doRender(wxDC &dc);
SwitcherImage(wxWindow *parent, wxWindowID id, std::string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition); SwitcherImage(wxWindow *parent, wxWindowID id, string file_name, const wxSize& size, const wxPoint &pos = wxDefaultPosition);
~SwitcherImage(); ~SwitcherImage();
}; };
@@ -456,7 +456,7 @@ class AMSextruder : public wxWindow
{ {
private: private:
int m_nozzle_num = -1; int m_nozzle_num = -1;
std::string m_series_name; string m_series_name;
public: public:
void TurnOn(wxColour col); void TurnOn(wxColour col);
@@ -466,7 +466,7 @@ public:
void msw_rescale(); void msw_rescale();
void has_ams(bool hams) {m_has_vams = hams; Refresh();}; void has_ams(bool hams) {m_has_vams = hams; Refresh();};
void no_ams_mode(bool mode) {m_none_ams_mode = mode; Refresh();}; void no_ams_mode(bool mode) {m_none_ams_mode = mode; Refresh();};
bool updateNozzleNum(int nozzle_num, const std::string& series_name = std::string()); bool updateNozzleNum(int nozzle_num, const std::string& series_name = string());
bool m_none_ams_mode{true}; bool m_none_ams_mode{true};
bool m_has_vams{false}; bool m_has_vams{false};
+3
View File
@@ -7,6 +7,9 @@
#include "nlohmann/json.hpp" #include "nlohmann/json.hpp"
using namespace std;
class json_diff class json_diff
{ {
private: private:
+25 -6
View File
@@ -346,8 +346,20 @@ std::vector<std::string> PluginAuditManager::default_denied_path_keywords()
// must never be able to reach a secret, a certificate, or a configuration file just because // must never be able to reach a secret, a certificate, or a configuration file just because
// it happens to live inside an otherwise-allowed root (e.g. the bundled TLS client cert at // it happens to live inside an otherwise-allowed root (e.g. the bundled TLS client cert at
// resources_dir()/cert/..., which would become reachable the moment resources_dir() is // resources_dir()/cert/..., which would become reachable the moment resources_dir() is
// granted as a read-only allowed root). // granted as a read-only allowed root). Match as whole path components, not substrings, so
return {"secret", "cert", "conf"}; // imports such as numpy/__config__.py and stdlib configparser.py remain usable.
return {"secret", "secrets", "cert", "certs", "certificate", "certificates", "conf", "config"};
}
static bool has_denied_config_extension(std::string name)
{
const size_t stream_pos = name.find(':');
if (stream_pos != std::string::npos)
name.erase(stream_pos);
const boost::filesystem::path path(name);
const std::string extension = path.extension().string();
return extension == ".conf" || extension == ".ini";
} }
bool PluginAuditManager::is_denied_path_keyword(const boost::filesystem::path& candidate) const bool PluginAuditManager::is_denied_path_keyword(const boost::filesystem::path& candidate) const
@@ -372,7 +384,7 @@ bool PluginAuditManager::is_denied_path_keyword(const boost::filesystem::path& c
continue; continue;
std::transform(name.begin(), name.end(), name.begin(), [](unsigned char c) { return std::tolower(c); }); std::transform(name.begin(), name.end(), name.begin(), [](unsigned char c) { return std::tolower(c); });
for (const auto& keyword : m_denied_path_keywords) { for (const auto& keyword : m_denied_path_keywords) {
if (name.find(keyword) != std::string::npos) if (name == keyword || (keyword == "conf" && has_denied_config_extension(name)))
return true; return true;
} }
} }
@@ -796,7 +808,8 @@ bool persist_permission(const std::string& plugin_key,
int report_denied(PluginAuditManager& mgr, int report_denied(PluginAuditManager& mgr,
const std::string& event_name, const std::string& event_name,
const AuditDecision& decision) const AuditDecision& decision,
const std::string& target = {})
{ {
AuditViolation violation; AuditViolation violation;
violation.plugin_key = mgr.current_plugin(); violation.plugin_key = mgr.current_plugin();
@@ -804,7 +817,13 @@ int report_denied(PluginAuditManager& mgr,
violation.reason = decision.reason; violation.reason = decision.reason;
mgr.report_violation(violation); mgr.report_violation(violation);
PyErr_SetString(PyExc_PermissionError, "Plugin attempted an audited operation without permission"); std::string message = "Plugin attempted audited operation \"" + event_name + "\" without permission";
if (!decision.reason.empty())
message += ": " + decision.reason;
if (!target.empty())
message += ": " + target;
PyErr_SetString(PyExc_PermissionError, message.c_str());
return -1; return -1;
} }
@@ -916,7 +935,7 @@ int PluginAuditManager::audit_hook(const char* event, PyObject* args, void* user
if (fs_category) { if (fs_category) {
for (const auto& target : targets) { for (const auto& target : targets) {
if (mgr->is_denied_path(boost::filesystem::path(target))) if (mgr->is_denied_path(boost::filesystem::path(target)))
return PluginAuditDetail::report_denied(*mgr, event_name, {false, "denied path"}); return PluginAuditDetail::report_denied(*mgr, event_name, {false, "denied path"}, target);
} }
} }
+8 -11
View File
@@ -4,7 +4,6 @@
// Via pybind11 so this file requests the same python3xx.lib as everything else. // Via pybind11 so this file requests the same python3xx.lib as everything else.
#include <boost/filesystem/path.hpp> #include <boost/filesystem/path.hpp>
#include <pybind11/conduit/wrap_include_python_h.h> #include <pybind11/conduit/wrap_include_python_h.h>
#include <memory>
#include <mutex> #include <mutex>
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
@@ -103,22 +102,20 @@ public:
bool is_denied_filename(const boost::filesystem::path& candidate) const; bool is_denied_filename(const boost::filesystem::path& candidate) const;
// --- denied-path-keyword registry --- // --- denied-path-keyword registry ---
// Keywords that categorically deny a path if ANY of its components (directory or file // Keywords that categorically deny a path if ANY component matches one case-insensitively --
// name), not just the base name, contains one case-insensitively -- e.g. a "secrets" // e.g. a "secrets" subfolder, a "certificates" folder, a "conf"/"config" directory, or a
// subfolder, a "certificates" folder, or a "conf"/"config" file anywhere the plugin can // .conf/.ini file anywhere the plugin can otherwise reach, including inside an allowed root.
// otherwise reach, including inside an allowed root. This is intentionally broader and // This is broader than the exact-name is_denied_filename registry, but it is not a substring
// fuzzier than the exact-name is_denied_filename registry: it exists to categorically rule // match: importable modules such as numpy/__config__.py, configparser.py, sysconfig.py, or
// out whole classes of sensitive paths (secrets, certificates, config) rather than name // user folders such as "Conference" and "Concert" are unrelated names and must stay promptable.
// specific known files, at the cost of over-blocking an unrelated name that happens to
// contain the keyword -- the fail-safe direction, same rationale as is_denied_filename.
void add_denied_path_keyword(const std::string& keyword); void add_denied_path_keyword(const std::string& keyword);
// The list install_hook() seeds into the keyword registry. Exposed so tests seed the exact // The list install_hook() seeds into the keyword registry. Exposed so tests seed the exact
// same set without a live interpreter. // same set without a live interpreter.
static std::vector<std::string> default_denied_path_keywords(); static std::vector<std::string> default_denied_path_keywords();
// True when any component of candidate's (canonicalized) path contains a registered // True when any component of candidate's (canonicalized) path matches a registered keyword,
// keyword, case-insensitively. // case-insensitively. A registered "conf" keyword also blocks .conf/.ini file components.
bool is_denied_path_keyword(const boost::filesystem::path& candidate) const; bool is_denied_path_keyword(const boost::filesystem::path& candidate) const;
// is_denied_filename(candidate) || is_denied_path_keyword(candidate). Convenience for // is_denied_filename(candidate) || is_denied_path_keyword(candidate). Convenience for
+12 -3
View File
@@ -222,18 +222,19 @@ TEST_CASE("Plugin audit denies secret/certificate/config-like paths by keyword",
CHECK(mgr.is_denied_path_keyword(fs::path("/resources/certificates/ca.pem"))); CHECK(mgr.is_denied_path_keyword(fs::path("/resources/certificates/ca.pem")));
} }
SECTION("a 'conf'/'config' directory or file component is denied") SECTION("a 'conf'/'config' directory or config file component is denied")
{ {
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/conf/settings.json"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/conf/settings.json")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/config/settings.json"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/config/settings.json")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/plugin.conf"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/plugin.conf")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/plugin.ini")));
} }
SECTION("matching is case-insensitive") SECTION("matching is case-insensitive")
{ {
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/SECRETS/token.txt"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/SECRETS/token.txt")));
CHECK(mgr.is_denied_path_keyword(fs::path("/resources/CertBundle/ca.pem"))); CHECK(mgr.is_denied_path_keyword(fs::path("/resources/Certificates/ca.pem")));
CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/CONFIG.JSON"))); CHECK(mgr.is_denied_path_keyword(fs::path("/plugin/PLUGIN.CONF")));
} }
SECTION("matching is not limited to the base name -- any ancestor component counts") SECTION("matching is not limited to the base name -- any ancestor component counts")
@@ -245,6 +246,14 @@ TEST_CASE("Plugin audit denies secret/certificate/config-like paths by keyword",
{ {
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/output/model.gcode"))); CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/output/model.gcode")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/storage/state.json"))); CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/plugin/storage/state.json")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/packages/cp312/numpy/__config__.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/packages/cp312/numpy/_core/_ufunc_config.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/Lib/configparser.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/Lib/sysconfig.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/Lib/logging/config.py")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/python/packages/cp312/certifi/cacert.pem")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/users/Conference/output.txt")));
CHECK_FALSE(mgr.is_denied_path_keyword(fs::path("/users/Concert/output.txt")));
} }
SECTION("an empty path is not denied") SECTION("an empty path is not denied")