diff options
| author | 饺子w (Yumechi) <35571479+eternal-flame-AD@users.noreply.github.com> | 2025-03-09 12:28:47 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-09 12:28:47 +0000 |
| commit | db5c127cdd3467ca0c0284ee74094af3c18ae8ea (patch) | |
| tree | 21c00dfd17902c5e448031b823f7c791044fd741 /packages/backend/src | |
| parent | enhance(frontend): improve plugin management (diff) | |
| download | sharkey-db5c127cdd3467ca0c0284ee74094af3c18ae8ea.tar.gz sharkey-db5c127cdd3467ca0c0284ee74094af3c18ae8ea.tar.bz2 sharkey-db5c127cdd3467ca0c0284ee74094af3c18ae8ea.zip | |
fix(backend): fix handling of invalid urls in user profile (#15635)
Signed-off-by: eternal-flame-AD <yume@yumechi.jp>
Diffstat (limited to 'packages/backend/src')
| -rw-r--r-- | packages/backend/src/core/activitypub/ApRendererService.ts | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts index 83a095cdea..f01874952f 100644 --- a/packages/backend/src/core/activitypub/ApRendererService.ts +++ b/packages/backend/src/core/activitypub/ApRendererService.ts @@ -499,11 +499,28 @@ export class ApRendererService { this.userProfilesRepository.findOneByOrFail({ userId: user.id }), ]); + const tryRewriteUrl = (maybeUrl: string) => { + const urlSafeRegex = /^(?:http[s]?:\/\/.)?(?:www\.)?[-a-zA-Z0-9@%._\+~#=]{2,256}\.[a-z]{2,6}\b(?:[-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)/; + try { + const match = maybeUrl.match(urlSafeRegex); + if (!match) { + return maybeUrl; + } + const urlPart = match[0]; + const urlPartParsed = new URL(urlPart); + const restPart = maybeUrl.slice(match[0].length); + + return `<a href="${urlPartParsed.href}" rel="me nofollow noopener" target="_blank">${urlPart}</a>${restPart}`; + } catch (e) { + return maybeUrl; + } + }; + const attachment = profile.fields.map(field => ({ type: 'PropertyValue', name: field.name, value: (field.value.startsWith('http://') || field.value.startsWith('https://')) - ? `<a href="${new URL(field.value).href}" rel="me nofollow noopener" target="_blank">${new URL(field.value).href}</a>` + ? tryRewriteUrl(field.value) : field.value, })); |