LOGIN ID Password Auto Login Register Now! Lost Password?
XUGJ Forum

グループメンバー変更→新規モジュールインストールでACL情報破壊の可能性

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-10-16 23:48
orrisroot  2nd Class 登録日: 2006-9-5   投稿数: 11
こんにちは.

XCL2.1.5を利用していて,嵌った問題なのですが..

特殊なケースですが,グループメンバー変更と新規モジュールインストールで
インストールしたモジュールのACL(group rigts)情報が壊れる場合が
あるようです.

○再現手順
1.管理者 A でログイン
2.ユーザーモジュール:ユーザーグループ管理 からグループ G を新規作成
3.作成したグループ G に管理者 A をメンバーに加える.
4.一旦ログアウト
5.再度管理者 A でログイン
6.ユーザーモジュール:ユーザーグループ管理 でグループ G を削除
7.互換モジュール:モジュールの管理:モジュールのインストール で任意の
  モジュール M を新規インストール(←この時点で誤った情報が登録される)
8.互換モジュール:モジュールの管理:ブロックの管理:ブロックのインストール
  で モジュール M のブロック B をインストールしようとすると....
  Fatal error: Call to a member function get() on a non-object in
  XOOPS_URL/modules/legacy/admin/forms/BlockEditForm.class.php on line 116

となります.

根本的な原因としては,削除したはずのグループ G に所属していた管理者 A のグループ
一覧が削除後も $_SESSION['xoopsUserGroups'] に残っているのが問題で,ページ遷移後
も user/preload/Primary/Primery.class.php の setupUser() あたりで mXoopsUser を
登録し,この情報を元にモジュールインストール時にモジュールの初期アクセス権を設定
してしまうためのようです.

こうなってしまうと,ログアウト,ログインで一旦セッションを切り,該当モジュールを
インストールしなおすか,DBを直接編集するなどして,group_permission の block_read,
module_read の無効なグループ G のエントリを削除してやる必要があります.

# 2.0時代から同じ類の潜在的な問題を抱えていたような..

ちなみに XCL 2.1.6 RC アップデート後に試しても同じでした.

グループのメンバー情報が変更された際,もし,管理者自身の所属するグループに影響が
あれば,$_SESSION['xoopsUserGroups'] をその都度更新できていればよさそうなん
ですがいかがでしょうか?
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-10-17 15:31
orrisroot  2nd Class 登録日: 2006-9-5   投稿数: 11
とりあえず,既に壊れたグループ権限情報を一括で修正するスクリプトを書いてみました.

function fixXoopsGroupPermissions() {
  global $xoopsDB;
  // get invalid group ids
  $table = $xoopsDB->prefix( 'group_permission' );
  $table2 = $xoopsDB->prefix( 'groups' );
  $sql = sprintf( 'SELECT DISTINCT `gperm_groupid` FROM `%s` LEFT JOIN `%s` ON `%s`.`gperm_groupid`=`%s`.`groupid` WHERE `gperm_modid`=1 AND `groupid` IS NULL', $table, $table2, $table, $table2 );
  $result = $xoopsDB->query( $sql );
  if ( ! $result ) {
    return false;
  }
  $gids = array();
  while ( $myrow = $xoopsDB->fetchArray( $result ) ) {
    $gids[] = $myrow['gperm_groupid'];
  }
  $xoopsDB->freeRecordSet( $result );
  // remove all invalid group id entries
  if ( count( $gids ) != 0 ) {
    $sql = sprintf( 'DELETE FROM `%s` WHERE `gperm_groupid` IN (%s) AND `gperm_modid`=1', $table, implode( ',', $gids ) );
    $result = $xoopsDB->query( $sql );
    if ( ! $result ) {
      return false;
    }
  }
  return true;
}
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-10-30 0:53
minahito  Lieutenant 登録日: 2006-3-20   投稿数: 394
orrisroot さん、
レスポンス遅れて済みません。

2.1.6 RC2 で対応しました。
また書いていただいたテーブル修復スクリプトも段階アップグレードに同等の動作をするものを仕込ませていただきました。
一応 2.1.5 から 2.1.6 にアップグレかけるときに実行され、問題があれば修正されるはずです。

貴重な情報&スクリプトありがとうございました。
結局これが #1970864 の原因だったのかなぁ……
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-10-31 2:45
orrisroot  2nd Class 登録日: 2006-9-5   投稿数: 11
minahito さん、対応ありがとうございました。

また、mumincacao さん、sf.net へのトラッカー投稿ありがとうございました。

http://sourceforge.net/tracker/index.php?func=detail&aid=2173864&grou...

このスクリプトを自分たちの開発中 module のインストール部に組み込んでしまってたので最悪自分たちのは正常にインストールされるハズとか思ってました。

XCL 根幹側で対応して頂ければ助かります。

# 2.0 互換のために module の方はとりあえず残しておこう...っと
投票数:0 平均点:0.00

  条件検索へ


Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities