Skip to content

Commit ad37832

Browse files
committed
PluginManager refactor for supporting plugin installation ui
Expose additional PluginManager APIs and update documentation
1 parent 7e7f0b4 commit ad37832

10 files changed

+386
-307
lines changed

binaryninjaapi.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,16 @@ map<string, uint64_t> BinaryNinja::GetMemoryUsageInfo()
368368
BNFreeMemoryUsageInfo(info, count);
369369
return result;
370370
}
371+
372+
373+
vector<string> BinaryNinja::GetRegisteredPluginLoaders()
374+
{
375+
size_t count = 0;
376+
char** loaders = BNGetRegisteredPluginLoaders(&count);
377+
vector<string> result;
378+
result.reserve(count);
379+
for (size_t i = 0; i < count; i++)
380+
result.push_back(loaders[i]);
381+
BNFreeRegisteredPluginLoadersList(loaders, count);
382+
return result;
383+
}

binaryninjaapi.h

+32-17
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,7 @@ namespace BinaryNinja
707707
std::string GetUniqueIdentifierString();
708708

709709
std::map<std::string, uint64_t> GetMemoryUsageInfo();
710+
std::vector<std::string> GetRegisteredPluginLoaders();
710711

711712
class DataBuffer
712713
{
@@ -4263,30 +4264,51 @@ namespace BinaryNinja
42634264
};
42644265

42654266
typedef BNPluginOrigin PluginOrigin;
4266-
typedef BNPluginUpdateStatus PluginUpdateStatus;
4267+
typedef BNPluginStatus PluginStatus;
42674268
typedef BNPluginType PluginType;
42684269

42694270
class RepoPlugin: public CoreRefCountObject<BNRepoPlugin, BNNewPluginReference, BNFreePlugin>
42704271
{
42714272
public:
42724273
RepoPlugin(BNRepoPlugin* plugin);
4274+
PluginStatus GetPluginStatus() const;
4275+
std::vector<std::string> GetApis() const;
4276+
std::vector<std::string> GetInstallPlatforms() const;
42734277
std::string GetPath() const;
4274-
bool IsInstalled() const;
42754278
std::string GetPluginDirectory() const;
4276-
void SetEnabled(bool enabled);
4277-
bool IsEnabled() const;
4278-
PluginUpdateStatus GetPluginUpdateStatus() const;
4279-
std::string GetApi() const;
42804279
std::string GetAuthor() const;
42814280
std::string GetDescription() const;
42824281
std::string GetLicense() const;
42834282
std::string GetLicenseText() const;
42844283
std::string GetLongdescription() const;
4285-
std::string GetMinimimVersions() const;
42864284
std::string GetName() const;
42874285
std::vector<PluginType> GetPluginTypes() const;
4288-
std::string GetUrl() const;
4286+
std::string GetPackageUrl() const;
4287+
std::string GetProjectUrl() const;
4288+
std::string GetAuthorUrl() const;
42894289
std::string GetVersion() const;
4290+
std::string GetCommit() const;
4291+
std::string GetRepository() const;
4292+
std::string GetProjectData();
4293+
std::string GetInstallInstructions(const std::string& platform) const;
4294+
uint64_t GetMinimimVersion() const;
4295+
uint64_t GetLastUpdate();
4296+
bool IsBeingDeleted() const;
4297+
bool IsBeingUpdated() const;
4298+
bool IsInstalled() const;
4299+
bool IsEnabled() const;
4300+
bool IsRunning() const;
4301+
bool IsUpdatePending() const;
4302+
bool IsDisablePending() const;
4303+
bool IsDeletePending() const;
4304+
bool IsUpdateAvailable() const;
4305+
4306+
bool Uninstall();
4307+
bool Install();
4308+
// `force` ignores optional checks for platform/api compliance
4309+
bool Enable(bool force);
4310+
bool Disable();
4311+
bool Update();
42904312
};
42914313

