- 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/
248 lines
11 KiB
XML
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>
|