diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e0598987..36ba1b114 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ - Add Serial Number Spoofing - For recycled machines where MDM was mistakenly left on - Add sys_patch file validation during CI +- Add GUI Prompt for booting mismatched OpenCore configs + - ex. Booting MacBookPro8,1 config on MacBookPro11,1 ## 0.4.4 - Lower SIP requirement for Root Patching diff --git a/gui/gui_main.py b/gui/gui_main.py index 7299e8d5a..f0a43150a 100644 --- a/gui/gui_main.py +++ b/gui/gui_main.py @@ -66,8 +66,6 @@ class wx_python_gui: if current_uid == 0: self.file_menu.Enable(wx.ID_REDO, False) - # Spawn thread to check for updates - threading.Thread(target=self.check_for_updates).start() self.main_menu(None) wx.CallAfter(self.frame.Close) @@ -78,11 +76,11 @@ class wx_python_gui: self.app.ExitMainLoop() sys.exit() - def reboot_system(self, event=None): + def reboot_system(self, event=None, message=""): self.popup = wx.MessageDialog( self.frame, - "Root Patcher finished successfully\nWould you like to reboot now?", - "Reboot to apply patches?", + message, + "Reboot to apply?", wx.YES_NO | wx.ICON_INFORMATION ) self.popup.SetYesNoLabels("Reboot", "Ignore") @@ -97,6 +95,24 @@ class wx_python_gui: self.frame.SetSize(self.WINDOW_WIDTH_MAIN, self.WINDOW_HEIGHT_MAIN) sys.stdout = self.stock_stdout sys.stderr = self.stock_stderr + + def preflight_check(self): + if ( + self.constants.computer.build_model != None and + self.constants.computer.build_model != self.constants.computer.real_model + ): + # Notify user they're booting an unsupported configuration + self.constants.start_build_install = True + self.popup = wx.MessageDialog( + self.frame, + f"We found you are currently booting OpenCore built for a different unit: {self.constants.computer.build_model}\n\nWe builds configs to match individual units and cannot be mixed or reused with different Macs.\n\nPlease Build and Install a new OpenCore config, and reboot your Mac.", + "Unsupported Configuration Detected!", + style = wx.OK | wx.ICON_EXCLAMATION + ) + self.popup.ShowModal() + else: + # Spawn thread to check for updates + threading.Thread(target=self.check_for_updates).start() def check_for_updates(self, event=None): ignore_updates = subprocess.run(["defaults", "read", "com.dortania.opencore-legacy-patcher-wxpython", "IgnoreAppUpdates"], capture_output=True).stdout.decode("utf-8").strip() @@ -361,16 +377,16 @@ class wx_python_gui: ) ) - + self.preflight_check() if self.finished_auto_patch is False: - if "--gui_patch" in sys.argv: + if self.constants.start_build_install is True: + self.build_install_menu() + elif "--gui_patch" in sys.argv: self.patches = sys_patch_detect.detect_root_patch(self.computer.real_model, self.constants).detect_patch_set() self.root_patch_start() elif "--gui_unpatch" in sys.argv: self.patches = sys_patch_detect.detect_root_patch(self.computer.real_model, self.constants).detect_patch_set() self.root_patch_revert() - elif self.constants.start_build_install is True: - self.build_install_menu() self.finished_auto_patch = True self.constants.start_build_install = False @@ -709,15 +725,17 @@ class wx_python_gui: # Centre the text box to top of window self.stdout_text.Centre(wx.HORIZONTAL) self.stdout_text.SetValue("") - sys.stdout=menu_redirect.RedirectText(self.stdout_text, False) - sys.stderr=menu_redirect.RedirectText(self.stdout_text, False) # Update frame height to right below self.frame.SetSize(self.WINDOW_WIDTH_BUILD, self.stdout_text.GetPosition().y + self.stdout_text.GetSize().height + 40) self.frame.Show() - install.tui_disk_installation(self.constants).install_opencore(partition) + sys.stdout=menu_redirect.RedirectText(self.stdout_text, False) + sys.stderr=menu_redirect.RedirectText(self.stdout_text, False) + result = install.tui_disk_installation(self.constants).install_opencore(partition) + sys.stdout=sys.__stdout__ + sys.stderr=sys.__stderr__ self.return_to_main_menu = wx.Button(self.frame, label="Return to Main Menu") self.return_to_main_menu.SetPosition( @@ -732,6 +750,9 @@ class wx_python_gui: self.frame.SetSize(self.WINDOW_WIDTH_BUILD, self.return_to_main_menu.GetPosition().y + self.return_to_main_menu.GetSize().height + 40) + if result is True: + self.reboot_system(message="OpenCore has finished installing to disk.\n\nYou will need to reboot and hold the Option key and select OpenCore/Boot EFI's option.\n\nWould you like to reboot?") + def root_patch_menu(self, event=None): # Define Menu # Header: Post-Install Menu @@ -966,7 +987,7 @@ class wx_python_gui: sys.stderr = self.stock_stderr if self.constants.root_patcher_succeded is True: print("- Root Patcher finished successfully") - self.reboot_system() + self.reboot_system(message="Root Patcher finished successfully\nWould you like to reboot now?") self.return_to_main_menu.Enable() wx.GetApp().Yield() @@ -1048,7 +1069,7 @@ class wx_python_gui: sys.stderr = self.stock_stderr if self.constants.root_patcher_succeded is True: print("- Root Patcher finished successfully") - self.reboot_system() + self.reboot_system(message="Root Patcher finished successfully\nWould you like to reboot now?") self.return_to_main_menu.Enable() wx.GetApp().Yield() diff --git a/payloads/Config/config.plist b/payloads/Config/config.plist index 260029be6..84249a3df 100644 --- a/payloads/Config/config.plist +++ b/payloads/Config/config.plist @@ -1771,11 +1771,12 @@ 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102 OCLP-Version + OCLP-Model OCLP-Settings - revcpu - revcpuname OCLP-Spoofed-SN OCLP-Spoofed-MLB + revcpu + revcpuname 7C436110-AB2A-4BBB-A880-FE41995C9F82 diff --git a/resources/build.py b/resources/build.py index c3f373844..df8dd3780 100644 --- a/resources/build.py +++ b/resources/build.py @@ -104,6 +104,7 @@ class BuildOpenCore: self.config["#Revision"]["OpenCore-Version"] = f"{self.constants.opencore_version} - {self.constants.opencore_build} - {self.constants.opencore_commit}" self.config["#Revision"]["Original-Model"] = self.model self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Version"] = f"{self.constants.patcher_version}" + self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Model"] = self.model for name, version, path, check in [ # Essential kexts diff --git a/resources/device_probe.py b/resources/device_probe.py index a3caa6635..d1e7bc404 100644 --- a/resources/device_probe.py +++ b/resources/device_probe.py @@ -457,6 +457,7 @@ class Computer: real_board_id: Optional[str] = None reported_model: Optional[str] = None reported_board_id: Optional[str] = None + build_model: Optional[str] = None gpus: list[GPU] = field(default_factory=list) igpu: Optional[GPU] = None # Shortcut for IGPU dgpu: Optional[GPU] = None # Shortcut for GFX0 @@ -683,6 +684,7 @@ class Computer: # Real model self.real_model = utilities.get_nvram("oem-product", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=True) or self.reported_model self.real_board_id = utilities.get_nvram("oem-board", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=True) or self.reported_board_id + self.build_model = utilities.get_nvram("OCLP-Model", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=True) # OCLP version self.oclp_version = utilities.get_nvram("OCLP-Version", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=True) diff --git a/resources/install.py b/resources/install.py index 3adcf789a..9478fa1c9 100644 --- a/resources/install.py +++ b/resources/install.py @@ -207,7 +207,7 @@ Please build OpenCore first!""" choice = input("\nWould you like to still install OpenCore to this drive?(y/n): ") if not choice in ["y", "Y", "Yes", "yes"]: subprocess.run(["diskutil", "umount", mount_path], stdout=subprocess.PIPE).stdout.decode().strip().encode() - return + return False if (mount_path / Path("EFI/OC")).exists(): print("- Removing preexisting EFI/OC folder") shutil.rmtree(mount_path / Path("EFI/OC"), onerror=rmtree_handler) @@ -255,6 +255,8 @@ Please build OpenCore first!""" tui_helpers.TUIOnlyPrint(["Copying OpenCore"], "Press [Enter] to go back.\n", ["EFI failed to mount!"]).start() else: print("EFI failed to mount!") + return False + return True def rmtree_handler(func, path, exc_info): if exc_info[0] == FileNotFoundError: