macPatch-It 1st and 3rd party patching methodology for use with Jamf Pro

FritzsCorner
Contributor III

Hello everyone, I just wanted to share something that myself and @OmahaAdam have been working on for quite some time now. It is our version of a Mac patching system/methodology for use with JAMF Pro with a boring name of macPatch-It. macPatch-It provides a unified UI for both Apple Software updates and 3rd party application updates deployed via JAMF.

2ef88054c30546a2948fb939ec916145

Project is located here:
macPatch-It on GitHub

If you decide to try this, use at your own risk and TEST, TEST, TEST, in a sandbox environment. I can not be held responsible if you publish this into a production environment and the sky starts falling..

This script was put together based off of several other JAMFNation users posts and projects and modified to fit my environments specific needs.

@signetmac @mm2270 @loceee @OmahaAdam

I would not consider myself to be an expert scripter so I would love any constructive feedback from you guys!

26 REPLIES 26

loceee
Contributor

Hey this looks really interesting. Sorry I haven’t looked closer yet!

jwojda
Valued Contributor II

I've had a handful of users reporting that it's not working well with the 10.14.6 update. I added an issue ticket through your github page on it. When I ran

softwareupdate -ia

and then manually rebooted (Apple menu --> Restart) , the device came up with "an error occurred installing the update". when I did it again and chose Apple --> Shutdown and then powered up it seemed to go through.

FritzsCorner
Contributor III

@jwojda There are certain updates that require a shutdown now not just a simple reboot. Not sure if 10.14.6 is one of them. I have been meaning to go back to my GitHub and update the script to account for this.

edit: I haven't integrated this into my script yet but I believe this is what is needed. I haven't looked to see if the updates list report if they require a shutdown or not.

softwareupdate -i -a; shutdown -h now

Thanks for the feedback.

jwojda
Valued Contributor II

I changed the (2) lines with, hopefully that should be sufficient

 /usr/sbin/softwareupdate -ia &

to

softwareupdate -i -a; shutdown -h now &

hdsreid
Contributor III

where do I get cocoa dialog? can't find it anywhere

FritzsCorner
Contributor III

@jwojda Let me know how it goes. I was thinking about adding a warning for updates that required a shutdown if I can query what those updates are.

@hdsreid I am not sure of an active location where it can be downloaded right now unfortunately. I have been planning on updating this to use Pashua but just haven't had the time to get to it yet.

jwojda
Valued Contributor II

@FritzsCorner at first blush it seems that that modification helped, though it was on an older (Mid 2015) silver rMBP and not one of the newer touchbar ones.

Guess I will go find one of those next to test with.

jwojda
Valued Contributor II

@FritzsCorner still not right, now it's not installing anything, any thoughts when an update will be out?

FritzsCorner
Contributor III

@jwojda It may be a few weeks until I have a chance to get back to this. I do have Apple coming on-site this week to review the upcoming Catalina so I will pick his brain on the best way to handle this if the opportunity presents itself.

FritzsCorner
Contributor III

@jwojda I had some time to test 10.14.6 on a handful of Macs through the Mac Patch-It script and didn't encounter the same issue you are reporting. Everything worked as it has in the past. The update indicated a restart was needed, the system went down for a reboot and came back up with 10.14.6. All tests were done from 10.14.5 systems.

leonwun
Contributor

What exactly gets cached at the "cache packages to waiting room" step? Will every update available be cached?

jwojda
Valued Contributor II

@FritzsCorner looks like it's working. shrugs However I've noticed the counter reset is not resetting. once the users get to 0 it doesn't reset the counter after the install, so this re-released 10.14.6 isn't getting a fresh set of defers had about 3-4 people this morning just get it force installed. Full disclosure though, I did have the policy disabled for a few days and re-activated this morning.

FritzsCorner
Contributor III

@leonwun JAMF Packages that you have scoped for deployment will be cached down to the JAMF Waiting Room. The GitHub ReadMe has more details. Apple Updates are downloaded when they are first discovered silently in the background so that when a user is prompted to install it speeds up the process a bit and they aren't waiting for the entire update to download.

