              Apache Commons Net 3.9.0
                  RELEASE NOTES

The Apache Commons Net team is pleased to announce the release of Apache Commons Net 3.9.0.

Apache Commons Net library contains a collection of network utilities and protocol implementations.
Supported protocols include: Echo, Finger, FTP, NNTP, NTP, POP3(S), SMTP(S), Telnet, Whois


Maintenance and bug fix release (Java 8).

For complete information on Apache Commons Net, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Net website:

https://commons.apache.org/proper/commons-net/

Download page: https://commons.apache.org/proper/commons-net/download_net.cgi

Changes in this version include:
===============================

New features:
o           [FTP] Add FTPClient.mdtmInstant(String). Thanks to Gary Gregory.
o           [FTP] Add MLSxEntryParser.parseGmtInstant(String). Thanks to Gary Gregory.
o           [FTP] Add FTPClient.getControlKeepAliveReplyTimeoutDuration(). Thanks to Gary Gregory.
o           [FTP] Add FTPClient.setControlKeepAliveReplyTimeout(Duration). Thanks to Gary Gregory.
o           [FTP] Add FTPClient.getControlKeepAliveTimeoutDuration(). Thanks to Gary Gregory.
o           [FTP] Add FTPClient.setControlKeepAliveTimeout(Duration). Thanks to Gary Gregory.
o           [FTP] Add FTPClient.getDataTimeout(). Thanks to Gary Gregory.
o           [FTP] Add FTPClient.setDataTimeout(Duration). Thanks to Gary Gregory.
o           [FTP] Add FTPFile.getTimestampInstant(). Thanks to Gary Gregory.
o           Add github/codeql-action. Thanks to Gary Gregory.

Fixed Bugs:
o NET-708:  Use yyyy instead of YYYY in SimpleDateFormat #97. Thanks to XenoAmess.
o           Prevent serialization of the 4 classes that implement Serializable.
            It is not useful and is unlikely to work properly.
o           Use Math.min and Math.max method instead of manual calculations. #104. Thanks to Arturo Bernal.
o NET-711:  Add FTP option to toggle use of return host like CURL. Thanks to Jochen Wiedmann, Gary Gregory.
o NET-642:  FTPSClient execPROT removes proxy settings #90. Thanks to Yani Mihaylov, Gary Gregory.
o           JUnit5 assertThrows SimpleSMTPHeaderTestCase #121. Thanks to John Patrick, Gary Gregory.
o           JUnit5 assertThrows TestTimeInfo #120. Thanks to John Patrick, Gary Gregory.
o           Simplify conditions avoiding extra operations #88. Thanks to Arturo Bernal, Gary Gregory.
o           Remove reflection from SSLSocketUtils. Thanks to Gary Gregory.
o NET-707:  Process files with spaces in name for OS400 #95. Thanks to Dmytro Sylaiev, sebbASF, Gary Gregory.

Changes:
o           Bump actions/cache from 2.1.6 to 3.0.11 #93, #102, #115, #116. Thanks to Dependabot, Gary Gregory.
o           Bump actions/checkout from 2.3.4 to 3.1.0 #89, #91, #100, #114. Thanks to Dependabot, Gary Gregory.
o           Bump actions/upload-artifact from 3.1.0 to 3.1.1 #124. Thanks to Dependabot.
o           Bump junit from 4.13.1 to 5.9.1 Vintage #74. Thanks to Dependabot.
o           Bump commons-io from 2.6 to 2.11.0 #60. Thanks to Dependabot, Gary Gregory.
o           Bump commons.jacoco.version from 0.8.6 to 0.8.8. Thanks to Gary Gregory.
o           Bump commons.japicmp.version from 0.14.3 to 0.17.1. Thanks to Gary Gregory.
o           Bump commons.surefire.version from 2.22.2 to 3.0.0-M7. Thanks to Gary Gregory.
o           Bump ftpserver-core from 1.1.1 to 1.2.0 #96. Thanks to XenoAmess, Gary Gregory.
o           Bump exec-maven-plugin from 3.0.0 to 3.1.0 #109. Thanks to Dependabot.
o           Bump commons-parent from 53 to 54 #112. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-net/changes-report.html

Enjoy!
-Apache Commons Net team

