diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/properties/PreferencesPage.java b/plugin/src/main/java/io/snyk/eclipse/plugin/properties/PreferencesPage.java index 880516eb..656a269e 100644 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/properties/PreferencesPage.java +++ b/plugin/src/main/java/io/snyk/eclipse/plugin/properties/PreferencesPage.java @@ -12,10 +12,10 @@ import org.eclipse.ui.IWorkbenchPreferencePage; import io.snyk.eclipse.plugin.SnykStartup; -import io.snyk.eclipse.plugin.properties.preferences.ApiClient; import io.snyk.eclipse.plugin.properties.preferences.Preferences; import io.snyk.eclipse.plugin.utils.SnykLogger; import io.snyk.languageserver.LsConfigurationUpdater; +import io.snyk.languageserver.protocolextension.SnykExtendedLanguageClient; public class PreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { private BooleanFieldEditor snykCodeCheckbox; @@ -120,8 +120,8 @@ public boolean performOk() { } private void disableSnykCodeIfOrgDisabled() { - var apiClient = new ApiClient(); - if (snykCodeCheckbox.getBooleanValue() && !apiClient.checkSnykCodeEnablement()) { + boolean isSastEnabled = SnykExtendedLanguageClient.getInstance().getSastEnabled(); + if (snykCodeCheckbox.getBooleanValue() && !isSastEnabled) { String message = "Snyk Code disabled, because it is not enabled for your organization. After you close this preference page, it will stay disabled."; snykCodeCheckbox.setLabelText(snykCodeCheckbox.getLabelText() + " (" + message + ")"); SnykLogger.logInfo(message); diff --git a/plugin/src/main/java/io/snyk/eclipse/plugin/properties/preferences/ApiClient.java b/plugin/src/main/java/io/snyk/eclipse/plugin/properties/preferences/ApiClient.java deleted file mode 100644 index 2052c77f..00000000 --- a/plugin/src/main/java/io/snyk/eclipse/plugin/properties/preferences/ApiClient.java +++ /dev/null @@ -1,85 +0,0 @@ -package io.snyk.eclipse.plugin.properties.preferences; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.snyk.languageserver.LsRuntimeEnvironment; -import io.snyk.languageserver.download.HttpClientFactory; -import io.snyk.languageserver.protocolextension.SnykExtendedLanguageClient; -import io.snyk.languageserver.protocolextension.messageObjects.OAuthToken; - -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.impl.client.CloseableHttpClient; - -import java.io.IOException; - -public class ApiClient { - private final CloseableHttpClient httpClient; - - ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - - private HttpClientContext context; - - public ApiClient() { - this.httpClient = HttpClientFactory.getInstance().create(new LsRuntimeEnvironment()); - this.context = HttpClientFactory.getInstance().getContext(); - } - - public boolean checkSnykCodeEnablement() { - try { - Preferences prefs = Preferences.getInstance(); - if (prefs.getAuthToken().isBlank()) - return false; - if (prefs.getPref(Preferences.ACTIVATE_SNYK_CODE).equals("false")) - return false; - - String endpoint = prefs.getEndpoint(); - if (endpoint == null || endpoint.isBlank()) { - endpoint = "https://snyk.io/api"; - } - String url = "/cli-config/settings/sast"; - String org = prefs.getPref(Preferences.ORGANIZATION_KEY); - if (org != null && !org.isBlank()) { - url += "?org=" + org; - } - var httpGet = new HttpGet(endpoint + url); - if (prefs.getPref(Preferences.AUTHENTICATION_METHOD).equals(Preferences.AUTH_METHOD_TOKEN)) { - httpGet.addHeader("Authorization", "token " + prefs.getAuthToken()); - } else { - // first refresh token - SnykExtendedLanguageClient.getInstance().refreshOAuthToken(); - var oauthToken = objectMapper.readValue(prefs.getAuthToken(), OAuthToken.class); - httpGet.addHeader("Authorization", "bearer " + oauthToken.getAccessToken()); - } - httpGet.addHeader("Content-Type", "application/json"); - var response = httpClient.execute(httpGet, context); - - CliConfigSettings cliConfigSettings = objectMapper.readValue(response.getEntity().getContent(), - CliConfigSettings.class); - boolean sastEnabled = cliConfigSettings.sastEnabled && !cliConfigSettings.localCodeEngine.enabled; - String snykCodeEnablement = String.valueOf(sastEnabled); - prefs.store(Preferences.ACTIVATE_SNYK_CODE, snykCodeEnablement); - return sastEnabled; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @SuppressWarnings("unused") - static class CliConfigSettings { - public boolean sastEnabled; - - public LocalCodeEngine localCodeEngine; - - public boolean reportFalsePositivesEnabled; - } - - /** - * SAST local code engine configuration. - */ - @SuppressWarnings("unused") - static class LocalCodeEngine { - boolean enabled; - } -} diff --git a/plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClient.java b/plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClient.java index 80df422a..d90ff85b 100644 --- a/plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClient.java +++ b/plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClient.java @@ -27,6 +27,7 @@ import org.eclipse.ui.PlatformUI; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import io.snyk.eclipse.plugin.SnykStartup; @@ -39,6 +40,7 @@ import io.snyk.languageserver.protocolextension.messageObjects.SnykIsAvailableCliParams; import io.snyk.languageserver.protocolextension.messageObjects.SnykTrustedFoldersParams; + @SuppressWarnings("restriction") public class SnykExtendedLanguageClient extends LanguageClientImpl { private final ProgressManager progressMgr = new ProgressManager(); @@ -102,6 +104,22 @@ public void triggerAuthentication() { public void trustWorkspaceFolders() { executeCommand("snyk.trustWorkspaceFolders", new ArrayList<>()); } + + public boolean getSastEnabled() { + ExecuteCommandParams params = new ExecuteCommandParams("snyk.getSettingsSastEnabled", new ArrayList<>()); + try { + CompletableFuture lsSastSettings = getConnectedLanguageServer().getWorkspaceService().executeCommand(params); + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + SastSettings sastSettings = mapper.convertValue(lsSastSettings.get(), SastSettings.class); + + return sastSettings.sastEnabled; + } catch (Exception e) { + SnykLogger.logError(e); + } + + return false; + } @JsonNotification(value = "$/snyk.hasAuthenticated") public void hasAuthenticated(HasAuthenticatedParam param) { @@ -216,5 +234,33 @@ public boolean refreshOAuthToken() { var newToken = future.completeOnTimeout(token, 2, TimeUnit.SECONDS).join(); return !token.equals(newToken); } - + + static class SastSettings { + public boolean sastEnabled; + + public LocalCodeEngine localCodeEngine; + + public boolean reportFalsePositivesEnabled; + + public String org; + + public boolean autofixEnabled; + } + + /** + * SAST local code engine configuration. + */ + static class LocalCodeEngine { + public boolean enabled; + + public String url; + } + + public static T convertInstanceOfObject(Object o, Class clazz) { + try { + return clazz.cast(o); + } catch(ClassCastException e) { + return null; + } + } }