function mobileEmojiConverter($buffer)
{
    require_once DIR_FS_CATALOG . '/includes/classes/MobilePictogramConverter/MobilePictogramConverter.php';
    $mec =& MobilePictogramConverter::factory($buffer, MPC_FROM_FOMA, MPC_FROM_CHARSET_SJIS, MPC_FROM_OPTION_WEB);
    if (is_object($mec) == false) {
        die($mec);
    }
    return $mec->autoConvert();
}
Exemple #2
0
 /**
  * mod_ktai コードをデコード (サブ関数) by nao-pon
  *
  * @param string $match
  * @return string
  */
 function _decodeModKtai($match)
 {
     if ($match[1]) {
         if ($this->to !== 'COMMON' && strtolower(substr($match[1], 0, 9)) === '<textarea') {
             $carrier = '';
             switch ($this->to) {
                 case MPC_TO_FOMA:
                     $carrier = MPC_FROM_FOMA;
                     break;
                 case MPC_TO_EZWEB:
                     $carrier = MPC_FROM_EZWEB;
                     break;
                 case MPC_TO_SOFTBANK:
                     $carrier = MPC_FROM_SOFTBANK;
                     break;
             }
             if ($carrier) {
                 $mpc = MobilePictogramConverter::factory($match[1], $carrier, $this->from_charset, MPC_FROM_OPTION_MODKTAI);
                 return $mpc->autoConvert();
             }
         }
         return $match[0];
     }
     if (isset($match[4])) {
         $emj_table = 'emj2i_table';
         $match[2] = 'i';
         if (!empty($match[5])) {
             switch (strtolower($match[5])) {
                 case 'sb':
                     $emj_table = 'emj2s_table';
                     $match[2] = 's';
                     break;
                 case 'ez':
                     $emj_table = 'e2icon_table';
                     $match[2] = 'e';
                     break;
                 default:
                     $emj_table = 'emj2i_table';
                     $match[2] = 'i';
             }
         }
         if (empty($this->{$emj_table})) {
             require 'map/' . $emj_table . '.php';
         }
         $_table = $this->{$emj_table};
         if (!isset($_table[$match[4]])) {
             return $match[0];
         }
         $match[3] = $match[2] === 'e' ? dechex($_table[$match[4]]) : $_table[$match[4]];
         /*
         	    	if ($this->emj_to === 's') {
         		    	if (empty($this->i2s_table)) {
         		require 'map/i2s_table.php';
             }
             $match[2] = 's';
             $match[3] = dechex($this->i2s_table[hexdec($match[3])]);
         } else if ($this->emj_to === 'e') {
         		    	if (empty($this->i2e_table)) {
         		require 'map/i2e_table.php';
             }
         	            if (empty($this->e2icon_table)) {
         	                require 'map/e2icon_table.php';
         	            }
             $match[2] = 'e';
             $match[3] = dechex($this->e2icon_table[$this->i2e_table[hexdec($match[3])]]);
         }
         */
     }
     $mode = strtolower($match[2]);
     if ($mode === 'v') {
         $mode = 's';
     }
     // ezweb convert to icon number
     $dec = HexDec($match[3]);
     if ($mode === 'e') {
         if (empty($this->e2icon_table)) {
             require 'map/e2icon_table.php';
         }
         $dec = intval(array_search($dec, $this->e2icon_table));
     }
     $_dec = $dec;
     //exists check
     switch ($mode) {
         case 'i':
             $table = $mode . '2e_table';
             break;
         case 's':
             $table = $mode . '2e_table';
             break;
         case 'e':
             $table = $mode . '2s_table';
             break;
     }
     if (empty($this->{$table})) {
         require 'map/' . $table . '.php';
     }
     $table_array =& $this->{$table};
     if (!isset($table_array[$dec])) {
         return $match[0];
     }
     // set convert table
     $table = '';
     switch ($this->to) {
         case MPC_TO_FOMA:
             if ($mode !== 'i') {
                 $table = $mode . '2i_table';
             }
             $decode_func = 'i_options_encode';
             break;
         case MPC_TO_SOFTBANK:
             if ($mode !== 's') {
                 $table = $mode . '2s_table';
             }
             $decode_func = 's_options_encode';
             break;
         case MPC_TO_EZWEB:
             if ($mode !== 'e') {
                 $table = $mode . '2e_table';
             }
             $decode_func = 'e_options_encode';
             break;
         default:
             $decode_func = $mode . '_options_encode';
     }
     // convert
     if ($table) {
         if (empty($this->{$table})) {
             require 'map/' . $table . '.php';
         }
         $table_array =& $this->{$table};
         $dec = isset($table_array[$dec]) ? $table_array[$dec] : FALSE;
     }
     // show image if nonexist
     $_option = '';
     if (!is_numeric($dec)) {
         $dec = $_dec;
         $_option = $this->getOption();
         $this->setOption(MPC_TO_OPTION_IMG);
         $decode_func = $mode . '_options_encode';
     }
     // decode
     $ret = $this->{$decode_func}($dec);
     if ($_option) {
         $this->setOption($_option);
     }
     return $ret;
 }
