Repository navigation
Migrate settings storage from XML to JSON with automatic migration - #3282
Merged
Merged
Conversation
Co-authored-by: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Co-authored-by: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Co-authored-by: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
…null checks, use timestamped backups Co-authored-by: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Co-authored-by: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Migrate SettingsManager to use JSON file format
Migrate settings storage from XML to JSON with automatic migration
Dec 24, 2025
BornToBeRoot
marked this pull request as ready for review
December 24, 2025 16:14
5 tasks
BornToBeRoot
added a commit
that referenced
this pull request
Oct 11, 2026
The CollectionChanged handlers were only attached to the initial collections in the constructor. Since the settings are stored as JSON (#3282), System.Text.Json replaces the collections when loading, and some views replace them at runtime (e.g. PuTTY/PowerShell histories, reset to defaults), so changes to these lists no longer marked the settings as changed and were lost if nothing else changed. Each collection setter now moves the handler to the new collection. Also adds the missing handler for Network_CustomDNSServers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BornToBeRoot
added a commit
that referenced
this pull request
Oct 11, 2026
The CollectionChanged handlers were only attached to the initial collections in the constructor. Since the settings are stored as JSON (#3282), System.Text.Json replaces the collections when loading, and some views replace them at runtime (e.g. PuTTY/PowerShell histories, reset to defaults), so changes to these lists no longer marked the settings as changed and were lost if nothing else changed. Each collection setter now moves the handler to the new collection. Also adds the missing handler for Network_CustomDNSServers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BornToBeRoot
added a commit
that referenced
this pull request
Oct 11, 2026
* Feature: Add RDAP client and IANA bootstrap service
Adds the RDAP (RFC 7480, 9082, 9083, 9224) client to NETworkManager.Models:
query parser (IDN, CIDR, asplain/asdot ASN, object-tag handles), IANA
bootstrap download/cache with conditional GET, label-wise/longest-prefix/
range matching, ARIN fallback for unlisted number resources, a small table
of RDAP servers not listed by IANA (.de, .ch/.li, .io), HTTPS-first server
selection, manual redirect handling, registrar referral and a tolerant
jCard parser.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Register RDAP application, settings and strings
Adds ApplicationName.RDAP (before Whois), its icon, settings (query history,
query type, referral, timeout, export), the RDAP settings page entry, tab
count, documentation link, query type converter and English strings. Existing
users get the new app via the settings upgrade.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Add RDAP view, settings page and Whois hand-off
Adds the RDAP tool (tabs, query type, registrar referral, structured result
view with raw JSON toggle, JSON/TXT export, history) and the RDAP settings
page (IANA bootstrap cache status, update now, timeout). Domains without a
known RDAP server can be opened in Whois; for this, WhoisHostViewModel.AddTab
is public, WhoisHostView forwards it and the redirect in MainWindow now
creates a Whois tab instead of ignoring the data.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Add RDAP profile support
Profiles can store an RDAP query and its query type (inherits the host by
default), including the profile dialog tab, the profile list column and the
import of hosts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix: IP Geolocation history written to Whois history
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: Add RDAP documentation and changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Move RDAP referral option to settings, align export
"Follow referral to registrar" is now a setting (Settings > RDAP) instead of
a checkbox next to the query button. Export is available via an Export...
button below the result and via right-click, like IP Geolocation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Show links of RDAP notices and remarks
Notices like terms of service, privacy policy or inaccuracy report forms now
show their links, which open in the browser (LinkTextBlock style,
ExternalProcessStarter.OpenUrl). The URLs come from the RDAP server and are
therefore restricted to absolute HTTP(S) URIs in normalized form before they
are passed to the shell. Links are also included in the text export.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix: RDAP bootstrap cache status and publication dates
- Publication date is parsed as UTC and shown in local time (was a culture
dependent string, shown with the wrong offset) and always read from the
cached file.
- Incomplete cache entries (file present, no download time) are repaired:
the file is downloaded again instead of sending a conditional request.
- Replacing a cached file is retried, since it can be locked briefly (e.g. by
a virus scanner).
- The last error per file is stored and shown in Settings > RDAP.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Follow RDAP registrar referral by default
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Refresh RDAP bootstrap files once a week
The IANA files rarely change, so they are now checked automatically once a
week instead of daily (data.iana.org max-age). A longer server cache lifetime
is still honored, and "Update now" checks immediately.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Use help icons in RDAP settings
Additional information for "Bootstrap files" and "Follow referral to
registrar" is shown as an info icon tooltip, like on the other settings
pages, instead of a text below the setting.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Align RDAP result layout with other tools
- Detail rows use CenterTextBlock labels and a 10px gap without extra row
margins, like IP Geolocation and Network Interface.
- Section labels (Events, Nameservers, ...) use the gray group label style
instead of an enlarged header.
- No duplicate "Result" title; Registry/Registrar titles are only shown if
the referral was followed.
- Notice texts are shown in normal weight (only values are bold).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix: Limit RDAP bootstrap retries if IANA is not reachable
- A failed update is retried after one hour, at most 3 times; then the
cached files are used until the regular weekly update ("Update now"
always checks). The cached copy is never removed before a new file was
downloaded and validated.
- After a network error, the remaining files are not tried in the same
update (same server), so a blocked server costs at most one timeout.
- cache-info.json is only written if something was checked.
- A temporary file is removed if replacing the cached file fails.
- The "bootstrap unavailable" message includes the reason.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Secure RDAP referrals and validate the query per type
- The referral to the registrar (and its redirects) is only followed via
HTTPS and not to local or private addresses, since the URL is sent by the
registry. A skipped referral is logged and shown as status message.
- New RDAPQueryValidator validates the query depending on the query type
(domain, TLD, IP address/CIDR, ASN, entity) while typing, in the RDAP tool
and in the profile dialog, and validates again if the type changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Add export button to Whois
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: RDAP retries, referral security, Whois export
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: Add PR link to changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix: Address review feedback for RDAP (#3607)
- Referrals: pin the connection to the checked addresses (SocketsHttpHandler
ConnectCallback) to prevent DNS rebinding to local/private addresses, fail
closed if the host cannot be resolved; proxied connections (CONNECT) are
checked before the request.
- Run command / redirected data: detect the query type from the input
instead of using the last selected type.
- Notice links: use a keyboard accessible Hyperlink (Tab + Enter).
- Clarify why zone IDs are removed from IPv6 input (RFC 9082 3.1.1).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Make links keyboard accessible (#3607)
New shared LinkHyperlink style (looks like LinkTextBlock, but focusable with
Tab and opened with Enter). Used for the links in About (license, community,
update), Web Console (WebView2 runtime download) and the RDAP notices, which
were mouse-only TextBlocks before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix: Limit RDAP response size
Responses (RDAP queries, referrals, bootstrap files) are limited to 10 MB, so
a broken or malicious server cannot exhaust the memory. Larger responses fail
as network error.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Fix: Settings lists not saved after the settings were loaded
The CollectionChanged handlers were only attached to the initial collections
in the constructor. Since the settings are stored as JSON (#3282),
System.Text.Json replaces the collections when loading, and some views
replace them at runtime (e.g. PuTTY/PowerShell histories, reset to
defaults), so changes to these lists no longer marked the settings as
changed and were lost if nothing else changed. Each collection setter now
moves the handler to the new collection. Also adds the missing handler for
Network_CustomDNSServers.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Feature: Show "Open in Whois" in the center of the RDAP view
If no RDAP server is known for a domain, the error stays in the status line
and the center of the view (instead of the "Enter a domain..." placeholder)
shows a hint and an "Open in Whois" button, like the WebView2 hint in Web
Console.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: Add RDAP screenshot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: Add blog post "Introducing RDAP"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: Clarify RDAP transport in blog post
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Docs: Add RDAP to website tool list and command line arguments
- Homepage / docs introduction: RDAP chip (28 built-in tools).
- --application: values updated to the current applications (RDAP,
HostsFileEditor, Firewall, NeighborTable added; obsolete ARPTable removed).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changes proposed in this pull request
Settings.xml→Settings.json)Settings_[timestamp].xml.backup)JsonOptionsconfiguration (indented, case-insensitive, enum-to-string)App.xaml.csto eliminate duplication viaHandleCorruptedSettingsFile()Related issue(s)
N/A
Copilot generated summary
Copilot summary
Migration Logic (
SettingsManager.cs):Settings.json→ load if existsSettings.xml→ deserialize, save as JSON, create timestamped backupFiles Changed:
SettingsManager.cs: Added JSON serialization, migration logic, shared JsonOptions, null checksSettingsInfo.cs: Replaced[XmlIgnore]with[JsonIgnore]App.xaml.cs: AddedJsonExceptionhandler, extracted common recovery logicSafety:
Settings_20231223140532.xml.backup)InvalidOperationExceptionwith clear messagesJSON Configuration:
To-Do
Contributing
By submitting this pull request, I confirm the following:
Original prompt
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.