Public Access
Add port forwarding: local, remote and dynamic, per terminal session
A host can now carry port forwards (-L, -R, -D), saved inside its encrypted payload as RelayTicketRequest.PortForwardId already assumed, so they sync and merge per forward like tags and pinned paths. The host schema moves to version 8 only for hosts that carry forwards. ISshConnection gains StartForwardAsync over SSH.NET's forwarded ports. Every listener binds loopback and there is no bind-address field: a forward is something any member of a shared keychain can edit. A remote forward's target is resolved here, IPv4 first, rather than by SSH.NET's constructor, which takes the first DNS answer and can send ::1. Forwards start with every terminal opened to the host and stop with its connection; a reconnect starts them again. The session sidebar lists them with state, failure reason and an on/off switch, the status bar counts the listening ones, and the host editor and detail pane gain a PORT FORWARDS section. A forward that cannot start fails alone. The phone does not start forwards yet: it has no surface showing what is listening, and its More screen now says so. No byte counts, since SSH.NET keeps none.
This commit is contained in:
1 parent
c8848ec1e3
commit
f05deb4fbc
36 files changed
+2776
-42
No files matched your search
@@ -189,13 +189,14 @@
|
||||
◆ Port forwarding, stated rather than drawn.
|
||||
|
||||
The v2 design gives this hub a sixth entry and a full screen behind it: local, remote and dynamic
|
||||
rules with toggles and byte counters. Nothing in this application forwards anything — ISshConnection
|
||||
offers OpenShellAsync and nothing else — so every switch on that screen would be a control with no
|
||||
effect and every counter a number with no source.
|
||||
rules with toggles and byte counters. Forwarding is built — a host's forwards start with every
|
||||
desktop terminal to it, listed in the session sidebar — but not started here:
|
||||
MainWindowViewModel.StartForwards skips them on Android, because this head has no surface that
|
||||
lists what is listening, and a phone opening listeners it never shows is worse than one opening
|
||||
none. The byte counters are not built anywhere; SSH.NET keeps no count to draw.
|
||||
|
||||
It is a paragraph here rather than a missing row for the reason the desktop keeps TEAMS in its rail:
|
||||
a destination that is quietly absent reads as a product that never intended it, and this one is
|
||||
intended. SyncEntityType.PortForward = 9 is reserved on the wire and unused. See
|
||||
a destination that is quietly absent reads as a product that never intended it. See
|
||||
docs/design-import-gaps.md.
|
||||
-->
|
||||
<Border Classes="card" Margin="6,16,6,0">
|
||||
@@ -206,11 +207,11 @@
|
||||
<TextBlock Classes="mono" FontSize="13.5" FontWeight="SemiBold"
|
||||
Foreground="{StaticResource TextDim}" Text="Port forwarding" />
|
||||
<Border Classes="tag outline" VerticalAlignment="Center">
|
||||
<TextBlock Text="NOT BUILT" />
|
||||
<TextBlock Text="DESKTOP ONLY" />
|
||||
</Border>
|
||||
</StackPanel>
|
||||
<TextBlock Classes="body"
|
||||
Text="A connection here opens one channel — a shell — and nothing else, so there is no tunnel for a rule to run through. The wire protocol reserves a slot for forwarding rules and no client writes one. Nothing on this screen is hidden by a setting; the feature is absent." />
|
||||
Text="Forwards saved on a host start with every terminal the desktop app opens to it. This phone does not start them, because it has nowhere yet to show you what is listening. They are kept on the host all the same, and nothing here changes them." />
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
|
||||
Reference in new issue
Block a user