rebreak-monorepo/ops/mdm/profiles/rebreak-iphone-unsupervised-sideload.mobileconfig
chahinebrini b31066a04c feat(chat): native action sheet + Insta-style heart for DM messages
- ChatBubble: useActionSheet replaces custom Modal (native iOS popup, Android bottom sheet)
- DM mode (isDM prop): hides like-count, shows Insta-style heart badge under bubble when liked
- Group chat unchanged
- Cleanup: remove unused Modal/Platform imports, sheet styles, actionsOpen state
- deploy.sh: auto-detect ANDROID_HOME + auto-create local.properties for local Gradle
- NEXT_RELEASE.md: DM reactions release note
- Includes other staged work across binder-mac, marketing, ops/mdm, ios/
2026-05-30 09:14:32 +02:00

248 lines
11 KiB
XML

<?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>