FritzsCorner
Contributor III

@jwojda Make sure that the deferral count is actually updating. You can validate this by checking the Deferral count file located here:

/Library/Application Support/macPatchIt/DeferralOptions/DEFERRAL_COUNT

When the user chooses Defer it runs the following function.

# ----------------------------------------------------------------------------------------
# Function:     updateDeferral
# Description:  Updates the Deferral counter and Last Time Stamp
# ----------------------------------------------------------------------------------------
updateDeferral () {
    WriteToLog "user chose to defer" "$LOGFILE"
    WriteToLog "Current Deferral: $1" "$LOGFILE"
    deferCheck=$(($1+1))
    WriteToLog "New Deferral: $deferCheck" "$LOGFILE"
    echo $deferCheck > "$DEFERRAL_COUNT"
    WriteToLog "Setting Deferral Timestamp" "$LOGFILE"
    timeStamp=$(date +"%s")
    echo $timeStamp > "$LAST_DEFERRAL_TIME"
    WriteToLog "Exiting." "$LOGFILE"
    exit 0
}

jwojda
Valued Contributor II

I'm trying this on Catalina and it seems to be having issues...

when I look at the macpatchit.log file it looks like it's running normally, but not listing the update as pending. when I look at the bash -x output it clearly states 10.15.2 is available...

[Tue Dec 10 14:48:43 CST 2019] --------------------------------------------------
[Tue Dec 10 14:48:43 CST 2019] Begin Script
[Tue Dec 10 14:48:43 CST 2019] Installing Icon
[Tue Dec 10 14:48:46 CST 2019] CocoaDialog Found
[Tue Dec 10 14:48:46 CST 2019] Deferral Options Directory not found. Creating now.
[Tue Dec 10 14:48:46 CST 2019] Deferral Count Timer not found. Creating one now.
[Tue Dec 10 14:48:46 CST 2019] Deferral limit not met. Continuing.
[Tue Dec 10 14:48:46 CST 2019] No last deferral time stamp. Might be first run.
[Tue Dec 10 14:48:46 CST 2019] Checking for Available Updates
[Tue Dec 10 14:48:51 CST 2019] Checking for Cached JAMF Packages
[Tue Dec 10 14:48:51 CST 2019] No JAMF Packages found.
[Tue Dec 10 14:48:51 CST 2019] No updates at this time
[Tue Dec 10 14:48:52 CST 2019] Exiting.
Script exit code: 0
Script result: + LOGDIR=/var/log/macPatchIt
+ mkdir -p /var/log/macPatchIt
+ LOGFILE=/var/log/macPatchIt/macPatchIt.log
++ date +%Y-%m-%d_%H-%M
+ TimeStamp=2019-12-10_14-48
++ printf %0.s- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
+ sep=---------------------------------------------------------------------------
+ debugMode=1
+ UPDATES_NO_RESTART=
+ RESTART_REQUIRED=
+ message=
+ JAMFHELPER_PATH='/Library/Application Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper'
+ CD_PATH=<redacted>/cocoaDialog
+ iconsize=72
+ dialogtimeout=900
+ DEFER_LIMIT=5
+ HOURS_TO_DEFER=12
+ DEFERRAL_OPTIONS='/Library/Application Support/macPatchIt/DeferralOptions'
+ DEFERRAL_COUNT='/Library/Application Support/macPatchIt/DeferralOptions/DEFERRAL_COUNT'
+ LAST_DEFERRAL_TIME='/Library/Application Support/macPatchIt/DeferralOptions/LAST_DEFERRAL_TIME'
+ ICON_PATH='/Library/Application Support/JAMF/bin/logo.png'
+ EPOCH_EXT_ATTRIB_ID=77
+ EPOCH_EXT_ATTRIB_NAME='SWU EPOCH'
+ API_AUTH='<redacted>'
+ JAMF_TRIGGER=install_cached_
++ defaults read /Library/Preferences/com.jamfsoftware.jamf.plist jss_url
++ sed 's/.$//'
+ JSSURL=https://<redacted>.
+ WriteToLog -------------------------------------------------- /var/log/macPatchIt/macPatchIt.log
+ lmesg=--------------------------------------------------
+ lfile=/var/log/macPatchIt/macPatchIt.log
+ '[' 1 -eq 1 ']'

