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

6.0 KiB

ReBreak MDM Profiles

Stand 2026-05-26 — NEFilter-Pivot. iOS-Schutz-Architektur in 2 Schichten:

Schicht Was Wie deployed Removable?
Sideload-Protect App-Removal-Lock + DNS-Backstop AirDrop → Settings → Profil installieren NEIN (Apple Configurator + USB nötig)
MDM-Supervised App-Branch-Signal (NEFilter statt PacketTunnel) NanoMDM Settings-Command (API-Push) JA (User-Enrollment)

Sicherheit ergibt sich aus der Kombination: wenn der User das MDM-Profile entfernt → App fällt still auf PacketTunnel-Pfad zurück (VPN+FC), App selbst bleibt aber gesperrt (Sideload-Protect-Profile blockt Removal).

Files

rebreak-iphone-protect.mobileconfig (Sideload, non-removable)

Pure Restrictions + DNS. Kein MDM-Payload, kein VPN-Payload.

Payloads:

  • com.apple.applicationaccessallowAppRemoval=false, allowEraseContentAndSettings=false, allowUIConfigurationProfileInstallation=false
  • com.apple.dnsSettings.managed — DoH zu dns.rebreak.org/dns-query (Belt+Suspenders falls NEFilter ausfällt)

Voraussetzung: iPhone supervised mit Apple Configurator 2.

Install-Flow:

  1. Datei AirDrop ans iPhone
  2. Settings → Allgemein → VPN & Geräteverwaltung → Profil installieren
  3. Consent + 6-stelliger Geräte-Code

Entfernung: nur via cfgutil remove-profile über USB-Kabel (Mac + Apple Configurator). Settings.app zeigt kein „Profil entfernen"-Button (PayloadRemovalDisallowed).

rebreak-iphone-take-management.json (NanoMDM, Step 1 von 2)

MUSS VOR rebreak-iphone-mdm-supervised.json gepushed werden — sonst wird der Settings-Command vom System ignoriert.

JSON-Payload für InstallApplication mit ChangeManagementState: Managed. Konvertiert eine bereits via TestFlight/AppStore installierte ReBreak-App in den managed State. Erst dann liefert iOS ManagedAppConfiguration an die App.

Auf supervised Geräten (Apple Configurator): KEIN User-Dialog, läuft silent durch.

rebreak-iphone-mdm-supervised.json (NanoMDM, Step 2 von 2)

JSON-Payload für Settings-Command. Setzt mdmSupervised=true in der App-ManagedAppConfiguration (UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed")).

Wirkung: App's isMdmSupervised()-Helper liest trueactivateUrlFilter() startet NEFilterDataProvider statt NEPacketTunnelProvider. KEIN VPN-Eintrag in iOS-Settings, kein User-Toggle.

Vollständiger Push-Flow (NanoMDM)

# Auf rebreak-mdm (178.105.101.137) als root:
ssh rebreak-mdm

# Device-UDID des Test-iPhones (steht im NanoMDM-DB oder Apple Configurator):
DEVICE_UDID="00008140-001A...   "

# Step 1: Take Management of existing TestFlight-App
curl -u nanomdm:$NANO_MDM_API_KEY \
  -X POST "http://localhost:9000/v1/enqueue/$DEVICE_UDID" \
  -H "Content-Type: application/json" \
  -d @rebreak-iphone-take-management.json

# Warte ~5-30s bis APNs ankommt + iPhone das Command processed
# Verify: iPhone → Settings → Allgemein → VPN & Geräteverwaltung →
#   [MDM-Profil] → 'Verwaltete Apps' → ReBreak listed

# Step 2: Push mdmSupervised=true an die jetzt managed App
curl -u nanomdm:$NANO_MDM_API_KEY \
  -X POST "http://localhost:9000/v1/enqueue/$DEVICE_UDID" \
  -H "Content-Type: application/json" \
  -d @rebreak-iphone-mdm-supervised.json

# Force-Quit ReBreak (App-Switcher → swipe up) und neu starten —
# iOS injiziert ManagedAppConfiguration erst beim nächsten App-Launch.

Apple-Doku:

Verifikation in der App

Nach Step 2 + Force-Quit-Restart:

  1. ReBreak öffnen
  2. Beim Aktivieren des Schutzes: System-Dialog sollte „ReBreak möchte Web-Inhalte filtern" zeigen (NEFilter), NICHT „ReBreak möchte einen VPN konfigurieren"
  3. Settings → VPN: kein ReBreak-Eintrag
  4. Settings → Allgemein → VPN & Geräteverwaltung → Filters → ReBreak Content Filter sichtbar (kein User-Toggle, MDM-managed)

Reversal

Step 2 rückgängig: gleiches Settings-Command mit leerer Configuration:

{"RequestType": "Settings", "Settings": [{"Item": "ApplicationConfiguration", "Identifier": "org.rebreak.app", "Configuration": {}}]}

Step 1 rückgängig (App un-manage): RequestType: RemoveApplication mit Identifier: org.rebreak.appVorsicht: löscht die App vom Gerät, je nach ManagementFlags. Für nur „un-manage ohne uninstall" gibt's leider keinen sauberen Apple-Pfad — Reinstall via TestFlight reset's auf unmanaged.

Migration vom alten Profile

Das alte rebreak-iphone-protection.mobileconfig (PayloadIdentifier .20260525) kann nach erfolgreicher Migration entfernt werden:

# Auf dem iPhone via cfgutil:
cfgutil --ecid <ECID> remove-profile "org.rebreak.protection.iphone.20260525"

# Dann neues Profile via AirDrop + Settings installieren.
# Plus MDM-Settings-Command pushen für mdmSupervised=true.

Die alte rebreak-iphone-protection.DEV-removable.mobileconfig bleibt für Dev-Testing erhalten.

NanoMDM Enrollment Generator (per-device)

Wenn mehrere iPhones enrollt werden, darf das gleiche Identity-Cert nicht wiederverwendet werden. NanoMDM blockt das sonst mit cert re-use not permitted (HTTP 500 beim Check-in).

Nutze dafuer den Generator:

ssh rebreak-mdm
cd /srv/rebreak/ops/mdm/profiles

python3 generate-mdm-enrollment-profile.py \
  --device-label iphone-olfa \
  --template /opt/nanomdm/enrollment/rebreak-enrollment.mobileconfig \
  --ca-cert /opt/nanomdm/certs/ca.crt \
  --ca-key /opt/nanomdm/certs/ca.key \
  --out-dir /opt/nanomdm/enrollment/generated \
  --keep-artifacts

Output:

  • Neues .mobileconfig mit frischem PKCS12-Identity-Payload
  • Neue UUIDs fuer alle Payloads
  • .meta.txt mit cert-sha256 + p12-Passwort
  • optional .key/.csr/.crt/.p12 (bei --keep-artifacts)

Wichtig:

  • .meta.txt, .key und .p12 enthalten sensitive Daten -> auf Server behalten, Rechte 600.
  • Pro Geraet immer ein eigenes generiertes Enrollment-Profil verwenden.