Nucleus(JP)フォーラム

NucleusCMS日本語版ユーザーのためのサポートフォーラムです。疑問が生じたらまずは記事検索をご利用ください。

ログインしていません。

#1 2007-12-09 21:39:01

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

Mocchiです。
再びお世話になります。

Nucleusでは、管理操作履歴にどのユーザがどのアクションをしたかという記録が蓄積されます。
ソースを追いかけてみたら、デフォルトだと以下のアクションが記録されます。

  • 認証用リンクを送信したとき

  • 新しいメンバーが追加されたとき

  • ファイルを見つけられないのでプラグインを読み込むことができなかったとき

  • PHP構造がおかしくてプラグインを読み込むことができなかったとき

  • テーブル接頭辞をサポートしていないためプラグインを読み込むことができなかったとき

  • ログイン成功時

  • ログイン失敗時

  • サニタイズがらみ(あまり追いかけてない)

  • メンバーをブログチームに追加したとき

  • 許可されていないアクションをしたとき

  • actionurlの長さが適切でなかったとき

これに対して、アイテム追加・編集・削除のときや、メンバー編集・削除のときに
管理操作履歴に残るようにしたいと思います。
加えて、管理操作履歴の削除時に、それまでの履歴をテキストファイルあたりで保存したいと思います。
(500件を超えたら250件まで自動的に削除されてしまうようなので)

そんなプラグイン、ご存知のかた、いらっしゃいませんか?

オフライン

#2 2007-12-12 16:56:51

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

Mocchi さんの発言:

これに対して、アイテム追加・編集・削除のときや、メンバー編集・削除のときに
管理操作履歴に残るようにしたいと思います。
加えて、管理操作履歴の削除時に、それまでの履歴をテキストファイルあたりで保存したいと思います。
(500件を超えたら250件まで自動的に削除されてしまうようなので)

そんなプラグイン、ご存知のかた、いらっしゃいませんか?

需要はありそうだから、誰か作っているだろうと本家のプラグインリストやフォーラムを"actionlog"で検索してみましたが、管理操作履歴周辺を拡充するプラグインってないんですね…。
Mocchiさん提案のを含め、管理操作履歴のログ取得の項目のON/OFF(プラグインも含め)ができたりすれば有用そうですけどね wink

すみません、お役に立てず…。


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

#3 2007-12-13 06:19:44

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

藤咲 さんの発言:
Mocchi さんの発言:

そんなプラグイン、ご存知のかた、いらっしゃいませんか?

需要はありそうだから、誰か作っているだろうと本家のプラグインリストやフォーラムを"actionlog"で検索してみましたが、管理操作履歴周辺を拡充するプラグインってないんですね…。

ここはやはり、Mocchi さんが作るに一票。 big_smile

オフライン

#4 2007-12-13 10:14:32

nakahara21
メンバー
From: 尼崎
登録日: 2003-11-14
投稿: 1,298
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

Mocchi さんの発言:

これに対して、アイテム追加・編集・削除のときや、メンバー編集・削除のときに
管理操作履歴に残るようにしたいと思います。
加えて、管理操作履歴の削除時に、それまでの履歴をテキストファイルあたりで保存したいと思います。

前半の部分はとても簡単にプラグイン作れると思いますよ wink
NP_MoblogやNP_TrackBackにactionlog残す動作が含まれているので参考になると思います。

後半の部分は面倒そうですね 8)
でも作り始めたら簡単かも。


nakahara21
http://nakahara21.com/
(ただいま調整中です)

オフライン

#5 2007-12-13 11:55:42

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

nakahara21 さんの発言:

前半の部分はとても簡単にプラグイン作れると思いますよ wink
NP_MoblogやNP_TrackBackにactionlog残す動作が含まれているので参考になると思います。

NP_PostLog
http://kandk.cafe.coocan.jp/nucleus/ind ... itemid=254
も参考になるかと思います。コードも短いですし、見やすいかも。


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

#6 2007-12-13 14:06:26

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

