toggle to nullify screentime agent plist

This commit is contained in:
leminlimez
2024-12-06 13:48:06 -05:00
parent 95ea165494
commit 0a97e66756
8 changed files with 82 additions and 20 deletions

View File

@@ -12,7 +12,7 @@ from pymobiledevice3.exceptions import MuxException, PasswordRequiredError
from devicemanagement.constants import Device, Version from devicemanagement.constants import Device, Version
from devicemanagement.data_singleton import DataSingleton from devicemanagement.data_singleton import DataSingleton
from tweaks.tweaks import tweaks, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak, AdvancedPlistTweak, RdarFixTweak from tweaks.tweaks import tweaks, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak, AdvancedPlistTweak, RdarFixTweak, NullifyFileTweak
from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks
from tweaks.basic_plist_locations import FileLocationsList, RiskyFileLocationsList from tweaks.basic_plist_locations import FileLocationsList, RiskyFileLocationsList
from Sparserestore.restore import restore_files, FileToRestore from Sparserestore.restore import restore_files, FileToRestore
@@ -208,8 +208,8 @@ class DeviceManager:
QMessageBox.information(None, "Pairing Reset", "Your device's pairing was successfully reset. Refresh the device list before applying.") QMessageBox.information(None, "Pairing Reset", "Your device's pairing was successfully reset. Refresh the device list before applying.")
def add_skip_setup(self, files_to_restore: list[FileToRestore]): def add_skip_setup(self, files_to_restore: list[FileToRestore], restoring_domains: bool):
if self.skip_setup and not self.get_current_device_supported(): if self.skip_setup and (not self.get_current_device_supported() or restoring_domains):
# add the 2 skip setup files # add the 2 skip setup files
cloud_config_plist: dict = { cloud_config_plist: dict = {
"SkipSetup": ["WiFi", "Location", "Restore", "SIMSetup", "Android", "AppleID", "IntendedUser", "TOS", "Siri", "ScreenTime", "Diagnostics", "SoftwareUpdate", "Passcode", "Biometric", "Payment", "Zoom", "DisplayTone", "MessagingActivationUsingPhoneNumber", "HomeButtonSensitivity", "CloudStorage", "ScreenSaver", "TapToSetup", "Keyboard", "PreferredLanguage", "SpokenLanguage", "WatchMigration", "OnBoarding", "TVProviderSignIn", "TVHomeScreenSync", "Privacy", "TVRoom", "iMessageAndFaceTime", "AppStore", "Safety", "Multitasking", "ActionButton", "TermsOfAddress", "AccessibilityAppearance", "Welcome", "Appearance", "RestoreCompleted", "UpdateCompleted"], "SkipSetup": ["WiFi", "Location", "Restore", "SIMSetup", "Android", "AppleID", "IntendedUser", "TOS", "Siri", "ScreenTime", "Diagnostics", "SoftwareUpdate", "Passcode", "Biometric", "Payment", "Zoom", "DisplayTone", "MessagingActivationUsingPhoneNumber", "HomeButtonSensitivity", "CloudStorage", "ScreenSaver", "TapToSetup", "Keyboard", "PreferredLanguage", "SpokenLanguage", "WatchMigration", "OnBoarding", "TVProviderSignIn", "TVHomeScreenSync", "Privacy", "TVRoom", "iMessageAndFaceTime", "AppStore", "Safety", "Multitasking", "ActionButton", "TermsOfAddress", "AccessibilityAppearance", "Welcome", "Appearance", "RestoreCompleted", "UpdateCompleted"],
@@ -241,7 +241,7 @@ class DeviceManager:
def get_domain_for_path(self, path: str) -> str: def get_domain_for_path(self, path: str) -> str:
# returns Domain: str?, Path: str # returns Domain: str?, Path: str
if self.get_current_device_supported(): if self.get_current_device_supported() and not path.startswith("/var/mobile/"):
# don't do anything on sparserestore versions # don't do anything on sparserestore versions
return None, path return None, path
fully_patched = self.get_current_device_patched() fully_patched = self.get_current_device_patched()
@@ -274,13 +274,6 @@ class DeviceManager:
return None, path return None, path
def concat_file(self, contents: str, path: str, files_to_restore: list[FileToRestore], owner: int = 501, group: int = 501): def concat_file(self, contents: str, path: str, files_to_restore: list[FileToRestore], owner: int = 501, group: int = 501):
if self.get_current_device_supported():
files_to_restore.append(FileToRestore(
contents=contents,
restore_path=path,
owner=owner, group=group
))
else:
domain, file_path = self.get_domain_for_path(path) domain, file_path = self.get_domain_for_path(path)
files_to_restore.append(FileToRestore( files_to_restore.append(FileToRestore(
contents=contents, contents=contents,
@@ -304,6 +297,8 @@ class DeviceManager:
ai_file = None ai_file = None
basic_plists: dict = {} basic_plists: dict = {}
basic_plists_ownership: dict = {} basic_plists_ownership: dict = {}
files_data: dict = {}
uses_domains: bool = False
# set the plist keys # set the plist keys
if not resetting: if not resetting:
@@ -318,6 +313,10 @@ class DeviceManager:
elif isinstance(tweak, BasicPlistTweak) or isinstance(tweak, RdarFixTweak) or isinstance(tweak, AdvancedPlistTweak): elif isinstance(tweak, BasicPlistTweak) or isinstance(tweak, RdarFixTweak) or isinstance(tweak, AdvancedPlistTweak):
basic_plists = tweak.apply_tweak(basic_plists, self.allow_risky_tweaks) basic_plists = tweak.apply_tweak(basic_plists, self.allow_risky_tweaks)
basic_plists_ownership[tweak.file_location] = tweak.owner basic_plists_ownership[tweak.file_location] = tweak.owner
elif isinstance(tweak, NullifyFileTweak):
tweak.apply_tweak(files_data)
if tweak.enabled and tweak.file_location.value.startswith("/var/mobile/"):
uses_domains = True
else: else:
if gestalt_plist != None: if gestalt_plist != None:
gestalt_plist = tweak.apply_tweak(gestalt_plist) gestalt_plist = tweak.apply_tweak(gestalt_plist)
@@ -341,7 +340,7 @@ class DeviceManager:
path="/var/preferences/FeatureFlags/Global.plist", path="/var/preferences/FeatureFlags/Global.plist",
files_to_restore=files_to_restore files_to_restore=files_to_restore
) )
self.add_skip_setup(files_to_restore) self.add_skip_setup(files_to_restore, uses_domains)
if gestalt_data != None: if gestalt_data != None:
self.concat_file( self.concat_file(
contents=gestalt_data, contents=gestalt_data,
@@ -375,6 +374,13 @@ class DeviceManager:
files_to_restore=files_to_restore, files_to_restore=files_to_restore,
owner=ownership, group=ownership owner=ownership, group=ownership
) )
for location, data in files_data.items():
self.concat_file(
contents=data,
path=location.value,
files_to_restore=files_to_restore,
owner=ownership, group=ownership
)
# reset basic tweaks # reset basic tweaks
if resetting: if resetting:
empty_data = plistlib.dumps({}) empty_data = plistlib.dumps({})

View File

@@ -135,6 +135,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.ui.usageTrackingAgentChk.toggled.connect(self.on_usageTrackingAgentChk_clicked) self.ui.usageTrackingAgentChk.toggled.connect(self.on_usageTrackingAgentChk_clicked)
self.ui.gameCenterChk.toggled.connect(self.on_gameCenterChk_clicked) self.ui.gameCenterChk.toggled.connect(self.on_gameCenterChk_clicked)
self.ui.screenTimeChk.toggled.connect(self.on_screenTimeChk_clicked) self.ui.screenTimeChk.toggled.connect(self.on_screenTimeChk_clicked)
self.ui.clearScreenTimeAgentChk.toggled.connect(self.on_clearScreenTimeAgentChk_clicked)
self.ui.crashReportsChk.toggled.connect(self.on_crashReportsChk_clicked) self.ui.crashReportsChk.toggled.connect(self.on_crashReportsChk_clicked)
self.ui.atwakeupChk.toggled.connect(self.on_atwakeupChk_clicked) self.ui.atwakeupChk.toggled.connect(self.on_atwakeupChk_clicked)
self.ui.tipsChk.toggled.connect(self.on_tipsChk_clicked) self.ui.tipsChk.toggled.connect(self.on_tipsChk_clicked)
@@ -760,6 +761,8 @@ class MainWindow(QtWidgets.QMainWindow):
"com.apple.homed", "com.apple.homed",
"com.apple.familycircled" "com.apple.familycircled"
], value=checked) ], value=checked)
def on_clearScreenTimeAgentChk_clicked(self, checked: bool):
tweaks["ClearScreenTimeAgentPlist"].set_enabled(checked)
def on_crashReportsChk_clicked(self, checked: bool): def on_crashReportsChk_clicked(self, checked: bool):
tweaks["Daemons"].set_multiple_values([ tweaks["Daemons"].set_multiple_values([
"com.apple.ReportCrash", "com.apple.ReportCrash",

View File

@@ -3797,6 +3797,18 @@ QComboBox QAbstractItemView::item:hover {
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="clearScreenTimeAgentChk">
<property name="toolTip">
<string>Deletes the Screen Time Agent preferences file to prevent app lockout set via iCloud.
To work properly, also disable the daemon using the toggle above.</string>
</property>
<property name="text">
<string>Clear ScreenTimeAgent.plist file</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QCheckBox" name="crashReportsChk"> <widget class="QCheckBox" name="crashReportsChk">
<property name="toolTip"> <property name="toolTip">

View File

@@ -1993,6 +1993,11 @@ class Ui_Nugget(object):
self.verticalLayout_132.addWidget(self.screenTimeChk) self.verticalLayout_132.addWidget(self.screenTimeChk)
self.clearScreenTimeAgentChk = QCheckBox(self.daemonsPageContent)
self.clearScreenTimeAgentChk.setObjectName(u"clearScreenTimeAgentChk")
self.verticalLayout_132.addWidget(self.clearScreenTimeAgentChk)
self.crashReportsChk = QCheckBox(self.daemonsPageContent) self.crashReportsChk = QCheckBox(self.daemonsPageContent)
self.crashReportsChk.setObjectName(u"crashReportsChk") self.crashReportsChk.setObjectName(u"crashReportsChk")
@@ -3319,6 +3324,12 @@ class Ui_Nugget(object):
self.screenTimeChk.setToolTip(QCoreApplication.translate("Nugget", u"Disables Screen Time monitoring features.", None)) self.screenTimeChk.setToolTip(QCoreApplication.translate("Nugget", u"Disables Screen Time monitoring features.", None))
#endif // QT_CONFIG(tooltip) #endif // QT_CONFIG(tooltip)
self.screenTimeChk.setText(QCoreApplication.translate("Nugget", u"Disable Screen Time Agent", None)) self.screenTimeChk.setText(QCoreApplication.translate("Nugget", u"Disable Screen Time Agent", None))
#if QT_CONFIG(tooltip)
self.clearScreenTimeAgentChk.setToolTip(QCoreApplication.translate("Nugget", u"Deletes the Screen Time Agent preferences file to prevent app lockout set via iCloud.\n"
"\n"
"To work properly, also disable the daemon using the toggle above.", None))
#endif // QT_CONFIG(tooltip)
self.clearScreenTimeAgentChk.setText(QCoreApplication.translate("Nugget", u"Clear ScreenTimeAgent.plist file", None))
#if QT_CONFIG(tooltip) #if QT_CONFIG(tooltip)
self.crashReportsChk.setToolTip(QCoreApplication.translate("Nugget", u"Stops logs, dumps, and crash reports collection.", None)) self.crashReportsChk.setToolTip(QCoreApplication.translate("Nugget", u"Stops logs, dumps, and crash reports collection.", None))
#endif // QT_CONFIG(tooltip) #endif // QT_CONFIG(tooltip)

View File

@@ -1993,6 +1993,11 @@ class Ui_Nugget(object):
self.verticalLayout_132.addWidget(self.screenTimeChk) self.verticalLayout_132.addWidget(self.screenTimeChk)
self.clearScreenTimeAgentChk = QCheckBox(self.daemonsPageContent)
self.clearScreenTimeAgentChk.setObjectName(u"clearScreenTimeAgentChk")
self.verticalLayout_132.addWidget(self.clearScreenTimeAgentChk)
self.crashReportsChk = QCheckBox(self.daemonsPageContent) self.crashReportsChk = QCheckBox(self.daemonsPageContent)
self.crashReportsChk.setObjectName(u"crashReportsChk") self.crashReportsChk.setObjectName(u"crashReportsChk")
@@ -3319,6 +3324,12 @@ class Ui_Nugget(object):
self.screenTimeChk.setToolTip(QCoreApplication.translate("Nugget", u"Disables Screen Time monitoring features.", None)) self.screenTimeChk.setToolTip(QCoreApplication.translate("Nugget", u"Disables Screen Time monitoring features.", None))
#endif // QT_CONFIG(tooltip) #endif // QT_CONFIG(tooltip)
self.screenTimeChk.setText(QCoreApplication.translate("Nugget", u"Disable Screen Time Agent", None)) self.screenTimeChk.setText(QCoreApplication.translate("Nugget", u"Disable Screen Time Agent", None))
#if QT_CONFIG(tooltip)
self.clearScreenTimeAgentChk.setToolTip(QCoreApplication.translate("Nugget", u"Deletes the Screen Time Agent preferences file to prevent app lockout set via iCloud.\n"
"\n"
"To work properly, also disable the daemon using the toggle above.", None))
#endif // QT_CONFIG(tooltip)
self.clearScreenTimeAgentChk.setText(QCoreApplication.translate("Nugget", u"Clear ScreenTimeAgent.plist file", None))
#if QT_CONFIG(tooltip) #if QT_CONFIG(tooltip)
self.crashReportsChk.setToolTip(QCoreApplication.translate("Nugget", u"Stops logs, dumps, and crash reports collection.", None)) self.crashReportsChk.setToolTip(QCoreApplication.translate("Nugget", u"Stops logs, dumps, and crash reports collection.", None))
#endif // QT_CONFIG(tooltip) #endif // QT_CONFIG(tooltip)

View File

@@ -18,6 +18,7 @@ class FileLocation(Enum):
# Daemons # Daemons
disabledDaemons = "/var/db/com.apple.xpc.launchd/disabled.plist" disabledDaemons = "/var/db/com.apple.xpc.launchd/disabled.plist"
screentime = "/var/mobile/Library/Preferences/ScreenTimeAgent.plist"
# Risky Options # Risky Options
ota = "/var/Managed Preferences/mobile/com.apple.MobileAsset.plist" ota = "/var/Managed Preferences/mobile/com.apple.MobileAsset.plist"

View File

@@ -43,6 +43,21 @@ class Tweak:
def apply_tweak(self): def apply_tweak(self):
raise NotImplementedError raise NotImplementedError
class NullifyFileTweak(Tweak):
def __init__(
self, label: str,
file_location: FileLocation,
min_version: Version = Version("1.0"),
owner: int = 501, group: int = 501,
divider_below: bool = False
):
super().__init__(label=label, key=None, value=None, min_version=min_version, owner=owner, group=group, divider_below=divider_below)
self.file_location = file_location
def apply_tweak(self, other_tweaks: dict):
if self.enabled:
other_tweaks[self.file_location] = b""
class BasicPlistTweak(Tweak): class BasicPlistTweak(Tweak):
def __init__( def __init__(

View File

@@ -1,5 +1,5 @@
from devicemanagement.constants import Version from devicemanagement.constants import Version
from .tweak_classes import MobileGestaltTweak, MobileGestaltMultiTweak, MobileGestaltPickerTweak, FeatureFlagTweak, TweakModifyType, BasicPlistTweak, AdvancedPlistTweak, RdarFixTweak from .tweak_classes import MobileGestaltTweak, MobileGestaltMultiTweak, MobileGestaltPickerTweak, FeatureFlagTweak, TweakModifyType, BasicPlistTweak, AdvancedPlistTweak, RdarFixTweak, NullifyFileTweak
from .eligibility_tweak import EligibilityTweak, AITweak from .eligibility_tweak import EligibilityTweak, AITweak
from .basic_plist_locations import FileLocation from .basic_plist_locations import FileLocation
@@ -283,6 +283,9 @@ tweaks = {
}, },
owner=0, group=0 owner=0, group=0
), ),
"ClearScreenTimeAgentPlist": NullifyFileTweak(
"Clear ScreenTimeAgent Plist", FileLocation.screentime
),
## Risky Options ## Risky Options
"DisableOTAFile": AdvancedPlistTweak( "DisableOTAFile": AdvancedPlistTweak(