summaryrefslogtreecommitdiff
path: root/secretsprovider.cpp
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2021-08-23 19:05:09 -0400
committerGlenn Smith <glenn@vector35.com>2021-11-18 21:37:52 -0500
commit994a42659dc500f602e83f91501ec4a959481fa5 (patch)
treeca783900c9a6d41dbdd98a1cd66a083d3e886578 /secretsprovider.cpp
parent60f2ecd9d1961f7cd700e01f802bcf640c9d50e0 (diff)
Enterprise apis and support
Also secrets provider + openUrl
Diffstat (limited to 'secretsprovider.cpp')
-rw-r--r--secretsprovider.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/secretsprovider.cpp b/secretsprovider.cpp
new file mode 100644
index 00000000..62a51fff
--- /dev/null
+++ b/secretsprovider.cpp
@@ -0,0 +1,141 @@
+// Copyright (c) 2015-2021 Vector 35 Inc
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+
+#include "binaryninjaapi.h"
+#include <string.h>
+
+using namespace BinaryNinja;
+
+SecretsProvider::SecretsProvider(const std::string& name): m_nameForRegister(name)
+{
+
+}
+
+
+SecretsProvider::SecretsProvider(BNSecretsProvider* provider)
+{
+ m_object = provider;
+}
+
+
+bool SecretsProvider::HasDataCallback(void* ctxt, const char* key)
+{
+ SecretsProvider* provider = (SecretsProvider*)ctxt;
+ return provider->HasData(key);
+}
+
+
+char* SecretsProvider::GetDataCallback(void* ctxt, const char* key)
+{
+ SecretsProvider* provider = (SecretsProvider*)ctxt;
+ std::optional<std::string> data = provider->GetData(key);
+ if (!data.has_value())
+ return nullptr;
+ char* value = BNAllocString(data->c_str());
+ memset(data->data(), 0, data->size());
+ return value;
+}
+
+
+bool SecretsProvider::StoreDataCallback(void* ctxt, const char* key, const char* data)
+{
+ SecretsProvider* provider = (SecretsProvider*)ctxt;
+ std::string value = data;
+ bool result = provider->StoreData(key, value);
+ memset(value.data(), 0, value.size());
+ return result;
+}
+
+
+bool SecretsProvider::DeleteDataCallback(void* ctxt, const char* key)
+{
+ SecretsProvider* provider = (SecretsProvider*)ctxt;
+ return provider->DeleteData(key);
+}
+
+
+std::vector<Ref<SecretsProvider>> SecretsProvider::GetList()
+{
+ size_t count;
+ BNSecretsProvider** list = BNGetSecretsProviderList(&count);
+ std::vector<Ref<SecretsProvider>> result;
+ for (size_t i = 0; i < count; i++)
+ result.push_back(new CoreSecretsProvider(list[i]));
+ BNFreeSecretsProviderList(list);
+ return result;
+}
+
+
+Ref<SecretsProvider> SecretsProvider::GetByName(const std::string& name)
+{
+ BNSecretsProvider* result = BNGetSecretsProviderByName(name.c_str());
+ if (!result)
+ return nullptr;
+ return new CoreSecretsProvider(result);
+}
+
+
+void SecretsProvider::Register(SecretsProvider* provider)
+{
+ BNSecretsProviderCallbacks cb;
+ cb.context = provider;
+ cb.hasData = HasDataCallback;
+ cb.getData = GetDataCallback;
+ cb.storeData = StoreDataCallback;
+ cb.deleteData = DeleteDataCallback;
+ provider->m_object = BNRegisterSecretsProvider(provider->m_nameForRegister.c_str(), &cb);
+}
+
+
+CoreSecretsProvider::CoreSecretsProvider(BNSecretsProvider* provider): SecretsProvider(provider)
+{
+
+}
+
+
+bool CoreSecretsProvider::HasData(const std::string& key)
+{
+ return BNSecretsProviderHasData(m_object, key.c_str());
+}
+
+
+std::optional<std::string> CoreSecretsProvider::GetData(const std::string& key)
+{
+ char* data = BNGetSecretsProviderData(m_object, key.c_str());
+ if (data == nullptr)
+ return std::optional<std::string>();
+
+ std::string value = data;
+ memset(data, 0, strlen(data));
+ BNFreeString(data);
+ return value;
+}
+
+
+bool CoreSecretsProvider::StoreData(const std::string& key, const std::string& data)
+{
+ return BNStoreSecretsProviderData(m_object, key.c_str(), data.c_str());
+}
+
+
+bool CoreSecretsProvider::DeleteData(const std::string& key)
+{
+ return BNDeleteSecretsProviderData(m_object, key.c_str());
+}