]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-19337 Support invalid GitHub Private Key in the config check
authorAntoine Vigneau <antoine.vigneau@sonarsource.com>
Thu, 8 Jun 2023 10:10:15 +0000 (12:10 +0200)
committersonartech <sonartech@sonarsource.com>
Thu, 8 Jun 2023 20:03:08 +0000 (20:03 +0000)
server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/config/GithubProvisioningConfigValidator.java
server/sonar-alm-client/src/main/java/org/sonar/alm/client/github/security/GithubAppSecurityImpl.java
server/sonar-alm-client/src/test/java/org/sonar/alm/client/github/config/GithubProvisioningConfigValidatorTest.java

index 3e6bb8f001f12931aba119d3e1093d102ce303df..efa137121c267ae42a30751a304ff8bc09ced7c5 100644 (file)
@@ -39,11 +39,8 @@ import static org.sonar.alm.client.github.config.ConfigCheckResult.InstallationS
 @ComputeEngineSide
 public class GithubProvisioningConfigValidator {
 
-  private static final ConfigStatus APP_NOT_FOUND_STATUS = ConfigStatus.failed("Github App not found");
   private static final String MEMBERS_PERMISSION = "Organization permissions -> Members";
-
   private static final String EMAILS_PERMISSION = "Account permissions -> Email addresses";
-
   private static final ConfigStatus INVALID_APP_CONFIG_STATUS = ConfigStatus.failed("The GitHub App configuration is not complete.");
   private static final ConfigStatus INVALID_APP_ID_STATUS = ConfigStatus.failed("GitHub App ID must be a number.");
   private static final ConfigStatus SUSPENDED_INSTALLATION_STATUS = ConfigStatus.failed("Installation suspended");
@@ -91,6 +88,9 @@ public class GithubProvisioningConfigValidator {
     } catch (HttpException e) {
       return failedApplicationStatus(
         ConfigStatus.failed("Error response from GitHub: " + e.getMessage()));
+    } catch (IllegalArgumentException e) {
+      return failedApplicationStatus(
+        ConfigStatus.failed(e.getMessage()));
     }
   }
 
index 2643012342481795b3bede91575a50b2868a85d3..071328473319de097e04602fabeac88f054becf0 100644 (file)
@@ -97,7 +97,7 @@ public class GithubAppSecurityImpl implements GithubAppSecurity {
         }
       });
     } catch (Exception e) {
-      throw new IllegalArgumentException("Invalid Github Application private key", e);
+      throw new IllegalArgumentException("The Github App private key is not valid", e);
     } finally {
       Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
     }
index e743102c73494f768c0df0fdba4a4d8ebab46bbe..6adc346797341254a8eac33d30c1e425fa658eac 100644 (file)
@@ -48,6 +48,7 @@ public class GithubProvisioningConfigValidatorTest {
 
   private static final String SUCCESS_STATUS = "SUCCESS";
   private static final String GITHUB_CALL_FAILED = "Error response from GitHub: GitHub call failed.";
+  private static final String APP_FETCHING_FAILED = "Exception while fetching the App.";
   private static final String INVALID_APP_ID_STATUS = "GitHub App ID must be a number.";
   private static final String INCOMPLETE_APP_CONFIG_STATUS = "The GitHub App configuration is not complete.";
   private static final String MISSING_EMAIL_PERMISSION = "Missing permissions: Account permissions -> Email addresses";
@@ -79,6 +80,7 @@ public class GithubProvisioningConfigValidatorTest {
     assertThat(checkResult.application().jit()).isEqualTo(ConfigStatus.failed(INVALID_APP_ID_STATUS));
     assertThat(checkResult.installations()).isEmpty();
   }
+
   @Test
   public void checkConfig_whenAppIdNotValid_shouldReturnFailedAppCheck() {
     when(gitHubSettings.appId()).thenReturn("not a number");
@@ -102,7 +104,7 @@ public class GithubProvisioningConfigValidatorTest {
   }
 
   @Test
-  public void checkConfig_whenErrorWhileFetchingTheApp_shouldReturnFailedAppCheck() {
+  public void checkConfig_whenHttpExceptionWhileFetchingTheApp_shouldReturnFailedAppCheck() {
     mockGithubConfiguration();
     ArgumentCaptor<GithubAppConfiguration> appConfigurationCaptor = ArgumentCaptor.forClass(GithubAppConfiguration.class);
 
@@ -118,6 +120,23 @@ public class GithubProvisioningConfigValidatorTest {
     assertThat(checkResult.installations()).isEmpty();
   }
 
+  @Test
+  public void checkConfig_whenIllegalArgumentExceptionWhileFetchingTheApp_shouldReturnFailedAppCheck() {
+    mockGithubConfiguration();
+    ArgumentCaptor<GithubAppConfiguration> appConfigurationCaptor = ArgumentCaptor.forClass(GithubAppConfiguration.class);
+
+    IllegalArgumentException illegalArgumentException = mock(IllegalArgumentException.class);
+    when(illegalArgumentException.getMessage()).thenReturn("Exception while fetching the App.");
+
+    when(githubClient.getApp(appConfigurationCaptor.capture())).thenThrow(illegalArgumentException);
+
+    ConfigCheckResult checkResult = configValidator.checkConfig();
+
+    assertThat(checkResult.application().autoProvisioning()).isEqualTo(ConfigStatus.failed(APP_FETCHING_FAILED));
+    assertThat(checkResult.application().jit()).isEqualTo(ConfigStatus.failed(APP_FETCHING_FAILED));
+    assertThat(checkResult.installations()).isEmpty();
+  }
+
   @Test
   public void checkConfig_whenAppDoesntHaveEmailsPermissions_shouldReturnFailedAppJitCheck() {
     mockGithubConfiguration();