webgate 0.3.2__tar.gz → 0.3.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {webgate-0.3.2 → webgate-0.3.3}/CHANGELOG.md +13 -0
- {webgate-0.3.2 → webgate-0.3.3}/PKG-INFO +38 -1
- {webgate-0.3.2 → webgate-0.3.3}/README.md +37 -0
- webgate-0.3.3/after-reload.yaml +64 -0
- webgate-0.3.3/docs/screenshots/v0.3/01-login-demo-banner.png +0 -0
- webgate-0.3.3/docs/screenshots/v0.3/02-dashboard-jump-host.png +0 -0
- webgate-0.3.3/docs/screenshots/v0.3/03-terminal-snippets-jump.png +0 -0
- webgate-0.3.3/docs/screenshots/v0.3/04-snippet-executed.png +0 -0
- webgate-0.3.3/docs/screenshots/v0.3/05-sftp-via-jump.png +0 -0
- webgate-0.3.3/docs/screenshots/v0.3/06-webhooks-modal.png +0 -0
- webgate-0.3.3/docs/screenshots/v0.3/07-webhook-test-fired.png +0 -0
- webgate-0.3.3/docs/screenshots/v0.3/08-add-server-jump-via.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/pyproject.toml +1 -1
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/static/index.html +2 -2
- {webgate-0.3.2 → webgate-0.3.3}/.dockerignore +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/.github/workflows/docs.yml +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/.gitignore +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/Dockerfile +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/Dockerfile.demo +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/Dockerfile.ssh-demo +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/LICENSE +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/ROADMAP.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/VERSION +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/compose.dev.yml +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/compose.yml +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/api/auth.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/api/files.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/api/servers.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/api/terminal.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/changelog.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/getting-started/installation.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/getting-started/quickstart.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/guide/files.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/guide/servers.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/guide/split.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/guide/terminal.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/guide/users.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/index.md +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/access-control.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/audit.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/edit-access-control.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/editor.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/light-theme.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/login.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/new-server-form.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/sftp-restricted.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/sftp.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/site-manager.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/split-view.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/ssh-disabled.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/terminal.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/docs/screenshots/users.png +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/fly.toml +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/mkdocs.yml +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/__main__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/app.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/audit/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/audit/models.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/audit/service.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/models.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/routes.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/auth/service.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/config.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/db/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/db/engine.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/demo.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/models.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/pool.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/routes.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/files/sftp_service.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/crypto.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/models.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/monitor.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/routes.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/servers/service.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/snippets/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/snippets/models.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/snippets/routes.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/routes.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/ssh_session.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/terminal/ws_handler.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/dispatcher.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/models.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/src/webgate/webhooks/routes.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/tests/__init__.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/tests/conftest.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/tests/test_auth.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/tests/test_files.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/tests/test_servers.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/tests/test_terminal.py +0 -0
- {webgate-0.3.2 → webgate-0.3.3}/uv.lock +0 -0
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.3.3 (2026-04-15)
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Snippets toolbar was empty after a fresh login until the page was reloaded. `loadSnippets()` was only called from `init()` (which only runs when a token is already in localStorage). Now also called after a successful login and after a forced password change.
|
|
8
|
+
|
|
9
|
+
### Docs
|
|
10
|
+
|
|
11
|
+
- Added end-to-end UI screenshots for v0.3.x features: jump host, snippets toolbar, snippet execution, SFTP browse via jump, webhooks management modal with delivery telemetry, server form with Jump Via dropdown.
|
|
12
|
+
- Browser-tested every UI flow with `playwright-cli` against both the live Fly.io demo and a local container.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
3
16
|
## v0.3.2 (2026-04-15)
|
|
4
17
|
|
|
5
18
|
### Features
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: webgate
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Self-hosted web application for remote server management via SSH terminal and SFTP file browser
|
|
5
5
|
Project-URL: Homepage, https://github.com/kalexnolasco/webgate
|
|
6
6
|
Project-URL: Documentation, https://kalexnolasco.github.io/webgate/
|
|
@@ -242,6 +242,43 @@ flowchart TB
|
|
|
242
242
|
### Light Theme
|
|
243
243
|

|
|
244
244
|
|
|
245
|
+
### v0.3.x — Operations Pack
|
|
246
|
+
|
|
247
|
+
These screenshots come from the live demo at https://webgate-demo.fly.dev (login `demo` / `demo`).
|
|
248
|
+
|
|
249
|
+
#### Demo banner on login
|
|
250
|
+

|
|
251
|
+
|
|
252
|
+
#### Site Manager with jump-host indicator
|
|
253
|
+
The `↺` next to `internal-app` means it tunnels through `bastion`.
|
|
254
|
+
|
|
255
|
+

