トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BugTrack-plugin/427

ページの作成や編集にはユーザ登録が必要です。

外部サイトの場合誘導するもの

  • 投稿者: guests
  • カテゴリ: 新規
  • 優先度: 低
  • 状態: 提案
  • 日時: 2015年10月11日 14時48分26秒

 内容

本体に変更が入るので3.6.4以降の修正内容を記載します。それ以前のものは分かりません。ドメイン取得していない場合を考慮した対応とします。ドメインでしか動かさない人は簡単な実装に変えてください。

setup.dat に追加

# 内部URL判定用URL
server_inurl = http://ドメイン/ や http://サーバ/アカウント名/ など

# 外部URL警告イメージ名
server_outimege = http://サーバ/アカウント名/フォルダ名/イメージファイル名 など

3.6.4等で基本機能していない環境設定の「スキーム(http://等)が指定されていないリンクは同じウィンドウで開く」をやめて「外部URLの場合、警告を表示する」に変更。機能してるバージョンの人は別途対応など可。

tmpl/admin_config.tmpl

-  <label for="inside_same_window">スキーム(http://等)が指定されていないリンクは同じウィンドウで開く</label>
+  <label for="inside_same_window">外部URLの場合、警告を表示する</label>

本体に修正が入るのでプラグインもcoreにしました。名前を変えて別プラグインにしても可。

plugin/core/Install.pm に追加

+	$wiki->add_handler("OUTURL","plugin::core::OutUrl");

新規作成ファイルOutUrl.pm(76)をplugin/core/に配置します。

/../を使ったURLでの偽装を防ぐため/../が使われた場合は外部URLと見なします。そのためParser.pmで使われている箇所を使わないように修正。ドメインでしか使わない人は変更しなくても可。

lib/Wiki/Parser.pm
sub parse_line {
・・・
				# URIを作成
				my $wiki = $self->{wiki};
				my $uri  = $wiki->config('server_host');
				if ($uri eq q{}) {
					$uri = $wiki->get_CGI()->url(-path_info => 1);
				}
				else {
					$uri
						= $uri
						. $wiki->get_CGI->url(-absolute => 1)
						. $wiki->get_CGI()->path_info();
				}
-				push @parsed, $self->url_anchor($uri . '/../' . $url, $label);
+				if($uri =~ /(\/[^\/]*)$/){
+					$uri = $` . "/";
+				}
+				push @parsed, $self->url_anchor($uri . $url, $label);

HTMLParser.pmのurl_anchor関数を以下のように修正。修正が多いので丸々差し替えてください。

lib/Wiki/HTMLParser.pm
sub url_anchor {
	my $self = shift;
	my $url  = shift;
	my $name = shift;
	
	if($name eq ""){
		$name = $url;
	}
	
	my $serverchk = $self->{wiki}->config('server_inurl');
	my $serverout = "<img src=\"" . $self->{wiki}->config('server_outimege') . "\">";
	my $serverin = 0;
	if($url =~ /^$serverchk/ && !($url =~ /\/\.\.\//)){
		$serverout = "";
		$serverin = 1;
	}
	if($self->{wiki}->config('inside_same_window')==0){
		$serverout = "";
	}
	my $targetsite = "";
	if($self->{wiki}->config('open_new_window')==1){
		$targetsite = " target=\"_blank\"";
	}
	
	if($url eq $name && $url=~/\.(gif|jpg|jpeg|bmp|png)$/i && $self->{'wiki'}->config('display_image')==1){
		return "<img src=\"".$url."\">".$serverout;
	} else {
		if($serverin == 0){
			if($self->{wiki}->config('inside_same_window')==0){
				return "<a href=\"$url\"$targetsite>".Util::escapeHTML($name)."</a>";
			}else{
				return "<a href=\"".$self->{'wiki'}->create_url({action=>"OUTURL",outurl=>$url})."\"$targetsite>".Util::escapeHTML($name)."</a>".$serverout;
			}
		} else {
			return "<a href=\"$url\">".Util::escapeHTML($name)."</a>";
		}
	}
}

/../の修正をしなかった人はHTMLParser.pmの変更部分で以下の修正。

-	if($url =~ /^$serverchk/ && !($url =~ /\/\.\.\//)){
+	if($url =~ /^$serverchk/){

http以外のメールなども外部となりますがそれはそれでいいかと思いそのままです。いやな人は別途対応してください。

あとは環境設定で「外部URLの場合、警告を表示する」をチェックすれば機能します。またsetup.datの# 外部URL警告イメージ名に指定したファイルを置いてください。

外部URLリンクに付加されるイメージファイル例

ライセンス自由です。

 コメント

お名前: コメント:
OutUrl.pm outlink.png 修正箇所HTMLParser.pm.txt 修正箇所Parser.pm.txt

最終更新時間:2015年10月11日 17時06分48秒