示例#1
0
function do_plugin_action($name)
{
    return PluginRenderer::executePluginAction($name);
}
示例#2
0
/**
 * アクションプラグイン処理
 */
function plugin_logview_action()
{
    global $vars, $_logview_msg, $_logview_logname;
    global $sortable_tracker, $_LANG, $vars;
    static $count = 0;
    $kind = isset($vars['kind']) ? $vars['kind'] : null;
    $title = $kind !== null ? sprintf($_logview_msg['msg_title'], $kind) : $_LANG['skin']['log'];
    // タイトルを設定
    $page = isset($vars['page']) ? $vars['page'] : null;
    $ajax = isset($vars['ajax']) ? $vars['ajax'] : null;
    $is_role_adm = Auth::check_role('role_adm');
    // 設定を読む
    $log = Utility::loadConfig('config-log.ini.php');
    // ゲスト表示ができない場合は、認証を要求する
    if ($kind !== null && empty($log[$kind]['guest'])) {
        $obj = new Auth();
        $user = $obj->check_auth();
        if (empty($user)) {
            PluginRenderer::executePluginAction('login');
            unset($obj);
            return array('msg' => $title, 'body' => '<p class="alert-warning">' . $_logview_msg['msg_not_auth'] . '</p>');
        }
    }
    unset($obj);
    if (empty($page)) {
        return array('msg' => 'Page name is missing', 'body' => '<p class="alert-warning">Page name is missing.</p>');
    }
    $wiki = Factory::Wiki($page);
    if (!$wiki->isReadable()) {
        return array('msg' => 'not readable', 'body' => '<p class="alert-warning">You have no permission to read this log.</p>');
    }
    if ($kind === null) {
        if (!IS_MOBILE) {
            $body = '<div class="tabs" role="application">' . "\n";
            $body .= '<ul role="tablist">';
            $cnt = 0;
            foreach ($log as $key => $val) {
                $link_text = isset($_logview_logname[$key]) ? $_logview_logname[$key] : $key;
                if ($val['use'] === 1) {
                    $body .= '<li role="tab"><a href="' . $wiki->uri('logview', array('kind' => $key)) . '">' . $link_text . '</a></li>';
                }
                /*
                				else
                				{
                					$body .= '<li><a href="'.get_cmd_uri('logview',$page,null,array('kind'=>$key)).'" data-ajax="raw" data-disabled="true">'.$link_text.'</a></li>';
                				}
                */
            }
            $body .= '</ul></div>' . "\n";
            if ($kind === null) {
                return array('msg' => $title, 'body' => $body);
            }
            $body .= '<div class="no-js" role="tabpanel">';
            $nodata = $body . '<p>' . $_logview_msg['msg_nodata'] . '</p></div></div>';
        } else {
            $body = '<div data-role="controlgroup" data-type="horizontal">' . "\n";
            $cnt = 0;
            foreach ($log as $key => $val) {
                $link_text = isset($_LANG['skin']['log_' . $key]) ? $_LANG['skin']['log_' . $key] : $key;
                if ($val['use'] === 1) {
                    $body .= '<a href="' . $wiki->uri('logview', array('kind' => $key)) . '" data-role="button">' . $link_text . '</a>';
                }
                /*
                				else
                				{
                					$body .= '<a href="'.get_cmd_uri('logview',$page,null,array('kind'=>$key)).'" data-ajax="raw" data-disabled="true">'.$link_text.'</a>';
                				}
                */
            }
            $body .= '</div>' . "\n" . '<div class="ui-body ui-body-c"></div>';
            if ($kind === null) {
                return array('msg' => $title, 'body' => $body);
            }
        }
    } else {
        $body = '';
    }
    // 保存データの項目名を取得
    $logfile = LogFactory::factory($kind, $page);
    $view = $logfile->get_view_field();
    // 表示したい項目設定
    $count++;
    $body[] = '<div class="table_wrapper">';
    $body[] = '<table class="table table-bordered table_logview" data-pagenate="true">';
    $body[] = '<thead>';
    $body[] = '<tr>';
    $cols = 0;
    // タイトルの処理
    foreach ($view as $_view) {
        if ($_view === 'local_id' && $is_role_adm) {
            continue;
        }
        $body[] = '<th>' . $_logview_msg[$_view] . '</th>';
        $cols++;
    }
    $body[] = '</tr>';
    $body[] = '</thead>';
    $body[] = '<tbody>';
    $nodata = '<p class="alert alert-warning">' . $_logview_msg['msg_nodata'] . '</p>';
    // USER-AGENT クラス
    $obj_ua = new UserAgent(USE_UA_OPTION);
    $guess = $log['guess_user']['use'] ? LogFactory::factory('guess_user')->get() : LogFactory::factory('update', $page)->getSigunature();
    $ctr = 0;
    // データの編集
    $lines = $logfile->get();
    if (!$lines) {
        return array('msg' => $title, 'body' => $nodata);
    }
    foreach ($lines as $data) {
        if (!VIEW_ROBOTS && $obj_ua->is_robots($data['ua'])) {
            continue;
        }
        // ロボットは対象外
        $body[] = '<tr>';
        foreach ($view as $field) {
            switch ($field) {
                case 'ts':
                    // タイムスタンプ (UTIME)
                    $body[] = '<td>' . get_date('Y-m-d H:i:s', $data['ts']) . ' ' . get_passage($data['ts']) . '</td>';
                    break;
                case '@guess_diff':
                case '@diff':
                    // 差分内容
                    $update = $field == '@diff' ? true : false;
                    // FIXME: バックアップ/差分 なしの新規の場合
                    // バックアップデータの確定
                    $body[] = '<td class="style_td">';
                    $age = $logfile->get_backup_age($data['ts'], $update);
                    switch ($age) {
                        case -1:
                            // データなし
                            $body[] = '<a href="' . $wiki->uri() . '" rel="nofollow">none</a>';
                            break;
                        case 0:
                            // diff
                            $body[] = '<a href="' . ($logfile->diff_exist() ? $wiki->uri('diff') : $wiki->uri()) . '" rel="nofollow">now</a>';
                            break;
                        default:
                            // あり
                            $body[] = '<a class="ext" href="' . $wiki->uri('backup', null, array('age' => $age, 'action' => 'visualdiff')) . '" rel="nofollow">' . $age . '</a>';
                            break;
                    }
                    $body[] = '</td>';
                    break;
                case 'host':
                    // ホスト名 (FQDN)
                    $body[] = ' <td>';
                    if ($data['ip'] != $data['host']) {
                        // 国名取得
                        list($flag_icon, $flag_name) = $obj_ua->get_icon_flag($data['host']);
                        if (!empty($flag_icon) && $flag_icon != 'jp') {
                            $body[] = '<span class="flag flag-' . $flag_icon . '" title="' . $flag_name . '" ></span>';
                        }
                        // ドメイン取得
                        $domain = $obj_ua->get_icon_domain($data['host']);
                        if (!empty($domain)) {
                            //						$body .= '<img src="'.$path_domain.$domain.'.png"'.
                            //								' alt="'.$data['host'].'" title="'.$data['host'].'" />';
                            $body[] = '<span class="flag flag-' . $domain . '" title="' . $data['host'] . '" ></span>';
                        }
                    }
                    if ($data['ip'] !== '::1') {
                        $body[] = '<a href="http://robtex.com/ip/' . $data['ip'] . '.html" rel="external nofollow">' . $data['host'] . '</a></td>';
                    } else {
                        $body[] = $data['host'] . '</td>';
                    }
                    break;
                case '@guess':
                    // 推測
                    $body[] = '<td>' . Utility::htmlsc(logview_guess_user($data, $guess), ENT_QUOTES) . '</td>';
                    break;
                case 'ua':
                    // ブラウザ情報 (USER-AGENT)
                    $body[] = ' <td>';
                    $os = $obj_ua->get_icon_os($data['ua']);
                    if (!empty($os)) {
                        $body[] = '<span class="os os-' . $os . '" title="' . $os . '"></span>';
                    }
                    $browser = $obj_ua->get_icon_broeswes($data['ua']);
                    if (!empty($browser)) {
                        $body[] = '<span class="browser browser-' . $browser . '" title="' . Utility::htmlsc($data['ua'], ENT_QUOTES) . '"></span>';
                    }
                    $body[] = '</td>';
                    break;
                case 'local_id':
                    if ($is_role_adm) {
                        continue;
                    }
                default:
                    $body[] = '<td>' . Utility::htmlsc($data[$field], ENT_QUOTES) . '</td>';
            }
        }
        $body[] = '</tr>';
        $ctr++;
    }
    unset($obj_ua);
    if ($ctr == 0) {
        return array('msg' => $title, 'body' => $nodata);
    }
    $body[] = '</tbody>';
    $body[] = '</table>';
    $body[] = '</div>';
    switch ($kind) {
        case 'login':
        case 'check':
            $body .= logview_user_list($fld, $page, $kind);
            break;
    }
    if ($ajax !== 'raw') {
        $body[] = '</div>';
        $body[] = '</div>';
    } else {
        echo join("\n", $body);
        exit;
    }
    return array('msg' => $title, 'body' => join("\n", $body));
}
示例#3
0
 /**
  * QueryStringをパースし、$_GETに上書き
  * @return void
  */
 public static function parseArguments()
 {
     global $cookie, $get, $post, $method;
     global $defaultpage;
     $request = new Request();
     // GET, POST, COOKIE
     $get = $request->getQuery();
     $post = $request->getPost();
     $cookie = $request->getCookie();
     $method = $request->getMethod();
     $vars = array();
     if (strlen($get->toString()) > self::MAX_QUERY_STRING_LENGTH) {
         // Something nasty attack?
         self::dump('suspicious');
         self::dieMessage(_('Query string is too long.'));
     }
     if (count($get) === 0) {
         // Queryがない場合
         $get->set('page', $defaultpage);
     } else {
         if (count($get) === 1 && empty(array_values((array) $get)[0])) {
             // 配列の長さが1で最初の配列に値が存在しない場合はキーをページ名とする。
             $k = trim(array_keys((array) $get)[0]);
             $get->set('page', rawurldecode($_SERVER['QUERY_STRING']));
             unset($get[$k]);
         }
     }
     // 外部からの変数を$vars配列にマージする
     if (empty($post)) {
         $vars = (array) $get;
         // Major pattern: Read-only access via GET
     } else {
         if (empty($get)) {
             $vars = (array) $post;
             // Minor pattern: Write access via POST etc.
         } else {
             $vars = array_merge((array) $get, (array) $post);
             // Considered reliable than $_REQUEST
         }
     }
     //		var_dump($vars);
     //		die;
     if (!isset($vars['cmd'])) {
         $vars['cmd'] = 'read';
     }
     if (isset($vars['page']) && is_string($vars['page']) && preg_match(Wiki::INVALIED_PAGENAME_PATTERN, $vars['page']) === false) {
         // ページ名チェック
         self::dump('suspicious');
         die('Invalid page name.');
     }
     if (is_string($vars['cmd']) && preg_match(PluginRenderer::PLUGIN_NAME_PATTERN, $vars['cmd']) === false) {
         // 入力チェック: cmdの文字列は英数字以外ありえない
         self::dump('suspicious');
         die(sprintf('Plugin name %s is invalied or too long! (less than 64 chars)', $vars['cmd']));
     }
     // 文字コード変換
     // <form> で送信された文字 (ブラウザがエンコードしたデータ) のコードを変換
     // POST method は常に form 経由なので、必ず変換する
     if (isset($vars['encode_hint']) && !empty($vars['encode_hint'])) {
         // do_plugin_xxx() の中で、<form> に encode_hint を仕込んでいるので、
         // encode_hint を用いてコード検出する。
         // 全体を見てコード検出すると、機種依存文字や、妙なバイナリ
         // コードが混入した場合に、コード検出に失敗する恐れがある。
         $encode = mb_detect_encoding($vars['encode_hint']);
         mb_convert_variables(SOURCE_ENCODING, $encode, $vars);
     } else {
         // 全部まとめて、自動検出/変換
         mb_convert_variables(SOURCE_ENCODING, 'auto', $vars);
     }
     // 環境変数のチェック
     self::checkEnv($request->getEnv());
     switch ($method) {
         case Request::METHOD_POST:
             self::spamCheck($vars['cmd']);
             break;
         case Request::METHOD_OPTIONS:
         case Request::METHOD_PROPFIND:
         case Request::METHOD_DELETE:
         case 'MOVE':
         case 'COPY':
         case 'PROPPATCH':
         case 'MKCOL':
         case 'LOCK':
         case 'UNLOCK':
             // WebDAV
             $matches = array();
             foreach (self::$ua_dav as $pattern) {
                 if (preg_match('/' . $pattern . '/', $log_ua, $matches)) {
                     PluginRenderer::executePluginAction('dav');
                     exit;
                 }
             }
             break;
     }
     return $vars;
 }
