Skip to content

Commit f80d943

Browse files
authored
fix: add rel=noopener to target=_blank links (#1880)
Signed-off-by: Pedro Lamas <pedrolamas@gmail.com>
1 parent 7c6e164 commit f80d943

10 files changed

Lines changed: 12 additions & 1 deletion

File tree

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ src/
179179
- ESLint enforced: `neostandard` + `pluginVue.configs['flat/vue2-recommended']` + `pluginRegexp` + `@vue/eslint-config-typescript`
180180
- `.editorconfig` rules: 2 spaces, LF line endings, UTF-8, trim trailing whitespace, max line 100 (code)
181181
- camelCase for variables/methods, PascalCase for components
182+
- Any link opening a new tab (`target="_blank"`) **must** also set `rel="noopener noreferrer"` — applies to `<a>`, `<v-btn>`/`<app-btn>` with `:href`, and any HTML strings rendered via `v-safe-html` (e.g. `src/util/link-external-urls.ts`)
182183
- Use `consola` for logging, not `console.log` (configured in `src/setupConsola.ts` — warn in prod, verbose in dev)
183184
- Type imports: `import type { ... }` for types only (`verbatimModuleSyntax: true`)
184185
- `satisfies` keyword for store module type checking

src/components/common/Login.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
class="custom-transform-class text-none"
8585
:href="$globals.DOCS_AUTH_LOST_PASSWORD"
8686
target="_blank"
87+
rel="noopener noreferrer"
8788
>
8889
{{ $t('app.general.btn.forgot_password') }}
8990
</app-btn>
@@ -93,6 +94,7 @@
9394
class="custom-transform-class text-none"
9495
:href="$globals.DOCS_AUTH"
9596
target="_blank"
97+
rel="noopener noreferrer"
9698
>
9799
{{ $t('app.general.btn.auth_unsure') }}
98100
</app-btn>

src/components/layout/AppNotificationMenu.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
x-small
110110
:href="n.to"
111111
target="_blank"
112+
rel="noopener noreferrer"
112113
class="mr-1"
113114
@click="menu = false"
114115
/>

src/components/settings/VersionInformationDialog.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
class="secondary--text"
4949
:href="`${baseUrl}/commits/${component.branch}`"
5050
target="_blank"
51+
rel="noopener noreferrer"
5152
>
5253
<strong>{{ commit.author }}</strong>
5354
</a>
@@ -71,6 +72,7 @@
7172
color="secondary"
7273
:href="`${baseUrl}/commit/${commit.sha}`"
7374
target="_blank"
75+
rel="noopener noreferrer"
7476
>
7577
<span class="primary--text">{{ commit.sha.substring(0, 7) }}</span>
7678
</app-btn>

src/components/settings/VersionSettings.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
v-bind="attrs"
6969
:href="component.remote_url"
7070
target="_blank"
71+
rel="noopener noreferrer"
7172
v-on="on"
7273
>
7374
<v-icon

src/components/widgets/afc/dialogs/AfcSettingsDialog.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
tile
1313
href="https://www.armoredturtle.xyz/docs/afc-klipper-add-on/toolhead/calculation.html"
1414
target="_blank"
15+
rel="noopener noreferrer"
1516
class="me-1"
1617
>
1718
<v-icon left>

src/components/widgets/camera/CameraItem.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
<a
104104
:href="rawCameraUrl"
105105
target="_blank"
106+
rel="noopener noreferrer"
106107
>
107108
<v-icon>$openInNew</v-icon>
108109
</a>

src/components/widgets/filesystem/FileEditorDialog.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
v-if="!printerPrinting && configMap?.link"
7777
:href="configMap.link"
7878
target="_blank"
79+
rel="noopener noreferrer"
7980
>
8081
<v-icon
8182
small

src/components/widgets/filesystem/FilePreviewDialog.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ export default class FilePreviewDialog extends Mixins(StateMixin) {
145145
link (args: Tokens.Link) {
146146
const html = this.constructor.prototype.link.call(this, args)
147147
148-
return html.replace(/^<a /, '<a target="_blank" ')
148+
return html.replace(/^<a /, '<a target="_blank" rel="noopener noreferrer" ')
149149
}
150150
}
151151
}

src/components/widgets/spoolman/SpoolSelectionDialog.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@
269269
v-if="spoolmanURL"
270270
:href="spoolmanURL"
271271
target="_blank"
272+
rel="noopener noreferrer"
272273
color="primary"
273274
text
274275
type="button"

0 commit comments

Comments
 (0)