1(* 2 3 Licensed to the Apache Software Foundation (ASF) under one 4 or more contributor license agreements. See the NOTICE file 5 distributed with this work for additional information 6 regarding copyright ownership. The ASF licenses this file 7 to you under the Apache License, Version 2.0 (the 8 "License"); you may not use this file except in compliance 9 with the License. You may obtain a copy of the License at 10 11 http://www.apache.org/licenses/LICENSE-2.0 12 13 Unless required by applicable law or agreed to in writing, 14 software distributed under the License is distributed on an 15 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 KIND, either express or implied. See the License for the 17 specific language governing permissions and limitations 18 under the License. 19 20 21 22This script is meant to 23 1) Identify installed instances of the product 24 2) check whether the user has write-access (and if not 25 ask for authentification) 26 3) install the shipped tarball 27*) 28 29-- strings for localisations - to be meant to be replaced 30-- by a makefile or similar 31set OKLabel to "[OKLabel]" 32set InstallLabel to "[InstallLabel]" 33set AbortLabel to "[AbortLabel]" 34set intro to "[IntroText1] 35 36[IntroText2] 37 38[IntroText3]" 39set chooseMyOwn to "[ChooseMyOwnText]" 40set listPrompt to "[ListPromptText]" 41set chooseManual to "[ChooseManualText]" 42set listOKLabel to "[ListOKLabelText]" 43set listCancelLabel to "[ListCancelLabel]" 44set appInvalid to "[AppInvalidText1] 45 46[AppInvalidText2]" -- string will begin with the chosen application's name 47set startInstall to "[StartInstallText1] 48 49[StartInstallText2]" 50set IdentifyQ to "[IdentifyQText] 51 52[IdentifyQText2]" 53set IdentifyYES to "[IdentifyYES]" 54set IdentifyNO to "[IdentifyNO]" 55set installFailed to "[InstallFailedText]" 56set installSignedFailed to "[InstallSignedFailedText]" 57set installComplete to "[InstallCompleteText] 58 59[InstallCompleteText2]" 60 61set sourcedir to (do shell script "dirname " & quoted form of POSIX path of (path to of me)) 62 63display dialog intro buttons {AbortLabel, InstallLabel} default button 2 64 65if (button returned of result) is AbortLabel then 66 return 2 67end if 68 69set the found_ooos_all to (do shell script "mdfind \"kMDItemContentType == 'com.apple.application-bundle' && kMDItemDisplayName == '[PRODUCTNAME]*' && kMDItemDisplayName != '[FULLAPPPRODUCTNAME].app'\"") & " 70" & chooseMyOwn 71 72set found_ooos_all_paragraphs to paragraphs in found_ooos_all 73 74set found_ooos to {} 75repeat with currentApp in found_ooos_all_paragraphs 76 if currentApp does not start with "/Volumes" then 77 copy currentApp to the end of found_ooos 78 end if 79end repeat 80 81-- repeat with oneApp in found_ooos 82-- display dialog oneApp 83-- end repeat 84 85-- the choice returned is of type "list" 86-- Show selection dialog only if more than one or no product was found 87-- The first item is an empty string, if no app was found and no app started with "/Volumes" 88-- The first item is chooseMyOwn, if no app was found and at least one app started with "/Volumes" 89if (get first item of found_ooos as string) is "" then 90 set the choice to (choose from list found_ooos default items (get second item of found_ooos) with prompt listPrompt OK button name listOKLabel cancel button name listCancelLabel) 91 if choice is false then 92 -- do nothing, the user cancelled the installation 93 return 2 --aborted by user 94 else if (choice as string) is chooseMyOwn then 95 -- yeah, one needs to use "choose file", otherwise 96 -- the user would not be able to select the .app 97 set the choice to POSIX path of (choose file with prompt chooseManual of type "com.apple.application-bundle" without showing package contents and invisibles) 98 end if 99else if (get first item of found_ooos as string) is chooseMyOwn then 100 set the choice to (choose from list found_ooos default items (get first item of found_ooos) with prompt listPrompt OK button name listOKLabel cancel button name listCancelLabel) 101 if choice is false then 102 -- do nothing, the user cancelled the installation 103 return 2 --aborted by user 104 else if (choice as string) is chooseMyOwn then 105 -- yeah, one needs to use "choose file", otherwise 106 -- the user would not be able to select the .app 107 set the choice to POSIX path of (choose file with prompt chooseManual of type "com.apple.application-bundle" without showing package contents and invisibles) 108 end if 109else if (get second item of found_ooos as string) is chooseMyOwn then 110 -- set choice to found installation 111 -- set the choice to (get first paragraph of found_ooos) 112 set the choice to (get first item of found_ooos) 113else 114 set the choice to (choose from list found_ooos default items (get first item of found_ooos) with prompt listPrompt OK button name listOKLabel cancel button name listCancelLabel) 115 if choice is false then 116 -- do nothing, the user cancelled the installation 117 return 2 --aborted by user 118 else if (choice as string) is chooseMyOwn then 119 -- yeah, one needs to use "choose file", otherwise 120 -- the user would not be able to select the .app 121 set the choice to POSIX path of (choose file with prompt chooseManual of type "com.apple.application-bundle" without showing package contents and invisibles) 122 end if 123end if 124 125-- now only check whether the path is really from [PRODUCTNAME] 126try 127 do shell script "grep '<string>[PRODUCTNAME] [PRODUCTVERSION]' " & quoted form of (choice as string) & "/Contents/Info.plist" 128on error 129 display dialog (choice as string) & appInvalid buttons {InstallLabel} default button 1 with icon 0 130 return 3 --wrong target-directory 131end try 132 133-- Adding files below Contents would break a sealed application. Test for the seal 134-- itself: codesign --display also accepts the linker's ad-hoc signature on arm64. 135try 136 do shell script "test -e " & quoted form of ((choice as string) & "/Contents/_CodeSignature/CodeResources") 137 display dialog installSignedFailed buttons {OKLabel} default button 1 with icon 0 138 return 4 139on error 140 -- Unsigned legacy installations can still accept the traditional language pack. 141end try 142 143(* 144display dialog startInstall buttons {AbortLabel, InstallLabel} default button 2 145 146if (button returned of result) is AbortLabel then 147 return 2 148end if 149*) 150 151set tarCommand to "/usr/bin/tar -C " & quoted form of (choice as string) & " -xjf " & quoted form of sourcedir & "/tarball.tar.bz2" 152try 153 do shell script tarCommand 154 155on error errMSG number errNUM 156 display dialog IdentifyQ buttons {IdentifyYES, IdentifyNO} with icon 2 157 if (button returned of result) is IdentifyYES then 158 try 159 do shell script tarCommand with administrator privileges 160 on error errMSG number errNUM 161 display dialog installFailed buttons {OKLabel} default button 1 with icon 0 162 -- -60005 username/password wrong 163 -- -128 aborted by user 164 -- 2 error from tar - tarball not found (easy to test) 165 return errNUM 166 end try 167 else 168 return 2 -- aborted by user 169 end if 170end try 171 172display dialog installComplete buttons {OKLabel} default button 1 173