Skip to content

Block Domain

Solved Let's Build It
  • Hello @phenomlab

    I search a javascript code for nodebb to block and replace with a specific/customize message domain an URL Wirth a blacklist on topic, quick reply and composer like plugin-beep do it.

    Iā€™m working on it but I donā€™t have anything that works, hence the request for help from your expertise.

    here an exemple who doesnā€™t work

    // Add this script in a custom JavaScript file or inline in your HTML
    
    document.addEventListener('DOMContentLoaded', function () {
      // List of blocked domains or URLs
      var blockedDomains = [
        'example.com',
        'blockeddomain.com',
        // Add more domains as needed
      ];
    
      // Custom message to be displayed for blocked content
      var blockedMessage = 'This content is blocked.';
    
      // Function to check if a URL contains a blocked domain
      function isBlocked(url) {
        for (var i = 0; i < blockedDomains.length; i++) {
          if (url.includes(blockedDomains[i])) {
            return true;
          }
        }
        return false;
      }
    
      // Function to replace blocked content
      function replaceBlockedContent(content) {
        // Check if the content contains a blocked domain
        if (isBlocked(content)) {
          // Replace the content with the blocked message
          return blockedMessage;
        }
        return content;
      }
    
      // Get all the elements containing topic content (adjust the selector as needed)
      var topicContentElements = document.querySelectorAll('.topic-content');
    
      // Iterate through each element and replace blocked content
      topicContentElements.forEach(function (element) {
        element.innerHTML = replaceBlockedContent(element.innerHTML);
      });
    });
    

    Thanks

  • I have a great code here. I managed to modify the HTTP URL link as well as the link text (description) by modifying them both with a warning message and the URL of my choice for each domain. I am currently redirecting to my checkout page.

    The code also differentiates with text before and after the link and does not take it into account.

    It works :

    • In the topics
    • In the carousel
    • In the previews of the last post in the recent page, unread etcā€¦
    • In Chat

    There are certainly things to improve but Iā€™ll share the code with you here.

    ā€“> This will be my Christmas present šŸŽ…

    If you have any improvements or suggestions, donā€™t hesitate @phenomlab

    // ------------------------------------------------------------------
    // Block Domain URL on topics & Topic teasers & caroussel topic info
    // ------------------------------------------------------------------
    
    $(document).ready(function () {
      // Function to replace URLs and link text in a given HTML content
      function replaceUrls(html) {
        // Replace the old domain URLs with the new domain URL and update link text
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?francesoir\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?francais\.rt\.com(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a domain name of disinformation and propaganda] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?fr\.sputniknews\.africa(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a domain name of disinformation and propaganda] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lecourrierdesstrateges\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lelibrepenseur\.org(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lesmoutonsenrages\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The anti fake news system detected a domain name spreading hate speech and anti-Semitic comments] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?upr\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lecourrier-du-soir\.com(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?fdesouche\.com(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The anti-fake news system detected a domain name disseminating racist hate articles] šŸ¤–</strong></a>');
        // Add more lines for additional domains if needed
        return html;
      }
    
      // Function to replace URLs and link text in a given content element
      function replaceUrlsInContent($content) {
        $content.html(function (_, oldHtml) {
          return replaceUrls(oldHtml);
        });
      }
    
      // Replace URLs and link text when a new post is added
      $(window).on('action:posts.loaded', function () {
        $('[component="post"]').each(function () {
          var $postContent = $(this).find('.content, .topic-info.text-sm.text-break, .content.mt-2.text-break, .stretched-link, .message-body.ps-0.py-0.overflow-auto.text-break');
          // Replace URLs and link text in the post content
          $postContent.html(replaceUrls($postContent.html()));
        });
      });
    
      // Replace URLs and link text when a post is edited
      $(window).on('action:topic.loaded', function () {
        $('[component="post"]').each(function () {
          var $postContent = $(this).find('.content, .topic-info.text-sm.text-break, .content.mt-2.text-break, .stretched-link, .message-body.ps-0.py-0.overflow-auto.text-break');
          // Replace URLs and link text in the post content
          $postContent.html(replaceUrls($postContent.html()));
        });
      });
    
      // Replace URLs and link text when a new page is loaded or content is updated for topic teaser & carroussel topic info
      $(document).ajaxComplete(function () {
        $('.post-content.text-xs.ps-2.line-clamp-sm-2.lh-sm.text-break, .topic-info.text-sm.text-break, .content.mt-2.text-break, .stretched-link, .message-body.ps-0.py-0.overflow-auto.text-break').each(function () {
          var $content = $(this);
          replaceUrlsInContent($content);
        });
      });
    });
    

    PS : nothing to see but appearance code on topics bug :
    The Block code is no longer displayed in its entirety but only on one line :

    f28171b1-e396-49dc-a8f3-97be40f04371-image.png

  • @DownPW What should the desired effect be from the composer - for example, prevent submission etc? If you can provide a bit more info in relation to what should happen, this would be beneficial.

  • I would prefer the same behavior as the nodebb-plugin-beep plugin :

    The URL is replaced in the quick reply component, the composer and in topics but does not prevent the submission of the message or post, just replace URL


    I changed my approach and I have code that works but only on topics using [component="post"] but after posting the message, URL is not replaced I must refresh the page.

    $(document).ready(function () {
      $(window).on('action:ajaxify.end', function () {
        // Target the post content within the post component
        $('[component="post"]').each(function () {
          var $postContent = $(this).find('.content');
    
          // Replace the old domain URLs with the new domain URL
          $postContent.html(function (index, oldHtml) {
            // Match the old domain URLs
            oldHtml = oldHtml.replace(/https?:\/\/(www\.)?francesoir\.fr[^\s]*/g, 'https://new-domain.com');
            oldHtml = oldHtml.replace(/https?:\/\/(www\.)?francais\.rt.com[^\s]*/g, 'https://new-domain.com');
            return oldHtml;
          });
        });
      });
    });
    
  • working code only on topics :

    $(document).ready(function () {
      // Function to replace URLs in a given HTML content
      function replaceUrls(html) {
        // Replace the old domain URLs with the new domain URL
        html = html.replace(/https?:\/\/(www\.)?francesoir\.fr[^\s]*/g, 'https://new-domain.com');
        html = html.replace(/https?:\/\/(www\.)?francais\.rt.com[^\s]*/g, 'https://new-domain.com');
        // Add more lines for additional domains if needed
        return html;
      }
    
      // Replace URLs when a new post is added
      $(window).on('action:posts.loaded', function () {
        $('[component="post"]').each(function () {
          var $postContent = $(this).find('.content');
          // Replace URLs in the post content
          $postContent.html(replaceUrls($postContent.html()));
        });
      });
    
      // Replace URLs when a post is edited
      $(window).on('action:topic.loaded', function () {
        $('[component="post"]').each(function () {
          var $postContent = $(this).find('.content');
          // Replace URLs in the post content
          $postContent.html(replaceUrls($postContent.html()));
        });
      });
    });
    

    Itā€™s already not bad, just adapt it for the quick reply and composer

  • @DownPW what you have is already what I would have suggested - particularly the hooks - as you indicate, it just needs expansion to cover other aspects.

    However, itā€™s worth noting that none of the code you have will prevent someone from viewing the source, and seeing the true URLs as you are not modifying any of the database entries.

  • yes you are right but it is not very serious. Most of my users wonā€™t look at the source code but if you have better why not.

    If you have any ideas for adapting it to quick reply and composing. Iā€™m interested. Iā€™m taking a little break for now

  • PS : nothing to see but appearance code on topics bug :

    12c57654-b8fb-49bf-9c75-849e51ee39b1-image.png

  • @DownPW said in Block Domain:

    If you have any ideas for adapting it to quick reply and composing. Iā€™m interested.

    Let me have a look at this in more detail in DEV.

  • In previous code, i want to add html link to rules page like this :

    html = html.replace(/https?:\/\/(www\.)?francesoir\.fr[^\s]*/g, '<a href="https://XXXXX.XXXXX.XXX/rules">Test</a>');
    

    But i have this on result :

    image.png

    an idea ?

  • @DownPW Yes, direct HTML rendering is disabled (as is JS) in the composer so it will be stripped. For this to work, youā€™d need to enable HTML support in the composer which isnā€™t recommended for security reasons.

  • too bad I would have liked to be redirected to the necessary page

    ChatGPT doesnā€™t help on this šŸ˜‰

  • I have a great code here. I managed to modify the HTTP URL link as well as the link text (description) by modifying them both with a warning message and the URL of my choice for each domain. I am currently redirecting to my checkout page.

    The code also differentiates with text before and after the link and does not take it into account.

    It works :

    • In the topics
    • In the carousel
    • In the previews of the last post in the recent page, unread etcā€¦
    • In Chat

    There are certainly things to improve but Iā€™ll share the code with you here.

    ā€“> This will be my Christmas present šŸŽ…

    If you have any improvements or suggestions, donā€™t hesitate @phenomlab

    // ------------------------------------------------------------------
    // Block Domain URL on topics & Topic teasers & caroussel topic info
    // ------------------------------------------------------------------
    
    $(document).ready(function () {
      // Function to replace URLs and link text in a given HTML content
      function replaceUrls(html) {
        // Replace the old domain URLs with the new domain URL and update link text
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?francesoir\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?francais\.rt\.com(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a domain name of disinformation and propaganda] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?fr\.sputniknews\.africa(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a domain name of disinformation and propaganda] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lecourrierdesstrateges\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lelibrepenseur\.org(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lesmoutonsenrages\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The anti fake news system detected a domain name spreading hate speech and anti-Semitic comments] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?upr\.fr(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?lecourrier-du-soir\.com(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The PW anti fake news system detected a disinformation domain name] šŸ¤–</strong></a>');
        html = html.replace(/(<a[^>]*href="https?:\/\/(?:www\.)?fdesouche\.com(?:\/[^\s>]*)?"[^>]*>)([^<]*)<\/a>/g, '<a href="https://YOUR_URL_REDIRECTION/rules"><strong>šŸ¤– [Oups. The anti-fake news system detected a domain name disseminating racist hate articles] šŸ¤–</strong></a>');
        // Add more lines for additional domains if needed
        return html;
      }
    
      // Function to replace URLs and link text in a given content element
      function replaceUrlsInContent($content) {
        $content.html(function (_, oldHtml) {
          return replaceUrls(oldHtml);
        });
      }
    
      // Replace URLs and link text when a new post is added
      $(window).on('action:posts.loaded', function () {
        $('[component="post"]').each(function () {
          var $postContent = $(this).find('.content, .topic-info.text-sm.text-break, .content.mt-2.text-break, .stretched-link, .message-body.ps-0.py-0.overflow-auto.text-break');
          // Replace URLs and link text in the post content
          $postContent.html(replaceUrls($postContent.html()));
        });
      });
    
      // Replace URLs and link text when a post is edited
      $(window).on('action:topic.loaded', function () {
        $('[component="post"]').each(function () {
          var $postContent = $(this).find('.content, .topic-info.text-sm.text-break, .content.mt-2.text-break, .stretched-link, .message-body.ps-0.py-0.overflow-auto.text-break');
          // Replace URLs and link text in the post content
          $postContent.html(replaceUrls($postContent.html()));
        });
      });
    
      // Replace URLs and link text when a new page is loaded or content is updated for topic teaser & carroussel topic info
      $(document).ajaxComplete(function () {
        $('.post-content.text-xs.ps-2.line-clamp-sm-2.lh-sm.text-break, .topic-info.text-sm.text-break, .content.mt-2.text-break, .stretched-link, .message-body.ps-0.py-0.overflow-auto.text-break').each(function () {
          var $content = $(this);
          replaceUrlsInContent($content);
        });
      });
    });
    

    PS : nothing to see but appearance code on topics bug :
    The Block code is no longer displayed in its entirety but only on one line :

    f28171b1-e396-49dc-a8f3-97be40f04371-image.png

  • DownPWundefined DownPW has marked this topic as solved on
  • @DownPW that code looks great. I seem to have trained you well!

    Iā€™ll investigate the single line of code issue. I think thatā€™s probably because of a modified version of highlight. js I use.

  • @phenomlab

    My code work great but a little more šŸ˜‰
    My code conflicts with your OGPROXY code.

    Do you have an idea so that the two can live together?

  • @DownPW Potentially, yes, but what is the conflict exactly?

  • I donā€™t know, I just see that OG proxy does not format the links when my code to block domains is active.

    If I disable it, OG proxy works fine.

    I would have to make sure that OG proxy does not activate when a blacklist link is detected or that it works one after the other

    Actually I donā€™t really know at the moment.

    EDIT:

    Maybe add an ignore list to OG PROXY

  • @DownPW said in Block Domain:

    I donā€™t know, I just see that OG proxy does not format the links when my code to block domains is active.

    This just means that the callback / hook isnā€™t monitored by OGProxy and can probably be quite easily rectified.

    @DownPW said in Block Domain:

    Maybe add an ignore list to OG PROXY

    There is one already in function.js - see below

    https://github.com/phenomlab/ogproxy/blob/03d5ff125611361700d785bd82a6ab16fcd68bfc/function.js#L9

  • In any case, it doesnā€™t change anything in fact I think to add exclusions in OG Proxy, because links which are not to be ignored are not formatted by OG proxy

    @phenomlab said in Block Domain:

    This just means that the callback / hook isnā€™t monitored by OGProxy and can probably be quite easily rectified.

    Iā€™ll look and try to figure it out but can you help me with this ?

  • @DownPW said in Block Domain:

    Iā€™ll look and try to figure it out but can you help me with this ?

    Yes, of course.

  • no luck for now


Did this solution help you?
Did you find the suggested solution useful? Why not buy me a coffee? It's a nice gesture, and a great way to show your appreciation šŸ’—

Related Topics
  • Opening links in nodebb widget

    Solved Configure
    6
    4 Votes
    6 Posts
    366 Views

    A more efficient way of including this would be to not over complicate it and leverage a standard iframe (providing the CSP headers of the remote site permit this) like below

    <iframe src="https://www.classmarker.com/online-test/start/?quiz=gag66aea7922f0a5" width="700" height="800"></iframe>

    This works first time every time on your site as intended.

  • Bug in Nodebb route when clicking title

    Moved Configure
    3
    2 Votes
    3 Posts
    235 Views

    Ah silly me, thanks for finding that!

  • SEO and Nodebb

    Performance
    2
    2 Votes
    2 Posts
    329 Views

    @Panda Itā€™s the best itā€™s ever been to be honest. Iā€™ve used a myriad of systems in the past - most notably, WordPress, and then Flarum (which for SEO, was absolutely dire - they never even had SEO out of the box, and relied on a third party extension to do it), and NodeBB easily fares the best - see below example

    https://www.google.com/search?q=site%3Asudonix.org&oq=site%3Asudonix.org&aqs=chrome..69i57j69i60j69i58j69i60l2.9039j0j3&sourceid=chrome&ie=UTF-8#ip=1

    However, this was not without significant effort on my part once Iā€™d migrated from COM to ORG - see below posts

    https://community.nodebb.org/topic/17286/google-crawl-error-after-site-migration/17?_=1688461250365

    And also

    https://support.google.com/webmasters/thread/221027803?hl=en&msgid=221464164

    It was painful to say the least - as it turns out, there was an issue in NodeBB core that prevented spiders from getting to content, which as far as I understand, is now fixed. SEO in itself is a dark art - a black box that nobody really fully understands, and itā€™s essentially going to boil down to one thing - ā€œcontentā€.

    Googleā€™s algorithm for indexing has also changed dramatically over the years. They only now crawl content that has value, so if it believes that your site has nothing to offer, it will simply skip it.

  • 2 Votes
    2 Posts
    180 Views

    @dave1904 thatā€™s a really good point actually. I know it was there previously on Persona, but youā€™re right - no such function exists on harmony.

    However, putting something in place to mimick the behaviour of Persona wonā€™t be hard from the js standpoint, although I wonder if perhaps we should ask the NodeBB developers is this feature was overlooked?

  • Welcome to NodeBB V3!

    Pinned Moved General
    1
    0 Votes
    1 Posts
    245 Views
    No one has replied
  • NodeBB: updating Admin details not working

    Solved Configure
    17
    3 Votes
    17 Posts
    688 Views

    @mventures Ok. No issues

  • [NODEBB] Welcome Message

    Solved Customisation
    18
    13 Votes
    18 Posts
    2k Views

    For anyone reviewing this post, thereā€™s an updated version here that also includes an sunrise / sun / moon icon depending on the time of day

    https://sudonix.com/topic/233/nodebb-welcome-message-with-logo-footer-change/3?_=1645445273209

  • [NodeBB] username cards

    Solved Customisation
    8
    5 Votes
    8 Posts
    950 Views

    @phenomlab

    Ahaā€¦nice to know. As always thank you for the reply and information.