summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2019-08-07 15:30:53 -0400
committerBrian Potchik <brian@vector35.com>2019-08-07 15:30:53 -0400
commit25cf00a276d9a3da3134601d82654c87bcd9ef9c (patch)
treecb4411e48db783440a6ef0f1dece3ccea5e3a7a6
parent4704a1ee70e5b1a82989b2b3b016146fc183aefe (diff)
Settings system improvements.
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h8
-rw-r--r--python/settings.py4
-rw-r--r--settings.cpp4
-rw-r--r--suite/api_test.py46
5 files changed, 48 insertions, 16 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 29f7c3b1..b67ea0a2 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -4547,7 +4547,7 @@ namespace BinaryNinja
bool UpdateProperty(const std::string& key, const std::string& property, const std::string& value);
bool UpdateProperty(const std::string& key, const std::string& property, const std::vector<std::string>& value);
- bool DeserializeSchema(const std::string& schema);
+ bool DeserializeSchema(const std::string& schema, BNSettingsScope scope = SettingsAutoScope, bool merge = true);
std::string SerializeSchema();
bool DeserializeSettings(const std::string& contents, Ref<BinaryView> view = nullptr, BNSettingsScope scope = SettingsAutoScope);
std::string SerializeSettings(Ref<BinaryView> view = nullptr, BNSettingsScope scope = SettingsAutoScope);
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 8cf053e5..9e70251e 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2037,9 +2037,9 @@ extern "C"
SettingsInvalidScope = 0,
SettingsAutoScope = 1,
SettingsDefaultScope = 2,
- SettingsUserScope = 3,
- SettingsWorkspaceScope = 4,
- SettingsContextScope = 5
+ SettingsUserScope = 4,
+ SettingsWorkspaceScope = 8,
+ SettingsContextScope = 0x10
};
BINARYNINJACOREAPI char* BNAllocString(const char* contents);
@@ -3951,7 +3951,7 @@ extern "C"
BINARYNINJACOREAPI bool BNSettingsUpdateStringProperty(BNSettings* settings, const char* key, const char* property, const char* value);
BINARYNINJACOREAPI bool BNSettingsUpdateStringListProperty(BNSettings* settings, const char* key, const char* property, const char** value, size_t size);
- BINARYNINJACOREAPI bool BNSettingsDeserializeSchema(BNSettings* settings, const char* schema);
+ BINARYNINJACOREAPI bool BNSettingsDeserializeSchema(BNSettings* settings, const char* schema, BNSettingsScope scope, bool merge);
BINARYNINJACOREAPI char* BNSettingsSerializeSchema(BNSettings* settings);
BINARYNINJACOREAPI bool BNDeserializeSettings(BNSettings* settings, const char* contents, BNBinaryView* view, BNSettingsScope scope);
BINARYNINJACOREAPI char* BNSerializeSettings(BNSettings* settings, BNBinaryView* view, BNSettingsScope scope);
diff --git a/python/settings.py b/python/settings.py
index df3522fa..abb859a7 100644
--- a/python/settings.py
+++ b/python/settings.py
@@ -115,8 +115,8 @@ class Settings(object):
def update_property(self, key, setting_property):
return core.BNSettingsUpdateProperty(self.handle, key, setting_property)
- def deserialize_schema(self, schema):
- return core.BNSettingsDeserializeSchema(self.handle, schema)
+ def deserialize_schema(self, schema, scope = SettingsScope.SettingsAutoScope, merge = True):
+ return core.BNSettingsDeserializeSchema(self.handle, schema, scope, merge)
def serialize_schema(self):
return core.BNSettingsSerializeSchema(self.handle)
diff --git a/settings.cpp b/settings.cpp
index c779c10e..3ea43a7e 100644
--- a/settings.cpp
+++ b/settings.cpp
@@ -124,9 +124,9 @@ bool Settings::UpdateProperty(const std::string& key, const std::string& propert
}
-bool Settings::DeserializeSchema(const string& schema)
+bool Settings::DeserializeSchema(const string& schema, BNSettingsScope scope, bool merge)
{
- return BNSettingsDeserializeSchema(m_object, schema.c_str());
+ return BNSettingsDeserializeSchema(m_object, schema.c_str(), scope, merge);
}
diff --git a/suite/api_test.py b/suite/api_test.py
index 63a8bb39..5a1822aa 100644
--- a/suite/api_test.py
+++ b/suite/api_test.py
@@ -54,6 +54,9 @@ class SettingsAPI(unittest.TestCase):
assert settings.register_setting("testGroup.stringSetting", '{"description" : "Test description.", "title" : "Test Title", "default" : "value", "type" : "string", "id" : "stringSetting"}'), "test_settings_types failed"
assert not settings.register_setting("testGroup.stringListSetting", '{"description" : "Test description.", "title" : "Test Title", "default" : true, "type" : "array", "id" : "stringListSetting"}'), "test_settings_types failed"
assert settings.register_setting("testGroup.stringListSetting", '{"description" : "Test description.", "title" : "Test Title", "default" : ["value1", "value2"], "type" : "array", "id" : "stringListSetting"}'), "test_settings_types failed"
+ assert settings.register_setting("testGroup.ignoreContextBoolSetting", '{"description" : "Test description.", "title" : "Test Title", "default" : true, "type" : "boolean", "id" : "boolSetting", "ignore" : ["Context"]}'), "test_settings_types failed"
+ assert settings.register_setting("testGroup.ignoreUserBoolSetting", '{"description" : "Test description.", "title" : "Test Title", "default" : true, "type" : "boolean", "id" : "boolSetting", "ignore" : ["User"]}'), "test_settings_types failed"
+ assert settings.register_setting("testGroup.readOnlyBoolSetting", '{"description" : "Test description.", "title" : "Test Title", "default" : true, "type" : "boolean", "id" : "boolSetting", "ignore" : ["Context", "User"]}'), "test_settings_types failed"
assert settings.contains("testGroup.boolSetting"), "test_settings_types failed"
assert settings.contains("testGroup.doubleSetting"), "test_settings_types failed"
@@ -91,6 +94,18 @@ class SettingsAPI(unittest.TestCase):
assert settings.get_string_with_scope("testGroup.stringSetting", scope=SettingsScope.SettingsUserScope)[0] == "value_user", "test_settings_types failed"
assert settings.get_string_list_with_scope("testGroup.stringListSetting", scope=SettingsScope.SettingsUserScope)[0] == ["value3", "value4"], "test_settings_types failed"
+ raw_view = BinaryView.new(b'0x55')
+ assert not settings.set_bool("testGroup.ignoreContextBoolSetting", False, scope=SettingsScope.SettingsDefaultScope), "test_settings_types failed"
+ assert not settings.set_bool("testGroup.ignoreContextBoolSetting", False, scope=SettingsScope.SettingsContextScope), "test_settings_types failed"
+ assert not settings.set_bool("testGroup.ignoreContextBoolSetting", False, raw_view, scope=SettingsScope.SettingsContextScope), "test_settings_types failed"
+ assert settings.set_bool("testGroup.ignoreContextBoolSetting", False, scope=SettingsScope.SettingsUserScope), "test_settings_types failed"
+ assert not settings.set_bool("testGroup.ignoreUserBoolSetting", False), "test_settings_types failed"
+ assert settings.set_bool("testGroup.ignoreUserBoolSetting", False, raw_view), "test_settings_types failed"
+ assert settings.set_bool("testGroup.ignoreUserBoolSetting", False, raw_view, scope=SettingsScope.SettingsContextScope), "test_settings_types failed"
+ assert not settings.set_bool("testGroup.readOnlyBoolSetting", False), "test_settings_types failed"
+ assert not settings.set_bool("testGroup.readOnlyBoolSetting", False, scope=SettingsScope.SettingsContextScope), "test_settings_types failed"
+ assert not settings.set_bool("testGroup.readOnlyBoolSetting", False, scope=SettingsScope.SettingsUserScope), "test_settings_types failed"
+
s2 = Settings("test2")
assert s2.serialize_schema() is "", "test_settings_types failed"
test_schema = settings.serialize_schema()
@@ -117,6 +132,23 @@ class SettingsAPI(unittest.TestCase):
assert s2.get_string("testGroup.stringSetting") == "value", "test_settings_types failed"
assert s2.get_string_list("testGroup.stringListSetting") == ["value1", "value2"], "test_settings_types failed"
+ s3 = Settings("test3")
+ assert s3.deserialize_schema(test_schema, SettingsScope.SettingsContextScope)
+ assert not s3.contains("testGroup.ignoreContextBoolSetting"), "test_settings_types failed"
+ assert s3.contains("testGroup.ignoreUserBoolSetting"), "test_settings_types failed"
+ assert not s3.contains("testGroup.readOnlyBoolSetting"), "test_settings_types failed"
+
+ assert s3.deserialize_schema(test_schema, SettingsScope.SettingsUserScope, False)
+ assert s3.contains("testGroup.ignoreContextBoolSetting"), "test_settings_types failed"
+ assert not s3.contains("testGroup.ignoreUserBoolSetting"), "test_settings_types failed"
+ assert not s3.contains("testGroup.readOnlyBoolSetting"), "test_settings_types failed"
+
+ assert s3.deserialize_schema(test_schema, SettingsScope.SettingsUserScope, False)
+ assert s3.deserialize_schema(s3.serialize_schema(), SettingsScope.SettingsContextScope, False)
+ assert not s3.contains("testGroup.ignoreContextBoolSetting"), "test_settings_types failed"
+ assert not s3.contains("testGroup.ignoreUserBoolSetting"), "test_settings_types failed"
+ assert not s3.contains("testGroup.readOnlyBoolSetting"), "test_settings_types failed"
+
def test_load_settings(self):
bvt_name = "Mapped (Python)" if "Mapped (Python)" in map(lambda bvt: bvt.name, list(BinaryViewType)) else "Mapped"
raw_view = BinaryView.new(b'0x55')
@@ -127,13 +159,13 @@ class SettingsAPI(unittest.TestCase):
assert len(mapped_view) == 4, "test_load_settings failed"
load_settings = BinaryViewType[bvt_name].get_load_settings_for_data(raw_view)
assert load_settings is not None, "test_load_settings failed"
- assert load_settings.contains("abstractLoader.architecture"), "test_load_settings failed"
- assert load_settings.contains("abstractLoader.platform"), "test_load_settings failed"
- assert load_settings.contains("abstractLoader.imageBase"), "test_load_settings failed"
- assert load_settings.contains("abstractLoader.entryPoint"), "test_load_settings failed"
- load_settings.set_string("abstractLoader.architecture", 'x86_64')
- load_settings.set_integer("abstractLoader.imageBase", 0x500000)
- load_settings.set_integer("abstractLoader.entryPoint", 0x500000)
+ assert load_settings.contains("loader.architecture"), "test_load_settings failed"
+ assert load_settings.contains("loader.platform"), "test_load_settings failed"
+ assert load_settings.contains("loader.imageBase"), "test_load_settings failed"
+ assert load_settings.contains("loader.entryPoint"), "test_load_settings failed"
+ load_settings.set_string("loader.architecture", 'x86_64')
+ load_settings.set_integer("loader.imageBase", 0x500000)
+ load_settings.set_integer("loader.entryPoint", 0x500000)
raw_view.set_load_settings(bvt_name, load_settings)
mapped_view = BinaryViewType[bvt_name].create(raw_view)
assert mapped_view.view_type == bvt_name, "test_load_settings failed"