diff --git a/commafeed-server/config.dev.yml b/commafeed-server/config.dev.yml index d521d20b..d5aa62de 100644 --- a/commafeed-server/config.dev.yml +++ b/commafeed-server/config.dev.yml @@ -60,7 +60,10 @@ app: # entries to keep per feed, old entries will be deleted, 0 to disable maxFeedCapacity: 500 - + + # limit the number of feeds a user can subscribe to, 0 to disable + maxFeedsPerUser: 0 + # cache service to use, possible values are 'noop' and 'redis' cache: noop diff --git a/commafeed-server/config.yml.example b/commafeed-server/config.yml.example index 1726bdac..f990e1d6 100644 --- a/commafeed-server/config.yml.example +++ b/commafeed-server/config.yml.example @@ -61,7 +61,10 @@ app: # entries to keep per feed, old entries will be deleted, 0 to disable maxFeedCapacity: 500 - + + # limit the number of feeds a user can subscribe to, 0 to disable + maxFeedsPerUser: 0 + # cache service to use, possible values are 'noop' and 'redis' cache: noop diff --git a/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java b/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java index 536b8d51..333fde04 100644 --- a/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java +++ b/commafeed-server/src/main/java/com/commafeed/CommaFeedConfiguration.java @@ -124,6 +124,10 @@ public class CommaFeedConfiguration extends Configuration { @Valid private Integer maxFeedCapacity; + @NotNull + @Valid + private Integer maxFeedsPerUser; + @NotNull @Min(0) @Valid diff --git a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java index b7a81598..53231851 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedSubscriptionDAO.java @@ -59,6 +59,10 @@ public class FeedSubscriptionDAO extends GenericDAO { return initRelations(subs); } + public Long count(User user) { + return query().select(sub.count()).from(sub).where(sub.user.eq(user)).fetchOne(); + } + public List findByCategory(User user, FeedCategory category) { JPQLQuery query = query().selectFrom(sub).where(sub.user.eq(user)); if (category == null) { diff --git a/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLImporter.java b/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLImporter.java index e46a6ee1..2f5f0199 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLImporter.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/opml/OPMLImporter.java @@ -15,7 +15,6 @@ import com.commafeed.backend.feed.FeedUtils; import com.commafeed.backend.model.FeedCategory; import com.commafeed.backend.model.User; import com.commafeed.backend.service.FeedSubscriptionService; -import com.commafeed.backend.service.FeedSubscriptionService.FeedSubscriptionException; import com.rometools.opml.feed.opml.Opml; import com.rometools.opml.feed.opml.Outline; import com.rometools.rome.io.FeedException; @@ -78,8 +77,6 @@ public class OPMLImporter { // make sure we continue with the import process even if a feed failed try { feedSubscriptionService.subscribe(user, outline.getXmlUrl(), name, parent, position); - } catch (FeedSubscriptionException e) { - throw e; } catch (Exception e) { log.error("error while importing {}: {}", outline.getXmlUrl(), e.getMessage()); } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java index bb7637e2..23609e6c 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java @@ -57,6 +57,13 @@ public class FeedSubscriptionService { throw new FeedSubscriptionException("Could not subscribe to a feed from this CommaFeed instance"); } + Integer maxFeedsPerUser = config.getApplicationSettings().getMaxFeedsPerUser(); + if (maxFeedsPerUser > 0 && feedSubscriptionDAO.count(user) >= maxFeedsPerUser) { + String message = String.format("You cannot subscribe to more feeds on this CommaFeed instance (max %s feeds per user)", + maxFeedsPerUser); + throw new FeedSubscriptionException(message); + } + Feed feed = feedService.findOrCreate(url); // upgrade feed to https if it was using http diff --git a/commafeed-server/src/test/resources/config.test.yml b/commafeed-server/src/test/resources/config.test.yml index e8f26d23..3606668a 100644 --- a/commafeed-server/src/test/resources/config.test.yml +++ b/commafeed-server/src/test/resources/config.test.yml @@ -60,6 +60,9 @@ app: # entries to keep per feed, old entries will be deleted, 0 to disable maxFeedCapacity: 500 + + # limit the number of feeds a user can subscribe to, 0 to disable + maxFeedsPerUser: 0 # cache service to use, possible values are 'noop' and 'redis' cache: noop @@ -69,7 +72,7 @@ app: # user-agent string that will be used by the http client, leave empty for the default one userAgent: - + # Database connection # ------------------- # for MySQL @@ -92,8 +95,8 @@ database: properties: charSet: UTF-8 validationQuery: "/* CommaFeed Health Check */ SELECT 1" - - + + logging: level: INFO loggers: