News
****

Release 7.7.0
=============

   • Experimental "kqueue" and "inotify" based notifications support
     about spool directory changes, for reducing their often reading
     overhead.

   • ".seen" and ".hdr" files moved to "seen/" and "hdr/"
     subdirectories, for faster scanning of spool directories.  Current
     files migration required:

          $ find $NNCPSPOOL -type f -name "*.hdr" -exec rm {} +

          $ find $NNCPSPOOL -type d -name rx | while read rx ; do
              cd $rx
              mkdir -p seen
              find . -type f -name "*.seen" | while read fn ; do
                  mv $fn seen/${fn%.seen}
              done
          done

          $ find $NNCPSPOOL -type d -name area | while read area ; do
              find $area -type f -name "*.seen" | while read fn ; do
                  mv $fn ${fn%.seen}
              done
          done

Release 7.6.0
=============

   • Logging may be done to specified opened file descriptor
     ("$NNCPLOG=FD:5" for example).  That is friendly to use under
     "daemontools".

   • Added additional checks of public keys existence in configuration
     file, preventing some commands from failing.

Release 7.5.1
=============

   • NNCP builds on NetBSD.

Release 7.5.0
=============

   • "nncp-daemon" is compatible with UCSPI-TCP interface, so log will
     contain remote side’s address (when running under appropriate
     utility).  "-ucspi" option should be used instead of "-inetd".

   • "nncp-call" can be UCSPI-TCP client, using "-ucspi" option.

   • Do not exit if some of MCD network interfaces can not be listened –
     only warn about that.

Release 7.4.0
=============

   • Fixed simultaneous "nncp-daemon" and "nncp-caller" MCD work.

Release 7.3.2
=============

   • "hjson-cli" utility builds in vendor-mode now.

Release 7.3.1
=============

   • Fixed possibly left opened file descriptor in online commands.

   • Severely decreased memory usage of MTH hashing.

Release 7.3.0
=============

   • Fixed some workability problems on 32-bit systems with big files.

   • Ability to use directory with a bunch of files as a configuration.
     "nncp-cfgdir" command appeared.

Release 7.2.1
=============

   • Small optimizations in online commands.

Release 7.2.0
=============

   • "nncp-trns" command appeared for manual transition packets
     creation.

   • If destination node of transitional packet has non empty "via"
     route, then do not ignore, but use it.

   • Do not relay multicast packet to area message’s originator, that
     obviously has seen its own packet.

   • Much less memory usage during MTH hashing when offset is zero: when
     packet is not resumed, but for example checked with "nncp-check"
     command.

Release 7.1.1
=============

   • Fixed failing directories fsync after ".seen" file creation.

Release 7.1.0
=============

   • Multicasting areas feature appeared.  Implemented merely by an
     additional plain packet type with "nncp-toss", "nncp-file" and
     "nncp-exec" commands modification.

   • Fixed workability of "nncp-file" and "nncp-exec" commands, that use
     temporary file (stdin and "-use-tmp").

   • Fixed disappearing bad return code in "nncp-exec" command.

   • Fixed invalid ".hdr" generation when transitional packets are used.

   • "-all" option appeared in "nncp-rm" command, applying to all the
     nodes at once.

   • "-cycle" option appeared in "nncp-check" command, looping the check
     in infinite cycle.

   • "nncp-rm" command can take node alias name.

   • "nncp-pkt" can parse ".hdr" files.