-----------------------------------------------------------------------------

              Apache Commons Net 3.8.0
                  RELEASE NOTES

The Apache Commons Net team is pleased to announce the release of Apache Commons Net 3.8.0.

Apache Commons Net library contains a collection of network utilities and protocol implementations.
Supported protocols include: Echo, Finger, FTP, NNTP, NTP, POP3(S), SMTP(S), Telnet, Whois


Maintenance and bug fix release (Java 7).

For complete information on Apache Commons Net, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Net website:

https://commons.apache.org/proper/commons-net/

Download page: https://commons.apache.org/proper/commons-net/download_net.cgi

Changes in this version include:
===============================

New features:
o           Add and use NetConstants. Thanks to Arturo Bernal, Gary Gregory.
o           Add and use SocketClient.applySocketAttributes(). Thanks to Gary Gregory.
o           Add FTPClient.hasFeature(FTPCmd). Thanks to Gary Gregory.
o           Add FTPClient.mdtmCalendar(String). Thanks to Gary Gregory.

Fixed Bugs:
o           Fix concurrent counting of chunks in IMAPExportMbox. Thanks to Gary Gregory.
o           Fix possible if rare NPEs in tests. Thanks to Gary Gregory.

Changes:
o           Bump actions/checkout from v2.3.3 to v2.3.4 #69. Thanks to Dependabot.
o NET-685:  Update SocketClient default connect timeout from ? to 60 seconds #51. Thanks to Simo385.
o NET-695:  Apply SocketClient timeout after connection but before SSL negotiation. Thanks to Gary Gregory, Possibly Cott.
o           Minor Improvements #71, #72. Thanks to Arturo Bernal, Gary Gregory.
o           Bump actions/cache from v2 to v2.1.4 #73. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-net/changes-report.html

Enjoy!
-Apache Commons Net team

-----------------------------------------------------------------------------

              Apache Commons Net 3.7.2
                  RELEASE NOTES

The Apache Commons Net team is pleased to announce the release of Apache Commons Net 3.7.2.

Apache Commons Net library contains a collection of network utilities and protocol implementations.
Supported protocols include: Echo, Finger, FTP, NNTP, NTP, POP3(S), SMTP(S), Telnet, Whois


Maintenance and bug fix release.

For complete information on Apache Commons Net, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Net website:

https://commons.apache.org/proper/commons-net/

Download page: https://commons.apache.org/proper/commons-net/download_net.cgi

Changes in this version include:
===============================

Fixed Bugs:
o NET-689:  Host name is not set on the SSLSocket causing isEndpointCheckingEnabled to fail. Thanks to Charlie, Gary Gregory.
o           Fix possible socket and input stream leak on socket exception in org.apache.commons.net.ftp.FTPClient._retrieveFile(String, String, OutputStream). Thanks to Dependabot.
o NET-690:  Performance issue when using the FTPClient to retrieve files #65. Thanks to payal-meh, Gary Gregory.

Changes:
o NET-691:  Improve Javadoc for IMAPSClient #68. Thanks to Lewis John McGibbney.
o           Bump actions/setup-java from v1.4.2 to v1.4.3 #62. Thanks to Dependabot.
o           Bump junit from 4.13 to 4.13.1 #67. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-net/changes-report.html

Enjoy!
-Apache Commons Net team

-----------------------------------------------------------------------------

              Apache Commons Net 3.7.1
                  RELEASE NOTES

The Apache Commons Net team is pleased to announce the release of Apache Commons Net 3.7.1

Apache Commons Net library contains a collection of network utilities and protocol implementations.
Supported protocols include: Echo, Finger, FTP, NNTP, NTP, POP3(S), SMTP(S), Telnet, Whois


Maintenance and bug fix release.

For complete information on Apache Commons Net, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Net website:

https://commons.apache.org/proper/commons-net/

Download page: https://commons.apache.org/proper/commons-net/download_net.cgi

Changes in this version include:
===============================

Fixed Bugs:
o NET-687:  [FTPS] javax.net.ssl.SSLException: Unsupported or unrecognized SSL message, #59. Thanks to Gary Gregory, Mikael, j-verse.
o NET-673:  Update actions/checkout from v2.3.1 to v2.3.3 #56, #61. Thanks to Dependabot.
o NET-673:  Update actions/setup-java from v1.4.0 to v1.4.2 #58. Thanks to Dependabot.


