[jboss-cvs] JBossBlog SVN: r293 - in trunk: resources and 19 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Sat Apr 26 06:11:19 EDT 2008


Author: adamw
Date: 2008-04-26 06:11:18 -0400 (Sat, 26 Apr 2008)
New Revision: 293

Added:
   trunk/src/action/org/jboss/blog/session/security/filtering/FeedsSecurity.java
   trunk/src/action/org/jboss/blog/session/security/tools/
   trunk/src/action/org/jboss/blog/session/security/tools/FeedSecurityTools.java
Removed:
   trunk/src/action/org/jboss/blog/session/cache/CacheManagerJBossCacheImpl.java
Modified:
   trunk/blog.iml
   trunk/resources/META-INF/security.drl
   trunk/resources/WEB-INF/pages.xml
   trunk/resources/messages_en.properties
   trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java
   trunk/src/action/org/jboss/blog/session/feed/dao/AggregatedFeedDao.java
   trunk/src/action/org/jboss/blog/session/feed/dao/FeedDao.java
   trunk/src/action/org/jboss/blog/session/feed/dao/HighlightsFeedDao.java
   trunk/src/action/org/jboss/blog/session/feed/dao/RemoteFeedDao.java
   trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java
   trunk/src/action/org/jboss/blog/session/feed/posts/DatabaseFeedPosts.java
   trunk/src/action/org/jboss/blog/session/group/GroupsServiceImpl.java
   trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java
   trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java
   trunk/src/model/org/jboss/blog/model/Post.java
   trunk/src/model/org/jboss/blog/model/feed/Feed.java
   trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java
   trunk/src/model/org/jboss/blog/model/security/FeedsSecurityRole.java
   trunk/src/services/org/jboss/blog/service/FeedsService.java
   trunk/src/shotoku/org/jboss/blog/session/feed/dao/ShotokuFeedDao.java
   trunk/src/tools/org/jboss/blog/tools/GeneralTools.java
   trunk/view/home.xhtml
   trunk/view/manage/feed_add.xhtml
   trunk/view/manage/feed_edit.xhtml
   trunk/view/manage/feed_mod.xhtml
   trunk/view/manage/feed_propose.xhtml
   trunk/view/manage/index.xhtml
Log:


Modified: trunk/blog.iml
===================================================================
--- trunk/blog.iml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/blog.iml	2008-04-26 10:11:18 UTC (rev 293)
@@ -400,7 +400,9 @@
           <root url="jar://$MODULE_DIR$/lib/hibernate-search.jar!/" />
         </CLASSES>
         <JAVADOC />
-        <SOURCES />
+        <SOURCES>
+          <root url="file://$MODULE_DIR$/../jboss/hibernate/search/src/java" />
+        </SOURCES>
       </library>
     </orderEntry>
     <orderEntry type="module-library">

Modified: trunk/resources/META-INF/security.drl
===================================================================
--- trunk/resources/META-INF/security.drl	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/resources/META-INF/security.drl	2008-04-26 10:11:18 UTC (rev 293)
@@ -26,6 +26,21 @@
   c.grant();
 end;
 
+rule CanViewFeed
+when
+  c: PermissionCheck(name == "feed", action == "view") and
+  (
+    Feed(restricted == false)
+  ) or
+  (
+    Feed(restricted == true) and
+    feed : Feed() and
+    FeedsCombinedRole(role == FeedsSecurityRole.VIEW, id == feed.id)
+  )
+then
+  c.grant();
+end;
+
 rule CanAddFeed
 when
   c: PermissionCheck(name == "feed", action == "add") and

Modified: trunk/resources/WEB-INF/pages.xml
===================================================================
--- trunk/resources/WEB-INF/pages.xml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/resources/WEB-INF/pages.xml	2008-04-26 10:11:18 UTC (rev 293)
@@ -39,6 +39,8 @@
     <page view-id="/view/feed.xhtml">
         <param name="name" converterId="feedConverter" value="#{feedView.feed}" />
         <param name="from" value="#{feedView.from}" />
+
+        <restrict>#{identity.hasPermission('feed', 'view', feedView.feed)}</restrict>
     </page>
 
     <page view-id="/view/post.xhtml">
@@ -48,6 +50,8 @@
                 <param name="name" value="#{postView.post.feed.name}" />
             </redirect>
         </navigation>
+
+        <restrict>#{identity.hasPermission('feed', 'view', postView.post.feed)}</restrict>
     </page>
 
     <!-- Search -->

Modified: trunk/resources/messages_en.properties
===================================================================
--- trunk/resources/messages_en.properties	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/resources/messages_en.properties	2008-04-26 10:11:18 UTC (rev 293)
@@ -161,4 +161,10 @@
 blog.security.user.group.deleted=User {0} deleted from administrators of group {1}.
 
 blog.security.user.feed.added=User {0} added to administrators of feed {1}.
