Skip to content

Commit 6aaaffe

Browse files
authored
Merge pull request #10 from qtc-de/dev
Prepare v1.4.1 Release
2 parents 8de0d40 + 4f82ded commit 6aaaffe

File tree

12 files changed

+402
-327
lines changed

12 files changed

+402
-327
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
*.swp
2+
13
# Logs
24
logs
35
*.log

CHANGELOG.md

+16
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88

9+
## v1.4.1 - Apr 08, 2025
10+
11+
### Added
12+
13+
* Add human readable name for transfer syntax
14+
15+
### Changed
16+
17+
* Fix text overflow in interface details pane
18+
* Fix jumping to decompiled methods not working
19+
* Fix renaming of methods and sec callbacks
20+
* Fix command line interface not working
21+
* Creating a tab that already exists jumps to it
22+
* Update frontend dependencies
23+
24+
925
## v1.4.0 - Mar 29, 2025
1026

1127
### Changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
[![](https://github.com/qtc-de/rpv-web/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/qtc-de/rpv-web/actions/workflows/build.yml)
77
[![](https://github.com/qtc-de/rpv-web/actions/workflows/build.yml/badge.svg?branch=dev)](https://github.com/qtc-de/rpv-web/actions/workflows/build.yml)
8-
[![](https://img.shields.io/badge/version-1.4.0-blue)](https://github.com/qtc-de/rpv-web/releases)
8+
[![](https://img.shields.io/badge/version-1.4.1-blue)](https://github.com/qtc-de/rpv-web/releases)
99
[![](https://img.shields.io/badge/language-v%20%26%20vue-blue)](https://vlang.io/)
1010
[![](https://img.shields.io/badge/license-GPL%20v3.0-blue)](https://github.com/qtc-de/rpv-web/blob/master/LICENSE)
1111
[![](https://img.shields.io/badge/Pages-fa6b05)](https://qtc-de.github.io/rpv-web/)

frontend/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="UTF-8">
55
<link rel="icon" href="/favicon.ico">
66
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7-
<title>rpv</title>
7+
<title>rpv-web</title>
88
</head>
99
<body>
1010
<div id="app"></div>

frontend/package.json

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"name": "rpv-web",
33
"description": "A web frontend for rpv",
4-
"version": "1.0.0",
4+
"version": "1.4.1",
55
"homepage": "https://github.com/qtc-de/rpv-web",
66
"license": "GPL-3.0",
77
"author": {
8-
"name": "Tobias Neitzel",
9-
"url": "https://twitter.com/qtc_de"
8+
"name": "Tobias Neitzel",
9+
"url": "https://twitter.com/qtc_de"
1010
},
1111
"scripts": {
1212
"dev": "vite",
@@ -16,13 +16,13 @@
1616
"dependencies": {
1717
"@highlightjs/vue-plugin": "^2.1.0",
1818
"@iarna/toml": "^3.0.0",
19-
"pinia": "^2.0.32",
20-
"vue": "^3.2.47",
21-
"vue-router": "^4.1.6",
22-
"vue-simple-context-menu": "^4.0.4"
19+
"pinia": "^3.0.1",
20+
"vue": "^3.5.13",
21+
"vue-router": "^4.5.0",
22+
"vue-simple-context-menu": "^4.1.0"
2323
},
2424
"devDependencies": {
25-
"@vitejs/plugin-vue": "^4.0.0",
26-
"vite": "^4.1.4"
25+
"@vitejs/plugin-vue": "^5.2.3",
26+
"vite": "^6.2.5"
2727
}
2828
}

frontend/src/components/Headline.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@
374374
<p id="Logo" class="d-inline-block">RP</p>
375375
<img id="LogoPng" src="../assets/icons/rpv-web.png"/>
376376
<p id="Web" class="d-inline-block">WEB</p>
377-
<p class="Fs-8 mb-0 ml-4">v1.4.0</p>
377+
<p class="Fs-8 mb-0 ml-4">v1.4.1</p>
378378
</div>
379379
380380
<div id="RightHeadline">

frontend/src/components/InterfaceDetailPane.vue

+127-116
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@
6969
7070
async saveNotes()
7171
{
72-
if (!this.selectedInterface) {
72+
if (!this.selectedInterface)
73+
{
7374
return
7475
}
7576
@@ -83,121 +84,127 @@
8384
</script>
8485

8586
<template>
86-
<h3 class="mb-2">Interface Information</h3>
87-
88-
<div class="tabnav">
89-
<nav class="tabnav-tabs" aria-label="ServerNav">
90-
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'General') ? true : null" @click="switchTab('General')">General</button>
91-
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'RPC') ? true : null" @click="switchTab('RPC')">RPC</button>
92-
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'Security') ? true : null" @click="switchTab('Security')">Security</button>
93-
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'NDR') ? true : null" @click="switchTab('NDR')">NDR</button>
94-
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'Notes') ? true : null" @click="switchTab('Notes')">Notes</button>
95-
</nav>
87+
<div id="InterfaceDetailPane">
88+
<h3 class="mb-2">Interface Information</h3>
89+
90+
<div class="tabnav">
91+
<nav class="tabnav-tabs" aria-label="ServerNav">
92+
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'General') ? true : null" @click="switchTab('General')">General</button>
93+
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'RPC') ? true : null" @click="switchTab('RPC')">RPC</button>
94+
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'Security') ? true : null" @click="switchTab('Security')">Security</button>
95+
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'NDR') ? true : null" @click="switchTab('NDR')">NDR</button>
96+
<button class="tabnav-tab ServerNavTab" :aria-current="(selectedTab == 'Notes') ? true : null" @click="switchTab('Notes')">Notes</button>
97+
</nav>
98+
</div>
99+
100+
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'General'">
101+
<tr>
102+
<td>ID</td>
103+
<td v-if="selectedInterface">{{ selectedInterface.id }}</td>
104+
</tr>
105+
<tr>
106+
<td>Name</td>
107+
<td v-if="selectedInterface && !editInterfaceName" @dblclick="enableEditing($event, 'InterfaceName', selectedInterface.name)">{{ selectedInterface.name }}</td>
108+
<td v-if="selectedInterface && editInterfaceName"><input ref="InterfaceName" class="DynamicInput" v-on:keyup.enter="changeInterfaceName($event)"
109+
v-on:blur="changeInterfaceName($event)"/></td>
110+
</tr>
111+
<tr>
112+
<td>Module</td>
113+
<td v-if="selectedInterface">{{ selectedInterface.location }}</td>
114+
</tr>
115+
<tr>
116+
<td>Module Base</td>
117+
<td v-if="selectedInterface">{{ selectedInterface.module_base }}</td>
118+
</tr>
119+
<tr>
120+
<td>Description</td>
121+
<td v-if="selectedInterface">{{ selectedInterface.description }}</td>
122+
</tr>
123+
<tr>
124+
<td>Method Count</td>
125+
<td v-if="selectedInterface">{{ selectedInterface.methods.length }}</td>
126+
</tr>
127+
</table>
128+
129+
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'RPC'">
130+
<tr>
131+
<td>EP Registered</td>
132+
<td v-if="selectedInterface">{{ selectedInterface.ep_registered }}</td>
133+
</tr>
134+
<tr>
135+
<td>Base Addr</td>
136+
<td v-if="selectedInterface">{{ selectedInterface.base }}</td>
137+
</tr>
138+
<tr>
139+
<td>Dispatch Table</td>
140+
<td v-if="selectedInterface">{{ selectedInterface.dispatch_table_addr }}</td>
141+
</tr>
142+
<tr>
143+
<td>Annotation</td>
144+
<td v-if="selectedInterface">{{ selectedInterface.annotation }}</td>
145+
</tr>
146+
<tr>
147+
<td>Flags</td>
148+
</tr>
149+
<tr v-if="selectedInterface" v-for="flag in selectedInterface.flags">
150+
<td></td>
151+
<td v-if="selectedInterface">{{ flag }}</td>
152+
</tr>
153+
</table>
154+
155+
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'Security'">
156+
<tr>
157+
<td>Security Callback</td>
158+
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.addr }}</td>
159+
</tr>
160+
<tr>
161+
<td>Callback Name</td>
162+
<td v-if="selectedInterface && !editSecCallback" @dblclick="enableEditing($event, 'SecCallback', selectedInterface.sec_callback.name)">{{ selectedInterface.sec_callback.name }}</td>
163+
<td v-if="selectedInterface && editSecCallback"><input ref="SecCallback" class="DynamicInput" v-on:keyup.enter="changeCallbackName($event)"
164+
v-on:blur="changeCallbackName($event)"/></td>
165+
</tr>
166+
<tr>
167+
<td>Module</td>
168+
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.location }}</td>
169+
</tr>
170+
<tr>
171+
<td>Offset</td>
172+
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.offset }}</td>
173+
</tr>
174+
<tr>
175+
<td>Description</td>
176+
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.description }}</td>
177+
</tr>
178+
</table>
179+
180+
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'NDR'">
181+
<tr>
182+
<td>Transfer Syntax</td>
183+
<td v-if="selectedInterface">{{ selectedInterface.ndr_info.syntax }}</td>
184+
</tr>
185+
<tr>
186+
<td>Syntax Name</td>
187+
<td v-if="selectedInterface">{{ selectedInterface.ndr_info.syntax_name }}</td>
188+
</tr>
189+
<tr>
190+
<td>NDR Version</td>
191+
<td v-if="selectedInterface">0x{{ selectedInterface.ndr_info.ndr_version.toString(16) }}</td>
192+
</tr>
193+
<tr>
194+
<td>MIDL Version</td>
195+
<td v-if="selectedInterface">0x{{ selectedInterface.ndr_info.midl_version.toString(16) }}</td>
196+
</tr>
197+
<tr>
198+
<td>Flags</td>
199+
</tr>
200+
<tr v-if="selectedInterface" v-for="flag in selectedInterface.ndr_info.flags">
201+
<td></td>
202+
<td v-if="selectedInterface">{{ flag }}</td>
203+
</tr>
204+
</table>
205+
206+
<textarea ref="Notes" id="NotesArea" class="ml-1 mt-2" v-if="selectedInterface && selectedTab == 'Notes'" v-on:input="saveNotes()" :value="selectedInterface.notes"></textarea>
96207
</div>
97-
98-
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'General'">
99-
<tr>
100-
<td>ID</td>
101-
<td v-if="selectedInterface">{{ selectedInterface.id }}</td>
102-
</tr>
103-
<tr>
104-
<td>Name</td>
105-
<td v-if="selectedInterface && !editInterfaceName" @dblclick="enableEditing($event, 'InterfaceName', selectedInterface.name)">{{ selectedInterface.name }}</td>
106-
<td v-if="selectedInterface && editInterfaceName"><input ref="InterfaceName" class="DynamicInput" v-on:keyup.enter="changeInterfaceName($event)"
107-
v-on:blur="changeInterfaceName($event)"/></td>
108-
</tr>
109-
<tr>
110-
<td>Module</td>
111-
<td v-if="selectedInterface">{{ selectedInterface.location }}</td>
112-
</tr>
113-
<tr>
114-
<td>Module Base</td>
115-
<td v-if="selectedInterface">{{ selectedInterface.module_base }}</td>
116-
</tr>
117-
<tr>
118-
<td>Description</td>
119-
<td v-if="selectedInterface">{{ selectedInterface.description }}</td>
120-
</tr>
121-
<tr>
122-
<td>Method Count</td>
123-
<td v-if="selectedInterface">{{ selectedInterface.methods.length }}</td>
124-
</tr>
125-
</table>
126-
127-
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'RPC'">
128-
<tr>
129-
<td>EP Registered</td>
130-
<td v-if="selectedInterface">{{ selectedInterface.ep_registered }}</td>
131-
</tr>
132-
<tr>
133-
<td>Base Addr</td>
134-
<td v-if="selectedInterface">{{ selectedInterface.base }}</td>
135-
</tr>
136-
<tr>
137-
<td>Dispatch Table</td>
138-
<td v-if="selectedInterface">{{ selectedInterface.dispatch_table_addr }}</td>
139-
</tr>
140-
<tr>
141-
<td>Annotation</td>
142-
<td v-if="selectedInterface">{{ selectedInterface.annotation }}</td>
143-
</tr>
144-
<tr>
145-
<td>Flags</td>
146-
</tr>
147-
<tr v-if="selectedInterface" v-for="flag in selectedInterface.flags">
148-
<td></td>
149-
<td v-if="selectedInterface">{{ flag }}</td>
150-
</tr>
151-
</table>
152-
153-
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'Security'">
154-
<tr>
155-
<td>Security Callback</td>
156-
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.addr }}</td>
157-
</tr>
158-
<tr>
159-
<td>Callback Name</td>
160-
<td v-if="selectedInterface && !editSecCallback" @dblclick="enableEditing($event, 'SecCallback', selectedInterface.sec_callback.name)">{{ selectedInterface.sec_callback.name }}</td>
161-
<td v-if="selectedInterface && editSecCallback"><input ref="SecCallback" class="DynamicInput" v-on:keyup.enter="changeCallbackName($event)"
162-
v-on:blur="changeCallbackName($event)"/></td>
163-
</tr>
164-
<tr>
165-
<td>Module</td>
166-
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.location }}</td>
167-
</tr>
168-
<tr>
169-
<td>Offset</td>
170-
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.offset }}</td>
171-
</tr>
172-
<tr>
173-
<td>Description</td>
174-
<td v-if="selectedInterface">{{ selectedInterface.sec_callback.description }}</td>
175-
</tr>
176-
</table>
177-
178-
<table class="ml-1 mt-2 InterfaceDetailedTable" v-if="selectedTab == 'NDR'">
179-
<tr>
180-
<td>Transfer Syntax</td>
181-
<td v-if="selectedInterface">{{ selectedInterface.ndr_info.syntax }}</td>
182-
</tr>
183-
<tr>
184-
<td>NDR Version</td>
185-
<td v-if="selectedInterface">0x{{ selectedInterface.ndr_info.ndr_version.toString(16) }}</td>
186-
</tr>
187-
<tr>
188-
<td>MIDL Version</td>
189-
<td v-if="selectedInterface">0x{{ selectedInterface.ndr_info.midl_version.toString(16) }}</td>
190-
</tr>
191-
<tr>
192-
<td>Flags</td>
193-
</tr>
194-
<tr v-if="selectedInterface" v-for="flag in selectedInterface.ndr_info.flags">
195-
<td></td>
196-
<td v-if="selectedInterface">{{ flag }}</td>
197-
</tr>
198-
</table>
199-
200-
<textarea ref="Notes" id="NotesArea" class="ml-1 mt-2" v-if="selectedInterface && selectedTab == 'Notes'" v-on:keyup.enter="saveNotes()" v-on:blur="saveNotes()">{{selectedInterface.notes}} </textarea>
201208
</template>
202209

203210
<style>
@@ -206,8 +213,12 @@
206213
height: 70%;
207214
}
208215
216+
#InterfaceDetailPane {
217+
overflow: auto;
218+
}
219+
209220
.InterfaceDetailedTable {
210-
width: 100%;
221+
width: 99%;
211222
text-align: left;
212223
white-space: nowrap;
213224
}

0 commit comments

Comments
 (0)