Skip to content

Security: ToMuchNeverEnuf/XboxOwnershipFilter

Security

SECURITY.md

Security

This document describes what the shipped plugin actually does. If the code and this document ever disagree, that is a bug; please report it.

Sign-in

Sign-in happens in Playnite's embedded browser (CEF), pointed at Microsoft's real sign-in page at login.live.com. The plugin never renders a credential form of its own and never sees your password. The sign-in completion is recognised only on Microsoft's documented completion URL (https://login.live.com/oauth20_desktop.srf), not by scanning page content.

Tokens

  • One Microsoft access token is obtained per session.
  • It is held in memory only. It is never written to disk, logged, or exported.
  • There is no refresh token. When the token expires, the next detection run repeats the browser redirect, which is usually silent because the webview keeps its own cookies.
  • The token is sent to exactly one host: collections.mp.microsoft.com, in the request body of the collections query, which is where that service expects it.

Network endpoints

The plugin talks to two Microsoft hosts and nothing else:

  • collections.mp.microsoft.com — your entitlements (requires the token)
  • displaycatalog.mp.microsoft.com — public product catalog (no authentication)

There is no telemetry, no analytics, no update check, and no third-party service.

Authentication summary

  • Microsoft sign-in occurs in Playnite's embedded browser.
  • The plugin does not collect, see, or handle the user's password.
  • A Microsoft access token is held only in memory.
  • No OAuth token is persisted to disk, in any form.
  • The token is sent only to the Microsoft Store collections service.
  • No telemetry is sent by this plugin.

Signing out

Two options under Advanced in the manager window:

  • Sign out discards the access token held in memory. Microsoft still has a session and the embedded browser still has its cookies, so the next detection run reconnects without asking.
  • Sign out and forget account additionally visits Microsoft's sign-out endpoint and clears the sign-in cookies across every domain the flow touches. The next run asks which account to use. This is the one to use on a shared machine.

Neither affects your ownership data, and neither affects Playnite's own Xbox library plugin, which maintains its own separate sign-in.

Known limitation: legacy authentication flow

Sign-in uses Microsoft's legacy implicit flow (response_type=token) against the login.live.com endpoints, with a legacy client id and the Store collections scope. This is the flow those Store services accept; the documented modern alternative, authorization code with PKCE, is not known to work against this particular client id and scope combination.

Microsoft generally recommends against implicit grant. The reasons it is discouraged mostly concern web applications, where a token in a URL fragment can leak through browser history, referrer headers, or shared address bars. This plugin runs the flow inside a private embedded browser on the user's own machine, reads the token from the fragment, and never writes it anywhere, which removes most of that exposure but not the underlying fragility.

Treat this as a dependency on a private Microsoft service contract rather than a stable public API. Migrating to authorization code with PKCE is desirable and is tracked as future work; it requires live testing against Microsoft's endpoints, since the behaviour of these legacy client ids is not publicly documented.

Known architectural risk

These are legacy Microsoft Store service endpoints, not a stable public API contract. Microsoft can change response fields or authentication behaviour at any time. The plugin is built so that the failure mode is inert: if detection cannot complete, the previous known good snapshot is kept and nothing in your library changes.

Local files

The plugin's data folder contains its ownership ledger, rolling backups, and three CSV reports. The reports describe your account's entitlements and play history. That is not credential material, but it is personal data: treat detection.csv and unmatched.csv as private when attaching them to bug reports, and redact anything you would rather not share.

Reporting

Open an issue at https://github.com/ToMuchNeverEnuf/XboxOwnershipFilter/issues. For anything sensitive, say so in the issue and details can be handled privately.

There aren't any published security advisories