Skip to content

Commit

Permalink
feat: add cancellation support to extension-base for authorization re…
Browse files Browse the repository at this point in the history
…quests
  • Loading branch information
F-OBrien committed Dec 18, 2024
1 parent 6f29ec7 commit 9aff585
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
17 changes: 17 additions & 0 deletions packages/extension-base/src/background/handlers/Extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,8 @@ export default class Extension {
return { list: remAuth };
}

// Reject the authorization request and add the URL to the authorized list with no keys.
// The site will not prompt for re-authorization on future visits.
private rejectAuthRequest (id: string): void {
const queued = this.#state.getAuthRequest(id);

Expand All @@ -534,6 +536,18 @@ export default class Extension {
reject(new Error('Rejected'));
}

// Cancel the authorization request and do not add the URL to the authorized list.
// The site will prompt for authorization on future visits.
private cancelAuthRequest (id: string): void {
const queued = this.#state.getAuthRequest(id);

assert(queued, 'Unable to find request');

const { cancelRequest } = queued;

cancelRequest(new Error('Authorization request cancelled'));
}

private updateCurrentTabs ({ urls }: RequestActiveTabsUrlUpdate) {
this.#state.updateCurrentTabsUrl(urls);
}
Expand All @@ -558,6 +572,9 @@ export default class Extension {
case 'pri(authorize.reject)':
return this.rejectAuthRequest(request as string);

case 'pri(authorize.cancel)':
return this.cancelAuthRequest(request as string);

case 'pri(authorize.requests)':
return port && this.authorizeSubscribe(id, port);

Expand Down
13 changes: 11 additions & 2 deletions packages/extension-base/src/background/handlers/State.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ interface Resolver<T> {
resolve: (result: T) => void;
}

interface AuthRequest extends Resolver<AuthResponse> {
interface AuthResolver<T> extends Resolver<T> {
cancelRequest: (error: Error) => void;
}

interface AuthRequest extends AuthResolver<AuthResponse> {
id: string;
idStr: string;
request: RequestAuthorizeTab;
Expand Down Expand Up @@ -242,7 +246,7 @@ export default class State {
});
}

private authComplete = (id: string, resolve: (resValue: AuthResponse) => void, reject: (error: Error) => void): Resolver<AuthResponse> => {
private authComplete = (id: string, resolve: (resValue: AuthResponse) => void, reject: (error: Error) => void): AuthResolver<AuthResponse> => {
const complete = async (authorizedAccounts: string[] = []) => {
const { idStr, request: { origin }, url } = this.#authRequests[id];

Expand Down Expand Up @@ -271,6 +275,11 @@ export default class State {
};

return {
cancelRequest: (error: Error): void => {
delete this.#authRequests[id];
this.updateIconAuth(true);
reject(error);
},
// eslint-disable-next-line @typescript-eslint/no-misused-promises
reject: async (error: Error): Promise<void> => {
await complete();
Expand Down
1 change: 1 addition & 0 deletions packages/extension-base/src/background/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ export interface RequestSignatures {
'pri(authorize.requests)': [RequestAuthorizeSubscribe, boolean, AuthorizeRequest[]];
'pri(authorize.remove)': [string, ResponseAuthorizeList];
'pri(authorize.reject)': [string, void];
'pri(authorize.cancel)': [string, void];
'pri(authorize.update)': [RequestUpdateAuthorizedAccounts, void];
'pri(activeTabsUrl.update)': [RequestActiveTabsUrlUpdate, void];
'pri(connectedTabsUrl.get)': [null, ConnectedTabsUrlResponse];
Expand Down

0 comments on commit 9aff585

Please sign in to comment.