Project

General

Profile

Feature #14352

Updated by kirika (Toshio Maki) over 6 years ago

英語で書こうと思ったのですが、うまく伝えられないかもしれないので日本語で書かせてください。すみません。 

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

 調査してみると、RubyのArray#Pack("M")を使ったときに、以下のように 
 \rは=0Dに変換してくれるのですが、\nは=0Aではなく、そのまま\nで維持するのが問題のようで、 \nは=0Dに変換してくれるのですが、\rは=0Aではなく、そのまま\rで維持するのが問題のようで、 
 mail libraryはパース前の処理に\nを\r\nに変換するという処理を加えるのですが、その時に\nが 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にバックポート可能かどうかも 
 含めて相談させてもらえれば、と思います。 



Back