@@ -502,6 +502,32 @@ export function fromRepoUri(uri: vscode.Uri): RepoUriParams | undefined {
502502 } catch ( e ) { }
503503}
504504
505+ const ownerRegex = / ^ (? ! - ) (? ! .* - - ) [ a - z A - Z 0 - 9 - ] + (?< ! - ) $ / ;
506+ const repoRegex = / ^ [ a - z A - Z 0 - 9 _ . - ] + $ / ;
507+
508+ function validateOpenWebviewParams ( owner ?: string , repo ?: string , number ?: string ) : boolean {
509+ if ( ! owner || ! repo || ! number ) {
510+ return false ;
511+ }
512+ const asNumber = Number ( number ) ;
513+ if ( isNaN ( asNumber ) || asNumber <= 0 ) {
514+ return false ;
515+ }
516+ if ( isNaN ( Number ( number ) ) ) {
517+ return false ;
518+ }
519+ if ( owner . length === 0 || repo . length === 0 ) {
520+ return false ;
521+ }
522+ if ( ! ownerRegex . test ( owner ) ) {
523+ return false ;
524+ }
525+ if ( ! repoRegex . test ( repo ) ) {
526+ return false ;
527+ }
528+ return true ;
529+ }
530+
505531export enum UriHandlerPaths {
506532 OpenIssueWebview = '/open-issue-webview' ,
507533 OpenPullRequestWebview = '/open-pull-request-webview' ,
@@ -527,7 +553,7 @@ export function fromOpenIssueWebviewUri(uri: vscode.Uri): OpenIssueWebviewUriPar
527553 }
528554 try {
529555 const query = JSON . parse ( uri . query . split ( '&' ) [ 0 ] ) ;
530- if ( ! query . owner || ! query . repo || ! query . issueNumber ) {
556+ if ( ! validateOpenWebviewParams ( query . owner , query . repo , query . issueNumber ) ) {
531557 return ;
532558 }
533559 return query ;
@@ -554,7 +580,7 @@ export function fromOpenPullRequestWebviewUri(uri: vscode.Uri): OpenPullRequestW
554580 }
555581 try {
556582 const query = JSON . parse ( uri . query . split ( '&' ) [ 0 ] ) ;
557- if ( ! query . owner || ! query . repo || ! query . pullRequestNumber ) {
583+ if ( ! validateOpenWebviewParams ( query . owner , query . repo , query . pullRequestNumber ) ) {
558584 return ;
559585 }
560586 return query ;
0 commit comments