11// gm api 权限验证
22import type { Script } from "@App/app/repo/scripts" ;
33import { type Permission , PermissionDAO } from "@App/app/repo/permission" ;
4+ import type { GetSender } from "@Packages/message/server" ;
45import { type Group } from "@Packages/message/server" ;
56import { type MessageQueue } from "@Packages/message/message_queue" ;
67import type { Api , Request } from "./types" ;
@@ -97,6 +98,7 @@ export default class PermissionVerify {
9798 confirm : ConfirmParam | boolean ;
9899 resolve : ( value : boolean ) => void ;
99100 reject : ( reason : any ) => void ;
101+ sender : GetSender ;
100102 } > = new Queue ( ) ;
101103
102104 private permissionDAO : PermissionDAO = new PermissionDAO ( ) ;
@@ -109,7 +111,7 @@ export default class PermissionVerify {
109111 }
110112
111113 // 验证是否有权限
112- async verify ( request : Request , api : ApiValue ) : Promise < boolean > {
114+ async verify ( request : Request , api : ApiValue , sender : GetSender ) : Promise < boolean > {
113115 const { alias, link, confirm } = api . param ;
114116 if ( api . param . default ) {
115117 return true ;
@@ -132,7 +134,7 @@ export default class PermissionVerify {
132134 // 需要用户确认
133135 let result = true ;
134136 if ( confirm ) {
135- result = await this . pushConfirmQueue ( request , confirm ) ;
137+ result = await this . pushConfirmQueue ( request , confirm , sender ) ;
136138 }
137139 return result ;
138140 }
@@ -148,7 +150,7 @@ export default class PermissionVerify {
148150 return ;
149151 }
150152 try {
151- const ret = await this . confirm ( data . request , data . confirm ) ;
153+ const ret = await this . confirm ( data . request , data . confirm , data . sender ) ;
152154 data . resolve ( ret ) ;
153155 } catch ( e ) {
154156 data . reject ( e ) ;
@@ -157,17 +159,17 @@ export default class PermissionVerify {
157159 }
158160
159161 // 确认队列,为了防止一次性打开过多的窗口
160- async pushConfirmQueue ( request : Request , confirmFn : ApiParamConfirmFn ) : Promise < boolean > {
162+ async pushConfirmQueue ( request : Request , confirmFn : ApiParamConfirmFn , sender : GetSender ) : Promise < boolean > {
161163 const confirm = await confirmFn ( request ) ;
162164 if ( confirm === true ) {
163165 return true ;
164166 }
165167 return await new Promise ( ( resolve , reject ) => {
166- this . confirmQueue . push ( { request, confirm, resolve, reject } ) ;
168+ this . confirmQueue . push ( { request, confirm, resolve, reject, sender } ) ;
167169 } ) ;
168170 }
169171
170- async confirm ( request : Request , confirm : boolean | ConfirmParam ) : Promise < boolean > {
172+ async confirm ( request : Request , confirm : boolean | ConfirmParam , sender : GetSender ) : Promise < boolean > {
171173 if ( typeof confirm === "boolean" ) {
172174 return confirm ;
173175 }
@@ -192,7 +194,7 @@ export default class PermissionVerify {
192194 throw new Error ( "permission denied" ) ;
193195 }
194196 // 没有权限,则弹出页面让用户进行确认
195- const userConfirm = await this . confirmWindow ( request . script , confirm ) ;
197+ const userConfirm = await this . confirmWindow ( request . script , confirm , sender ) ;
196198 // 成功存入数据库
197199 const model : Permission = {
198200 uuid : request . uuid ,
@@ -248,7 +250,7 @@ export default class PermissionVerify {
248250 > = new Map ( ) ;
249251
250252 // 弹出窗口让用户进行确认
251- async confirmWindow ( script : Script , confirm : ConfirmParam ) : Promise < UserConfirm > {
253+ async confirmWindow ( script : Script , confirm : ConfirmParam , sender : GetSender ) : Promise < UserConfirm > {
252254 return new Promise ( ( resolve , reject ) => {
253255 const uuid = uuidv4 ( ) ;
254256 // 超时处理
@@ -267,8 +269,10 @@ export default class PermissionVerify {
267269 reject,
268270 } ) ;
269271 // 打开窗口
272+ const tabId = sender . getExtMessageSender ( ) . tabId ;
270273 chrome . tabs . create ( {
271274 url : chrome . runtime . getURL ( `src/confirm.html?uuid=${ uuid } ` ) ,
275+ openerTabId : tabId === - 1 ? undefined : tabId , // 如果是后台脚本,则不设置openerTabId
272276 } ) ;
273277 } ) ;
274278 }
0 commit comments