Jive筆記8--查詢的Bug (轉)

amyz發表於2007-08-15
Jive筆記8--查詢的Bug (轉)[@more@] 重現
(1)建立一個 Forum,everyOne 可讀
(2)建立一個Hidden Category,其下建立一個Forum,命名為Forum(2)
(3)建立第三個Category,其下建立一個Forum(3)均為可讀。

隨意在各個Forum填寫資料,Rebuild Index.

進入search.
選中Forum(3),填入Forum(2)中某個message的內容中某些單詞,Search,查詢結果出來,呵呵。Forum(2)赫然在返回的結果中。

正確的結果應該是:這裡選擇了Forum(3),也就是在forum(3)中查詢,那麼應該是隻允許返回Forum(3)下的結果(地球人都知道)。


原因分析
看Query.:executeQuery()的程式碼:

// Forum filter -- we can ignore filtering if we are searching all // forums in the system. if (forums.length != 0 && factory.getForumCount() != forums.length) { String[] forumIDs = new String[forums.length]; for (int j=0; jnew FieldFilter("forumID", forumIDs)); filterCount++; }



問題就在這個sb的if()判斷!!

這裡牽涉到ForumFactory.createQuery()裡面的一段程式碼

public Query createQuery() { // Special implementation of this method so that we can detene the // actual list of forums that the user has permissions to search over. ArrayList forumList = new ArrayList(); for (Iterator iter = forums(); iter.hasNext(); ) { forumList.add(iter.next()); } Forum [] forums = new Forum[forumList.size()]; for (int i=0; ireturn createQuery(forums); }


從這段程式碼可以看到,獲得了可訪問的forums,傳遞給DBQuery。
這樣似乎可以限制使用者在其可訪問的forums中搜尋。
所以有了DBQuery::executeQuery()中的哪個if(判斷),意思是:如果傳入的forums和(DBForumFactory)factory.getForumCount()相同,則認為查詢所有Forums,不做判斷。否則,是在某幾個forum中查詢。

上面的邏輯很對,,但是加了Category以後就出問題了。

首先,為了相容factory.getForums(),factory.getForumCount()都是了RootForumCategory的方法,也就是說,只返回了root forum.

你發現問題了麼?

沒錯,按照上面的判斷,我選擇了forum(2),此時有1個rootForum,顯然if(factory.getForumCount() != forums.length)這樣的判斷是不成立的。所以“在forum(2)中查詢這個條件”這個條件就被忽略了。於是,返回了不應該出現的查詢結果。


究其根本的原因有2個,(1)jive2.5後來加入的Category以後同時為了保證相容,而帶來的問題;(2)搜尋的控制問題。

順便帶一句,jive官方網站的論壇沒有rootForum.所以,上面的判斷永遠成立。於是這個問題就被“隱藏起來”了。

解決辦法
自己想!!!

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章