+ echo --------------------------------------------------

++ date + echo '[Tue Dec 10 14:48:43 CST 2019] --------------------------------------------------' + WriteToLog 'Begin Script' /var/log/macPatchIt/macPatchIt.log + lmesg='Begin Script' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'Begin Script' Begin Script ++ date + echo '[Tue Dec 10 14:48:43 CST 2019] Begin Script' + '[' -e '/Library/Application Support/JAMF/bin/logo.png' ']' + WriteToLog 'Installing Icon' /var/log/macPatchIt/macPatchIt.log + lmesg='Installing Icon' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'Installing Icon' Installing Icon ++ date + echo '[Tue Dec 10 14:48:43 CST 2019] Installing Icon' + jamf policy -event install_logo Checking for policies triggered by "install_logo" for user "<redacted>"... No policies were found for the "install_logo" trigger. + '[' -e /<redacted>/cocoaDialog ']' + WriteToLog 'CocoaDialog Found' /var/log/macPatchIt/macPatchIt.log + lmesg='CocoaDialog Found' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'CocoaDialog Found' CocoaDialog Found ++ date + echo '[Tue Dec 10 14:48:46 CST 2019] CocoaDialog Found' + '[' '!' -d '/Library/Application Support/macPatchIt/DeferralOptions' ']' + WriteToLog 'Deferral Options Directory not found. Creating now.' /var/log/macPatchIt/macPatchIt.log + lmesg='Deferral Options Directory not found. Creating now.' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'Deferral Options Directory not found. Creating now.' Deferral Options Directory not found. Creating now. ++ date + echo '[Tue Dec 10 14:48:46 CST 2019] Deferral Options Directory not found. Creating now.' + mkdir -p '/Library/Application Support/macPatchIt/DeferralOptions' + '[' -e '/Library/Application Support/macPatchIt/DeferralOptions/DEFERRAL_COUNT' ']' + WriteToLog 'Deferral Count Timer not found. Creating one now.' /var/log/macPatchIt/macPatchIt.log + lmesg='Deferral Count Timer not found. Creating one now.' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'Deferral Count Timer not found. Creating one now.' Deferral Count Timer not found. Creating one now. ++ date + echo '[Tue Dec 10 14:48:46 CST 2019] Deferral Count Timer not found. Creating one now.' + echo 0 ++ cat '/Library/Application Support/macPatchIt/DeferralOptions/DEFERRAL_COUNT' + curDeferral=0 + [[ 0 -ge 5 ]] + WriteToLog 'Deferral limit not met. Continuing.' /var/log/macPatchIt/macPatchIt.log + lmesg='Deferral limit not met. Continuing.' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'Deferral limit not met. Continuing.' Deferral limit not met. Continuing. ++ date + echo '[Tue Dec 10 14:48:46 CST 2019] Deferral limit not met. Continuing.' + execution_period_check + [[ '' = T ue ]] + '[' -e '/Library/Application Support/macPatchIt/DeferralOptions/LAST_DEFERRAL_TIME' ']' + WriteToLog 'No last deferral time stamp. Might be first run.' /var/log/macPatchIt/macPatchIt.log + lmesg='No last deferral time stamp. Might be first run.' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'No last deferral time stamp. Might be first run.' No last deferral time stamp. Might be first run. ++ date + echo '[Tue Dec 10 14:48:46 CST 2019] No last deferral time stamp. Might be first run.' + noDeferralsLeft=False + [[ ! -z '' ]] + get_rec_updates + WriteToLog 'Checking for Available Updates' /var/log/macPatchIt/macPatchIt.log + lmesg='Checking for Available Updates' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'Checking for Available Updates' Checking for Available Updates ++ date + echo '[Tue Dec 10 14:48:46 CST 2019] Checking for Available Updates' ++ softwareupdate --list --recommended + REC_UPDATES='Software Update Tool Finding available software Software Update found the following new or updated software: * Label: macOS 10.15.2 Update- Title: macOS 10.15.2 Update, Version: , Size: 3383383K, Recommended: YES, Action: restart, ' ++ grep recommended ++ grep -v restart + UPDATES_NO_RESTART= ++ grep restart ++ grep -v '*' ++ cut -d , -f 1 + RESTART_REQUIRED=' Title: macOS 10.15.2 Update' ++ grep recommended ++ grep -v '*' ++ cut -d , -f 1 + ALL_SWU= + swu_array=() + IFS= + read -r line ++ echo '' ++ sed 's/^[[:space:]]*//' + update= + swu_array+=("$update") + IFS= + read -r line + WriteToLog 'Checking for Cached JAMF Packages' /var/log/macPatchIt/macPatchIt.log + lmesg='Checking for Cached JAMF Packages' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'Checking for Cached JAMF Packages' Checking for Cached JAMF Packages ++ date + echo '[Tue Dec 10 14:48:51 CST 2019] Checking for Cached JAMF Packages' ++ find '/Library/Application Support/JAMF/Waiting Room/' -type f '(' -name '*.pkg' -or -name '*.dmg' -or -name '*.mpkg' ')' + cachedPkg= + app_array=() + IFS= + read -r line ++ echo '' + app= + ext= + [[ '' == pkg ]] + [[ '' == dmg ]] + [[ '' == mpkg ]] + app_array+=("$app") + IFS= + read -r line + pkg_Reboot=false + [[ '' != '' ]] + WriteToLog 'No JAMF Packages found.' /var/log/macPatchIt/macPatchIt.log + lmesg='No JAMF Packages found.' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'No JAMF Packages found.' No JAMF Packages found. ++ date + echo '[Tue Dec 10 14:48:51 CST 2019] No JAMF Packages found.' + [[ '' = '' ]] + [[ '' = '' ]] + WriteToLog 'No updates at this time' /var/log/macPatchIt/macPatchIt.log + lmesg='No updates at this time' + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo 'No updates at this time' No updates at this time ++ date + echo '[Tue Dec 10 14:48:51 CST 2019] No updates at this time' + remove_from_scope ++ date +%s + epoch=1576010931 ++ system_profiler SPHardwareDataType ++ grep UUID ++ awk '{print $3}' + udid=BF03E5CE-24FA-56F0-AC15-46273430268D + rm -rf '/Library/Application Support/macPatchIt/DeferralOptions' + curl -k -s -X PUT https://<redacted>/subset/extension_attributes -H 'Content-Type: application/xml' -H 'Authorization: <redacted>==' -H 'Accept: application/xml' -d '<computer><extension_attributes><extension_attribute><id>77</id><name>SWU EPOCH</name><type>String</type><value>1576010931</value></extension_attribute></extension_attributes></computer>' + WriteToLog Exiting. /var/log/macPatchIt/macPatchIt.log + lmesg=Exiting. + lfile=/var/log/macPatchIt/macPatchIt.log + '[' 1 -eq 1 ']' + echo Exiting. Exiting. ++ date + echo '[Tue Dec 10 14:48:52 CST 2019] Exiting.' + exit 0