Exemple #3
0
    function plugin_edit_write()
    {
        $_uname = empty($this->root->vars['uname']) || !empty($this->root->vars['anonymous']) ? $this->root->siteinfo['anonymous'] : $this->root->vars['uname'];
        if ($_uname) {
            if (!empty($this->root->vars['anonymous'])) {
                $this->root->cookie['name'] = $_uname;
            } else {
                // save name to cookie
                $this->func->save_name2cookie($_uname);
            }
        }
        $page = isset($this->root->vars['page']) ? $this->root->vars['page'] : '';
        $add = isset($this->root->vars['add']) ? $this->root->vars['add'] : '';
        $digest = isset($this->root->vars['digest']) ? $this->root->vars['digest'] : '';
        $paraid = isset($this->root->vars['paraid']) ? $this->root->vars['paraid'] : '';
        $original = '';
        $this->root->vars['msg'] = preg_replace($this->cont['PLUGIN_EDIT_FREEZE_REGEX'], '', $this->root->vars['msg']);
        $this->root->vars['msg'] = $this->func->remove_pginfo($this->root->vars['msg']);
        $msg =& $this->root->vars['msg'];
        // Reference
        // Get original data from cache DB.
        if (!empty($this->root->vars['orgkey'])) {
            $original = (string) $this->func->cache_get_db($this->root->vars['orgkey'], 'edit', true);
            $original = $this->func->remove_pginfo($original);
        }
        // ParaEdit
        $hash = '';
        if ($paraid) {
            if (!$original) {
                $original = $this->func->remove_pginfo($this->func->get_source($page, TRUE, TRUE));
            }
            $source = preg_split('/([^\\n]*\\n)/', $original, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
            if ($this->plugin_edit_parts($paraid, $source, $msg) !== FALSE) {
                $fullmsg = join('', $source);
            } else {
                // $this->root->vars['msg']だけがページに書き込まれてしまうのを防ぐ。
                $fullmsg = rtrim($original) . "\n\n" . $msg;
            }
            $msg = $fullmsg;
            $hash = '#' . $paraid;
        }
        // 文末処理
        $msg = rtrim($msg) . "\n";
        // 改行・TAB・スペースのみだったら削除とみなす
        $msg = preg_replace('/^\\s+$/', '', $msg);
        // Page title
        if ($msg && !empty($this->root->post['pgtitle'])) {
            $msg = $this->root->title_setting_string . trim($this->root->post['pgtitle']) . "\n" . $msg;
        }
        $retvars = array();
        // Collision Detection
        $oldpagesrc = $this->func->get_source($page, TRUE, TRUE);
        $oldpagemd5 = $this->func->get_digests($oldpagesrc);
        if ($digest != $oldpagemd5) {
            $this->root->vars['digest'] = $oldpagemd5;
            // Reset
            unset($this->root->vars['paraid']);
            // 更新が衝突したら全文編集に切り替え
            $oldpagesrc = $this->func->remove_pginfo($oldpagesrc);
            list($postdata_input, $auto) = $this->func->do_update_diff($oldpagesrc, $msg, $original);
            $retvars['msg'] = $this->root->_title_collided;
            $retvars['body'] = ($auto ? $this->root->_msg_collided_auto : $this->root->_msg_collided) . "\n";
            $retvars['body'] .= $this->root->do_update_diff_table;
            $retvars['body'] .= $this->func->edit_form($page, $postdata_input, $oldpagemd5, FALSE);
            if (isset($this->root->vars['ajax'])) {
                $this->func->convert_finisher($retvars['body']);
                $body = <<<EOD
<xpwiki>
<content><![CDATA[{$retvars['body']}]]></content>
<mode>preview</mode>
</xpwiki>
EOD;
                $this->func->send_xml($body);
            }
            return $retvars;
        }
        // Action?
        if ($add) {
            // Add
            if (isset($this->root->vars['add_top']) && $this->root->vars['add_top']) {
                $postdata = $msg . "\n\n" . $this->func->get_source($page, TRUE, TRUE);
            } else {
                $postdata = $this->func->get_source($page, TRUE, TRUE) . "\n\n" . $msg;
            }
        } else {
            // Edit or Remove
            $postdata =& $msg;
            // Reference
        }
        // NULL POSTING, OR removing existing page
        if (!$postdata) {
            $this->func->page_write($page, '');
            if ($this->root->trackback) {
                $this->func->tb_delete($page);
            }
            if ($this->root->maxshow_deleted && $this->func->is_page($this->root->whatsdeleted)) {
                $url = $this->func->get_page_uri($this->root->whatsdeleted, true);
            } else {
                $url = $this->cont['HOME_URL'];
            }
            $title = str_replace('$1', $this->func->htmlspecialchars($page), $this->root->_title_deleted);
            if (isset($this->root->vars['ajax'])) {
                $url = $this->func->htmlspecialchars($url, ENT_QUOTES);
                $body = <<<EOD
<xpwiki>
<content><![CDATA[{$title}]]></content>
<mode>delete</mode>
<url>{$url}</url>
</xpwiki>
EOD;
                $this->func->send_xml($body);
            }
            $this->func->redirect_header($url, 1, $title);
        }
        // $notimeupdate: Checkbox 'Do not change timestamp'
        $notimestamp = isset($this->root->vars['notimestamp']) && $this->root->vars['notimestamp'] != '';
        if ($this->root->notimeupdate > 1 && !$this->root->userinfo['admin']) {
            $notimestamp = false;
        }
        $this->func->page_write($page, $postdata, $this->root->notimeupdate != 0 && $notimestamp);
        if (isset($this->root->vars['ajax'])) {
            if (!empty($this->root->vars['nonconvert'])) {
                $body = '';
            } else {
                $obj = new XpWiki($this->root->mydirname);
                $obj->init($page);
                $obj->root->userinfo['uname_s'] = $this->func->htmlspecialchars($this->root->cookie['name']);
                $obj->execute();
                if (isset($obj->root->rtf['useJavascriptInHead'])) {
                    $body = '<script src="" />';
                } else {
                    $body = $obj->body;
                    // set target
                    if (isset($this->root->vars['popup'])) {
                        $body = preg_replace('/(<a[^>]+)(href=(?:"|\')[^#])/isS', '$1target="' . (intval($this->root->vars['popup']) === 1 ? '_parent' : $this->func->htmlspecialchars(substr($this->root->vars['popup'], 0, 30))) . '" $2', $body);
                    }
                    $body = str_replace(array('<![CDATA[', ']]>'), '', $body);
                }
                if (preg_match('/\\(\\([eisv]:[0-9a-f]{4}\\)\\)|\\[emj:\\d{1,4}(?::(?:im|ez|sb))?\\]/S', $body)) {
                    if (!XC_CLASS_EXISTS('MobilePictogramConverter')) {
                        HypCommonFunc::loadClass('MobilePictogramConverter');
                    }
                    if (XC_CLASS_EXISTS('MobilePictogramConverter')) {
                        $mpc =& MobilePictogramConverter::factory_common();
                        $mpc->setImagePath($this->cont['ROOT_URL'] . 'images/emoji');
                        $mpc->setString($body, FALSE);
                        $body = $mpc->autoConvertModKtai();
                    }
                }
            }
            $body = <<<EOD
<xpwiki>
<content><![CDATA[{$body}]]></content>
<mode>write</mode>
</xpwiki>
EOD;
            $this->func->send_xml($body);
        }
        $this->func->send_location($page, $hash);
    }
Exemple #4
0
 function catbody()
 {
     $skin_protect_profile = false;
     if ($this->cont['SKIN_NAME'] !== 'default') {
         $skin_protect_profile = !in_array($this->cont['UA_PROFILE'], explode(',', str_replace(' ', '', $this->root->skin_change_profiles)));
         // Check Skin name
         if ($skin_protect_profile || !is_file($this->cont['SKIN_FILE']) || $this->root->runmode === 'xoops_admin') {
             $this->cont['SKIN_NAME'] = 'default';
             $this->cont['SKIN_DIR'] = 'skin/' . $this->cont['SKIN_NAME'] . '/';
             $this->cont['SKIN_FILE'] = $this->cont['DATA_HOME'] . $this->cont['SKIN_DIR'] . 'pukiwiki.skin.php';
         }
     }
     // SKIN select from Cookie or Plugin.
     if ($this->cont['SKIN_CHANGER'] && !$skin_protect_profile && (!empty($this->root->cookie['skin']) || is_string($this->cont['SKIN_CHANGER'])) && in_array($this->cont['UA_PROFILE'], explode(',', str_replace(' ', '', $this->root->skin_change_profiles)))) {
         $this->cont['SKIN_NAME'] = empty($this->root->cookie['skin']) ? $this->cont['SKIN_CHANGER'] : $this->root->cookie['skin'];
         if (preg_match('/^[_0-9a-zA-Z-]+$/', $this->cont['SKIN_NAME'])) {
             if (substr($this->cont['SKIN_NAME'], 0, 3) === "tD-") {
                 //tDiary's theme
                 $theme_name = substr($this->cont['SKIN_NAME'], 3);
                 $theme_css = $this->cont['DATA_HOME'] . $this->cont['TDIARY_DIR'] . $theme_name . '/' . $theme_name . '.css';
                 if (is_file($theme_css)) {
                     $this->cont['SKIN_FILE'] = $this->cont['DATA_HOME'] . $this->cont['TDIARY_DIR'] . 'tdiary.skin.php';
                     $this->cont['TDIARY_THEME'] = $theme_name;
                 }
             } else {
                 //PukiWiki's skin
                 $skindir = "skin/" . $this->cont['SKIN_NAME'] . "/";
                 $skin = $this->cont['DATA_HOME'] . $skindir . 'pukiwiki.skin.php';
                 if (is_file($skin)) {
                     $this->cont['SKIN_DIR'] = $skindir;
                     $this->cont['SKIN_FILE'] = $skin;
                 }
             }
         }
     }
     if ($this->root->viewmode === 'print') {
         if (!empty($this->cont['TDIARY_THEME'])) {
             $skindir = 'skin/tdiary_theme/';
         } else {
             $skindir = 'skin/' . $this->cont['SKIN_NAME'] . '/';
         }
         $skin = $this->cont['DATA_HOME'] . $skindir . 'print.skin.php';
         if (is_file($skin)) {
             $this->cont['SKIN_DIR'] = $skindir;
             $this->cont['SKIN_FILE'] = $skin;
         } else {
             $this->cont['SKIN_DIR'] = 'skin/default/';
             $this->cont['SKIN_FILE'] = $this->root->mytrustdirpath . '/skin/print.skin.php';
         }
     }
     // Set Skin Name for FCKeditor.
     $this->func->add_js_var_head('XpWiki.SkinName["' . $this->root->mydirname . '"]', $this->cont['SKIN_NAME']);
     // catbody
     ob_start();
     $this->func->catbody($this->title, $this->skin_title, $this->body);
     $body = ob_get_contents();
     @ob_end_clean();
     if (!defined('HYP_K_TAI_RENDER') && preg_match('/\\(\\([eisv]:[0-9a-f]{4}\\)\\)|\\[emj:\\d{1,4}(?::(?:im|ez|sb))?\\]/S', $body)) {
         if (!XC_CLASS_EXISTS('MobilePictogramConverter')) {
             HypCommonFunc::loadClass('MobilePictogramConverter');
         }
         if (XC_CLASS_EXISTS('MobilePictogramConverter')) {
             $mpc =& MobilePictogramConverter::factory_common();
             $mpc->setString($body, FALSE);
             if (method_exists($mpc, 'modKtai2textPictMobile') && (defined('HYP_WIZMOBILE_USE') || class_exists('WizMobile'))) {
                 // convert to [emj:xxx]
                 $body = $mpc->modKtai2textPictMobile();
             } else {
                 $mpc->setImagePath($this->cont['ROOT_URL'] . 'images/emoji');
                 $mpc->userAgent = '';
                 // Always IMG output
                 $body = $mpc->autoConvertModKtai();
             }
         }
     }
     $this->html = $body;
     if (!empty($this->root->runmode)) {
         $this->runmode = $this->root->runmode;
     }
     $this->breadcrumbs_array = $this->func->get_breadcrumbs_array($this->page);
     $this->breadcrumbs_array[] = array('name' => preg_replace('#^' . preg_quote(preg_replace('#/[^/]+$#', '', $this->page) . '/', '#') . '#', '', $this->title), 'url' => '');
     return;
 }
Exemple #5
0
 function emojiFilter($str)
 {
     if ($str === '' || strpos($str, '<html') === FALSE) {
         return false;
     }
     if (preg_match('/\\(\\([eisv]:[0-9a-f]{4}\\)\\)|\\[emj:\\d{1,4}(?::(?:im|ez|sb))?\\]/S', $str)) {
         if (!XC_CLASS_EXISTS('MobilePictogramConverter')) {
             HypCommonFunc::loadClass('MobilePictogramConverter');
         }
         $mpc =& MobilePictogramConverter::factory_common();
         $mpc->setImagePath(XOOPS_URL . '/images/emoji');
         $mpc->setString($str, FALSE);
         $str = $mpc->autoConvertModKtai();
         if (!$str) {
             return false;
         }
     }
     $this->changeContentLength = true;
     return $str;
 }
Exemple #6
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;
                                 }
                                 //回転指定
                                 if ($rotate) {
                                     HypCommonFunc::rotateImage($save_file, $rotate);
                                 }
                                 // ページが無ければ空ページを作成
                                 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();
 }
