Issue #14352 has been updated by matz (Yukihiro Matsumoto).


うささんの案には惹かれるものがありますが、 M を削除するよりは将来の挙動を変更すると警告するほうが良いと思います。で、デフォルトでどちらかによせるかというとバイナリかな?

Matz.


----------------------------------------
Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352#change-69557

* Author: kirika (Toshio Maki)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
英語で書こうと思ったのですが、うまく伝えられないかもしれないので日本語で書かせてください。すみません。

mail libraryというgemを使ってメールをパースしたり、書きだしたりしているのですが、
Quoted-Printableでエンコードされたバイナリがメールに含まれていた場合に、メールを破壊する
可能性があるということが分かりました。

調査してみると、RubyのArray#Pack("M")を使ったときに、以下のように
\nは=0Dに変換してくれるのですが、\rは=0Aではなく、そのまま\rで維持するのが問題のようで、
mail libraryはパース前の処理に\rを\r\nに変換するという処理を加えるのですが、その時に\rが
\r\nに変換され、オリジナルのバイナリを破壊してしまうことが分かりました。

<pre>
puts ["あいうえお\r\nかきくけこ"].pack('M')
</pre>

実行結果
<pre>
=E3=81=82=E3=81=84=E3=81=86=E3=81=88=E3=81=8A=0D
=E3=81=8B=E3=81=8D=E3=81=8F=E3=81=91=E3=81=93=
</pre>

Quoted-Printableにおいては、レイアウトのための改行は=\r\nにする、ということが決まっているので、
このように\nが単独で残るということはないような気がするのですが、昨年末にまつもとさんにご質問
させていただいた際にPerlの実装を参考にした、ということを伺ったので、Perlについても調べて
みたのですが、Perlは$binmodeというフラグで、バイナリ時の挙動と分けているようです。

http://perldoc.perl.org/MIME/QuotedPrint.html
(もしかすると、参考にした実装とは関係ないかもしれません)

今からpack('M')の挙動を変えると、影響範囲が大きそうなので、バイナリをQuoted-Printableでエンコード
するためのオプションがあれば、いいと思うのですが、packにどういうオプション名をつければよいか、
またpack.cのqpencode関数にbinmode用の拡張しても良いかを含めてご相談させてください。

出来れば今使っているrubyのバージョンは2.3とかだったりするので、2.3.x, 2.4.xにバックポート可能かどうかも
含めて相談させてもらえれば、と思います。







-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>