現在進行形で作成中
今から実験開始です
メンバー編集時の通知イベントがないので PostPluginOptionsUpdate で代用してるんで、これが上手くいくかどうかちょっと不安
あと、

加えて、管理操作履歴の削除時に、それまでの履歴をテキストファイルあたりで保存したいと思います。
(500件を超えたら250件まで自動的に削除されてしまうようなので)

こっちはコアに手を入れないと不可能っぽい感じです
ACTIONLOG.phpの80行目と81行目の間に

			global $manager;
			$manager->notify('PreTrimLog', array('timestamp' => $tsChop));

と挿入してやって対応しようとしてます

ていうか、メンバー編集時の通知イベントと、ログ書き込み&短縮時の通知イベント実装キボンヌ

オフライン

#7 2007-12-13 14:45:51

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

みなさんどうもありがとうございます。
私も先日から試作版を作っています。shizukiさんに先を越されてますが。

こっちはコアに手を入れないと不可能っぽい感じです

ファイル書き出しでアイディアをまとめています。
履歴を削除しようがしまいが、それぞれのアクションをファイルに書き出してしまおうと考えました。
Apacheのテキストログと同じアイディア。
メソッドは「addToLogfile()」

 function addToLogfile($level, $message) {
  global $member;
  if ($member && $member->isLoggedIn())
   $user = $member->getDisplayName();
  
  $message = addslashes($message);		// add slashes
  $timestamp = date("Y-m-d H:i:s",time());	// format timestamp
  
  $record = $timestamp . "\t" . $user . "\t" . $message . "\r\n";
  $filename = $this->getDirectory() . 'actionlog.txt';
  
  $actionlog = @fopen( $filename, "ab");
  if ( $actionlog === FALSE ) {
   addToLog('ERROR', 'アクションを保存するためのログファイルが開けませんでした。NP_ActionLogのヘルプを参照して下さい。');
   return;
  }
  if ( @flock( $actionlog, LOCK_EX) == FALSE) {
   addToLog('ERROR', 'アクションを保存するためのログファイルを排他ロックできませんでした。NP_ActionLogのヘルプを参照して下さい。');
   return;
  }
  if ( @fwrite( $actionlog, $record ) === FALSE ){
   addToLog('ERROR', 'アクションをシステムの一時保存領域に書き込めませんでした。NP_ActionLogのヘルプを参照して下さい。');
   return;
  }
  if( @fclose($actionlog) === FALSE) {
   addToLog('ERROR', 'アクションをログファイルに保存できませんでした。NP_ActionLogのヘルプを参照して下さい。');
   return;
  }
 }

メンバー設定、ウェブログ設定、グローバル設定、カテゴリー設定の変更時のイベントがプラグインAPIにないので
藤咲さんご紹介の「NP_PostLog」からアイディアを引っ張ってきて
PostAuthenticationイベントでaction変数が「changemembersettings」「settingsupdate」「blogsettingsupdate」「categoryupdate」だったら
addToLogfile()とaddToLog()を実行するのがいいのかなと思いました。
ついでに「backuprestore」と「backupcreate」もいかがでしょうか。

テキスト書き出しとDB保存と、どっちがいいんだろう???

オフライン

#8 2007-12-13 15:49:33

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

ログの削除の時の挙動がまだはっきりしてませんが、ほぼ完了しました

メンバー設定、ウェブログ設定、グローバル設定、カテゴリー設定の変更時のイベントがプラグインAPIにないので
藤咲さんご紹介の「NP_PostLog」からアイディアを引っ張ってきて
PostAuthenticationイベントでaction変数が「changemembersettings」「settingsupdate」「blogsettingsupdate」「categoryupdate」だったら
addToLogfile()とaddToLog()を実行するのがいいのかなと思いました。
ついでに「backuprestore」と「backupcreate」もいかがでしょうか。

APIのないアクションはこの方法でいくらでも追加できそうですね

テキスト書き出しとDB保存と、どっちがいいんだろう???