FritzsCorner
Contributor III

@jwojda There are a number of things I need to look into with this. Unfortunately, there are a number of other projects that have kept me from getting back to it. Are you using a NetSUS or standard Apple Updates? If using Apple Updates do you have it set to allow beta versions? With the NetSUS I have not seen the issue you are describing.

My personal biggest issue is with how I implemented the package caching/installation portion and users getting prompted to install the same update due to an orphaned installer. I know how I want to address this but again, I just haven't had the cycles to get back to it.

I do appreciate the feedback and hopefully I will have some time after the holidays to circle back and spend some time on this.

FritzsCorner
Contributor III

@jwojda I am able to replicate this issue on my end as well. I will see if I can pin-point the issue and let you know what I find.

FritzsCorner
Contributor III

@jwojda Well I know what the problem is.. I just need to figure out how to fix it in my script. Apple changed the output for software updates so it is now in this format:

        Software Update Tool

        Finding available software
        Software Update found the following new or updated software:
        * Label: Command Line Tools beta 5 for Xcode-11.0
            Title: Command Line Tools beta 5 for Xcode, Version: 11.0, Size: 224804K, Recommended: YES,
        * Label: macOS Catalina Developer Beta-6
            Title: macOS Catalina Public Beta, Version: 5, Size: 3084292K, Recommended: YES, Action: restart,
        * Label: BridgeOSUpdateCustomer
            Title: BridgeOSUpdateCustomer, Version: 10.15.0.1.1.1560926689, Size: 390674K, Recommended: YES, Action: shut down,
        - Label: iCal-1.0.2
            Title: iCal, Version: 1.0.2, Size: 6520K,

