Skip to content

Commit 2de1344

Browse files
authored
feat: update urls for dashboard (#105)
1 parent 8a1d9ae commit 2de1344

4 files changed

Lines changed: 26 additions & 17 deletions

File tree

reai_toolkit/app/components/tabs/similarity_tab.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ def __init__(self, parent=None) -> None:
7676
super().__init__(parent)
7777
self._data: list[MatchedFunction] = []
7878
self._func_id: int | None = None
79+
self._analysis_id: int | None = None
80+
self._portal_url: str = "https://portal.reveng.ai"
7981

8082
def rowCount(self, parent=QtCore.QModelIndex()) -> int:
8183
return len(self._data)
@@ -107,7 +109,7 @@ def data(
107109
return None # Button column - handled by delegate
108110

109111
elif role == QtCore.Qt.ItemDataRole.UserRole:
110-
return f"https://portal.reveng.ai/function/{self._func_id}/compare?id={match.function_id}"
112+
return f"{self._portal_url}/analyses/{self._analysis_id}?fn={self._func_id}&view=matching&matchingMode=single&alt={match.function_id}"
111113

112114
elif role == QtCore.Qt.ItemDataRole.TextAlignmentRole:
113115
if col == SimilarityTableColumns.SIMILARITY:
@@ -149,10 +151,12 @@ def headerData(
149151
return self.COLUMNS[section]
150152
return None
151153

152-
def set_data(self, func_id: int, data: list[MatchedFunction]) -> None:
154+
def set_data(self, func_id: int, data: list[MatchedFunction], analysis_id: int, portal_url: str) -> None:
153155
self.beginResetModel()
154156
self._func_id = func_id
155157
self._data = data
158+
self._analysis_id = analysis_id
159+
self._portal_url = portal_url
156160
self.endResetModel()
157161

158162
def clear(self) -> None:
@@ -266,15 +270,15 @@ def _on_button_clicked(self, index: QtCore.QModelIndex) -> None:
266270
QtGui.QDesktopServices.openUrl(QtCore.QUrl(url))
267271

268272
def _on_fetch_finished(
269-
self, func_id: int, func_addr: int, data: list[MatchedFunction]
273+
self, func_id: int, func_addr: int, data: list[MatchedFunction], analysis_id: int, portal_url: str
270274
) -> None:
271275
"""Handle successful API response (called on main thread)."""
272276
# Ignore results if user has moved to a different function
273277
if func_addr != self._current_func_addr:
274278
return
275279

276280
if self._model:
277-
self._model.set_data(func_id, data)
281+
self._model.set_data(func_id, data, analysis_id, portal_url)
278282

279283
func_name = idaapi.get_func_name(func_addr) or f"sub_{func_addr:X}"
280284

@@ -295,6 +299,8 @@ def update_for_function(
295299
func_id: int,
296300
func_addr: int,
297301
data: list[MatchedFunction],
302+
analysis_id: int,
303+
portal_url: str,
298304
force: bool = False,
299305
) -> None:
300306
if not force and func_addr == self._current_func_addr:
@@ -313,4 +319,4 @@ def update_for_function(
313319
if self._model:
314320
self._model.clear()
315321

316-
self._on_fetch_finished(func_id, func_addr, data)
322+
self._on_fetch_finished(func_id, func_addr, data, analysis_id, portal_url)

reai_toolkit/app/coordinator.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,18 +107,21 @@ def run_dialog(self):
107107
pass
108108

109109
def redirect_analysis_portal(self) -> None:
110-
binary_id: int | None = self.app.netstore_service.get_binary_id()
111-
if binary_id is not None:
112-
portal_url: str = self.app.config_service.portal_url + f"/analyses/{binary_id}"
110+
analysis_id: int | None = self.app.netstore_service.get_analysis_id()
111+
if analysis_id is not None:
112+
portal_url: str = self.app.config_service.portal_url + f"/analyses/{analysis_id}"
113113
QtGui.QDesktopServices.openUrl(QtCore.QUrl(portal_url))
114114

115115
def redirect_function_portal(self) -> None:
116116
func_map: FunctionMapping | None = self.app.analysis_sync_service.netstore_service.get_function_mapping()
117117
current_ea: int = ida_kernwin.get_screen_ea()
118118
current_func: ida_funcs.func_t | None = ida_funcs.get_func(current_ea)
119-
if func_map and current_func:
119+
analysis_id: int | None = self.app.netstore_service.get_analysis_id()
120+
if func_map and current_func and analysis_id:
120121
function_id: int | None = func_map.inverse_function_map.get(
121122
str(current_func.start_ea), None
122123
)
123-
portal_url: str = self.app.config_service.portal_url + f"/function/{function_id}"
124+
portal_url: str = (
125+
self.app.config_service.portal_url + f"/analyses/{analysis_id}?fn={function_id}"
126+
)
124127
QtGui.QDesktopServices.openUrl(QtCore.QUrl(portal_url))

reai_toolkit/app/coordinators/similarity_coordinator.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,26 +70,26 @@ def disable_function_tracking(self) -> None:
7070
self._hook = None
7171

7272
def _launch_similarity_tab(
73-
self, local_func_id: int, local_vaddr: int, functions: list[MatchedFunction]
73+
self, local_func_id: int, local_vaddr: int, functions: list[MatchedFunction], analysis_id: int
7474
) -> None:
7575
def _show_tab() -> None:
7676
self._similarity_tab = SimilarityTab(self._on_pane_closed) # type: ignore
7777
self._similarity_tab.Create()
7878
self._similarity_tab.update_for_function(
79-
local_func_id, local_vaddr, functions
79+
local_func_id, local_vaddr, functions, analysis_id, self.app.config_service.portal_url
8080
)
8181

8282
kw.execute_ui_requests([_show_tab])
8383

8484
def _update_similarity_tab(
85-
self, local_func_id: int, local_vaddr: int, functions: list[MatchedFunction]
85+
self, local_func_id: int, local_vaddr: int, functions: list[MatchedFunction], analysis_id: int
8686
) -> None:
8787
def _update_tab() -> None:
8888
if self._similarity_tab is None:
8989
return
9090

9191
self._similarity_tab.update_for_function(
92-
local_func_id, local_vaddr, functions
92+
local_func_id, local_vaddr, functions, analysis_id, self.app.config_service.portal_url
9393
)
9494

9595
kw.execute_ui_requests([_update_tab])

reai_toolkit/app/services/matching/similarity_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def fetch_similar_functions(
2727
self,
2828
func_id: int,
2929
vaddr: int,
30-
callback: Callable[[int, int, list[MatchedFunction]], None],
30+
callback: Callable[[int, int, list[MatchedFunction], int], None],
3131
) -> None:
3232
self.start_worker(
3333
target=self._perform_function_similarity_request,
@@ -39,7 +39,7 @@ def _perform_function_similarity_request(
3939
stop_event: threading.Event,
4040
func_id: int,
4141
vaddr: int,
42-
callback: Callable[[int, int, list[MatchedFunction]], None],
42+
callback: Callable[[int, int, list[MatchedFunction], int], None],
4343
) -> None:
4444
with self.yield_api_client(sdk_config=self.sdk_config) as api_client:
4545
analyses_client = AnalysesCoreApi(api_client)
@@ -92,7 +92,7 @@ def _perform_function_similarity_request(
9292
if response.matches:
9393
matches = response.matches[0].matched_functions
9494

95-
return callback(func_id, vaddr, matches)
95+
return callback(func_id, vaddr, matches, analysis_id)
9696

9797
time.sleep(sleep_interval)
9898
elapsed += sleep_interval

0 commit comments

Comments
 (0)