一旦データベースに保存しておいて、コアを改造して event_PreTrimLog を追加して250行ずつファイルに書き出す方式で作ってみました
よかったらマージしてやってください

<?php
class NP_ActionlogPlus extends NucleusPlugin {

	function getName()
	{
		return 'NP_ActionlogPlus';
	}

	function getAuthor()
	{
		return 'shizuki';
	}

	function getURL()
	{
		return 'http://japan.nucleuscms.org/bb/viewtopic.php?p=21245#21245';
	}

	function getVersion()
	{
		return '1.0';
	}

	function getDescription()
	{
		return 'View http://japan.nucleuscms.org/bb/viewtopic.php?p=21245#21245';
	}

	function supportsFeature($what)
	{
		switch($what) {
			case 'SqlTablePrefix':
				return 1;
			default:
				return 0;
		}
	}

	function getEventList()
	{
		return array(
			'PostAddItem',
			'PostUpdateItem',
			'PreDeleteItem',
			'PreDeleteMember',
			'PostPluginOptionsUpdate',
			'PreTrimLog',
		);
	}

	function install()
	{
		$this->createOption('additem',  'Log message for AddItem',      'text', 'Add Item(id=<%id%>:title=<%name%>)');
		$this->createOption('edititem', 'Log message for EditItem',     'text', 'Edit Item(id=<%id%>:title=<%name%>)');
		$this->createOption('delitem',  'Log message for DeleteItem',   'text', 'Delete Item(id=<%id%>:title=<%name%>)');
		$this->createOption('editmem',  'Log message for EditItem',     'text', 'Edit Member(id=<%id%>:name=<%name%>)');
		$this->createOption('delmem',   'Log message for DeleteItem',   'text', 'Delete Member(id=<%id%>:name=<%name%>)');

		$this->createMemberOption('memflg', 'MemberFLG', 'text', 'FLG', 'access=hidden');

		global $DIR_MEDIA;
		if (!@file_exists($DIR_MEDIA . 'ActionLog')) mkdir($DIR_MEDIA . 'ActionLog');
	}

	function event_PostPluginOptionsUpdate($data)
	{
		if ($data['context'] != 'member') return;
		$mem = $data['member'];
		$this->addLog(3, $mem->displayname, $mem->id);
	}

	function event_PreDeleteMember($data)
	{
		$mem = $data['member'];
		$this->addLog(4, $mem->displayname, $mem->id);
	}

	function event_PreDeleteItem($data)
	{
		global $manager;
		$item =& $manager->getItem($data['itemid'], 1, 1);
		if (is_object($item)) $item = (array)$item;
		$this->addLog(2, $item['title'], $item['itemid']);
	}

	function event_PostUpdateItem($data)
	{
		global $manager;
		$item =& $manager->getItem($data['itemid'], 1, 1);
		if (is_object($item)) $item = (array)$item;
		$this->addLog(1, $item['title'], $item['itemid']);
	}

	function event_PostAddItem($data)
	{
		global $manager;
		$item =& $manager->getItem($data['itemid'], 1, 1);
		if (is_object($item)) $item = (array)$item;
		$this->addLog(0, $item['title'], $item['itemid']);
	}

	function event_PreTrimLog($data)
	{
		global $DIR_MEDIA;
		$logData = sql_query('SELECT * FROM ' . sql_table('actionlog') . ' WHERE timestamp < "' . $data['timestamp'] . '"');
		$handle  = fopen($DIR_MEDIA . 'ActionLog/' . date('Y-m-d-H-i-s') . '.csv', 'w');
		while ($log = mysql_fetch_assoc($logData)) {
			fwrite($handle, $log['timestamp'] . ',' . $log['message'] . "\n");
		}
	}

	function addLog($type, $name, $id)
	{
		$msg = array(
			$this->getOption('additem'),
			$this->getOption('edititem'),
			$this->getOption('delitem'),
			$this->getOption('editmem'),
			$this->getOption('delmem'),
		);
		ACTIONLOG::add(INFO, TEMPLATE::fill($msg[$type], array('name' => $name, 'id' => $id)));
	}
}

