@@ -91,71 +91,104 @@ function buildStartParams(
9191 return approved ( startParams ) ;
9292}
9393
94- function buildForwardParams ( params : Record < string , unknown > ) : Record < string , unknown > | null {
94+ function denyMissing ( action : string , field : string ) : PolicyDecision {
95+ return {
96+ approved : false ,
97+ result : denied ( `googlemeet.chrome ${ action } requires ${ field } ` ) ,
98+ } ;
99+ }
100+
101+ function buildForwardParams ( params : Record < string , unknown > ) : PolicyDecision | null {
95102 const action = readString ( params . action ) ;
96103 switch ( action ) {
97104 case "setup" :
98- return { action } ;
105+ return approved ( { action } ) ;
99106 case "status" : {
100107 const bridgeId = readString ( params . bridgeId ) ;
101- return bridgeId ? { action, bridgeId } : { action } ;
108+ return approved ( bridgeId ? { action, bridgeId } : { action } ) ;
102109 }
103110 case "list" : {
104111 const forwarded : Record < string , unknown > = { action } ;
105112 const url = readString ( params . url ) ;
106113 const mode = readString ( params . mode ) ;
107114 if ( url ) {
108- forwarded . url = url ;
115+ try {
116+ forwarded . url = normalizeMeetUrl ( url ) ;
117+ } catch ( error ) {
118+ return {
119+ approved : false ,
120+ result : denied ( error instanceof Error ? error . message : "googlemeet.chrome list url" ) ,
121+ } ;
122+ }
109123 }
110124 if ( mode ) {
111125 forwarded . mode = mode ;
112126 }
113- return forwarded ;
127+ return approved ( forwarded ) ;
114128 }
115129 case "stopByUrl" : {
116130 const forwarded : Record < string , unknown > = { action } ;
117131 const url = readString ( params . url ) ;
118132 const mode = readString ( params . mode ) ;
119133 const exceptBridgeId = readString ( params . exceptBridgeId ) ;
120- if ( url ) {
121- forwarded . url = url ;
134+ if ( ! url ) {
135+ return denyMissing ( action , "url" ) ;
136+ }
137+ try {
138+ forwarded . url = normalizeMeetUrl ( url ) ;
139+ } catch ( error ) {
140+ return {
141+ approved : false ,
142+ result : denied (
143+ error instanceof Error ? error . message : "googlemeet.chrome stopByUrl url" ,
144+ ) ,
145+ } ;
122146 }
123147 if ( mode ) {
124148 forwarded . mode = mode ;
125149 }
126150 if ( exceptBridgeId ) {
127151 forwarded . exceptBridgeId = exceptBridgeId ;
128152 }
129- return forwarded ;
153+ return approved ( forwarded ) ;
130154 }
131155 case "pullAudio" : {
132156 const forwarded : Record < string , unknown > = { action } ;
133157 const bridgeId = readString ( params . bridgeId ) ;
134158 const timeoutMs = readPositiveNumber ( params . timeoutMs ) ;
135- if ( bridgeId ) {
136- forwarded . bridgeId = bridgeId ;
159+ if ( ! bridgeId ) {
160+ return denyMissing ( action , " bridgeId" ) ;
137161 }
162+ forwarded . bridgeId = bridgeId ;
138163 if ( timeoutMs ) {
139164 forwarded . timeoutMs = timeoutMs ;
140165 }
141- return forwarded ;
166+ return approved ( forwarded ) ;
142167 }
143168 case "pushAudio" : {
144169 const forwarded : Record < string , unknown > = { action } ;
145170 const bridgeId = readString ( params . bridgeId ) ;
146171 const base64 = readString ( params . base64 ) ;
147- if ( bridgeId ) {
148- forwarded . bridgeId = bridgeId ;
172+ if ( ! bridgeId ) {
173+ return denyMissing ( action , "bridgeId" ) ;
174+ }
175+ if ( ! base64 ) {
176+ return denyMissing ( action , "base64" ) ;
149177 }
150- if ( base64 ) {
151- forwarded . base64 = base64 ;
178+ forwarded . bridgeId = bridgeId ;
179+ forwarded . base64 = base64 ;
180+ return approved ( forwarded ) ;
181+ }
182+ case "clearAudio" : {
183+ const bridgeId = readString ( params . bridgeId ) ;
184+ if ( ! bridgeId ) {
185+ return denyMissing ( action , "bridgeId" ) ;
152186 }
153- return forwarded ;
187+ return approved ( { action , bridgeId } ) ;
154188 }
155- case "clearAudio" :
156189 case "stop" : {
157190 const bridgeId = readString ( params . bridgeId ) ;
158- return bridgeId ? { action, bridgeId } : { action } ;
191+ return approved ( bridgeId ? { action, bridgeId } : { action } ) ;
159192 }
160193 default :
161194 return null ;
@@ -178,10 +211,10 @@ export function createGoogleMeetChromeNodeInvokePolicy(
178211 if ( action === "start" ) {
179212 decision = buildStartParams ( params , config ) ;
180213 } else {
181- const forwardParams = buildForwardParams ( params ) ;
182- decision = forwardParams
183- ? approved ( forwardParams )
184- : { approved : false , result : denied ( "unsupported googlemeet.chrome action" ) } ;
214+ decision = buildForwardParams ( params ) ?? {
215+ approved : false ,
216+ result : denied ( "unsupported googlemeet.chrome action" ) ,
217+ } ;
185218 }
186219 if ( ! decision . approved ) {
187220 return decision . result ;
0 commit comments