diff --git a/src/main/java/com/commafeed/CommaFeedApplication.java b/src/main/java/com/commafeed/CommaFeedApplication.java index 221a3b27..9ec60d09 100644 --- a/src/main/java/com/commafeed/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/CommaFeedApplication.java @@ -9,13 +9,8 @@ import io.dropwizard.migrations.MigrationsBundle; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; -import java.io.File; import java.util.Date; -import java.util.concurrent.TimeUnit; -import javax.servlet.SessionTrackingMode; - -import org.eclipse.jetty.server.session.HashSessionManager; import org.eclipse.jetty.server.session.SessionHandler; import com.commafeed.backend.feed.FeedRefreshTaskGiver; @@ -50,7 +45,6 @@ import com.commafeed.frontend.servlet.AnalyticsServlet; import com.commafeed.frontend.servlet.CustomCssServlet; import com.commafeed.frontend.servlet.LogoutServlet; import com.commafeed.frontend.servlet.NextUnreadServlet; -import com.google.common.collect.ImmutableSet; import com.google.inject.Guice; import com.google.inject.Injector; import com.wordnik.swagger.config.ConfigFactory; @@ -102,22 +96,7 @@ public class CommaFeedApplication extends Application { Injector injector = Guice.createInjector(new CommaFeedModule(hibernateBundle.getSessionFactory(), config, environment.metrics())); // Auth/session management - HashSessionManager sessionManager = new HashSessionManager(); - sessionManager.setSessionTrackingModes(ImmutableSet.of(SessionTrackingMode.COOKIE)); - sessionManager.setHttpOnly(true); - sessionManager.getSessionCookieConfig().setHttpOnly(true); - - sessionManager.setStoreDirectory(new File("sessions")); - sessionManager.getSessionCookieConfig().setMaxAge((int) TimeUnit.DAYS.toSeconds(30)); - sessionManager.setMaxInactiveInterval((int) TimeUnit.DAYS.toSeconds(30)); - - sessionManager.setDeleteUnrestorableSessions(true); - sessionManager.setIdleSavePeriod((int) TimeUnit.HOURS.toSeconds(2)); - sessionManager.setRefreshCookieAge((int) TimeUnit.DAYS.toSeconds(1)); - sessionManager.setSavePeriod((int) TimeUnit.MINUTES.toSeconds(5)); - sessionManager.setScavengePeriod((int) TimeUnit.MINUTES.toSeconds(5)); - - environment.servlets().setSessionHandler(new SessionHandler(sessionManager)); + environment.servlets().setSessionHandler(new SessionHandler(config.getSessionManagerFactory().build())); environment.jersey().register(new SecurityCheckUserServiceProvider(injector.getInstance(UserService.class))); environment.jersey().register(SecurityCheckProvider.class); environment.jersey().register(HttpSessionProvider.class); @@ -138,17 +117,19 @@ public class CommaFeedApplication extends Application { environment.servlets().addServlet("customCss", injector.getInstance(CustomCssServlet.class)).addMapping("/custom_css.css"); environment.servlets().addServlet("analytics.js", injector.getInstance(AnalyticsServlet.class)).addMapping("/analytics.js"); - // Tasks + // Scheduled tasks SchedulingService schedulingService = new SchedulingService(); schedulingService.register(injector.getInstance(OldStatusesCleanupTask.class)); schedulingService.register(injector.getInstance(OrphansCleanupTask.class)); + environment.lifecycle().manage(schedulingService); - // Managed objects + // database init/changelogs environment.lifecycle().manage(injector.getInstance(StartupService.class)); + + // background feed fetching environment.lifecycle().manage(injector.getInstance(FeedRefreshTaskGiver.class)); environment.lifecycle().manage(injector.getInstance(FeedRefreshWorker.class)); environment.lifecycle().manage(injector.getInstance(FeedRefreshUpdater.class)); - environment.lifecycle().manage(schedulingService); // Swagger environment.jersey().register(new ApiListingResourceJSON()); diff --git a/src/main/java/com/commafeed/CommaFeedConfiguration.java b/src/main/java/com/commafeed/CommaFeedConfiguration.java index 9c5175a1..c7874172 100644 --- a/src/main/java/com/commafeed/CommaFeedConfiguration.java +++ b/src/main/java/com/commafeed/CommaFeedConfiguration.java @@ -15,6 +15,7 @@ import lombok.Getter; import org.apache.commons.lang.time.DateUtils; import org.hibernate.validator.constraints.NotBlank; +import com.commafeed.frontend.SessionManagerFactory; import com.fasterxml.jackson.annotation.JsonProperty; @Getter @@ -34,6 +35,11 @@ public class CommaFeedConfiguration extends Configuration { @NotNull @JsonProperty("database") private DataSourceFactory database = new DataSourceFactory(); + + @Valid + @NotNull + @JsonProperty("session") + private SessionManagerFactory sessionManagerFactory = new SessionManagerFactory(); @Valid @NotNull @@ -50,80 +56,61 @@ public class CommaFeedConfiguration extends Configuration { @Getter public static class ApplicationSettings { - @JsonProperty @NotNull @NotBlank private String contextPath; - @JsonProperty @NotNull @NotBlank private String publicUrl; - @JsonProperty @NotNull private boolean allowRegistrations; - @JsonProperty private String googleAnalyticsTrackingCode; - @JsonProperty @NotNull @Min(1) private int backgroundThreads; - @JsonProperty @NotNull @Min(1) private int databaseUpdateThreads; - @JsonProperty private String smtpHost; - @JsonProperty private int smtpPort; - @JsonProperty private boolean smtpTls; - @JsonProperty private String smtpUserName; - @JsonProperty private String smtpPassword; - @JsonProperty @NotNull private boolean heavyLoad; - @JsonProperty @NotNull private boolean pubsubhubbub; - @JsonProperty @NotNull private boolean imageProxyEnabled; - @JsonProperty @NotNull @Min(0) private int queryTimeout; - @JsonProperty @NotNull @Min(0) private int keepStatusDays; - @JsonProperty @NotNull @Min(0) private int refreshIntervalMinutes; - @JsonProperty @NotNull private CacheType cache; - @JsonProperty @NotNull private String announcement; diff --git a/src/main/java/com/commafeed/frontend/SessionManagerFactory.java b/src/main/java/com/commafeed/frontend/SessionManagerFactory.java new file mode 100644 index 00000000..e5d34797 --- /dev/null +++ b/src/main/java/com/commafeed/frontend/SessionManagerFactory.java @@ -0,0 +1,45 @@ +package com.commafeed.frontend; + +import io.dropwizard.util.Duration; + +import java.io.File; +import java.io.IOException; + +import javax.servlet.SessionTrackingMode; + +import lombok.Getter; + +import org.eclipse.jetty.server.SessionManager; +import org.eclipse.jetty.server.session.HashSessionManager; + +import com.google.common.collect.ImmutableSet; + +@Getter +public class SessionManagerFactory { + + private String path = "sessions"; + private Duration cookieMaxAge = Duration.days(30); + private Duration cookieRefreshAge = Duration.days(1); + private Duration maxInactiveInterval = Duration.days(30); + private Duration idleSavePeriod = Duration.hours(2); + private Duration savePeriod = Duration.minutes(5); + private Duration scavengePeriod = Duration.minutes(5); + + public SessionManager build() throws IOException { + HashSessionManager manager = new HashSessionManager(); + manager.setSessionTrackingModes(ImmutableSet.of(SessionTrackingMode.COOKIE)); + manager.setHttpOnly(true); + manager.getSessionCookieConfig().setHttpOnly(true); + manager.setDeleteUnrestorableSessions(true); + + manager.setStoreDirectory(new File(getPath())); + manager.getSessionCookieConfig().setMaxAge((int) cookieMaxAge.toSeconds()); + manager.setRefreshCookieAge((int) cookieRefreshAge.toSeconds()); + manager.setMaxInactiveInterval((int) maxInactiveInterval.toSeconds()); + manager.setIdleSavePeriod((int) idleSavePeriod.toSeconds()); + manager.setSavePeriod((int) savePeriod.toSeconds()); + manager.setScavengePeriod((int) scavengePeriod.toSeconds()); + return manager; + } + +}