Skip to content

CM-44179 - Add proper support for disabled modules #124

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

## [Unreleased]

- Add proper support for disabled modules
- Fix auth required state of status bar

## [v1.14.0]

- Add the "Ignore this violation" button for violation card of SCA
Expand Down
16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,39 +65,39 @@
"view/item/context": [
{
"command": "cycode.secretScanForProject",
"when": "viewItem == secretScanTypeNode",
"when": "viewItem == secretScanTypeNode && cycode:modules.isSecretScanningEnabled",
"group": "inline"
},
{
"command": "cycode.scaScan",
"when": "viewItem == scaScanTypeNode",
"when": "viewItem == scaScanTypeNode && cycode:modules.isScaScanningEnabled",
"group": "inline"
},
{
"command": "cycode.iacScanForProject",
"when": "viewItem == iacScanTypeNode",
"when": "viewItem == iacScanTypeNode && cycode:modules.isIacScanningEnabled",
"group": "inline"
},
{
"command": "cycode.sastScanForProject",
"when": "viewItem == sastScanTypeNode",
"when": "viewItem == sastScanTypeNode && cycode:modules.isSastScanningEnabled",
"group": "inline"
},
{
"command": "cycode.secretScanForProject",
"when": "view == cycode.view.tree && viewItem == secretScanTypeNode"
"when": "view == cycode.view.tree && viewItem == secretScanTypeNode && cycode:modules.isSecretScanningEnabled"
},
{
"command": "cycode.scaScan",
"when": "view == cycode.view.tree && viewItem == scaScanTypeNode"
"when": "view == cycode.view.tree && viewItem == scaScanTypeNode && cycode:modules.isScaScanningEnabled"
},
{
"command": "cycode.iacScanForProject",
"when": "view == cycode.view.tree && viewItem == iacScanTypeNode"
"when": "view == cycode.view.tree && viewItem == iacScanTypeNode && cycode:modules.isIacScanningEnabled"
},
{
"command": "cycode.sastScanForProject",
"when": "view == cycode.view.tree && viewItem == sastScanTypeNode"
"when": "view == cycode.view.tree && viewItem == sastScanTypeNode && cycode:modules.isSastScanningEnabled"
}
]
},
Expand Down
2 changes: 1 addition & 1 deletion src/commands/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export const getCommonCommand = (command: (...args: never[]) => void | Promise<v
}

const stateService = container.resolve<IStateService>(StateServiceSymbol);
if (requiredAuth && !stateService.globalState.CliAuthed) {
if (requiredAuth && !stateService.tempState.CliAuthed) {
vscode.window.showErrorMessage('Please authenticate with Cycode first');
return;
}
Expand Down
21 changes: 17 additions & 4 deletions src/commands/run-all-scans-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,27 @@ import { container } from 'tsyringe';
import { CycodeService, ICycodeService } from '../services/cycode-service';
import { CliScanType } from '../cli/models/cli-scan-type';
import { getCommonCommand } from './common';
import { IStateService } from '../services/state-service';
import { StateServiceSymbol } from '../symbols';

export default getCommonCommand(async () => {
const cycodeService = container.resolve<ICycodeService>(CycodeService);
const stateService = container.resolve<IStateService>(StateServiceSymbol);

const scanPromises = [];
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Secret));
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Sca));
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Iac));
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Sast));

if (stateService.tempState.IsSecretScanningEnabled) {
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Secret));
}
if (stateService.tempState.IsScaScanningEnabled) {
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Sca));
}
if (stateService.tempState.IsIacScanningEnabled) {
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Iac));
}
if (stateService.tempState.IsSastScanningEnabled) {
scanPromises.push(cycodeService.startScanForCurrentProject(CliScanType.Sast));
}

await Promise.all(scanPromises);
});
7 changes: 2 additions & 5 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,22 +62,19 @@ export function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(extensionStatusBar);
// end refactor

if (!stateService.globalState.CliAuthed) {
statusBar.showAuthIsRequired();
}

if (config.isTheiaIde) {
stateService.globalState.EnvVsCode = false;
stateService.save();
}

registerCommands(context);
registerActivityBar(context);
registerCodeLensProvider(context);
registerCodeActionsProvider(context);
registerOnDidSaveTextDocument(context);
registerOnDidChangeActiveTextEditor(context);

stateService.tempState.ActivityBar = registerActivityBar(context);

