400 Commits
Author SHA1 Message Date
nagachika 7cd359261e skip some test using openssl to cease failure on GitHub Actions for MinGW. 2022-02-13 17:02:39 +09:00
Shugo Maeda e2ac25d0eb Fix StartTLS stripping vulnerability
This fixes CVE-2021-32066.
Reported by Alexandr Savca in <https://hackerone.com/reports/1178562>.
2021-07-07 19:08:18 +09:00
Yusuke EndohandShugo Maeda bf4d05173c Ignore IP addresses in PASV responses by default, and add new option use_pasv_ip
This fixes CVE-2021-31810.
Reported by Alexandr Savca.

Co-authored-by: Shugo Maeda <shugo@ruby-lang.org>
2021-07-07 19:05:36 +09:00
nagachika 24370a7a38 merge revision(s) 370949aad6:
test/net/ftp/test_ftp.rb - fix intermittent MinGW failure

	Fixes intermittent error as below:

	[242/838] 5316=test_ftp
	#<Thread:0x0000020aa8733f20 D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:2532 run> terminated with exception (report_on_exception is true):
	D:/a/ruby/ruby/src/tool/lib/minitest/unit.rb:199:in `assert': Expected #<Errno::ECONNRESET: An existing connection was forcibly closed by the remote host.> to be nil. (MiniTest::Assertion)
		from D:/a/ruby/ruby/src/tool/lib/test/unit/core_assertions.rb:504:in `assert'
		from D:/a/ruby/ruby/src/tool/lib/minitest/unit.rb:299:in `assert_nil'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:430:in `ensure in block in test_list_read_timeout_exceeded'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:431:in `block in test_list_read_timeout_exceeded'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:2539:in `block in create_ftp_server'
	D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:426:in `write': An existing connection was forcibly closed by the remote host. (Errno::ECONNRESET)
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:426:in `print'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:426:in `block (2 levels) in test_list_read_timeout_exceeded'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:420:in `each'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:420:in `each_with_index'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:420:in `block in test_list_read_timeout_exceeded'
		from D:/a/ruby/ruby/src/test/net/ftp/test_ftp.rb:2539:in `block in create_ftp_server'
	---
	 test/net/ftp/test_ftp.rb | 2 +-
	 1 file changed, 1 insertion(+), 1 deletion(-)
2021-06-10 16:08:40 +09:00
nagachika 98e5d1f23c merge revision(s) fe11031b67:
test/net/ftp/test_ftp.rb: remove unused variable

	---
	 test/net/ftp/test_ftp.rb | 1 -
	 1 file changed, 1 deletion(-)
2021-06-10 16:07:42 +09:00
nagachika 6363492817 merge revision(s) 990baec411:
[ruby/net-ftp] Close the passive connection data socket if there is
	 an error setting up the transfer

	Previously, the connection leaked in this case.  This uses
	begin/ensure and checking for an error in the ensure block.

	An alternative approach would be to not even perform the
	connection until after the RETR (or other) command has been
	sent.  However, I'm not sure all FTP servers support that.
	The current behavior is:

	* Send (PASV/EPSV)
	* Connect to the host/port returned in 227/229 reply
	* Send (RETR/other command)

	Changing it to connect after the RETR could break things.
	FTP servers might expect that the client has already
	connected before sending the RETR.  The alternative
	approach is more likely to introduce backwards compatibility
	issues, compared to the begin/ensure approach taken here.

	Fixes Ruby Bug 17027

	https://github.com/ruby/net-ftp/commit/6e8535f076
	---
	 lib/net/ftp.rb           | 24 ++++++++++++++----------
	 test/net/ftp/test_ftp.rb | 39 +++++++++++++++++++++++++++++++++++++--
	 2 files changed, 51 insertions(+), 12 deletions(-)
2021-06-10 16:06:01 +09:00
nagachika 58240b5d0b merge revision(s) 4ae27d8075b2d138d13cb2b112f0ee50934b3017,2670509ebba5ba31a5bf34cf906943075446e005,8e2ac2140d1cd9c163c1556df58c020dc22ab269:
[ruby/net-ftp] Reduce resource cosumption of Net::FTP::TIME_PARSER

	Reported by Alexandr Savca as a DoS vulnerability, but Net::FTP is a
	client library and the impact of the issue is low, so I have decided
	to fix it as a normal issue.
	Based on patch by nobu.

	https://github.com/ruby/net-ftp/commit/a93af636f8
	---
	 lib/net/ftp.rb           |  5 +++--
	 test/net/ftp/test_ftp.rb | 11 +++++++++++
	 2 files changed, 14 insertions(+), 2 deletions(-)

	[ruby/net-ftp] Add test cases

	https://github.com/ruby/net-ftp/commit/865232bb2a
	---
	 test/net/ftp/test_ftp.rb | 6 ++++++
	 1 file changed, 6 insertions(+)

	test/net/ftp/test_ftp.rb: reduce the size of a long response

	"9" * 999999999 (about 1 GB) was too large for some CI servers.
	This commit changes the size to 999999 (about 1 MB).

	http://rubyci.s3.amazonaws.com/scw-9d6766/ruby-master/log/20210427T141707Z.fail.html.gz
	http://rubyci.s3.amazonaws.com/raspbian10-aarch64/ruby-master/log/20210427T145408Z.fail.html.gz
	---
	 test/net/ftp/test_ftp.rb | 4 ++--
	 1 file changed, 2 insertions(+), 2 deletions(-)
2021-04-29 17:20:52 +09:00
Nobuyoshi Nakada c7530f0d56 Wait testing/helper threads to terminate 2020-12-13 13:39:57 +09:00
Benoit Daloze b4ec4a41c2 Guard all accesses to RubyVM::MJIT with defined?(RubyVM::MJIT) &&
* Otherwise those tests, etc cannot run on alternative Ruby implementations.
2020-12-04 16:45:54 +01:00
MSP-Greg 64926d5007 test/net/smtp - use TCPSocket when UNIXSocket unavailable 2020-11-18 08:13:10 +09:00
Hiroshi SHIBATA 0683912db8 Skip tests related TLS with Windows platform. 2020-11-17 18:05:15 +09:00
Hiroshi SHIBATA cada6d85d0 Import net-smtp-0.2.0 from https://github.com/ruby/net-smtp 2020-11-17 14:17:45 +09:00
Yusuke Endoh b271bd73e0 test/net/smtp/test_smtp.rb: Stop io leaks
`make test-all` was very noisy by warnings like

```
Leaked file descriptor: Net::TestSMTP#test_start_with_position_argument: 6 : #<TCPSocket:fd 6, AF_INET, 127.0.0.1, 43770>
```
2020-09-26 00:20:06 +09:00
Yusuke Endoh 0c611d7f4f test/net/http/test_https.rb: The test logic was buggy
The expected certs must be `[CA_CERT, SERVER_CERT]` before 1.1.1g and
`[SERVER_CERT]` after 1.1.1h.
2020-09-24 19:39:51 +09:00
Yusuke Endoh 1917afa34b test/net/http/test_https.rb: the order of verify_callback seems to vary
... depending upon the environment.
2020-09-24 19:34:16 +09:00
Yusuke Endoh 07786edd66 test/net/http/test_https.rb: Stop the error due to openssl 1.1.1h
On some environments that uses OpenSSL 1.1.1h, the two tests now fail.

http://rubyci.s3.amazonaws.com/android29-x86_64/ruby-master/log/20200924T062352Z.fail.html.gz
https://github.com/ruby/ruby/runs/1159288773?check_suite_focus=true

```
  1) Failure:
TestNetHTTPS#test_get [/data/data/com.termux/files/home/cb/tmp/build/20200924T062352Z/ruby/test/net/http/test_https.rb:47]:
<"0\x82\x03\xED0\x82\x02\xD5\xA0\x03..."> expected but was
<"0\x82\x03\xE30\x82\x02\xCB\xA0\x03...">.
```

Not sure why, but verify_callback now seems to receive only SERVER_CERT
but not CA_CERT.
It would be good to investigate the issue furthermore, but tentatively,
I want to stop the failures.
2020-09-24 19:20:17 +09:00
TOMITA Masahiro 141404e898 [ruby/net-smtp] Net::SMTP.start arguments are keyword arguments
The helo argument is not important, but the helo argument must be
specified to specify the user and secret arguments.
If helo, user, secret, and authtype arguments are keyword arguments,
it is not necessary to specify the helo argument.

https://github.com/ruby/net-smtp/commit/269774deac
2020-09-14 17:23:41 +09:00
TOMITA Masahiro 888e04ae05 [ruby/net-smtp] TLS should not check the host name by default.
In tlsconnect(), the host name is checked when
@ssl_context.verify_mode is not OpenSSL::SSL::VERIFY_NONE, but the
verify_mode of @ssl_context generated by default is nil.

https://github.com/ruby/net-smtp/commit/bde75a15b5
2020-09-14 17:22:35 +09:00
Jeremy Evans 85dc570893 [ruby/net-http] Fix SSL session reuse test with LibreSSL 3.2+
https://github.com/ruby/net-http/commit/5ae9620fbc
2020-08-03 18:56:14 +09:00
Jeremy Evans 20eb9e98b6 [ruby/net-http] Switch invalid server name format
invalid_servername is not a valid name in an SSL request due to
the use of the underscore, and LibreSSL 3.2.0 will raise an
exception for this.  These tests are not testing the allowed
characters in the server name, but how net/http handles cases where
the server name provided does not match the IP address you are
trying to connect to, so I think it's better to just modify the
tests to use a correct format.

While here, fix a typo in a test name, and use better code in the
ensure block so the same test doesn't issue both a failure and an
error.

https://github.com/ruby/net-http/commit/0e8dc91120
2020-08-03 18:55:44 +09:00
Takashi Kokubun 574a4f0217 Skip test_read_body_block_mod for --jit-wait 2020-06-22 10:45:39 -07:00
Takashi Kokubun 7658a0f8fe Try increasing read_timeout a little more
It failed again
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/3018488
2020-06-21 23:21:48 -07:00
Takashi Kokubun eed4aaa0bf Increase read_timeout for --jit-wait
This tries to fix a random failure like
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/3017837
2020-06-21 16:16:24 -07:00
Takashi Kokubun ec07e2de1a Increase read timeout of FTP tests with --jit-wait
Trying to eliminate some newer random failures
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/3016543
2020-06-21 02:14:34 -07:00
Takashi Kokubun 80bd3aa32b Try using longer read_timeout for --jit-wait
failure on TestFTP.

When we skip a test, the place to hang (long wait for compilation)
just moves to another test and it doesn't seem to finish.
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/3003055
2020-06-14 15:01:15 -07:00
Takashi Kokubun 1583c743d5 Skip test_getbinaryfile_command_injection on --jit-wait
Timeout-based test often fails with --jit-wait as a false positive.
Like other tests in the TestFTP, let me skip this as well.

http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/3001181
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/3000134
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/2999923
http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/2998857
2020-06-13 16:33:46 -07:00
Kazuhiro NISHIYAMA efa8df2886 local_address may raise IOError in debug print
https://rubyci.org/logs/rubyci.s3.amazonaws.com/wsl2/ruby-master/log/20200605T020004Z.fail.html.gz
```
[  984/20282] IMAPTest#test_connection_closed_without_greeting#<Thread:0x000055b6e9589d28 /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/test/net/imap/test_imap.rb:133 run> terminated with exception (report_on_exception is true):
/home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/.ext/common/socket.rb:252:in `local_address': closed stream (IOError)
	from /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/.ext/common/socket.rb:252:in `connect_address'
	from /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/test/net/imap/test_imap.rb:514:in `block (2 levels) in test_connection_closed_without_greeting'
	from /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/test/net/imap/test_imap.rb:514:in `each_object'
	from /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/test/net/imap/test_imap.rb:514:in `each'
	from /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/test/net/imap/test_imap.rb:514:in `map'
	from /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/test/net/imap/test_imap.rb:514:in `block in test_connection_closed_without_greeting'
	from /home/mame/chkbuild/tmp/build/20200605T020004Z/ruby/test/net/imap/test_imap.rb:134:in `block in start_server'
