<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
  ReBreak iPhone — Unsupervised Sideload Profile
  ==============================================
  Zielgruppe: unsupervised Consumer-iPhones (kein Apple Configurator,
              kein ABM/ADE, kein bestehendes MDM-Enrollment).

  Verteilung: Safari-Download von https://app.rebreak.org/profiles/
              ReBreak-Schutz.mobileconfig

  Was dieses Profile leistet (auf unsupervised Devices):

    Lock                                   | Verhalten            | Greift?
    PayloadRemovalDisallowed=true          | iOS-Version-abhängig | ⚠️ unklar
    RemovalPassword                        | iOS verlangt PIN     | ✅ ja
    allowAppRemoval=false                  | supervised-only      | ❌ nein
    OnDemandEnabled=1 (Auto-Connect)       | greift sideloaded    | ✅ ja
    OnDemandUserOverrideDisabled=true      | nur via MDM-Channel  | ❌ nein
    DNSSettings (DoH-Lock)                 | greift unabhängig    | ✅ ja

  Real-Schutz-Profil auf Consumer-iPhone:
    • DNS auf dns.rebreak.org gelocked (greift OS-weit, blockt Casino-Domains)
    • VPN-Auto-Connect by-default (User muss aktiv weg-togglen)
    • Profile-Removal nur mit RemovalPassword (PIN-Friction)
    • App-Removal-Lock: KEIN Effekt unsupervised (akzeptierter Trade-off)

  Companion-Path für Full-Lock (optional):
    Nach Sideload-Install kann User zusätzlich Device-Enrollment-MDM via
    https://mdm.rebreak.org/enroll machen. Gerät bleibt unsupervised. NanoMDM
    pushed dann den com.apple.vpn.managed-Payload separat → OnDemandUser-
    OverrideDisabled greift (MDM-Channel). Siehe UNSUPERVISED-TEST-PLAN.md.

  Apple-Referenzen:
    Restrictions:    https://developer.apple.com/documentation/devicemanagement/restrictions
    DNS Settings:    https://developer.apple.com/documentation/devicemanagement/dnssettings
    VPN-Managed:     https://github.com/apple/device-management/blob/release/mdm/profiles/com.apple.vpn.managed.yaml
    RemovalPassword: https://developer.apple.com/documentation/devicemanagement/removalpasswordprofile

  Voraussetzungen:
    - iOS 16.0+ (DNS-Settings + DoH ab iOS 14, VPN-Managed ab iOS 9, RemovalPassword
      modern ab iOS 16)
    - ReBreak-App MIT PacketTunnel-Extension installed BEVOR Profile-Install
      (sonst kann iOS den ProviderBundleIdentifier nicht auflösen → Install-Fail)

  Generator: ops/mdm/profiles/generate-unsupervised-profile.py
  Stand: 2026-05-26 — Profile-Version 1
-->
<plist version="1.0">
<dict>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>PayloadIdentifier</key>
    <string>org.rebreak.protection.iphone.unsupervised.20260526</string>
    <key>PayloadUUID</key>
    <string>5C68FD3A-E4C4-4BB1-AC25-3F0F1EAAA429</string>
    <key>PayloadDisplayName</key>
    <string>ReBreak Schutz</string>
    <key>PayloadDescription</key>
    <string>Schützt dich vor Glücksspiel-Rückfall. VPN startet automatisch, DNS läuft über dns.rebreak.org. Profil-Entfernung erfordert deinen Trustee-PIN.</string>
    <key>PayloadOrganization</key>
    <string>ReBreak</string>

    <!-- PayloadRemovalDisallowed: auf unsupervised Devices weniger zuverlässig
         als auf supervised, aber wir setzen es defensiv. Der echte Removal-
         Lock kommt via RemovalPassword unten. -->
    <key>PayloadRemovalDisallowed</key>
    <true/>

    <!-- RemovalPassword: iOS verlangt diese PIN beim Profil-Remove
         (NUR auf Non-MDM-Profilen, dieses hier ist Non-MDM). 6-stellig
         oder länger empfohlen. PLATZHALTER — pro User vom Generator ersetzt. -->
    <key>RemovalPassword</key>
    <string>REBREAK_REMOVAL_PASSWORD_PLACEHOLDER</string>

    <key>ConsentText</key>
    <dict>
        <key>default</key>
        <string>Du installierst hiermit das ReBreak-Schutz-Profil. Dieses Profil bindet dich freiwillig:

• ReBreak-VPN verbindet sich automatisch bei jedem Netzwerk-Connect
• System-DNS läuft über dns.rebreak.org (verschlüsselt via DoH)
• Glücksspiel-Domains werden geblockt
• Profil-Entfernung erfordert deinen Trustee-PIN (von dir nicht direkt änderbar)

Das ist gewollt. Der Schutz wirkt, weil er gegen deine impulsive Selbst-Override-Tendenz steht.

Bei iPhone-Verlust: Factory-Reset löscht alles, das Profil verschwindet mit. Das ist normal.</string>
    </dict>

    <key>PayloadContent</key>
    <array>

        <!-- ===================================================================
             1) DNS-SETTINGS-PAYLOAD
             OS-weiter DoH-Lock auf dns.rebreak.org. Greift unabhängig vom VPN-
             Status, blockt Glücksspiel-Domains schon auf DNS-Ebene.
             =================================================================== -->
        <dict>
            <key>PayloadType</key>
            <string>com.apple.dnsSettings.managed</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>PayloadIdentifier</key>
            <string>org.rebreak.protection.iphone.unsupervised.dns</string>
            <key>PayloadUUID</key>
            <string>3366A2C3-12D6-412D-A7D2-9290D2B103F4</string>
            <key>PayloadDisplayName</key>
            <string>ReBreak DNS-Filter</string>
            <key>PayloadDescription</key>
            <string>DNS verschlüsselt über dns.rebreak.org. Glücksspiel-Domains werden geblockt.</string>

            <key>DNSSettings</key>
            <dict>
                <key>DNSProtocol</key>
                <string>HTTPS</string>
                <key>ServerURL</key>
                <string>https://dns.rebreak.org/dns-query</string>
            </dict>

            <!-- ProhibitDisablement empirisch 2026-05-27 entfernt: auf unsupervised
                 wirft iOS "Profilfehler: ungültiger Wert" und blockt den gesamten
                 Install. Feld funktioniert nur supervised / MDM-pushed.
                 Trade-off: User kann DNS-Settings manuell auf "Automatisch"
                 zurückstellen → DNS-Lock wird Friction statt Hard-Lock. -->
        </dict>

        <!-- ===================================================================
             2) VPN-MANAGED-PAYLOAD
             Pushed ReBreak's eigenen NEPacketTunnelProvider als Managed-VPN-
             Eintrag. Auf unsupervised + sideloaded:
               ✅ VPN-Eintrag erscheint in Settings → VPN, kann verbunden werden
               ✅ OnDemand-Auto-Connect by default aktiviert
               ❌ OnDemandUserOverrideDisabled wird IGNORIERT (empirisch 2026-05-25)
                 → User KANN "Bedarf verbinden" via Settings ausschalten.
             Konsequenz: Schutz = Friction, nicht Lock. Für echten Toggle-Lock
             muss zusätzlich MDM-Enrollment (siehe UNSUPERVISED-TEST-PLAN.md).
             =================================================================== -->
        <dict>
            <key>PayloadType</key>
            <string>com.apple.vpn.managed</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>PayloadIdentifier</key>
            <string>org.rebreak.protection.iphone.unsupervised.vpn</string>
            <key>PayloadUUID</key>
            <string>2CED6DED-3A38-402B-AC90-ED5CD5058552</string>
            <key>PayloadDisplayName</key>
            <string>ReBreak Schutz-VPN</string>
            <key>PayloadDescription</key>
            <string>Aktiviert den ReBreak-DNS-Filter als auto-verbindenden VPN.</string>

            <key>UserDefinedName</key>
            <string>ReBreak Schutz</string>
            <key>VPNType</key>
            <string>VPN</string>
            <!-- VPNSubType muss bestehende NEPacketTunnel-Extension im
                 installierten ReBreak-App-Bundle treffen. -->
            <key>VPNSubType</key>
            <string>org.rebreak.app.PacketTunnelExtension</string>

            <key>VPN</key>
            <dict>
                <!-- RemoteAddress ist Pflicht. Muss mit App-Code (RebreakProtectionModule.swift)
                     übereinstimmen — lokal-terminierter Tunnel, kein echtes Backend-Concentrator. -->
                <key>RemoteAddress</key>
                <string>ReBreak DNS-Filter (lokal)</string>
                <key>AuthenticationMethod</key>
                <string>Password</string>
                <key>ProviderBundleIdentifier</key>
                <string>org.rebreak.app.PacketTunnelExtension</string>
                <key>ProviderType</key>
                <string>packet-tunnel</string>
                <key>DisconnectOnIdle</key>
                <integer>0</integer>

                <!-- Gesetzt obwohl Apple's MDM-Only-Constraint bekannt ist.
                     Falls Apple das in zukünftigen iOS-Versionen lockert,
                     greift's automatisch. Heute: silent ignored on sideload. -->
                <key>OnDemandUserOverrideDisabled</key>
                <true/>
            </dict>

            <!-- Empty VendorConfig — ErrorCode-15000-Fix von früher (Session 2026-05-25). -->
            <key>VendorConfig</key>
            <dict/>

            <!-- OnDemand-Rules: VPN verbindet automatisch bei jedem Netzwerk-
                 Wechsel. WiFi UND Cellular. -->
            <key>OnDemandEnabled</key>
            <integer>1</integer>
            <key>OnDemandRules</key>
            <array>
                <dict>
                    <key>Action</key>
                    <string>Connect</string>
                    <key>InterfaceTypeMatch</key>
                    <string>WiFi</string>
                </dict>
                <dict>
                    <key>Action</key>
                    <string>Connect</string>
                    <key>InterfaceTypeMatch</key>
                    <string>Cellular</string>
                </dict>
                <dict>
                    <!-- Fallback-Rule für andere Interface-Typen (Tethering, etc.) -->
                    <key>Action</key>
                    <string>Connect</string>
                </dict>
            </array>
        </dict>

        <!-- ===================================================================
             3) RESTRICTIONS-PAYLOAD (informational / supervised-only)
             allowAppRemoval=false greift nur auf supervised Devices.
             Hier defensiv gesetzt für den Fall dass das Profile auf einem
             supervised iPhone landet (z.B. wenn User später Apple Configurator
             einrichtet). Auf unsupervised: ignored.
             =================================================================== -->
        <dict>
            <key>PayloadType</key>
            <string>com.apple.applicationaccess</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>PayloadIdentifier</key>
            <string>org.rebreak.protection.iphone.unsupervised.restrictions</string>
            <key>PayloadUUID</key>
            <string>03797E05-817D-4537-A807-1E977F46EC79</string>
            <key>PayloadDisplayName</key>
            <string>ReBreak Restrictions</string>
            <key>PayloadDescription</key>
            <string>App-Removal-Lock (greift nur auf supervised Devices).</string>

            <key>allowAppRemoval</key>
            <false/>
            <key>allowEraseContentAndSettings</key>
            <false/>
            <key>allowUIConfigurationProfileInstallation</key>
            <false/>
        </dict>

    </array>
</dict>
</plist>