オフライン

#9 2007-12-13 17:28:58

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

Shizukiさん、すごいの一言に尽きます

コアの書き換えはバージョンアップの際に面倒が生じるので、あまりやりたくないというのが本音。
なので、はじめからファイルに書き出しておこうと思います。
(fopen()とかfwrite()とか、DBのクエリを走らせるのと比べて、どちらが時間がかかるんだろう?)

メンバー編集など、イベントがないものに関して
PostAuthenticationイベントでactionを捕まえたものを作ってみようと思います。

しばしお待ち下さい。

オフライン

#10 2007-12-14 03:51:11

Katsumi
メンバー
From: CA
登録日: 2005-06-24
投稿: 637
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

一日の間にここまで進んでいて、びっくりしました。

Mocchi さんの発言:

メンバー編集など、イベントがないものに関して
PostAuthenticationイベントでactionを捕まえたものを作ってみようと思います。

PostAuthenticationイベントは、スキンのパース時にも呼び出されてしまうので、AdminPrePageHead を使ったほうが動作が軽くていいと思います。

オフライン

#11 2007-12-14 09:39:53

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

コアの書き換えはバージョンアップの際に面倒が生じるので、あまりやりたくないというのが本音。

そうなんですよねぇ…
でも、ユーザーに何も告げずにログを勝手に削除してしまう今の仕様はどうかと思うんで、むしろ ACTIONLOG.php で削除するログをファイルに書き出して、『ログを詰めたよっ!』っていうログを残すようにした方がいいなぁと思ったりもします

オフライン

#12 2007-12-14 10:08:44

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

PostAuthenticationイベントは、スキンのパース時にも呼び出されてしまうので、AdminPrePageHead を使ったほうが動作が軽くていいと思います。

わかりました。

でも、ユーザーに何も告げずにログを勝手に削除してしまう今の仕様はどうかと思うんで、むしろ ACTIONLOG.php で削除するログをファイルに書き出して、『ログを詰めたよっ!』っていうログを残すようにした方がいいなぁと思ったりもします

盛り込んでみます。

オフライン

#13 2007-12-17 12:41:30

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

Mocchiです。

管理操作履歴の記録を拡張するプラグイン「NP_ActionLog」のアルファ・バージョンを公開します。
(Plusじゃなくてすみませんshizukiさん。。。名前は変更する可能性があります。)
ご意見・ご感想・バグ報告などありましたら、このフォーラムまでお願いします。
それらを反映の上、近日中に正式版を作成したいと思います。

動作のチェックに集中したかったので、言語ファイルを作らずに、コード内に記述してあります。
そのため、ダウンロード・データはUTF8です。
EUC-JPで利用したい方は、お手数ですがテキストエディタなどでの文字符号化方式の変更をお願いします。

特徴
履歴に残る管理操作履歴を増やします
以下の管理操作の履歴を残します。これらはプラグインのオプションを変更することで、記録したり記録しなかったりできます。

  • メンバー関連(登録・変更・削除)

  • ウェブログ関連(作成・変更・削除)

  • チーム関連(チームへのメンバー追加・削除・管理権限の変更)

  • カテゴリー関連(追加・変更・削除)

  • アイテム関連(追加・変更・削除・移動)

  • 禁止IP関連(登録・削除)

  • プラグイン関連(追加・変更・削除)

履歴をテキストデータに書き出します
履歴が400件に達すると、自動バックアップ機能が作動し、履歴をテキスト・ファイルとして保存します。

  • テキストファイル名は「日付(8桁)-時刻(6桁)-actionlog.txt」となります。

  • 保存先は悩みましたが、プラグインの個別ディレクトリ内です。ディレクトリを準備する必要はありません。なかったらプラグイン側で自動作成します。

