グローバル下書きブロックを編集時にアクセス拒否

2011年7月28日 at 14:12

---再現環境---
Concrete5のバージョン:5.4.1.1.1
サーバー:Fedora14
ブラウザ:Firefox5(Win7) ※IE等でも再現しました
--------------

表題のバグがありましたのでご報告させていただきます。
※既知の場合申し訳ございません。

■再現手順
1. ダッシュボードの下書きページより、適当なグローバル下書きセットを作成
2. 「1.」で作ったグローバル下書きセット内に、グローバルブロックAを作成
3. 適当なページを編集モードで開く
4. 「2.」で作ったグローバルブロックAを「下書きからペースト」で追加
5. 「4.」でペーストしたグローバルブロックAをクリックして、グローバルブロックAの編集画面を開く
6. 内容を修正してもしなくてもいいのでブロックを保存(更新)する
7. 再度「4.」でペーストしたグローバルブロックAをクリックして、グローバルブロックAの編集画面を開く
8. 「アクセス拒否」と表示される

以上、よろしくお願いします。

Re: グローバル下書きブロックを編集時にアクセス拒否

2011年7月28日 at 16:23
私も、下書き global を編集する時、Mac の Firefox5 で「アクセス拒否」という表示になったことがあります。

一旦閉じてから開き直したら読み込みされたので、たぶんキャッシュのせいだろう、と思って詳しく調査しなかったのですけど。
 

Re: グローバル下書きブロックを編集時にアクセス拒否

2011年7月28日 at 17:29
僕もなったことあります!
1回閉じたら直りましたけど…

確か、名古屋ユーザーグループのサイト構築の時も出てましたけど
誰か覚えてないかな?
 

Re: グローバル下書きブロックを編集時にアクセス拒否

2011年7月28日 at 18:28
現在も調査中なのですが経過報告を。

編集画面で、設置済みのブロックをクリックしたときに表示される
コンテキストメニュー(編集、下書きに保存・・・等が表示されるメニュー)が、
「再現手順」の「5.」の時までは、たとえば以下のようなDIVが作られます。

ccm-block-menu123-45

これが、「7.」のタイミングで、上の123-45とは別に

ccm-block-menu678-90

のような新しいコンテキストメニュー用のDIVが追加で作成されます。
つまり、

ccm-block-menu123-45
ccm-block-menu678-90

の2つが並んで存在する状態になっています。
で、678-90が作成された後は、
同じブロックを編集する際に678-90が参照されるようになり、
123-45が使われなくなります。

※通常678-90は追加で作成されず、123-45がずっと使われます。

で、コンテキストメニューの「編集」のリンク先は、

/index.php/tools/required/edit_block_popup.php?cID=1&bID=1&arHandle=hoge&isGlobal=1&btask=edit

のようになっており、これれのパラメータのうち、
グローバルブロックの場合「isGlobal=1」である必要があるのですが、
123-45の状態だと「isGlobal=1」ですが、
678-90の状態だと「isGlobal=0」になり、
これによってパーミッションエラーが起きているようです。

「アクセス拒否」状態になっても、
isGlobal=1に修正してアクセスすると、「アクセス拒否」は表示されず、
通常のブロック編集画面が開くことから、
上記が原因かと思われます。

取り急ぎご報告まで。
 

【修正コードできました】Re: グローバル下書きブロックを編集時にアクセス拒否

2011年7月28日 at 22:14
一応原因が判明し、対応できました。

原因としては、ブロックの保存後に、
エリア内の編集したブロックをレンダリングしなおす処理が走ってるのですが、
そこに対して以下の誤った情報を送信しているようです。

・編集したのが「グローバルブロックじゃない」($b->bIsGlobal=null)で返ってる
・編集したAreaがそのエリアではなくて、下書きページのエリアIDを返してる

という事っぽかったので、
以下のような修正で対応できました。

ただ、他に影響を与えないかどうかが分かりませんでしたので、
検証のうえ採用してください。

/concrete/tools/edit_block_popup.php
94行目付近の「$bv->renderElement('block_controls', array(」の前あたりに、以下のコードを追加

if($isGlobal && $c->getCollectionID() != $rcID){
$b->bIsGlobal = 1;
$currentAreaHandle = $db->GetOne('SELECT arHandle FROM `CollectionVersionBlocks` WHERE cID = ? AND bID = ? ORDER BY cvID DESC', array($rcID, $b->getBlockID()));
$currentPage = Page::getByID($rcID);
$a = Area::get($currentPage, $currentAreaHandle);
}


ちょっと無理やりな対応になってますので、
もう少しスマートな修正があればご教授ください。
 

Re: グローバル下書きブロックを編集時にアクセス拒否

2011年8月3日 at 3:04
本家では、ちょっと違う症状ですが・・・

http://www.concrete5.org/developers/bugs/5-4-1-1/access-denied-on-global-block-edit/

のスレで上がっています。

記録として・・・ちょっと症状が違うかな〜。