// do not await because it blocks loading of the extension like views rendering
void postActivate().then(() => {
onProjectOpen();
Expand Down
10 changes: 6 additions & 4 deletions src/listeners/on-did-save-text-document.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const OnDidSaveTextDocument = (document: vscode.TextDocument) => {
}

const stateService = container.resolve<IStateService>(StateServiceSymbol);
if (!stateService.globalState.CliAuthed) {
if (!stateService.tempState.CliAuthed) {
return;
}

Expand All @@ -35,16 +35,18 @@ export const OnDidSaveTextDocument = (document: vscode.TextDocument) => {

const cycodeService = container.resolve<ICycodeService>(CycodeService);

if (isSupportedPackageFile(document.fileName)) {
if (stateService.tempState.IsScaScanningEnabled && isSupportedPackageFile(document.fileName)) {
void cycodeService.startScan(CliScanType.Sca, [fileFsPath], false);
}

if (isSupportedIacFile(document.fileName)) {
if (stateService.tempState.IsIacScanningEnabled && isSupportedIacFile(document.fileName)) {
void cycodeService.startScan(CliScanType.Iac, [fileFsPath], false);
}

// run Secrets scan on any saved file. CLI will exclude irrelevant files
void cycodeService.startScan(CliScanType.Secret, [fileFsPath], false);
if (stateService.tempState.IsSecretScanningEnabled) {
void cycodeService.startScan(CliScanType.Secret, [fileFsPath], false);
}
};

export const registerOnDidSaveTextDocument = (context: vscode.ExtensionContext) => {
Expand Down
2 changes: 1 addition & 1 deletion src/listeners/on-project-open.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export const onProjectOpen = () => {
*/

const stateService = container.resolve<IStateService>(StateServiceSymbol);
if (!stateService.globalState.CliAuthed) {
if (!stateService.tempState.CliAuthed) {
return;
}

Expand Down
25 changes: 16 additions & 9 deletions src/services/cli-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as fs from 'node:fs';
import { setSentryUser } from '../sentry';
import { inject, singleton } from 'tsyringe';
import { ExtensionServiceSymbol, LoggerServiceSymbol, ScanResultsServiceSymbol, StateServiceSymbol } from '../symbols';
import { GlobalExtensionState, IStateService } from './state-service';
import { GlobalExtensionState, IStateService, TemporaryExtensionState } from './state-service';
import { ILoggerService } from './logger-service';
import { CliWrapper } from '../cli/cli-wrapper';
import { CliResult, isCliResultError, isCliResultPanic, isCliResultSuccess } from '../cli/models/cli-result';
Expand All @@ -27,6 +27,7 @@ import { CliIgnoreType } from '../cli/models/cli-ignore-type';
import { CliScanType } from '../cli/models/cli-scan-type';
import { StatusResult } from '../cli/models/status-result';
import { AiRemediationResult, AiRemediationResultData } from '../cli/models/ai-remediation-result';
import statusBar from '../utils/status-bar';

export interface ICliService {
getProjectRootDirectory(): string | undefined; // TODO REMOVE
Expand All @@ -47,6 +48,7 @@ export interface ICliService {
@singleton()
export class CliService implements ICliService {
private state: GlobalExtensionState;
private tempState: TemporaryExtensionState;
private cli: CliWrapper;

constructor(@inject(StateServiceSymbol) private stateService: IStateService,
Expand All @@ -55,6 +57,7 @@ export class CliService implements ICliService {
@inject(ExtensionServiceSymbol) private extensionService: IExtensionService,
) {
this.state = this.stateService.globalState;
this.tempState = this.stateService.tempState;
this.cli = new CliWrapper(this.getProjectRootDirectory());
}

Expand All @@ -72,7 +75,7 @@ export class CliService implements ICliService {
return null;
}

this.state.CliInstalled = false;
this.tempState.CliInstalled = false;
this.state.CliVer = null;
this.stateService.save();
}
Expand Down Expand Up @@ -140,15 +143,19 @@ export class CliService implements ICliService {
return;
}

this.state.CliInstalled = true;
this.tempState.CliInstalled = true;
this.tempState.CliAuthed = processedResult.result.isAuthenticated;
this.tempState.CliStatus = processedResult.result;

this.state.CliVer = processedResult.result.version;
this.state.CliAuthed = processedResult.result.isAuthenticated;
this.state.IsAiLargeLanguageModelEnabled = processedResult.result.supportedModules.aiLargeLanguageModel;

this.stateService.save();

if (!this.state.CliAuthed) {
if (!this.tempState.CliAuthed) {
statusBar.showAuthIsRequired();
this.showErrorNotification('You are not authenticated in Cycode. Please authenticate');
} else {
statusBar.showDefault();
if (processedResult.result.userId && processedResult.result.tenantId) {
setSentryUser(processedResult.result.userId, processedResult.result.tenantId);
}
Expand All @@ -167,14 +174,14 @@ export class CliService implements ICliService {
return false;
}

this.state.CliAuthed = processedResult.result.result;
this.tempState.CliAuthed = processedResult.result.result;
this.stateService.save();

if (!this.state.CliAuthed) {
if (!this.tempState.CliAuthed) {
this.showErrorNotification('Authentication failed. Please try again');
}

return this.state.CliAuthed;
return this.tempState.CliAuthed;
}

private mapIgnoreTypeToOptionName(ignoreType: CliIgnoreType): string {
Expand Down
Loading