Пример #1
0
 /**
  * JPEG image auto rotation by EXIF info for OnUpLoadPreSave callback
  * 
  * @param string $path
  * @param string $name
  * @param string $src
  * @param object $elfinder
  * @param object $volume
  * @return boolean
  */
 public function autoRotateOnUpLoadPreSave(&$path, &$name, $src, $elfinder, $volume)
 {
     if (!class_exists('HypCommonFunc') || version_compare(HypCommonFunc::get_version(), '20150515', '<')) {
         return false;
     }
     $srcImgInfo = @getimagesize($src);
     if ($srcImgInfo === false) {
         return false;
     }
     if (!in_array($srcImgInfo[2], array(IMAGETYPE_JPEG, IMAGETYPE_JPEG2000))) {
         return false;
     }
     $ret = HypCommonFunc::rotateImage($src, 0, 95, $srcImgInfo);
     // remove exif gps info
     HypCommonFunc::removeExifGps($src, $srcImgInfo);
     return $ret;
 }
Пример #2
0
 function do_upload($page, $fname, $tmpname, $copyright = FALSE, $pass = NULL, $notouch = FALSE, $options = NULL)
 {
     // ページが無ければ空ページを作成(他のプラグインから呼ばれた時のため)
     if (!$this->func->is_page($page)) {
         $this->func->make_empty_page($page, false);
     }
     $overwrite = !empty($options['overwrite']);
     $changelog = isset($options['changelog']) ? $options['changelog'] : '';
     $add_mes = array();
     $has_json_msg = false;
     // ファイル名の正規化
     $fname = str_replace("", '', $fname);
     $fname = $this->func->basename(str_replace("\\", "/", $fname));
     $_action = 'insert';
     // style.css
     if ($fname === 'style.css' && $this->func->is_owner($page)) {
         if (is_file($tmpname)) {
             $_pagecss_file = $this->cont['CACHE_DIR'] . $this->func->get_pgid_by_name($page) . ".css";
             if (is_file($_pagecss_file)) {
                 unlink($_pagecss_file);
             }
             if (is_uploaded_file($tmpname) && move_uploaded_file($tmpname, $_pagecss_file) || @rename($tmpname, $_pagecss_file)) {
                 $this->attach_chmod($_pagecss_file);
                 // 空のファイルの場合はファイル削除
                 if (!trim(file_get_contents($_pagecss_file))) {
                     unlink($_pagecss_file);
                     return array('result' => TRUE, 'msg' => $this->root->_attach_messages['msg_unset_css'], 'has_json_msg' => TRUE);
                 } else {
                     $_data = file_get_contents($_pagecss_file);
                     // 管理者以外は外部ファイルの参照を禁止するなどの書き換え
                     if (!$this->root->userinfo['admin']) {
                         $_data = preg_replace('#(?:url\\s*\\(\\s*[\'"]?(?:(?:ht|f)tps?:)?//[^\\)]+?\\)|@import[^;\\r\\n]*?;|@import|(?:ht|f)tps?://)#i', '', $_data);
                     }
                     if (file_put_contents($_pagecss_file, $_data)) {
                         $add_mes[] = $this->root->_attach_messages['msg_set_css'];
                         $has_json_msg = true;
                     }
                     // 元ファイルを添付ファイルとして保存
                     if ($tmpname = tempnam($this->cont['CACHE_DIR'], 'atf')) {
                         file_put_contents($tmpname, $_data);
                         $overwrite = true;
                     }
                     clearstatcache();
                 }
             } else {
                 @unlink($tmpname);
                 return array('result' => FALSE, 'msg' => $this->root->_attach_messages['err_exists']);
             }
         }
     }
     // ページオーナー権限がない場合は拡張子をチェック
     $allow_extensions = $this->get_allow_extensions();
     if (empty($options['asSystem']) && !$overwrite && $allow_extensions && !$this->func->is_owner($page) && !preg_match("/\\.(" . join("|", $allow_extensions) . ")\$/i", $fname)) {
         return array('result' => FALSE, 'msg' => str_replace('$1', $this->func->htmlspecialchars(preg_replace('/.*\\.([^.]*)$/', "\$1", $fname)), $this->root->_attach_messages['err_extension']));
     }
     $_size = @getimagesize($tmpname);
     // イメージファイルの内容をチェック
     if ($_size) {
         $checkStr = $this->func->file_get_contents($tmpname, FALSE, NULL, 0, 10240);
         if (preg_match('/<(?:script|\\?php)/i', $checkStr)) {
             return array('result' => FALSE, 'msg' => 'It isn\'t a image file.');
         }
         // Flashファイルの検査
         if ($this->cont['ATTACH_UPLOAD_FLASH_ADMIN_ONLY']) {
             if (!$this->root->userinfo['admin'] && ($_size[2] === 4 || $_size[2] === 13)) {
                 return array('result' => FALSE, 'msg' => $this->root->_attach_messages['err_isflash']);
             }
         }
     }
     // オリジナルファイル名
     $org_fname = $fname;
     // 格納ファイル名指定あり
     if (!empty($this->root->vars['filename'])) {
         $fname = $this->root->vars['filename'];
     }
     // 格納ファイル名文字数チェック(SQL varchar(255) - strlen('_\d\d\d'))
     $fname = function_exists('mb_strcut') ? mb_strcut($fname, 0, 251) : substr($fname, 0, 251);
     // ファイル名 文字数のチェック
     $fname = $this->regularize_fname($fname, $page);
     if (!$overwrite) {
         // ファイル名が存在する場合は、数字を付け加える
         if (preg_match("/^(.+)(\\.[^.]*)\$/", $fname, $match)) {
             $_fname = $match[1];
             $_ext = $match[2];
         } else {
             $_fname = $fname;
             $_ext = '';
         }
         $fi = 0;
         do {
             $obj = new XpWikiAttachFile($this->xpwiki, $page, $fname);
             $fname = $_fname . '_' . $fi++ . $_ext;
         } while ($obj->exist);
     } else {
         $obj = new XpWikiAttachFile($this->xpwiki, $page, $fname);
         if (is_file($obj->filename)) {
             unlink($obj->filename);
             $_action = "update";
         }
     }
     if (is_uploaded_file($tmpname)) {
         if (move_uploaded_file($tmpname, $obj->filename)) {
             $this->attach_chmod($obj->filename);
         } else {
             return array('result' => FALSE, 'msg' => $this->root->_attach_messages['err_noexist']);
         }
     } else {
         if (!is_file($tmpname) || !filesize($tmpname)) {
             if (is_file($tmpname)) {
                 unlink($tmpname);
             }
             return array('result' => FALSE, 'msg' => $this->root->_attach_messages['err_noexist']);
         }
         if (rename($tmpname, $obj->filename)) {
             $this->attach_chmod($obj->filename);
         } else {
             unlink($tmpname);
             return array('result' => FALSE, 'msg' => $this->root->_attach_messages['err_noexist']);
         }
     }
     if ($this->func->is_page($page)) {
         if (!$notouch) {
             if (!$changelog) {
                 $changelog = 'Attached file: ' . $this->func->htmlspecialchars($obj->file);
             }
             $this->root->rtf['page_touch'][$page][] = $changelog;
         }
         $this->func->clear_page_cache($page);
     }
     if (!empty($options['asSystem'])) {
         $_uid = 0;
         $_ucd = 'SYSTEM';
         $_uname = 'System';
         $_admins = 0;
     } else {
         $_uid = $this->root->userinfo['uid'];
         $_ucd = $this->root->userinfo['ucd'];
         $_uname = $this->root->userinfo['uname'];
         $_admins = (int) $this->func->check_admin($this->root->userinfo['uid']);
     }
     if ($_size && version_compare(HypCommonFunc::get_version(), '20150515', '>=')) {
         // 自動回転を試みる
         HypCommonFunc::rotateImage($obj->filename, 0, 95, $_size);
         if (!empty($this->root->vars['rmgps'])) {
             HypCommonFunc::removeExifGps($obj->filename, $_size);
         }
     }
     $obj->getstatus();
     $obj->status['age'] = 0;
     $obj->status['pass'] = ($pass !== TRUE and $pass !== NULL) ? $pass : '';
     $obj->status['copyright'] = $copyright;
     $obj->status['owner'] = $_uid;
     $obj->status['ucd'] = $_ucd;
     $obj->status['uname'] = $_uname;
     $obj->status['md5'] = md5_file($obj->filename);
     $obj->status['admins'] = $_admins;
     $obj->status['org_fname'] = $org_fname;
     $obj->status['imagesize'] = $obj->getimagesize($obj->filename);
     $obj->status['mime'] = $this->attach_mime_content_type($obj->filename, $obj->status);
     $obj->action = $_action;
     $obj->putstatus();
     if (!empty($this->root->vars['refid'])) {
         $this->ref_replace($page, $this->root->vars['refid'], $obj->file, $obj->status['imagesize']);
     }
     return array('result' => TRUE, 'msg' => $add_mes ? join("\n", $add_mes) : $this->root->_attach_messages['msg_uploaded'], 'name' => $obj->file, 'has_json_msg' => $has_json_msg);
 }
