Project

General

Profile

Actions

Bug(バグ) #2261

open

メール投稿で画像を1つだけ送信すると画像として扱われないことがある

Added by Naoya Tozuka over 13 years ago. Updated over 4 years ago.

Status:
Rejected(差し戻し)
Priority:
Normal(通常)
Assignee:
-
Target version:
Start date:
2011-07-05
Due date:
% Done:

50%

Estimated time:
(Total: 0:00 h)
3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)

Description

Overview (現象)

日記やコメント等をメールで投稿する際、本文なしで画像を1つだけ送信すると、画像として認識されずBase64テキストとして本文に展開されてしまうことがある。

本来は本文なしで画像のみが送信された場合のフローに従い、メール投稿を成功させず日記が作成されないようにすべき(そして「本文を入力してください。」というメールを返信すべき)である。

★写真のみの投稿も(オプション等で)許可すべきではないかという議論も必要かと思われるが別チケットで。

Environment (再現バージョン)

  • OpenPNE 3.6beta

Way to repro (再現方法)

  • 現在この現象が確認できているのはiPhoneのMMSからメール投稿を行ったケースのみ。

Causes (原因)

iPhoneのMMSでは、画像単体を送信した場合 Content-type: image/jpeg で画像データのみを(base64エンコーディングでテキスト化して)送信するが、
opMailMessage クラスは multipart でないメールを全てJISエンコーディングのテキストとして認識してしまうのが原因。

Way to fix (修正内容)

Content-type が image/jpeg, image/png, image/gif などのメールを正しく処理できるように opMailMessage クラスを修正する。


Files

base64_decode_test.php (188 KB) base64_decode_test.php データ末尾に余分な改行が含まれる場合の base64_decode() の挙動を確認するスクリプト Naoya Tozuka, 2011-07-06 18:55

Subtasks 2 (2 open0 closed)

Backport(バックポート) #4404: メール投稿で画像を1つだけ送信すると画像として扱われないことがあるNew(新規)isao sano2011-07-05

Actions
Backport(バックポート) #4405: メール投稿で画像を1つだけ送信すると画像として扱われないことがあるNew(新規)isao sano2011-07-05

Actions

Related issues 1 (0 open1 closed)

Related to OpenPNE 3 - Bug(バグ) #2476: PHP 5.3.4 以降の場合に画像付きメール投稿が失敗するFixed(完了)Minoru Takai2011-10-06

Actions
Actions #1

Updated by Naoya Tozuka over 13 years ago

  • Assignee set to Naoya Tozuka
Actions #2

Updated by Naoya Tozuka over 13 years ago

  • Status changed from New(新規) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

更新履歴 5cbd2e46763a087ec35f380bcd93b9ab123e526a で適用されました。

Actions #3

Updated by Naoya Tozuka over 13 years ago

iPhoneから本文なしで画像のみをMMSで日記投稿用URLに送信した場合に、日記作成に失敗し

Subject: [***(SNS名称)***]メールの処理中にエラーが発生しました

本文を入力してください。
のようにメール通知が返されるようになることを確認しています。

Actions #4

Updated by Naoya Tozuka over 13 years ago

  • Subject changed from メール投稿で画像のみで送信すると画像として扱われないことがある to メール投稿で画像を1つだけ送信すると画像として扱われないことがある
Actions #5

Updated by Naoya Tozuka over 13 years ago

  • Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)

チケットで示されている問題とは別ですが、PHPのバージョンが新しいとき(5.3.5で再現確認。5.2.13では再現せず)に添付画像が保存されない問題を発見しました。

修正の範囲と内容がこのチケットに収まると判断し、追加で修正します。

概要

PHPのバージョンが新しいとき(この意味は以下の原因と note-8 を参照のこと)、メール投稿において画像を添付すると(添付画像の個数は任意)添付画像が受け付けられない。

原因

最新のPHPにおいて、base64_decode() を strictモード(第2引数をtrue)で使うとmultipartから取得した画像データ(base64-encoded text)の末尾に改行が余分に含まれていると FALSE を返す。添付画像は application/x-empty とみなされ画像とはみなされず無視される。

修正方法

base64_decode($content, true); の箇所を base64_decode(rtrim($content), true); に変更する。

Actions #7

Updated by Naoya Tozuka over 13 years ago

  • Status changed from Rejected(差し戻し) to Pending Review(レビュー待ち)

更新履歴 fcab4cf56ff5532f6e5fef518da08d0c2926a753 で適用されました。

Actions #8

Updated by Naoya Tozuka over 13 years ago

PHPのバージョンと base64_decode() の挙動/RFC3548

最後に改行が余分に入ったbase64エンコードデータをstrict modeで処理した場合の挙動をPHP 5.2.17, 5.3.0〜5.3.6の各バージョンで調べたところ、5.3.4 以降で FALSE が返るようになっていました。(調査に使用したのは本チケットに添付の base64_decode_test.php です)

PHP 5.3.4 (see http://php.net/ChangeLog-5.php#5.3.4 ) において、base64_decode() 関連で修正があったようです。(Base64について定義しているRFC3548に厳格に従うよう修正されたということでしょうか)
http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/base64.c?r1=305779&r2=305778&pathrev=305779
http://www.ietf.org/rfc/rfc3548.txt

Actions #9

Updated by Naoya Tozuka over 13 years ago

(二重投稿のため抹消)

Actions #10

Updated by Minoru Takai over 13 years ago

note-5 時点では、 note-5 で示されている問題を本チケットで併せて対応していますが、問題の内容を考えるとこれは別チケットで扱うべきでした。

note-5 の問題は #2476 で扱います。その修正は本チケットに紐づいている fcab4cf5 です。

このチケットでは 5cbd2e46 の修正のみレビュー、テストを行なってください。

Actions #11

Updated by Minoru Takai about 13 years ago

  • Status changed from Pending Review(レビュー待ち) to Rejected(差し戻し)
  • Assignee deleted (Naoya Tozuka)

5cbd2e46 の修正が入った master ブランチで、「画像が添付されていない場合に、メール投稿が失敗する」という不具合が見つかっています。

  • その修正で次の記述が追加されていますが、
    lib/util/opMailMessage.class.php
    53-    elseif ('text/plain' === strtok($this->getPart(0)->contentType, ';'))
    54-    {
    55-      return mb_convert_encoding(parent::getContent(), 'UTF-8', 'JIS');
    56-    }
    
  • $this->getPart(0) のコールで、次の部分に到達し、例外が投げられているようです
    lib/vendor/Zend/Mail/Part.php
    239-    public function getPart($num)
    --
    260-        if (!isset($this->_parts[$num])) {
    261-            /**
    262-             * @see Zend_Mail_Exception
    263-             */
    264-            require_once 'Zend/Mail/Exception.php';
    265-            throw new Zend_Mail_Exception('part not found');
    266-        }
    
Actions #12

Updated by Shouta Kashiwagi almost 13 years ago

  • Target version changed from OpenPNE 3.7.0 to 252
Actions #13

Updated by Shouta Kashiwagi almost 13 years ago

  • Target version changed from 252 to OpenPNE 3.8.x
Actions #14

Updated by kaoru n almost 5 years ago

  • Target version changed from OpenPNE 3.8.x to OpenPNE 3.10.x
  • 3.6 で発生するか set to Unknown (未調査)
Actions #15

Updated by kaoru n over 4 years ago

  • Target version changed from OpenPNE 3.10.x to OpenPNE 3.11.x
Actions

Also available in: Atom PDF