summaryrefslogtreecommitdiff
path: root/node_modules/electron-osx-sign/util-provisioning-profiles.js
diff options
context:
space:
mode:
authorLinuxWizard42 <computerwizard@linuxmail.org>2022-10-12 22:54:37 +0300
committerLinuxWizard42 <computerwizard@linuxmail.org>2022-10-12 22:54:37 +0300
commit703e03aba33f234712206769f57717ba7d92d23d (patch)
tree0041f04ccb75bd5379c764e9fe42249fffe75fc3 /node_modules/electron-osx-sign/util-provisioning-profiles.js
parentab6e257e6e9d9a483d7e86f220d8b209a2cd7753 (diff)
downloadFlashRunner-703e03aba33f234712206769f57717ba7d92d23d.tar.gz
FlashRunner-703e03aba33f234712206769f57717ba7d92d23d.tar.zst
Added export_allowed file to make repository visible in cgit
Diffstat (limited to 'node_modules/electron-osx-sign/util-provisioning-profiles.js')
-rw-r--r--node_modules/electron-osx-sign/util-provisioning-profiles.js180
1 files changed, 180 insertions, 0 deletions
diff --git a/node_modules/electron-osx-sign/util-provisioning-profiles.js b/node_modules/electron-osx-sign/util-provisioning-profiles.js
new file mode 100644
index 0000000..a966ee6
--- /dev/null
+++ b/node_modules/electron-osx-sign/util-provisioning-profiles.js
@@ -0,0 +1,180 @@
+/**
+ * @module util-provisioning-profiles
+ */
+
+'use strict'
+
+const path = require('path')
+
+const Promise = require('bluebird')
+const plist = require('plist')
+
+const util = require('./util')
+const debuglog = util.debuglog
+const debugwarn = util.debugwarn
+const getAppContentsPath = util.getAppContentsPath
+const flatList = util.flatList
+const copyFileAsync = util.copyFileAsync
+const execFileAsync = util.execFileAsync
+const lstatAsync = util.lstatAsync
+const readdirAsync = util.readdirAsync
+
+/**
+ * @constructor
+ * @param {string} filePath - Path to provisioning profile.
+ * @param {Object} message - Decoded message in provisioning profile.
+ */
+var ProvisioningProfile = module.exports.ProvisioningProfile = function (filePath, message) {
+ this.filePath = filePath
+ this.message = message
+}
+
+Object.defineProperty(ProvisioningProfile.prototype, 'name', {
+ get: function () {
+ return this.message['Name']
+ }
+})
+
+Object.defineProperty(ProvisioningProfile.prototype, 'platforms', {
+ get: function () {
+ if ('ProvisionsAllDevices' in this.message) return ['darwin'] // Developer ID
+ else if (this.type === 'distribution') return ['mas'] // Mac App Store
+ else return ['darwin', 'mas'] // Mac App Development
+ }
+})
+
+Object.defineProperty(ProvisioningProfile.prototype, 'type', {
+ get: function () {
+ if ('ProvisionedDevices' in this.message) return 'development' // Mac App Development
+ else return 'distribution' // Developer ID or Mac App Store
+ }
+})
+
+/**
+ * Returns a promise resolving to a ProvisioningProfile instance based on file.
+ * @function
+ * @param {string} filePath - Path to provisioning profile.
+ * @param {string} keychain - Keychain to use when unlocking provisioning profile.
+ * @returns {Promise} Promise.
+ */
+var getProvisioningProfileAsync = module.exports.getProvisioningProfileAsync = function (filePath, keychain = null) {
+ var securityArgs = [
+ 'cms',
+ '-D', // Decode a CMS message
+ '-i', filePath // Use infile as source of data
+ ]
+
+ if (keychain) {
+ securityArgs.push('-k', keychain)
+ }
+
+ return execFileAsync('security', securityArgs)
+ .then(function (result) {
+ var provisioningProfile = new ProvisioningProfile(filePath, plist.parse(result))
+ debuglog('Provisioning profile:', '\n',
+ '> Name:', provisioningProfile.name, '\n',
+ '> Platforms:', provisioningProfile.platforms, '\n',
+ '> Type:', provisioningProfile.type, '\n',
+ '> Path:', provisioningProfile.filePath, '\n',
+ '> Message:', provisioningProfile.message)
+ return provisioningProfile
+ })
+}
+
+/**
+ * Returns a promise resolving to a list of suitable provisioning profile within the current working directory.
+ * @function
+ * @param {Object} opts - Options.
+ * @returns {Promise} Promise.
+ */
+var findProvisioningProfilesAsync = module.exports.findProvisioningProfilesAsync = function (opts) {
+ return Promise.map([
+ process.cwd() // Current working directory
+ ], function (dirPath) {
+ return readdirAsync(dirPath)
+ .map(function (name) {
+ var filePath = path.join(dirPath, name)
+ return lstatAsync(filePath)
+ .then(function (stat) {
+ if (stat.isFile()) {
+ switch (path.extname(filePath)) {
+ case '.provisionprofile':
+ return filePath
+ }
+ }
+ return undefined
+ })
+ })
+ })
+ .then(flatList)
+ .map(function (filePath) {
+ return getProvisioningProfileAsync(filePath)
+ .then(function (provisioningProfile) {
+ if (provisioningProfile.platforms.indexOf(opts.platform) >= 0 && provisioningProfile.type === opts.type) return provisioningProfile
+ debugwarn('Provisioning profile above ignored, not for ' + opts.platform + ' ' + opts.type + '.')
+ return undefined
+ })
+ })
+ .then(flatList)
+}
+
+/**
+ * Returns a promise embedding the provisioning profile in the app Contents folder.
+ * @function
+ * @param {Object} opts - Options.
+ * @returns {Promise} Promise.
+ */
+module.exports.preEmbedProvisioningProfile = function (opts) {
+ function embedProvisioningProfile () {
+ if (opts['provisioning-profile']) {
+ debuglog('Looking for existing provisioning profile...')
+ var embeddedFilePath = path.join(getAppContentsPath(opts), 'embedded.provisionprofile')
+ return lstatAsync(embeddedFilePath)
+ .then(function (stat) {
+ debuglog('Found embedded provisioning profile:', '\n',
+ '* Please manually remove the existing file if not wanted.', '\n',
+ '* Current file at:', embeddedFilePath)
+ })
+ .catch(function (err) {
+ if (err.code === 'ENOENT') {
+ // File does not exist
+ debuglog('Embedding provisioning profile...')
+ return copyFileAsync(opts['provisioning-profile'].filePath, embeddedFilePath)
+ } else throw err
+ })
+ }
+ }
+
+ if (opts['provisioning-profile']) {
+ // User input provisioning profile
+ debuglog('`provisioning-profile` passed in arguments.')
+ if (opts['provisioning-profile'] instanceof ProvisioningProfile) {
+ return embedProvisioningProfile()
+ } else {
+ return getProvisioningProfileAsync(opts['provisioning-profile'], opts['keychain'])
+ .then(function (provisioningProfile) {
+ opts['provisioning-profile'] = provisioningProfile
+ })
+ .then(embedProvisioningProfile)
+ }
+ } else {
+ // Discover provisioning profile
+ debuglog('No `provisioning-profile` passed in arguments, will find in current working directory and in user library...')
+ return findProvisioningProfilesAsync(opts)
+ .then(function (provisioningProfiles) {
+ if (provisioningProfiles.length > 0) {
+ // Provisioning profile(s) found
+ if (provisioningProfiles.length > 1) {
+ debuglog('Multiple provisioning profiles found, will use the first discovered.')
+ } else {
+ debuglog('Found 1 provisioning profile.')
+ }
+ opts['provisioning-profile'] = provisioningProfiles[0]
+ } else {
+ // No provisioning profile found
+ debuglog('No provisioning profile found, will not embed profile in app contents.')
+ }
+ })
+ .then(embedProvisioningProfile)
+ }
+}