-blog.security.user.feed.deleted=User {0} deleted from administrators of feed {1}.
\ No newline at end of file
+blog.security.user.feed.deleted=User {0} deleted from administrators of feed {1}.
+
+blog.security.user.feedview.added=User {0} added to viewers of feed {1}.
+blog.security.user.feedview.deleted=User {0} deleted from viewers of feed {1}.
+
+blog.security.group.feedview.added=Group {0} added to viewers of feed {1}.
+blog.security.group.feedview.deleted=Group {0} deleted from viewers of feed {1}.
\ No newline at end of file

Deleted: trunk/src/action/org/jboss/blog/session/cache/CacheManagerJBossCacheImpl.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/cache/CacheManagerJBossCacheImpl.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/cache/CacheManagerJBossCacheImpl.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -1,128 +0,0 @@
-package org.jboss.blog.session.cache;
-
-import org.jboss.seam.annotations.In;
-import org.jboss.seam.annotations.Logger;
-import org.jboss.seam.log.Log;
-import org.jboss.cache.aop.PojoCache;
-import org.jboss.cache.Fqn;
-import org.jboss.cache.CacheException;
-import org.jboss.blog.model.feed.RestrictedFeed;
-import org.jboss.blog.model.RestrictedPost;
-import org.jboss.blog.session.xml.content.InMemoryContentResponse;
-
-import java.lang.ref.SoftReference;
-import java.util.List;
-
-/**
- * TODO: fix, doesn't work
- * @author Adam Warski (adam at warski dot org)
- */
-public class CacheManagerJBossCacheImpl implements CacheManager {
-    @In
-    private PojoCache pojoCache;
-
-    @Logger
-    private Log log;
-
-    private final static Fqn BASE_FQN = new Fqn("blog");
-    private final static Object CACHE_MAP_KEY = new Object();
-
-    //
-
-    private <T> T getFromSoftReference(SoftReference<T> reference) {
-        if (reference == null) {
-            return null;
-        }
-
-        return reference.get();
-    }
-
-    private void readPost(RestrictedPost post) {
-        post.getFeed();
-        post.getCategories();
-        post.getEnclosures();
-        post.getImages();
-    }
-
-    private void readPosts(List<? extends RestrictedPost> posts) {
-        for (RestrictedPost post : posts) {
-            readPost(post);
-        }
-    }
-
-    //
-
-    public void evictAll() {
-        try {
-            log.debug("Evicting everything from the cache.");
-            pojoCache.remove(BASE_FQN);
-        } catch (CacheException e) {
-            log.error(e);
-        }
-    }
-
-    //
-
-    private Fqn getFeedPostsFqn(String feedName, int from, int to) {
-        return new Fqn(BASE_FQN, feedName, from, to);
-    }
-
-    public void putFeedPosts(RestrictedFeed feed, List<? extends RestrictedPost> posts, int from, int to) {
-        try {
-            readPosts(posts);
-            
-            log.debug("Putting feed '#0' posts into the cache, from #1 to #2.", feed.getName(), from, to);
-            pojoCache.put(getFeedPostsFqn(feed.getName(), from, to), CACHE_MAP_KEY, 
-                    new SoftReference<List<? extends RestrictedPost>>(posts));
-        } catch (CacheException e) {
-            log.error(e);
-        }
-    }
-
-    public List<? extends RestrictedPost> getFeedPosts(String feedName, int from, int to) {
-        try {
-            //noinspection unchecked
-            List<? extends RestrictedPost> inCache =
-                    getFromSoftReference(((SoftReference<List<? extends RestrictedPost>>) pojoCache.get(
-                    getFeedPostsFqn(feedName, from, to), CACHE_MAP_KEY)));
-            log.debug("Getting feed '#0' posts from the cache, from #1 to #2, result: #3.",
-                    feedName, from, to, inCache);
-            return inCache;
-        } catch (CacheException e) {
-            log.error(e);
-            return null;
-        }
-    }
-
-    //
-
-    private final static Object FEED_XML = new Object();
-
-    private Fqn getFeedXmlFqn(String feedName, String feedType) {
-        return new Fqn(BASE_FQN, FEED_XML, feedName, feedType == null ? null : feedType.toLowerCase());
-    }
-
-    public void putFeedXml(String feedName, String feedType, InMemoryContentResponse xml) {
-        try {
-            log.debug("Putting xml for feed '#0' to the cache, type: #1.", feedName, feedType);
-            pojoCache.put(getFeedXmlFqn(feedName, feedType), CACHE_MAP_KEY,
-                    new SoftReference<InMemoryContentResponse>(xml));
-        } catch (CacheException e) {
-            log.error(e);
-        }
-    }
-
-    public InMemoryContentResponse getFeedXml(String feedName, String feedType) {
-        try {
-            //noinspection unchecked
-            InMemoryContentResponse inCache = getFromSoftReference(((SoftReference<InMemoryContentResponse>)
-                    pojoCache.get(getFeedXmlFqn(feedName, feedType), CACHE_MAP_KEY)));
-            log.debug("Getting xml for feed '#0' from the cache, type: #1, result: #2.",
-                    feedName, feedType, inCache);
-            return inCache;
-        } catch (CacheException e) {
-            log.error(e);
-            return null;
-        }
-    }
-}