Пример #3
0
 function plugin_moblog_action()
 {
     error_reporting(0);
     $this->debug = array();
     $this->admin = $this->root->userinfo['admin'];
     $this->chk_fp = NULL;
     $this->output_mode = isset($this->root->vars['om']) && $this->root->vars['om'] === 'rss' ? 'rss' : 'img';
     $host = $user = $pass = $port = '';
     $execution_time = intval(ini_get('max_execution_time'));
     //設定ファイル読み込み
     if (isset($this->config['host'])) {
         $host = (string) $this->config['host'];
     }
     if (isset($this->config['mail'])) {
         $mail = (string) $this->config['mail'];
     }
     if (isset($this->config['user'])) {
         $user = (string) $this->config['user'];
     }
     if (isset($this->config['pass'])) {
         $pass = (string) $this->config['pass'];
     }
     if (isset($this->config['port'])) {
         $port = (int) $this->config['port'];
     }
     foreach (array('mail', 'host', 'port', 'user', 'pass') as $key) {
         $_key = 'moblog_pop_' . $key;
         if (!empty($this->root->{$_key})) {
             ${$key} = $this->root->{$_key};
         }
     }
     if (!$host || !$user || !$pass || !$port) {
         $this->plugin_moblog_output();
     }
     $ref_option = (string) $this->config['ref'];
     $maxbyte = (int) $this->config['maxbyte'];
     $body_limit = (int) $this->config['body_limit'];
     $refresh_min = (int) $this->config['refresh_min'];
     $nosubject = (string) $this->config['nosubject'];
     $deny = (array) $this->config['deny'];
     $deny_mailer = (string) $this->config['deny_mailer'];
     $deny_title = (string) $this->config['deny_title'];
     $deny_lang = (string) $this->config['deny_lang'];
     $subtype = (string) $this->config['subtype'];
     $viri = (string) $this->config['viri'];
     $del_ereg = (string) $this->config['del_ereg'];
     $word = (array) $this->config['word'];
     $imgonly = (int) $this->config['imgonly'];
     $chk_file = $this->cont['CACHE_DIR'] . "moblog.chk";
     if (!is_file($chk_file)) {
         touch($chk_file);
     } else {
         if ($refresh_min * 60 > $this->cont['UTC'] - filemtime($chk_file) && empty($this->root->vars['now'])) {
             $this->plugin_moblog_output();
         } else {
             $this->func->pkwk_touch_file($chk_file);
         }
     }
     if ($this->config['check_interval']) {
         $interval = max($this->config['check_interval'], $this->config['refresh_min']);
         $data = array('action' => 'plugin_func', 'plugin' => 'moblog', 'func' => 'plugin_moblog_action');
         $this->func->regist_jobstack($data, 0, $interval * 60);
     }
     $this->chk_fp = fopen($chk_file, 'wb');
     if (!flock($this->chk_fp, LOCK_EX)) {
         $this->plugin_moblog_output();
     }
     // user_pref 読み込み
     $adr2page = (array) $this->config['adr2page'];
     $user_pref_all = $this->func->get_user_pref();
     if ($user_pref_all) {
         foreach ($user_pref_all as $_uid => $_dat) {
             $_dat = unserialize($_dat);
             if (!empty($_dat['moblog_base_page'])) {
                 if (!empty($_dat['moblog_mail_address'])) {
                     $adr2page[strtolower($_dat['moblog_mail_address'])] = array($_dat['moblog_base_page'], $_uid);
                 } else {
                     if (!empty($_dat['moblog_user_mail'])) {
                         $adr2page[strtolower($_dat['moblog_user_mail'])] = array($_dat['moblog_base_page'], $_uid);
                     }
                 }
             }
         }
     }
     // SMS(MMS) 経由のデーター読み込み
     if ($smsdata = $this->func->cache_get_db(null, 'moblog')) {
         foreach ($smsdata as $_data) {
             $_data = unserialize($_data);
             $adr2page = array_merge($adr2page, $_data);
         }
     }
     // attach プラグイン読み込み
     $attach = $this->func->get_plugin_instance('attach');
     // wait 指定
     $wait = empty($this->root->vars['wait']) ? 0 : (int) $this->root->vars['wait'];
     sleep(min(5, $wait));
     // 接続開始
     $err = "";
     $num = $size = $errno = 0;
     $this->sock = fsockopen($host, $port, $err, $errno, 10) or $this->plugin_moblog_error_output('Could not connect to ' . $host . ':' . $port);
     $buf = fgets($this->sock, 512);
     if (substr($buf, 0, 3) != '+OK') {
         $this->plugin_moblog_error_output($buf);
     }
     $buf = $this->plugin_moblog_sendcmd("USER {$user}");
     if (substr($buf, 0, 3) != '+OK') {
         $this->plugin_moblog_error_output($buf);
     }
     $buf = $this->plugin_moblog_sendcmd("PASS {$pass}");
     if (substr($buf, 0, 3) != '+OK') {
         $this->plugin_moblog_error_output($buf);
     }
     $data = $this->plugin_moblog_sendcmd("STAT");
     //STAT -件数とサイズ取得 +OK 8 1234
     sscanf($data, '+OK %d %d', $num, $size);
     if ($num == "0") {
         $buf = $this->plugin_moblog_sendcmd("QUIT");
         //バイバイ
         fclose($this->sock);
         $this->debug[] = 'No mail.';
         $this->plugin_moblog_output();
     }
     $this->debug[] = $num . ' message(s) found.';
     $tmpfiles = array();
     // 件数分
     for ($i = 1; $i <= $num; $i++) {
         $line = $this->plugin_moblog_sendcmd("RETR {$i}");
         //RETR n -n番目のメッセージ取得(ヘッダ含
         $dat = '';
         while (!preg_match("/^\\.\r\n/", $line) && $line !== false) {
             //EOFの.まで読む
             $line = fgets($this->sock, 4096);
             $dat .= $line;
         }
         $data = $this->plugin_moblog_sendcmd("DELE {$i}");
         //DELE n n番目のメッセージ削除
         $tmpfname = tempnam($this->cont['CACHE_DIR'], 'moblog');
         file_put_contents($tmpfname, $dat);
         $tmpfiles[] = $tmpfname;
     }
     $buf = $this->plugin_moblog_sendcmd("QUIT");
     //バイバイ
     fclose($this->sock);
     foreach ($tmpfiles as $tmpfname) {
         if ($execution_time) {
             @set_time_limit($execution_time);
         }
         $write = true;
         $subject = $from = $text = $atta = $part = $filename = $charset = '';
         $this->user_pref = array();
         $this->post_options = array();
         $this->is_newpage = 0;
         $filenames = array();
         $body_text = array();
         $rotate = 0;
         $page = '';
         $exifgeo = array();
         $attach_only = false;
         $this->root->vars['refid'] = '';
         unset($this->root->rtf['esummary'], $this->root->rtf['twitter_update']);
         $dat = file_get_contents($tmpfname);
         unlink($tmpfname);
         list($head, $body) = $this->plugin_moblog_mime_split($dat);
         // To:ヘッダ確認
         $treg = array();
         $to_ok = FALSE;
         if (preg_match("/^To:[ \t]*([^\r\n]+)/im", $head, $treg)) {
             $treg[1] = $this->plugin_moblog_addr_search($treg[1]);
             $mail_reg = preg_quote($mail, '/');
             $mail_reg = '/' . str_replace('\\*', '[^@]*?', $mail_reg) . '/i';
             //if ($mail === $treg[1]) {
             if (preg_match($mail_reg, $treg[1])) {
                 $to = $treg[1];
                 $to_ok = TRUE;
             } else {
                 if (preg_match("/^X-Forwarded-To:[ \t]*([^\r\n]+)/im", $head, $treg)) {
                     //if ($mail === $treg[1]) {
                     $treg[1] = $this->plugin_moblog_addr_search($treg[1]);
                     if (preg_match($mail_reg, $treg[1])) {
                         $to = $treg[1];
                         $to_ok = TRUE;
                     }
                 }
             }
         }
         if (!$to_ok) {
             $write = false;
             $this->debug[] = 'Bad To: ' . $to;
         }
         $to = strtolower($to);
         // Received-SPF: のチェック
         if ($this->config['allow_spf']) {
             if (preg_match('/^Received-SPF:\\s*([a-z]+)/im', $head, $match)) {
                 if (!preg_match($this->config['allow_spf'], $match[1])) {
                     $write = false;
                     $this->debug[] = 'Bad SPF.';
                 }
             }
         }
         // メーラーのチェック
         $mreg = array();
         if ($write && preg_match("#^(X-Mailer|X-Mail-Agent):[ \t]*([^\r\n]+)#im", $head, $mreg)) {
             if ($deny_mailer) {
                 if (preg_match($deny_mailer, $mreg[2])) {
                     $write = false;
                     $this->debug[] = 'Bad mailer.';
                 }
             }
         }
         // キャラクターセットのチェック
         if ($write && preg_match('/charset\\s*=\\s*"?([^"\\r\\n]+)/i', $head, $mreg)) {
             $charset = $mreg[1];
             if ($deny_lang) {
                 if (preg_match($deny_lang, $charset)) {
                     $write = false;
                     $this->debug[] = 'Bad charset.';
                 }
             }
         }
         // 日付の抽出
         $datereg = array();
         preg_match("#^Date:[ \t]*([^\r\n]+)#im", $head, $datereg);
         $now = strtotime($datereg[1]);
         if ($now == -1) {
             $now = $this->cont['UTC'];
         }
         // 送信者アドレスの抽出
         $freg = array();
         if (preg_match("#^From:[ \t]*([^\r\n]+)#im", $head, $freg)) {
             $from = $this->plugin_moblog_addr_search($freg[1]);
         } elseif (preg_match("#^Reply-To:[ \t]*([^\r\n]+)#im", $head, $freg)) {
             $from = $this->plugin_moblog_addr_search($freg[1]);
         } elseif (preg_match("#^Return-Path:[ \t]*([^\r\n]+)#im", $head, $freg)) {
             $from = $this->plugin_moblog_addr_search($freg[1]);
         }
         $from = strtolower($from);
         // サブジェクトの抽出
         $subreg = array();
         if (preg_match("#^Subject:[ \t]*([^\r\n]+)#im", $head, $subreg)) {
             if (HypCommonFunc::get_version() >= '20081215') {
                 if (!XC_CLASS_EXISTS('MobilePictogramConverter')) {
                     HypCommonFunc::loadClass('MobilePictogramConverter');
                 }
                 $mpc =& MobilePictogramConverter::factory_common();
             } else {
                 $mpc = null;
             }
             // 改行文字削除
             $subject = str_replace(array("\r", "\n"), "", $subreg[1]);
             $subject = $this->mime_decode($subject, $mpc, $from);
             // ^\*\d+ 認証キー抽出
             $_reg = '/^\\*(\\d+)/i';
             if (preg_match($_reg, $subject, $match)) {
                 $this->post_options['auth_code'] = $match[1];
                 $subject = trim(preg_replace($_reg, '', $subject, 1));
             }
             // ページ指定コマンド検出
             $_reg = '/@&([^&]+)&/';
             if (preg_match($_reg, $subject, $match)) {
                 $page = $match[1];
                 $subject = trim(preg_replace($_reg, '', $subject, 1));
             }
             // ダイレクトページ指定コマンド検出
             $_reg = '/@&([^\\$]+)\\$/';
             if (preg_match($_reg, $subject, $match)) {
                 $page = $match[1];
                 $subject = trim(preg_replace($_reg, '', $subject, 1));
                 $this->post_options['directpage'] = 1;
             }
             // 回転指定コマンド検出
             $_reg = '/@(r|l)\\b/i';
             if (preg_match($_reg, $subject, $match)) {
                 $rotate = strtolower($match[1]) == "r" ? 1 : 3;
                 $subject = trim(preg_replace($_reg, '', $subject, 1));
             }
             $_reg = '/\\b(r|l)@/i';
             // compat for old type
             if (preg_match($_reg, $subject, $match)) {
                 $rotate = strtolower($match[1]) == "r" ? 1 : 3;
                 $subject = trim(preg_replace($_reg, '', $subject, 1));
             }
             // @new 新規ページ指定コマンド検出
             $_reg = '/@new\\b/i';
             if (preg_match($_reg, $subject)) {
                 $this->post_options['new'] = true;
                 $subject = trim(preg_replace($_reg, '', $subject, 1));
             }
             // @p\d+ 対象ページ指定(過去へxページ)コマンド検出
             $_reg = '/@p(\\d+)/i';
             if (preg_match($_reg, $subject, $match)) {
                 $this->post_options['page_past'] = $match[1];
                 $subject = trim(preg_replace($_reg, '', $subject));
             }
             // マップ作成コマンド検出
             $_reg = '/@map\\b/i';
             if (preg_match($_reg, $subject, $match)) {
                 $this->post_options['makemap'] = true;
                 $subject = trim(preg_replace($_reg, '', $subject));
             }
             // タグの抽出
             $_reg = '/#([^#]*)/';
             if (preg_match($_reg, $subject, $match)) {
                 $_tag = trim($match[1]);
                 if ($_tag) {
                     $this->post_options['tag'] = $_tag;
                 }
                 $subject = trim(preg_replace($_reg, '', $subject, 1));
             }
             // 未承諾広告カット
             if ($write && $deny_title) {
                 if (preg_match($deny_title, $subject)) {
                     $write = false;
                     $this->debug[] = 'Bad title.';
                 }
             }
         }
         $today = getdate($now);
         $date = sprintf("/%04d-%02d-%02d-0", $today['year'], $today['mon'], $today['mday']);
         // 拒否アドレス
         if ($write) {
             for ($f = 0; $f < count($deny); $f++) {
                 if (strpos($from, $deny[$f]) !== false) {
                     $write = false;
                     $this->debug[] = 'Bad from addr.';
                 }
             }
         }
         // 登録対象ページを設定
         if ($write) {
             $uid = 0;
             if (!empty($adr2page[$to])) {
                 if (!$page) {
                     $page = is_array($adr2page[$to]) ? $adr2page[$to][0] : $adr2page[$to];
                 }
                 if (is_array($adr2page[$to])) {
                     $uid = $adr2page[$to][1];
                     if (!empty($adr2page[$to][2])) {
                         $attach_only = true;
                         $this->post_options['directpage'] = 1;
                         if (!empty($adr2page[$to][3])) {
                             $this->root->vars['refid'] = $adr2page[$to][3];
                         }
                     }
                 }
             } else {
                 if (!empty($adr2page[$from])) {
                     if (!$page) {
                         $page = is_array($adr2page[$from]) ? $adr2page[$from][0] : $adr2page[$from];
                     }
                     if (is_array($adr2page[$from])) {
                         $uid = $adr2page[$from][1];
                     }
                 } else {
                     if (!$page) {
                         $page = is_array($adr2page['other']) ? $adr2page['other'][0] : $adr2page['other'];
                     }
                 }
             }
             $uid = intval($uid);
             // userinfo を設定
             $this->func->set_userinfo($uid);
             $this->root->userinfo['ucd'] = '';
             $this->root->cookie['name'] = '';
             // pginfo のキャッシュをクリア
             $this->func->get_pginfo($page, '', TRUE);
             if ($page) {
                 $page = $this->get_pagename($page, $uid, $today);
             }
             if ($page) {
                 if (!$this->func->is_pagename($page)) {
                     $write = false;
                     $this->debug[] = '"' . $page . '" is not the WikiName.';
                 } else {
                     if (!$attach_only) {
                         $this->user_pref = $this->func->get_user_pref($uid);
                         if (!empty($this->user_pref['moblog_auth_code'])) {
                             if ($this->user_pref['moblog_auth_code'] != $this->post_options['auth_code']) {
                                 $write = false;
                                 $this->debug[] = 'User auth key dose not mutch.';
                             }
                         }
                     }
                 }
             } else {
                 $write = false;
                 $this->debug[] = 'Allow page not found.' . $page;
             }
         }
         if ($write) {
             // マルチパートならばバウンダリに分割
             if (preg_match("#^Content-type:.*multipart/#im", $head)) {
                 $boureg = array();
                 preg_match('#boundary="([^"]+)"#i', $head, $boureg);
                 $body = str_replace($boureg[1], urlencode($boureg[1]), $body);
                 $part = split("\r\n--" . urlencode($boureg[1]) . "-?-?", $body);
                 $boureg2 = array();
                 if (preg_match('#boundary="([^"]+)"#i', $body, $boureg2)) {
                     //multipart/altanative
                     $body = str_replace($boureg2[1], urlencode($boureg2[1]), $body);
                     $body = preg_replace("#\r\n--" . urlencode($boureg[1]) . "-?-?\r\n#i", "", $body);
                     $part = split("\r\n--" . urlencode($boureg2[1]) . "-?-?", $body);
                 }
             } else {
                 $part[0] = $dat;
                 // 普通のテキストメール
             }
             foreach ($part as $multi) {
                 if (!$write) {
                     break;
                 }
                 @(list($m_head, $m_body) = $this->plugin_moblog_mime_split($multi));
                 if (!$m_body) {
                     continue;
                 }
                 $filename = '';
                 $m_body = preg_replace("/\r\n\\.\r\n\$/", "", $m_body);
                 if (!preg_match("#^Content-type:(.+)\$#im", $m_head, $match)) {
                     continue;
                 }
                 $match = trim($match[1]);
                 list($type, $charset) = array_pad(explode(';', $match), 2, '');
                 if ($charset) {
                     $charset = trim($charset);
                     if (preg_match('/^charset=(.+)$/i', $charset)) {
                         $charset = substr($charset, 8);
                     } else {
                         $charset = '';
                     }
                 }
                 list($main, $sub) = explode('/', trim($type));
                 $sub = strtolower($sub);
                 // 本文をデコード
                 if (strtolower($main) === 'text') {
                     if (!empty($body_text['plain']) && $sub === 'html') {
                         continue;
                     }
                     // キャラクターセットのチェック
                     if ($charset) {
                         if ($deny_lang) {
                             if (preg_match($deny_lang, $charset)) {
                                 $write = false;
                                 $this->debug[] = 'Bad charset.';
                                 break;
                             }
                         }
                     } else {
                         $charset = 'AUTO';
                     }
                     if (preg_match("#^Content-Transfer-Encoding:.*base64#im", $m_head)) {
                         $m_body = base64_decode($m_body);
                     }
                     if (preg_match("#^Content-Transfer-Encoding:.*quoted-printable#im", $m_head)) {
                         $m_body = quoted_printable_decode($m_body);
                     }
                     if (HypCommonFunc::get_version() >= '20081215') {
                         if (!isset($mpc)) {
                             if (!XC_CLASS_EXISTS('MobilePictogramConverter')) {
                                 HypCommonFunc::loadClass('MobilePictogramConverter');
                             }
                             $mpc =& MobilePictogramConverter::factory_common();
                         }
                         $m_body = $mpc->mail2ModKtai($m_body, $from, $charset);
                     }
                     $text = trim(mb_convert_encoding($m_body, $this->cont['SOURCE_ENCODING'], $charset));
                     // 改行文字統一
                     $text = str_replace(array("\r\n", "\r"), array("\n", "\n"), $text);
                     if ($sub === 'html') {
                         $text = str_replace("\n", '', $text);
                         $text = preg_replace('#<br([^>]+)?>#i', "\n", $text);
                         $text = preg_replace('#</?(?:p|tr|table|div)([^>]+)?>#i', "\n\n", $text);
                         $text = strip_tags($text);
                     }
                     // 改行3連続以上を #clear に置換
                     $text = preg_replace("/\n{3,}/", "\n#clear\n", $text);
                     if ($write) {
                         // 電話番号削除
                         //$text = preg_replace("#([[:digit:]]{11})|([[:digit:]\-]{13})#", "", $text);
                         // 下線削除
                         $text = preg_replace('#' . $del_ereg . '#', '', $text);
                         // mac削除
                         $text = preg_replace("#Content-type: multipart/appledouble;[[:space:]]boundary=(.*)#", "", $text);
                         // 広告等削除
                         if (is_array($word)) {
                             foreach ($word as $delstr) {
                                 $text = str_replace($delstr, "", $text);
                             }
                         }
                         if (strlen($text) > $body_limit) {
                             $text = substr($text, 0, $body_limit) . "...";
                         }
                     }
                     // ISBN, ASIN 変換
                     if (!empty($this->config['isbn'])) {
                         $isbn = $this->config['isbn'];
                         $text = preg_replace('/^([A-Za-z0-9]{10}|\\d{13})$/me', 'str_replace(\'__ISBN__\', \'$1\', \'' . $isbn . '\')', $text);
                     }
                     // キーワード@amazon 変換
                     if (!empty($this->config['amazon'])) {
                         $amazon = $this->config['amazon'];
                         $text = preg_replace('/^(.+)@amazon$/mei', 'str_replace(\'__KEYWORD__\', \'$1\', \'' . $amazon . '\')', $text);
                     }
                     $body_text[$sub][] = trim($text);
                 } else {
                     // ファイル名を抽出
                     $filereg = array();
                     if (preg_match("#name=\"?([^\"\n]+)\"?#i", $m_head, $filereg)) {
                         $filename = trim($filereg[1]);
                         $filename = $this->mime_decode($filename);
                     }
                     // 添付データをデコードして保存
                     if (preg_match("#^Content-Transfer-Encoding:.*base64#im", $m_head) && preg_match('#' . $subtype . '#i', $sub)) {
                         $tmp = base64_decode($m_body);
                         //$save_file = $this->cont['CACHE_DIR'].$this->func->encode($filename).".tmp";
                         if (strlen($tmp) < $maxbyte && $write && $attach) {
                             $save_file = tempnam(rtrim($this->cont['UPLOAD_DIR'], '/'), 'moblog');
                             chmod($save_file, 0606);
                             if (file_put_contents($save_file, $tmp, LOCK_EX)) {
                                 //Exif geo
                                 $exifgeo = $this->getExifGeo($save_file);
                                 list($usec) = explode(' ', microtime());
                                 if (!$filename) {
                                     $filename = $this->cont['UTC'] . '_' . $usec . '.' . $sub;
                                 }
                                 //回転指定 or 自動回転($rotate = 0)
                                 HypCommonFunc::rotateImage($save_file, $rotate);
                                 // GPS 情報除去
                                 if ($_size && version_compare(HypCommonFunc::get_version(), '20150515', '>=')) {
                                     if (!empty($this->root->vars['rmgps'])) {
                                         HypCommonFunc::removeExifGps($save_file);
                                     }
                                 }
                                 // ページが無ければ空ページを作成
                                 if (!$this->func->is_page($page)) {
                                     $this->func->make_empty_page($page, false);
                                 }
                                 //$attach = $this->func->get_plugin_instance('attach');
                                 $pass = null;
                                 if (!$uid) {
                                     list($pass) = explode('@', $from);
                                 }
                                 $res = $attach->do_upload($page, $filename, $save_file, false, $pass, true);
                                 if ($res['result']) {
                                     $filenames[] = array('name' => $res['name'], 'exifgeo' => $exifgeo);
                                 } else {
                                     $this->debug[] = $res['msg'];
                                 }
                             } else {
                                 $write = false;
                                 $this->debug[] = 'Can not make temp-file.';
                             }
                         } else {
                             $write = false;
                             $this->debug[] = 'Plugin attach was not found.';
                         }
                     }
                 }
             }
             if ($imgonly && !$filenames) {
                 $write = false;
                 $this->debug[] = 'Attach file was not found.';
             }
             $subject = trim($subject);
         }
         if (!empty($body_text['plain'])) {
             $text = join("\n\n", $body_text['plain']);
         } else {
             if (!empty($body_text['html'])) {
                 $text = join("\n\n", $body_text['html']);
             } else {
                 $text = '';
             }
         }
         // wikiページ書き込み
         if ($write && !$attach_only) {
             $this->plugin_moblog_page_write($page, $subject, $text, $filenames, $ref_option, $now);
         }
     }
     // imgタグ呼び出し
     $this->plugin_moblog_output();
 }