問題だなと思う点
[list=]
[*]プラグインオプションを変更しても記録される管理操作がある(Nucleus CMSのコード本体にマージされている)[/*]
[*]バックアップ・データ作成とグローバル設定の変更を記録する仕組みがうまく回らない。(コード中ではコメントアウトしてあります)[/*]
[*] プラグイン・オプションの変更は、管理操作画面で行えるものに限定しています。(ウェブログ・カテゴリ・メンバーそれぞれの設定変更イベントと、プラグイン・オプションの変更イベントが同時発生する。主ではない操作の保存を防ぐために、後者のイベントを除外してある)[/*]
[*] 管理画面からの管理操作履歴の削除は履歴に残るが、削除した履歴を残すことができない。[/*]
[*]一部の管理操作は、記録が重複している。[/*][/list]

オフライン

#14 2007-12-17 14:35:57

shizuki
Administrator
From: 西播磨
登録日: 2006-03-23
投稿: 900
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

保存先は悩みましたが、プラグインの個別ディレクトリ内です。ディレクトリを準備する必要はありません。なかったらプラグイン側で自動作成します。

これはmediaディレクトリにするべきではないでしょうか?
plugins以下にあるディレクトリにo+wを設定するのはちょっと危険な香りがします

オフライン

#15 2007-12-17 15:16:33

藤咲
Administrator
From: 広島
登録日: 2003-11-17
投稿: 1,210
ウェブサイト

Re: 探してます - 管理操作履歴周りのプラグイン

shizuki さんの発言:

これはmediaディレクトリにするべきではないでしょうか?
plugins以下にあるディレクトリにo+wを設定するのはちょっと危険な香りがします

ただ、管理操作履歴にはアカウント名も記録されるでしょうし、総当りで推測できるURLに閲覧できてしまうテキストファイルを置く問題、っていうのもあるかなぁと思います。
パーミッション/.htaccess等でブラウザから直接アクセスできないようにして、過去管理ログについては
ログ一覧表次ページ
20071215-100000-actionlog.txt |表示ボタン| |保存ボタン
20071201-100000-actionlog.txt |表示ボタン| |保存ボタン
20071115-100000-actionlog.txt |表示ボタン| |保存ボタン
というような構成で閲覧・保存ができるようにした方がいいかもしれません。
まぁ日付(8桁)-時刻(6桁)の総当りはそれなりに大変かとは思いますので杞憂かもしれませんが…。


藤咲
備忘録とかもろもろ
http://fjsk.tk/

オフライン

#16 2007-12-18 11:50:43

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

みなさまどうもありがとうございます。

plugins以下にあるディレクトリにo+wを設定するのはちょっと危険な香りがします

ただ、管理操作履歴にはアカウント名も記録されるでしょうし、総当りで推測できるURLに閲覧できてしまうテキストファイルを置く問題、っていうのもあるかなぁと思います。

pluginディレクトリ内のファイル/ディレクトリ操作に対して危険な香りがすけど
mediaディレクトリに入れるべき情報でもないかと。
基本的に、あんまり(というかほとんど)参照しない情報で、オープンにすべきでない情報かなと思います。

通常は閲覧者はおろかユーザもアクセスできないようにしておいて
必要が生じたら(問題発生時)、管理者がFTPクライアントによるアクセスで
ログを取得するという使い方がいいのではないかと考えています。

なので、Beta版でも管理画面を用意することは、今のところ考えていません。
ファイルは出力後、パーミションを「000」に設定して、ブラウザ越しでのアクセスを拒否。
ログの取得はFTPクライアントでパーミションを変更してからダウンロードするのがいいと思ってます。

となると、初心者にはあまり親切ではないプラグインになっちゃうか。。。

もうちょっと考えてみます。
とりあえず、ディレクトリチェックやファイル作成あたりのセキュリティチェックをしないと。

オフライン

#17 2007-12-19 17:03:10

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

Mocchiです。

先日のアルファバージョンに管理画面を加えて、ログのダウンロードがブラウザでできるものを作りました。
ちょっとはやさしいプラグインになったかなと思います。

お試しください。

実はブラウザ越しに閲覧もできるようにしたかったけど、POST送信とJavascript:window.open()が相性悪くて
ポップアップに挫折。。。

お試し版のため、履歴の自動削除は無効にしてありますが、履歴削除の記録は残ります。
400件ではなく4件で動作するようになっています。

オフライン

#18 2007-12-21 11:15:03

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

いくつか補足があるのを忘れてました。

0. お試し版なのでセキュリティのリスクがあると思います(あるかどうかも断言できないけど)。
コーディングするときはセキュリティに配慮していますが、なにぶんちゃんと設計してから作っているわけではないので
セキュリティには不安があります。
その点は以降に公開するベータやRCでちゃんと作りこもうと思います。

1. PostDeleteTeamMemberにおいて、ウェブログから削除されたメンバーのオブジェクトが参照できない。
   →たぶんコアのコードのバグかなと思います。

lib/Admin.phpのdeleteOneTeamMemberメソッド(バージョン3.3なら2328行から)を、以下のように修正します。

2328	  $manager->notify('PostDeleteTeamMember', array('member' => &$tmem, 'blogid' => $blogid));

以下、生コード。行番号はバージョン3.3に基づいてます。

2300	 function deleteOneTeamMember($blogid, $memberid) {
2301	  global $member, $manager;
2302	
2303	  $blogid = intval($blogid);
2304	  $memberid = intval($memberid);
2305	
2306	  // check if allowed
2307	  if (!$member->blogAdminRights($blogid))
2308	   return _ERROR_DISALLOWED;
2309	
2310	  // check if: - there remains at least one blog admin
2311	  //           - (there remains at least one team member)
2312	  $tmem = MEMBER::createFromID($memberid);
2313	
2314	  $manager->notify('PreDeleteTeamMember', array('member' => &$mem, 'blogid' => $blogid));
2315	
2316	  if ($tmem->isBlogAdmin($blogid)) {
2317	   // check if there are more blog members left and at least one admin
2318	   // (check for at least two admins before deletion)
2319	   $query = 'SELECT * FROM '.sql_table('team') . ' WHERE tblog='.$blogid.' and tadmin=1';
2320	   $r = sql_query($query);
2321	   if (mysql_num_rows($r) < 2)
2322	    return _ERROR_ATLEASTONEBLOGADMIN;
2323	  }
2324	
2325	  $query = 'DELETE FROM '.sql_table('team')." WHERE tblog=$blogid and tmember=$memberid";
2326	  sql_query($query);
2327	
2328	  $manager->notify('PostDeleteTeamMember', array('member' => &$mem, 'blogid' => $blogid));
2329	
2330	  return '';
2331	 }

2. ログデータはアクセス権「000」なので、そのままだとFTPクライアントなどでも削除できない。
→FTPクライアントなどでアクセス権を「700」に設定してから削除してください。
ログファイル作成時にパーミションを「700」にするかどうか、検討中です。

3. 通常動作させたいとき

お試し版のため、履歴の自動削除は無効にしてありますが、履歴削除の記録は残ります。
400件ではなく4件で動作するようになっています。

400件でファイル書き出し&ログ消去を試したい方は、NP_ActionLog.phpを以下のように修正してください。

  • 26行目のiMaxSizeを4から400に書き直してください。

  • 308行目のコメントアウトをはずしてください。

それから、もうひとつお尋ねしたいのですが、こういうスレッドって、フォーラムのログインユーザ限定のセクション「日本語化(共同作業と品質テストなど)」に立てるべきでしょうか?
このフォーラムの使い方がいまいちわかっていないので。。。

オフライン

#19 2007-12-27 20:49:29

Mocchi
メンバー
登録日: 2006-11-19
投稿: 438

Re: 探してます - 管理操作履歴周りのプラグイン

ログインユーザ限定の「日本語化(共同作業と品質テストなど)」において、完成した管理操作履歴補完プラグインを公開しました。
みなさまどうもありがとうございました。

NP_ActionLogPlus

オフライン

Board footer