The-Wineskin-Project / WineskinServer

Wineskin
GNU Lesser General Public License v2.1
2.47k stars 170 forks source link

Info.plist replaced during every launch (rendering code signatures invalid) #582

Open indianajson opened 6 months ago

indianajson commented 6 months ago

Environment

Describe the bug

Whenever a wrapper is launched the Info.plist file is updated, even if unchanged. (It appears the actual behavior is that the wrapper is overwriting the Info.plist every time, which is also a problem). Info.plist is one of the files that cannot be modified once the app has been signed with an Apple Developer ID. Because the Info.plist is updated/overwritten upon every launch the code signature for the app becomes invalid and the app gets harassed by Gatekeeper (unless you remove the quarantine flag).

After much effort, I was able to sign and notarize a wrapper, but as soon as it is launched on another device the Info.plist is modified, which causes Gatekeeper to halt execution because the signature/notarization is no longer valid.

Note: I am aware I could simply tell users to remove the quarantine flag or wrap the app in an AppleScript to do the same, however, it appears one of the few remaining barriers to fully supporting Apple notarization is this Info.plist issue.

To Reproduce

  1. Create an empty wrapper named MyCoolWrapper.app.
  2. Add a program of choice.
  3. Show package contents and note down the "Modified" date of Info.plist.
  4. Wait a minute (in order to see the difference in time).
  5. Launch wrapper from MyCoolWrapper.app then close it.
  6. The Info.plist modified date and time will have changed to the last launch rendering the signature invalid, despite the fact that the contents of Info.plist remained unchanged. (The signature is invalidated because the modified timestamp changed).

Attempts to fix

I attempted about half a dozen different "hacky" solutions including: modifying the hex code in wineskinlauncher to remove the Info.plist link, setting Info.plist to read only, setting the Contents directory to read only, using chflags to stop modification. All of these attempts failed either because (1) wineskinlauncher could still replace the file or (2) permissions were so locked down Gatekeeper couldn't remove the quarantine flag.

At this time, I do not know of a workaround for this problem.

Expected behavior

Info.plist should only be modified in the event the Wineskin.app is used to modify a wrapper's settings. Info.plist should not every time the app is normally launched.