Public Access
Give DodoSSH a phone, and a shared shell for both heads to drive
The Android head from docs/android-port.md, taken as far as its step 6. Step 3, the spike, is answered and its throwaway screen is gone: libsodium.so and libe_sqlite3.so are both in the arm64 APK, so NSec resolves its native half on Android despite shipping no Android build, and the local cache opens. Two findings the audit could not have had: Avalonia.Controls.WebView only ships net10.0-android36.0, which settles the open "which Android versions" question at targetSdk 36; and Android has blocked cleartext HTTP since API 28, so the terminal renderer needs a network security config scoped to 127.0.0.1 or the WebView loads nothing. DodoSSH.Client.Shell is new and is why the phone can exist: the view models, the terminal renderer files and the palette moved there so both heads drive one state machine and draw from one set of tokens. The desktop head is otherwise untouched and its 144 tests still pass. The platform pieces behind interfaces that already existed: the profile directory from filesDir, a device key wrapped by a StrongBox-backed key that a fingerprint releases, and a foreground service so a shell outliving a vault lock stays true on a platform that stops backgrounded processes. Sign-in is deliberately absent rather than approximated. It needs an app link, because reusing the desktop loopback listener is the attack RFC 8252 section 8.3 names.
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
|
||||
|
||||
<!-- Same reasoning as the two heads: this code formats timestamps and host names for a person. -->
|
||||
<InvariantGlobalization>false</InvariantGlobalization>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!--
|
||||
Avalonia, but deliberately not Avalonia.Desktop and not a windowing backend. What is actually used
|
||||
here is Dispatcher, the asset loader and a resource dictionary — none of which imply a window, which
|
||||
is why this project can be referenced by a phone.
|
||||
|
||||
This is the one place the repository's "everything except App is free of Avalonia" rule bends, and it
|
||||
bends on purpose: the rule existed so the SSH layer, the flow control and the OIDC flow could be
|
||||
tested without a toolkit, and none of those are here. What is here is the shell's state machine,
|
||||
which two heads have to agree on exactly.
|
||||
-->
|
||||
<PackageReference Include="Avalonia" />
|
||||
<PackageReference Include="CommunityToolkit.Mvvm" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../DodoSSH.Client.Session/DodoSSH.Client.Session.csproj" />
|
||||
<ProjectReference Include="../DodoSSH.Client.Ssh/DodoSSH.Client.Ssh.csproj" />
|
||||
<ProjectReference Include="../DodoSSH.Client.Terminal/DodoSSH.Client.Terminal.csproj" />
|
||||
<ProjectReference Include="../DodoSSH.Client.Transfer/DodoSSH.Client.Transfer.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!--
|
||||
The view models are internal, as they were when they lived in the desktop head, and both heads plus
|
||||
the two shell suites are let in explicitly. Making them public instead would turn every rename of a
|
||||
command into a compatibility question about an assembly nobody consumes.
|
||||
-->
|
||||
<InternalsVisibleTo Include="DodoSSH.Client.App" />
|
||||
<InternalsVisibleTo Include="DodoSSH.Client.Android" />
|
||||
<InternalsVisibleTo Include="DodoSSH.Client.App.Tests" />
|
||||
<InternalsVisibleTo Include="DodoSSH.Client.App.Layout.Tests" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!--
|
||||
The renderer's files, including the vendored xterm bundles. They moved here from the desktop head
|
||||
when the phone head needed the same terminal: two copies of a vendored bundle is how one of them ends
|
||||
up a version behind. Embedded rather than copied to disk so there is no separate deployment step.
|
||||
-->
|
||||
<AvaloniaResource Include="WebAssets/**" />
|
||||
<AvaloniaResource Include="Theme/**" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user