fix(core): assert app schema url on open-app (#10687)

This commit is contained in:
fengmk2
2025-03-12 08:42:35 +00:00
parent c3b407041e
commit fd3ce431fe
2 changed files with 23 additions and 6 deletions

View File

@@ -1,7 +1,11 @@
import { useNavigateHelper } from '@affine/core/components/hooks/use-navigate-helper'; import { useNavigateHelper } from '@affine/core/components/hooks/use-navigate-helper';
import { GraphQLService } from '@affine/core/modules/cloud'; import { GraphQLService } from '@affine/core/modules/cloud';
import { OpenInAppPage } from '@affine/core/modules/open-in-app/views/open-in-app-page'; import { OpenInAppPage } from '@affine/core/modules/open-in-app/views/open-in-app-page';
import { appSchemes, channelToScheme } from '@affine/core/utils/channel'; import {
appSchemaUrl,
appSchemes,
channelToScheme,
} from '@affine/core/utils/channel';
import type { GetCurrentUserQuery } from '@affine/graphql'; import type { GetCurrentUserQuery } from '@affine/graphql';
import { getCurrentUserQuery } from '@affine/graphql'; import { getCurrentUserQuery } from '@affine/graphql';
import { useService } from '@toeverything/infra'; import { useService } from '@toeverything/infra';
@@ -23,12 +27,13 @@ const OpenUrl = () => {
[navigateHelper] [navigateHelper]
); );
if (!urlToOpen) { const parsed = appSchemaUrl.safeParse(urlToOpen);
if (!parsed.success) {
console.error(parsed.error);
return null; return null;
} }
const urlObj = new URL(urlToOpen || ''); const urlObj = new URL(parsed.data);
params.forEach((v, k) => { params.forEach((v, k) => {
if (k === 'url') { if (k === 'url') {
return; return;
@@ -55,7 +60,7 @@ const OpenOAuthJwt = () => {
const scheme = maybeScheme.success const scheme = maybeScheme.success
? maybeScheme.data ? maybeScheme.data
: channelToScheme[BUILD_CONFIG.appBuildType]; : channelToScheme[BUILD_CONFIG.appBuildType];
const next = params.get('next'); const next = params.get('next') || '';
useEffect(() => { useEffect(() => {
graphqlService graphqlService
@@ -74,7 +79,7 @@ const OpenOAuthJwt = () => {
const urlToOpen = `${scheme}://signin-redirect?token=${ const urlToOpen = `${scheme}://signin-redirect?token=${
currentUser.token.sessionToken currentUser.token.sessionToken
}&next=${next || ''}`; }&next=${next}`;
return <OpenInAppPage urlToOpen={urlToOpen} />; return <OpenInAppPage urlToOpen={urlToOpen} />;
}; };

View File

@@ -42,3 +42,15 @@ export const appNames = {
beta: 'AFFiNE Beta', beta: 'AFFiNE Beta',
internal: 'AFFiNE Internal', internal: 'AFFiNE Internal',
} satisfies Record<Channel, string>; } satisfies Record<Channel, string>;
export const appSchemaUrl = z.custom<string>(
(url: string) => {
try {
return appSchemes.safeParse(new URL(url).protocol.replace(':', ''))
.success;
} catch {
return false;
}
},
{ message: 'Invalid URL or protocol' }
);