Historical list of changes: https://commons.apache.org/proper/commons-net/changes-report.html

Enjoy!
-Apache Commons Net team

-----------------------------------------------------------------------------

              Apache Commons Net 3.7
                  RELEASE NOTES

The Apache Commons Net team is pleased to announce the release of Apache Commons Net 3.7

Apache Commons Net library contains a collection of network utilities and protocol implementations.
Supported protocols include: Echo, Finger, FTP, NNTP, NTP, POP3(S), SMTP(S), Telnet, Whois

This is mainly a bug-fix release. See further details below.
 This release requires a minimum of Java 7.
 This release is binary compatible with previous releases.
However it is not source compatible with releases before 3.4, as some methods were added to the interface NtpV3Packet in 3.4
 Note that the examples packages were moved under org/apache/commons/net/examples.
The examples are not part of the public API, so this does not affect compatibility.

Changes in this version include:

New features:
o NET-646:  ALLO FTP Command for files >2GB
o NET-615:  IMAPClient could simplify using empty arguments
o NET-614:  IMAP fails to quote/encode mailbox names
o NET-648:  Add Automatic-Module-Name MANIFEST entry for Java 9 compatibility
o NET-638:  Telnet subnegotiations hard-limited to 512 bytes - allow override Thanks to Daniel Leong.
o NET-634:  Add SIZE command support Thanks to Mauro Molinari.
o           Add POP3ExportMbox example code
o NET-674:  FTPListParseEngine should support listing via MLSD Thanks to Chris Steingen.
o NET-660:  Next and Previous IP Address in SubnetUtils.SubnetInfo Thanks to Nagabhushan S N.

Fixed Bugs:
o NET-673:  IMAPClient.APPEND does not always calculate the correct length
o NET-643:  NPE when closing telnet stream Thanks to Vasily.
o NET-641:  SubnetUtils.SubnetInfo.isInRange("0.0.0.0") returns true for CIDR/31, 32 Thanks to pin_ptr.
o NET-639:  MVSFTPEntryParser.preParse - MVS, z/OS - allow for merged Ext/Used fields Thanks to Alexander Eller.
o NET-636:  examples should be in org.apache.commons.net subpackage
o NET-631:  Bug in MVSFTPEntryParser.parseUnixList (FindBugs)
o NET-584:  Error when using org.apache.commons.net.ftp.FTPClient setControlKeepAliveTimeout Thanks to Kazantsev Andrey Sergeevich/Nick Manley.
o NET-624:  SubnetInfo#toCidrNotation: A wrong format subnet mask is allowed Thanks to Makoto Sakaguchi.
o NET-623:  SubnetUtils - fixed spelling errors Thanks to Makoto Sakaguchi.
o NET-613:  System Information Leak in ftp parser Thanks to Donald Kwakkel.
o NET-663:  NullPointerException when FTPClient remote verification fails Thanks to Max Shenfield.
o NET-649:  227 Entering Passive Mode Thanks to Filipe Bojikian Rissi.
o NET-682:  MVSFTPEntryParser doesn't support Record Formats of U Thanks to richard.

Changes:
o NET-633:  Add XOAUTH2 to IMAP and SMTP Thanks to n0rm1e.
o NET-632:  FTPHTTPClient - support for encoding other than UTF-8 Thanks to prakapenka.
o NET-626:  SubnetUtils#SubnetUtils - improved comment Thanks to Makoto Sakaguchi.
o NET-625:  SubnetUtils - improve construction
o NET-624:  SubnetInfo#getCidrSignature - improve functions Thanks to Makoto Sakaguchi.
o NET-621:  SubnetUtils#SubnetInfo - remove unnecessary accessors Thanks to Makoto Sakaguchi.
o NET-619:  SubnetUtils - improve binary netmask algorithm Thanks to Makoto Sakaguchi.
o NET-678:  VMS ftp LIST parsing results in empty file list Thanks to Roman Grigoriadi.


Historical list of changes: https://commons.apache.org/proper/commons-net/changes-report.html

For complete information on Apache Commons Net, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Commons Net website:

https://commons.apache.org/proper/commons-net/

Download page: https://commons.apache.org/proper/commons-net/download_net.cgi