```
2020-06-05 11:45:30 +09:00
Kazuhiro NISHIYAMA e17028e48b Add sockets to debug print
debug print does not include `in_tcp_socket_2`,
so I think other socket connected to server socket.
Add sockets to debug print, and check other socket is in same process or not.

https://rubyci.org/logs/rubyci.s3.amazonaws.com/solaris11-gcc/ruby-master/log/20200604T160009Z.fail.html.gz
```
  1) Failure:
IMAPTest#test_connection_closed_without_greeting [/export/home/chkbuild/chkbuild-gcc/tmp/build/20200604T160009Z/ruby/test/net/imap/test_imap.rb:523]:
[Net::IMAP::Error] exception expected, not #<RuntimeError: {:server=>#<TCPServer:(closed)>,
 :port=>35490,
 :server_created=>
  {:server=>"#<TCPServer:fd 10, AF_INET6, ::1, 35490>", :t=>45917010.30510591},
 :in_start_server_before_accept=>{:t=>45917010.305154555},
 :in_tcp_socket=>
  {:host=>"::1",
   :port=>35490,
   :server=>"#<TCPServer:fd 10, AF_INET6, ::1, 35490>",
   :t=>45917010.40560127},
 :in_start_server=>
  {:sock_addr=>["AF_INET6", 35490, "::1", "::1"],
   :sock_peeraddr=>["AF_INET6", 51584, "::1", "::1"],
   :t=>45917010.40767231},
 :in_start_server_sock_closed=>{:t=>45917010.40770047},
 :in_rescue=>
  {:e=>#<Errno::EINVAL: Invalid argument - connect(2) for [::1]:35490>,
   :server_addr=>"::1",
   :t=>45917010.40867455}}