42924314
class Repository: public CoreRefCountObject<BNRepository, BNNewRepositoryReference, BNFreeRepository>
@@ -4298,7 +4320,6 @@ namespace BinaryNinja
42984320
std::string GetLocalReference() const;
42994321
std::string GetRemoteReference() const;
43004322
std::vector<Ref<RepoPlugin>> GetPlugins() const;
4301-
bool IsInitialized() const;
43024323
std::string GetPluginDirectory() const;
43034324
Ref<RepoPlugin> GetPluginByPath(const std::string& pluginPath);
43044325
std::string GetFullPath() const;
@@ -4313,14 +4334,8 @@ namespace BinaryNinja
43134334
bool CheckForUpdates();
43144335
std::vector<Ref<Repository>> GetRepositories();
43154336
Ref<Repository> GetRepositoryByPath(const std::string& repoName);
4316-
bool AddRepository(const std::string& url,
4317-
const std::string& repoPath, // Relative path within the repositories directory
4318-
const std::string& localReference="master",
4319-
const std::string& remoteReference="origin");
4320-
bool EnablePlugin(const std::string& repoName, const std::string& pluginPath);
4321-
bool DisablePlugin(const std::string& repoName, const std::string& pluginPath);
4322-
bool InstallPlugin(const std::string& repoName, const std::string& pluginPath);
4323-
bool UninstallPlugin(const std::string& repoName, const std::string& pluginPath);
4337+
bool AddRepository(const std::string& url, // URL to raw plugins.json file
4338+
const std::string& repoPath); // Relative path within the repositories directory
43244339
Ref<Repository> GetDefaultRepository();
43254340
};
43264341

binaryninjacore.h

+43-24
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ extern "C"
161161
struct BNDataRendererContainer;
162162
struct BNDisassemblyTextRenderer;
163163

164-
typedef bool (*BNLoadPluginCallback)(const char* repoPath, const char* pluginPath, void* ctx);
164+
typedef bool (*BNLoadPluginCallback)(const char* repoPath, const char* pluginPath, bool force, void* ctx);
165165

166166
//! Console log levels
167167
enum BNLogLevel
@@ -779,18 +779,27 @@ extern "C"
779779
OtherPluginOrigin
780780
};
781781

782-
enum BNPluginUpdateStatus
782+
enum BNPluginStatus
783783
{
784-
UpToDatePluginStatus,
785-
UpdatesAvailablePluginStatus
784+
NotInstalledPluginStatus = 0x00000000,
785+
InstalledPluginStatus = 0x00000001,
786+
EnabledPluginStatus = 0x00000002,
787+
UpdateAvailablePluginStatus = 0x00000010,
788+
DeletePendingPluginStatus = 0x00000020,
789+
UpdatePendingPluginStatus = 0x00000040,
790+
DisablePendingPluginStatus = 0x00000080,
791+
PendingRestartPluginStatus = 0x00000200,
792+
BeingUpdatedPluginStatus = 0x00000400,
793+
BeingDeletedPluginStatus = 0x00000800
786794
};
787795

788796
enum BNPluginType
789797
{
790798
CorePluginType,
791799
UiPluginType,
792800
ArchitecturePluginType,
793-
BinaryViewPluginType
801+
BinaryViewPluginType,
802+
HelperPluginType
794803
};
795804

796805
struct BNLookupTableEntry
@@ -3717,39 +3726,53 @@ extern "C"
37173726
BINARYNINJACOREAPI void BNFreeDemangledName(char*** name, size_t nameElements);
37183727