I found an example of parsing this output in Python at the link below, and I will need to do something similar in bash. https://github.com/saltstack/salt/pull/54281/files

I will try to get to this before the holidays but I can't promise anything.

jwojda
Valued Contributor II

@FritzsCorner no problem, thank you for everything!

FritzsCorner
Contributor III

@jwojda I actually had some time to work on this today. Please replace the get_rec_updates() function with the following updated function:

Note: Also added a new function checkCachedJamfPackages() that includes logic to see if a cached package has already been installed to decrease the chance of a user getting repeated prompts to install the same package. I have not added this logic to my GitHub yet. I also still need to add in logic to better handle updates that require a shutdown instead of restart. I will work on that when I have the time. The more I look back at this script the more I see that I need to overhaul, cleanup, and optimize.

# ----------------------------------------------------------------------------------------
# Function:     checkCachedJamfPackages
# Description:  Checks for all JAMF Cached Packages
# ----------------------------------------------------------------------------------------

checkCachedJamfPackages()
{
    # Check for Cached JAMF Pro Packages
    cachedPkg=$(find /Library/Application Support/JAMF/Waiting Room/ -type f ( -name "*.pkg" -or -name "*.dmg" -or -name "*.mpkg" ))

}

# ----------------------------------------------------------------------------------------
# Function:     get_rec_updates
# Description:  Checks the Apple Update Server for list of available Recommended updates.
# ----------------------------------------------------------------------------------------
get_rec_updates() {
    WriteToLog "Checking for Available Updates" "$LOGFILE"
    REC_UPDATES=$(softwareupdate --list --recommended)

    # Check installed macOS Version
    os_ver=$(sw_vers -productVersion)
    IFS='.' read -r -a ver <<< "$os_ver"

    if [[ ${ver[1]} -le "14" ]]; then
        WriteToLog "macOS is not Catalina" "$LOGFILE"
        UPDATES_NO_RESTART=$(grep -v restart <<<"$REC_UPDATES")
        WriteToLog "Updates that don't require restart: $UPDATES_NO_RESTART" "$LOGFILE"

        RESTART_REQUIRED=$(grep restart <<<"$REC_UPDATES" 
            | grep -v '*' 
            | cut -d , -f 1)
        WriteToLog "Updates that require restart: $RESTART_REQUIRED" "$LOGFILE"

        ALL_SWU=$(grep recommended <<<"$REC_UPDATES" 
            | grep -v '*' 
            | cut -d , -f 1)
        WriteToLog "All recommended updates: $ALL_SWU" "$LOGFILE"

    else
        WriteToLog "macOS Catalina is intalled." "$LOGFILE"
        UPDATES_NO_RESTART=$(grep -v restart <<<"$REC_UPDATES" 
            | sed -n -e 's/^.*(Title: )/1/p' 
            | cut -d , -f 1 
            | sed 's/^[^:]*://g')
        WriteToLog "Updates that don't require restart: $UPDATES_NO_RESTART" "$LOGFILE"

        RESTART_REQUIRED=$(grep restart <<<"$REC_UPDATES" 
            | sed -n -e 's/^.*(Title: )/1/p' 
            | cut -d , -f 1 
            | sed 's/^[^:]*://g')
        WriteToLog "Updates that require restart: $RESTART_REQUIRED" "$LOGFILE"

        ALL_SWU=$(grep 'Recommended: YES' <<<"$REC_UPDATES" 
            | sed -n -e 's/^.*(Title: )/1/p' 
            | cut -d , -f 1 
            | sed 's/^[^:]*://g')
        WriteToLog "All recommended updates: $ALL_SWU" "$LOGFILE"
    fi

    # Adding all recommended updates into an array
    swu_array=()
    while IFS= read -r line; do
        update=$(sed 's/^[[:space:]]*//' <<< "$line")
        swu_array+=( "$update" )
    done < <( echo "$ALL_SWU" )

    # 1st Check for Cached JAMF Pro Packages
    WriteToLog "Checking to see if any cached packages are already installed." "$LOGFILE"
    checkCachedJamfPackages

    # Receipt and Cached Packages Paths
    receiptsPath="/Library/Application Support/JAMF/Receipts"
    cachedPath="/Library/Application Support/JAMF/Waiting Room"

    # Check if a cached Package is already installed and if it is, deletes it
    if [[ ! "$cachedPkg" ]]; then
        WriteToLog "No Cached Packages Found" "$LOGFILE"
    else
        app_array=()
            while IFS= read -r line; do
                app=${line#*//}
                receipt="$receiptsPath/$app"
                if [[ -f "$receipt" ]]; then
                    WriteToLog "$app already installed" "$LOGFILE"
                    cachedApp="$cachedPath/$app"
                    WriteToLog "Deleting $app and $app.cache.xml files." "$LOGFILE"
                    rm -rf "$cachedApp"
                    rm -rf "$cachedApp.cache.xml"
                else
                    WriteToLog "$app has not been installed" "$LOGFILE"
                fi
            done < <( echo "$cachedPkg" )
    fi

    # 2nd Check for Cached JAMF Pro Packages
    checkCachedJamfPackages

    app_array=()
    while IFS= read -r line; do
        app=${line#*//}
        ext=${app##*.}
        if [[ "$ext" == "pkg" ]]; then
            app=${app%.pkg}
        elif [[ "$ext" == "dmg" ]]; then
            app=${app%.dmg}
        elif [[ "$ext" == "mpkg" ]]; then
            app=${app%.mpkg}
        fi
        app_array+=( "$app" )
    done < <( echo "$cachedPkg" )

    # If there are no recommended updates, quit
    if [[ "${app_array[@]}" = "" ]] && [[ "${swu_array[@]}" = "" ]]; then
        WriteToLog "No updates at this time" "$LOGFILE"
        description_text="Your Mac is up to date."

        "$JAMFHELPER_PATH" -windowType hud -lockHUD -icon "$ICON_PATH" -heading "No Updates Available" -description "$description_text" -button1 "OK"

        # Computer has no pending recommended updates, so remove computer from scope to prevent repitition
        remove_from_scope
        rm -rf "$DEFERRAL_OPTIONS"
        WriteToLog "Exiting." "$LOGFILE"
        WriteToLog "End Execution" "$LOGFILE"
        WriteToLog "------------------------------------" "$LOGFILE"
        WriteToLog "" "$LOGFILE"
        exit 0
    fi
}

jwojda
Valued Contributor II

@FritzsCorner made the changes this morning, nothings erring out that I've seen. Will let it run a few days and see what shakes loose.

Thank you!

jwojda
Valued Contributor II

@FritzsCorner I know it's been a while, but I've been running with these changes for a while now and they still aren't registering the shutdowns properly. 😞

Captainamerica
Contributor

Just found this and looks very good. Does it work under catalina - would just like some basic patch management for adobe products ec

FritzsCorner
Contributor III

@Captainamerica It does work with Catalina but I haven't had any time to maintain my public Github as of late. I know @jwodja has had some issues with updates that require a shutdown but that is not an issue I have experienced.

I personally haven't tested this process with Adobe Products outside of Adobe Flash.

Captainamerica
Contributor

OK thanks. Isn´t the cocoadialog a discontinued product for a while ? - just think I once read that it could be a bit of security risk continue to having this still in production as no one is updating it

Captainamerica
Contributor

wrong topic...