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";