AjaXplorer のインストール で Ajaxplorer をインストールしましたが、Windows ではディレクトリの区切りにバックスラッシュ(\)を使用しているため、「..\..\..\..\」などと入力するとルートのフォルダでさえ見ることができてしまいます。

ということで、下記のような感じでバックスラッシュ(\)をスラッシュ(/)に変換するエスケープ処理を1行追加します(ディレクトリトラバーサル対策)。

AjaXplorer/server/classes/class.Utils.php

function securePath($path)
{
	if($path == null) $path = ""; 

	$path = str_replace('\\', '/', $path);

	$dirs = explode('/', $path);
	for ($i = 0; $i < count($dirs); $i++)
	{
		if ($dirs[$i] == '.' or $dirs[$i] == '..')
		{
			$dirs[$i] = '';
		}
	}

	$path = implode('/', $dirs);
	

	while (preg_match('/\/\//', $path)) 
	{
		$path = str_replace('//', '/', $path);
	}
	return $path;
}

前回、AjaXplorer のインストールを行ったので、今回はAjaXplorer で ActiveDirectory を使うための設定を行います。

1.php_ldap.dll を使用しますので、まずは「extension=php_ldap.dll」のコメントを解除します。

2.server/conf/conf.php を修正します。

LDAP認証プラグインを使うように「$AUTH_DRIVER」を変更します(※定義内容は、plugins/auth.ldap/manifest.xml で確認できます)。

$AUTH_DRIVER = array(
	"NAME" => "ldap",
	"OPTIONS" => array(
	"LDAP_URL" => 'LDAP://gine.jp',
	"LDAP_PORT" => '389',
	"LDAP_USER" => 'admin@gine.jp',
	"LDAP_PASSWORD" => 'password',
	"LDAP_DN" => 'OU=Tokyo,DC=gine,DC=jp',
	"LOGIN_REDIRECT" => false,
	"AUTOCREATE_AJXPUSER" => false,
	"LDAP_FILTER" => '(&(objectCategory=Person)(objectClass=User))',
	"TRANSMIT_CLEAR_PASS" => true)
); 
 

※上記例ではパスワードが平文で流れますのでご注意ください。

adminのパスワードを変更するようにダイアログが表示されるので「ADMIN_PASSWORD」も修正しておきます。

define("ADMIN_PASSWORD", "password"); 

 

3.plugins/auth.ldap/class.ldapAuthDriver.php を修正します。修正箇所は3箇所です。

[1] ldap_set_optionを追加します。

    function LDAP_Connect(){
        $ldapconn = ldap_connect($this->ldapUrl, $this->ldapPort)
        or die("Cannot connect to LDAP server");

	    ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
		・・・・・

[2] uid を samaccountname に変更します。

    function listUsers(){
		・・・・・
        foreach($entries as $id => $person){
			$persons[$person['samaccountname'][0]] = "XXX";
        }
		・・・・・
	}

[3] uid を samaccountname に、dn を userprincipalname に変更します。

    function checkPassword($login, $pass, $seed){
        $ret = ldap_search($this->ldapconn,$this->ldapDN,"samaccountname=".$login);

        $entries = ldap_get_entries($this->ldapconn, $ret);
        if ($entries['count']>0) {
            if (@ldap_bind($this->ldapconn,$entries[0]["userprincipalname"][0],$pass)) {
			・・・・・
	}

※samaccountnameやuserprincipalnameは全て小文字の必要があります。

上記で完了です。AjaXplorerにアクセスするとADのユーザーやパスワードを使ってログインできます。

IIS で PHP を使用する

December 24, 2009

環境:IIS7.5 (Windows Server 2008 R2), PHP5.3.1

IIS7.5 で PHP 5.3.x を使用するための設定です。php.ini の修正部分が 5.2.xと少々違っています。

※事前に「Webサーバー(IIS)」の役割サービスであるCGIをインストールする必要があります。

 

■PHPのインストールと設定

1.下記のサイトからWindows Binaries のzip packageをダウンロードします。
http://www.php.net/downloads.php
※今回はVC6 x86 Non Thread Safe 版 の PHP 5.3 (5.3.1) zip package をダウンロードしています。

2.ダウンロードしたファイルを解凍し、「c:\php53」にコピーします。

3.「php.ini-production」 をコピーして 「php.ini」 を作成します。

4.「php.ini」を notepad などで開いて 下記の値を修正します。

extension_dir = "ext"
fastcgi.impersonate = 1
cgi.force_redirect = 0
date.timezone = Asia/Tokyo

※extension に関しては使用するソフトなどに合わせて修正する必要があります。

 

■IISの設定

1.インターネットインフォメーションサービス(IIS)マネージャを起動します。

2.左側の「コンピュータ名」をクリックし、真ん中の「コンピュータ名 ホーム」にある「ハンドラマッピング」をダブルクリックします。

4.右側の「モジュールマップの追加」をクリックします。

5.「モジュールマップの追加」で下記のように「*.php」を登録します。 

001

要求パス *.php
モジュール FastCgiModule
実行可能パス C:\php53\php-cgi.exe
名前 PHP/FastCGI

「OK」をクリックすると、CGIを許可済みにして良いか?とダイアログが表示されるので「はい」をクリックします。

 

■動作確認

1.動作確認のため、「C:\Inetpub\wwwroot」に、以下の内容でtest.phpを作成します。

<?php phpinfo() ?>

2.ブラウザでアクセスすると、下記のような感じになっていればインストール完了です。

002

Server Core(Windows Server 2008 R2) に、PowerShellのServerManagerやWebAdministration用コマンドレットを使用して、IISのインストールと設定、PHPをインストールします。

pkgmgr と AppCmd を使って IIS のインストールや設定する場合は、下記サイトが参考になるかと思います。
http://www.microsoft.com/japan/opensource/php/learning/article3.mspx

 

■PHPのインストール

1.クライアントなどで下記のサイトからWindows Binaries のzip packageをダウンロードします。
http://www.php.net/downloads.php
※今回はPHP 5.2.10 zip package をダウンロードしています。

 

2.ダウンロードしたファイルを解凍し、 Server Core の「c:\php5」にコピーします。
※今回は「c:\php5」にインストールします。

 

3.「php.ini-dist」 をコピーして 「php.ini」 を作成します。

 

4.「php.ini」を notepad などで開いて extension_dir の値を "c:\php5\ext" に変更します。

 

■IISのインストールと設定

1.PowerShell をインストールします。

ServerCore で PowerShell を使う
http://www.gine.jp/blog/taka/post/ServerCore-e381a6-PowerShell-e38292e4bdbfe794a8.aspx

 

2.ServerManager モジュールをインポートします。

サーバー マネージャー用 コマンドレットを使う
http://www.gine.jp/blog/taka/post/e382b5e383bce3838fe383bc-e3839ee3838de383bce382b7e383a3e383bce794a8-e382b3e3839ee383b3e38388e383ace38383e38388e38292e4bdbfe38186.aspx

 

3.IISをインストールします。今回はフルインストールを行っています。

Add-WindowsFeature Web-Server -i

 

4.実行ポリシーが規定だと「Restricted」になっており、スクリプトが実行できないので、スクリプトを実行できるように設定します。

Set-ExecutionPolicy RemoteSigned

 

5.IIS WebAdministration モジュールをインポートします。

import-module WebAdministration

 

6.fastCGIの設定を行います。

Add-WebConfiguration /system.webServer/fastCGI -value @{fullPath="c:\php5\php-cgi.exe"}

 

7.モジュールマップを追加します。

Add-WebConfiguration
 /system.webServer/handlers 
 "IIS:\sites\Default Web Site" 
 -value @{path="*.php";verb="GET,HEAD,POST,DEBUG";name="php";
 modules="FastCgiModule";scriptProcessor="c:\php5\php-cgi.exe"}
※実際のコマンドでは改行は不要です。

 

8.規定のドキュメントに「index.php」を追加しておきます。

Add-WebConfiguration 
 /system.webServer/defaultDocument/files 
 "IIS:\sites\Default Web Site" 
 -value @{value="index.php"}

※実際のコマンドでは改行は不要です。

 

■動作確認

PHPの動作確認のため、「C:\Inetpub\wwwroot」に、以下の内容でtest.phpを作成します。

<?php phpinfo()?>

 

尚、Server CoreにIEはインストールできませんが、Firefoxはインストールできますので、ローカルで確認も可能です。

0001s

ブロックのカスタムテンプレートを作成することにより、インストールされているブロックのデザインなどを変更することができます。今回は、デフォルトでインストールされている「ページリスト」に、日付を追加したカスタムテンプレートを作成します。

早速、作成してみましょう。

1.ページリストブロックフォルダ(/Concrete/concrete/blocks/page_list)の直下に「templates」フォルダを作成します。

2.ページリストのルートにある「view.php」を「templates」フォルダにコピーし「release.php」と名前を変更します。

3.ページタイトルの前に日付を表示したいので、16行目あたりh3タグの中に、日付を取得し表示形式を整える下記のコードを追加します。

<?php echo date( 'Y/m/d',strtotime($cobj->getCollectionDatePublic())) ?>

4.UTF-8で保存します。

 

上記でカスタムテンプレートの準備が完了です。では、適用してみましょう。
※既にページリストが存在している事を前提にしています。

1.編集モードでカスタムテンプレートを使用するブロックをクリックし、カスタムテンプレートを選択します。

 0001a

 

2.カスタムテンプレートで「Release」を選択し、「更新」をクリックします。

0002

 

3.ページタイトルの前に日付が表示されれば成功です。

0003

 

ほとんど修正していませんが、カスタムテンプレートのソースです。

release.php

<?php 
	defined('C5_EXECUTE') or die(_("Access Denied."));
	$textHelper = Loader::helper("text"); 
	// now that we're in the specialized content file for this block type, 
	// we'll include this block type's class, and pass the block to it, and get
	// the content
	
	if (count($cArray) > 0) { ?>
	<div class="ccm-page-list">
	
	<?php 
	for ($i = 0; $i < count($cArray); $i++ ) {
		$cobj = $cArray[$i]; 
		$title = $cobj->getCollectionName(); ?>

	<h3 class="ccm-page-list-title"><?php echo date( 'Y/m/d',strtotime($cobj->getCollectionDatePublic())) ?> <a href="<?php echo $nh->getLinkToCollection($cobj)?>"><?php echo $title?></a></h3>
	<div class="ccm-page-list-description">
		<?php 
		if(!$controller->truncateSummaries){
			echo $cobj->getCollectionDescription();
		}else{
			echo $textHelper->shorten($cobj->getCollectionDescription(),$controller->truncateChars);
		}
		?>
	</div>
	
<?php   } 
	if(!$previewMode && $controller->rss) { 
			$btID = $b->getBlockTypeID();
			$bt = BlockType::getByID($btID);
			$uh = Loader::helper('concrete/urls');
			$rssUrl = $controller->getRssUrl($b);
			?>
			<div class="rssIcon">
				<a href="<?php echo $rssUrl?>" target="_blank"><img src="<?php echo $uh->getBlockTypeAssetsURL($bt, 'rss.png')?>" width="14" height="14" alt="rss" /></a>
				
			</div>
			<link href="<?php echo $rssUrl?>" rel="alternate" type="application/rss+xml" title="<?php echo $controller->rssTitle?>" />
		<?php  
	} 
	?>
</div>
<?php  } 
	
	if ($paginate && $num > 0 && is_object($pl)) {
		$pl->displayPaging();
	}
	
?>