|
|
256
|
+
|
|
257
|
+
#### Terminal with snippets toolbar
|
|
258
|
+
Click a snippet button to send `command + Enter` to the active session. Right-click to delete, `+` to create.
|
|
259
|
+
|
|
260
|
+

|
|
261
|
+
|
|
262
|
+
#### Snippet executed
|
|
263
|
+
Clicking `ls -lah` sent the command and the output appears in the terminal.
|
|
264
|
+
|
|
265
|
+

|
|
266
|
+
|
|
267
|
+
#### SFTP via jump host
|
|
268
|
+
Browsing the `internal-app` filesystem — the SFTP connection is also tunneled through the bastion.
|
|
269
|
+
|
|
270
|
+

|
|
271
|
+
|
|
272
|
+
#### Webhooks management (admin)
|
|
273
|
+
Per-event subscription, optional HMAC signing, last delivery status.
|
|
274
|
+
|
|
275
|
+

|
|
276
|
+
|
|
277
|
+
#### Add Server form with Jump Via dropdown
|
|
278
|
+
Pick any other registered server as the bastion.
|
|
279
|
+
|
|
280
|
+

|
|
281
|
+
|
|
245
282
|
## Quick Start
|
|
246
283
|
|
|
247
284
|
### Docker (recommended)
|
|
@@ -194,6 +194,43 @@ flowchart TB
|
|
|
194
194
|
### Light Theme
|
|
195
195
|

|
|
196
196
|
|
|
197
|
+
### v0.3.x — Operations Pack
|
|
198
|
+
|
|
199
|
+
These screenshots come from the live demo at https://webgate-demo.fly.dev (login `demo` / `demo`).
|
|
200
|
+
|
|
201
|
+
#### Demo banner on login
|
|
202
|
+

|
|
203
|
+
|
|
204
|
+
#### Site Manager with jump-host indicator
|
|
205
|
+
The `↺` next to `internal-app` means it tunnels through `bastion`.
|
|
206
|
+
|
|
207
|
+

|
|
208
|
+
|
|
209
|
+
#### Terminal with snippets toolbar
|
|
210
|
+
Click a snippet button to send `command + Enter` to the active session. Right-click to delete, `+` to create.
|
|
211
|
+
|
|
212
|
+

|
|
213
|
+
|
|
214
|
+
#### Snippet executed
|
|
215
|
+
Clicking `ls -lah` sent the command and the output appears in the terminal.
|
|
216
|
+
|
|
217
|
+

|
|
218
|
+
|
|
219
|
+
#### SFTP via jump host
|
|
220
|
+
Browsing the `internal-app` filesystem — the SFTP connection is also tunneled through the bastion.
|
|
221
|
+
|
|
222
|
+

|
|
223
|
+
|
|
224
|
+
#### Webhooks management (admin)
|
|
225
|
+
Per-event subscription, optional HMAC signing, last delivery status.
|
|
226
|
+
|
|
227
|
+

|
|
228
|
+
|
|
229
|
+
#### Add Server form with Jump Via dropdown
|
|
230
|
+
Pick any other registered server as the bastion.
|
|
231
|
+
|
|
232
|
+

