@@ -18,18 +18,27 @@ trait ConfiguresVaults
1818{
1919 protected function configureNewVault (): ?array
2020 {
21- // Get available vault classes and build options
2221 $ availableVaults = Keep::getAvailableVaults ();
2322 $ driverOptions = [];
2423 $ vaultClassMap = [];
2524
2625 foreach ($ availableVaults as $ vaultClass ) {
26+ if (!$ vaultClass ::isAvailable ()) {
27+ continue ;
28+ }
2729 $ driver = $ vaultClass ::DRIVER ;
2830 $ name = $ vaultClass ::NAME ;
2931 $ driverOptions [$ driver ] = $ name ;
3032 $ vaultClassMap [$ driver ] = $ vaultClass ;
3133 }
3234
35+ if (empty ($ driverOptions )) {
36+ error ('No vault drivers are available. The AWS SDK is required. ' );
37+ info ('Install it with: composer require aws/aws-sdk-php ' );
38+
39+ return null ;
40+ }
41+
3342 $ selectedDriver = select (
3443 label: 'Which vault driver would you like to use? ' ,
3544 options: $ driverOptions
@@ -79,7 +88,6 @@ protected function configureNewVault(): ?array
7988 info ("✅ {$ friendlyName } vault ' {$ slug }' configured successfully " );
8089
8190 // Reload vault configurations to include the newly saved vault
82- // This ensures the permission tester can find and update the vault
8391 $ container = \STS \Keep \KeepContainer::getInstance ();
8492 $ container ->instance (
8593 \STS \Keep \KeepManager::class,
@@ -88,12 +96,24 @@ protected function configureNewVault(): ?array
8896 \STS \Keep \Data \Collections \VaultConfigCollection::load ()
8997 )
9098 );
91-
92- // Run verify to check and cache permissions for all environments
99+
100+ $ region = $ vaultConfig ['region ' ] ?? 'us-east-1 ' ;
101+ if (!$ this ->checkAwsCredentials ($ region )) {
102+ info ('' );
103+ error ('AWS credentials not found or invalid. ' );
104+ info ('Configure credentials via: ' );
105+ info (' - AWS CLI: aws configure ' );
106+ info (' - Environment variables: AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY ' );
107+ info (' - Instance profile (on EC2/ECS/Lambda) ' );
108+ info ('' );
109+ info ('Skipping permission verification. Run "keep verify" once credentials are configured. ' );
110+
111+ return ['slug ' => $ slug , 'config ' => $ vaultConfig ];
112+ }
113+
93114 info ("\nVerifying vault permissions... " );
94115 $ collection = $ this ->testVaultAcrossEnvs ($ slug );
95-
96- // Display summary of permissions
116+
97117 foreach ($ collection ->groupByEnv () as $ env => $ permissions ) {
98118 $ permission = $ permissions ->first ();
99119 $ permString = empty ($ permission ->permissions ()) ? 'no permissions ' : implode (', ' , $ permission ->permissions ());
@@ -129,6 +149,26 @@ protected function testVaultAcrossEnvs(string $vaultName): PermissionsCollection
129149 return $ collection ;
130150 }
131151
152+ protected function checkAwsCredentials (string $ region ): bool
153+ {
154+ if (!class_exists (\Aws \Sts \StsClient::class)) {
155+ return false ;
156+ }
157+
158+ try {
159+ $ sts = new \Aws \Sts \StsClient ([
160+ 'version ' => 'latest ' ,
161+ 'region ' => $ region ,
162+ 'use_aws_shared_config_files ' => true ,
163+ ]);
164+ $ sts ->getCallerIdentity ();
165+
166+ return true ;
167+ } catch (\Exception ) {
168+ return false ;
169+ }
170+ }
171+
132172 private function generateUniqueSlug (string $ driver ): string
133173 {
134174 $ existingVaults = Keep::getConfiguredVaults ();
0 commit comments