Release 7.0.0
=============

   • Minimal required Go version 1.13.

   • Merkle Tree-based Hashing with BLAKE3 (MTH) is used instead of
     BLAKE2b.  Because of that, there are backward *incompatible*
     changes of encrypted files (everything laying in the spool
     directory) and ".meta" files of chunked transfer.

     Current implementation is far from being optimal: it lacks
     parallelizable calculations and has higher memory consumption:
     nearly 512 KiB for each 1 GiB of file’s data.  Future performance
     and memory size optimizations should not lead to packet’s format
     change.  But it is still several times faster than BLAKE2b.

   • Resumed online downloads, because of MTH, require reading only of
     the preceding part of file, not the whole one as was before.

   • "nncp-hash" utility appeared for calculating file’s MTH hash.

   • BLAKE2 KDF and XOF functions are replaced with BLAKE3 in encrypted
     packets.  Lowering number of used primitives.  Also, its encrypted
     packet’s header is used as an associated data during encryption.

   • MultiCast Discovery uses ff02::4e4e:4350 address instead of
     ff02::1.

   • "nncp-cfgenc" mistakenly asked passphrase three times during
     encryption.

   • "nncp-stat" reports about partly downloaded packets.

   • Updated dependencies.

Release 6.6.0
=============

   • "nncp-daemon", "nncp-call" and "nncp-caller" commands wait for all
     background checksummers completion after connection is finished.

   • Added possibility of address determining through multicast
     announcement in local area network, so called MCD (MultiCast
     Discovery).

Release 6.5.0
=============

   • Fixed segfault in "nncp-daemon" when SP handshake did not succeed.

   • Fixed possible bad return code ignoring in automatic tosser.

   • Fixed race during file descriptors closing when online protocol
     call is finished, that could lead to write error of received packet
     fragment.

   • Kill all packet transmission progress bars in "nncp-daemon",
     "nncp-call" and "nncp-caller" when call is finished.

Release 6.4.0
=============

   • Fixed possible race in online protocol, that lead to panic.

Release 6.3.0
=============

   • Fixed possible panic while showing progress during online protocol.

Release 6.2.1
=============

   • Three places in logs contained excess "%s".

Release 6.2.0
=============

   • Returned "nncp-caller"’s "-autotoss*" options workability.

   • Yet another logging refactoring and simplification.  Should be no
     visible differences to the end user.

Release 6.1.0
=============

   • Optimization: most commands do not keep opened file descriptors
     now.  Previously you can exceed maximal number of opened files if
     you have got many packets in the spool directory.

   • Optimization: do not close file descriptor of the file we download
     online.  Previously each chunk lead to expensive open/close calls.

   • Online downloaded files are saved with ".nock" (non-checksummed)
     suffix, waiting either for "nncp-check", or online daemons to
     perform integrity check.

   • Optimization: files, that are not resumed, are checksummed
     immediately during the online download, skipping
     ".nock"-intermediate step.

   • Ability to store encrypted packet’s header in ".hdr" file, close to
     the packet itself.  That can greatly increase performance of
     packets listing on filesystems with big block’s size.

