rubysl-openssl 1.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -6
  3. data/ext/rubysl/openssl/.gitignore +3 -0
  4. data/ext/rubysl/openssl/deprecation.rb +21 -0
  5. data/ext/rubysl/openssl/extconf.rb +45 -32
  6. data/ext/rubysl/openssl/openssl_missing.c +20 -7
  7. data/ext/rubysl/openssl/openssl_missing.h +22 -15
  8. data/ext/rubysl/openssl/ossl.c +610 -61
  9. data/ext/rubysl/openssl/ossl.h +31 -17
  10. data/ext/rubysl/openssl/ossl_asn1.c +974 -183
  11. data/ext/rubysl/openssl/ossl_asn1.h +3 -3
  12. data/ext/rubysl/openssl/ossl_bio.c +4 -3
  13. data/ext/rubysl/openssl/ossl_bio.h +1 -1
  14. data/ext/rubysl/openssl/ossl_bn.c +32 -28
  15. data/ext/rubysl/openssl/ossl_bn.h +1 -1
  16. data/ext/rubysl/openssl/ossl_cipher.c +494 -93
  17. data/ext/rubysl/openssl/ossl_cipher.h +1 -1
  18. data/ext/rubysl/openssl/ossl_config.c +4 -5
  19. data/ext/rubysl/openssl/ossl_config.h +1 -1
  20. data/ext/rubysl/openssl/ossl_digest.c +206 -24
  21. data/ext/rubysl/openssl/ossl_digest.h +1 -1
  22. data/ext/rubysl/openssl/ossl_engine.c +48 -26
  23. data/ext/rubysl/openssl/ossl_engine.h +1 -1
  24. data/ext/rubysl/openssl/ossl_hmac.c +40 -38
  25. data/ext/rubysl/openssl/ossl_hmac.h +1 -1
  26. data/ext/rubysl/openssl/ossl_ns_spki.c +157 -25
  27. data/ext/rubysl/openssl/ossl_ns_spki.h +1 -1
  28. data/ext/rubysl/openssl/ossl_ocsp.c +57 -40
  29. data/ext/rubysl/openssl/ossl_ocsp.h +1 -1
  30. data/ext/rubysl/openssl/ossl_pkcs12.c +15 -13
  31. data/ext/rubysl/openssl/ossl_pkcs12.h +1 -1
  32. data/ext/rubysl/openssl/ossl_pkcs5.c +108 -18
  33. data/ext/rubysl/openssl/ossl_pkcs7.c +44 -37
  34. data/ext/rubysl/openssl/ossl_pkcs7.h +1 -1
  35. data/ext/rubysl/openssl/ossl_pkey.c +211 -15
  36. data/ext/rubysl/openssl/ossl_pkey.h +19 -9
  37. data/ext/rubysl/openssl/ossl_pkey_dh.c +180 -47
  38. data/ext/rubysl/openssl/ossl_pkey_dsa.c +184 -47
  39. data/ext/rubysl/openssl/ossl_pkey_ec.c +177 -93
  40. data/ext/rubysl/openssl/ossl_pkey_rsa.c +209 -102
  41. data/ext/rubysl/openssl/ossl_rand.c +15 -15
  42. data/ext/rubysl/openssl/ossl_rand.h +1 -1
  43. data/ext/rubysl/openssl/ossl_ssl.c +939 -192
  44. data/ext/rubysl/openssl/ossl_ssl.h +6 -6
  45. data/ext/rubysl/openssl/ossl_ssl_session.c +78 -62
  46. data/ext/rubysl/openssl/ossl_version.h +2 -2
  47. data/ext/rubysl/openssl/ossl_x509.c +1 -1
  48. data/ext/rubysl/openssl/ossl_x509.h +1 -1
  49. data/ext/rubysl/openssl/ossl_x509attr.c +20 -19
  50. data/ext/rubysl/openssl/ossl_x509cert.c +169 -67
  51. data/ext/rubysl/openssl/ossl_x509crl.c +41 -39
  52. data/ext/rubysl/openssl/ossl_x509ext.c +51 -38
  53. data/ext/rubysl/openssl/ossl_x509name.c +139 -29
  54. data/ext/rubysl/openssl/ossl_x509req.c +42 -40
  55. data/ext/rubysl/openssl/ossl_x509revoked.c +20 -20
  56. data/ext/rubysl/openssl/ossl_x509store.c +99 -47
  57. data/ext/rubysl/openssl/ruby_missing.h +3 -16
  58. data/lib/openssl/bn.rb +19 -19
  59. data/lib/openssl/buffering.rb +222 -14
  60. data/lib/openssl/cipher.rb +20 -20
  61. data/lib/openssl/config.rb +1 -4
  62. data/lib/openssl/digest.rb +47 -19
  63. data/lib/openssl/ssl.rb +197 -1
  64. data/lib/openssl/x509.rb +162 -1
  65. data/lib/rubysl/openssl.rb +4 -8
  66. data/lib/rubysl/openssl/version.rb +1 -1
  67. data/rubysl-openssl.gemspec +1 -2
  68. metadata +16 -34
  69. data/ext/rubysl/openssl/extconf.h +0 -50
  70. data/lib/openssl/net/ftptls.rb +0 -53
  71. data/lib/openssl/net/telnets.rb +0 -251
  72. data/lib/openssl/pkcs7.rb +0 -25
  73. data/lib/openssl/ssl-internal.rb +0 -187
  74. data/lib/openssl/x509-internal.rb +0 -153