37193728
// Plugin repository APIs
3720-
BINARYNINJACOREAPI const char* BNPluginGetApi(BNRepoPlugin* p);
3729+
BINARYNINJACOREAPI char** BNPluginGetApis(BNRepoPlugin* p, size_t* count);
37213730
BINARYNINJACOREAPI const char* BNPluginGetAuthor(BNRepoPlugin* p);
37223731
BINARYNINJACOREAPI const char* BNPluginGetDescription(BNRepoPlugin* p);
37233732
BINARYNINJACOREAPI const char* BNPluginGetLicense(BNRepoPlugin* p);
37243733
BINARYNINJACOREAPI const char* BNPluginGetLicenseText(BNRepoPlugin* p);
37253734
BINARYNINJACOREAPI const char* BNPluginGetLongdescription(BNRepoPlugin* p);
3726-
BINARYNINJACOREAPI const char* BNPluginGetMinimimVersions(BNRepoPlugin* p);
3735+
BINARYNINJACOREAPI uint64_t BNPluginGetMinimimVersion(BNRepoPlugin* p);
37273736
BINARYNINJACOREAPI const char* BNPluginGetName(BNRepoPlugin* p);
3728-
BINARYNINJACOREAPI const char* BNPluginGetUrl(BNRepoPlugin* p);
3737+
BINARYNINJACOREAPI const char* BNPluginGetProjectUrl(BNRepoPlugin* p);
3738+
BINARYNINJACOREAPI const char* BNPluginGetPackageUrl(BNRepoPlugin* p);
3739+
BINARYNINJACOREAPI const char* BNPluginGetAuthorUrl(BNRepoPlugin* p);
37293740
BINARYNINJACOREAPI const char* BNPluginGetVersion(BNRepoPlugin* p);
3741+
BINARYNINJACOREAPI const char* BNPluginGetCommit(BNRepoPlugin* p);
37303742
BINARYNINJACOREAPI void BNFreePluginTypes(BNPluginType* r);
37313743
BINARYNINJACOREAPI BNRepoPlugin* BNNewPluginReference(BNRepoPlugin* r);
37323744
BINARYNINJACOREAPI void BNFreePlugin(BNRepoPlugin* plugin);
37333745
BINARYNINJACOREAPI const char* BNPluginGetPath(BNRepoPlugin* p);
37343746
BINARYNINJACOREAPI bool BNPluginIsInstalled(BNRepoPlugin* p);
3735-
BINARYNINJACOREAPI void BNPluginSetEnabled(BNRepoPlugin* p, bool enabled);
37363747
BINARYNINJACOREAPI bool BNPluginIsEnabled(BNRepoPlugin* p);
3737-
BINARYNINJACOREAPI BNPluginUpdateStatus BNPluginGetPluginUpdateStatus(BNRepoPlugin* p);
3748+
BINARYNINJACOREAPI BNPluginStatus BNPluginGetPluginStatus(BNRepoPlugin* p);
37383749
BINARYNINJACOREAPI BNPluginType* BNPluginGetPluginTypes(BNRepoPlugin* p, size_t* count);
3739-
BINARYNINJACOREAPI bool BNPluginEnable(BNRepoPlugin* p);
3750+
BINARYNINJACOREAPI bool BNPluginEnable(BNRepoPlugin* p, bool force);
37403751
BINARYNINJACOREAPI bool BNPluginDisable(BNRepoPlugin* p);
37413752
BINARYNINJACOREAPI bool BNPluginInstall(BNRepoPlugin* p);
37423753
BINARYNINJACOREAPI bool BNPluginUninstall(BNRepoPlugin* p);
3754+
BINARYNINJACOREAPI bool BNPluginUpdate(BNRepoPlugin* p);
3755+
BINARYNINJACOREAPI char* BNPluginGetInstallInstructions(BNRepoPlugin* p, const char* platform);
3756+
BINARYNINJACOREAPI char** BNPluginGetPlatforms(BNRepoPlugin* p, size_t* count);
3757+
BINARYNINJACOREAPI void BNFreePluginPlatforms(char** platforms, size_t count);
3758+
BINARYNINJACOREAPI const char* BNPluginGetRepository(BNRepoPlugin* p);
3759+
BINARYNINJACOREAPI bool BNPluginIsBeingDeleted(BNRepoPlugin* p);
3760+
BINARYNINJACOREAPI bool BNPluginIsBeingUpdated(BNRepoPlugin* p);
3761+
BINARYNINJACOREAPI bool BNPluginIsRunning(BNRepoPlugin* p);
3762+
BINARYNINJACOREAPI bool BNPluginIsUpdatePending(BNRepoPlugin* p);
3763+
BINARYNINJACOREAPI bool BNPluginIsDisablePending(BNRepoPlugin* p);
3764+
BINARYNINJACOREAPI bool BNPluginIsDeletePending(BNRepoPlugin* p);
3765+
BINARYNINJACOREAPI bool BNPluginIsUpdateAvailable(BNRepoPlugin* p);
3766+
3767+
BINARYNINJACOREAPI char* BNPluginGetProjectData(BNRepoPlugin* p);
3768+
BINARYNINJACOREAPI uint64_t BNPluginGetLastUpdate(BNRepoPlugin* p);
37433769

