From: Dessalines <dessalines@users.noreply.github.com>
Date: Thu, 24 Feb 2022 15:31:44 +0000 (+0000)
Subject: Adding nofollow to links. Fixes #542 (#543)
X-Git-Url: http://these/git/%7B%60/feeds/README.md?a=commitdiff_plain;h=6684bbeaf6df12a8725368bee30f191de285db2d;p=lemmy-ui.git

Adding nofollow to links. Fixes #542 (#543)

* Adding nofollow to links. Fixes #542

* Running prettier.
---

diff --git a/src/shared/components/common/markdown-textarea.tsx b/src/shared/components/common/markdown-textarea.tsx
index 381ecb4..af284e5 100644
--- a/src/shared/components/common/markdown-textarea.tsx
+++ b/src/shared/components/common/markdown-textarea.tsx
@@ -10,6 +10,7 @@ import {
   mdToHtml,
   pictrsDeleteToast,
   randomStr,
+  relTags,
   setupTippy,
   setupTribute,
   toast,
@@ -297,7 +298,7 @@ export class MarkdownTextArea extends Component<
               href={markdownHelpUrl}
               class="btn btn-sm text-muted font-weight-bold"
               title={i18n.t("formatting_help")}
-              rel="noopener"
+              rel={relTags}
             >
               <Icon icon="help-circle" classes="icon-inline" />
             </a>
diff --git a/src/shared/components/common/pictrs-image.tsx b/src/shared/components/common/pictrs-image.tsx
index 31e3052..4f3ddc0 100644
--- a/src/shared/components/common/pictrs-image.tsx
+++ b/src/shared/components/common/pictrs-image.tsx
@@ -32,8 +32,9 @@ export class PictrsImage extends Component<PictrsImageProps, any> {
           loading="lazy"
           className={classNames({
             "img-fluid": !this.props.icon && !this.props.iconOverlay,
-            "banner": this.props.banner,
-            "thumbnail rounded": this.props.thumbnail && !this.props.icon && !this.props.banner,
+            banner: this.props.banner,
+            "thumbnail rounded":
+              this.props.thumbnail && !this.props.icon && !this.props.banner,
             "img-expanded slight-radius":
               !this.props.thumbnail && !this.props.icon,
             "img-blur": this.props.thumbnail && this.props.nsfw,
diff --git a/src/shared/components/common/sort-select.tsx b/src/shared/components/common/sort-select.tsx
index 9504756..1188064 100644
--- a/src/shared/components/common/sort-select.tsx
+++ b/src/shared/components/common/sort-select.tsx
@@ -1,7 +1,7 @@
 import { Component, linkEvent } from "inferno";
 import { SortType } from "lemmy-js-client";
 import { i18n } from "../../i18next";
-import { randomStr, sortingHelpUrl } from "../../utils";
+import { randomStr, relTags, sortingHelpUrl } from "../../utils";
 import { Icon } from "./icon";
 
 interface SortSelectProps {
@@ -71,7 +71,7 @@ export class SortSelect extends Component<SortSelectProps, SortSelectState> {
         <a
           className="text-muted"
           href={sortingHelpUrl}
-          rel="noopener"
+          rel={relTags}
           title={i18n.t("sorting_help")}
         >
           <Icon icon="help-circle" classes="icon-inline" />
diff --git a/src/shared/components/community/community-link.tsx b/src/shared/components/community/community-link.tsx
index fee38eb..4ea7f8a 100644
--- a/src/shared/components/community/community-link.tsx
+++ b/src/shared/components/community/community-link.tsx
@@ -1,7 +1,7 @@
 import { Component } from "inferno";
 import { Link } from "inferno-router";
 import { CommunitySafe } from "lemmy-js-client";
-import { hostname, showAvatars } from "../../utils";
+import { hostname, relTags, showAvatars } from "../../utils";
 import { PictrsImage } from "../common/pictrs-image";
 
 interface CommunityLinkProps {
@@ -48,6 +48,7 @@ export class CommunityLink extends Component<CommunityLinkProps, any> {
         title={apubName}
         className={`${this.props.muted ? "text-muted" : ""}`}
         href={link}
+        rel={relTags}
       >
         {this.avatarAndName(displayName)}
       </a>
diff --git a/src/shared/components/community/community.tsx b/src/shared/components/community/community.tsx
index 7bc0833..da215f4 100644
--- a/src/shared/components/community/community.tsx
+++ b/src/shared/components/community/community.tsx
@@ -38,6 +38,7 @@ import {
   getPageFromProps,
   getSortTypeFromProps,
   notifyPost,
+  relTags,
   restoreScrollPosition,
   saveCommentRes,
   saveScrollPosition,
@@ -370,7 +371,7 @@ export class Community extends Component<any, State> {
         <span class="mr-2">
           <SortSelect sort={this.state.sort} onChange={this.handleSortChange} />
         </span>
-        <a href={communityRss} title="RSS" rel="noopener">
+        <a href={communityRss} title="RSS" rel={relTags}>
           <Icon icon="rss" classes="text-muted small" />
         </a>
         <link rel="alternate" type="application/atom+xml" href={communityRss} />
diff --git a/src/shared/components/home/home.tsx b/src/shared/components/home/home.tsx
index 5d430a6..95c34f0 100644
--- a/src/shared/components/home/home.tsx
+++ b/src/shared/components/home/home.tsx
@@ -43,6 +43,7 @@ import {
   mdToHtml,
   notifyPost,
   numToSI,
+  relTags,
   restoreScrollPosition,
   saveCommentRes,
   saveScrollPosition,
@@ -695,7 +696,7 @@ export class Home extends Component<any, HomeState> {
         </span>
         {this.state.listingType == ListingType.All && (
           <>
-            <a href={allRss} rel="noopener" title="RSS">
+            <a href={allRss} rel={relTags} title="RSS">
               <Icon icon="rss" classes="text-muted small" />
             </a>
             <link rel="alternate" type="application/atom+xml" href={allRss} />
@@ -703,7 +704,7 @@ export class Home extends Component<any, HomeState> {
         )}
         {this.state.listingType == ListingType.Local && (
           <>
-            <a href={localRss} rel="noopener" title="RSS">
+            <a href={localRss} rel={relTags} title="RSS">
               <Icon icon="rss" classes="text-muted small" />
             </a>
             <link rel="alternate" type="application/atom+xml" href={localRss} />
@@ -712,7 +713,7 @@ export class Home extends Component<any, HomeState> {
         {UserService.Instance.myUserInfo &&
           this.state.listingType == ListingType.Subscribed && (
             <>
-              <a href={frontRss} title="RSS" rel="noopener">
+              <a href={frontRss} title="RSS" rel={relTags}>
                 <Icon icon="rss" classes="text-muted small" />
               </a>
               <link
diff --git a/src/shared/components/home/instances.tsx b/src/shared/components/home/instances.tsx
index c9a7b1f..c713383 100644
--- a/src/shared/components/home/instances.tsx
+++ b/src/shared/components/home/instances.tsx
@@ -1,7 +1,7 @@
 import { Component } from "inferno";
 import { GetSiteResponse } from "lemmy-js-client";
 import { i18n } from "../../i18next";
-import { setIsoData } from "../../utils";
+import { relTags, setIsoData } from "../../utils";
 import { HtmlTags } from "../common/html-tags";
 
 interface InstancesState {
@@ -60,7 +60,7 @@ export class Instances extends Component<any, InstancesState> {
       <ul>
         {items.map(i => (
           <li>
-            <a href={`https://${i}`} rel="noopener">
+            <a href={`https://${i}`} rel={relTags}>
               {i}
             </a>
           </li>
diff --git a/src/shared/components/person/inbox.tsx b/src/shared/components/person/inbox.tsx
index 470ef5e..7995baf 100644
--- a/src/shared/components/person/inbox.tsx
+++ b/src/shared/components/person/inbox.tsx
@@ -30,6 +30,7 @@ import {
   editCommentRes,
   fetchLimit,
   isBrowser,
+  relTags,
   saveCommentRes,
   setIsoData,
   setupTippy,
@@ -157,7 +158,7 @@ export class Inbox extends Component<any, InboxState> {
               <h5 class="mb-2">
                 {i18n.t("inbox")}
                 <small>
-                  <a href={inboxRss} title="RSS" rel="noopener">
+                  <a href={inboxRss} title="RSS" rel={relTags}>
                     <Icon icon="rss" classes="ml-2 text-muted small" />
                   </a>
                   <link
diff --git a/src/shared/components/person/person-listing.tsx b/src/shared/components/person/person-listing.tsx
index 60e509c..56db662 100644
--- a/src/shared/components/person/person-listing.tsx
+++ b/src/shared/components/person/person-listing.tsx
@@ -1,7 +1,7 @@
 import { Component } from "inferno";
 import { Link } from "inferno-router";
 import { PersonSafe } from "lemmy-js-client";
-import { hostname, isCakeDay, showAvatars } from "../../utils";
+import { hostname, isCakeDay, relTags, showAvatars } from "../../utils";
 import { PictrsImage } from "../common/pictrs-image";
 import { CakeDay } from "./cake-day";
 
@@ -60,6 +60,7 @@ export class PersonListing extends Component<PersonListingProps, any> {
             title={apubName}
             className={this.props.muted ? "text-muted" : "text-info"}
             href={link}
+            rel={relTags}
           >
             {this.avatarAndName(displayName)}
           </a>
diff --git a/src/shared/components/person/profile.tsx b/src/shared/components/person/profile.tsx
index 0f567d2..d94ffab 100644
--- a/src/shared/components/person/profile.tsx
+++ b/src/shared/components/person/profile.tsx
@@ -29,6 +29,7 @@ import {
   mdToHtml,
   numToSI,
   previewLines,
+  relTags,
   restoreScrollPosition,
   routeSortTypeToEnum,
   saveCommentRes,
@@ -346,7 +347,7 @@ export class Profile extends Component<any, ProfileState> {
           hideHot
           hideMostComments
         />
-        <a href={profileRss} rel="noopener" title="RSS">
+        <a href={profileRss} rel={relTags} title="RSS">
           <Icon icon="rss" classes="text-muted small mx-2" />
         </a>
         <link rel="alternate" type="application/atom+xml" href={profileRss} />
@@ -419,7 +420,7 @@ export class Profile extends Component<any, ProfileState> {
                     className={`d-flex align-self-start btn btn-secondary mr-2 ${
                       !pv.person.matrix_user_id && "invisible"
                     }`}
-                    rel="noopener"
+                    rel={relTags}
                     href={`https://matrix.to/#/${pv.person.matrix_user_id}`}
                   >
                     {i18n.t("send_secure_message")}
diff --git a/src/shared/components/person/settings.tsx b/src/shared/components/person/settings.tsx
index 4348a57..a12ee96 100644
--- a/src/shared/components/person/settings.tsx
+++ b/src/shared/components/person/settings.tsx
@@ -34,6 +34,7 @@ import {
   isBrowser,
   personSelectName,
   personToChoice,
+  relTags,
   setIsoData,
   setTheme,
   setupTippy,
@@ -464,7 +465,7 @@ export class Settings extends Component<any, SettingsState> {
           </div>
           <div class="form-group row">
             <label class="col-sm-5 col-form-label" htmlFor="matrix-user-id">
-              <a href={elementUrl} rel="noopener">
+              <a href={elementUrl} rel={relTags}>
                 {i18n.t("matrix_user_id")}
               </a>
             </label>
diff --git a/src/shared/components/post/metadata-card.tsx b/src/shared/components/post/metadata-card.tsx
index 85fcdb6..8c27d2f 100644
--- a/src/shared/components/post/metadata-card.tsx
+++ b/src/shared/components/post/metadata-card.tsx
@@ -1,6 +1,7 @@
 import { Component, linkEvent } from "inferno";
 import { Post } from "lemmy-js-client";
 import { i18n } from "../../i18next";
+import { relTags } from "../../utils";
 import { Icon } from "../common/icon";
 
 interface MetadataCardProps {
@@ -35,7 +36,7 @@ export class MetadataCard extends Component<
                 <div class="card-body">
                   {post.name !== post.embed_title && [
                     <h5 class="card-title d-inline">
-                      <a class="text-body" href={post.url} rel="noopener">
+                      <a class="text-body" href={post.url} rel={relTags}>
                         {post.embed_title}
                       </a>
                     </h5>,
@@ -43,7 +44,7 @@ export class MetadataCard extends Component<
                       <a
                         class="text-muted font-italic"
                         href={post.url}
-                        rel="noopener"
+                        rel={relTags}
                       >
                         {new URL(post.url).hostname}
                         <Icon icon="external-link" classes="ml-1" />
diff --git a/src/shared/components/post/post-form.tsx b/src/shared/components/post/post-form.tsx
index f7b0581..9badb74 100644
--- a/src/shared/components/post/post-form.tsx
+++ b/src/shared/components/post/post-form.tsx
@@ -33,6 +33,7 @@ import {
   isBrowser,
   isImage,
   pictrsDeleteToast,
+  relTags,
   setupTippy,
   toast,
   validTitle,
@@ -219,7 +220,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
                       this.state.postForm.url
                     )}`}
                     class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
-                    rel="noopener"
+                    rel={relTags}
                   >
                     archive.org {i18n.t("archive_link")}
                   </a>
@@ -228,7 +229,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
                       this.state.postForm.url
                     )}`}
                     class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
-                    rel="noopener"
+                    rel={relTags}
                   >
                     ghostarchive.org {i18n.t("archive_link")}
                   </a>
@@ -237,7 +238,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
                       this.state.postForm.url
                     )}`}
                     class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
-                    rel="noopener"
+                    rel={relTags}
                   >
                     archive.today {i18n.t("archive_link")}
                   </a>
diff --git a/src/shared/components/post/post-listing.tsx b/src/shared/components/post/post-listing.tsx
index 36bb912..51ea8b3 100644
--- a/src/shared/components/post/post-listing.tsx
+++ b/src/shared/components/post/post-listing.tsx
@@ -36,6 +36,7 @@ import {
   mdToHtml,
   numToSI,
   previewLines,
+  relTags,
   setupTippy,
   showScores,
   wsClient,
@@ -244,7 +245,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
         <a
           class="text-body d-inline-block position-relative mb-2"
           href={post.url}
-          rel="noopener"
+          rel={relTags}
           title={post.url}
         >
           {this.imgThumb(this.imageSrc)}
@@ -272,7 +273,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
             className="text-body"
             href={post.url}
             title={post.url}
-            rel="noopener"
+            rel={relTags}
           >
             <div class="thumbnail rounded bg-light d-flex justify-content-center">
               <Icon icon="external-link" classes="d-flex align-items-center" />
@@ -335,7 +336,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
                 className="text-muted font-italic"
                 href={post_view.post.url}
                 title={post_view.post.url}
-                rel="noopener"
+                rel={relTags}
               >
                 {hostname(post_view.post.url)}
               </a>
@@ -418,7 +419,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
               className={!post.stickied ? "text-body" : "text-primary"}
               href={post.url}
               title={post.url}
-              rel="noopener"
+              rel={relTags}
             >
               {post.name}
             </a>
diff --git a/src/shared/components/private_message/private-message-form.tsx b/src/shared/components/private_message/private-message-form.tsx
index 60ae52d..4f0e9d1 100644
--- a/src/shared/components/private_message/private-message-form.tsx
+++ b/src/shared/components/private_message/private-message-form.tsx
@@ -16,6 +16,7 @@ import {
   authField,
   capitalizeFirstLetter,
   isBrowser,
+  relTags,
   setupTippy,
   toast,
   wsClient,
@@ -141,7 +142,7 @@ export class PrivateMessageForm extends Component<
                     #
                     <a
                       class="alert-link"
-                      rel="noopener"
+                      rel={relTags}
                       href="https://element.io/get-started"
                     >
                       #
diff --git a/src/shared/utils.ts b/src/shared/utils.ts
index 1c7c5f4..e25d4d4 100644
--- a/src/shared/utils.ts
+++ b/src/shared/utils.ts
@@ -75,6 +75,8 @@ export const postRefetchSeconds: number = 60 * 1000;
 export const fetchLimit = 20;
 export const mentionDropdownFetchLimit = 10;
 
+export const relTags = "noopener nofollow";
+
 export const themes = [
   "litera",
   "materia",