diff --git a/config.json.example b/config.json.example index 3875097d6c..9872fad88f 100644 --- a/config.json.example +++ b/config.json.example @@ -86,5 +86,6 @@ "RATE_LIMITER_ENABLED": "false", "REDIS_HOST": "aaabbbcccdddeeefff", "REDIS_PORT": "1234", - "REDIS_PASSWORD": "12345678" + "REDIS_PASSWORD": "12345678", + "TRUSTED_DOMAINS": "https://localhost,https://habitica.com" } diff --git a/website/client/src/components/groups/chat.vue b/website/client/src/components/groups/chat.vue index 69038946b8..dce51d6a1d 100644 --- a/website/client/src/components/groups/chat.vue +++ b/website/client/src/components/groups/chat.vue @@ -135,6 +135,7 @@ export default { }, mounted () { this.textbox = this.$refs['user-entry']; + this.handleExternalLinks(); }, updated () { this.handleExternalLinks(); diff --git a/website/client/src/components/messages/messageCard.vue b/website/client/src/components/messages/messageCard.vue index 7c7d2581c0..4cbd92e15d 100644 --- a/website/client/src/components/messages/messageCard.vue +++ b/website/client/src/components/messages/messageCard.vue @@ -139,6 +139,8 @@ import axios from 'axios'; import moment from 'moment'; +import externalLinks from '../../mixins/externalLinks'; + import renderWithMentions from '@/libs/renderWithMentions'; import { mapState } from '@/libs/store'; import userLink from '../userLink'; @@ -150,6 +152,7 @@ export default { components: { userLink, }, + mixins: [externalLinks], filters: { timeAgo (value) { return moment(value).fromNow(); @@ -179,6 +182,10 @@ export default { }, mounted () { this.$emit('message-card-mounted'); + this.handleExternalLinks(); + }, + updated () { + this.handleExternalLinks(); }, methods: { report () { diff --git a/website/client/src/mixins/externalLinks.js b/website/client/src/mixins/externalLinks.js index dc4f26cb86..bce267da7c 100644 --- a/website/client/src/mixins/externalLinks.js +++ b/website/client/src/mixins/externalLinks.js @@ -1,18 +1,9 @@ import some from 'lodash/some'; export default { - data () { - return { - trustedDomains: [ - 'https://habitica.com', - 'http://localhost', - 'https://tools.habitica.com', - 'https://translate.habitica.com', - ], - }; - }, methods: { handleExternalLinks () { + const { TRUSTED_DOMAINS } = process.env; const allLinks = document.getElementsByTagName('a'); for (let i = 0; i < allLinks.length; i += 1) { @@ -20,7 +11,7 @@ export default { if ((link.classList.value.indexOf('external-link') === -1) && link.href.slice(0, 4) === 'http' - && !some(this.trustedDomains, domain => link.href.indexOf(domain) === 0)) { + && !some(TRUSTED_DOMAINS.split(','), domain => link.href.indexOf(domain) === 0)) { link.classList.add('external-link'); link.addEventListener('click', e => { if (e.ctrlKey) { diff --git a/website/client/vue.config.js b/website/client/vue.config.js index fd9f24185f..42ecd094e5 100644 --- a/website/client/vue.config.js +++ b/website/client/vue.config.js @@ -27,6 +27,7 @@ const envVars = [ 'APPLE_AUTH_CLIENT_ID', 'AMPLITUDE_KEY', 'LOGGLY_CLIENT_TOKEN', + 'TRUSTED_DOMAINS', // TODO necessary? if yes how not to mess up with vue cli? 'NODE_ENV' ];