Skip to content

Commit a69ec03

Browse files
committed
Add ability to open the query file
This makes it possible to open the query file in the editor when clicking on the query filename. This is a slightly different implementation from the remote queries implementation. The remote queries implementation will send the file path to open to the extension host, and the extension host will simply open the given file path. If someone is able to inject JavaScript into the webview, this would allow them to open an arbitrary file in VSCode. By moving the file path logic to the extension host, we can ensure that we only allow opening the actual query file.
1 parent 2ae9514 commit a69ec03

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

extensions/ql-vscode/src/pure/interface-types.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,10 @@ export interface RequestRepositoryResultsMessage {
464464
repositoryFullName: string;
465465
}
466466

467+
export interface OpenQueryFileMessage {
468+
t: 'openQueryFile';
469+
}
470+
467471
export type ToVariantAnalysisMessage =
468472
| SetVariantAnalysisMessage
469473
| SetRepoResultsMessage
@@ -472,4 +476,5 @@ export type ToVariantAnalysisMessage =
472476
export type FromVariantAnalysisMessage =
473477
| ViewLoadedMsg
474478
| StopVariantAnalysisMessage
475-
| RequestRepositoryResultsMessage;
479+
| RequestRepositoryResultsMessage
480+
| OpenQueryFileMessage;

extensions/ql-vscode/src/remote-queries/variant-analysis-view.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { commands, ExtensionContext, ViewColumn } from 'vscode';
1+
import { commands, ExtensionContext, ViewColumn, window as Window, workspace } from 'vscode';
22
import { AbstractWebview, WebviewPanelConfig } from '../abstract-webview';
33
import { logger } from '../logging';
44
import { FromVariantAnalysisMessage, ToVariantAnalysisMessage } from '../pure/interface-types';
@@ -89,6 +89,9 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
8989
case 'requestRepositoryResults':
9090
void commands.executeCommand('codeQL.loadVariantAnalysisRepoResults', this.variantAnalysisId, msg.repositoryFullName);
9191
break;
92+
case 'openQueryFile':
93+
await this.openQueryFile();
94+
break;
9295
default:
9396
assertNever(msg);
9497
}
@@ -111,4 +114,20 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
111114
variantAnalysis,
112115
});
113116
}
117+
118+
private async openQueryFile(): Promise<void> {
119+
const variantAnalysis = await this.manager.getVariantAnalysis(this.variantAnalysisId);
120+
121+
if (!variantAnalysis) {
122+
void showAndLogWarningMessage('Could not open variant analysis query file');
123+
return;
124+
}
125+
126+
try {
127+
const textDocument = await workspace.openTextDocument(variantAnalysis.query.filePath);
128+
await Window.showTextDocument(textDocument, ViewColumn.One);
129+
} catch (error) {
130+
void showAndLogWarningMessage(`Could not open file: ${variantAnalysis.query.filePath}`);
131+
}
132+
}
114133
}

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ type Props = {
1818
repoResults?: VariantAnalysisScannedRepositoryResult[];
1919
}
2020

21+
const openQueryFile = () => {
22+
vscode.postMessage({
23+
t: 'openQueryFile',
24+
});
25+
};
26+
2127
export function VariantAnalysis({
2228
variantAnalysis: initialVariantAnalysis,
2329
repoStates: initialRepoStates = [],
@@ -68,7 +74,7 @@ export function VariantAnalysis({
6874
<>
6975
<VariantAnalysisHeader
7076
variantAnalysis={variantAnalysis}
71-
onOpenQueryFileClick={() => console.log('Open query')}
77+
onOpenQueryFileClick={openQueryFile}
7278
onViewQueryTextClick={() => console.log('View query')}
7379
onStopQueryClick={() => console.log('Stop query')}
7480
onCopyRepositoryListClick={() => console.log('Copy repository list')}

0 commit comments

Comments
 (0)