Public Access
Licence is MIT, set solution-wide rather than only on the packable project: DodoSSH.Contracts is published so clients can build against it, and a package with no licence expression is one a corporate policy scanner rejects outright. The SSH.NET spike is the M1 client gate and it passes. SSH.NET 2025.1.0 exposes ShellStream.ChangeWindowSize, but a method existing is not the remote observing it, so the tests read `stty size` back from a real sshd after resizing rather than asserting the call did not throw. Repeated resizes each take effect too, which matters because dragging a window edge produces a stream of them. The IChannelSession fallback is not needed. Also verified against a real sshd: password and public-key auth, that the host key arrives as a raw blob we can fingerprint ourselves rather than reading SSH.NET's MD5 property, and that refusing the key via CanTrust actually aborts the connection -- without which the TOFU dialog would be decoration. Kept as a permanent suite, not deleted after the spike. An upgrade that silently stopped sending the request would present as wrapped output only after a resize, which is easy to misattribute to the terminal emulator. Two bugs in the test itself, both worth naming because either would have been read as "resize does not work": - A PTY emits CRLF, and the anchored regex rejected the CR. The output visibly contained `24 80` while the match failed. - Each read can begin with output still buffered from the previous command, including its size line. Taking the first match would have reported the pre-resize size. platform-flags.md now records window-change as resolved rather than unverified -- a stale flag is worse than none -- plus the three real SSH.NET limits found on the way: ShellStream does not override ReadAsync so every idle session parks a pool thread, one connection cannot serve both SshClient and SftpClient, and agent forwarding needs an upstream change.
59 lines
2.6 KiB
XML
59 lines
2.6 KiB
XML
<Project>
|
|
|
|
<PropertyGroup>
|
|
<TargetFramework>net10.0</TargetFramework>
|
|
<LangVersion>latest</LangVersion>
|
|
<Nullable>enable</Nullable>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
</PropertyGroup>
|
|
|
|
<PropertyGroup Label="Quality gates">
|
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
|
<!--
|
|
Recommended, not All. With TreatWarningsAsErrors on, latest-All turns opinionated
|
|
naming rules (CA1711 reserved suffixes, CA1724 namespace collisions) into build
|
|
breaks, which trains people to reach for blanket suppressions and devalues the
|
|
analyzers that catch real defects. Correctness and security rules we specifically
|
|
want beyond Recommended are raised individually in .editorconfig.
|
|
-->
|
|
<AnalysisLevel>latest-Recommended</AnalysisLevel>
|
|
<AnalysisMode>Recommended</AnalysisMode>
|
|
<!-- The whole product is UTC-only and container-hosted; no tzdata, no culture-sensitive
|
|
formatting. Set here rather than per-project so it cannot drift. -->
|
|
<InvariantGlobalization>true</InvariantGlobalization>
|
|
</PropertyGroup>
|
|
|
|
<PropertyGroup Label="Reproducible builds">
|
|
<Deterministic>true</Deterministic>
|
|
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
|
|
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
|
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
|
|
<!-- packages.lock.json is committed; CI restores in locked mode. -->
|
|
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
|
|
</PropertyGroup>
|
|
|
|
<PropertyGroup Label="Assembly metadata">
|
|
<Company>DodoTech</Company>
|
|
<Product>DodoSSH</Product>
|
|
<NeutralLanguage>en</NeutralLanguage>
|
|
<Copyright>Copyright (c) 2026 Jaap-Jan de Wit (DodoTech)</Copyright>
|
|
<!--
|
|
Set solution-wide rather than only on the packable project. DodoSSH.Contracts is
|
|
published to GitHub Packages so clients can build against it, and a package without a
|
|
licence expression is one a corporate consumer's policy scanner rejects outright.
|
|
-->
|
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
|
</PropertyGroup>
|
|
|
|
<ItemGroup Label="Analyzers">
|
|
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" PrivateAssets="all" />
|
|
<PackageReference Include="Meziantou.Analyzer" PrivateAssets="all" />
|
|
</ItemGroup>
|
|
|
|
<ItemGroup Label="Banned API list">
|
|
<AdditionalFiles Include="$(MSBuildThisFileDirectory)BannedSymbols.txt" Visible="false" />
|
|
</ItemGroup>
|
|
|
|
</Project>
|