>.
```
2020-06-05 10:48:47 +09:00
Hiroshi SHIBATA 3e8e4c0505 [ruby/net-ftp] Added guard condition for the old ruby versions
https://github.com/ruby/net-ftp/commit/a56ba121ee
2020-04-08 15:51:18 +09:00
Hiroshi SHIBATA 0c131fb7ff [ruby/net-ftp] Guard with under the Ruby 2.6
https://github.com/ruby/net-ftp/commit/bed4bc31db
2020-04-08 15:50:48 +09:00
Takashi Kokubun ba04678c98 Ignore test_getbinaryfile for --jit-wait
To fix this properly, we'd need to configure timeout for the server and
the client because waiting for compilation takes time.

Until we figure out how to do it, let me skip this.
2020-03-25 22:54:23 -07:00
Yusuke Endoh 5908914ea2 test/net/http/test_http.rb: relax open_timeout limit
The test fails randomly on the CI of OpenCSW SPARC Solaris 10:

https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable10s/ruby-master/log/20200321T091909Z.fail.html.gz
```
  1) Failure:
TestNetHTTP_v1_2_chunked#test_timeout_during_HTTP_session [/export/home/rubyci/unstable10s/tmp/build/20200321T091909Z/ruby/test/net/http/test_http.rb:575]:
[Net::ReadTimeout] exception expected, not #<Net::OpenTimeout: execution expired>.
```

The environment uses RUBY_TEST_SUBPROCESS_TIMEOUT_SCALE=20, so the open
timeout 0.1 sec. means 2.0 sec. for the environment, but it seems too
strict because the environment is painfully slow.
2020-03-21 23:09:17 +09:00
Takashi Kokubun a90117c8c9 Skip test_abort_tls with --jit-wait for now
Perhaps the server blocks for an unexpectedly long time by waiting for
JIT. As it's usually passing, I don't think it's detecting a bug.
2020-03-12 18:43:03 -07:00
Takashi Kokubun e0512b29aa Let Net::HTTP.get take request headers (#2957)
* Let Net::HTTP.get take request headers

* Add more test cases for no header usages

* Add examples with request headers

* Add a NEWS entry [ci skip]

[Feature #16686]
2020-03-10 22:26:22 -07:00
Nobuyoshi Nakada f08cd708b1 Fixed FD leak 2020-03-04 23:26:57 +09:00
Hiroshi SHIBATA 9cb1ffaa5c Promote net-http to the default gems.
test/net/http/test_https.rb: rename fixture methods to read_fixture
  because it conflicts with test-unit gem.
2020-02-21 21:21:14 +09:00
Kazuhiro NISHIYAMA d142b37bdc Add more debug print
https://rubyci.org/logs/rubyci.s3.amazonaws.com/solaris11s-sunc/ruby-master/log/20200129T022510Z.fail.html.gz
2020-01-29 15:00:03 +09:00
Kazuhiro NISHIYAMA 838fa941f1 Add more debug print
https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11x/ruby-master/log/20200125T032406Z.fail.html.gz
```
IMAPTest#test_connection_closed_without_greeting [/export/home/rubyci/chkbuild-tmp/tmp/build/20200125T032406Z/ruby/test/net/imap/test_imap.rb:485]:
[Net::IMAP::Error] exception expected, not #<RuntimeError: {:"server before close"=>"#<TCPServer:fd 10, AF_INET6, ::1, 48515>", :sock_addr=>["AF_INET6", 48515, "::1", "::1"], :sock_peeraddr=>["AF_INET6", 35223, "::1", "::1"], :e=>#<Errno::EINVAL: Invalid argument - connect(2) for [::1]:48515>, :server=>#<TCPServer:(closed)>, :port=>48515, :server_addr=>"::1"}>.
```
2020-01-26 20:03:27 +09:00
Yuta Iwama be6931f7f7 Add #verify_hostname= and #verify_hostname to skip hostname verification (#2858)
According to https://github.com/ruby/openssl/pull/60,

> Currently an user who wants to do the hostname verification needs to
call SSLSocket#post_connection_check explicitly after the TLS connection
is established.

if an user who wants to skip the hostname verification,
SSLSocket#post_connection_check doesn't need to be called

https://bugs.ruby-lang.org/issues/16555
2020-01-23 17:23:17 +09:00
Yusuke Endoh 251f5d8226 Revert "lib/net/http/response.rb: support raw deflate correctly"
This reverts commit 5105240b1e.

In RFC 2616:

```
   deflate
        The "zlib" format defined in RFC 1950 [31] in combination with
        the "deflate" compression mechanism described in RFC 1951 [29].
