Android self-bind protection auf nahezu MDM-Niveau ohne Device-Owner: - Device-Admin (RebreakDeviceAdminReceiver) blockt Uninstall OS-seitig, aktiv ab Boot ohne Prozess/a11y. Deaktivierung nur via 24h-Cooldown (removeDeviceAdmin in forceDisable). a11y blockt die DeviceAdminAdd-Settings-Seite (Class-Match, auf Samsung One UI per Logcat verifiziert). - Boot-Receiver (RebreakVpnBootReceiver) startet VPN+a11y nach Reboot, damit der Tamper-Lock ohne manuellen App-Start hochkommt. - Manifest-Wiring (Device-Admin-Receiver, Boot-Receiver, RECEIVE_BOOT_COMPLETED, device_admin.xml) ins with-rebreak-protection-android Config-Plugin verlagert → ueberlebt 'expo prebuild' (android/ ist gitignored). - a11y-Detection zurueck auf die funktionierende Version: zu breites 'loeschen'- Uninstall-Keyword raus (blockte halbe Settings); a11y-Label jetzt 'ReBreak Schutz'. - a11y-Deeplink behaelt den Samsung-Step-Guide (openAccessibilitySettings). Session-Frontend in diesem Batch: - Avatar-Placeholder: neutrales clarity-avatar-line SVG statt dominantem Blau. - DiGA-Milestone folgt kumulativen protectedDays (erreicht rueckfall-anfaellige User). - Dev-Build crasht nicht mehr ohne CallKit-Native-Modul. - VPN-Permission-Dialog nur noch im Bypass-Fall. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
112 lines
2.6 KiB
TypeScript
112 lines
2.6 KiB
TypeScript
/**
|
|
* Web-Stub. Ergibt im Browser keinen funktionalen Schutz — der Filter ist
|
|
* inhärent device-bound. Verhindert nur dass Imports auf Web crashen.
|
|
*/
|
|
import { registerWebModule, NativeModule } from 'expo';
|
|
|
|
import type {
|
|
ActivateResult,
|
|
DeviceLayers,
|
|
DisableResult,
|
|
HealthProbeResult,
|
|
RebreakProtectionEvents,
|
|
SyncBlocklistResult,
|
|
} from './RebreakProtection.types';
|
|
|
|
class RebreakProtectionModuleWeb extends NativeModule<RebreakProtectionEvents> {
|
|
async activate(): Promise<ActivateResult> {
|
|
return { allLayersOn: false, missingLayers: [] };
|
|
}
|
|
|
|
async disable(): Promise<DisableResult> {
|
|
return { allLayersOff: true };
|
|
}
|
|
|
|
async getDeviceState(): Promise<DeviceLayers> {
|
|
return { blocklistCount: 0, blocklistLastSyncAt: null };
|
|
}
|
|
|
|
// iOS Layer 2 — webContent-Filter. Auf Web inhärent ohne Funktion.
|
|
async applyWebContentFilter() {
|
|
return { enabled: false, appliedCount: 0, region: '', error: 'web_stub' };
|
|
}
|
|
|
|
async clearWebContentFilter() {
|
|
return { cleared: false, error: 'web_stub' };
|
|
}
|
|
|
|
async syncWebContentDomains() {
|
|
return { updated: false };
|
|
}
|
|
|
|
async syncBlocklist(): Promise<SyncBlocklistResult> {
|
|
return { updated: false, count: 0 };
|
|
}
|
|
|
|
async runHealthProbe(): Promise<HealthProbeResult> {
|
|
return {
|
|
outcome: 'offline',
|
|
reason: 'web_stub',
|
|
durationMs: 0,
|
|
target: '',
|
|
};
|
|
}
|
|
|
|
async openSystemSettings(): Promise<void> {
|
|
// no-op
|
|
}
|
|
|
|
// Android-only stubs (Web nutzt keinen davon, aber Type-Compat).
|
|
async isAccessibilityEnabled() {
|
|
return { enabled: false };
|
|
}
|
|
async openAccessibilitySettings() {
|
|
return { opened: false };
|
|
}
|
|
async dismissAccessibilityHint() {
|
|
// no-op
|
|
}
|
|
async openPowerDialog() {
|
|
return { opened: false };
|
|
}
|
|
async armTamperLock() {
|
|
return { armed: false };
|
|
}
|
|
async disarmTamperLock() {
|
|
return { armed: false };
|
|
}
|
|
async getProtectionStatus() {
|
|
return {
|
|
vpnEnabled: false,
|
|
accessibilityEnabled: false,
|
|
blocklistCount: 0,
|
|
tamperArmed: false,
|
|
};
|
|
}
|
|
async reconcileVpn() {
|
|
return { restarted: false };
|
|
}
|
|
async reconcileUrlFilter() {
|
|
return { recreated: false };
|
|
}
|
|
async requestDeviceAdmin() {
|
|
return { launched: false };
|
|
}
|
|
async isDeviceAdminActive() {
|
|
return { active: false };
|
|
}
|
|
async removeDeviceAdmin() {
|
|
return { removed: false };
|
|
}
|
|
|
|
async probeContentFilter() {
|
|
return { enabled: false, error: 'web_stub' };
|
|
}
|
|
|
|
async isNeFilterActive() {
|
|
return { enabled: false };
|
|
}
|
|
}
|
|
|
|
export default registerWebModule(RebreakProtectionModuleWeb, 'RebreakProtection');
|