Commit Graph
419 Commits
Author SHA1 Message Date
ZacharyZcR 65d10b37cf fix(hosts): reject or infer a missing authType on host create (#1664)
Creating an SSH host through the API without authType hit the NOT NULL
auth_type column and came back as a 500. The create route now infers the
type from the credential, key or password in the body, falls back to the
host defaults, and otherwise answers 400. A non-string authType is a 400
on create and update.
2026-10-16 23:09:55 -05:00
ZacharyZcRandZacharyZcR 764d034098 fix: show plugin names and descriptions in the UI language (#1658)
* fix: show plugin names and descriptions in the UI language

Read plugin.name and plugin.description from each plugin's own locale
namespace, falling back to the manifest, everywhere core shows a plugin's
name: the Plugins manager, onboarding picker, host editor tabs and
sections, host filters and bulk actions, beta updates, interface presets
and plugin crash/loading notices.

* docs(sdk): document plugin.name and plugin.description locale keys

---------

Co-authored-by: ZacharyZcR <zkl205305@gmail.com>
2026-10-16 23:09:50 -05:00
LukeGus fc77b6c756 chore: update remote desktop origin comment for the built-in engine 2026-10-16 23:04:28 -05:00
LukeGus f76a1adfb8 chore: drop guacd from compose files and dev runner 2026-10-16 23:01:57 -05:00
LukeGus 8e809aa760 feat: plugin packs include LICENSE and NOTICE sdk-v1.0.10 2026-10-16 22:21:44 -05:00
LukeGus 7066215bd9 feat: plugin builds bundle worker entries and import wasm and fonts as bytes sdk-v1.0.9 2026-10-16 21:43:07 -05:00
LukeGus 214372d104 chore: update the overview video and add a play button to its thumbnail 2026-10-16 18:20:53 -05:00
LukeGus bb9bca5303 chore: add the overview video to the readme 2026-10-16 16:24:11 -05:00
LukeGus cf62f108d2 chore: update translations v26.10.2-beta.1 2026-10-16 15:14:15 +00:00
LukeGus 5cc65d87cd feat(sdk): let a plugin raise its public route rate limit sdk-v1.0.8 2026-10-15 22:18:48 -05:00
LukeGus e166994ec4 fix: use the vite proxy for plugin sockets on any dev port 2026-10-15 22:05:08 -05:00
LukeGus 3a851ad189 feat: setting to let the hover side menu push content again 2026-10-15 22:00:24 -05:00
LukeGus d2851982a6 fix(sdk): skip comment-only chunks when splitting migrations sdk-v1.0.7 2026-10-15 21:52:11 -05:00
LukeGus cc5dce18e2 fix: show why a client tunnel failed to start (Plugin-Tunnels#2) 2026-10-15 21:42:28 -05:00
LukeGus 6084ed4d3c fix: say the server is down and keep retrying instead of a database error (#1637) 2026-10-15 21:40:07 -05:00
LukeGus c3f6db69e9 fix: let the hover side menu overlay content instead of resizing it (Plugin-Remote-Desktop#2) 2026-10-15 21:15:36 -05:00
LukeGus 8e2221cb8f feat: sort the dashboard host status card (Plugin-Host-Metrics#6) 2026-10-15 21:11:58 -05:00
LukeGus 7324982f47 feat: option to hide the sidebar after opening a host (#1652) 2026-10-15 21:06:47 -05:00
LukeGus f20d64b4f2 chore: test that an update keeps a changed auth type (#1601) 2026-10-15 21:04:04 -05:00
LukeGus aa0b32a142 fix: stop building ssh2 native crypto in the docker image (#1644) 2026-10-15 21:02:54 -05:00
LukeGus c8a907538e chore: add changelog entries for 26.10.2 fixes 2026-10-15 21:02:13 -05:00
LukeGus dd5573cc10 fix: smooth host editor jumps to lower sections 2026-10-15 15:08:40 -05:00
ZacharyZcR 071711dafc fix(sync): don't delete a local row when the server can't send its copy (#1650)
* fix(sync): don't delete a local row when the server can't send its copy

A push conflict on a live record whose server row failed to serialize
came back as row: null, deleted: false, and the desktop treated that as
a delete. The server now rejects that op as unavailable, the desktop
never deletes on a conflict without a row, and serialization failures
are logged.

* fix(sync): retry temporarily unavailable records
2026-10-15 14:59:59 +08:00
ZacharyZcR bc74fba3f5 fix(settings): leave user manage view when switching admin sections (#1649)
The admin panel stays mounted across Settings pages, so an open user
manage view kept replacing every other admin section until Back to users
was clicked. Reset it whenever the selected section changes.
2026-10-15 14:55:00 +08:00
Ferdina Kusumah 694dc34b19 fix(i18n): keep Indonesian technical terms consistent (#1636)
Use the English terms Indonesian users know for tunnel, snippet, deploy,
file manager, remote desktop, jump host, passphrase, sidebar, toolbar,
endpoint, browser and SSH agent, instead of mixing literal translations
(terowongan, cuplikan, terapkan, bilah sisi, titik akhir, ...) with the
English words. Match the split shortcuts to the split screen menu.

Also fix the user data export description, which said secrets are
encrypted while the English says they are decrypted.
2026-10-15 14:24:11 +08:00
ZacharyZcR b3b08b4ff2 fix(sync): let a linked desktop enable mirrored plugins it does not trust on its own (#1632)
* fix(sync): let a linked desktop enable mirrored plugins it does not trust on its own

* fix(sync): switch off an untrusted mirrored plugin when the server updates it

* fix: require local consent for mirrored plugin activation

* docs: describe consent fields on the plugin state endpoint
2026-10-14 09:11:55 +08:00
ZacharyZcR 9b0af07607 fix: drop ssh_data.vault_profile_id so removing the vault plugin keeps hosts writable (#1633)
The vault plugin renames vault_profiles to p_vault_profiles, and SQLite
rewrites ssh_data's foreign key to follow it. Uninstalling the plugin then
dropped p_vault_profiles and left ssh_data pointing at a missing table, so
creating, cloning and deleting hosts failed with "no such table:
main.p_vault_profiles". Postgres and MySQL refused the uninstall instead.

The column was already copied into the vault plugin's host settings by 2.9,
so retire it on every engine. The SQLite boot drop also repairs databases
already in the broken state; MySQL drops the column's foreign key first.
2026-10-14 08:59:57 +08:00
ZacharyZcR c044dbde87 fix(sync): send shared hosts with text columns in their stored form (#1631)
resolveHostById turns forceKeyboardInteractive into a boolean, and the
shared-host export passed it on as is. A desktop could not bind the boolean
into the text column, so every shared host failed to apply.
2026-10-14 08:59:52 +08:00
ZacharyZcR 1396b3a70c fix(desktop): find spawn-helper in universal macOS builds (#1630)
The universal build ships app-arm64.asar and app-x64.asar instead of
app.asar, so node-pty's helper path rewrite never pointed at the
unpacked copy and every local terminal failed with posix_spawnp failed.
2026-10-14 08:59:46 +08:00
ZacharyZcR 4c9ee5923e fix(sidebar): sort hosts by IP address numerically (#1629) 2026-10-14 08:59:40 +08:00
ZacharyZcR 25e58a6425 fix(desktop): harden external editor and session cookie IPC (#1627)
* fix(desktop): stop the renderer choosing the external editor binary or reading the session cookie

open-external-editor now launches only the editor saved from a file dialog
and refuses to hand executable file types to the OS opener. The unused
get-session-cookie and wait-session-cookie channels, which returned the
httpOnly jwt, are removed.

* fix: validate setting keys before editor authorization
2026-10-14 08:22:15 +08:00
ZacharyZcR 7d13b2a9fe fix: don't auto-enable synced plugins signed only by a server-sent key (#1623)
* fix: don't auto-enable synced plugins signed only by a server-sent key

Registry keys a linked server sends still let its plugins load on the desktop, but no longer count as a signer for switching them on or copying their grants. Keys the desktop added itself keep their trust.

* fix: enforce local plugin trust across remote source labels

* fix: require positive local trust for synced plugin keys
2026-10-14 08:20:09 +08:00
ZacharyZcR e610aba0e5 fix: enforce unique usernames (#1628)
* fix: enforce unique usernames

Registration checked for a taken name, hashed the password, then
inserted, with nothing in the schema enforcing uniqueness. Concurrent
sign-ups could create two accounts with one name, after which login,
password reset, proxy login and admin lookups by username picked
between them arbitrarily.

Add a unique index on users.username for every dialect. Existing
duplicates are renamed (later rows get a -<id> suffix, the oldest keeps
the name) rather than deleted. Registration and admin user creation now
return the same 409 when the insert loses the race.

* fix: avoid username collisions during migration
2026-10-14 08:17:47 +08:00
ZacharyZcR 3941dd4ecc fix: keep foreign keys on during user data import (#1626)
Import credentials before hosts and remap the file's credential ids to
the ones created here, so hosts and protocol logins no longer point at
another server's ids. With rows written in dependency order, the import
no longer turns off SQLite foreign keys on the shared connection. The
uploaded file is now removed on every exit path.
2026-10-14 08:13:04 +08:00
ZacharyZcR 872e5eba73 fix: check trusted proxy login against nginx's peer, not nginx (#1625)
The backend only sees the bundled nginx on loopback, so the allowlist
could only work by trusting 127.0.0.1, which let any client that reached
nginx log in as anyone by sending the identity headers. nginx now passes
its own TCP peer (before real_ip rewriting) in X-Termix-Proxy-Peer, and
loopback connections are judged by that address instead.
2026-10-14 08:12:58 +08:00
ZacharyZcR 8c3f816407 fix: only trust the server's origin in the desktop login frame (#1624)
The desktop sign-in iframe accepted AUTH_SUCCESS and system browser requests from whatever page it had navigated to, and posted replies (including 2FA temp tokens) to any origin. Messages must now come from the server's origin and replies are posted to it.

The web UI also treated any framing page as the desktop app and posted the JWT to it. It now also requires the Termix-Desktop user agent.
2026-10-14 08:12:53 +08:00
ZacharyZcR 13f7aa95a3 fix(plugins): read artifact manifest with the same tar parser as the unpack (#1622)
The consent check read the first manifest.json with a hand-written tar
reader, while the unpack keeps the last one and also follows pax and
long-name headers. An archive with two manifests could pass the check
with one capability list and get granted another. Read the manifest
with node-tar, count only plain files, and refuse archives that hold
more than one manifest.json.
2026-10-14 08:12:47 +08:00
ZacharyZcR 8e5a50623c fix(electron): validate external login URL scheme and callback port (#1621) 2026-10-14 08:12:42 +08:00
ZacharyZcR d791e52d82 fix: stop auto-accepting changed jump host keys (#1620)
A jump hop whose key no longer matched the pinned fingerprint was
silently accepted and the pin overwritten. Background status probes
reconnect to jump hosts every cycle, so a MITM on that hop got the
credentials with no user interaction. Changed jump host keys now go
through the same path as any other host: prompt when there is a
terminal socket, otherwise refuse.
2026-10-14 08:12:37 +08:00
ZacharyZcR fb04edc497 fix: keep concurrent ssh pool connects from overwriting each other (#1619) 2026-10-14 08:12:16 +08:00
LukeGus 2fe7530cd4 chore: update paths for renamed local folders 2026-10-13 16:33:20 -05:00
LukeGus 4389bf2013 chore: simplify readme and docs wording 2026-10-12 12:46:26 -05:00
LukeGus 50f80b975d fix: cancel pending app store review before submitting a new version 2026-10-12 12:41:09 -05:00
LukeGus 1ccb30f0a7 chore: only build update files for the release's own channel 2026-10-12 12:30:52 -05:00
LukeGus d44a504c04 chore: bump Homebrew cask to 26.10.1 2026-10-12 17:27:17 +00:00
62ac931468 v26.10.1 (#1599)
* feat: AI translations at release, 7 new languages and regional fallback

* fix: proper plural forms for count strings and full translations

* fix: plural forms for selected, hidden and active counts

* fix: synced plugin updates failing on desktop and server-only plugins shown as stopped

* fix: restore rounded corners on app icons and favicon

* feat: desktop app auto updates with automatic, ask first or never modes

* feat: community and custom plugin registries

* feat: plugin guide for AI tools in the SDK with a lint check

* fix: keep the terminal WebSocket open past nginx's 60s default (#1588)

* chore: update changelog

* feat: show plugin download counts only and stop CI builds inflating them

* feat: hide installed plugins in the browse tab by default

* chore: pin bundled plugins to latest releases

* chore: update translations

* fix: focusing a saved password field and saving no longer erases it

* fix: tell desktop users when their 2.8 data needs 2.9 first

* fix: point windows update info at the x64 installer

* fix: keep desktop client tunnel sockets alive behind proxies

* chore: pin bundled plugins to latest releases

* fix: cover client tunnel keepalive in the c2s runtime tests

* fix: typing after opening a host no longer goes to the host search

* fix: accept tab and = separators in SSH config import (#1598)

* chore: update changelog

* chore: drop plugin versions from core changelog

* chore: update translations

* chore: lint, format, and bump version to 26.10.1

---------

Co-authored-by: Darnel Hunter <68697450+innotelinc@users.noreply.github.com>
Co-authored-by: Iain <Iain1970@protonmail.com>
v26.10.1
2026-10-12 11:35:48 -05:00
LukeGus 6873bc92bb fix: drop readme icon height so github skips the placeholder bg 2026-10-10 21:21:47 -05:00
LukeGus 02f0c0c259 fix: load readme icon from termix.site 2026-10-10 18:53:17 -05:00
LukeGus db317283ac fix: bust cached readme icon 2026-10-10 17:04:45 -05:00
LukeGus 3ebe8d0fac fix: run submit and cask jobs after stable releases 2026-10-10 16:18:16 -05:00