<!--
 File        :  doc/source/changelog.sgml

 Purpose     :  Entity included in other project documents.

 Copyright (C) 2013-2026 Privoxy Developers https://www.privoxy.org/
 See LICENSE.

 ======================================================================
  This file used for inclusion with other documents only.
 ======================================================================

 If you make changes to this file, please verify the finished
 docs all display as intended.

 This file is included into:

  user-manual
-->


<!--
 The SGML ChangeLog can be generated with: utils/changelog2doc.pl ChangeLog
-->

<para>
  <application>Privoxy 4.1.0</application> fixes a few
  minor bugs and brings ZStandard-decompression support and
  a couple of general improvements.
</para>
<para>
  Changes in <application>Privoxy 4.1.0</application> stable:
</para>
<para>
 <itemizedlist>
  <listitem>
   <para>
    General improvements:
    <itemizedlist>
    <listitem>
     <para>
      Add Zstandard-decompression support.
     </para>
    </listitem>
    <listitem>
     <para>
      compile_pattern(): Use pcre2_get_error_message() to provide better error messages.
     </para>
    </listitem>
    <listitem>
     <para>
      wolfssl: Use wolfTLS_client_method() instead of wolfSSLv23_method()
      when creating the connection to the server. Allows to connect to
      <ulink url="https://media.ccc.de/"></ulink> and <ulink url="https://traxxas.com/">https://traxxas.com/</ulink> while wolfSSLv23_method()
      currently doesn't (wolfSSL 5.8.4). Unfortunately this does not allow to
      connect to <ulink url="https://www.fsf.org/">https://www.fsf.org/</ulink> while wolfSSLv23_method() does.
      Reported upstream in <ulink url="https://github.com/wolfSSL/wolfssl/issues/7735">https://github.com/wolfSSL/wolfssl/issues/7735</ulink>.
      curl is using wolfTLS_client_method() with recent wolfSSL versions
      as well so this seems to be the way to go.
     </para>
    </listitem>
    <listitem>
     <para>
      wolfssl: Warn if HAVE_SECURE_RENEGOTIATION is unavailable
      and don't suggest to use HAVE_RENEGOTIATION_INDICATION instead.
     </para>
    </listitem>
    <listitem>
     <para>
      show-status template: Add links for external (de)compression libraries.
     </para>
    </listitem>
    <listitem>
     <para>
      If the server sends multiple Connection headers, only parse and
      forward the first one.
     </para>
    </listitem>
    <listitem>
     <para>
      create_hexadecimal_hash_of_host(): Use snprintf() instead of sprint()
      Silences a warning on OpenBSD.
     </para>
    </listitem>
    <listitem>
     <para>
      Also log the listening address and port the request came in on.
     </para>
    </listitem>
    <listitem>
     <para>
      Added periods to a couple of log messages.
     </para>
    </listitem>
    <listitem>
     <para>
      Removed support for pcre1.
     </para>
    </listitem>
    <listitem>
     <para>
      configure.in: Removed obsolete warning if OpenSSL is detected.
      Recent OpenSSL versions are licensed under the Apache 2 license so
      the "special exception" from section 3 of the GPLv2 isn't needed
      and a Privoxy binary linked to OpenSSL can be distributed under the
      GPLv3 or later.
     </para>
    </listitem>
    <listitem>
     <para>
      init_domain_components(): Assert that the http->dbuffer and http->dvec
      are NULL to detect memory leaks earlier.
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    Bug fixes:
    <itemizedlist>
    <listitem>
     <para>
      openssl: Don't call SSL_set_tlsext_host_name() if the host is an IP address
      With LibreSSl the call simply fails and with OpenSSL the call
      succeeds but results in an syntactically incorrect ClientHello
      a server may object to. While at it, add the host name to the error message.
     </para>
    </listitem>
    <listitem>
     <para>
      Don't forward connection options Privoxy doesn't understand.
     </para>
    </listitem>
    <listitem>
     <para>
      Look for the "keep-alive" keyword more carefully in Connection headers.
      Previously connections were not kept alive if the Connection header
      contained additional keywords like "Upgrade".
     </para>
    </listitem>
    <listitem>
     <para>
      If the MS IIS5 hack fails, only send the error response if we're buffering content
      Previously the error response was also sent if the client already
      received the HTTP headers from the server.
     </para>
    </listitem>
    <listitem>
     <para>
      Fix compilation when configured with --disable-ipv6-support.
      Submitted by Luca Broglio.
     </para>
    </listitem>
    <listitem>
     <para>
      Fixed detection and use of pcre2.h from a subdirectory.
      SF bug #946. Patch submitted by Jakub Kulik.
     </para>
    </listitem>
    <listitem>
     <para>
      Properly handle IPv6 addresses in the Host header.
      Reported by Joshua Rogers.
     </para>
    </listitem>
    <listitem>
     <para>
      socks4_connect(): Fix the dstsize passed to strlcpy() in case of socks4a.
      Previously Privoxy would substract sizeof(struct socks_op) twice
      as it's already part of csiz. While this was wrong it didn't
      cause any actual problems as the buffer size is so large that
      it didn't matter. Reported by Joshua Rogers.
     </para>
    </listitem>
    <listitem>
     <para>
      error_response(): Prevent a theoretical memory leak. Reported by Joshua Rogers.
     </para>
    </listitem>
    <listitem>
     <para>
      log_error(): Fix a segmentation fault when logging %E on a platform that
      isn't Windows and doesn't have strerror(). Reported by Joshua Rogers.
     </para>
    </listitem>
    <listitem>
     <para>
      accept_connection(): Fix memory and socket leak if the server name and
      port number ASCII decimal representation don't fit. This is not expected
      to happen. Reported by Joshua Rogers.
     </para>
    </listitem>
    <listitem>
     <para>
      parse_http_url(): Fail if no host is found when we expected one.
      This can happen in case of invalid requests in which case
      Privoxy previously would leak a couple of bytes of memory.
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    Action file improvements:
    <itemizedlist>
    <listitem>
     <para>
      Prevent a fingerprinting issue with various login pages by not handling
      the requests as image requests or fast-redirecting them. Without the added
      section a request to a blocked or redirected login URL could be misdetected
      by third parties as the user being logged in to the given site, thus making
      fingerprinting Privoxy users easier. Note that this does not prevent the
      fingerprinting issue if the client is actually logged in. For details see
      <ulink url="https://robinlinus.github.io/socialmedia-leak/">https://robinlinus.github.io/socialmedia-leak/</ulink>.
      Doing that would probably be too invasive for a default configuration.
     </para>
    </listitem>
    <listitem>
     <para>
      Stop downgrading the HTTP version for port 631. It was supposed to work
      around a problem with the CUPS webinterface but about 20 years later we
      probably don't need it anymore ...
     </para>
    </listitem>
    <listitem>
     <para>
      Fix sticky actions for .flickr.com to match the action section.
     </para>
    </listitem>
    <listitem>
     <para>
      Remove an action section without an URL pattern.
     </para>
    </listitem>
    <listitem>
     <para>
      Disable fast-redirects for .bahn.de/
     </para>
    </listitem>
    <listitem>
     <para>
      Disable fast-redirects for report.error-report.com/
     </para>
    </listitem>
    <listitem>
     <para>
      Unblock metrics.1aeo.com/
     </para>
    </listitem>
    <listitem>
     <para>
      Unblock .crates.io/
     </para>
    </listitem>
    <listitem>
     <para>
      Block requests for mv.outbrain.com/
     </para>
    </listitem>
    <listitem>
     <para>
      Disable filter{banners-by-size} for .jwz.org/
     </para>
    </listitem>
    <listitem>
     <para>
      Disable deanimate-gifs for .githubusercontent.com/
     </para>
    </listitem>
    <listitem>
     <para>
      Disable the banners-by-size filter for github.com
     </para>
    </listitem>
    <listitem>
     <para>
      Widen block pattern from 'metrics.' to '.metricts.'
     </para>
    </listitem>
    <listitem>
     <para>
      Add +server-header-tagger{content-type} to all standard settings.
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    Filter improvements:
    <itemizedlist>
    <listitem>
     <para>
      Update imdb filter to remove wasted space below the search field.
     </para>
    </listitem>
    <listitem>
     <para>
      Update bundeswehr.de filter to be effective again.
     </para>
    </listitem>
    <listitem>
     <para>
      Removed the obsolete ie-exploits filter. It didn't actually reliably
      protect against Nimda, there never were active maintainers and IE is
      obsolete anyway. Also some virus scanners seem to be offended by the
      test case for the filter in the source tarball.
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    Privoxy-Log-Parser:
    <itemizedlist>
    <listitem>
     <para>
      Bumped version to 0.9.7.
     </para>
    </listitem>
    <listitem>
     <para>
      Fully highlight: Accepted connection from 127.0.0.1 on socket 9 connected through 127.0.1.1:8118.
     </para>
    </listitem>
    <listitem>
     <para>
      Highlight: Socket 8 timed out while waiting for client headers
     </para>
    </listitem>
    <listitem>
     <para>
      Highlight: 'Giving up draining socket 35.'
     </para>
    </listitem>
    <listitem>
     <para>
      Highlight: "Tagger 'http-method' didn't add tag 'POST': suppressed"
     </para>
    </listitem>
    <listitem>
     <para>
      Highlight: 'Skipped filter 'banners-by-size' after job number 1: match limit exceeded (-47)'
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    uagen:
    <itemizedlist>
    <listitem>
     <para>
      Bumped version to 0.1.7
     </para>
    </listitem>
    <listitem>
     <para>
      Bumped BROWSER_VERSION and BROWSER_REVISION to match Firefox ESR 140.
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    Documentation:
    <itemizedlist>
    <listitem>
     <para>
      Updated license info to deal with wolfSSL's license change to GPLv3.
     </para>
    </listitem>
    <listitem>
     <para>
      Added new FAQ: 'Is the Privoxy source tarball infected by a virus?'.
     </para>
    </listitem>
    <listitem>
     <para>
      Removed claims that path matching can be turned case-sensitive.
      The suggested method didn't actually work.
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    Website improvements:
    <itemizedlist>
    <listitem>
     <para>
      GNUmakefile.in: Add a web-robots.txt target to only transfer the robots.txt to the SF server.
     </para>
    </listitem>
    <listitem>
     <para>
      robots.txt: Disallow /gitweb to hopefully reduce the load on the webserver
     </para>
    </listitem>
    <listitem>
     <para>
      robots.txt: Remove stray empty lines
     </para>
    </listitem>
    <listitem>
     <para>
      Added a vanity onion address for the privoxy.org onion service.
     </para>
    </listitem>
    </itemizedlist>
   </para>
  </listitem>
  <listitem>
   <para>
    Tests:
    <itemizedlist>
    <listitem>
     <para>
      Updated test framework to work with recent (rc-8_18_0-3) cts upstream tests.
     </para>
    </listitem>
    <listitem>
     <para>
      tests/cts/run-privoxy-tests.sh: Pass arguments that follow "--" to
      runtests-wrapper.sh so they can be passed to runtests.pl.
      This allows to only run a single test without modifying the scripts:
      ./run-privoxy-tests.sh -t upstream-tests -- 473
     </para>
    </listitem>
    <listitem>
     <para>
      run-privoxy-tests.sh: Explicitly log if there were no errors.
     </para>
    </listitem>
    <listitem>
     <para>
      run-privoxy-tests.sh: Continue testing if a test in a test scenario fails.
     </para>
    </listitem>
    <listitem>
     <para>
      runtests-wrapper.sh: Explicitly set the path to the curl binary
      using an absolute path. Otherwise runtests.pl uses a relative
      path in its output which can be confusing.
     </para>
    </listitem>
    <listitem>
     <para>
      runtests-wrapper.sh: Improve a log message.
     </para>
    </listitem>
    <listitem>
     <para>
      Disable the forward-to-socks-proxy and forward-to-http-proxy scenarios
      for now. Since curl commit d39db811929f the port randomisation can no
      longer be disabled by the injected module so the tests don't work at the
      moment. Discussion on the curl library mailinglist didn't result in
      a solution (<ulink url="https://curl.se/mail/lib-2025-08/0000.html">https://curl.se/mail/lib-2025-08/0000.html</ulink>).
     </para>
    </listitem>
    <listitem>
     <para>
      tests/cts: Remove 'none' server section from tests.
      It's no longer supported as of curl commit 71c9706959cb.
     </para>
    </listitem>
    <listitem>
     <para>
      run-privoxy-tests.sh: Print supported arguments in case of invalid ones.
     </para>
    </listitem>
    <listitem>
     <para>
      Add a test for the bundeswehr.de filter.
     </para>
    </listitem>
    <listitem>
     <para>
      tests/cts/gzip-compression/data/test13: Fix repetitive sequence by adding a missing %.
     </para>
    </listitem>
    <listitem>
     <para>
      Add a couple of tests for connection headers with keep-alive-timeout set.
     </para>
    </listitem>
    <listitem>
     <para>
      Add fetch test for the How-Tos in the user manual.
     </para>
    </listitem>
    <listitem>
     <para>
      ../privoxy-runtests.pm: Prevent warning if $_ is undefined.
     </para>
    </listitem>
    <listitem>
     <para>
      tests/cts/runtests-wrapper.sh: Stop explicitly setting HOSTIP.
      It doesn't work with curl master at the moment.
     </para>
    </listitem>
    <listitem>
     <para>
      Let the "clean" target remove logs from the cts tests.
     </para>
    </listitem>
    <listitem>
     <para>
      .../content-filters/content-filters.action: Remove duplicate action section.
     </para>
     </listitem>
    </itemizedlist>
   </para>
  </listitem>
 </itemizedlist>
</para>