Release 6.0.0
=============

   • Log uses human readable and easy machine parseable recfile
     (https://www.gnu.org/software/recutils/) format for the records,
     instead of structured RFC 3339 lines.  Old logs are not readable by
     "nncp-log" anymore.

   • "-autotoss*" option workability with "nncp-daemon"’s "-inetd" mode.

   • Call’s "when-tx-exists" allows to make a call only when outbound
     packets exists.  Combined with seconds-aware cron expression that
     can be used as some kind of auto dialler.

   • "nncp-cronexpr" command allows you to check validity and
     expectations of specified cron expression.

Release 5.6.0
=============

   • "-autotoss*" option runs tosser not after the call, but every
     second while it is active.

   • "autotoss", "autotoss-doseen", "autotoss-nofile",
     "autotoss-nofreq", "autotoss-noexec", "autotoss-notrns" options
     available in "calls" configuration section.  You can configure
     per-call automatic tosser options.

   • Use vendoring, instead of "$GOPATH" overriding during tarball
     installation, because current minimal Go’s version is 1.12 and it
     supports modules.

Release 5.5.1
=============

   • Respect for "$BINDIR", "$INFODIR" and "$DOCDIR" environment
     variables in "config" during installation.

Release 5.5.0
=============

   • Bugfixes in "nncp-call(er)"/"nncp-daemon", "nncp-bundle" and
     "nncp-stat".

   • "nncp-rm" has "-dryrun" and "-older" options now.

   • "nncp-exec" has "-use-tmp" and "-nocompress" options now.
     Uncompressed packets are not compatible with previous NNCP
     versions.

   • "nncp-call", "nncp-caller" and "nncp-daemon" commands have
     "-autotoss*" options for running tosser after call is ended.

   • Updated dependencies.  Minimal required Go version is 1.12.

Release 5.4.1
=============

   • Fixed "SENDMAIL" variable usage during the build.

Release 5.4.0
=============

   • Updated dependencies.

   • Build system is moved from Makefiles to redo
     (http://cr.yp.to/redo.html).  This should not influence package
     maintainers, because minimal "redo" implementation is included in
     tarball.

Release 5.3.3
=============

   • More various error checks.

   • Updated dependencies.

Release 5.3.2
=============

   • Fixed incorrect logic of "onlinedeadline" timeout, where connection
     won’t take into account incoming packets events and will forcefully
     disconnect.

Release 5.3.1
=============

   • Fixed "onlinedeadline" workability with call addresses that use
     external commands ("|somecmd").

   • "nncp-stat" has "-pkt" option displaying information about each
     packet in the spool.

Release 5.3.0
=============

   • Progress messages contain prefix, describing the running action.

   • Fixed not occurring handshake messages padding.

   • Finish all SP protocol related goroutines, less memory leak.

   • SP protocol generates less socket write calls, thus generating less
     TCP packets.

   • Check "onlinedeadline" and "maxonlinetime" options every second,
     independently from socket reads (up to 10 seconds).

   • Once per minute, if no other traffic exists, PING packets are sent
     in SP-connection.  That allows faster determining of connection
     unworkability.

   • "nncp-toss" uses lock-file to prevent simultaneous tossing.

Release 5.2.1
=============

   • Fixed SP protocol error handling, sometimes causing program panic.

Release 5.2.0
=============

   • Most commands by default show oneline operations progress.
     "-progress", "-noprogress" command line options, "noprogress"
     configuration file option appeared.

   • Fixed incorrect "nncp-check" command return code, that returned bad
     code when everything is good.

   • Free disk space check during "nncp-bundle -rx" call.

Release 5.1.2
=============

   • *Critical* vulnerability: remote peers authentication could lead to
     incorrect identification of remote side, allowing foreign encrypted
     packets downloading.

   • Bugfix: private and public Noise keys were swapped in newly created
     configuration files, that lead to inability to authenticate online
     peers.

   • Explicit directories fsync-ing for guaranteed files renaming.

Release 5.1.1
=============

   • Fixed workability of "nncp-file" with "-chunked 0" option.

Release 5.1.0
=============

   • "nncp-file" can send directories, automatically creating pax
     archive on the fly.

   • Free disk space is checked during outbound packets creation.

   • "freq", "freqminsize", "freqchunked" configuration file options
     replaced with the structure: "freq: {path: ..., minsize: ...,
     chunked: ...}".

   • Added "freq.maxsize" configuration file option, forbidding of freq
     sending larger than specified size.

   • Ability to notify about successfully executed commands (exec) with
     "notify.exec" configuration file option.

Release 5.0.0
=============

   • *Incompatible* configuration file format change: YAML is replaced
     with Hjson, due to its simplicity, without noticeable lack of
     either functionality or convenience.

   • *Incompatible* plain packet format changes.  Older versions are not
     supported.  "zlib" compression is replaced with "Zstandard", due to
     its speed and efficiency, despite library version is not mature
     enough.

   • Ability to call remote nodes via pipe call of external command, not
     only through TCP.

   • "nncp-cfgnew" generates configuration file with many comments.
     "-nocomments" option can be used for an old behaviour.

   • Duplicate filenames have ".CTR" suffix, instead of "CTR", to avoid
     possible collisions with ".nncp.chunkCTR".

   • Ability to override process umask through configuration file
     option.

   • Files and directories are created with 666/777 permissions by
     default, allowing control with "umask".

   • Updated dependencies.

   • Full usage of go modules for dependencies management
     ("go.cypherpunks.ru/nncp/v5" namespace is used).

   • Forbid any later GNU GPL version autousage (project’s licence now
     is GNU GPLv3-only).

Release 4.1
===========

   • Workability on GNU/Linux systems and Go 1.10 is fixed.

Release 4.0
===========

   • *Incompatible* encrypted and eblob packet format change: AEAD
     encryption mode with 128 KiB blocks is used now, because previously
     "nncp-toss" did not verify encrypted packet’s MAC before feeding
     decrypted data to external command.  Older versions are not
     supported.

   • Available free space checking before copying in "nncp-xfer",
     "nncp-daemon", "nncp-call(er)".

   • "nncp-call" has ability only to list packets on remote node,
     without their transmission.

   • "nncp-call" has ability to transfer only specified packets.

   • Workability of "xxrate" preference in "calls" configuration file
     section.

   • Dependant libraries are updated.

   • Minor bugfixes.

   • Begin using of "go.mod" subsystem.

Release 3.4
===========

   • "nncp-daemon" can be run as "inetd"-service.

Release 3.3
===========

   • "nncp-daemon", "nncp-call", "nncp-caller" check if ".seen" exists
     and treat it like file was already downloaded.  Possibly it was
     transferred out-of-bound and remote side needs to be notifier about
     that.

   • If higher priority packet is spooled, then "nncp-daemon" will queue
     its sending first, interrupting lower priority transmissions.

   • Simple packet rate limiter added to online-related tools
     ("nncp-daemon", "nncp-call", "nncp-caller").

   • Ability to specify niceness with symbolic notation: NORMAL,
     BULK+10, PRIORITY-5, etc.

   • Changed default niceness levels: for "nncp-exec" from 64 to 96, for
     "nncp-freq" from 64 to 160, for "nncp-file" from 196 to 224.

Release 3.2
===========

   • *Incompatible* _bundle_ archive format changes and "nncp-bundle"
     workability with Go 1.10+.  Bundles must be valid tar archives, but
     Go 1.9 made them invalid because of long paths inside.  NNCP
     accidentally was dependant on that bug.  Explicit adding of "NNCP/"
     directory in archive restores workability with valid tar archives.

Release 3.1
===========

   • Ability to disable relaying at all using -via - command line
     option.

Release 3.0
===========

   • *Incompatible* plain packet format changes.  Older versions are not
     supported.

   • Ability to queue remote command execution, by configuring "exec"
     option in configuration file and using "nncp-exec" command:
        • "nncp-mail" command is replaced with more flexible
          "nncp-exec".  Instead of nncp-mail NODE RECIPIENT you must use
          nncp-exec NODE sendmail RECIPIENT.
        • "sendmail" configuration file option is replaced with "exec".
          sendmail: [...]  must be replaced with exec: sendmail: [...].

   • Ability to override "via" configuration option for destination node
     via "-via" command line option for following commands: "nncp-file",
     "nncp-freq", "nncp-exec".

   • Chunked files, having size less than specified chunk size, will be
     sent as an ordinary single file.

   • Exec commands are invoked with additional "$NNCP_NICE" and
     "$NNCP_SELF" environment variables.

   • Files, that are sent as a reply to freq, have niceness level taken
     from the freq packet.  You can set desired niceness during
     "nncp-freq" invocation using "-replynice" option.

   • "nncp-toss" command can ignore specified packet types during
     processing: "-nofile", "-nofreq", "-noexec", "-notrns".

   • "nncp-file" command uses "FreqMinSize"/"FreqChunked" configuration
     file options for "-minsize"/"-chunked" by default.  You can turn
     this off by specifying zero value.

Release 2.0
===========

   • *Incompatible* encrypted/eblob packet format changes.  Older
     versions are not supported.

   • Twofish encryption algorithm is replaced with ChaCha20.  It is much
     more faster.  One cryptographic primitive less.

   • HKDF-BLAKE2b-256 KDF algorithm is replaced with BLAKE2Xb XOF. Yet
     another cryptographic primitive less (assuming that BLAKE2X is
     nearly identical to BLAKE2).

Release 1.0
===========

   • *Incompatible* encrypted packet format changes.  Older versions are
     not supported.

   • "nncp-bundle" command can either create stream of encrypted
     packets, or digest it.  It is useful when dealing with
     "stdin"/"stdout" based transmission methods (like writing to CD-ROM
     without intermediate prepared ISO image and working with tape
     drives).

   • "nncp-toss" is able to create ".seen" files preventing duplicate
     packets receiving.

   • Single background checksum verifier worker is allowed in
     "nncp-call".  This is helpful when thousands of small inbound
     packets could create many goroutines.

   • Ability to override path to spool directory and logfile through
     either command line argument, or environment variable.

   • "nncp-rm" is able to delete outbound/inbound, ".seen", ".part",
     ".lock" and temporary files.

Release 0.12
============

   • Sendmail command is called with "$NNCP_SENDER" environment
     variable.

Release 0.11
============

   • "nncp-stat"’s command output is sorted by node name.

Release 0.10
============

   • "nncp-freq"’s "DST" argument is optional now.  Last "SRC" path’s
     element will be used by default.

Release 0.9
===========

   • Fix "-rx"/"-tx" arguments processing in "nncp-call" command.  They
     were ignored.

Release 0.8
===========

   • Little bugfix in "nncp-file" command, where "-minsize" option for
     unchunked transfer was not in KiBs, but in bytes.

Release 0.7
===========

   • Ability to feed "nncp-file" from "stdin", that uses an encrypted
     temporary file for that.

   • Chunked files transmission appeared with corresponding "nncp-reass"
     command and "freqchunked" configuration file entry.  Useful for
     transferring big files over small storage devices.

   • "freqminsize" configuration file option, analogue to "-minsize"
     one.

   • "nncp-xfer"’s "-force" option is renamed to "-mkdir" for clarity.

   • "-minsize" option is specified in KiBs, not bytes, for convenience.

   • "nncp-newcfg" command is renamed to "nncp-cfgnew", and
     "nncp-mincfg" to "nncp-cfgmin" – now they have common prefix and
     are grouped together for convenience.

   • "nncp-cfgenc" command appeared, allowing configuration file
     encryption/decryption, for keeping it safe without any either
     OpenPGP or similar tools usage.

   • Cryptographic libraries (dependencies) are updated.

Release 0.6
===========

   • Small "nncp-rm" command appeared.
   • Cryptographic libraries (dependencies) are updated.

Release 0.5
===========

   • Trivial small fix in default niceness level of "nncp-file" and
     "nncp-freq" commands.

Release 0.4
===========

   • Small fix in "nncp-call", "nncp-caller", "nncp-daemon": they can
     segmentation fail sometimes (no data is lost).

   • "nncp-newnode" renamed to "nncp-newcfg" – it is shorter and more
     convenient to use.

   • "nncp-mincfg" command appeared: helper allowing to create
     minimalistic stripped down configuration file without private keys,
     that is useful during "nncp-xfer" usage.

Release 0.3
===========

   • Fixed compatibility with Go 1.6.

Release 0.2
===========

   • *Incompatible* packet’s format change (magic number is changed
     too): size field is encrypted and is not send in plaintext anymore.

   • "-minsize" option gives ability to automatically pad outgoing
     packets to specified minimal size.

   • "nncp-daemon" and "nncp-call"/"nncp-caller" always check new _tx_
     packets appearance in the background while connected.  Remote side
     is immediately notified.

   • "-onlinedeadline" option gives ability to configure timeout of
     inactivity of online connection, when it could be disconnected.  It
     could be used to keep connection alive for a long time.

   • "-maxonlinetime" option gives ability to set maximal allowable
     online connection aliveness time.

   • "nncp-caller" command appeared: cron-ed TCP daemon caller.

   • "nncp-pkt" command can decompress the data.

