From 50d45f33266518f8b097c04a647c1193b2d6a41d Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov <654232+AlexeyTsvetkov@users.noreply.github.com> Date: Tue, 19 Sep 2023 18:48:48 +0300 Subject: [PATCH] Switch to notarytool for notarization (#3642) See https://github.com/JetBrains/compose-multiplatform/pull/3642 for details Resolves #3208 Resolves #2253 --------- Co-authored-by: Michael Rittmeister --- .../dsl/MacOSNotarizationSettings.kt | 13 ++- .../internal/ComposeProjectProperties.kt | 6 +- .../internal/ExternalToolRunner.kt | 8 +- .../internal/configureJvmApplication.kt | 13 +-- .../ValidatedMacOSNotarizationSettings.kt | 14 +-- .../AbstractCheckNotarizationStatusTask.kt | 60 ------------- .../tasks/AbstractNotarizationTask.kt | 65 +++++++++++--- .../AbstractUploadAppForNotarizationTask.kt | 82 ------------------ .../README.md | 81 +++++++++-------- .../notarization-team-id.png | Bin 0 -> 50417 bytes 10 files changed, 125 insertions(+), 217 deletions(-) delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNotarizationStatusTask.kt delete mode 100644 gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractUploadAppForNotarizationTask.kt create mode 100644 tutorials/Signing_and_notarization_on_macOS/notarization-team-id.png diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/MacOSNotarizationSettings.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/MacOSNotarizationSettings.kt index 8e98968e81..2d3929ae66 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/MacOSNotarizationSettings.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/dsl/MacOSNotarizationSettings.kt @@ -9,6 +9,7 @@ import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property import org.gradle.api.provider.ProviderFactory import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Optional import org.jetbrains.compose.desktop.application.internal.ComposeProperties import org.jetbrains.compose.internal.utils.nullableProperty @@ -35,7 +36,15 @@ abstract class MacOSNotarizationSettings { @get:Input @get:Optional + val teamID: Property = objects.nullableProperty().apply { + set(ComposeProperties.macNotarizationTeamID(providers)) + } + + @Deprecated("This option is no longer supported and got replaced by teamID", level = DeprecationLevel.ERROR) + @get:Internal val ascProvider: Property = objects.nullableProperty().apply { - set(ComposeProperties.macNotarizationAscProvider(providers)) + set(providers.provider { + throw UnsupportedOperationException("This option is not supported by notary tool and was replaced by teamID") + }) } -} \ No newline at end of file +} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt index 08123a4125..3c3094495d 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ComposeProjectProperties.kt @@ -19,7 +19,7 @@ internal object ComposeProperties { internal const val MAC_SIGN_PREFIX = "compose.desktop.mac.signing.prefix" internal const val MAC_NOTARIZATION_APPLE_ID = "compose.desktop.mac.notarization.appleID" internal const val MAC_NOTARIZATION_PASSWORD = "compose.desktop.mac.notarization.password" - internal const val MAC_NOTARIZATION_ASC_PROVIDER = "compose.desktop.mac.notarization.ascProvider" + internal const val MAC_NOTARIZATION_TEAM_ID_PROVIDER = "compose.desktop.mac.notarization.teamID" internal const val CHECK_JDK_VENDOR = "compose.desktop.packaging.checkJdkVendor" fun isVerbose(providers: ProviderFactory): Provider = @@ -46,8 +46,8 @@ internal object ComposeProperties { fun macNotarizationPassword(providers: ProviderFactory): Provider = providers.valueOrNull(MAC_NOTARIZATION_PASSWORD) - fun macNotarizationAscProvider(providers: ProviderFactory): Provider = - providers.valueOrNull(MAC_NOTARIZATION_ASC_PROVIDER) + fun macNotarizationTeamID(providers: ProviderFactory): Provider = + providers.valueOrNull(MAC_NOTARIZATION_TEAM_ID_PROVIDER) fun checkJdkVendor(providers: ProviderFactory): Provider = providers.valueOrNull(CHECK_JDK_VENDOR).toBooleanProvider(true) diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ExternalToolRunner.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ExternalToolRunner.kt index c8775f9b26..02b242f3a8 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ExternalToolRunner.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/ExternalToolRunner.kt @@ -11,6 +11,7 @@ import org.gradle.api.provider.Provider import org.gradle.process.ExecOperations import org.gradle.process.ExecResult import org.jetbrains.compose.internal.utils.ioFile +import java.io.ByteArrayInputStream import java.io.File import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -33,7 +34,8 @@ internal class ExternalToolRunner( workingDir: File? = null, checkExitCodeIsNormal: Boolean = true, processStdout: Function1? = null, - logToConsole: LogToConsole = LogToConsole.OnlyWhenVerbose + logToConsole: LogToConsole = LogToConsole.OnlyWhenVerbose, + stdinStr: String? = null ): ExecResult { val logsDir = logsDir.ioFile logsDir.mkdirs() @@ -52,6 +54,10 @@ internal class ExternalToolRunner( // check exit value later spec.isIgnoreExitValue = true + if (stdinStr != null) { + spec.standardInput = ByteArrayInputStream(stdinStr.toByteArray()) + } + @Suppress("NAME_SHADOWING") val logToConsole = when (logToConsole) { LogToConsole.Always -> true diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt index 83707cf8b5..5983ab90fe 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/configureJvmApplication.kt @@ -186,23 +186,13 @@ private fun JvmApplicationContext.configurePackagingTasks( "Unexpected target format for MacOS: $targetFormat" } - val notarizationRequestsDir = project.layout.buildDirectory.dir("compose/notarization/$app") - tasks.register( + tasks.register( taskNameAction = "notarize", taskNameObject = targetFormat.name, args = listOf(targetFormat) ) { dependsOn(packageFormat) inputDir.set(packageFormat.flatMap { it.destinationDir }) - requestsDir.set(notarizationRequestsDir) - configureCommonNotarizationSettings(this) - } - - tasks.register( - taskNameAction = "check", - taskNameObject = "notarizationStatus" - ) { - requestDir.set(notarizationRequestsDir) configureCommonNotarizationSettings(this) } } @@ -351,7 +341,6 @@ private fun JvmApplicationContext.configurePackageTask( internal fun JvmApplicationContext.configureCommonNotarizationSettings( notarizationTask: AbstractNotarizationTask ) { - notarizationTask.nonValidatedBundleID.set(app.nativeDistributions.macOS.bundleID) notarizationTask.nonValidatedNotarizationSettings = app.nativeDistributions.macOS.notarization } diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/validation/ValidatedMacOSNotarizationSettings.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/validation/ValidatedMacOSNotarizationSettings.kt index 501fb162f2..cc635b6b95 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/validation/ValidatedMacOSNotarizationSettings.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/internal/validation/ValidatedMacOSNotarizationSettings.kt @@ -5,25 +5,20 @@ package org.jetbrains.compose.desktop.application.internal.validation -import org.gradle.api.provider.Provider import org.jetbrains.compose.desktop.application.dsl.MacOSNotarizationSettings import org.jetbrains.compose.desktop.application.internal.ComposeProperties internal data class ValidatedMacOSNotarizationSettings( - val bundleID: String, val appleID: String, val password: String, - val ascProvider: String? + val teamID: String? ) -internal fun MacOSNotarizationSettings?.validate( - bundleIDProvider: Provider -): ValidatedMacOSNotarizationSettings { +internal fun MacOSNotarizationSettings?.validate(): ValidatedMacOSNotarizationSettings { checkNotNull(this) { ERR_NOTARIZATION_SETTINGS_ARE_NOT_PROVIDED } - val bundleID = validateBundleID(bundleIDProvider) check(!appleID.orNull.isNullOrEmpty()) { ERR_APPLE_ID_IS_EMPTY } @@ -31,10 +26,9 @@ internal fun MacOSNotarizationSettings?.validate( ERR_PASSWORD_IS_EMPTY } return ValidatedMacOSNotarizationSettings( - bundleID = bundleID, appleID = appleID.orNull!!, password = password.orNull!!, - ascProvider = ascProvider.orNull + teamID = teamID.orNull ) } @@ -50,4 +44,4 @@ private val ERR_PASSWORD_IS_EMPTY = """|$ERR_PREFIX password is null or empty. To specify: | * Use '${ComposeProperties.MAC_NOTARIZATION_PASSWORD}' Gradle property; | * Or use 'nativeDistributions.macOS.notarization.password' DSL property; - """.trimMargin() \ No newline at end of file + """.trimMargin() diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNotarizationStatusTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNotarizationStatusTask.kt deleted file mode 100644 index 1e19b9a1be..0000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractCheckNotarizationStatusTask.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.desktop.application.tasks - -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.tasks.* -import org.jetbrains.compose.desktop.application.internal.ExternalToolRunner -import org.jetbrains.compose.internal.utils.MacUtils -import org.jetbrains.compose.desktop.application.internal.NOTARIZATION_REQUEST_INFO_FILE_NAME -import org.jetbrains.compose.desktop.application.internal.NotarizationRequestInfo -import org.jetbrains.compose.internal.utils.ioFile - -abstract class AbstractCheckNotarizationStatusTask : AbstractNotarizationTask() { - @get:Internal - val requestDir: DirectoryProperty = objects.directoryProperty() - - @TaskAction - fun run() { - val notarization = validateNotarization() - - val requests = HashSet() - for (file in requestDir.ioFile.walk()) { - if (file.isFile && file.name == NOTARIZATION_REQUEST_INFO_FILE_NAME) { - try { - val status = NotarizationRequestInfo() - status.loadFrom(file) - requests.add(status) - } catch (e: Exception) { - logger.error("Invalid notarization request status file: $file", e) - } - } - } - - if (requests.isEmpty()) { - logger.quiet("No existing notarization requests") - return - } - - for (request in requests.sortedBy { it.uploadTime }) { - try { - logger.quiet("Checking status of notarization request '${request.uuid}'") - runExternalTool( - tool = MacUtils.xcrun, - args = listOf( - "altool", - "--notarization-info", request.uuid, - "--username", notarization.appleID, - "--password", notarization.password - ), - logToConsole = ExternalToolRunner.LogToConsole.Always - ) - } catch (e: Exception) { - logger.error("Could not check notarization request '${request.uuid}'", e) - } - } - } -} \ No newline at end of file diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractNotarizationTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractNotarizationTask.kt index 4efbadacdd..ae2a1b6653 100644 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractNotarizationTask.kt +++ b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractNotarizationTask.kt @@ -5,24 +5,67 @@ package org.jetbrains.compose.desktop.application.tasks -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.Nested -import org.gradle.api.tasks.Optional +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.tasks.* import org.jetbrains.compose.desktop.application.dsl.MacOSNotarizationSettings -import org.jetbrains.compose.internal.utils.nullableProperty +import org.jetbrains.compose.desktop.application.dsl.TargetFormat +import org.jetbrains.compose.desktop.application.internal.files.checkExistingFile +import org.jetbrains.compose.desktop.application.internal.files.findOutputFileOrDir +import org.jetbrains.compose.desktop.application.internal.validation.ValidatedMacOSNotarizationSettings import org.jetbrains.compose.desktop.application.internal.validation.validate import org.jetbrains.compose.desktop.tasks.AbstractComposeDesktopTask +import org.jetbrains.compose.internal.utils.MacUtils +import org.jetbrains.compose.internal.utils.ioFile +import java.io.File +import javax.inject.Inject -abstract class AbstractNotarizationTask : AbstractComposeDesktopTask() { +abstract class AbstractNotarizationTask @Inject constructor( @get:Input - @get:Optional - internal val nonValidatedBundleID: Property = objects.nullableProperty() + val targetFormat: TargetFormat +) : AbstractComposeDesktopTask() { @get:Nested @get:Optional internal var nonValidatedNotarizationSettings: MacOSNotarizationSettings? = null - internal fun validateNotarization() = - nonValidatedNotarizationSettings.validate(nonValidatedBundleID) -} \ No newline at end of file + @get:InputDirectory + val inputDir: DirectoryProperty = objects.directoryProperty() + + init { + check(targetFormat != TargetFormat.AppImage) { "${TargetFormat.AppImage} cannot be notarized!" } + } + + @TaskAction + fun run() { + val notarization = nonValidatedNotarizationSettings.validate() + val packageFile = findOutputFileOrDir(inputDir.ioFile, targetFormat).checkExistingFile() + + notarize(notarization, packageFile) + staple(packageFile) + } + + private fun notarize( + notarization: ValidatedMacOSNotarizationSettings, + packageFile: File + ) { + logger.info("Uploading '${packageFile.name}' for notarization") + val args = listOfNotNull( + "notarytool", + "submit", + "--wait", + "--apple-id", + notarization.appleID, + "--team-id".takeIf { notarization.teamID != null }, + notarization.teamID, + packageFile.absolutePath + ) + runExternalTool(tool = MacUtils.xcrun, args = args, stdinStr = notarization.password) + } + + private fun staple(packageFile: File) { + runExternalTool( + tool = MacUtils.xcrun, + args = listOf("stapler", "staple", packageFile.absolutePath) + ) + } +} diff --git a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractUploadAppForNotarizationTask.kt b/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractUploadAppForNotarizationTask.kt deleted file mode 100644 index ebc5e22a4f..0000000000 --- a/gradle-plugins/compose/src/main/kotlin/org/jetbrains/compose/desktop/application/tasks/AbstractUploadAppForNotarizationTask.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2020-2021 JetBrains s.r.o. and respective authors and developers. - * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file. - */ - -package org.jetbrains.compose.desktop.application.tasks - -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.tasks.* -import org.jetbrains.compose.desktop.application.dsl.TargetFormat -import org.jetbrains.compose.desktop.application.internal.* -import org.jetbrains.compose.desktop.application.internal.files.checkExistingFile -import org.jetbrains.compose.desktop.application.internal.files.findOutputFileOrDir -import org.jetbrains.compose.internal.utils.MacUtils -import org.jetbrains.compose.internal.utils.ioFile -import java.io.File -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter -import javax.inject.Inject - -abstract class AbstractUploadAppForNotarizationTask @Inject constructor( - @get:Input - val targetFormat: TargetFormat -) : AbstractNotarizationTask() { - @get:InputDirectory - val inputDir: DirectoryProperty = objects.directoryProperty() - - @get:Internal - val requestsDir: DirectoryProperty = objects.directoryProperty() - - init { - check(targetFormat != TargetFormat.AppImage) { "${TargetFormat.AppImage} cannot be notarized!" } - } - - @TaskAction - fun run() { - val notarization = validateNotarization() - val packageFile = findOutputFileOrDir(inputDir.ioFile, targetFormat).checkExistingFile() - - logger.quiet("Uploading '${packageFile.name}' for notarization (package id: '${notarization.bundleID}')") - val args = arrayListOf( - "altool", - "--notarize-app", - "--primary-bundle-id", notarization.bundleID, - "--username", notarization.appleID, - "--password", notarization.password, - "--file", packageFile.absolutePath - ) - if (notarization.ascProvider != null) { - args.add("--asc-provider") - args.add(notarization.ascProvider) - } - - runExternalTool( - tool = MacUtils.xcrun, - args = args, - processStdout = { output -> - processUploadToolOutput(packageFile, output) - } - ) - } - - private fun processUploadToolOutput(packageFile: File, output: String) { - val m = "RequestUUID = ([A-Za-z0-9\\-]+)".toRegex().find(output) - ?: error("Could not determine RequestUUID from output: $output") - - val requestId = m.groupValues[1] - - val uploadTime = LocalDateTime.now() - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")) - val requestDir = requestsDir.ioFile.resolve("$uploadTime-${targetFormat.id}") - val packageCopy = requestDir.resolve(packageFile.name) - packageFile.copyTo(packageCopy) - val requestInfo = NotarizationRequestInfo(uuid = requestId, uploadTime = uploadTime) - val requestInfoFile = requestDir.resolve(NOTARIZATION_REQUEST_INFO_FILE_NAME) - requestInfo.saveTo(requestInfoFile) - - logger.quiet("Request UUID: $requestId") - logger.quiet("Request UUID is saved to ${requestInfoFile.absolutePath}") - logger.quiet("Uploaded file is saved to ${packageCopy.absolutePath}") - } -} diff --git a/tutorials/Signing_and_notarization_on_macOS/README.md b/tutorials/Signing_and_notarization_on_macOS/README.md index 1a34c473e0..d79be326e5 100644 --- a/tutorials/Signing_and_notarization_on_macOS/README.md +++ b/tutorials/Signing_and_notarization_on_macOS/README.md @@ -221,38 +221,58 @@ The following Gradle properties can be used instead of DSL properties: Those properties could be stored in `$HOME/.gradle/gradle.properties` to use across multiple applications. -### Configuring notarization settings +### Notarization -Notarization is only required for apps outside the App Store. +Distributing your macOS application outside the App Store +requires notarization. +Notarization involves submitting your application to Apple for verification. +If your software passes the verification, +it's signed by Apple, stating that it has been notarized. -``` kotlin -macOS { - notarization { - appleID.set("john.doe@example.com") - password.set("@keychain:NOTARIZATION_PASSWORD") - - // optional - ascProvider.set("") - } -} +To notarize your app, you can use `notarize` task: ``` - -* Set `appleID` to your Apple ID. - * Alternatively, the `compose.desktop.mac.notarization.appleID` Gradle property can be used. -* Set `password` to the app-specific password created previously. - * Alternatively, the `compose.desktop.mac.notarization.password` Gradle property can be used. - * Don't write raw password directly into a build script. - * If the password was added to the keychain, as described previously, it can be referenced as - ``` - @keychain:NOTARIZATION_PASSWORD - ``` -* Set `ascProvider` to your Team ID, if your account is associated with multiple teams. - * Alternatively, the `compose.desktop.mac.notarization.ascProvider` Gradle property can be used. - * To get a table of team IDs associated with a given username and password, run: +./gradlew notarizeDmg \ + -Pcompose.desktop.mac.notarization.appleID= \ + -Pcompose.desktop.mac.notarization.password= \ + -Pcompose.desktop.mac.notarization.teamID= +``` +where: +* `` — your Apple ID; +* `` — the app-specific password created previously; +* `` — your Team. To get a table of team IDs associated with a given username and password, run: ``` xcrun altool --list-providers -u -p " ``` +Team ID + + +The following tasks can be used for notarization: +* `notarizeDmg` — build, sign and notarize `.dmg` installer; +* `notarizeReleaseDmg` — same as `notarizeDmg`, but with [ProGuard](tutorials/Native_distributions_and_local_execution/README.md). +* `notarizePkg` — build, sign and notarize `.pkg` installer; +* `notarizeReleasePkg` — same as `notarizePkg`, but with [ProGuard](tutorials/Native_distributions_and_local_execution/README.md). + +The notarization settings can also be set using the DSL. +For example, it is possible to pass credentials using environment variables: +``` +compose.desktop.application { + nativeDistributions { + macOS { + notarization { + val providers = project.providers + appleID.set(providers.environmentVariable("NOTARIZATION_APPLE_ID")) + password.set(providers.environmentVariable("NOTARIZATION_PASSWORD")) + teamId.set(providers.environmentVariable("NOTARIZATION_TEAM_ID")) + } + } + } +} +``` + +According to Apple, for 98 percent of software notarization completes within 15 minutes. +To learn more on how to avoid long response times, check [the official documentation](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow#3561440). + ### Configuring provisioning profile For testing on TestFlight (when publishing to the App Store), you need to add a provisioning @@ -375,14 +395,3 @@ The following tasks are available: (no separate step is required). * Use `notarize` (e.g. `notarizeDmg`) to upload an application for notarization. Notarization is only required for apps outside the App Store. - Once the upload finishes, a `RequestUUID` will be printed. - The notarization process takes some time. - Once the notarization process finishes, an email will be sent to you. - Uploaded file is saved to `/compose/notarization/main/-` -* Use `checkNotarizationStatus` to check a status of - last notarization requests. You can also use a command-line command to check any notarization request: -``` -xcrun altool --notarization-info - --username - --password "@keychain:NOTARIZATION_PASSWORD" -``` diff --git a/tutorials/Signing_and_notarization_on_macOS/notarization-team-id.png b/tutorials/Signing_and_notarization_on_macOS/notarization-team-id.png new file mode 100644 index 0000000000000000000000000000000000000000..98c81b2e243d2ef9bee1c328b8a437fd798d3e4b GIT binary patch literal 50417 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 O-!+ZvSF$c!1pOa_H;XC& literal 0 HcmV?d00001