From ad970dffdabb7b81ee18583c86898f48df0b4302 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Wed, 13 Jul 2022 18:11:54 +0900 Subject: [PATCH] fix(client): fix url encoded string handling of nirax Fix #8878 --- CHANGELOG.md | 1 + packages/client/src/components/global/url.vue | 14 ++++---------- packages/client/src/nirax.ts | 11 ++++++----- packages/client/src/scripts/safe-uri-decode.ts | 7 +++++++ 4 files changed, 18 insertions(+), 15 deletions(-) create mode 100644 packages/client/src/scripts/safe-uri-decode.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f6644f016c..ea243c19e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ You should also include the user name that made the change. ### Bugfixes - Server: Fix crash at startup if TensorFlow is not supported @mei23 +- Client: URLエンコードされたルーティングを修正 ## 12.112.3 (2022/07/09) diff --git a/packages/client/src/components/global/url.vue b/packages/client/src/components/global/url.vue index 34ba9024cc..dc79a20649 100644 --- a/packages/client/src/components/global/url.vue +++ b/packages/client/src/components/global/url.vue @@ -1,5 +1,6 @@ <template> -<component :is="self ? 'MkA' : 'a'" ref="el" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target" +<component + :is="self ? 'MkA' : 'a'" ref="el" class="ieqqeuvs _link" :[attr]="self ? url.substr(local.length) : url" :rel="rel" :target="target" @contextmenu.stop="() => {}" > <template v-if="!self"> @@ -23,14 +24,7 @@ import { toUnicode as decodePunycode } from 'punycode/'; import { url as local } from '@/config'; import * as os from '@/os'; import { useTooltip } from '@/scripts/use-tooltip'; - -function safeURIDecode(str: string) { - try { - return decodeURIComponent(str); - } catch { - return str; - } -} +import { safeURIDecode } from '@/scripts/safe-uri-decode'; export default defineComponent({ props: { @@ -42,7 +36,7 @@ export default defineComponent({ type: String, required: false, default: null, - } + }, }, setup(props) { const self = props.url.startsWith(local); diff --git a/packages/client/src/nirax.ts b/packages/client/src/nirax.ts index cd29ae87a5..7587901d70 100644 --- a/packages/client/src/nirax.ts +++ b/packages/client/src/nirax.ts @@ -3,6 +3,7 @@ import { EventEmitter } from 'eventemitter3'; import { Ref, Component, ref, shallowRef, ShallowRef } from 'vue'; import { pleaseLogin } from '@/scripts/please-login'; +import { safeURIDecode } from '@/scripts/safe-uri-decode'; type RouteDef = { path: string; @@ -116,7 +117,7 @@ export class Router extends EventEmitter<{ } if (p.wildcard) { if (parts.length !== 0) { - props.set(p.name, parts.join('/')); + props.set(p.name, safeURIDecode(parts.join('/'))); parts = []; } break pathMatchLoop; @@ -124,10 +125,10 @@ export class Router extends EventEmitter<{ if (p.startsWith) { if (parts[0] == null || !parts[0].startsWith(p.startsWith)) continue forEachRouteLoop; - props.set(p.name, parts[0].substring(p.startsWith.length)); + props.set(p.name, safeURIDecode(parts[0].substring(p.startsWith.length))); parts.shift(); } else { - props.set(p.name, parts[0]); + props.set(p.name, safeURIDecode(parts[0])); parts.shift(); } } @@ -137,7 +138,7 @@ export class Router extends EventEmitter<{ if (parts.length !== 0) continue forEachRouteLoop; if (route.hash != null && hash != null) { - props.set(route.hash, hash); + props.set(route.hash, safeURIDecode(hash)); } if (route.query != null && queryString != null) { @@ -147,7 +148,7 @@ export class Router extends EventEmitter<{ for (const q in route.query) { const as = route.query[q]; if (queryObject[q]) { - props.set(as, queryObject[q]); + props.set(as, safeURIDecode(queryObject[q])); } } } diff --git a/packages/client/src/scripts/safe-uri-decode.ts b/packages/client/src/scripts/safe-uri-decode.ts new file mode 100644 index 0000000000..301b56d7fd --- /dev/null +++ b/packages/client/src/scripts/safe-uri-decode.ts @@ -0,0 +1,7 @@ +export function safeURIDecode(str: string): string { + try { + return decodeURIComponent(str); + } catch { + return str; + } +}