@@ -11,19 +11,15 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: openssl.rb 29856 2010-11-22 07:21:45Z shyouhei $
14
+ $Id$
15
15
  =end
16
16
 
17
- require 'thread'
18
- require "digest"
19
17
  require 'openssl/openssl'
20
-
21
18
  require 'openssl/bn'
22
19
  require 'openssl/cipher'
23
20
  require 'openssl/config'
24
21
  require 'openssl/digest'
25
- require 'openssl/pkcs7'
26
- require 'openssl/ssl-internal'
27
- require 'openssl/x509-internal'
22
+ require 'openssl/x509'
23
+ require 'openssl/ssl'
28
24
 
29
- require 'rubysl/openssl/version'
25
+ require "rubysl/openssl/version"
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module OpenSSL
3
- VERSION = "1.0.2"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -17,10 +17,9 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.required_ruby_version = "~> 1.8.7"
20
+ spec.required_ruby_version = "~> 2.0"
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "mspec", "~> 1.5"
25
- spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
26
25
  end
metadata CHANGED
@@ -1,71 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysl-openssl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Shirai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-16 00:00:00.000000000 Z
11
+ date: 2013-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: mspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.5'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.5'
55
- - !ruby/object:Gem::Dependency
56
- name: rubysl-prettyprint
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.0'
69
55
  description: Ruby standard library OpenSSL.
70
56
  email:
71
57
  - brixen@gmail.com
@@ -74,13 +60,14 @@ extensions:
74
60
  - ext/rubysl/openssl/extconf.rb
75
61
  extra_rdoc_files: []
76
62
  files:
77
- - ".gitignore"
78
- - ".travis.yml"
63
+ - .gitignore
64
+ - .travis.yml
79
65
  - Gemfile
80
66
  - LICENSE
81
67
  - README.md
82
68
  - Rakefile
83
- - ext/rubysl/openssl/extconf.h
69
+ - ext/rubysl/openssl/.gitignore
70
+ - ext/rubysl/openssl/deprecation.rb
84
71
  - ext/rubysl/openssl/extconf.rb
85
72
  - ext/rubysl/openssl/openssl_missing.c
86
73
  - ext/rubysl/openssl/openssl_missing.h
@@ -141,12 +128,7 @@ files:
141
128
  - lib/openssl/cipher.rb
142
129
  - lib/openssl/config.rb
143
130
  - lib/openssl/digest.rb
144
- - lib/openssl/net/ftptls.rb
145
- - lib/openssl/net/telnets.rb
146
- - lib/openssl/pkcs7.rb
147
- - lib/openssl/ssl-internal.rb
148
131
  - lib/openssl/ssl.rb