|
|
233
|
+
|
|
197
234
|
## Quick Start
|
|
198
235
|
|
|
199
236
|
### Docker (recommended)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
- generic [ref=e2]:
|
|
2
|
+
- generic [ref=e3]:
|
|
3
|
+
- text: 🎮
|
|
4
|
+
- strong [ref=e4]: Demo mode
|
|
5
|
+
- text: — login with
|
|
6
|
+
- code [ref=e5]: demo
|
|
7
|
+
- text: /
|
|
8
|
+
- code [ref=e6]: demo
|
|
9
|
+
- text: · read-only (servers cannot be added or modified) · state resets hourly ·
|
|
10
|
+
- link "GitHub" [ref=e7] [cursor=pointer]:
|
|
11
|
+
- /url: https://github.com/kalexnolasco/webgate
|
|
12
|
+
- generic [ref=e8]:
|
|
13
|
+
- generic [ref=e9]:
|
|
14
|
+
- generic [ref=e10]:
|
|
15
|
+
- generic [ref=e11]: webgate
|
|
16
|
+
- button "Site Manager" [ref=e12] [cursor=pointer]
|
|
17
|
+
- button "Keys" [ref=e13] [cursor=pointer]
|
|
18
|
+
- generic [ref=e14]:
|
|
19
|
+
- generic [ref=e15]: demo
|
|
20
|
+
- 'button "2FA: Off" [ref=e16] [cursor=pointer]'
|
|
21
|
+
- button "☀️" [ref=e17] [cursor=pointer]
|
|
22
|
+
- button "Logout" [ref=e18] [cursor=pointer]
|
|
23
|
+
- generic [ref=e19]:
|
|
24
|
+
- generic [ref=e20]: "Host:"
|
|
25
|
+
- textbox "hostname" [ref=e21]
|
|
26
|
+
- generic [ref=e22]: "Username:"
|
|
27
|
+
- textbox "user" [ref=e23]
|
|
28
|
+
- generic [ref=e24]: "Password:"
|
|
29
|
+
- textbox [ref=e25]
|
|
30
|
+
- generic [ref=e26]: "Port:"
|
|
31
|
+
- spinbutton [ref=e27]: "22"
|
|
32
|
+
- button "Quickconnect ▶" [ref=e28] [cursor=pointer]
|
|
33
|
+
- generic [ref=e29]:
|
|
34
|
+
- generic [ref=e51]: 8:17:34 PM Connecting to 127.0.0.1:22...
|
|
35
|
+
- generic [ref=e52]: 8:17:34 PM webgate initialized
|
|
36
|
+
- generic [ref=e53]: "8:17:34 PM Connected: internal-app"
|
|
37
|
+
- generic [ref=e31]:
|
|
38
|
+
- generic [ref=e32] [cursor=pointer]: 💻 Site Manager
|
|
39
|
+
- generic [ref=e54] [cursor=pointer]:
|
|
40
|
+
- generic [ref=e55]: ⌨ internal-app
|
|
41
|
+
- generic [ref=e56]: ×
|
|
42
|
+
- generic [ref=e58]:
|
|
43
|
+
- generic [ref=e59]:
|
|
44
|
+
- generic [ref=e60]: "Snippets:"
|
|
45
|
+
- button "disk usage" [ref=e61] [cursor=pointer]
|
|
46
|
+
- button "ls -lah" [ref=e62] [cursor=pointer]
|
|
47
|
+
- button "top procs" [ref=e63] [cursor=pointer]
|
|
48
|
+
- button "uptime" [ref=e64] [cursor=pointer]
|
|
49
|
+
- button "+" [ref=e65] [cursor=pointer]
|
|
50
|
+
- generic [ref=e69]:
|
|
51
|
+
- textbox "Terminal input" [ref=e70]
|
|
52
|
+
- generic [ref=e71]:
|
|
53
|
+
- generic [ref=e73]: "Linux 1853454a533968 6.12.47-fly #1 SMP PREEMPT_DYNAMIC Wed Mar 25 00:13:15 UTC 2026 x86_64"
|
|
54
|
+
- generic [ref=e76]: The programs included with the Debian GNU/Linux system are free software;
|
|
55
|
+
- generic [ref=e78]: the exact distribution terms for each program are described in the
|
|
56
|
+
- generic [ref=e80]: individual files in /usr/share/doc/*/copyright.
|
|
57
|
+
- generic [ref=e83]: Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
|
|
58
|
+
- generic [ref=e85]: permitted by applicable law.
|
|
59
|
+
- generic [ref=e86]:
|
|
60
|
+
- generic [ref=e87]: demo@1853454a533968
|
|
61
|
+
- generic [ref=e88]: ":"
|
|
62
|
+
- generic [ref=e89]: ~
|
|
63
|
+
- generic [ref=e90]: $
|
|
64
|
+
- generic [ref=e50]: "SSH: internal-app"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1012,7 +1012,7 @@ function app() {
|
|
|
1012
1012
|
this.totpRequired = false; this.totpCode = ''; this.tempToken = '';
|
|
1013
1013
|
await this.fetchMe();
|
|
1014
1014
|
if (this.currentUser?.must_change_password) { this.showChangePassword = true; return; }
|
|
1015
|
-
await this.loadServers(); await this.loadGroups();
|
|
1015
|
+
await this.loadServers(); await this.loadGroups(); await this.loadStatuses(); await this.loadSnippets();
|
|
1016
1016
|
this.username = ''; this.password = '';
|
|
1017
1017
|
this.log('status', 'Logged in as ' + this.currentUser?.username);
|
|
1018
1018
|
} catch (e) { this.showToast(e.message, 'error'); }
|
|
@@ -1023,7 +1023,7 @@ function app() {
|
|
|
1023
1023
|
try {
|
|
1024
1024
|
await this.apiCall('/api/auth/change-password', { method: 'POST', body: JSON.stringify({ new_password: this.newPassword }) });
|
|
1025
1025
|
this.showChangePassword = false; this.newPassword = ''; this.confirmPassword = '';
|
|
1026
|
-
await this.fetchMe(); await this.loadServers(); await this.loadGroups();
|
|
1026
|
+
await this.fetchMe(); await this.loadServers(); await this.loadGroups(); await this.loadStatuses(); await this.loadSnippets();
|
|
1027
1027
|
this.username = ''; this.password = '';
|
|
1028
1028
|
this.showToast('Password changed');
|
|
1029
1029
|
this.log('status', 'Logged in as ' + this.currentUser?.username);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|