You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by dv...@apache.org on 2015/01/30 10:08:55 UTC
svn commit: r1655967 - in /jspwiki/trunk: ./
jspwiki-war/src/main/java/org/apache/wiki/
jspwiki-war/src/main/java/org/apache/wiki/plugin/
jspwiki-war/src/main/java/org/apache/wiki/search/
jspwiki-war/src/main/webapp/ jspwiki-war/src/main/webapp/templat...
Author: dvittor
Date: Fri Jan 30 09:08:55 2015
New Revision: 1655967
URL: http://svn.apache.org/r1655967
Log:
JSPWIKI-502: and JSPWIKI-760 - Show Wikipages in Search without Authorization
Modified:
jspwiki/trunk/ChangeLog
jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/WikiEngine.java
jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/Search.java
jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchManager.java
jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchProvider.java
jspwiki/trunk/jspwiki-war/src/main/webapp/Search.jsp
jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/AJAXSearch.jsp
jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/search/SearchManagerTest.java
Modified: jspwiki/trunk/ChangeLog
URL: http://svn.apache.org/viewvc/jspwiki/trunk/ChangeLog?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/ChangeLog (original)
+++ jspwiki/trunk/ChangeLog Fri Jan 30 09:08:55 2015
@@ -3,6 +3,8 @@
* 2.10.2-svn-12
* Fixed JSPWIKI-566 - Complete rewrite of AJAX functionality for JSPWiki
+
+ * Fixed JSPWIKI-502 & JSPWIKI-760 - Show Wikipages in Search without Authorization
2015-01-25 David Vittor (dvittor@apache.org)
Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/WikiEngine.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/WikiEngine.java?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/WikiEngine.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/WikiEngine.java Fri Jan 30 09:08:55 2015
@@ -1844,6 +1844,7 @@ public class WikiEngine
* a language of its own.
*
* @param query The query string
+ * @param wikiContext the context within which to run the search
* @return A Collection of SearchResult objects.
* @throws ProviderException If the searching failed
* @throws IOException If the searching failed
@@ -1852,10 +1853,10 @@ public class WikiEngine
//
// FIXME: Should also have attributes attached.
//
- public Collection findPages( String query )
+ public Collection findPages( String query, WikiContext wikiContext )
throws ProviderException, IOException
{
- Collection results = m_searchManager.findPages( query );
+ Collection results = m_searchManager.findPages( query, wikiContext );
return results;
}
Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/Search.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/Search.java?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/Search.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/plugin/Search.java Fri Jan 30 09:08:55 2015
@@ -115,7 +115,7 @@ public class Search implements WikiPlugi
log.debug("Searching for string "+query);
@SuppressWarnings("unchecked")
- Collection<SearchResult> list = context.getEngine().findPages( query );
+ Collection<SearchResult> list = context.getEngine().findPages( query, context );
return list;
}
Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/BasicSearchProvider.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/BasicSearchProvider.java?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/BasicSearchProvider.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/BasicSearchProvider.java Fri Jan 30 09:08:55 2015
@@ -26,11 +26,14 @@ import java.util.StringTokenizer;
import java.util.TreeSet;
import org.apache.log4j.Logger;
+import org.apache.wiki.WikiContext;
import org.apache.wiki.WikiEngine;
import org.apache.wiki.WikiPage;
import org.apache.wiki.api.exceptions.NoRequiredPropertyException;
import org.apache.wiki.api.exceptions.ProviderException;
import org.apache.wiki.attachment.Attachment;
+import org.apache.wiki.auth.AuthorizationManager;
+import org.apache.wiki.auth.permissions.PagePermission;
import org.apache.wiki.providers.WikiPageProvider;
/**
@@ -144,7 +147,7 @@ public class BasicSearchProvider impleme
return "";
}
- private Collection findPages( QueryItem[] query )
+ private Collection findPages( QueryItem[] query, WikiContext wikiContext )
{
TreeSet<SearchResult> res = new TreeSet<SearchResult>( new SearchResultComparator() );
SearchMatcher matcher = new SearchMatcher( m_engine, query );
@@ -160,6 +163,8 @@ public class BasicSearchProvider impleme
return null;
}
+ AuthorizationManager mgr = m_engine.getAuthorizationManager();
+
Iterator it = allPages.iterator();
while( it.hasNext() )
{
@@ -168,6 +173,8 @@ public class BasicSearchProvider impleme
WikiPage page = (WikiPage) it.next();
if (page != null)
{
+ PagePermission pp = new PagePermission( page, PagePermission.VIEW_ACTION );
+ if( mgr.checkPermission( wikiContext.getWikiSession(), pp ) ) {
String pageName = page.getName();
String pageContent = m_engine.getPageManager().getPageText(pageName, WikiPageProvider.LATEST_VERSION) +
attachmentNames(page, " ");
@@ -179,6 +186,7 @@ public class BasicSearchProvider impleme
}
}
}
+ }
catch( ProviderException pe )
{
log.error( "Unable to retrieve page from cache", pe );
@@ -195,9 +203,9 @@ public class BasicSearchProvider impleme
/**
* {@inheritDoc}
*/
- public Collection findPages(String query)
+ public Collection findPages(String query, WikiContext wikiContext)
{
- return findPages(parseQuery(query));
+ return findPages(parseQuery(query), wikiContext);
}
/**
Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/LuceneSearchProvider.java Fri Jan 30 09:08:55 2015
@@ -67,6 +67,7 @@ import org.apache.lucene.util.Version;
import org.apache.wiki.InternalWikiException;
import org.apache.wiki.WatchDog;
import org.apache.wiki.WikiBackgroundThread;
+import org.apache.wiki.WikiContext;
import org.apache.wiki.WikiEngine;
import org.apache.wiki.WikiPage;
import org.apache.wiki.WikiProvider;
@@ -74,6 +75,8 @@ import org.apache.wiki.api.exceptions.No
import org.apache.wiki.api.exceptions.ProviderException;
import org.apache.wiki.attachment.Attachment;
import org.apache.wiki.attachment.AttachmentManager;
+import org.apache.wiki.auth.AuthorizationManager;
+import org.apache.wiki.auth.permissions.PagePermission;
import org.apache.wiki.parser.MarkupParser;
import org.apache.wiki.providers.WikiPageProvider;
import org.apache.wiki.util.ClassUtil;
@@ -590,10 +593,10 @@ public class LuceneSearchProvider implem
/**
* {@inheritDoc}
*/
- public Collection findPages( String query )
+ public Collection findPages( String query, WikiContext wikiContext )
throws ProviderException
{
- return findPages( query, FLAG_CONTEXTS );
+ return findPages( query, FLAG_CONTEXTS, wikiContext );
}
/**
@@ -610,7 +613,7 @@ public class LuceneSearchProvider implem
* @return A Collection of SearchResult instances
* @throws ProviderException if there is a problem with the backend
*/
- public Collection findPages( String query, int flags )
+ public Collection findPages( String query, int flags, WikiContext wikiContext )
throws ProviderException
{
IndexSearcher searcher = null;
@@ -647,6 +650,8 @@ public class LuceneSearchProvider implem
ScoreDoc[] hits = searcher.search(luceneQuery, MAX_SEARCH_HITS).scoreDocs;
+ AuthorizationManager mgr = m_engine.getAuthorizationManager();
+
list = new ArrayList<SearchResult>(hits.length);
for ( int curr = 0; curr < hits.length; curr++ )
{
@@ -663,6 +668,9 @@ public class LuceneSearchProvider implem
// When the search-results are cleaned up this can be enabled again.
}
+ PagePermission pp = new PagePermission( page, PagePermission.VIEW_ACTION );
+ if( mgr.checkPermission( wikiContext.getWikiSession(), pp ) ) {
+
int score = (int)(hits[curr].score * 100);
@@ -681,6 +689,7 @@ public class LuceneSearchProvider implem
SearchResult result = new SearchResultImpl( page, score, fragments );
list.add(result);
}
+ }
else
{
log.error("Lucene found a result page '" + pageName + "' that could not be loaded, removing from Lucene cache");
Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchManager.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchManager.java?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchManager.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchManager.java Fri Jan 30 09:08:55 2015
@@ -51,6 +51,7 @@ import org.apache.wiki.event.WikiEventUt
import org.apache.wiki.event.WikiPageEvent;
import org.apache.wiki.modules.InternalModule;
import org.apache.wiki.parser.MarkupParser;
+import org.apache.wiki.tags.WikiTagBase;
import org.apache.wiki.util.ClassUtil;
import org.apache.wiki.util.TextUtil;
@@ -141,7 +142,11 @@ public class SearchManager extends Basic
} else if (actionName.equals(AJAX_ACTION_PAGES)) {
List<Map<String,Object>> callResults = new ArrayList<Map<String,Object>>();
log.debug("Calling findPages() START");
- callResults = findPages(itemId, maxResults);
+ WikiContext wikiContext = (WikiContext)req.getAttribute( WikiTagBase.ATTR_CONTEXT );
+ if (wikiContext == null) {
+ throw new ServletException("Cannot find wikiContext in the given request "+req);
+ }
+ callResults = findPages(itemId, maxResults, wikiContext);
log.debug("Calling findPages() DONE. "+callResults.size());
result = AjaxUtil.toJson(callResults);
}
@@ -208,7 +213,7 @@ public class SearchManager extends Basic
* @param maxLength How many hits to return
* @return the pages found
*/
- public List<Map<String,Object>> findPages( String searchString, int maxLength )
+ public List<Map<String,Object>> findPages( String searchString, int maxLength, WikiContext wikiContext )
{
StopWatch sw = new StopWatch();
sw.start();
@@ -222,9 +227,9 @@ public class SearchManager extends Basic
Collection c;
if( m_searchProvider instanceof LuceneSearchProvider ) {
- c = ((LuceneSearchProvider)m_searchProvider).findPages( searchString, 0 );
+ c = ((LuceneSearchProvider)m_searchProvider).findPages( searchString, 0, wikiContext );
} else {
- c = m_searchProvider.findPages( searchString );
+ c = m_searchProvider.findPages( searchString, wikiContext );
}
int count = 0;
@@ -348,15 +353,16 @@ public class SearchManager extends Basic
* the query engine wants to use.
*
* @param query The query. Null is safe, and is interpreted as an empty query.
+ * @param wikiContext the context within which to run the search
* @return A collection of WikiPages that matched.
* @throws ProviderException If the provider fails and a search cannot be completed.
* @throws IOException If something else goes wrong.
*/
- public Collection findPages( String query )
+ public Collection findPages( String query, WikiContext wikiContext )
throws ProviderException, IOException
{
if( query == null ) query = "";
- Collection c = m_searchProvider.findPages( query );
+ Collection c = m_searchProvider.findPages( query, wikiContext );
return c;
}
Modified: jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchProvider.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchProvider.java?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchProvider.java (original)
+++ jspwiki/trunk/jspwiki-war/src/main/java/org/apache/wiki/search/SearchProvider.java Fri Jan 30 09:08:55 2015
@@ -21,6 +21,7 @@ package org.apache.wiki.search;
import java.io.IOException;
import java.util.Collection;
+import org.apache.wiki.WikiContext;
import org.apache.wiki.WikiPage;
import org.apache.wiki.WikiProvider;
import org.apache.wiki.api.exceptions.ProviderException;
@@ -50,9 +51,10 @@ public interface SearchProvider extends
/**
* Search for pages matching a search query
* @param query query to search for
+ * @param wikiContext the context within which to run the search
* @return collection of pages that match query
* @throws ProviderException if the search provider failed.
* @throws IOException if for some reason the query could not be executed.
*/
- Collection findPages(String query) throws ProviderException, IOException;
+ Collection findPages(String query, WikiContext wikiContext) throws ProviderException, IOException;
}
Modified: jspwiki/trunk/jspwiki-war/src/main/webapp/Search.jsp
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/webapp/Search.jsp?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/webapp/Search.jsp (original)
+++ jspwiki/trunk/jspwiki-war/src/main/webapp/Search.jsp Fri Jan 30 09:08:55 2015
@@ -50,35 +50,10 @@
try
{
- list = wiki.findPages( query );
+ list = wiki.findPages( query, wikiContext );
- //
- // Filter down to only those that we actually have a permission to view
- //
- AuthorizationManager mgr = wiki.getAuthorizationManager();
-
- ArrayList filteredList = new ArrayList();
-
- for( Iterator i = list.iterator(); i.hasNext(); )
- {
- SearchResult r = (SearchResult)i.next();
-
- WikiPage p = r.getPage();
-
- PagePermission pp = new PagePermission( p, PagePermission.VIEW_ACTION );
-
- try
- {
- if( mgr.checkPermission( wikiContext.getWikiSession(), pp ) )
- {
- filteredList.add( r );
- }
- }
- catch( Exception e ) { log.error( "Searching for page "+p, e ); }
- }
-
pageContext.setAttribute( "searchresults",
- filteredList,
+ list,
PageContext.REQUEST_SCOPE );
}
catch( Exception e )
Modified: jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/AJAXSearch.jsp
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/AJAXSearch.jsp?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/AJAXSearch.jsp (original)
+++ jspwiki/trunk/jspwiki-war/src/main/webapp/templates/default/AJAXSearch.jsp Fri Jan 30 09:08:55 2015
@@ -56,7 +56,7 @@
{
try
{
- Collection list = wiki.findPages( query );
+ Collection list = wiki.findPages( query, wikiContext );
// Filter down to only those that we actually have a permission to view
AuthorizationManager mgr = wiki.getAuthorizationManager();
Modified: jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/search/SearchManagerTest.java
URL: http://svn.apache.org/viewvc/jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/search/SearchManagerTest.java?rev=1655967&r1=1655966&r2=1655967&view=diff
==============================================================================
--- jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/search/SearchManagerTest.java (original)
+++ jspwiki/trunk/jspwiki-war/src/test/java/org/apache/wiki/search/SearchManagerTest.java Fri Jan 30 09:08:55 2015
@@ -74,8 +74,11 @@ public class SearchManagerTest extends T
} else {
break;
}
- res = m_mgr.findPages( text );
+ MockHttpServletRequest request = m_engine.newHttpRequest();
+ WikiContext ctx = m_engine.createContext( request, WikiContext.EDIT );
+ res = m_mgr.findPages( text, ctx );
+
// debugSearchResults( res );
}
return res;
@@ -139,12 +142,12 @@ public class SearchManagerTest extends T
Thread.yield();
Collection res = waitForIndex( "Babylon" , "testSimpleSearch3" ); // wait until 2nd m_engine.saveText() takes effect
- res = m_mgr.findPages( "mankind" ); // check for text present in 1st m_engine.saveText() but not in 2nd
+ res = m_mgr.findPages( "mankind", ctx ); // check for text present in 1st m_engine.saveText() but not in 2nd
assertNotNull( "found results", res );
assertEquals( "empty results", 0, res.size() );
- res = m_mgr.findPages( "Babylon" );
+ res = m_mgr.findPages( "Babylon", ctx );
assertNotNull( "null result", res );
assertEquals( "no pages", 1, res.size() );
@@ -152,6 +155,31 @@ public class SearchManagerTest extends T
m_engine.deleteTestPage("TestPage");
}
+ public void testSimpleSearch4() throws Exception {
+ String txt = "It was the dawn of the third age of mankind, ten years after the Earth-Minbari War.";
+
+ MockHttpServletRequest request = m_engine.newHttpRequest();
+ request.getParameterMap().put( "page", new String[]{ "TestPage" } );
+
+ WikiContext ctx = m_engine.createContext( request, WikiContext.EDIT );
+
+ m_engine.saveText( ctx, txt );
+
+ Thread.yield();
+ Collection res = waitForIndex( "mankind" , "testSimpleSearch4" );
+
+ assertNotNull( "found results", res );
+ assertEquals( "result not found", 1, res.size() );
+
+ m_engine.saveText( ctx, "[{ALLOW view Authenticated}] It was the dawn of the third age of mankind... page is blocked" );
+
+ res = m_mgr.findPages( "mankind" , ctx );
+ assertNotNull( "null result", res );
+ assertEquals( "result found, should be blocked", 0, res.size() );
+
+ m_engine.deleteTestPage("TestPage");
+ }
+
public void testTitleSearch() throws Exception {
String txt = "Nonsensical content that should not match";