v1.81.0-beta.6: .NET 10 migration, 585 issues fixed, zero warnings#3189
v1.81.0-beta.6: .NET 10 migration, 585 issues fixed, zero warnings#3189robertpopa22 wants to merge 1304 commits intomRemoteNG:v1.78.2-devfrom
Conversation
…d of remote Tokens: 9 in / 5,499 out / $0.7208 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tokens: 27 in / 10,787 out / $1.6167 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tokens: 27 in / 24,147 out / $1.8933 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…external to Tokens: 21 in / 15,406 out / $1.3031 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ifferent lo Tokens: 27 in / 17,560 out / $1.4334 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ections tab Tokens: 25 in / 9,342 out / $1.3884 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…PuTTY fixes, dependency updates) Upstream changes integrated: - Sessions menu with Ctrl+Left/Right/1-9 tab navigation (SessionsMenu.cs) - ODBC database connector support (OdbcDatabaseConnector.cs) - PuTTY window class detection to avoid attaching to dialog windows - Dependency updates: CEF 145, log4net 3.3.0, NUnit 4.5.0, WebView2 1.0.3800 - BinaryFormatter removal from ObjectListView - Documentation: variables_reference.rst, keyboard shortcuts - T4 TextTemplating import (conditional, for VS2026 compatibility) Conflict resolution: - Kept our non-blocking timer-based PuTTY window search + added upstream class detection - Kept our detailed per-DB-type exception handlers + added upstream generic fallback - Kept our 4-param ODBC connector with Database field support - Kept our NormalizeType/authType in DatabaseConnectorFactory - Made T4 TransformOnBuild conditional on VS2026 targets availability - Added using System.Threading.Tasks to ConnectionInitiator.cs (preexisting bug) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When Sonnet fails implementation, automatically retry with Opus using 2x timeout and 30 max turns. Passes previous attempt context so Opus doesn't repeat mistakes. Mirrors existing pattern from chain_triage. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Mark 7 issues as needs_human (mRemoteNG#1182, mRemoteNG#1354, mRemoteNG#1427, mRemoteNG#1631, mRemoteNG#1661, mRemoteNG#1715, mRemoteNG#1752) - Sync upstream comments and new issue mRemoteNG#3170 - Add chain-context from today's orchestrator session (20+ attempts) - Clean up old chain-context files from Feb 17 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…eam merge The upstream merge introduced ConnectionInitiator code referencing WaitForIPAvailability and WaitForIPTimeout on ConnectionInfo, but the backing fields and properties were missing from AbstractConnectionRecord. Adds both properties to resolve CS1061 build errors. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…arly The two is_last branches inside the AGENT_CHAIN loop did return False directly, preventing the Opus fallback block after the loop from ever executing. Changed both to break so control flows to the Opus section. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SOCKS5 proxy: prevent auth downgrade by only offering method 0x02 when credentials are configured (cs/user-controlled-bypass) - iis_orchestrator: fix ReDoS in test output parser regex (py/redos) - add_PR_2_chlog.yml: add explicit permissions block (contents: write) - post_2_Reddit.yml: add empty permissions block (no repo access needed) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Equivalent to upstream PR mRemoteNG#3169 (Renovate bot), applied locally on fork. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Cache SecureString in XmlConnectionsDecryptor (avoid repeated ConvertToSecureString) - Parallel pre-decryption of encrypted fields using Parallel.ForEach - Static PropertyInfo cache in ConnectionInfoInheritance (avoid repeated reflection) - Enum parse cache in XmlExtensions (avoid repeated Enum.TryParse) Root cause: PBKDF2 with 600K iterations runs per encrypted field sequentially. 570 connections × 4 password fields × ~150ms = ~85 seconds. Parallel decryption reduces this to ~85s / N_cores. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create per-thread XmlConnectionsDecryptor instances in Parallel.ForEach to avoid shared BouncyCastle cipher state corruption. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
744 commits since beta.2: 585/838 issues addressed (70%), 2817 tests (0 failures), 7 new protocols (VMRC, MSRA, OpenSSH, Winbox, WSL, Terminal, Serial), 4 security alerts fixed, 81s→ms deserialization, orchestrator v2 with self-healing supervisor, 67 upstream commits merged. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…→Opus, 12 failure modes The orchestrator uses only Claude Code (AGENT_CHAIN = ["claude"]) with Sonnet→Opus model escalation, not 3 separate agents. The supervisor handles 12 failure modes (FM1-FM12), not 8. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Multiple .slnx files at repo root cause MSB1011 "more than one project or solution file" when dotnet restore runs without explicit target. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Specs project only declared x86;x64 platforms, causing arm64 self-contained build to fail with PlatformTarget mismatch. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Specs project needs explicit PlatformTarget=ARM64 for the arm64 self-contained publish. Without it, MSBuild defaults to x86 which conflicts with RuntimeIdentifier=win-arm64. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…8 MB) Accumulated debris from v1.79.0→v1.81.0 development (Feb 10-24, 2026): Root directory (45 files): - 10x ISSUE_*_FIX_DETAILS.md, TRIAGE_1214.md — issue analysis docs - 4x standalone C# debug files (TestEncoder, repro_issue_980, etc.) - 3x test .slnx files (MyTests, MyTests2, mRemoteNGTests) - 7x text outputs (build_out, config_tests, csv_test_output, etc.) - 5x VNC/RDP inspection scripts (_inspect_vnc, check_mstsc, etc.) - 6x ad-hoc build/utility scripts (build_test, hunt-crasher, etc.) - 5x generated docs (VISUAL_EXAMPLES, PANEL_BINDING_FEATURE, etc.) - 4x orphan files (issue1944.png, monitor_orch.py, output.json, etc.) - 9x build logs + Codex temp files - temp_test_caps/ directory (4 files) .project-roadmap/ (335 files): - 210x tmp*.txt/jsonl — orchestrator temp prompt files (498 KB) - 122x chain-context JSONs for closed issues (471 KB) - 40x historical/ — v1.79.0 + v1.80.0 execution logs & comments - 6x root docs (CURRENT_PLAN, CVE assessment, ISSUE_*, email draft) - orchestrator-status.json.bak Also deleted (untracked, not in commit): - mRemoteNGTests/TestResults/ — 296 MB empty UUID directory - 6x orchestrator log files (11 MB) - __pycache__/, .auto-claude-security.json, .claude_settings.json, NUL - test-output.txt, test-results.txt, test-results2.txt, test.ps1, etc. Preserved: all source code, active scripts (iis_orchestrator.py, orchestrator_supervisor.py), issues-db, chain-context for open issues, DEVELOPER_GUIDE.md, LESSONS.md, agents.md, GEMINI.md, build/test runners. Build verified: 0 errors. No source code affected. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Python bytecode (.pyc) and orchestrator temp outputs should never be in version control. Added __pycache__/, *.pyc, triage_result.json, and output.json to .gitignore to prevent future tracking. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MSBuild passes Platform=ARM64 (uppercase) but the condition checked for 'arm64' (lowercase). MSBuild conditions are case-sensitive. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The .sln file mapped mRemoteNGSpecs arm64 configurations to x86, causing NETSDK1032 when MSBuild tried to publish with RuntimeIdentifier=win-arm64 but PlatformTarget=x86. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rogress - Add WaitForIPAvailability/WaitForIPTimeout to test expected properties (ConfigWindowGeneralTests + SerializableConnectionInfoAllPropertiesOfType) - Rewrite run-tests-core.sh v4: parallel execution of 9 groups from shared DLL with sequential retry for crashed groups (~33s vs ~8min) - Add _run_streaming() to orchestrator for real-time test progress in log - Fix grep -oP to -oE for MSYS2 compatibility - Increase TEST_TIMEOUT from 300s to 600s Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lization - Add TestScope singleton snapshot/restore for test isolation - Add namespace-level SetUpFixtures (Connection, Integration, Tree, UI) - Rewrite run-tests-core.sh with MAX_PARALLEL=2 sliding window (0 crashes) - Add WaitForIPAvailability/WaitForIPTimeout to ConnectionInfoInheritance - Complete WaitForIP serialization in XML, CSV, and XSD schema - Update README with 2,916 tests and new 9-group runner architecture 2916/2916 tests passing, 0 failures, 0 crashes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…onfiguration Tokens: 27 in / 38,821 out / $2.6698 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The supervisor progress report showed 0/246 even after successful implementations because `processed` only summed triaged+wontfix+ needs_info+duplicate, missing implemented and failed counts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… tab Tokens: 18 in / 16,265 out / $1.2143 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. XmlConnectionsLoader: broaden catch to handle FormatException, InvalidOperationException, NotSupportedException for backup recovery 2. ExternalAppsSaver: remove Hidden column from SQL INSERT (not in schema) 3. ExternalAppsSaver/Loader: encrypt AuthPassword and Passphrase with DPAPI instead of storing plaintext in XML 4. CertificateCryptographyProvider: add bounds validation on ciphertext length before buffer allocation 5. CryptoProviderFactoryFromXml: clamp KdfIterations to 1000-10,000,000 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. XmlConnectionsLoader: broaden catch to handle FormatException, InvalidOperationException, NotSupportedException for backup recovery 2. ExternalAppsSaver: remove Hidden column from SQL INSERT (not in schema) 3. ExternalAppsSaver/Loader: encrypt AuthPassword and Passphrase with DPAPI instead of storing plaintext in XML 4. CertificateCryptographyProvider: add bounds validation on ciphertext length before buffer allocation 5. CryptoProviderFactoryFromXml: clamp KdfIterations to 1000-10,000,000 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Qodo Code Review — All 5 Findings AddressedThanks to @Kvarkas for flagging the SonarCloud issues on #3188 — those were resolved on this PR (QG passed: 0 vulnerabilities, 0 security hotspots). The Qodo automated review identified 5 additional findings on this PR. All have been addressed in commit
Quality Metrics
|
Creates a temporary PR from recent commits, waits for Qodo to review, posts results to workflow summary, then auto-closes PR and cleans up. Usage: Actions → Qodo On-Demand Review → Run workflow Inputs: commits_back (default 1), branch (default main) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Qodo ignores PRs where head=default branch. Create both head and base as temporary review/* branches so Qodo triggers correctly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Qodo Code Review ignores PRs created by bots (github-actions[bot]). Replace the workflow_dispatch approach with a local bash script that creates PRs under the user's identity. Usage: ./qodo-review.sh [commits] [branch] Cleanup: ./qodo-review.sh cleanup Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Migrates mRemoteNG to .NET 10 and modernizes core infrastructure (serialization, import/export, data providers, update checks), alongside new features like plugin loading, new importers, and additional sync/recovery logic.
Changes:
- Modernized serializers/importers and added new formats (JSON export, presets, RDP export).
- Improved reliability: atomic file saves, backup recovery for corrupted/empty XML, and external sync watchers.
- Added new platform/security-related changes (DB auth handling, update channel via GitHub, plugin system scaffolding).
Reviewed changes
Copilot reviewed 179 out of 765 changed files in this pull request and generated 17 comments.
Show a summary per file
| File | Description |
|---|---|
| mRemoteNG/Config/Serializers/MiscSerializers/ActiveDirectoryDeserializer.cs | Centralizes LDAP path sanitization and adds paging. |
| mRemoteNG/Config/Serializers/CredentialSerializer/XmlCredentialRecordDeserializer.cs | Tightens XML root handling and schema error type. |
| mRemoteNG/Config/Serializers/CredentialSerializer/XmlCredentialPasswordEncryptorDecorator.cs | Uses ThrowIfNull and nullable attributes for Password. |
| mRemoteNG/Config/Serializers/CredentialSerializer/XmlCredentialPasswordDecryptorDecorator.cs | Adds root validation and nullability annotations. |
| mRemoteNG/Config/Serializers/CredentialProviderSerializer/CredentialRepositoryListSerializer.cs | Makes serializer static and hardens declaration handling. |
| mRemoteNG/Config/Serializers/CredentialProviderSerializer/CredentialRepositoryListDeserializer.cs | Uses ThrowIfNull and Array.Empty return. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlRootNodeSerializer.cs | Static serializer + new root attributes (cert thumbprint, TOTP). |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlExtensions.cs | Adds invariant parsing and enum parse cache. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentEncryptor.cs | Adds root validation and static helpers for encryption steps. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionsDocumentCompiler.cs | Refactors compiler construction and root-node compilation behavior. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionSerializerFactory.cs | Makes factory static and updates nullability. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionPresetSerializer.cs | New preset serializer for configurable properties. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionPresetDeserializer.cs | New preset deserializer with type conversion. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer27.cs | Adds PrivateKeyPath serialization + inheritance attribute. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Xml/XmlConnectionNodeSerializer26.cs | Adds PrivateKeyPath serialization + inheritance attribute. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/SqlConnectionListMetaData.cs | Initializes properties to avoid nulls. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesXmlSerializer.cs | Ensures ConnectionId is non-null. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/LocalConnectionPropertiesModel.cs | Defaults ConnectionId to empty string. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Sql/ISqlDatabaseMetaDataRetriever.cs | New interface for SQL metadata read/write. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Json/JsonConnectionsSerializer.cs | New JSON serializer for connections export. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/RemoteDesktopManager/CsvConnectionsSerializerRdmFormat.cs | Removes unimplemented serializer stub. |
| mRemoteNG/Config/Serializers/ConnectionSerializers/Csv/RemoteDesktopManager/CsvConnectionsDeserializerRdmFormat.cs | Fixes nullability and invariant formatting. |
| mRemoteNG/Config/Serializers/ConfConsEnsureConnectionsHaveIds.cs | Makes helper static. |
| mRemoteNG/Config/Putty/PuttySessionsRegistryProvider.cs | Nullability hardening + session name decoding refactor. |
| mRemoteNG/Config/Putty/PuttySessionsManager.cs | Adds file provider and improves error handling. |
| mRemoteNG/Config/Putty/PuttySessionNameDecoder.cs | New decoder for PuTTY session names with fallback encoding. |
| mRemoteNG/Config/Putty/PuttySessionChangedEventArgs.cs | Nullability updates. |
| mRemoteNG/Config/Putty/AbstractPuttySessionsProvider.cs | Improves session diffing and decoding. |
| mRemoteNG/Config/MachineIdentifier.cs | Uses HashData + hex formatting and nullability. |
| mRemoteNG/Config/Import/TextImporter.cs | New simple text importer for host/user/pass/port lines. |
| mRemoteNG/Config/Import/SecureCRTIniFileImporter.cs | New importer for SecureCRT INI sessions. |
| mRemoteNG/Config/Import/SecureCRTImporter.cs | Switches to static deserializer API. |
| mRemoteNG/Config/Import/SecureCRTFolderImporter.cs | New recursive SecureCRT sessions folder import. |
| mRemoteNG/Config/Import/RoyalTSImporter.cs | New RoyalTS import path. |
| mRemoteNG/Config/Import/RemoteDesktopManagerImporter.cs | Imports + optional credential extraction to repository. |
| mRemoteNG/Config/Import/RemoteDesktopConnectionManagerImporter.cs | Imports + optional credential extraction to repository. |
| mRemoteNG/Config/Import/RemoteDesktopConnectionImporter.cs | Imports + optional credential extraction to repository. |
| mRemoteNG/Config/Import/RegistryImporter.cs | Hardens registry reads and invariant parsing. |
| mRemoteNG/Config/Import/PuttyConnectionManagerImporter.cs | Imports + optional credential extraction to repository. |
| mRemoteNG/Config/Import/MtputtyImporter.cs | New MTPuTTY import path + credential extraction. |
| mRemoteNG/Config/Import/MRemoteNGXmlImporter.cs | Adds password prompting and null-deserialization handling. |
| mRemoteNG/Config/Import/MRemoteNGCsvImporter.cs | Early return if no imported children. |
| mRemoteNG/Config/Import/CredentialImportHelper.cs | New helper to move embedded creds into repositories. |
| mRemoteNG/Config/Import/BookmarksHtmlImporter.cs | New bookmarks HTML importer to connections tree. |
| mRemoteNG/Config/DatabaseConnectors/OdbcDatabaseConnector.cs | Refactors ODBC connector + stronger connection-string building. |
| mRemoteNG/Config/DatabaseConnectors/MySqlDatabaseConnector.cs | Adds utf8mb4 and improves disposal. |
| mRemoteNG/Config/DatabaseConnectors/MSSqlDatabaseConnector.cs | Adjusts auth branching and connection-string defaults. |
| mRemoteNG/Config/DatabaseConnectors/LiteDbRepository.cs | New embedded LiteDB repository implementation. |
| mRemoteNG/Config/DatabaseConnectors/ILiteDbRepository.cs | New generic repository interface for LiteDB. |
| mRemoteNG/Config/DatabaseConnectors/DatabaseProfile.cs | Adds JSON-stored DB profiles manager. |
| mRemoteNG/Config/DatabaseConnectors/DatabaseConnectorFactory.cs | Normalizes type/auth and adds integrated security selection. |
| mRemoteNG/Config/DatabaseConnectors/DatabaseConnectionTester.cs | Static tester with provider-specific exception mapping. |
| mRemoteNG/Config/DataProviders/FtpDataProvider.cs | New FTP-based data provider for load/save. |
| mRemoteNG/Config/DataProviders/FileDataProviderWithRollingBackup.cs | Uses static backup creator before save. |
| mRemoteNG/Config/DataProviders/FileDataProvider.cs | Adds retry-load + atomic temp write/replace + cleanup. |
| mRemoteNG/Config/DataProviders/FileBackupPruner.cs | Makes pruner static and uses ordinal ordering. |
| mRemoteNG/Config/DataProviders/FileBackupCreator.cs | Makes creator static and gates on backup setting. |
| mRemoteNG/Config/CredentialRepositoryListSaver.cs | Uses static serializer call. |
| mRemoteNG/Config/CredentialRepositoryListLoader.cs | Uses ThrowIfNull in ctor. |
| mRemoteNG/Config/CredentialRecordSaver.cs | Uses ThrowIfNull in ctor. |
| mRemoteNG/Config/CredentialRecordLoader.cs | Uses ThrowIfNull in ctor. |
| mRemoteNG/Config/CredentialHarvester.cs | Improves null safety and parsing/decryption inputs. |
| mRemoteNG/Config/Connections/XmlConnectionsSaver.cs | Fixes exception arg-name + ensures root exists + non-empty XML. |
| mRemoteNG/Config/Connections/XmlConnectionsLoader.cs | Adds backup recovery on empty/invalid XML + injectable password requestor. |
| mRemoteNG/Config/Connections/SaveFormat.cs | Adds JSON and RDP save formats. |
| mRemoteNG/Config/Connections/SaveConnectionsOnEdit.cs | Null-safe property name in event handler. |
| mRemoteNG/Config/Connections/Multiuser/SqlConnectionsUpdateChecker.cs | Nullability + invariant parsing + suppresses unused TryParse result. |
| mRemoteNG/Config/Connections/Multiuser/RemoteConnectionsSyncronizer.cs | Adds external reload tracking + configurable intervals. |
| mRemoteNG/Config/Connections/Multiuser/FileConnectionsUpdateChecker.cs | New file-based update checker via FileSystemWatcher. |
| mRemoteNG/Config/Connections/Multiuser/ConnectionsUpdateAvailableEventArgs.cs | Makes DatabaseConnector nullable for file-based updates. |
| mRemoteNG/Config/Connections/CsvConnectionsSaver.cs | Fixes exception arg-name + uses ThrowIfNull. |
| mRemoteNG/Config/Connections/ConnectionsSavedEventArgs.cs | Uses ThrowIfNull for model argument. |
| mRemoteNG/Config/Connections/ConnectionsLoadedEventArgs.cs | Uses ThrowIfNull for ctor arguments. |
| mRemoteNG/App/Tools/PluginManager.cs | New plugin manager and host implementation. |
| mRemoteNG/App/SupportedCultures.cs | Removes legacy serialization scaffold and improves naming. |
| mRemoteNG/App/Startup.cs | Adds plugin load + optional DB profile picker + file watcher sync. |
| mRemoteNG/App/Shutdown.cs | Adds cleanup for REST/external tools + plugin shutdown + safer update run. |
| mRemoteNG/App/Logger.cs | Fixes repository setup and adds log-path writeability fallback. |
| mRemoteNG/App/Initialization/StartupDataLogger.cs | Logs settings file path/metadata. |
| mRemoteNG/App/Initialization/MessageCollectorSetup.cs | Makes setup class static. |
| mRemoteNG/App/Initialization/CredsAndConsSetup.cs | Makes setup static + loads additional connection files. |
| mRemoteNG/App/Initialization/ConnectionIconLoader.cs | Uses relative icon paths in icon list. |
| mRemoteNG/App/Info/UpdateChannelInfo.cs | Adds GitHub update channel support. |
| mRemoteNG/App/Info/GeneralAppInfo.cs | Updates URLs + improves null safety. |
| mRemoteNG/App/Info/CredentialsFileInfo.cs | Makes class static. |
| mRemoteNG/App/Info/ConnectionsFileInfo.cs | Bumps connection file version to 3.2. |
| mRemoteNG/App/Export.cs | Adds JSON/RDP export and optional encryption support. |
| mRemoteNG/App/CompatibilityChecker.cs | Skips FIPS warning on .NET 5+ and hardens registry reads. |
| mRemoteNG/App/Checks/VCppRuntimeCheck.cs | Makes check static + returns IList. |
| mRemoteNG/App/Checks/UpdateInfo.cs | Adds GitHub JSON parsing support for update info. |
| mRemoteNG/App/Checks/UpdateFile.cs | Adds nullability and safer dictionary access. |
| mRemoteNG/App/Checks/InternetConnection.cs | Makes class static. |
| mRemoteNG/App/Checks/DotNetRuntimeCheck.cs | Updates required runtime version to 10.0. |
| mRemoteNG/App/Checks/AppUpdater.cs | Improves proxy behavior + adds GitHub update parsing path. |
| mRemoteNG/App/AppWindows.cs | Adds new window types and nullability hardening. |
| mRemoteNG.Plugins/mRemoteNG.Plugins.csproj | New plugins project targeting net10.0-windows. |
| mRemoteNG.Plugins/IPluginHost.cs | New plugin host contract. |
| mRemoteNG.Plugins/IPlugin.cs | New plugin contract. |
| mRemoteNG.Plugins/IConnectionNode.cs | Defines plugin-visible connection node surface. |
| docs/nightly-update-portable.txt | Adds nightly update metadata file. |
| docs/TROUBLESHOOTING.md | Adds troubleshooting guide content. |
| docs/ANTIVIRUS_FALSE_POSITIVE.md | Adds AV false-positive explanation and steps. |
| deploy-test-profile.ps1 | Adds helper to deploy a portable test profile. |
| codecov.yml | Adds Codecov coverage configuration. |
| build.ps1 | Adds build helper script for MSBuild/VS dev shell. |
| VISUAL_EXAMPLES.md | Removes visual examples doc. |
| PANEL_BINDING_FEATURE.md | Removes panel binding feature doc. |
| ObjectListView/TreeListView.cs | Adjusts filtered child branch behavior under filtering. |
| ObjectListView/Package.nuspec | Updates System.Drawing.Common dependency version. |
| ObjectListView/ObjectListView.NetCore.csproj | Adds x86 platform targeting handling. |
| GroupPolicy/README.md | Adds ADMX/ADML usage documentation. |
| ExternalConnectors/VO/VaultOpenbao.cs | Replaces .Result with GetAwaiter().GetResult() wrappers. |
| ExternalConnectors/ExternalConnectors.csproj | Adds platforms/configurations and DirectoryServices reference. |
| ExternalConnectors/DSS/SecretServerInterface.cs | Hardens comparisons + enforces HTTPS + unblocks async calls. |
| ExternalConnectors/CPS/PasswordstateInterface.cs | Hardens comparisons + enforces HTTPS + unblocks async calls. |
| ExternalConnectors/AWS/InstanceInfo.cs | Removes stray semicolon in switch block. |
| ExternalConnectors/AWS/EC2FetchDataService.cs | Uses ordinal string comparison for tag key. |
| Directory.Build.props | Sets shared compilation off + analyzer package refs. |
| CREDITS.md | Updates VNC dependency attribution. |
| CONTRIBUTING.md | Adds repo contribution guidelines and build/test steps. |
| CODE_SIGNING_POLICY.md | Documents signing approach and requirements. |
| AGENTS.md | Adds agent instructions for automated tooling. |
| .gitleaks.toml | Adds secret-scanning configuration and allowlist. |
| .github/workflows/sonarcloud.yml | Adds SonarCloud workflow. |
| .github/workflows/secret-scan.yml | Adds gitleaks workflow. |
| .github/workflows/pr_validation.yml | Adds multi-platform PR build validation. |
| .github/workflows/post_2_Reddit.yml | Tightens permissions for Reddit workflow. |
| .github/workflows/codeql.yml | Adds CodeQL workflow. |
| .github/workflows/add_PR_2_chlog.yml | Adjusts workflow permissions for changelog updater. |
| .github/dependabot.yml | Adds Dependabot configuration. |
| .editorconfig | Adds analyzer suppressions and global settings. |
| .claude/settings.json | Adds Claude config placeholder. |
| .claude/commands/iis-update.md | Adds orchestrator command documentation. |
| .claude/commands/iis-supervisor.md | Adds supervisor command documentation. |
| .claude/commands/iis-orchestrator.md | Adds orchestrator command documentation. |
| ApplicationName = "mRemoteNG", | ||
| DataSource = _dbHost, | ||
| InitialCatalog = _dbCatalog, | ||
| IntegratedSecurity = true | ||
| IntegratedSecurity = true, | ||
| Encrypt = true, | ||
| TrustServerCertificate = true, | ||
| ConnectTimeout = 30, | ||
| MultipleActiveResultSets = true |
There was a problem hiding this comment.
Setting Encrypt = true together with TrustServerCertificate = true makes TLS vulnerable to MITM because the server certificate is not validated. Prefer TrustServerCertificate = false by default (and make it explicitly user-configurable for legacy/self-signed setups), or only enable TrustServerCertificate when the user opts in.
| else | ||
| { | ||
| tempRoot.AddChild(clonedTarget); | ||
| exportTarget = clonedTarget; |
There was a problem hiding this comment.
In the non-root case, tempRoot gets the cloned node added, but exportTarget is set to clonedTarget instead of tempRoot. This likely drops the password-bearing root wrapper needed for encryption metadata/full-file encryption. Consider setting exportTarget = tempRoot in the else block so the serializer sees the intended encrypted root.
| exportTarget = clonedTarget; | |
| exportTarget = tempRoot; |
| string encryptedContent = _cryptographyProvider.Encrypt(contentToEncrypt, encryptionKey); | ||
| XDocument encryptedDocument = ReplaceInnerXml(documentToEncrypt, encryptedContent); | ||
| return encryptedDocument; | ||
| } | ||
|
|
||
| private string GetContentToEncrypt(XNode element) | ||
| private static string GetContentToEncrypt(XNode element) | ||
| { | ||
| System.Xml.XmlReader reader = element.CreateReader(); |
There was a problem hiding this comment.
XmlReader should be disposed to avoid resource leaks (especially with large documents). Use a using declaration around the reader.
| System.Xml.XmlReader reader = element.CreateReader(); | |
| using System.Xml.XmlReader reader = element.CreateReader(); |
| using System.Xml; | ||
|
|
||
| namespace mRemoteNG.Config.Serializers.ConnectionSerializers.Xml | ||
| { | ||
| public static class XmlExtensions | ||
| { | ||
| private static readonly ConcurrentDictionary<(Type, string), object?> s_enumCache = new(); |
There was a problem hiding this comment.
The enum parse cache is unbounded and keyed by raw attribute values, which can grow without limit when parsing attacker-controlled or simply diverse input XML. Consider removing caching, restricting caching to known enums/known values, or switching to a bounded cache/eviction approach to prevent memory growth.
| var cacheKey = (typeof(T), value); | ||
| if (s_enumCache.TryGetValue(cacheKey, out object? cached)) | ||
| return cached is T t ? t : defaultValue; | ||
|
|
||
| bool parsed = Enum.TryParse<T>(value, true, out T result); | ||
| s_enumCache[cacheKey] = parsed ? result : null; |
There was a problem hiding this comment.
The enum parse cache is unbounded and keyed by raw attribute values, which can grow without limit when parsing attacker-controlled or simply diverse input XML. Consider removing caching, restricting caching to known enums/known values, or switching to a bounded cache/eviction approach to prevent memory growth.
| if ($Portable) { | ||
| Write-Host "Building portable edition (self-contained + PORTABLE flag)..." | ||
| if (-not $NoRestore) { | ||
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 | ||
| } | ||
| # Uses Release config (recognized by all projects) with explicit PORTABLE + SC properties. | ||
| # PublishReadyToRun=false avoids NETSDK1094 crossgen2 issue; startup impact is negligible. | ||
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:DefineConstants=PORTABLE" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishReadyToRun=false" "-p:SignAssembly=false" "-p:PublishDir=bin\x64\Portable\" -t:Publish | ||
| Write-Host "Portable output: mRemoteNG\bin\x64\Portable\" -ForegroundColor Green | ||
| } elseif ($SelfContained) { | ||
| Write-Host "Building self-contained (embedded .NET runtime, non-portable)..." | ||
| if (-not $NoRestore) { | ||
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 /p:PublishReadyToRun=true | ||
| } | ||
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishDir=bin\x64\Release\win-x64-sc\" -t:Publish | ||
| } else { | ||
| Write-Host "Building framework-dependent..." | ||
| if (-not $NoRestore) { | ||
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" | ||
| } | ||
| $msbuildArgs = @('-m', '-verbosity:minimal', "-p:Configuration=$Configuration", '-p:Platform=x64', '-p:SignAssembly=false') | ||
| if ($Rebuild) { $msbuildArgs += '-t:Rebuild' } | ||
| if ($NoRestore) { $msbuildArgs += '-p:RestorePackages=false' } | ||
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" @msbuildArgs |
There was a problem hiding this comment.
The script hard-codes an absolute repo path (D:\\github\\mRemoteNG\\mRemoteNG.sln), which will break for other contributors/CI environments. Use $PSScriptRoot (or Join-Path $PSScriptRoot 'mRemoteNG.sln') to resolve the solution path relative to the script location.
| if ($Portable) { | |
| Write-Host "Building portable edition (self-contained + PORTABLE flag)..." | |
| if (-not $NoRestore) { | |
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 | |
| } | |
| # Uses Release config (recognized by all projects) with explicit PORTABLE + SC properties. | |
| # PublishReadyToRun=false avoids NETSDK1094 crossgen2 issue; startup impact is negligible. | |
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:DefineConstants=PORTABLE" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishReadyToRun=false" "-p:SignAssembly=false" "-p:PublishDir=bin\x64\Portable\" -t:Publish | |
| Write-Host "Portable output: mRemoteNG\bin\x64\Portable\" -ForegroundColor Green | |
| } elseif ($SelfContained) { | |
| Write-Host "Building self-contained (embedded .NET runtime, non-portable)..." | |
| if (-not $NoRestore) { | |
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 /p:PublishReadyToRun=true | |
| } | |
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishDir=bin\x64\Release\win-x64-sc\" -t:Publish | |
| } else { | |
| Write-Host "Building framework-dependent..." | |
| if (-not $NoRestore) { | |
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" | |
| } | |
| $msbuildArgs = @('-m', '-verbosity:minimal', "-p:Configuration=$Configuration", '-p:Platform=x64', '-p:SignAssembly=false') | |
| if ($Rebuild) { $msbuildArgs += '-t:Rebuild' } | |
| if ($NoRestore) { $msbuildArgs += '-p:RestorePackages=false' } | |
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" @msbuildArgs | |
| $solutionPath = Join-Path $PSScriptRoot 'mRemoteNG.sln' | |
| if ($Portable) { | |
| Write-Host "Building portable edition (self-contained + PORTABLE flag)..." | |
| if (-not $NoRestore) { | |
| dotnet restore $solutionPath --runtime win-x64 | |
| } | |
| # Uses Release config (recognized by all projects) with explicit PORTABLE + SC properties. | |
| # PublishReadyToRun=false avoids NETSDK1094 crossgen2 issue; startup impact is negligible. | |
| msbuild $solutionPath -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:DefineConstants=PORTABLE" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishReadyToRun=false" "-p:SignAssembly=false" "-p:PublishDir=bin\x64\Portable\" -t:Publish | |
| Write-Host "Portable output: mRemoteNG\bin\x64\Portable\" -ForegroundColor Green | |
| } elseif ($SelfContained) { | |
| Write-Host "Building self-contained (embedded .NET runtime, non-portable)..." | |
| if (-not $NoRestore) { | |
| dotnet restore $solutionPath --runtime win-x64 /p:PublishReadyToRun=true | |
| } | |
| msbuild $solutionPath -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishDir=bin\x64\Release\win-x64-sc\" -t:Publish | |
| } else { | |
| Write-Host "Building framework-dependent..." | |
| if (-not $NoRestore) { | |
| dotnet restore $solutionPath | |
| } | |
| $msbuildArgs = @('-m', '-verbosity:minimal', "-p:Configuration=$Configuration", '-p:Platform=x64', '-p:SignAssembly=false') | |
| if ($Rebuild) { $msbuildArgs += '-t:Rebuild' } | |
| if ($NoRestore) { $msbuildArgs += '-p:RestorePackages=false' } | |
| msbuild $solutionPath @msbuildArgs |
|
|
||
| if ($Portable) { | ||
| Write-Host "Building portable edition (self-contained + PORTABLE flag)..." | ||
| if (-not $NoRestore) { | ||
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 | ||
| } | ||
| # Uses Release config (recognized by all projects) with explicit PORTABLE + SC properties. | ||
| # PublishReadyToRun=false avoids NETSDK1094 crossgen2 issue; startup impact is negligible. | ||
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:DefineConstants=PORTABLE" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishReadyToRun=false" "-p:SignAssembly=false" "-p:PublishDir=bin\x64\Portable\" -t:Publish | ||
| Write-Host "Portable output: mRemoteNG\bin\x64\Portable\" -ForegroundColor Green | ||
| } elseif ($SelfContained) { | ||
| Write-Host "Building self-contained (embedded .NET runtime, non-portable)..." | ||
| if (-not $NoRestore) { | ||
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 /p:PublishReadyToRun=true | ||
| } | ||
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishDir=bin\x64\Release\win-x64-sc\" -t:Publish | ||
| } else { | ||
| Write-Host "Building framework-dependent..." | ||
| if (-not $NoRestore) { | ||
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" | ||
| } | ||
| $msbuildArgs = @('-m', '-verbosity:minimal', "-p:Configuration=$Configuration", '-p:Platform=x64', '-p:SignAssembly=false') | ||
| if ($Rebuild) { $msbuildArgs += '-t:Rebuild' } | ||
| if ($NoRestore) { $msbuildArgs += '-p:RestorePackages=false' } | ||
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" @msbuildArgs |
There was a problem hiding this comment.
The script hard-codes an absolute repo path (D:\\github\\mRemoteNG\\mRemoteNG.sln), which will break for other contributors/CI environments. Use $PSScriptRoot (or Join-Path $PSScriptRoot 'mRemoteNG.sln') to resolve the solution path relative to the script location.
| if ($Portable) { | |
| Write-Host "Building portable edition (self-contained + PORTABLE flag)..." | |
| if (-not $NoRestore) { | |
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 | |
| } | |
| # Uses Release config (recognized by all projects) with explicit PORTABLE + SC properties. | |
| # PublishReadyToRun=false avoids NETSDK1094 crossgen2 issue; startup impact is negligible. | |
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:DefineConstants=PORTABLE" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishReadyToRun=false" "-p:SignAssembly=false" "-p:PublishDir=bin\x64\Portable\" -t:Publish | |
| Write-Host "Portable output: mRemoteNG\bin\x64\Portable\" -ForegroundColor Green | |
| } elseif ($SelfContained) { | |
| Write-Host "Building self-contained (embedded .NET runtime, non-portable)..." | |
| if (-not $NoRestore) { | |
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" --runtime win-x64 /p:PublishReadyToRun=true | |
| } | |
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishDir=bin\x64\Release\win-x64-sc\" -t:Publish | |
| } else { | |
| Write-Host "Building framework-dependent..." | |
| if (-not $NoRestore) { | |
| dotnet restore "D:\github\mRemoteNG\mRemoteNG.sln" | |
| } | |
| $msbuildArgs = @('-m', '-verbosity:minimal', "-p:Configuration=$Configuration", '-p:Platform=x64', '-p:SignAssembly=false') | |
| if ($Rebuild) { $msbuildArgs += '-t:Rebuild' } | |
| if ($NoRestore) { $msbuildArgs += '-p:RestorePackages=false' } | |
| msbuild "D:\github\mRemoteNG\mRemoteNG.sln" @msbuildArgs | |
| $solutionPath = Join-Path $PSScriptRoot 'mRemoteNG.sln' | |
| if ($Portable) { | |
| Write-Host "Building portable edition (self-contained + PORTABLE flag)..." | |
| if (-not $NoRestore) { | |
| dotnet restore $solutionPath --runtime win-x64 | |
| } | |
| # Uses Release config (recognized by all projects) with explicit PORTABLE + SC properties. | |
| # PublishReadyToRun=false avoids NETSDK1094 crossgen2 issue; startup impact is negligible. | |
| msbuild $solutionPath -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:DefineConstants=PORTABLE" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishReadyToRun=false" "-p:SignAssembly=false" "-p:PublishDir=bin\x64\Portable\" -t:Publish | |
| Write-Host "Portable output: mRemoteNG\bin\x64\Portable\" -ForegroundColor Green | |
| } elseif ($SelfContained) { | |
| Write-Host "Building self-contained (embedded .NET runtime, non-portable)..." | |
| if (-not $NoRestore) { | |
| dotnet restore $solutionPath --runtime win-x64 /p:PublishReadyToRun=true | |
| } | |
| msbuild $solutionPath -m "-verbosity:minimal" "-p:Configuration=Release" "-p:Platform=x64" "-p:SelfContained=true" "-p:RuntimeIdentifier=win-x64" "-p:PublishDir=bin\x64\Release\win-x64-sc\" -t:Publish | |
| } else { | |
| Write-Host "Building framework-dependent..." | |
| if (-not $NoRestore) { | |
| dotnet restore $solutionPath | |
| } | |
| $msbuildArgs = @('-m', '-verbosity:minimal', "-p:Configuration=$Configuration", '-p:Platform=x64', '-p:SignAssembly=false') | |
| if ($Rebuild) { $msbuildArgs += '-t:Rebuild' } | |
| if ($NoRestore) { $msbuildArgs += '-p:RestorePackages=false' } | |
| msbuild $solutionPath @msbuildArgs |
| mRemoteNG v1.79 and earlier require .NET 10 Desktop Runtime installed separately. | ||
|
|
||
| **Solutions:** | ||
| - Download and install the [.NET 10 Desktop Runtime](https://dotnet.microsoft.com/download/dotnet/10.0) for your platform (x64, x86, or ARM64) | ||
| - Or use the **self-contained** build (v1.80+) which bundles the runtime — no separate installation needed |
There was a problem hiding this comment.
This statement appears inconsistent: .NET 10 migration is described as part of later versions, and v1.79 is typically pre-.NET 10. Please verify and correct the version/runtime mapping (e.g., specify which versions require .NET Framework vs .NET 10, and which versions are self-contained).
| mRemoteNG v1.79 and earlier require .NET 10 Desktop Runtime installed separately. | |
| **Solutions:** | |
| - Download and install the [.NET 10 Desktop Runtime](https://dotnet.microsoft.com/download/dotnet/10.0) for your platform (x64, x86, or ARM64) | |
| - Or use the **self-contained** build (v1.80+) which bundles the runtime — no separate installation needed | |
| mRemoteNG v1.79 and earlier are .NET Framework–based and require the .NET Framework 4.8 Desktop Runtime installed separately. Newer versions (v1.80+) run on .NET 10. | |
| **Solutions:** | |
| - For v1.79 and earlier: download and install the [Microsoft .NET Framework 4.8 Runtime](https://dotnet.microsoft.com/download/dotnet-framework) for your platform | |
| - For v1.80+ framework-dependent builds: download and install the [.NET 10 Desktop Runtime](https://dotnet.microsoft.com/download/dotnet/10.0) for your platform (x64, x86, or ARM64) | |
| - Or use a **self-contained** v1.80+ build, which bundles the .NET 10 runtime — no separate installation needed |
| using System; | ||
| using System.Collections.Generic; | ||
| using System.Linq; | ||
| using System.Text.RegularExpressions; |
There was a problem hiding this comment.
System.Text.RegularExpressions is imported but not used in this file. Remove the unused using to keep the file clean.
| using System.Text.RegularExpressions; |
| if (rootNodeInfo.TotpEnabled && !string.IsNullOrEmpty(rootNodeInfo.TotpSecret)) | ||
| { | ||
| element.Add(new XAttribute(XName.Get("TotpEnabled"), "true")); | ||
| System.Security.SecureString encryptionPassword = rootNodeInfo.PasswordString.ConvertToSecureString(); | ||
| element.Add(new XAttribute(XName.Get("TotpSecret"), cryptographyProvider.Encrypt(rootNodeInfo.TotpSecret, encryptionPassword))); | ||
| } |
There was a problem hiding this comment.
The SecureString created for encryptionPassword should be disposed to avoid retaining sensitive material longer than necessary. Consider using a using declaration and/or an API that encrypts directly from the existing key material without allocating additional SecureString instances.
Quality Update — v1.82.0 Development (Mar 2)Updated metrics since my last comment (all improvements are on
New tests added (160 total)
Coverage strategy
Upstream bug fixes backported to mainCommits @Kvarkas — the SonarCloud issues you flagged on #3188 were all resolved on this PR. Quality Gate passed with 0 vulnerabilities, 0 security hotspots, A ratings across the board. Let me know if you'd like any additional information or have concerns about the diff. |
release/1.81 is a historic branch for upstream PR mRemoteNG#3189 only. v1.81.0-beta.6 is the last build on main before the 1.82.0 version bump. Fixed badge link and Downloads table to reflect this. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Version bump in csproj for stable release - build.ps1: use $PSScriptRoot instead of hardcoded paths - build.ps1: add -Arch parameter (x64/x86/ARM64) - build.ps1: fix SC publish with PublishReadyToRun=false (NETSDK1094) - build.ps1: use publish\ directory matching CI workflow Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
- TextImporter: remove unused using (System.Text.RegularExpressions, System.Collections.Generic, System.Linq) - XmlConnectionsDocumentEncryptor: add using on XmlReader to prevent resource leak - XmlRootNodeSerializer: add using on SecureString to dispose sensitive material promptly (2 instances) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move non-standard docs to docs/ (ARCHITECTURE, CODE_SIGNING_POLICY, COST_OPTIMIZATION, CREDITS) — already moved in previous commit, this updates all cross-references (12 files) - Move auxiliary scripts to scripts/ (deploy-test-profile.ps1, qodo-review.sh) — update $PSScriptRoot path + CLAUDE.md refs - Add Qodo Code Review badge + VirusTotal 0/75 badge to README - Add Qodo as Level 5 in Code Quality table with findings summary - Fix test count 6,175 → 6,123 (matches SSOT test-config.json) - Add *.xlsx to .gitignore - Fix qodo-review.sh grep -iF crash on MSYS2 (use -qi instead) - scientific-paper: add §5.8 Qodo Code Review (5 findings from PR mRemoteNG#3189, SQL schema mismatch as key finding), §5.9 VirusTotal & AV false positive resolution (timeline Feb 17→Mar 6, vendor cascade analysis), Insights 14-15, update to 5-level pipeline - EVIDENCE.md: add Phase 6 (Qodo findings + VT scan timeline) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move non-standard docs to docs/ (ARCHITECTURE, CODE_SIGNING_POLICY, COST_OPTIMIZATION, CREDITS) — already moved in previous commit, this updates all cross-references (12 files) - Move auxiliary scripts to scripts/ (deploy-test-profile.ps1, qodo-review.sh) — update $PSScriptRoot path + CLAUDE.md refs - Add Qodo Code Review badge + VirusTotal 0/75 badge to README - Add Qodo as Level 5 in Code Quality table with findings summary - Fix test count 6,175 → 6,123 (matches SSOT test-config.json) - Add *.xlsx to .gitignore - Fix qodo-review.sh grep -iF crash on MSYS2 (use -qi instead) - scientific-paper: add §5.8 Qodo Code Review (5 findings from PR mRemoteNG#3189, SQL schema mismatch as key finding), §5.9 VirusTotal & AV false positive resolution (timeline Feb 17→Mar 6, vendor cascade analysis), Insights 14-15, update to 5-level pipeline - EVIDENCE.md: add Phase 6 (Qodo findings + VT scan timeline) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>



Summary
This PR brings mRemoteNG to .NET 10 with comprehensive modernization across the entire codebase.
Key metrics
What's included
Platform
MSTSCLib)New protocols
Security
Code quality
build.ps1,run-tests.ps1,run-tests-core.shBug fixes (highlights)
SonarCloud status
Previous PR (#3188) had Quality Gate issues primarily from internal orchestrator scripts (now excluded from this branch). Source code issues have been fixed:
_isVistafield removed (frmTaskDialog)env:vars instead of inline expansionBreaking changes
Test plan
--version) passes on x64 and ARM64🤖 Generated with Claude Code