summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorgotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-10-08 11:14:41 +0000
committergotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-10-08 11:14:41 +0000
commit3ecc791ddcc537e5eaa663254af6207e65da1a51 (patch)
tree4be462f3b2e6ca473e464c78401d1d78cf7ed945 /lib
parent3465feb90b0d8401ad9b101929dbed11707a2eca (diff)
* lib/net/imap.rb, lib/net/smtp.rb, lib/net/pop.rb: hostname should
be verified against server's indentity as persented in the server's certificate. [ruby-dev:31960] * ext/openssl/lib/net/telnets.rb, ext/openssl/lib/net/ftptls.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13656 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/net/imap.rb48
-rw-r--r--lib/net/pop.rb3
-rw-r--r--lib/net/smtp.rb3
3 files changed, 29 insertions, 25 deletions
diff --git a/lib/net/imap.rb b/lib/net/imap.rb
index b8239a8aba..f84229f131 100644
--- a/lib/net/imap.rb
+++ b/lib/net/imap.rb
@@ -330,19 +330,10 @@ module Net
end
# Sends a STARTTLS command to start TLS session.
- def starttls(ctx = nil)
- if @sock.kind_of?(OpenSSL::SSL::SSLSocket)
- raise RuntimeError, "already using SSL"
- end
+ def starttls(certs = nil, verify = false)
send_command("STARTTLS") do |resp|
if resp.kind_of?(TaggedResponse) && resp.name == "OK"
- if ctx
- @sock = OpenSSL::SSL::SSLSocket.new(@sock, ctx)
- else
- @sock = OpenSSL::SSL::SSLSocket.new(@sock)
- end
- @sock.sync_close = true
- @sock.connect
+ start_tls_session(certs, verify)
end
end
end
@@ -906,21 +897,8 @@ module Net
@parser = ResponseParser.new
@sock = TCPSocket.open(host, port)
if usessl
- unless defined?(OpenSSL)
- raise "SSL extension not installed"
- end
+ start_tls_session(certs, verify)
@usessl = true
-
- # verify the server.
- context = SSLContext::new()
- context.ca_file = certs if certs && FileTest::file?(certs)
- context.ca_path = certs if certs && FileTest::directory?(certs)
- context.verify_mode = VERIFY_PEER if verify
- if defined?(VerifyCallbackProc)
- context.verify_callback = VerifyCallbackProc
- end
- @sock = SSLSocket.new(@sock, context)
- @sock.connect # start ssl session.
else
@usessl = false
end
@@ -1229,6 +1207,26 @@ module Net
end
end
+ def start_tls_session(certs, verify)
+ unless defined?(OpenSSL)
+ raise "SSL extension not installed"
+ end
+ if @sock.kind_of?(OpenSSL::SSL::SSLSocket)
+ raise RuntimeError, "already using SSL"
+ end
+ context = SSLContext::new()
+ context.ca_file = certs if certs && FileTest::file?(certs)
+ context.ca_path = certs if certs && FileTest::directory?(certs)
+ context.verify_mode = VERIFY_PEER if verify
+ if defined?(VerifyCallbackProc)
+ context.verify_callback = VerifyCallbackProc
+ end
+ @sock = SSLSocket.new(@sock, context)
+ @sock.sync_close = true
+ @sock.connect
+ @sock.post_connection_check(@host) if verify
+ end
+
class RawData # :nodoc:
def send_data(imap)
imap.send!(:put_string, @data)
diff --git a/lib/net/pop.rb b/lib/net/pop.rb
index d0145cb5f0..9f00465a1d 100644
--- a/lib/net/pop.rb
+++ b/lib/net/pop.rb
@@ -533,6 +533,9 @@ module Net
s = OpenSSL::SSL::SSLSocket.new(s, context)
s.sync_close = true
s.connect
+ if context.verify_mode != OpenSSL::SSL::VEIFY_NONE
+ s.post_connection_check(@address)
+ end
end
@socket = InternetMessageIO.new(s)
logging "POP session started: #{@address}:#{@port} (#{@apop ? 'APOP' : 'POP'})"
diff --git a/lib/net/smtp.rb b/lib/net/smtp.rb
index 58cce32a71..84790450bc 100644
--- a/lib/net/smtp.rb
+++ b/lib/net/smtp.rb
@@ -578,6 +578,9 @@ module Net
logging "TLS connection started"
s.sync_close = true
s.connect
+ if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
+ s.post_connection_check(@address)
+ end
s
end