Ruby Issue Tracking System: Issues
https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2013-04-26T11:32:56Z
Ruby Issue Tracking System
Redmine
Ruby master - Misc #8329 (Rejected): Cannot change \r\n to \n (Windows/DOS to Unix)
https://bugs.ruby-lang.org/issues/8329
2013-04-26T11:32:56Z
mghomn (Justin Peal)
yujianbin@huawei.com
<a name="I-want-to-change-all-of-my-ruby-files-to-UTF-8-encoded-and-Unix-format-but-after-the-running-of-the-following-program-the-files-formats-are-still-WindowsDOS-rn-but-not-Unix-n-How-could-I-do"></a>
<h1 >I want to change all of my ruby files to UTF-8 encoded and Unix format, but after the running of the following program, the files' formats are still Windows/DOS (\r\n) but not Unix (\n). How could I do?<a href="#I-want-to-change-all-of-my-ruby-files-to-UTF-8-encoded-and-Unix-format-but-after-the-running-of-the-following-program-the-files-formats-are-still-WindowsDOS-rn-but-not-Unix-n-How-could-I-do" class="wiki-anchor">¶</a></h1>
<p>class String<br>
def utf8?<br>
self =~ /\A\p{Assigned}*\z/<br>
rescue<br>
false<br>
end<br>
end</p>
<p>class Tounix<br>
def replace text<br>
text.gsub(/\x0d\x0a/, "\n")<br>
end</p>
<p>def load filename_rb<br>
text = File.read(filename_rb, :mode => 'rt:bom|utf-8')<br>
unless text.utf8?<br>
text = File.read(filename_rb, :mode => 'rt:gb18030')<br>
text = text.encode('utf-8')<br>
end<br>
text<br>
end</p>
<p>def save filename_rb, new_text<br>
File.write(filename_tm = filename_rb + '.t~m~p', new_text, :mode => 'wb:utf-8')<br>
File.rename(filename_tm, filename_rb)<br>
end</p>
<p>def parse filename_rb<br>
text = load(filename_rb)<br>
new_text = replace(text)<br>
save(filename_rb, new_text) if changed = (new_text != text)<br>
yield changed if block_given?<br>
end</p>
<p>def search pattern<br>
Dir.glob(pattern) do |filename_rb|<br>
parse(filename_rb) do |changed|<br>
yield filename_rb, changed if block_given?<br>
end<br>
end<br>
end<br>
end</p>
<p>if $0 == <strong>FILE</strong><br>
Tounix.new.search('**/*.rb') do |filename_rb, changed|<br>
print '%-9s' % (changed ? 'Changed' : ''), filename_rb, "\n"<br>
end<br>
end</p>
Ruby master - Bug #8287 (Rejected): Regexp performance issue
https://bugs.ruby-lang.org/issues/8287
2013-04-18T13:38:07Z
mghomn (Justin Peal)
yujianbin@huawei.com
<p>ADDRESS = # RFC-5322 : <a href="http://tools.ietf.org/html/rfc5322" class="external">http://tools.ietf.org/html/rfc5322</a><br>
/<br>
(?<br>
(?<name_addr><br>
(?<display_name><br>
(?<br>
(?<br>
(?<br>
#\g?<br>
#\g+<br>
#\g?<br>
)<br>
|<br>
\g<quoted_string><br>
)+<br>
)<br>
)?<br>
(?<angle_addr><br>
\g?<br>
<<br>
\g<addr_spec><br>
><br>
\g?<br>
)<br>
)<br>
|<br>
(?<addr_spec><br>
(?<local_part><br>
(?<dot_atom><br>
(?<br>
(?:<br>
(?:<br>
(?<br>
(<br>
\g*<br>
(?<br>
\x0d \x0a<br>
)<br>
)?<br>
(?<br>
\x09 | \x20<br>
)+<br>
)?<br>
(?<br>
(<br>
(?:<br>
\g?<br>
(?<br>
(?<br>
[\x21-\x27] | [\x2a-\x5b] | [\x5d-\x7e]<br>
)<br>
|<br>
(?<quoted_pair><br>
\<br>
(?:<br>
(?<br>
[\x21-\x7e]<br>
)<br>
|<br>
\g<br>
)<br>
)<br>
|<br>
\g<br>
)<br>
)*<br>
\g?<br>
)<br>
)<br>
)+<br>
\g?<br>
)<br>
|<br>
\g<br>
)?<br>
(?<dot_atom_text><br>
(?<br>
[-\w!#$%&'<em>+/=?^`{|}~]<br>
)+<br>
(?:<br>
.<br>
\g+<br>
)</em><br>
)<br>
\g?<br>
)<br>
|<br>
(?<quoted_string><br>
\g?<br>
(? " )<br>
(?:<br>
\g?<br>
(?<br>
(?<br>
\x21 | [\x23-\x5b] | [\x5d-\x7e]<br>
)<br>
|<br>
\g<quoted_pair><br>
)<br>
)*<br>
\g?<br>
\g<br>
\g?<br>
)<br>
)<br>
@<br>
(?<br>
\g<dot_atom><br>
|<br>
(?<domain_literal><br>
\g?<br>
[<br>
(<br>
\g?<br>
(?<br>
[\x21-\x5a] | [\x5e-\x7e]<br>
)<br>
)*<br>
\g?<br>
]<br>
\g?<br>
)<br>
)<br>
)<br>
)<br>
|<br>
(?<br>
\g<display_name><br>
:<br>
(?<group_list><br>
(?<mailbox_list><br>
\g<br>
(?:<br>
,<br>
\g<br>
)*<br>
)<br>
|<br>
\g<br>
)?<br>
;<br>
\g?<br>
)<br>
/x</p>
<p>puts "start = #{start = Time.now}"<br>
puts '<a href="mailto:dH3GFaWn5nqgxtYAiTyG@eu.tv" class="email">dH3GFaWn5nqgxtYAiTyG@eu.tv</a>'[ADDRESS]<br>
puts "stop = #{stop = Time.now}"<br>
puts "#{stop - start} seconds"</p>
<p>=begin<br>
C:>err<br>
start = 2013-04-18 12:34:02 +0800<br>
<a href="mailto:dH3GFaWn5nqgxtYAiTyG@eu.tv" class="email">dH3GFaWn5nqgxtYAiTyG@eu.tv</a><br>
stop = 2013-04-18 12:34:04 +0800<br>
1.662166 seconds</p>
<p>After uncomment line 9~11:</p>
<p>C:>err<br>
start = 2013-04-18 12:34:14 +0800<br>
<a href="mailto:dH3GFaWn5nqgxtYAiTyG@eu.tv" class="email">dH3GFaWn5nqgxtYAiTyG@eu.tv</a><br>
stop = 2013-04-18 12:34:14 +0800<br>
0.003001 seconds<br>
=end</p>
Ruby master - Feature #7751 (Rejected): How to encapsulate File.delete and File.rename into one '...
https://bugs.ruby-lang.org/issues/7751
2013-01-29T11:15:08Z
mghomn (Justin Peal)
yujianbin@huawei.com
<h1>Following program has a line: File.delete(sql_file) and File.rename(tmp_file, sql_file)<br>
It is not a 'transaction' which is I need. Has Ruby a feature to encapsulate File.delete and File.rename into one 'transaction'?</h1>
<p>class String<br>
def camelize<br>
self.split('<em>').map {|w| w.capitalize }.join('</em>')<br>
end<br>
end</p>
<p>class Busql<br>
WORD = /\A(/*.<em>?*/|'(?:[^']|'')</em>'|"(?:[^"]|"")<em>"|--.</em>?\n|\n|([$<em>]|\p{L})([$</em>]|\p{L}|\p{N})*|\p{M}+|\p{Z}+|\p{S}+|\p{N}+|\p{P}|\p{C}+)/m<br>
Oracle_Reserved_Words = /\A(ACCESS|ADD|ALL|ALTER|AND|ANY|ARRAYLEN|AS|ASC|AUDIT)\z/i<br>
Oracle_Keywords = /\A(ADMIN|AFTER|ALLOCATE|ANALYZE|ARCHIVE|ARCHIVELOG|AUTHORIZATION|AVG)\z/i<br>
PL_SQL_Reserved_Words = /\A(ABORT|ACCEPT|ACCESS|ADD|ALL|ALTER|AND|ANY|ARRAY|ARRAYLEN|AS|ASC|ASSERT|ASSIGN|AT|AUTHORIZATION|AVG)\z/i<br>
Data_Types = /\A(VARCHAR2|NVARCHAR2|NUMBER|FLOAT|LONG|DATE|BINARY_FLOAT|BINARY_DOUBLE|TIMESTAMP|INTERVAL|YEAR|DAY|RAW|ROWID|UROWID|CHAR|NCHAR|CLOB|NCLOB|BLOB|BFILE)\z/i<br>
Operators = /\A(PRIOR|CONNECT_BY_ROOT|UNION|ALL|INTERSECT|MINUS|MULTISET)\z/i<br>
Joins = /\A(NATURAL|LEFT|RIGHT|FULL|INNER|OUTER|CROSS|JOIN)\z/i<br>
SQL_Functions = /\A(ABS|ACOS|ADD_MONTHS|APPENDCHILDXML|ASCII|ASCIISTR|ASIN|ATAN|ATAN2|AVG)\z/i<br>
Pseudocolumns = /\A(CONNECT_BY_ISCYCLE|CONNECT_BY_ISLEAF|LEVEL|CURRVAL|NEXTVAL|VERSIONS_STARTSCN|VERSIONS_STARTTIME|VERSIONS_ENDSCN|VERSIONS_ENDTIME|VERSIONS_XID|VERSIONS_OPERATION|COLUMN_VALUE|OBJECT_ID|OBJECT_VALUE|ORA_ROWSCN|ROWID|ROWNUM|XMLDATA)\z/i<br>
NORMAL_WORDS = /\A([$_]|\p{L})/i</p>
<p>def change_case text<br>
news = []<br>
shr_text = text.dup<br>
until shr_text.empty?<br>
case word = shr_text[WORD, 1]<br>
when Oracle_Reserved_Words, Oracle_Keywords, PL_SQL_Reserved_Words, Data_Types, Operators, Joins then word.upcase!()<br>
when SQL_Functions, Pseudocolumns then word = word.camelize()<br>
when NORMAL_WORDS then word.downcase!() if word.ascii_only?<br>
end<br>
news << word<br>
shr_text.slice!(0, word.size)<br>
end<br>
news.join<br>
end</p>
<p>def change_sql sql_file<br>
text = File.read(sql_file, :mode => 'r:utf-8')<br>
new_text = change_case(text)<br>
if changed = (new_text != text)<br>
File.write(tmp_file = sql_file + '.t~m~p', new_text, :mode => 'wb')<br>
File.delete(sql_file) and File.rename(tmp_file, sql_file)<br>
end<br>
yield changed, text.size, new_text.size if block_given?<br>
end</p>
<p>def beautify argv<br>
argv.each do |arg|<br>
Dir.glob(arg) do |sql_file|<br>
sql_file = sql_file.force_encoding(Encoding::GB18030).encode(Encoding::UTF_8)<br>
change_sql(sql_file) do |changed, old_len, new_len|<br>
yield sql_file, changed, old_len, new_len if block_given?<br>
end<br>
end<br>
end<br>
end<br>
end</p>
<p>if $0 == <strong>FILE</strong><br>
Busql.new.beautify(ARGV) do |sql_file, changed, old_len, new_len|<br>
str = changed ? " #{old_len} ==> #{new_len}" : ''<br>
print "#{sql_file}#{str}\n"<br>
end<br>
end</p>
Ruby master - Feature #7525 (Rejected): How to avoid memory leak when something gets wrong and th...
https://bugs.ruby-lang.org/issues/7525
2012-12-06T16:52:47Z
mghomn (Justin Peal)
yujianbin@huawei.com
<p>require 'win32api'</p>
<p>module Crypto</p>
<a name="Common-API"></a>
<h1 >Common API<a href="#Common-API" class="wiki-anchor">¶</a></h1>
<p>NULL = 0<br>
@GetLastError = Win32API.new('kernel32', 'GetLastError', '', 'I')<br>
@lstrlen = Win32API.new('kernel32', 'lstrlenW', 'L', 'I')</p>
<a name="Memory-API"></a>
<h1 >Memory API<a href="#Memory-API" class="wiki-anchor">¶</a></h1>
<p>@RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'PLL', 'I')<br>
@LocalFree = Win32API.new('kernel32', 'LocalFree', 'L', 'I')</p>
<a name="Crypto-API"></a>
<h1 >Crypto API<a href="#Crypto-API" class="wiki-anchor">¶</a></h1>
<p>CRYPTPROTECT_UI_FORBIDDEN = 0x01<br>
@CryptProtectData = Win32API.new('crypt32', 'CryptProtectData', 'PPPPPLP', 'I')<br>
@CryptUnprotectData = Win32API.new('crypt32', 'CryptUnprotectData', 'PPPPPLP', 'I')</p>
<p>def self.error func<br>
puts "#{func} Error = #{@GetLastError.call()}"<br>
end</p>
<p>def self.encrypt str, entropy, desc<br>
pDataIn = [str.bytesize, str].pack('Lp')<br>
szDataDescr = (desc + "\0").encode(Encoding::UTF_16LE)<br>
pOptionalEntropy = [entropy.bytesize, entropy].pack('Lp')<br>
pvReserved = pPromptStruct = NULL<br>
dwFlags = CRYPTPROTECT_UI_FORBIDDEN<br>
pDataOut = [0, ''].pack('Lp')<br>
return error('CryptProtectData') if @CryptProtectData.call(pDataIn, szDataDescr, pOptionalEntropy, pvReserved, pPromptStruct, dwFlags, pDataOut) == 0<br>
cbData, pbData = pDataOut.unpack('LL')<br>
ret = ' '.encode(Encoding::BINARY) * cbData<br>
return error('RtlMoveMemory') if @RtlMoveMemory.call(ret, pbData, cbData) == 0<br>
return error('LocalFree') if @LocalFree.call(pbData) != NULL<br>
ret<br>
end</p>
<p>def self.decrypt str, entropy, desc<br>
pDataIn = [str.bytesize, str].pack('Lp')<br>
ppszDataDescr = [NULL].pack('L')<br>
pOptionalEntropy = [entropy.bytesize, entropy].pack('Lp')<br>
pvReserved = pPromptStruct = NULL<br>
dwFlags = CRYPTPROTECT_UI_FORBIDDEN<br>
pDataOut = [0, ''].pack('Lp')<br>
return error('CryptUnprotectData') if @CryptUnprotectData.call(pDataIn, ppszDataDescr, pOptionalEntropy, pvReserved, pPromptStruct, dwFlags, pDataOut) == 0<br>
pszDataDescr = ppszDataDescr.unpack('L').first<br>
szDataDescr = ' '.encode(Encoding::UTF_16LE) * @lstrlen.call(pszDataDescr)<br>
return error('RtlMoveMemory') if @RtlMoveMemory.call(szDataDescr, pszDataDescr, szDataDescr.bytesize) == 0<br>
return error('LocalFree') if @LocalFree.call(pszDataDescr) != NULL<br>
szDataDescr.encode!(Encoding::UTF_8)<br>
cbData, pbData = pDataOut.unpack('LL')<br>
ret = ' '.encode(Encoding::BINARY) * cbData<br>
return error('RtlMoveMemory') if @RtlMoveMemory.call(ret, pbData, cbData) == 0<br>
return error('LocalFree') if @LocalFree.call(pbData) != NULL<br>
desc = '' unless desc<br>
return error('Unmatched description') unless desc == szDataDescr<br>
ret.force_encoding(Encoding::UTF_8)<br>
end<br>
end</p>
<p>if $0 == <strong>FILE</strong><br>
def test plain, entropy, desc<br>
puts "plain = #{plain}, entropy = #{entropy}, desc = #{desc}"<br>
cipher = Crypto.encrypt(plain, entropy, desc)<br>
puts "cipher = #{cipher.unpack('H*').first}"<br>
recover = Crypto.decrypt(cipher, entropy, desc)<br>
puts "recover = #{recover}"<br>
end</p>
<p>begin<br>
test('abcd', 'efgh', 'ijkl')<br>
rescue<br>
puts $!.to_s.force_encoding(Encoding::UTF_8), $!.backtrace.join($/)<br>
end<br>
end</p>
Ruby master - Bug #7083 (Third Party's Issue): Why I cannot pass the test?
https://bugs.ruby-lang.org/issues/7083
2012-09-29T15:54:59Z
mghomn (Justin Peal)
yujianbin@huawei.com
<p>=== Program ===<br>
#!/usr/bin/env ruby -w</p>
<a name="encoding-utf-8"></a>
<h1 >encoding: utf-8<a href="#encoding-utf-8" class="wiki-anchor">¶</a></h1>
<p>require 'test/unit'</p>
<p>class Currency<br>
attr_reader :currency, :decimal_digits</p>
<p>def initialize currency, decimal_digits<br>
@currency, @decimal_digits = currency, decimal_digits<br>
end<br>
end</p>
<p>class Money<br>
attr_reader :hashy</p>
<p>def initialize hashy<br>
@hashy = hashy<br>
clean()<br>
end</p>
<p>def == other<br>
@hashy == other.hashy<br>
end</p>
<p>def -@<br>
@hashy.each_pair do |currency, amount|<br>
@hashy[currency] = -amount<br>
end<br>
clean()<br>
end</p>
<p>def + other<br>
@hashy.merge!(other.hashy) do |currency, old_amount, new_amount|<br>
old_amount.to_f + new_amount.to_f<br>
end<br>
clean()<br>
end</p>
<p>def - other<br>
@hashy.merge!(other.hashy) do |currency, old_amount, new_amount|<br>
old_amount.to_f - new_amount.to_f<br>
end<br>
clean()<br>
end</p>
<p>def * times<br>
@hashy.each_pair do |currency, amount|<br>
@hashy[currency] *= times<br>
end<br>
clean()<br>
end</p>
<p>def / times<br>
@hashy.each_pair do |currency, amount|<br>
@hashy[currency] /= times<br>
end<br>
clean()<br>
end</p>
<p>def clean<br>
@hashy.each_pair do |currency, amount|<br>
amount_new = amount.to_f.round(currency.decimal_digits)<br>
case<br>
when amount_new == 0.0<br>
@hashy.delete(currency)<br>
when amount_new != amount<br>
@hashy[currency] = amount_new<br>
end<br>
end<br>
self<br>
end<br>
end</p>
<p>class MoneyTest < Test::Unit::TestCase<br>
def test_add<br>
usd = Currency.new(:USD, 2)<br>
cny = Currency.new(:CNY, 2)<br>
eur = Currency.new(:EUR, 2)<br>
jpy = Currency.new(:JPY, 0)<br>
gbp = Currency.new(:GBP, 2)</p>
<pre><code>assert_equal(Money.new(eur=>367.85, cny=>-337.19, jpy=>42289), Money.new(eur=>867.02, cny=>-794.75, jpy=>99675) / 2.357)
assert_equal(Money.new(cny=>1576.56, gbp=>752.26, jpy=>64174), Money.new(cny=>861.51, gbp=>411.07, jpy=>35068) * 1.83)
assert_equal(Money.new(usd=>367.04, cny=>418.27, eur=>728.18), Money.new(cny=>418.27, usd=>129.66) + Money.new(usd=>237.38, eur=>728.18))
assert_equal(Money.new(eur=>211.32, cny=>-980.95, jpy=>31647), -Money.new(eur=>-211.32, cny=>980.95, jpy=>-31647))
assert_equal(Money.new(jpy=>19627, usd=>442.39, gbp=>-393.84), Money.new(jpy=>19627, usd=>908.64) - Money.new(usd=>466.25, gbp=>393.84))
</code></pre>
<p>end<br>
end<br>
=== Result ===<br>
Run options:</p>
<a name="Running-tests"></a>
<h1 >Running tests:<a href="#Running-tests" class="wiki-anchor">¶</a></h1>
<p>F</p>
<p>Finished tests in 0.029999s, 33.3344 tests/s, 166.6722 assertions/s.</p>
<ol>
<li>Failure:<br>
test_add(MoneyTest) [C:/R/tst2.rb:87]:<br>
<#<Money:0x1b463f8<br>
@hashy=<br>
{#<Currency:0x1b56148 @currency=:JPY, @decimal_digits=0>=>19627,<br>
#<Currency:0x1b561f0 @currency=:USD, @decimal_digits=2>=>442.39,<br>
#<Currency:0x1b560b8 @currency=:GBP, @decimal_digits=2>=>-393.84}>> expected<br>
but was<br>
<#<Money:0x1b462f0<br>
@hashy=<br>
{#<Currency:0x1b56148 @currency=:JPY, @decimal_digits=0>=>19627,<br>
#<Currency:0x1b561f0 @currency=:USD, @decimal_digits=2>=>442.39,<br>
#<Currency:0x1b560b8 @currency=:GBP, @decimal_digits=2>=>393.84}>>.</li>
</ol>
<p>1 tests, 5 assertions, 1 failures, 0 errors, 0 skips</p>
Ruby master - Bug #6843 (Rejected): win32ole save shortcut fail on Windows XP
https://bugs.ruby-lang.org/issues/6843
2012-08-08T14:59:03Z
mghomn (Justin Peal)
yujianbin@huawei.com
<a name="The-following-program-will-success-on-Windows-7-but-fail-on-Windows-XP"></a>
<h1 >The following program will success on Windows 7, but fail on Windows XP<a href="#The-following-program-will-success-on-Windows-7-but-fail-on-Windows-XP" class="wiki-anchor">¶</a></h1>
<h1>Error message:<br>
(in OLE method `Save': )<br>
OLE error code:80070003 in WshShortcut.Save<br>
C:\Documents and Settings......<br>
HResult error code:0x80020009<br>
Exception occurred.</h1>
<p>#!/usr/bin/env ruby -w -Eutf-8:utf-8</p>
<a name="encoding-utf-8"></a>
<h1 >encoding: utf-8<a href="#encoding-utf-8" class="wiki-anchor">¶</a></h1>
<p>require 'win32ole'</p>
<p>module Shortcut<br>
USERPROFILE = ENV['USERPROFILE']</p>
<p>def self.gen my_exe, my_params, my_dir, my_desc<br>
wsh = WIN32OLE.new('WScript.Shell')<br>
link = wsh.CreateShortcut("#{USERPROFILE}\Desktop\#{my_desc}.lnk")<br>
link.TargetPath = my_exe<br>
link.Arguments = my_params<br>
link.Description = my_desc<br>
link.WindowStyle = 3 # WindowsStyle.showmaximized<br>
link.WorkingDirectory = my_dir<br>
link.Save<br>
end<br>
end</p>
<p>if $0 == <strong>FILE</strong><br>
ComSpec = ENV['ComSpec']<br>
Shortcut.gen(ComSpec, '/c ver', Shortcut::USERPROFILE, 'OSVER')<br>
system("#{ComSpec} /c #{Shortcut::USERPROFILE}\Desktop\OSVER.lnk")<br>
end</p>
Ruby master - Bug #6675 (Rejected): Raise exception when convert encoding of a character from GBK...
https://bugs.ruby-lang.org/issues/6675
2012-06-30T15:13:59Z
mghomn (Justin Peal)
yujianbin@huawei.com
<p>#!/usr/bin/env ruby -w</p>
<a name="encoding-utf-8"></a>
<h1 >encoding: utf-8<a href="#encoding-utf-8" class="wiki-anchor">¶</a></h1>
<p>require 'test/unit'</p>
<p>class Tests < Test::Unit::TestCase<br>
def test_gbk<br>
assert_raise Encoding::UndefinedConversionError do<br>
"\ue863".encode('gbk').encode('utf-8')<br>
end<br>
end<br>
end</p>
Ruby master - Bug #6125 (Rejected): Exception Report
https://bugs.ruby-lang.org/issues/6125
2012-03-08T17:32:34Z
mghomn (Justin Peal)
yujianbin@huawei.com
<p>问题签名:<br>
问题事件名称: APPCRASH<br>
应用程序名: ruby.exe<br>
应用程序版本: 1.9.3.125<br>
应用程序时间戳: 4f3d0330<br>
故障模块名称: msvcrt-ruby191.dll<br>
故障模块版本: 1.9.3.125<br>
故障模块时间戳: 4f3d032f<br>
异常代码: c0000005<br>
异常偏移: 0014cc8a<br>
OS 版本: 6.1.7600.2.0.0.256.48<br>
区域设置 ID: 2052<br>
其他信息 1: 0137<br>
其他信息 2: 01371b010c3d49982ede98c99618bdbf<br>
其他信息 3: e619<br>
其他信息 4: e6197f8b167ba6ba38cb26d8d46f9a56</p>
<p>Issue Signature:<br>
Issue Incident Name: APPCRASH<br>
Application Program Name: ruby.exe<br>
Application Program Version: 1.9.3.125<br>
Application Program Timestamp: 4f3d0330<br>
Fault Module Name: msvcrt-ruby191.dll<br>
Fault Module Version: 1.9.3.125<br>
Fault Module Timestamp: 4f3d032f<br>
Exception Code: c0000005<br>
Exception Offset: 0014cc8a<br>
OS Version: 6.1.7600.2.0.0.256.48<br>
Area Setup ID: 2052<br>
Other Information 1: 0137<br>
Other Information 2: 01371b010c3d49982ede98c99618bdbf<br>
Other Information 3: e619<br>
Other Information 4: e6197f8b167ba6ba38cb26d8d46f9a56</p>
Ruby master - Bug #6122 (Closed): OpenSSL::PKCS7 verify
https://bugs.ruby-lang.org/issues/6122
2012-03-07T20:10:08Z
mghomn (Justin Peal)
yujianbin@huawei.com
<a name="not_after-can-not-later-than-2038-01-19-111407"></a>
<h1 >not_after can not later than 2038-01-19 11:14:07<a href="#not_after-can-not-later-than-2038-01-19-111407" class="wiki-anchor">¶</a></h1>
<a name="verify-can-pass-wrong-certificate"></a>
<h1 >verify can pass wrong certificate<a href="#verify-can-pass-wrong-certificate" class="wiki-anchor">¶</a></h1>
<p>require 'OpenSSL'</p>
<p>class Rsa<br>
attr_reader :key, :cert<br>
@@sha = OpenSSL::Digest::SHA1.new<br>
@@aes = OpenSSL::Cipher.new("aes-128-ofb")</p>
<pre><code>def initialize serial, issuer=nil
@key = OpenSSL::PKey::RSA.new(1024)
@cert = OpenSSL::X509::Certificate.new
@cert.version = 2 # RFC 5280 - v3
@cert.serial = serial
@cert.subject = OpenSSL::X509::Name.parse "CN=#{serial}"
@cert.issuer = issuer==nil ? @cert.subject : issuer
@cert.public_key = @key.public_key
@cert.not_before = Time.now
@cert.not_after = Time.mktime(2038, 1, 19, 11, 14, 7) # second = 8 ==> Fail!
@cert.sign(@key, @@sha) if issuer==nil
end
def sign key
@cert.sign(key, @@sha)
end
</code></pre>
<p>def sign_encrypt(plain, obj_cert)<br>
signed = OpenSSL::PKCS7::sign(@cert, @key, plain)<br>
encrypted = OpenSSL::PKCS7::encrypt([obj_cert], signed.to_s, @@aes)<br>
end</p>
<p>def decrypt_verify(received, obj_cert, ca_cert)<br>
encrypted = OpenSSL::PKCS7.new(received)<br>
decrypted = encrypted.decrypt(@key, @cert)<br>
signed = OpenSSL::PKCS7.new(decrypted)<br>
cert_store = OpenSSL::X509::Store.new.add_cert(ca_cert)<br>
plain = signed.data if signed.verify([obj_cert], cert_store)<br>
end<br>
end</p>
<p>ca = Rsa.new(1)<br>
alice = Rsa.new(11, ca.cert.issuer)<br>
alice.sign ca.key<br>
right = Rsa.new(12, ca.cert.issuer)<br>
right.sign ca.key</p>
<p>fa = Rsa.new(3)<br>
wrong = Rsa.new(33, fa.cert.issuer)</p>
<a name="wrongsign-fakey-Dont-sign-indeed"></a>
<h1 >wrong.sign fa.key # Don't sign indeed!<a href="#wrongsign-fakey-Dont-sign-indeed" class="wiki-anchor">¶</a></h1>
<p>plain = "Something's wrong."<br>
signed_encrypted = right.sign_encrypt(plain, alice.cert)<br>
recovered = alice.decrypt_verify(signed_encrypted, wrong.cert, ca.cert) # wrong should be right<br>
puts recovered==plain ? recovered : "It's okay!"</p>