Author: bdelacretaz
Date: Wed Sep 10 05:06:48 2008
New Revision: 693808

URL: http://svn.apache.org/viewvc?rev=693808&view=rev
Log:
SLING-646 - restrict valid resource filenames to avoid picking up temporary 
files

Added:
    
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
   (contents, props changed)
      - copied, changed from r693733, 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FolderNameFilter.java
Removed:
    
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FolderNameFilter.java
Modified:
    
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
    
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
    
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolderCreationListener.java
    
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java

Copied: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
 (from r693733, 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FolderNameFilter.java)
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java?p2=incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java&p1=incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FolderNameFilter.java&r1=693733&r2=693808&rev=693808&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/FolderNameFilter.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
 Wed Sep 10 05:06:48 2008
@@ -21,11 +21,11 @@
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
-/** Decide if a folder has a suitable name to be watched */ 
-class FolderNameFilter {
+/** Simple regexp-based filter for folder and file names */ 
+class RegexpFilter {
     private final Pattern pattern;
     
-    FolderNameFilter(String regexp) throws PatternSyntaxException {
+    RegexpFilter(String regexp) throws PatternSyntaxException {
         pattern = Pattern.compile(regexp);
     }
     

Propchange: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL

Propchange: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RegexpFilter.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Modified: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java?rev=693808&r1=693807&r2=693808&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/RepositoryObserver.java
 Wed Sep 10 05:06:48 2008
@@ -44,8 +44,8 @@
 public class RepositoryObserver {
 
     private Set<WatchedFolder> folders;
-    
-    private FolderNameFilter folderNameFilter;
+    private RegexpFilter folderNameFilter;
+    private RegexpFilter filenameFilter;
     
     /** @scr.reference */
     private OsgiController osgiController;
@@ -60,8 +60,9 @@
     /** Default set of root folders to watch */
     public static String[] DEFAULT_ROOTS = {"/libs", "/apps"};
     
-    /** Default regexp for watched folders */
+    /** Default regexp for watched folders and filenames */
     public static final String DEFAULT_FOLDER_NAME_REGEXP = ".*/install$";
+    public static final String DEFAULT_FILENAME_REGEXP = 
"[a-zA-Z0-9].*\\.[a-zA-Z][a-zA-Z][a-zA-Z]?";
     
     /** Scan delay for watched folders */
     private final long scanDelayMsec = 1000L;
@@ -75,7 +76,8 @@
        
        // TODO make this configurable
        final String [] roots = DEFAULT_ROOTS; 
-       folderNameFilter = new FolderNameFilter(DEFAULT_FOLDER_NAME_REGEXP);
+       folderNameFilter = new RegexpFilter(DEFAULT_FOLDER_NAME_REGEXP);
+       filenameFilter = new RegexpFilter(DEFAULT_FILENAME_REGEXP);
        
         // Listen for any new WatchedFolders created after activation
         session = 
repository.loginAdministrative(repository.getDefaultWorkspace());
@@ -135,7 +137,7 @@
                final Set<String> paths = w.getAndClearPaths();
                if(paths != null) {
                        for(String path : paths) {
-                               folders.add(new WatchedFolder(repository, path, 
osgiController, scanDelayMsec));
+                               folders.add(new WatchedFolder(repository, path, 
osgiController, filenameFilter, scanDelayMsec));
                        }
                }
        }
@@ -172,7 +174,7 @@
     void findWatchedFolders(Node n, Set<WatchedFolder> setToUpdate) throws 
RepositoryException 
     {
         if (folderNameFilter.accept(n.getPath())) {
-            setToUpdate.add(new WatchedFolder(repository, n.getPath(), 
osgiController, scanDelayMsec));
+            setToUpdate.add(new WatchedFolder(repository, n.getPath(), 
osgiController, filenameFilter, scanDelayMsec));
         }
         final NodeIterator it = n.getNodes();
         while (it.hasNext()) {

Modified: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java?rev=693808&r1=693807&r2=693808&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolder.java
 Wed Sep 10 05:06:48 2008
@@ -45,6 +45,7 @@
     private final OsgiController controller;
     private long nextScan;
     private final Session session;
+    private final RegexpFilter filenameFilter;
     protected static final Logger log = 
LoggerFactory.getLogger(WatchedFolder.class);
     
     /**
@@ -53,9 +54,11 @@
      */
     private final long scanDelayMsec;
 
-    WatchedFolder(SlingRepository repository, String path, OsgiController 
ctrl, long scanDelayMsec) throws RepositoryException {
+    WatchedFolder(SlingRepository repository, String path, OsgiController 
ctrl, 
+            RegexpFilter filenameFilter, long scanDelayMsec) throws 
RepositoryException {
         this.path = path;
         this.controller = ctrl;
+        this.filenameFilter = filenameFilter;
         this.scanDelayMsec = scanDelayMsec;
         session = 
repository.loginAdministrative(repository.getDefaultWorkspace());
         
@@ -147,8 +150,13 @@
                final FileDataProvider dp = new FileDataProvider(n);
                if(!dp.isFile()) {
                        log.debug("Node {} does not seem to be a file, 
ignored", n.getPath());
+               } else if(!filenameFilter.accept(n.getName())) {
+                   if(log.isDebugEnabled()) {
+                    log.debug("Node " + n.getPath() + " with name " + 
n.getName() + " ignored due to " + filenameFilter);
+                   }
+               } else {
+                   installOrUpdate(n.getPath(), dp.getInputStream(), 
dp.getLastModified());
                }
-               installOrUpdate(n.getPath(), dp.getInputStream(), 
dp.getLastModified());
         }
     }
     

Modified: 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolderCreationListener.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolderCreationListener.java?rev=693808&r1=693807&r2=693808&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolderCreationListener.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/main/java/org/apache/sling/jcr/jcrinstall/jcr/impl/WatchedFolderCreationListener.java
 Wed Sep 10 05:06:48 2008
@@ -34,10 +34,10 @@
  */
 class WatchedFolderCreationListener implements EventListener {
     protected final Logger log = LoggerFactory.getLogger(this.getClass());
-    private final FolderNameFilter folderNameFilter;
+    private final RegexpFilter folderNameFilter;
     private Set<String> paths = new HashSet<String>();
     
-    WatchedFolderCreationListener(FolderNameFilter fnf) {
+    WatchedFolderCreationListener(RegexpFilter fnf) {
        folderNameFilter = fnf;
        }
     

Modified: 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java?rev=693808&r1=693807&r2=693808&view=diff
==============================================================================
--- 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
 (original)
+++ 
incubator/sling/trunk/extensions/jcrinstall/src/test/java/org/apache/sling/jcr/jcrinstall/jcr/impl/ResourceDetectionTest.java
 Wed Sep 10 05:06:48 2008
@@ -169,6 +169,49 @@
         mockery.assertIsSatisfied();
     }
     
+    public void testIgnoredFilenames() throws Exception {
+        contentHelper.setupContent();
+        
+        final String [] resources = {
+                "/libs/foo/bar/install/dummy.jar",
+                "/libs/foo/bar/install/dummy.cfg",
+                "/libs/foo/bar/install/dummy.dp"
+        };
+        
+        final String [] ignored  = {
+                "/libs/foo/bar/install/_dummy.jar",
+                "/libs/foo/bar/install/.dummy.cfg",
+                "/libs/foo/bar/install/dummy.longextension"
+        };
+        
+        final InputStream data = new ByteArrayInputStream("hello".getBytes());
+        final long lastModifiedA = System.currentTimeMillis();
+        final Set<String> installedUri = new HashSet<String>();
+        final OsgiController c = mockery.mock(OsgiController.class);
+        
+        mockery.checking(new Expectations() {{
+            allowing(c).getInstalledUris(); will(returnValue(installedUri));
+            allowing(c).getLastModified(with(any(String.class))); 
will(returnValue(-1L)); 
+            one(c).installOrUpdate(with(equal(resources[0])), 
with(equal(lastModifiedA)), with(any(InputStream.class)));
+            one(c).installOrUpdate(with(equal(resources[1])), 
with(equal(lastModifiedA)), with(any(InputStream.class)));
+            one(c).installOrUpdate(with(equal(resources[2])), 
with(equal(lastModifiedA)), with(any(InputStream.class)));
+        }});
+        
+        final RepositoryObserver ro = 
MiscHelper.createRepositoryObserver(repo, c);
+        ro.activate(null);
+        
+        for(String file : resources) {
+            contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+        }
+        for(String file : ignored) {
+            contentHelper.createOrUpdateFile(file, data, lastModifiedA);
+        }
+        eventHelper.waitForEvents(5000L);
+        
+        ro.runOneCycle();
+        mockery.assertIsSatisfied();
+   }
+    
     public void testInitialDeletions() throws Exception {
         contentHelper.setupContent();
         


Reply via email to