示例#4
0
    $plugin_arg = '';
    if (Auth::is_protect_plugin_action($cmd)) {
        PluginRenderer::executePluginAction($cmd);
        // Location で飛ばないプラグインの場合
        $plugin_arg = $cmd;
    }
    PluginRenderer::executePluginBlock('protect', $plugin_arg);
}
if (!empty($cmd)) {
    if (!PluginRenderer::hasPluginMethod($cmd, 'action')) {
        // プラグインにactionが定義されてない場合
        Utility::dieMessage(sprintf($_string['plugin_not_implemented'], Utility::htmlsc($cmd)), 501);
    } else {
        // プラグインのactionを実行する。
        // 帰り値:array('title', 'body', 'http_code');
        $retvars = PluginRenderer::executePluginAction($cmd);
    }
}
if ($is_protect) {
    // Location で飛ぶようなプラグインの対応のため
    // 上のアクションプラグインの実行後に処理を実施
    PluginRenderer::executePluginBlock('protect');
    die('<var>PLUS_PROTECT_MODE</var> is set.');
}
///////////////////////////////////////
// Page output
$auth_key = Auth::get_user_info();
$base = $defaultpage;
if (!empty($auth_key['home']) && isset($vars['page']) && ($vars['page'] == $defaultpage || $vars['page'] == $auth_key['home'])) {
    // ログイン時のホームページを基準とする(実際はあまり使われてないが)
    $base = $defaultpage = $auth_key['home'];