Exemple #7
0
 function &_getMobilePictogramConverter()
 {
     if (!XC_CLASS_EXISTS('MobilePictogramConverter')) {
         HypCommonFunc::loadClass('MobilePictogramConverter');
     }
     $mpc =& MobilePictogramConverter::factory_common();
     $mpc->setImagePath($this->Config_emojiDir);
     $mpc->setFromCharset(strtoupper($this->outputEncode) === 'UTF-8' ? MPC_FROM_CHARSET_UTF8 : MPC_FROM_CHARSET_SJIS);
     $mpc->userAgent = $this->vars['ua']['agent'];
     return $mpc;
 }
Exemple #8
0
 function emoji2img($str)
 {
     static $mpc = null;
     if (preg_match('/\\(\\([eisv]:[0-9a-f]{4}\\)\\)|\\[emj:\\d{1,4}(?::(?:im|ez|sb))?\\]/S', $str)) {
         if (!$mpc) {
             if (!XC_CLASS_EXISTS('MobilePictogramConverter')) {
                 HypCommonFunc::loadClass('MobilePictogramConverter');
             }
             $mpc = MobilePictogramConverter::factory_common();
             $mpc->setImagePath($this->cont['ROOT_URL'] . 'images/emoji');
         }
         $mpc->setString($str, FALSE);
         $mpc->userAgent = '';
         $str = $mpc->autoConvertModKtai();
     }
     return $str;
 }