Modified: trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/feed/FeedsServiceImpl.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -10,6 +10,8 @@
 import org.jboss.blog.session.feed.type.FeedTypes;
 import org.jboss.blog.session.feed.posts.DatabaseFeedPosts;
 import org.jboss.blog.session.cache.CacheManager;
+import org.jboss.blog.session.security.tools.FeedSecurityTools;
+import org.jboss.blog.session.security.FeedsIdentity;
 import org.jboss.seam.annotations.*;
 import org.jboss.seam.log.Log;
 import org.jboss.seam.ScopeType;
@@ -38,6 +40,9 @@
     @In
     private CacheManager cacheManager;
 
+    @In
+    private FeedsIdentity identity;
+
     @Logger
     private Log log;
 
@@ -72,28 +77,52 @@
     }
 
     public List<? extends RestrictedPost> getPosts(RestrictedFeed feed, int from, int to) {
-        List<? extends RestrictedPost> inCache = cacheManager.getFeedPosts(feed.getName(), from, to);
+        boolean restricted = false;
 
-        if (inCache != null) {
-            return inCache;
-        } else {
-            //noinspection unchecked
-            List<? extends RestrictedPost> posts;
+        // We want to get restricted feeds, if we are logged in, the current feed is restricted and
+        // we have sufficient permissions to view the feed.
+        if (identity.isLoggedIn() && feed.getRestricted() && FeedSecurityTools.canViewFeed(feed, true)) {
+            restricted = true;
+        }
 
-            try {
-                log.debug("Reading feed '#0' posts from the DB, from #1 to #2.", feed.getName(), from, to);
-                posts = feedTypes.getFeedDao(feed).getPosts(from, to);
-            } catch (InvalidFeedTypeException e) {
-                log.error(e);
-                return new ArrayList<RestrictedPost>();
-            }
+        return getPosts(feed, from, to, restricted);
+    }
 
-            if (posts != null) {
-                cacheManager.putFeedPosts(feed, posts, from, to);
+    public List<? extends RestrictedPost> getPosts(RestrictedFeed feed, int from, int to, boolean restricted) {
+        boolean isFeedRestricted = feed.getRestricted();
+
+        // We return an empty list if:
+        // - we don't want restricted posts, but this feed is restricted
+        // - we want restricted posts, this feed is restricted, but we can't view it.
+        if ((!restricted && isFeedRestricted) ||
+                (restricted && isFeedRestricted && !FeedSecurityTools.canViewFeed(feed, restricted))) {
+            return new ArrayList<RestrictedPost>();
+        }
+
+        // We use the cache only if the feed isn't restricted.
+        if (!isFeedRestricted) {
+            List<? extends RestrictedPost> inCache = cacheManager.getFeedPosts(feed.getName(), from, to);
+
+            if (inCache != null) {
+                return inCache;
             }
+        }
 
-            return posts;
+        List<? extends RestrictedPost> posts;
+
+        try {
+            log.debug("Reading feed '#0' posts from the DB, from #1 to #2.", feed.getName(), from, to);
+            posts = feedTypes.getFeedDao(feed).getPosts(from, to, restricted);
+        } catch (InvalidFeedTypeException e) {
+            log.error(e);
+            return new ArrayList<RestrictedPost>();
         }
+
+        if (posts != null && !isFeedRestricted) {
+            cacheManager.putFeedPosts(feed, posts, from, to);
+        }
+
+        return posts;
     }
 
     public List<? extends RestrictedPost> getPosts(int from, int to) {

Modified: trunk/src/action/org/jboss/blog/session/feed/dao/AggregatedFeedDao.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/dao/AggregatedFeedDao.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/feed/dao/AggregatedFeedDao.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -23,9 +23,9 @@
         this.aggregatedFeed = aggregatedFeed;
     }
 
-    public List<? extends RestrictedPost> getPosts(int from, int to) {
+    public List<? extends RestrictedPost> getPosts(int from, int to, boolean restricted) {
         return ((AggregatedFeedPosts) Component.getInstance("aggregatedFeedPosts")).getPosts(
-                aggregatedFeed, from, to);
+                aggregatedFeed, from, to, restricted);
     }
 
     public void update() {

Modified: trunk/src/action/org/jboss/blog/session/feed/dao/FeedDao.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/dao/FeedDao.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/feed/dao/FeedDao.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -9,7 +9,7 @@
  * @author Adam Warski (adam at warski dot org)
  */
 public interface FeedDao {
-    public List<? extends RestrictedPost> getPosts(int from, int to);
+    public List<? extends RestrictedPost> getPosts(int from, int to, boolean restricted);
 
     public void update() throws UpdateException;
 }

Modified: trunk/src/action/org/jboss/blog/session/feed/dao/HighlightsFeedDao.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/dao/HighlightsFeedDao.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/feed/dao/HighlightsFeedDao.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -2,11 +2,14 @@
 
 import org.jboss.blog.model.feed.HighlightsFeed;
 import org.jboss.blog.model.RestrictedPost;
+import org.jboss.blog.model.Post;
 import org.jboss.blog.session.feed.type.FeedType;
 import org.jboss.blog.session.update.UpdateException;
+import org.jboss.blog.session.security.tools.FeedSecurityTools;
 import org.jboss.blog.tools.GeneralTools;
 
 import java.util.List;
+import java.util.ArrayList;
 
 /**
  * @author Adam Warski (adam at warski dot org)
@@ -23,8 +26,17 @@
         this.highlightsFeed = highlightsFeed;
     }
 
-    public List<? extends RestrictedPost> getPosts(int from, int to) {
-        return GeneralTools.subList(highlightsFeed.getSelectedPosts(), from, to);
+    public List<? extends RestrictedPost> getPosts(int from, int to, boolean restricted) {
+        List<Post> posts = GeneralTools.subList(highlightsFeed.getSelectedPosts(), from, to);
+        List<Post> ret = new ArrayList<Post>();
+
+        for (Post post : posts) {
+            if (FeedSecurityTools.canViewFeed(post.getFeed(), restricted)) {
+                ret.add(post);
+            }
+        }
+
+        return ret;
     }
 
     public void update() throws UpdateException {

Modified: trunk/src/action/org/jboss/blog/session/feed/dao/RemoteFeedDao.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/dao/RemoteFeedDao.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/feed/dao/RemoteFeedDao.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -9,6 +9,7 @@
 import org.jboss.seam.Component;
 
 import java.util.List;
+import java.util.ArrayList;
 
 /**
  * @author Adam Warski (adam at warski dot org)
@@ -25,7 +26,7 @@
         this.remoteFeed = remoteFeed;
     }
 
-    public List<? extends RestrictedPost> getPosts(int from, int to) {
+    public List<? extends RestrictedPost> getPosts(int from, int to, boolean restricted) {
         return ((DatabaseFeedPosts) Component.getInstance("databaseFeedPosts")).getPosts(
                 remoteFeed, from, to);
     }

Modified: trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/feed/posts/AggregatedFeedPosts.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -4,11 +4,13 @@
 import org.jboss.blog.model.feed.Feed;
 import org.jboss.blog.model.RestrictedPost;
 import org.jboss.blog.model.Group;
+import org.jboss.blog.model.Post;
 import org.jboss.blog.service.FeedsService;
 import org.jboss.blog.service.GroupsService;
 import org.jboss.blog.tools.GeneralTools;
 import org.jboss.blog.tools.PostFilterTools;
 import org.jboss.blog.model.post.PostFilter;
+import org.jboss.blog.session.security.tools.FeedSecurityTools;
 import org.jboss.seam.ScopeType;
 import org.jboss.seam.annotations.In;
 import org.jboss.seam.annotations.Name;
@@ -32,7 +34,8 @@
     private AggregatedFeedStack aggregatedFeedStack;
 
     @SuppressWarnings("unchecked")
-    public List<? extends RestrictedPost> getPosts(AggregatedFeed aggregatedFeed, int from, int to) {
+    public List<? extends RestrictedPost> getPosts(AggregatedFeed aggregatedFeed, int from, int to,
+                                                   boolean restricted) {
         if (aggregatedFeedStack.contains(aggregatedFeed)) {
             return null;
         }
@@ -67,7 +70,8 @@
             Set<Feed> newAvailableFeeds = new HashSet<Feed>();
 
             for (Feed feed : availableFeeds) {
-                List<? extends RestrictedPost> feedPosts = feedsService.getPosts(feed, feedPostsFrom, feedPostsTo);
+                List<? extends RestrictedPost> feedPosts = feedsService.getPosts(feed, feedPostsFrom, feedPostsTo,
+                        restricted);
 
                 if (feedPosts == null) {
                     continue;

Modified: trunk/src/action/org/jboss/blog/session/feed/posts/DatabaseFeedPosts.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/feed/posts/DatabaseFeedPosts.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/feed/posts/DatabaseFeedPosts.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -32,7 +32,7 @@
     @SuppressWarnings("unchecked")
     public List<? extends RestrictedPost> getPosts(int from, int to) {
         return (List<Post>) entityManager.createQuery(
-                "select post from Post post order by post.published desc, post.link")
+                "select post from Post post where post.feed.restricted = false order by post.published desc, post.link")
                 .setMaxResults(to-from).setFirstResult(from)
                 .setHint("org.hibernate.cacheable", Boolean.TRUE).getResultList();
     }

Modified: trunk/src/action/org/jboss/blog/session/group/GroupsServiceImpl.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/group/GroupsServiceImpl.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/group/GroupsServiceImpl.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -31,14 +31,21 @@
     public List<Feed> acceptedFeeds(Group group) {
         //noinspection unchecked
         return entityManager
-                .createQuery("select feed from Feed feed where feed.group = ?1 and feed.accepted = true")
+                .createQuery("select feed from Feed feed where feed.group = ?1 and feed.accepted = true and feed.restricted = false")
                 .setParameter(1, group).setHint("org.hibernate.cacheable", Boolean.TRUE).getResultList();
     }
 
     public List<Feed> unacceptedFeeds(Group group) {
         //noinspection unchecked
         return entityManager
-                .createQuery("select feed from Feed feed where feed.group = ?1 and not (feed.accepted = true)")
+                .createQuery("select feed from Feed feed where feed.group = ?1 and not (feed.accepted = true) and feed.restricted = false")
                 .setParameter(1, group).setHint("org.hibernate.cacheable", Boolean.TRUE).getResultList();
     }
+
+    public List<Feed> restrictedFeeds(Group group) {
+        //noinspection unchecked
+        return entityManager
+                .createQuery("select feed from Feed feed where feed.group = ?1 and feed.restricted = true")
+                .setParameter(1, group).setHint("org.hibernate.cacheable", Boolean.TRUE).getResultList();
+    }
 }

Modified: trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/search/PostSearchBean.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -108,9 +108,6 @@
         for (int i=0; i<LUCENE_SPECIAL.length; i++) {
             query = replaceAll(query, LUCENE_SPECIAL[i], ESCAPED_LUCENE_SPECIAL[i]);
         }
-
-        System.out.println("query = " + query);
-
         return query;
     }
 

Modified: trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/action/org/jboss/blog/session/security/SecurityModBean.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -87,6 +87,10 @@
         return externalSecurityService.getMapping(FeedsSecurityRole.FEED_ADMIN, feed.getId()).getGroups();
     }
 
+    public List<SecurityGroup> getFeedViewersGroups(Feed feed) {
+        return externalSecurityService.getMapping(FeedsSecurityRole.VIEW, feed.getId()).getGroups();
+    }
+
     public List<SecurityUser> getAdministratorUsers() {
         return externalSecurityService.getMapping(FeedsSecurityRole.ADMIN, null).getUsers();
     }
@@ -99,12 +103,17 @@
         return externalSecurityService.getMapping(FeedsSecurityRole.FEED_ADMIN, feed.getId()).getUsers();
     }
 
+    public List<SecurityUser> getFeedViewersUsers(Feed feed) {
+        return externalSecurityService.getMapping(FeedsSecurityRole.VIEW, feed.getId()).getUsers();
+    }
+
     private SecurityMapping getMapping() {
         Integer idForRole;
 
         switch (getRole()) {
             case GROUP_ADMIN: idForRole = getGroup().getId(); break;
             case FEED_ADMIN: idForRole = getFeed().getId(); break;
+            case VIEW: idForRole = getFeed().getId(); break;
             default: idForRole = null;
         }
 
@@ -125,6 +134,7 @@
             case ADMIN: bundleId = "blog.security.group.admin.added"; break;
             case GROUP_ADMIN: bundleId = "blog.security.group.group.added"; param = getGroup().getDisplayName(); break;
             case FEED_ADMIN: bundleId = "blog.security.group.feed.added"; param = getFeed().getName(); break;
+            case VIEW: bundleId = "blog.security.group.feedview.added"; param = getFeed().getName(); break;
             default: return;
         }
 
@@ -150,6 +160,7 @@
             case ADMIN: bundleId = "blog.security.group.admin.deleted"; break;
             case GROUP_ADMIN: bundleId = "blog.security.group.group.deleted"; param = getGroup().getDisplayName(); break;
             case FEED_ADMIN: bundleId = "blog.security.group.feed.deleted"; param = getFeed().getName(); break;
+            case VIEW: bundleId = "blog.security.group.feedview.deleted"; param = getFeed().getName(); break;
             default: return;
         }
 
@@ -171,6 +182,7 @@
             case ADMIN: bundleId = "blog.security.user.admin.added"; break;
             case GROUP_ADMIN: bundleId = "blog.security.user.group.added"; param = getGroup().getDisplayName(); break;
             case FEED_ADMIN: bundleId = "blog.security.user.feed.added"; param = getFeed().getName(); break;
+            case VIEW: bundleId = "blog.security.user.feedview.added"; param = getFeed().getName(); break;
             default: return;
         }
 
@@ -196,6 +208,7 @@
             case ADMIN: bundleId = "blog.security.user.admin.deleted"; break;
             case GROUP_ADMIN: bundleId = "blog.security.user.group.deleted"; param = getGroup().getDisplayName(); break;
             case FEED_ADMIN: bundleId = "blog.security.user.feed.deleted"; param = getFeed().getName(); break;
+            case VIEW: bundleId = "blog.security.user.feedview.deleted"; param = getFeed().getName(); break;
             default: return;
         }
 

Added: trunk/src/action/org/jboss/blog/session/security/filtering/FeedsSecurity.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/security/filtering/FeedsSecurity.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/security/filtering/FeedsSecurity.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -0,0 +1,36 @@
+package org.jboss.blog.session.security.filtering;
+
+import org.jboss.seam.annotations.Name;
+import org.jboss.seam.annotations.Scope;
+import org.jboss.seam.annotations.AutoCreate;
+import org.jboss.seam.annotations.In;
+import org.jboss.seam.ScopeType;
+import org.jboss.blog.session.security.FeedsIdentity;
+import org.jboss.blog.model.feed.Feed;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Name("feedsSecurity")
+ at Scope(ScopeType.STATELESS)
+ at AutoCreate
+public class FeedsSecurity {
+    @In
+    private FeedsIdentity identity;
+
+    public List<Feed> filterViewableFeeds(List<Feed> feeds) {
+        ArrayList<Feed> ret = new ArrayList<Feed>();
+
+        for (Feed feed : feeds) {
+            boolean isFeedRestricted = feed.getRestricted();
+            if (!isFeedRestricted || identity.hasPermission("feed", "view", feed)) {
+                ret.add(feed);
+            }
+        }
+
+        return ret;
+    }
+}

Added: trunk/src/action/org/jboss/blog/session/security/tools/FeedSecurityTools.java
===================================================================
--- trunk/src/action/org/jboss/blog/session/security/tools/FeedSecurityTools.java	                        (rev 0)
+++ trunk/src/action/org/jboss/blog/session/security/tools/FeedSecurityTools.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -0,0 +1,23 @@
+package org.jboss.blog.session.security.tools;
+
+import org.jboss.blog.model.feed.RestrictedFeed;
+import org.jboss.seam.security.Identity;
+import org.jboss.seam.Component;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class FeedSecurityTools {
+    public static boolean canViewFeed(RestrictedFeed feed, boolean restricted) {
+        if (!feed.getRestricted()) {
+            return true;
+        }
+
+        if (!restricted) {
+            return false;
+        }
+
+        Identity identity = (Identity) Component.getInstance(Identity.class);
+        return identity.hasPermission("feed", "view", feed);
+    }
+}

Modified: trunk/src/model/org/jboss/blog/model/Post.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/Post.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/model/org/jboss/blog/model/Post.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -212,6 +212,11 @@
     }
 
     public int compareTo(RestrictedPost post2) {
-        return - GeneralTools.compareDates(getPublished(), post2.getPublished());
+        int result = - GeneralTools.compareDates(getPublished(), post2.getPublished());
+        if (result == 0) {
+            return GeneralTools.compareStrings(getTitleAsId(), post2.getTitleAsId());
+        } else {
+            return result;
+        }
     }
 }

Modified: trunk/src/model/org/jboss/blog/model/feed/Feed.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/feed/Feed.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/model/org/jboss/blog/model/feed/Feed.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -81,6 +81,9 @@
     @Column
     private Boolean showDelicious;
 
+    @Column
+    private Boolean restricted;
+
     public Integer getId() {
         return id;
     }
@@ -209,6 +212,14 @@
         this.showDelicious = showDelicious;
     }
 
+    public Boolean getRestricted() {
+        return restricted;
+    }
+
+    public void setRestricted(Boolean restricted) {
+        this.restricted = restricted;
+    }
+
     public boolean equals(Object o) {
         if (this == o) return true;
         if (!(o instanceof Feed)) return false;

Modified: trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/model/org/jboss/blog/model/feed/RestrictedFeed.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -27,4 +27,6 @@
     Boolean getShowDzone();
 
     Boolean getShowDelicious();
+
+    Boolean getRestricted();
 }

Modified: trunk/src/model/org/jboss/blog/model/security/FeedsSecurityRole.java
===================================================================
--- trunk/src/model/org/jboss/blog/model/security/FeedsSecurityRole.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/model/org/jboss/blog/model/security/FeedsSecurityRole.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -6,5 +6,6 @@
 public enum FeedsSecurityRole {
     ADMIN,
     GROUP_ADMIN,
-    FEED_ADMIN
+    FEED_ADMIN,
+    VIEW
 }

Modified: trunk/src/services/org/jboss/blog/service/FeedsService.java
===================================================================
--- trunk/src/services/org/jboss/blog/service/FeedsService.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/services/org/jboss/blog/service/FeedsService.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -17,5 +17,15 @@
 
     List<? extends RestrictedPost> getPosts(RestrictedFeed feed, int from, int to);
 
+    /**
+     *
+     * @param feed Feed of which posts to get.
+     * @param from Starting post.
+     * @param to Ending post.
+     * @param restricted Should restricted posts be included?
+     * @return A list of posts of the given feed, of length max. to-from.
+     */
+    List<? extends RestrictedPost> getPosts(RestrictedFeed feed, int from, int to, boolean restricted);
+
     List<? extends RestrictedPost> getPosts(int from, int to);
 }

Modified: trunk/src/shotoku/org/jboss/blog/session/feed/dao/ShotokuFeedDao.java
===================================================================
--- trunk/src/shotoku/org/jboss/blog/session/feed/dao/ShotokuFeedDao.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/shotoku/org/jboss/blog/session/feed/dao/ShotokuFeedDao.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -9,6 +9,7 @@
 import org.jboss.seam.Component;
 
 import java.util.List;
+import java.util.ArrayList;
 
 /**
  * @author Adam Warski (adam at warski dot org)
@@ -25,7 +26,7 @@
         this.shotokuFeed = shotokuFeed;
     }
 
-    public List<? extends RestrictedPost> getPosts(int from, int to) {
+    public List<? extends RestrictedPost> getPosts(int from, int to, boolean restricted) {
         return ((DatabaseFeedPosts) Component.getInstance("databaseFeedPosts")).getPosts(
                 shotokuFeed, from, to);
     }

Modified: trunk/src/tools/org/jboss/blog/tools/GeneralTools.java
===================================================================
--- trunk/src/tools/org/jboss/blog/tools/GeneralTools.java	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/src/tools/org/jboss/blog/tools/GeneralTools.java	2008-04-26 10:11:18 UTC (rev 293)
@@ -142,6 +142,20 @@
         }
     }
 
+    public static int compareStrings(String str1, String str2) {
+        if (str1 == null) {
+            if (str2 == null) {
+                return 0;
+            } else {
+                return -1;
+            }
+        } else if (str2 == null) {
+            return 1;
+        } else {
+            return str1.compareTo(str2);
+        }
+    }
+
     public static String readInputStream(InputStream is) throws IOException {
         StringBuffer contents = new StringBuffer();
 

Modified: trunk/view/home.xhtml
===================================================================
--- trunk/view/home.xhtml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/view/home.xhtml	2008-04-26 10:11:18 UTC (rev 293)
@@ -54,6 +54,28 @@
                         </ui:repeat>
                     </table>
                 </s:fragment>
+
+                <s:fragment rendered="#{identity.loggedIn}">
+                    <s:fragment rendered="#{feedsSecurity.filterViewableFeeds(groupsService.restrictedFeeds(group)).size() > 0}">
+                        <h4>#{group.displayName} (restricted)</h4>
+                        <table cellspacing="5" class="laundrytable" width="75%">
+                            <tr>
+                                <th width="200px">Feed Author</th>
+                                <th width="480px">Feed Title</th>
+                            </tr>
+                            <ui:repeat var="feed" value="#{feedsSecurity.filterViewableFeeds(groupsService.restrictedFeeds(group))}">
+                                <tr>
+                                    <td>#{feed.author}</td>
+                                    <td>
+                                        <s:link view="/view/feed.xhtml" value="#{feed.title}" propagation="none">
+                                            <f:param name="name" value="#{feed.name}"/>
+                                        </s:link>
+                                    </td>
+                                </tr>
+                            </ui:repeat>
+                        </table>
+                    </s:fragment>
+                </s:fragment>
             </ui:repeat>
         </div>
     </ui:define>

Modified: trunk/view/manage/feed_add.xhtml
===================================================================
--- trunk/view/manage/feed_add.xhtml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/view/manage/feed_add.xhtml	2008-04-26 10:11:18 UTC (rev 293)
@@ -15,6 +15,7 @@
     <ui:define name="body">
         <ui:include src="feed_mod.xhtml">
             <ui:param name="new" value="true" />
+            <ui:param name="advanced" value="true" />
         </ui:include>
     </ui:define>
 </ui:composition>

Modified: trunk/view/manage/feed_edit.xhtml
===================================================================
--- trunk/view/manage/feed_edit.xhtml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/view/manage/feed_edit.xhtml	2008-04-26 10:11:18 UTC (rev 293)
@@ -15,6 +15,7 @@
     <ui:define name="body">
         <ui:include src="feed_mod.xhtml">
             <ui:param name="new" value="false" />
+            <ui:param name="advanced" value="true" />
         </ui:include>
     </ui:define>
 </ui:composition>

Modified: trunk/view/manage/feed_mod.xhtml
===================================================================
--- trunk/view/manage/feed_mod.xhtml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/view/manage/feed_mod.xhtml	2008-04-26 10:11:18 UTC (rev 293)
@@ -142,6 +142,13 @@
     <h:selectBooleanCheckbox id="showDzone" value="#{feedMod.feed.showDzone}" />
 </h:panelGroup>
 
+<h:outputLabel for="restricted" rendered="#{advanced}">
+    This is a restricted feed, viewable only by authorized users:
+</h:outputLabel>
+<h:panelGroup rendered="#{advanced}">
+    <h:selectBooleanCheckbox id="restricted" value="#{feedMod.feed.restricted}" />
+</h:panelGroup>
+
 <!--<h:outputLabel><span class="required">*</span> Xml templates:</h:outputLabel>
 <h:panelGroup>
     <h:dataTable var="templateType" value="#{feedMod.templateTypes}">

Modified: trunk/view/manage/feed_propose.xhtml
===================================================================
--- trunk/view/manage/feed_propose.xhtml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/view/manage/feed_propose.xhtml	2008-04-26 10:11:18 UTC (rev 293)
@@ -15,6 +15,7 @@
     <ui:define name="body">
         <ui:include src="feed_mod.xhtml">
             <ui:param name="new" value="true" />
+            <ui:param name="advanced" value="false" />
         </ui:include>
     </ui:define>
 </ui:composition>

Modified: trunk/view/manage/index.xhtml
===================================================================
--- trunk/view/manage/index.xhtml	2008-04-24 13:34:27 UTC (rev 292)
+++ trunk/view/manage/index.xhtml	2008-04-26 10:11:18 UTC (rev 293)
@@ -121,6 +121,37 @@
                     </tr>
                 </s:fragment>
             </a:repeat>
+
+            <a:repeat var="feed" value="#{groupsService.restrictedFeeds(group)}">
+                <s:fragment rendered="#{(identity.hasPermission('feed', 'edit', feed, group) ||
+                        identity.hasPermission('feed', 'delete', feed, group)) and
+                        identity.hasPermission('feed', 'view', feed)}">
+                    <tr class="evenRow">
+                        <td class="rowlinefirst" style="font-weight:bold;">#{feed.title} (restricted)</td>
+                        <td class="rowline">#{feed.name}</td>
+                        <td class="rowline">#{feedTypes.getFeedType(feed).name()}</td>
+                        <td class="rowline">
+                            <s:link view="/manage/feed_edit.xhtml" value="Edit common"
+                                    rendered="#{identity.hasPermission('feed', 'edit', feed, group)}">
+                                <f:param name="name" value="#{feed.name}" />
+                            </s:link>
+                        </td>
+                        <td class="rowline">
+                            <s:link view="#{feedTypes.getFeedType(feed).editPage()}" value="Edit specific"
+                                    rendered="#{identity.hasPermission('feed', 'edit', feed, group)}">
+                                <f:param name="name" value="#{feed.name}" />
+                            </s:link>
+                        </td>
+                        <td class="rowline">
+                            <s:link view="/manage/feed_delete.xhtml" action="#{feedMod.delete}" value="Delete"
+                                    onclick="if (!confirm('Are you sure you want to delete this feed?')) return false"
+                                    rendered="#{identity.hasPermission('feed', 'delete', feed, group)}">
+                                <f:param name="name" value="#{feed.name}" />
+                            </s:link>
+                        </td>
+                    </tr>
+                </s:fragment>
+            </a:repeat>
         </s:fragment>
     </ui:repeat>
 </table>




More information about the jboss-cvs-commits mailing list