diff options
Diffstat (limited to 'python/collaboration/folder.py')
| -rw-r--r-- | python/collaboration/folder.py | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/python/collaboration/folder.py b/python/collaboration/folder.py new file mode 100644 index 00000000..cedbbe6d --- /dev/null +++ b/python/collaboration/folder.py @@ -0,0 +1,164 @@ + +import ctypes +from typing import Optional + +from .. import _binaryninjacore as core +from .. import project as core_project +from . import project, remote, util + + +class RemoteFolder: + """ + Class representing a remote folder in a project. + """ + def __init__(self, handle: core.BNRemoteFolderHandle): + self._handle = ctypes.cast(handle, core.BNRemoteFolderHandle) + + def __del__(self): + if core is not None: + core.BNFreeRemoteFolder(self._handle) + + def __eq__(self, other): + if not isinstance(other, RemoteFolder): + return False + return self.id == other.id + + def __repr__(self): + path = self.name + parent = self.parent + while parent is not None: + path = parent.name + '/' + path + parent = parent.parent + return f'<folder: {self.remote.name}/{self.project.name}/{path}>' + + def __str__(self): + path = self.name + parent = self.parent + while parent is not None: + path = parent.name + '/' + path + parent = parent.parent + return f'<folder: {self.remote.name}/{self.project.name}/{path}>' + + @property + def core_folder(self) -> 'core_project.ProjectFolder': + core_handle = core.BNRemoteFolderGetCoreFolder(self._handle) + if core_handle is None: + raise RuntimeError(util._last_error()) + return core_project.ProjectFolder(handle=ctypes.cast(core_handle, ctypes.POINTER(core.BNProjectFolder))) + + @property + def project(self) -> 'project.RemoteProject': + """ + Owning Project. + + :return: Project object + """ + value = core.BNRemoteFolderGetProject(self._handle) + if value is None: + raise RuntimeError(util._last_error()) + return project.RemoteProject(handle=value) + + @property + def remote(self) -> 'remote.Remote': + """ + Owning Remote + + :return: Remote object + """ + value = core.BNRemoteFolderGetRemote(self._handle) + if value is None: + raise RuntimeError(util._last_error()) + return remote.Remote(handle=value) + + @property + def parent(self) -> Optional['RemoteFolder']: + """ + Parent folder, if one exists. None if this is in the root of a project. + + :return: Parent folder object or None + """ + if not self.project.has_pulled_folders: + self.project.pull_folders() + parent = ctypes.POINTER(core.BNRemoteFolder)() + if not core.BNRemoteFolderGetParent(self._handle, parent): + raise RuntimeError(util._last_error()) + if not parent: + return None + return RemoteFolder(handle=parent) + + @parent.setter + def parent(self, parent: Optional['RemoteFolder']): + """ + Set the parent folder. You will need to push the folder to update the remote version. + + :param parent: New parent folder + :raises RuntimeError: If there was an error + """ + if not core.BNRemoteFolderSetParent(self._handle, parent._handle if parent is not None else None): + raise RuntimeError(util._last_error()) + + @property + def url(self) -> str: + """ + Web api endpoint URL + + :return: URL string + """ + return core.BNRemoteFolderGetUrl(self._handle) + + @property + def id(self) -> str: + """ + Unique id + + :return: Id string + """ + return core.BNRemoteFolderGetId(self._handle) + + @property + def parent_id(self) -> Optional[str]: + """ + Unique id of parent folder, if there is a parent. None, otherwise + + :return: Id string or None + """ + parent_id = ctypes.c_char_p() + if not core.BNRemoteFolderGetParentId(self._handle, parent_id): + return None + return core.pyNativeStr(parent_id.value) + + @property + def name(self) -> str: + """ + Displayed name of folder + + :return: Name string + """ + return core.BNRemoteFolderGetName(self._handle) + + @name.setter + def name(self, name: str): + """ + Set the display name of the folder. You will need to push the folder to update the remote version. + + :param name: New name + """ + core.BNRemoteFolderSetName(self._handle, name) + + @property + def description(self) -> str: + """ + Description of the folder + + :return: Description string + """ + return core.BNRemoteFolderGetDescription(self._handle) + + @description.setter + def description(self, description: str): + """ + Set the description of the folder. You will need to push the folder to update the remote version. + + :param description: New description + """ + core.BNRemoteFolderSetDescription(self._handle, description) |
