From c5b14ea866619b2d173cb3367a4cf6ee940268de Mon Sep 17 00:00:00 2001 From: ejithon Date: Tue, 21 May 2024 20:32:08 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20handle=20mode=20value=20to=20avoid?= =?UTF-8?q?=20signin=20error=20caused=20by=203pcd=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app/src/errors/index.ts | 5 +++++ packages/app/src/hooks/endpoint.ts | 25 ++++++++++++++++++++++++- packages/app/src/utils/oas/oauth.ts | 20 ++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/app/src/utils/oas/oauth.ts diff --git a/packages/app/src/errors/index.ts b/packages/app/src/errors/index.ts index b1b5eb014..9f786877f 100644 --- a/packages/app/src/errors/index.ts +++ b/packages/app/src/errors/index.ts @@ -96,6 +96,11 @@ export class EndpointExportError extends EndpointError { name = 'Endpoint Export Error'; } +export class EndpointOAuthIllegalResponseError extends EndpointError { + code = '#endpointOAuthIllegalResponse'; + name = 'Endpoint OAuth Illegal Response Error'; +} + export class EndpointGroupError extends BaseError { code = '#endpointGroup'; name = 'Endpoint Group Error'; diff --git a/packages/app/src/hooks/endpoint.ts b/packages/app/src/hooks/endpoint.ts index a3b67cf63..4bca3a5e5 100644 --- a/packages/app/src/hooks/endpoint.ts +++ b/packages/app/src/hooks/endpoint.ts @@ -57,6 +57,7 @@ import { constructRequestInit, constructRequestPayloads, } from '~/utils/oas'; +import { extractAuthorizationUrl } from '~/utils/oas/oauth'; export type UseEndpointReturn = { list: Endpoint[]; @@ -535,7 +536,29 @@ export const useEndpoint = (): UseEndpointReturn => { ); try { set(KEY.OAUTH_ENDPOINT_ID, endpoint.id); - globalThis.location.href = requestInfo.toString(); + + if (authConfig.mode !== 'cors') { + globalThis.location.href = requestInfo.toString(); + } else { + const requestInit = constructRequestInit(request, requestPayloads); + const [response, responseError] = await promiseErrorHandler( + globalThis.fetch(requestInfo, requestInit) + ); + if (!!responseError) { + return { + error: new NetworkError(responseError.message), + }; + } + if (!response.ok) { + return { + error: await getHTTPError(response), + }; + } + globalThis.location.href = extractAuthorizationUrl( + request.operation.responses, + await response.json() + ); + } } catch (e: unknown) { remove(KEY.OAUTH_ENDPOINT_ID); let message = ''; diff --git a/packages/app/src/utils/oas/oauth.ts b/packages/app/src/utils/oas/oauth.ts new file mode 100644 index 000000000..56db894fa --- /dev/null +++ b/packages/app/src/utils/oas/oauth.ts @@ -0,0 +1,20 @@ +import { Responses } from '~/types/oas'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const extractAuthorizationUrl = (responses: Responses, json: any) => { + const response = responses['200']; + if (!response || !response.content?.['application/json']) { + return null; + } + const schema = response.content['application/json'].schema; + if (!schema.properties) { + return null; + } + const uriKey = Object.keys(schema.properties).find((key) => { + const property = schema.properties?.[key]; + return property?.type === 'string' && property.format === 'uri'; + }); + if (uriKey) { + return json[uriKey]; + } +}; From c3f65b8e788b4813357ab3cfd5bd48a2cdfac6c3 Mon Sep 17 00:00:00 2001 From: ejithon Date: Tue, 21 May 2024 20:54:01 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20use=20result=20type=20?= =?UTF-8?q?=F0=9F=93=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/app/src/hooks/endpoint.ts | 8 +++++++- packages/app/src/utils/oas/oauth.ts | 24 ++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/app/src/hooks/endpoint.ts b/packages/app/src/hooks/endpoint.ts index 4bca3a5e5..207349bbc 100644 --- a/packages/app/src/hooks/endpoint.ts +++ b/packages/app/src/hooks/endpoint.ts @@ -554,10 +554,16 @@ export const useEndpoint = (): UseEndpointReturn => { error: await getHTTPError(response), }; } - globalThis.location.href = extractAuthorizationUrl( + const authorizationUrlResult = extractAuthorizationUrl( request.operation.responses, await response.json() ); + if (authorizationUrlResult.isFailure()) { + return { + error: authorizationUrlResult.value, + }; + } + globalThis.location.href = authorizationUrlResult.value; } } catch (e: unknown) { remove(KEY.OAUTH_ENDPOINT_ID); diff --git a/packages/app/src/utils/oas/oauth.ts b/packages/app/src/utils/oas/oauth.ts index 56db894fa..060f52577 100644 --- a/packages/app/src/utils/oas/oauth.ts +++ b/packages/app/src/utils/oas/oauth.ts @@ -1,20 +1,32 @@ +import { + Success, + Failure, + EndpointOAuthIllegalResponseError, + Result, +} from '~/errors'; import { Responses } from '~/types/oas'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const extractAuthorizationUrl = (responses: Responses, json: any) => { +export const extractAuthorizationUrl = ( + responses: Responses, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + json: any +): Result => { const response = responses['200']; if (!response || !response.content?.['application/json']) { - return null; + return new Failure(new EndpointOAuthIllegalResponseError()); } const schema = response.content['application/json'].schema; if (!schema.properties) { - return null; + return new Failure(new EndpointOAuthIllegalResponseError()); } + const uriKey = Object.keys(schema.properties).find((key) => { const property = schema.properties?.[key]; return property?.type === 'string' && property.format === 'uri'; }); - if (uriKey) { - return json[uriKey]; + if (!uriKey) { + return new Failure(new EndpointOAuthIllegalResponseError()); } + + return new Success(json[uriKey]); }; From a964916e37ee43ba8587df9efc839adc15bac80b Mon Sep 17 00:00:00 2001 From: ejithon Date: Tue, 21 May 2024 20:56:14 +0900 Subject: [PATCH 3/3] =?UTF-8?q?chore:=20add=20changeset=20=E2=99=BB?= =?UTF-8?q?=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/pink-rockets-yell.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/pink-rockets-yell.md diff --git a/.changeset/pink-rockets-yell.md b/.changeset/pink-rockets-yell.md new file mode 100644 index 000000000..87d5bbec8 --- /dev/null +++ b/.changeset/pink-rockets-yell.md @@ -0,0 +1,5 @@ +--- +"@viron/app": major +--- + +handle mode value to avoid signin error caused by 3pcd.