37443770
BINARYNINJACOREAPI BNRepository* BNNewRepositoryReference(BNRepository* r);
37453771
BINARYNINJACOREAPI void BNFreeRepository(BNRepository* r);
37463772
BINARYNINJACOREAPI char* BNRepositoryGetUrl(BNRepository* r);
37473773
BINARYNINJACOREAPI char* BNRepositoryGetRepoPath(BNRepository* r);
3748-
BINARYNINJACOREAPI char* BNRepositoryGetLocalReference(BNRepository* r);
3749-
BINARYNINJACOREAPI char* BNRepositoryGetRemoteReference(BNRepository* r);
37503774
BINARYNINJACOREAPI BNRepoPlugin** BNRepositoryGetPlugins(BNRepository* r, size_t* count);
37513775
BINARYNINJACOREAPI void BNFreeRepositoryPluginList(BNRepoPlugin** r);
3752-
BINARYNINJACOREAPI bool BNRepositoryIsInitialized(BNRepository* r);
37533776
BINARYNINJACOREAPI void BNRepositoryFreePluginDirectoryList(char** list, size_t count);
37543777
BINARYNINJACOREAPI BNRepoPlugin* BNRepositoryGetPluginByPath(BNRepository* r, const char* pluginPath);
37553778
BINARYNINJACOREAPI const char* BNRepositoryGetPluginsPath(BNRepository* r);
@@ -3762,23 +3785,18 @@ extern "C"
37623785
BINARYNINJACOREAPI void BNFreeRepositoryManagerRepositoriesList(BNRepository** r);
37633786
BINARYNINJACOREAPI bool BNRepositoryManagerAddRepository(BNRepositoryManager* r,
37643787
const char* url,
3765-
const char* repoPath,
3766-
const char* localReference,
3767-
const char* remoteReference);
3768-
BINARYNINJACOREAPI bool BNRepositoryManagerEnablePlugin(BNRepositoryManager* r, const char* repoName, const char* pluginPath);
3769-
BINARYNINJACOREAPI bool BNRepositoryManagerDisablePlugin(BNRepositoryManager* r, const char* repoName, const char* pluginPath);
3770-
BINARYNINJACOREAPI bool BNRepositoryManagerInstallPlugin(BNRepositoryManager* r, const char* repoName, const char* pluginPath);
3771-
BINARYNINJACOREAPI bool BNRepositoryManagerUninstallPlugin(BNRepositoryManager* r, const char* repoName, const char* pluginPath);
3772-
BINARYNINJACOREAPI bool BNRepositoryManagerUpdatePlugin(BNRepositoryManager* r, const char* repoName, const char* pluginPath);
3788+
const char* repoPath);
37733789
BINARYNINJACOREAPI BNRepository* BNRepositoryGetRepositoryByPath(BNRepositoryManager* r, const char* repoPath);
37743790
BINARYNINJACOREAPI BNRepositoryManager* BNGetRepositoryManager();
37753791

37763792
BINARYNINJACOREAPI BNRepository* BNRepositoryManagerGetDefaultRepository(BNRepositoryManager* r);
37773793
BINARYNINJACOREAPI void BNRegisterForPluginLoading(
37783794
const char* pluginApiName,
3779-
bool (*cb)(const char* repoPath, const char* pluginPath, void* ctx),
3795+
bool (*cb)(const char* repoPath, const char* pluginPath, bool force, void* ctx), // BNLoadPluginCallback
37803796
void* ctx);
3781-
BINARYNINJACOREAPI bool BNLoadPluginForApi(const char* pluginApiName, const char* repoPath, const char* pluginPath);
3797+
BINARYNINJACOREAPI bool BNLoadPluginForApi(const char* pluginApiName, const char* repoPath, const char* pluginPath, bool force);
3798+
BINARYNINJACOREAPI char** BNGetRegisteredPluginLoaders(size_t* count);
3799+
BINARYNINJACOREAPI void BNFreeRegisteredPluginLoadersList(char** pluginLoaders, size_t count);
37823800

37833801
// LLVM Services APIs
37843802
BINARYNINJACOREAPI void BNLlvmServicesInit(void);
@@ -3796,6 +3814,7 @@ extern "C"
37963814
BINARYNINJACOREAPI bool BNIsPathDirectory(const char* path);
37973815
BINARYNINJACOREAPI bool BNIsPathRegularFile(const char* path);
37983816
BINARYNINJACOREAPI bool BNFileSize(const char* path, uint64_t* size);
3817+
BINARYNINJACOREAPI bool BNRenameFile(const char* source, const char* dest);
37993818

38003819
// Settings APIs
38013820
BINARYNINJACOREAPI bool BNSettingsRegisterGroup(const char* registry, const char* group, const char* title);

0 commit comments

Comments
 (0)