```

So "Content-Encoding: deflate" means zlib format, not raw deflate.

[Bug #11268]
2019-12-16 23:39:10 +09:00
Yusuke Endoh 5105240b1e lib/net/http/response.rb: support raw deflate correctly
Net::HTTP had used `Zlib::Inflate.new(32 + Zlib::MAX_WBITS)` for all
content encoding (deflate, zlib, and gzip).
But the argument `32 + Zlib::MAX_WBITS` means zlib and gzip decoding
with automatic header detection, so (raw) deflate compression had not
been supported.

This change makes it support raw deflate correctly by passing an
argument `-Zlib::MAX_WBITS` (which means raw deflate) to
`Zlib::Inflate.new`.  All deflate-mode tests are fixed too.

[Bug #11268]
2019-12-16 23:20:42 +09:00
Kazuhiro NISHIYAMA a83c46e3fd Add more debug info
closed server doesn't have useful info.
So call inspect before close.
And add local debug code in comment.

https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11x/ruby-master/log/20191215T092405Z.fail.html.gz
```
  1) Failure:
IMAPTest#test_connection_closed_without_greeting [/export/home/rubyci/chkbuild-tmp/tmp/build/20191215T092405Z/ruby/test/net/imap/test_imap.rb:483]:
[Net::IMAP::Error] exception expected, not #<RuntimeError: {:e=>#<Errno::EINVAL: Invalid argument - connect(2) for [::1]:41748>, :server=>#<TCPServer:(closed)>, :port=>41748, :server_addr=>"::1"}>.
```
2019-12-15 20:09:24 +09:00
Kazuhiro NISHIYAMA 68321dd1fa Move rescue for debug into block of assert_raise 2019-12-12 22:05:14 +09:00
Kazuhiro NISHIYAMA c20dd2f754 Add more debug info when Errno::EINVAL
https://rubyci.org/logs/rubyci.s3.amazonaws.com/unstable11x/ruby-master/log/20191212T072406Z.fail.html.gz
2019-12-12 17:38:27 +09:00
NARUSE, Yui af11efd377 fix ipaddr parameter of Net::HTTP.start to support proxy
54072e329c
2019-12-10 19:12:21 +09:00
Yusuke Endoh 660388f6c5 test/net/http/test_https.rb (test_get_SNI_failure): stop proxy settings
Because the test fails under HTTP proxy settings.

https://rubyci.org/logs/rubyci.s3.amazonaws.com/solaris10-gcc/ruby-master/log/20191210T000004Z.fail.html.gz
```
  1) Failure:
