Skip to content

Multi-domain custom settings payloads are still authorable outside blueprints #438

Description

Follow-up to #436 / #437, which fixed this for blueprint legacy_payloads only.

What happens

A com.apple.ManagedClient.preferences payload carrying several preference domains under one PayloadContent dictionary is applied one domain at a time by a Mac, which drops the rest and reports nothing. Wire evidence and the unpredictability of which domain survives are in #436.

#437 refuses that shape at plan for component_blocks[].legacy_payloads and the deprecated top-level legacy_payloads. Three other surfaces can still emit it, with no plan-time refusal and no documentation:

  • jamfplatform::mobileconfig — the profile argument carries author-written payloads verbatim, and examples/functions/mobileconfig/function.tf builds an MCX envelope by hand
  • jamfplatform_pro_macos_configuration_profile — a .mobileconfig payload passes through
  • jamfplatform_pro_mobile_device_configuration_profile — same, though managed preferences are not delivered this way on iOS, so probe before assuming the rule applies

jamfplatform::mcx_forced_payload takes a single domain per call and cannot express the shape, so that path is already safe.

Why it is filed separately rather than fixed in #437

The blueprint fix lives in internal/resources/blueprints/blueprint/validators.go and keys on a payload-type constant local to that package. The profile resources compare and mask payloads through internal/common/payloadhelpers, which already holds its own copy of the payload type (mcxLikePayloadTypes, importgate.go). A shared check belongs in payloadhelpers or appleprofiles, and deciding which is a design question rather than a port.

Open questions

  • Which package owns the rule, given appleprofiles.Validate deliberately stops descending at the free-form dictionary the domains sit under
  • Whether a provider-defined function can carry a plan-time refusal usefully, since a function has no attribute path to report against
  • Whether the rule applies to iOS at all. Every device observation behind it is macOS 26.6

Not in scope

Nothing here changes what the provider sends today on those three surfaces. They are unchanged by #437 and behave as they always have.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions