Skip to content

Commit

Permalink
fix: keychain access controll
Browse files Browse the repository at this point in the history
  • Loading branch information
vanlooverenkoen committed Dec 12, 2023
1 parent 1b53c10 commit 05f4634
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 81 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# 0.10.6

# Fix:
- Keychain should be accessible to all from ci/cd plugin

# 0.10.5

# Fix:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,44 +20,22 @@ class MacOsKeyChainPlugin extends ImpaktfullCliPlugin {
final fullKeyChainName = _fullKeyChainName(keyChainName);
final originalKeyChains = await _getUserKeyChains();
if (originalKeyChains.contains(fullKeyChainName)) {
throw ImpaktfullCliError(
'$fullKeyChainName already exists, make sure to remove it first.');
throw ImpaktfullCliError('$fullKeyChainName already exists, make sure to remove it first.');
}

ImpaktfullCliLogger.debug('Create Apple KeyChain ($fullKeyChainName)');
await processRunner.runProcess([
'security',
'create-keychain',
'-p',
'$globalKeyChainPassword',
fullKeyChainName
]);
await processRunner.runProcess(['security', 'create-keychain', '-p', '$globalKeyChainPassword', fullKeyChainName]);
final keyChain = await _getUserKeyChains();
await processRunner.runProcess([
'security',
'list-keychains',
'-d',
'user',
'-s',
fullKeyChainName,
...keyChain
]);
await processRunner.runProcess(['security', 'list-keychains', '-d', 'user', '-s', fullKeyChainName, ...keyChain]);
}

Future<void> unlockKeyChain(
String keyChainName,
Secret globalKeyChainPassword,
) async {
final fullKeyChainName = _fullKeyChainName(keyChainName);
await processRunner
.runProcess(['security', 'set-keychain-settings', fullKeyChainName]);
await processRunner.runProcess([
'security',
'unlock-keychain',
'-p',
'$globalKeyChainPassword',
fullKeyChainName
]);
await processRunner.runProcess(['security', 'set-keychain-settings', fullKeyChainName]);
await processRunner.runProcess(['security', 'unlock-keychain', '-p', globalKeyChainPassword.value, fullKeyChainName]);
}

Future<void> addCertificateToKeyChain(
Expand All @@ -70,63 +48,39 @@ class MacOsKeyChainPlugin extends ImpaktfullCliPlugin {
],
}) async {
final fullKeyChainName = _fullKeyChainName(keyChainName);
if (accessControlAll) {
await processRunner.runProcess([
'security',
'import',
(certFile.path),
'-k',
fullKeyChainName,
'-P',
certPassword.value,
'-A'
]);
} else if (accessControlApplications.isNotEmpty) {
await processRunner.runProcess([
'security',
'import',
certFile.path,
'-k',
fullKeyChainName,
'-P',
certPassword.value,
await processRunner.runProcess([
'security',
'import',
certFile.path,
'-k',
fullKeyChainName,
'-P',
certPassword.value,
if (accessControlAll) ...[
'-A',
] else ...[
for (final application in accessControlApplications) ...[
...[
'-T',
application,
]
]
]);
} else {
await processRunner.runProcess([
'security',
'import',
certFile.path,
'-k',
fullKeyChainName,
'-P',
certPassword.value
]);
}
],
],
]);
}

Future<void> removeKeyChain(
String keyChainName,
) async {
final fullKeyChainName = _fullKeyChainName(keyChainName);
ImpaktfullCliLogger.debug('Remove Apple KeyChain ($fullKeyChainName)');
await processRunner
.runProcess(['security', 'delete-keychain', fullKeyChainName]);
await processRunner.runProcess(['security', 'delete-keychain', fullKeyChainName]);
}

Future<List<String>> _getUserKeyChains() async {
final keychainsString = await processRunner
.runProcess(['security', 'list-keychains', '-d', 'user']);
final keychainsList =
keychainsString.split('\n').where((element) => element.isNotEmpty);
return keychainsList
.map((keychain) => keychain.replaceAll('"', '').trim())
.toList();
final keychainsString = await processRunner.runProcess(['security', 'list-keychains', '-d', 'user']);
final keychainsList = keychainsString.split('\n').where((element) => element.isNotEmpty);
return keychainsList.map((keychain) => keychain.replaceAll('"', '').trim()).toList();
}

Future<void> printKeyChainList() async {
Expand Down
18 changes: 6 additions & 12 deletions lib/src/integrations/ci_cd/plugin/ci_cd_plugin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,7 @@ class CiCdPlugin extends ImpaktfullPlugin {
if (playStoreUploadConfig != null) {
await playStorePlugin.uploadToPlayStore(
file: file,
serviceAccountCredentialsFile:
playStoreUploadConfig.serviceAccountCredentialsFile,
serviceAccountCredentialsFile: playStoreUploadConfig.serviceAccountCredentialsFile,
);
}
}
Expand Down Expand Up @@ -149,8 +148,7 @@ class CiCdPlugin extends ImpaktfullPlugin {
await testflightPlugin.uploadToTestflightWithEmailPassword(
file: file,
email: testflightUploadConfig.credentials?.userName,
appSpecificPassword:
testflightUploadConfig.credentials?.appSpecificPassword,
appSpecificPassword: testflightUploadConfig.credentials?.appSpecificPassword,
type: testflightUploadConfig.type,
);
}
Expand Down Expand Up @@ -194,16 +192,12 @@ class CiCdPlugin extends ImpaktfullPlugin {
Secret? globalKeyChainPassword,
}) async {
ImpaktfullCliEnvironment.requiresMacOs(reason: 'Building iOS/macOS apps');
final globalKeyChainPasswordSecret = globalKeyChainPassword ??
ImpaktfullCliEnvironmentVariables.getUnlockKeyChainPassword();
final globalKeyChainPasswordSecret = globalKeyChainPassword ?? ImpaktfullCliEnvironmentVariables.getUnlockKeyChainPassword();

await macOsKeyChainPlugin.createKeyChain(
keyChainName, globalKeyChainPasswordSecret);
await macOsKeyChainPlugin.createKeyChain(keyChainName, globalKeyChainPasswordSecret);
try {
await macOsKeyChainPlugin.unlockKeyChain(
keyChainName, globalKeyChainPasswordSecret);
await macOsKeyChainPlugin.addCertificateToKeyChain(
keyChainName, certFile, certPassword);
await macOsKeyChainPlugin.unlockKeyChain(keyChainName, globalKeyChainPasswordSecret);
await macOsKeyChainPlugin.addCertificateToKeyChain(keyChainName, certFile, certPassword, accessControlAll: true);
await onStartBuild();
} catch (e) {
rethrow;
Expand Down

0 comments on commit 05f4634

Please sign in to comment.