149
- - lib/openssl/x509-internal.rb
150
132
  - lib/openssl/x509.rb
151
133
  - lib/rubysl/openssl.rb
152
134
  - lib/rubysl/openssl/version.rb
@@ -170,17 +152,17 @@ require_paths:
170
152
  - lib
171
153
  required_ruby_version: !ruby/object:Gem::Requirement
172
154
  requirements:
173
- - - "~>"
155
+ - - ~>
174
156
  - !ruby/object:Gem::Version
175
- version: 1.8.7
157
+ version: '2.0'
176
158
  required_rubygems_version: !ruby/object:Gem::Requirement
177
159
  requirements:
178
- - - ">="
160
+ - - '>='
179
161
  - !ruby/object:Gem::Version
180
162
  version: '0'
181
163
  requirements: []
182
164
  rubyforge_project:
183
- rubygems_version: 2.2.2
165
+ rubygems_version: 2.0.7
184
166
  signing_key:
185
167
  specification_version: 4
186
168
  summary: Ruby standard library OpenSSL.
@@ -1,50 +0,0 @@
1
- #ifndef EXTCONF_H
2
- #define EXTCONF_H
3
- #define HAVE_ASSERT_H 1
4
- #define HAVE_OPENSSL_SSL_H 1
5
- #define HAVE_OPENSSL_CONF_API_H 1
6
- #define HAVE_ERR_PEEK_LAST_ERROR 1
7
- #define HAVE_BN_MOD_ADD 1
8
- #define HAVE_BN_MOD_SQR 1
9
- #define HAVE_BN_MOD_SUB 1
10
- #define HAVE_BN_PSEUDO_RAND_RANGE 1
11
- #define HAVE_BN_RAND_RANGE 1
12
- #define HAVE_CONF_GET1_DEFAULT_CONFIG_FILE 1
13
- #define HAVE_EVP_CIPHER_CTX_SET_PADDING 1
14
- #define HAVE_EVP_CIPHERFINAL_EX 1
15
- #define HAVE_EVP_CIPHERINIT_EX 1
16
- #define HAVE_EVP_DIGESTFINAL_EX 1
17
- #define HAVE_EVP_DIGESTINIT_EX 1
18
- #define HAVE_EVP_MD_CTX_CLEANUP 1
19
- #define HAVE_EVP_MD_CTX_CREATE 1
20
- #define HAVE_EVP_MD_CTX_DESTROY 1
21
- #define HAVE_EVP_MD_CTX_INIT 1
22
- #define HAVE_HMAC_CTX_CLEANUP 1
23
- #define HAVE_HMAC_CTX_INIT 1
24
- #define HAVE_PEM_DEF_CALLBACK 1
25
- #define HAVE_PKCS5_PBKDF2_HMAC_SHA1 1
26
- #define HAVE_X509V3_SET_NCONF 1
27
- #define HAVE_X509V3_EXT_NCONF_NID 1
28
- #define HAVE_X509_CRL_ADD0_REVOKED 1
29
- #define HAVE_X509_CRL_SET_ISSUER_NAME 1
30
- #define HAVE_X509_CRL_SET_VERSION 1
31
- #define HAVE_X509_CRL_SORT 1
32
- #define HAVE_OBJ_NAME_DO_ALL_SORTED 1
33
- #define HAVE_SSL_SESSION_GET_ID 1
34
- #define HAVE_OPENSSL_CLEANSE 1
35
- #define HAVE_VA_ARGS_MACRO 1
36
- #define HAVE_SSLV2_METHOD 1
37
- #define HAVE_SSLV2_SERVER_METHOD 1
38
- #define HAVE_SSLV2_CLIENT_METHOD 1
39
- #define HAVE_SSL_SET_TLSEXT_HOST_NAME 1
40
- #define HAVE_OPENSSL_ENGINE_H 1
41
- #define HAVE_ENGINE_ADD 1
42
- #define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
43
- #define HAVE_ENGINE_GET_DIGEST 1
44
- #define HAVE_ENGINE_GET_CIPHER 1
45
- #define HAVE_ENGINE_CLEANUP 1
46
- #define HAVE_OPENSSL_OCSP_H 1
47
- #define HAVE_ST_FLAGS 1
48
- #define HAVE_ST_ENGINE 1
49
- #define HAVE_ST_SINGLE 1
50
- #endif
@@ -1,53 +0,0 @@
1
- =begin
2
- = $RCSfile$ -- SSL/TLS enhancement for Net::HTTP.
3
-
4
- = Info
5
- 'OpenSSL for Ruby 2' project
6
- Copyright (C) 2003 Blaz Grilc <farmer@gmx.co.uk>
7
- All rights reserved.
8
-
9
- = Licence
10
- This program is licenced under the same licence as Ruby.
11
- (See the file 'LICENCE'.)
12
-
13
- = Requirements
14
-
15
- = Version
16
- $Id: ftptls.rb 13657 2007-10-08 11:16:54Z gotoyuzo $
17
-
18
- = Notes
19
- Tested on FreeBSD 5-CURRENT and 4-STABLE
20
- - ruby 1.6.8 (2003-01-17) [i386-freebsd5]
21
- - OpenSSL 0.9.7a Feb 19 2003
22
- - ruby-openssl-0.2.0.p0
23
- tested on ftp server: glftpd 1.30
24
- =end
25
-
26
- require 'socket'
27
- require 'openssl'
28
- require 'net/ftp'
29
-
30
- module Net
31
- class FTPTLS < FTP
32
- def connect(host, port=FTP_PORT)
33
- @hostname = host
34
- super
35
- end
36
-
37
- def login(user = "anonymous", passwd = nil, acct = nil)
38
- store = OpenSSL::X509::Store.new
39
- store.set_default_paths
40
- ctx = OpenSSL::SSL::SSLContext.new('SSLv23')
41
- ctx.cert_store = store
42
- ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER
43
- ctx.key = nil
44
- ctx.cert = nil
45
- voidcmd("AUTH TLS")
46
- @sock = OpenSSL::SSL::SSLSocket.new(@sock, ctx)
47
- @sock.connect
48
- @sock.post_connection_check(@hostname)
49
- super(user, passwd, acct)
50
- voidcmd("PBSZ 0")
51
- end
52
- end
53
- end
@@ -1,251 +0,0 @@
1
- =begin
2
- = $RCSfile$ -- SSL/TLS enhancement for Net::Telnet.
3
-
4
- = Info
5
- 'OpenSSL for Ruby 2' project
6
- Copyright (C) 2001 GOTOU YUUZOU <gotoyuzo@notwork.org>
7
- All rights reserved.
8
-
9
- = Licence
10
- This program is licenced under the same licence as Ruby.
11
- (See the file 'LICENCE'.)
12
-
13
- = Version
14
- $Id: telnets.rb 13657 2007-10-08 11:16:54Z gotoyuzo $
15
-
16
- 2001/11/06: Contiributed to Ruby/OpenSSL project.
17
-
18
- == class Net::Telnet
19
-
20
- This class will initiate SSL/TLS session automaticaly if the server
21
- sent OPT_STARTTLS. Some options are added for SSL/TLS.
22
-
23
- host = Net::Telnet::new({
24
- "Host" => "localhost",
25
- "Port" => "telnets",
26
- ## follows are new options.
27
- 'CertFile' => "user.crt",
28
- 'KeyFile' => "user.key",
29
- 'CAFile' => "/some/where/certs/casert.pem",
30
- 'CAPath' => "/some/where/caserts",
31
- 'VerifyMode' => SSL::VERIFY_PEER,
32
- 'VerifyCallback' => verify_proc
33
- })
34
-
35
- Or, the new options ('Cert', 'Key' and 'CACert') are available from
36
- Michal Rokos's OpenSSL module.
37
-
38
- cert_data = File.open("user.crt"){|io| io.read }
39
- pkey_data = File.open("user.key"){|io| io.read }
40
- cacert_data = File.open("your_ca.pem"){|io| io.read }
41
- host = Net::Telnet::new({
42
- "Host" => "localhost",
43
- "Port" => "telnets",
44
- 'Cert' => OpenSSL::X509::Certificate.new(cert_data)
45
- 'Key' => OpenSSL::PKey::RSA.new(pkey_data)
46
- 'CACert' => OpenSSL::X509::Certificate.new(cacert_data)
47
- 'CAFile' => "/some/where/certs/casert.pem",
48
- 'CAPath' => "/some/where/caserts",
49
- 'VerifyMode' => SSL::VERIFY_PEER,
50
- 'VerifyCallback' => verify_proc
51
- })
52
-
53
- This class is expected to be a superset of usual Net::Telnet.
54
- =end
55
-
56
- require "net/telnet"
57
- require "openssl"
58
-
59
- module Net
60
- class Telnet
61
- attr_reader :ssl
62
-
63
- OPT_STARTTLS = 46.chr # "\056" # "\x2e" # Start TLS
64
- TLS_FOLLOWS = 1.chr # "\001" # "\x01" # FOLLOWS (for STARTTLS)
65
-
66
- alias preprocess_orig preprocess
67
-
68
- def ssl?; @ssl; end
69
-
70
- def preprocess(string)
71
- # combine CR+NULL into CR
72
- string = string.gsub(/#{CR}#{NULL}/no, CR) if @options["Telnetmode"]
73
-
74
- # combine EOL into "\n"
75
- string = string.gsub(/#{EOL}/no, "\n") unless @options["Binmode"]
76
-
77
- string.gsub(/#{IAC}(
78
- [#{IAC}#{AO}#{AYT}#{DM}#{IP}#{NOP}]|
79
- [#{DO}#{DONT}#{WILL}#{WONT}][#{OPT_BINARY}-#{OPT_EXOPL}]|
80
- #{SB}[#{OPT_BINARY}-#{OPT_EXOPL}]
81
- (#{IAC}#{IAC}|[^#{IAC}])+#{IAC}#{SE}
82
- )/xno) do
83
- if IAC == $1 # handle escaped IAC characters
84
- IAC
85
- elsif AYT == $1 # respond to "IAC AYT" (are you there)
86
- self.write("nobody here but us pigeons" + EOL)
87
- ''
88
- elsif DO[0] == $1[0] # respond to "IAC DO x"
89
- if OPT_BINARY[0] == $1[1]
90
- @telnet_option["BINARY"] = true
91
- self.write(IAC + WILL + OPT_BINARY)
92
- elsif OPT_STARTTLS[0] == $1[1]
93
- self.write(IAC + WILL + OPT_STARTTLS)
94
- self.write(IAC + SB + OPT_STARTTLS + TLS_FOLLOWS + IAC + SE)
95
- else
96
- self.write(IAC + WONT + $1[1..1])
97
- end
98
- ''
99
- elsif DONT[0] == $1[0] # respond to "IAC DON'T x" with "IAC WON'T x"
100
- self.write(IAC + WONT + $1[1..1])
101
- ''
102
- elsif WILL[0] == $1[0] # respond to "IAC WILL x"
103
- if OPT_BINARY[0] == $1[1]
104
- self.write(IAC + DO + OPT_BINARY)
105
- elsif OPT_ECHO[0] == $1[1]
106
- self.write(IAC + DO + OPT_ECHO)
107
- elsif OPT_SGA[0] == $1[1]
108
- @telnet_option["SGA"] = true
109
- self.write(IAC + DO + OPT_SGA)
110
- else
111
- self.write(IAC + DONT + $1[1..1])
112
- end
113
- ''
114
- elsif WONT[0] == $1[0] # respond to "IAC WON'T x"
115
- if OPT_ECHO[0] == $1[1]
116
- self.write(IAC + DONT + OPT_ECHO)
117
- elsif OPT_SGA[0] == $1[1]
118
- @telnet_option["SGA"] = false
119
- self.write(IAC + DONT + OPT_SGA)
120
- else
121
- self.write(IAC + DONT + $1[1..1])
122
- end
123
- ''
124
- elsif SB[0] == $1[0] # respond to "IAC SB xxx IAC SE"
125
- if OPT_STARTTLS[0] == $1[1] && TLS_FOLLOWS[0] == $2[0]
126
- @sock = OpenSSL::SSL::SSLSocket.new(@sock)
127
- @sock.cert = @options['Cert'] unless @sock.cert
128
- @sock.key = @options['Key'] unless @sock.key
129
- @sock.ca_cert = @options['CACert']
130
- @sock.ca_file = @options['CAFile']
131
- @sock.ca_path = @options['CAPath']
132
- @sock.timeout = @options['Timeout']
133
- @sock.verify_mode = @options['VerifyMode']
134
- @sock.verify_callback = @options['VerifyCallback']
135
- @sock.verify_depth = @options['VerifyDepth']
136
- @sock.connect
137
- if @options['VerifyMode'] != OpenSSL::SSL::VERIFY_NONE
138
- @sock.post_connection_check(@options['Host'])
139
- end
140
- @ssl = true
141
- end
142
- ''
143
- else
144
- ''
145
- end
146
- end
147
- end # preprocess
148
-
149
- alias waitfor_org waitfor
150
-
151
- def waitfor(options)
152
- time_out = @options["Timeout"]
153
- waittime = @options["Waittime"]
154
-
155
- if options.kind_of?(Hash)
156
- prompt = if options.has_key?("Match")
157
- options["Match"]
158
- elsif options.has_key?("Prompt")
159
- options["Prompt"]
160
- elsif options.has_key?("String")
161
- Regexp.new( Regexp.quote(options["String"]) )
162
- end
163
- time_out = options["Timeout"] if options.has_key?("Timeout")
164
- waittime = options["Waittime"] if options.has_key?("Waittime")
165
- else
166
- prompt = options
167
- end
168
-
169
- if time_out == false
170
- time_out = nil
171
- end
172
-
173
- line = ''
174
- buf = ''
175
- @rest = '' unless @rest
176
-
177
- until(prompt === line and not IO::select([@sock], nil, nil, waittime))
178
- unless IO::select([@sock], nil, nil, time_out)
179
- raise TimeoutError, "timed-out; wait for the next data"
180
- end
181
- begin
182
- c = @rest + @sock.sysread(1024 * 1024)
183
- @dumplog.log_dump('<', c) if @options.has_key?("Dump_log")
184
- if @options["Telnetmode"]
185
- pos = 0
186
- catch(:next){
187
- while true
188
- case c[pos]
189
- when IAC[0]
190
- case c[pos+1]
191
- when DO[0], DONT[0], WILL[0], WONT[0]
192
- throw :next unless c[pos+2]
193
- pos += 3
194
- when SB[0]
195
- ret = detect_sub_negotiation(c, pos)
196
- throw :next unless ret
197
- pos = ret
198
- when nil
199
- throw :next
200
- else
201
- pos += 2
202
- end
203
- when nil
204
- throw :next
205
- else
206
- pos += 1
207
- end
208
- end
209
- }
210
-
211
- buf = preprocess(c[0...pos])
212
- @rest = c[pos..-1]
213
- end
214
- @log.print(buf) if @options.has_key?("Output_log")
215
- line.concat(buf)
216
- yield buf if block_given?
217
- rescue EOFError # End of file reached
218
- if line == ''
219
- line = nil
220
- yield nil if block_given?
221
- end
222
- break
223
- end
224
- end
225
- line
226
- end
227
-
228
- private
229
-
230
- def detect_sub_negotiation(data, pos)
231
- return nil if data.length < pos+6 # IAC SB x param IAC SE
232
- pos += 3
233
- while true
234
- case data[pos]
235
- when IAC[0]
236
- if data[pos+1] == SE[0]
237
- pos += 2
238
- return pos
239
- else
240
- pos += 2
241
- end
242
- when nil
243
- return nil
244
- else
245
- pos += 1
246
- end
247
- end
248
- end
249
-
250
- end
251
- end