source: branches/version-2_11-dev/data/class/SC_MobileImage.php @ 20920

Revision 20920, 4.7 KB checked in by nanasess, 10 years ago (diff)

#1301 (ダウンロード商品のダウンロードで, 無限ループの可能性)

  • fopen() の返り値をチェックするよう修正
  • data/class/SC_MobileImage.php でも同様の懸念があったため修正
  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 *
23 * 端末の画面解像度にあわせて画像を変換する
24 */
25
26define("MOBILE_IMAGE_INC_REALDIR", realpath(dirname( __FILE__)) . "/../include/");
27require_once MOBILE_IMAGE_INC_REALDIR . 'image_converter.inc';
28
29/**
30 * 画像変換クラス
31 */
32class SC_MobileImage {
33    /**
34     * 画像を端末の解像度に合わせて変換する
35     * output buffering 用コールバック関数
36     *
37     * @param string 入力
38     * @return string 出力
39     */
40    function handler($buffer) {
41
42        // 端末情報を取得する
43        $carrier = SC_MobileUserAgent_Ex::getCarrier();
44        $model   = SC_MobileUserAgent_Ex::getModel();
45
46        // 携帯電話の場合のみ処理を行う
47        if ($carrier !== FALSE) {
48
49            // HTML中のIMGタグを取得する
50            $pattern = '/<img\s+[^<>]*src=[\'"]?([^>"\'\s]+)[\'"]?\s*\/?/i';
51            $result = preg_match_all($pattern, $buffer, $images);
52
53            // 端末の情報を取得する
54            $fp = fopen(MOBILE_IMAGE_INC_REALDIR . "mobile_image_map_$carrier.csv", 'r');
55            // 取得できない場合は, 入力内容をそのまま返す
56            if ($fp === false) {
57                return $buffer;
58            }
59            while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) {
60                if ($data[1] == $model || $data[1] == '*') {
61                    $cacheSize     = $data[2];
62                    $imageFileSize = $data[7];
63                    $imageType     = $data[6];
64                    $imageWidth    = $data[5];
65                    $imageHeight   = $data[4];
66                    break;
67                }
68            }
69            fclose($fp);
70
71            // docomoとsoftbankの場合は画像ファイル一つに利用可能なサイズの上限を計算する
72            // auはHTMLのbyte数上限に画像ファイルサイズが含まれないのでimageFileSizeのまま。
73            if ($carrier == 'docomo' or $carrier == 'softbank') {
74                if( $result != false && $result > 0){
75                    // 計算式:(利用端末で表示可能なcacheサイズ - HTMLのバイト数 - 変換後の画像名のバイト数(目安値) ) / HTML中の画像数
76                    $temp_imagefilesize = ($cacheSize - strlen($buffer) - (140 * $result) ) / $result;
77                } else {
78                    // 計算式:(利用端末で表示可能なcacheサイズ - HTMLのバイト数 )
79                    $temp_imagefilesize = ($cacheSize - strlen($buffer) );
80                }
81                // 計算結果が端末の表示可能ファイルサイズ上限より小さい場合は計算結果の値を有効にする
82                if ($temp_imagefilesize < $imageFileSize) {
83                    $imageFileSize = $temp_imagefilesize;
84                }
85            }
86
87            // 画像変換の情報をセットする
88            $imageConverter = New ImageConverter();
89            $imageConverter->setOutputDir(MOBILE_IMAGE_REALDIR);
90            $imageConverter->setImageType($imageType);
91            $imageConverter->setImageWidth($imageWidth);
92            $imageConverter->setImageHeight($imageHeight);
93            $imageConverter->setFileSize($imageFileSize);
94
95            // HTML中のIMGタグを変換後のファイルパスに置換する
96            foreach ($images[1] as $key => $path) {
97                $realpath = html_entity_decode($path, ENT_QUOTES);
98                $realpath = preg_replace('|^' . ROOT_URLPATH . '|', HTML_REALDIR, $realpath);
99                $converted = $imageConverter->execute($realpath);
100                if (isset($converted['outputImageName'])) {
101                    $buffer = str_replace($path, MOBILE_IMAGE_URLPATH . '/' . $converted['outputImageName'], $buffer);
102                } else {
103                    $buffer = str_replace($images[0][$key], '<!--No image-->', $buffer);
104                }
105            }
106        }
107        return $buffer;
108    }
109}
110?>
Note: See TracBrowser for help on using the repository browser.