TestNetHTTPS#test_get_SNI_failure [/export/home/users/chkbuild/cb-gcc/tmp/build/20191210T000004Z/ruby/test/net/http/test_https.rb:81]:
[OpenSSL::SSL::SSLError] exception expected, not #<Net::HTTPServerException: 403 "Forbidden">.
```

The new SNI feature introduced at 54072e329c may need to be improved for
HTTP proxy environment.
2019-12-10 09:41:33 +09:00
NARUSE, Yui 54072e329c Add ipaddr optional parameter to Net::HTTP#start
to replace the address for TCP/IP connection [Feature #5180]

There're 3 layers of hostname:
* host address for TCP/IP
* TLS server name
* HTTP Host header value
To test DNS round robin or check server certificate from server local,
people sometimes want to connect server with given IP address but keep
TLS server name and HTTP Host header value.

closes [Feature #15215]
closes https://github.com/ruby/ruby/pull/1893
closes https://github.com/ruby/ruby/pull/1977
2019-12-09 20:21:49 +09:00
Jeremy Evans ffd0820ab3 Deprecate taint/trust and related methods, and make the methods no-ops
This removes the related tests, and puts the related specs behind
version guards.  This affects all code in lib, including some
libraries that may want to support older versions of Ruby.
2019-11-18 01:00:25 +02:00
Jeremy Evans c5c05460ac Warn on access/modify of $SAFE, and remove effects of modifying $SAFE
This removes the security features added by $SAFE = 1, and warns for access
or modification of $SAFE from Ruby-level, as well as warning when calling
all public C functions related to $SAFE.

This modifies some internal functions that took a safe level argument
to no longer take the argument.

rb_require_safe now warns, rb_require_string has been added as a
version that takes a VALUE and does not warn.

One public C function that still takes a safe level argument and that
this doesn't warn for is rb_eval_cmd.  We may want to consider
adding an alternative method that does not take a safe level argument,
and warn for rb_eval_cmd.
2019-11-18 01:00:25 +02:00
Jeremy Evans 2b6a9f3a1f Ignore Errno::EPIPE when sending requests in net/http
An EPIPE when sending the request should be ignored.  Even if you
cannot write more data, you may still be able to read the server's
response.

Fixes [Bug #14466]
2019-09-27 07:43:32 -07:00