News for hackers. Stuff that matters.
Re:New tools for open source maintainers by kazinator on Wednesday April 18, 2018 @10:15PM (#16872848)
You can post using a fake or cloaked From: address to my mailing lists. I don't require a subscription for posting. You can always check the mail archive for replies to your post, if you care. I don't allow mail archives to be downloaded in the raw format. I added extra patches to the archiving software to conceal addresses better.

Mailman just replaces @ with "at" which spam harvesters could easily reverse; I made it better for my users; see below.

Kazinator's got your back!

  0:webserver:/var/lib/mailman# quilt applied
  privacy
  pipermail-to-lurker

  0:webserver:/var/lib/mailman# cat patches/privacy
  Index: mailman/Mailman/Archiver/HyperArch.py
  ===================================================================
  --- mailman.orig/Mailman/Archiver/HyperArch.py        2012-11-29 21:26:57.000000000 -0800
  +++ mailman/Mailman/Archiver/HyperArch.py     2012-11-29 22:27:51.000000000 -0800
  @@ -93,6 +93,8 @@
       True = 1
       False = 0

  +def hide_domain(s):
  +    return re.sub(r'([\w])([-+,.\w]+)([\w])@([\w])([-+.\w]+)([\w])[.]([\w]+)', '\g<1>...\g<3>@\g<4>...\g<6>.\g<7>', s)

   def html_quote(s, lang=None):
  @@ -281,10 +283,9 @@
               try:
                   i18n.set_language(lang)
                   if self.author == self.email:
  -                    self.author = self.email = re.sub('@', _(' at '),
  -                                                      self.email)
  +                    self.author = self.email = hide_domain(self.email)
                   else:
  -                    self.email = re.sub('@', _(' at '), self.email)
  +                    self.email = hide_domain(self.email)
               finally:
                   i18n.set_translation(otrans)

  @@ -412,9 +413,7 @@
                   otrans = i18n.get_translation()
                   try:
                       i18n.set_language(self._lang)
  -                    atmark = unicode(_(' at '), Utils.GetCharSet(self._lang))
  -                    subject = re.sub(r'([-+,.\w]+)@([-+.\w]+)',
  -                              '\g<1>' + atmark + '\g<2>', subject)
  +                    subject = hide_domain(subject)
                   finally:
                       i18n.set_translation(otrans)
               self.decoded['subject'] = subject
  @@ -466,7 +465,7 @@
               d["in_reply_to_url"] = url_quote(self._message_id)
               if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
                   # Point the mailto url back to the list
  -                author = re.sub('@', _(' at '), self.author)
  +                author = hide_domain(self.author)
                   emailurl = self._mlist.GetListEmail()
               else:
                   author = self.author
  @@ -574,10 +573,8 @@
           if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
               otrans = i18n.get_translation()
               try:
  -                atmark = unicode(_(' at '), cset)
                   i18n.set_language(self._lang)
  -                body = re.sub(r'([-+,.\w]+)@([-+.\w]+)',
  -                              '\g<1>' + atmark + '\g<2>', body)
  +                body = hide_domain(body)
               finally:
                   i18n.set_translation(otrans)
           # Return body to character set of article.
  @@ -1049,7 +1046,7 @@
           author = self.get_header("author", article)
           if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
               try:
  -                author = re.sub('@', _(' at '), author)
  +                author = hide_domain(author)
               except UnicodeError:
                   # Non-ASCII author contains '@' ... no valid email anyway
                   pass
  @@ -1221,7 +1218,7 @@
                       text = jr.group(1)
                       length = len(text)
                       if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
  -                        text = re.sub('@', atmark, text)
  +                        text = hide_domain(text)
                           URL = self.maillist.GetScriptURL(
                               'listinfo', absolute=1)
                       else:
  Index: mailman/Mailman/Utils.py
  ===================================================================
  --- mailman.orig/Mailman/Utils.py     2012-11-29 21:26:57.000000000 -0800
  +++ mailman/Mailman/Utils.py  2012-11-29 21:26:58.000000000 -0800
  @@ -438,9 +438,9 @@
       When for_text option is set (not default), make a sentence fragment
       instead of a token."""
       if for_text:
  -        return addr.replace('@', ' at ')
  +        return 'address-hidden'
       else:
  -        return addr.replace('@', '--at--')
  +        return 'address-hidden'

   def UnobscureEmail(addr):
       """Invert ObscureEmail() conversion."""

There are no comments on this comment yet.