From 3e107f55d789e5ae7ebae36e7eda122553996be3 Mon Sep 17 00:00:00 2001 From: Ahaan Ugale Date: Wed, 17 Jul 2013 11:59:13 -0600 Subject: [PATCH] Allow plugins to replace the WebSession implementation Plugins can replace the existing implementation with the statement: DynamicItem.bind(binder(), WebSession.class).to(...); in a module designated as a "" in the manifest. Just the Cache implementation used for web sessions can be changed by binding to a subclass of the now abstract CacheBasedWebSession which supplies the Cache in the superclass constructor. This is a step towards solving web session issues with multi-master. Change-Id: I255661a62cfcbfe07646cb90005764061d618f3d --- .../gerrit/httpd/CacheBasedWebSession.java | 30 ++------ .../gerrit/httpd/ContainerAuthFilter.java | 6 +- .../gerrit/httpd/H2CacheBasedWebSession.java | 68 +++++++++++++++++++ .../gerrit/httpd/HttpLogoutServlet.java | 5 +- .../gerrit/httpd/HttpRequestContext.java | 7 +- .../gerrit/httpd/ProjectBasicAuthFilter.java | 6 +- .../gerrit/httpd/ProjectDigestFilter.java | 5 +- .../com/google/gerrit/httpd/RunAsFilter.java | 6 +- .../gerrit/httpd/WebSessionManager.java | 12 ++-- .../httpd/WebSessionManagerFactory.java | 22 ++++++ .../become/BecomeAnyAccountLoginServlet.java | 6 +- .../httpd/auth/container/HttpAuthFilter.java | 6 +- .../auth/container/HttpLoginServlet.java | 6 +- .../HttpsClientSslCertAuthFilter.java | 6 +- .../httpd/auth/ldap/LdapLoginServlet.java | 6 +- .../gerrit/httpd/raw/HostPageServlet.java | 5 +- .../gerrit/httpd/restapi/RestApiServlet.java | 5 +- .../gerrit/httpd/rpc/GerritJsonServlet.java | 6 +- .../rpc/account/ExternalIdDetailFactory.java | 7 +- .../httpd/auth/openid/OpenIdServiceImpl.java | 5 +- .../java/com/google/gerrit/pgm/Daemon.java | 4 +- .../gerrit/httpd/WebAppInitializer.java | 2 +- 22 files changed, 153 insertions(+), 78 deletions(-) create mode 100644 gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java create mode 100644 gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManagerFactory.java diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java index 9968e2a633..b472bbd4f1 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/CacheBasedWebSession.java @@ -15,7 +15,6 @@ package com.google.gerrit.httpd; import static java.util.concurrent.TimeUnit.HOURS; -import static java.util.concurrent.TimeUnit.MINUTES; import com.google.gerrit.httpd.WebSessionManager.Key; import com.google.gerrit.httpd.WebSessionManager.Val; @@ -26,10 +25,7 @@ import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.AuthResult; -import com.google.gerrit.server.cache.CacheModule; import com.google.gerrit.server.config.AuthConfig; -import com.google.inject.Inject; -import com.google.inject.Module; import com.google.inject.Provider; import com.google.inject.servlet.RequestScoped; @@ -42,25 +38,9 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @RequestScoped -public final class CacheBasedWebSession implements WebSession { +public abstract class CacheBasedWebSession implements WebSession { private static final String ACCOUNT_COOKIE = "GerritAccount"; - static final long MAX_AGE_MINUTES = HOURS.toMinutes(12); - - public static Module module() { - return new CacheModule() { - @Override - protected void configure() { - persist(WebSessionManager.CACHE_NAME, String.class, Val.class) - .maximumWeight(1024) // reasonable default for many sites - .expireAfterWrite(MAX_AGE_MINUTES, MINUTES) // expire sessions if they are inactive - ; - bind(WebSessionManager.class); - bind(WebSession.class) - .to(CacheBasedWebSession.class) - .in(RequestScoped.class); - } - }; - } + protected static final long MAX_AGE_MINUTES = HOURS.toMinutes(12); private final HttpServletRequest request; private final HttpServletResponse response; @@ -75,9 +55,9 @@ public final class CacheBasedWebSession implements WebSession { private Val val; private CurrentUser user; - @Inject - CacheBasedWebSession(final HttpServletRequest request, - final HttpServletResponse response, final WebSessionManager manager, + protected CacheBasedWebSession(final HttpServletRequest request, + final HttpServletResponse response, + final WebSessionManager manager, final AuthConfig authConfig, final Provider anonymousProvider, final IdentifiedUser.RequestFactory identified) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java index 433b4f5ca6..91fb6aff7f 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ContainerAuthFilter.java @@ -17,12 +17,12 @@ package com.google.gerrit.httpd; import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN; import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.server.AccessPath; import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.AccountState; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import org.eclipse.jgit.lib.Config; @@ -54,12 +54,12 @@ import javax.servlet.http.HttpServletResponse; class ContainerAuthFilter implements Filter { public static final String REALM_NAME = "Gerrit Code Review"; - private final Provider session; + private final DynamicItem session; private final AccountCache accountCache; private final Config config; @Inject - ContainerAuthFilter(Provider session, AccountCache accountCache, + ContainerAuthFilter(DynamicItem session, AccountCache accountCache, @GerritServerConfig Config config) { this.session = session; this.accountCache = accountCache; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java new file mode 100644 index 0000000000..3dfb9fb7e7 --- /dev/null +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/H2CacheBasedWebSession.java @@ -0,0 +1,68 @@ +// Copyright (C) 2009 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.httpd; + +import static java.util.concurrent.TimeUnit.MINUTES; + +import com.google.common.cache.Cache; +import com.google.gerrit.extensions.registration.DynamicItem; +import com.google.gerrit.httpd.WebSessionManager.Val; +import com.google.gerrit.server.AnonymousUser; +import com.google.gerrit.server.IdentifiedUser.RequestFactory; +import com.google.gerrit.server.cache.CacheModule; +import com.google.gerrit.server.config.AuthConfig; +import com.google.inject.Inject; +import com.google.inject.Module; +import com.google.inject.Provider; +import com.google.inject.assistedinject.FactoryModuleBuilder; +import com.google.inject.name.Named; +import com.google.inject.servlet.RequestScoped; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@RequestScoped +public class H2CacheBasedWebSession extends CacheBasedWebSession { + public static Module module() { + return new CacheModule() { + @Override + protected void configure() { + persist(WebSessionManager.CACHE_NAME, String.class, Val.class) + .maximumWeight(1024) // reasonable default for many sites + .expireAfterWrite(CacheBasedWebSession.MAX_AGE_MINUTES, MINUTES) // expire sessions if they are inactive + ; + install(new FactoryModuleBuilder() + .build(WebSessionManagerFactory.class)); + DynamicItem.itemOf(binder(), WebSession.class); + DynamicItem.bind(binder(), WebSession.class) + .to(H2CacheBasedWebSession.class) + .in(RequestScoped.class); + } + }; + } + + @Inject + H2CacheBasedWebSession( + HttpServletRequest request, + HttpServletResponse response, + WebSessionManagerFactory managerFactory, + @Named(WebSessionManager.CACHE_NAME) Cache cache, + AuthConfig authConfig, + Provider anonymousProvider, + RequestFactory identified) { + super(request, response, managerFactory.create(cache), authConfig, + anonymousProvider, identified); + } +} diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java index ddbba3b503..7e1aa28d7e 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpLogoutServlet.java @@ -18,6 +18,7 @@ import com.google.common.base.Strings; import com.google.gerrit.audit.AuditEvent; import com.google.gerrit.audit.AuditService; import com.google.gerrit.common.Nullable; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.account.AccountManager; import com.google.gerrit.server.config.AuthConfig; @@ -37,14 +38,14 @@ import javax.servlet.http.HttpServletResponse; class HttpLogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; - private final Provider webSession; + private final DynamicItem webSession; private final Provider urlProvider; private final String logoutUrl; private final AuditService audit; @Inject HttpLogoutServlet(final AuthConfig authConfig, - final Provider webSession, + final DynamicItem webSession, @CanonicalWebUrl @Nullable final Provider urlProvider, final AccountManager accountManager, final AuditService audit) { diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java index 2db3534dc5..47593aacd9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/HttpRequestContext.java @@ -14,6 +14,7 @@ package com.google.gerrit.httpd; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.CurrentUser; import com.google.gerrit.server.config.RequestScopedReviewDbProvider; @@ -22,11 +23,11 @@ import com.google.inject.Inject; import com.google.inject.Provider; class HttpRequestContext implements RequestContext { - private final WebSession session; + private final DynamicItem session; private final RequestScopedReviewDbProvider provider; @Inject - HttpRequestContext(WebSession session, + HttpRequestContext(DynamicItem session, RequestScopedReviewDbProvider provider) { this.session = session; this.provider = provider; @@ -34,7 +35,7 @@ class HttpRequestContext implements RequestContext { @Override public CurrentUser getCurrentUser() { - return session.getCurrentUser(); + return session.get().getCurrentUser(); } @Override diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java index 3a45089b61..b9b57319cd 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectBasicAuthFilter.java @@ -18,6 +18,7 @@ import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; import com.google.common.base.Objects; import com.google.common.base.Strings; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.server.AccessPath; import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.AccountException; @@ -28,7 +29,6 @@ import com.google.gerrit.server.account.AuthResult; import com.google.gerrit.server.auth.NoSuchUserException; import com.google.gerrit.server.config.AuthConfig; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import org.apache.commons.codec.binary.Base64; @@ -68,13 +68,13 @@ class ProjectBasicAuthFilter implements Filter { private static final String AUTHORIZATION = "Authorization"; private static final String LIT_BASIC = "Basic "; - private final Provider session; + private final DynamicItem session; private final AccountCache accountCache; private final AccountManager accountManager; private final AuthConfig authConfig; @Inject - ProjectBasicAuthFilter(Provider session, + ProjectBasicAuthFilter(DynamicItem session, AccountCache accountCache, AccountManager accountManager, AuthConfig authConfig) { this.session = session; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java index be222569a2..12de3442a0 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/ProjectDigestFilter.java @@ -21,6 +21,7 @@ import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; import com.google.gerrit.common.Nullable; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.server.AccessPath; import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.AccountState; @@ -70,7 +71,7 @@ class ProjectDigestFilter implements Filter { private static final String AUTHORIZATION = "Authorization"; private final Provider urlProvider; - private final Provider session; + private final DynamicItem session; private final AccountCache accountCache; private final Config config; private final SignedToken tokens; @@ -78,7 +79,7 @@ class ProjectDigestFilter implements Filter { @Inject ProjectDigestFilter(@CanonicalWebUrl @Nullable Provider urlProvider, - Provider session, AccountCache accountCache, + DynamicItem session, AccountCache accountCache, @GerritServerConfig Config config) throws XsrfException { this.urlProvider = urlProvider; this.session = session; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java index e0bef35087..3418354284 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/RunAsFilter.java @@ -17,6 +17,7 @@ package com.google.gerrit.httpd; import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN; import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.restapi.RestApiServlet; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.CurrentUser; @@ -24,7 +25,6 @@ import com.google.gerrit.server.account.AccountResolver; import com.google.gerrit.server.config.AuthConfig; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; @@ -56,12 +56,12 @@ class RunAsFilter implements Filter { } private final boolean enabled; - private final Provider session; + private final DynamicItem session; private final AccountResolver accountResolver; @Inject RunAsFilter(AuthConfig config, - Provider session, + DynamicItem session, AccountResolver accountResolver) { this.enabled = config.isRunAsEnabled(); this.session = session; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java index 03eca9fcbe..24e2c56c09 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java @@ -34,8 +34,7 @@ import com.google.gerrit.reviewdb.client.AccountExternalId; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; import com.google.inject.Inject; -import com.google.inject.Singleton; -import com.google.inject.name.Named; +import com.google.inject.assistedinject.Assisted; import org.eclipse.jgit.lib.Config; import org.slf4j.Logger; @@ -49,10 +48,9 @@ import java.io.Serializable; import java.security.SecureRandom; import java.util.concurrent.TimeUnit; -@Singleton -class WebSessionManager { +public class WebSessionManager { private static final Logger log = LoggerFactory.getLogger(WebSessionManager.class); - static final String CACHE_NAME = "web_sessions"; + public static final String CACHE_NAME = "web_sessions"; private final long sessionMaxAgeMillis; private final SecureRandom prng; @@ -60,7 +58,7 @@ class WebSessionManager { @Inject WebSessionManager(@GerritServerConfig Config cfg, - @Named(CACHE_NAME) final Cache cache) { + @Assisted final Cache cache) { prng = new SecureRandom(); self = cache; @@ -180,7 +178,7 @@ class WebSessionManager { } } - static final class Val implements Serializable { + public static final class Val implements Serializable { static final long serialVersionUID = 2L; private transient Account.Id accountId; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManagerFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManagerFactory.java new file mode 100644 index 0000000000..d617e1b3cf --- /dev/null +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManagerFactory.java @@ -0,0 +1,22 @@ +// Copyright (C) 2013 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.httpd; + +import com.google.common.cache.Cache; +import com.google.gerrit.httpd.WebSessionManager.Val; + +public interface WebSessionManagerFactory { + WebSessionManager create(Cache cache); +} diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java index 2dde16e9b3..42f0aaf6ef 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/become/BecomeAnyAccountLoginServlet.java @@ -19,6 +19,7 @@ import static com.google.gerrit.reviewdb.client.AccountExternalId.SCHEME_USERNAM import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.gerrit.common.PageLinks; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.HtmlDomUtil; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.httpd.template.SiteHeaderFooter; @@ -34,7 +35,6 @@ import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.ResultSet; import com.google.gwtorm.server.SchemaFactory; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import org.w3c.dom.Document; @@ -59,12 +59,12 @@ class BecomeAnyAccountLoginServlet extends HttpServlet { private static final boolean IS_DEV = Boolean.getBoolean("Gerrit.GwtDevMode"); private final SchemaFactory schema; - private final Provider webSession; + private final DynamicItem webSession; private final AccountManager accountManager; private final SiteHeaderFooter headers; @Inject - BecomeAnyAccountLoginServlet(final Provider ws, + BecomeAnyAccountLoginServlet(final DynamicItem ws, final SchemaFactory sf, final AccountManager am, final ServletContext servletContext, diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java index eb6d1f7313..b737cd7052 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpAuthFilter.java @@ -19,6 +19,7 @@ import static com.google.common.base.Strings.emptyToNull; import static com.google.common.net.HttpHeaders.AUTHORIZATION; import static com.google.gerrit.reviewdb.client.AccountExternalId.SCHEME_GERRIT; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.HtmlDomUtil; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.httpd.raw.HostPageServlet; @@ -27,7 +28,6 @@ import com.google.gerrit.server.config.AuthConfig; import com.google.gwtexpui.server.CacheHeaders; import com.google.gwtjsonrpc.server.RPCServletUtils; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import org.eclipse.jgit.util.Base64; @@ -57,7 +57,7 @@ import javax.servlet.http.HttpServletResponse; */ @Singleton class HttpAuthFilter implements Filter { - private final Provider sessionProvider; + private final DynamicItem sessionProvider; private final byte[] signInRaw; private final byte[] signInGzip; private final String loginHeader; @@ -65,7 +65,7 @@ class HttpAuthFilter implements Filter { private final String emailHeader; @Inject - HttpAuthFilter(final Provider webSession, + HttpAuthFilter(final DynamicItem webSession, final AuthConfig authConfig) throws IOException { this.sessionProvider = webSession; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java index e62fde5cea..279c78b735 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpLoginServlet.java @@ -15,6 +15,7 @@ package com.google.gerrit.httpd.auth.container; import com.google.gerrit.common.PageLinks; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.CanonicalWebUrl; import com.google.gerrit.httpd.HtmlDomUtil; import com.google.gerrit.httpd.WebSession; @@ -25,7 +26,6 @@ import com.google.gerrit.server.account.AuthResult; import com.google.gerrit.server.config.AuthConfig; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import org.slf4j.Logger; @@ -56,14 +56,14 @@ class HttpLoginServlet extends HttpServlet { private static final Logger log = LoggerFactory.getLogger(HttpLoginServlet.class); - private final Provider webSession; + private final DynamicItem webSession; private final CanonicalWebUrl urlProvider; private final AccountManager accountManager; private final HttpAuthFilter authFilter; private final AuthConfig authConfig; @Inject - HttpLoginServlet(final Provider webSession, + HttpLoginServlet(final DynamicItem webSession, final CanonicalWebUrl urlProvider, final AccountManager accountManager, final HttpAuthFilter authFilter, diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java index c892c9dc01..ea9b1c0db9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/container/HttpsClientSslCertAuthFilter.java @@ -14,13 +14,13 @@ package com.google.gerrit.httpd.auth.container; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.server.account.AccountException; import com.google.gerrit.server.account.AccountManager; import com.google.gerrit.server.account.AuthRequest; import com.google.gerrit.server.account.AuthResult; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import org.slf4j.Logger; @@ -45,11 +45,11 @@ class HttpsClientSslCertAuthFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(HttpsClientSslCertAuthFilter.class); - private final Provider webSession; + private final DynamicItem webSession; private final AccountManager accountManager; @Inject - HttpsClientSslCertAuthFilter(final Provider webSession, + HttpsClientSslCertAuthFilter(final DynamicItem webSession, final AccountManager accountManager) { this.webSession = webSession; this.accountManager = accountManager; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java index 24dd5bf341..db5c8ce71b 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/auth/ldap/LdapLoginServlet.java @@ -18,6 +18,7 @@ import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.PageLinks; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.CanonicalWebUrl; import com.google.gerrit.httpd.HtmlDomUtil; import com.google.gerrit.httpd.WebSession; @@ -30,7 +31,6 @@ import com.google.gerrit.server.account.AuthResult; import com.google.gerrit.server.auth.AuthenticationUnavailableException; import com.google.gwtexpui.server.CacheHeaders; import com.google.inject.Inject; -import com.google.inject.Provider; import com.google.inject.Singleton; import org.slf4j.Logger; @@ -54,13 +54,13 @@ class LdapLoginServlet extends HttpServlet { .getLogger(LdapLoginServlet.class); private final AccountManager accountManager; - private final Provider webSession; + private final DynamicItem webSession; private final CanonicalWebUrl urlProvider; private final SiteHeaderFooter headers; @Inject LdapLoginServlet(AccountManager accountManager, - Provider webSession, + DynamicItem webSession, CanonicalWebUrl urlProvider, SiteHeaderFooter headers) { this.accountManager = accountManager; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java index 608aad685b..18a2ae5187 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/raw/HostPageServlet.java @@ -22,6 +22,7 @@ import com.google.common.primitives.Bytes; import com.google.gerrit.common.Version; import com.google.gerrit.common.data.GerritConfig; import com.google.gerrit.common.data.HostPageData; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.systemstatus.MessageOfTheDay; import com.google.gerrit.extensions.webui.WebUiPlugin; @@ -70,7 +71,7 @@ public class HostPageServlet extends HttpServlet { private static final String HPD_ID = "gerrit_hostpagedata"; private final Provider currentUser; - private final Provider session; + private final DynamicItem session; private final GerritConfig config; private final DynamicSet plugins; private final DynamicSet messages; @@ -84,7 +85,7 @@ public class HostPageServlet extends HttpServlet { private volatile Page page; @Inject - HostPageServlet(final Provider cu, final Provider w, + HostPageServlet(final Provider cu, final DynamicItem w, final SitePaths sp, final ThemeFactory themeFactory, final GerritConfig gc, final ServletContext servletContext, final DynamicSet webUiPlugins, diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java index 2f41c94a63..c43a8ba935 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/restapi/RestApiServlet.java @@ -47,6 +47,7 @@ import com.google.common.net.HttpHeaders; import com.google.gerrit.audit.AuditService; import com.google.gerrit.audit.HttpAuditEvent; import com.google.gerrit.common.Nullable; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.restapi.AcceptsCreate; import com.google.gerrit.extensions.restapi.AcceptsPost; @@ -151,13 +152,13 @@ public class RestApiServlet extends HttpServlet { public static class Globals { final Provider currentUser; - final Provider webSession; + final DynamicItem webSession; final Provider paramParser; final AuditService auditService; @Inject Globals(Provider currentUser, - Provider webSession, + DynamicItem webSession, Provider paramParser, AuditService auditService) { this.currentUser = currentUser; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java index 0b453a0229..32b4958575 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/GerritJsonServlet.java @@ -21,6 +21,7 @@ import com.google.gerrit.audit.RpcAuditEvent; import com.google.gerrit.common.audit.Audit; import com.google.gerrit.common.auth.SignInRequired; import com.google.gerrit.common.errors.NotSignedInException; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.server.AccessPath; import com.google.gerrit.server.CurrentUser; @@ -32,7 +33,6 @@ import com.google.gwtjsonrpc.server.JsonServlet; import com.google.gwtjsonrpc.server.MethodHandle; import com.google.gwtorm.server.OrmException; import com.google.inject.Inject; -import com.google.inject.Provider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,13 +54,13 @@ final class GerritJsonServlet extends JsonServlet new ThreadLocal<>(); private static final ThreadLocal currentMethod = new ThreadLocal<>(); - private final Provider session; + private final DynamicItem session; private final RemoteJsonService service; private final AuditService audit; @Inject - GerritJsonServlet(final Provider w, final RemoteJsonService s, + GerritJsonServlet(final DynamicItem w, final RemoteJsonService s, final AuditService a) { session = w; service = s; diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java index d876f2efc3..b97d46acf9 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/account/ExternalIdDetailFactory.java @@ -16,6 +16,7 @@ package com.google.gerrit.httpd.rpc.account; import static com.google.gerrit.reviewdb.client.AccountExternalId.SCHEME_USERNAME; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.httpd.rpc.Handler; import com.google.gerrit.reviewdb.client.AccountExternalId; @@ -36,11 +37,11 @@ class ExternalIdDetailFactory extends Handler> { private final ReviewDb db; private final IdentifiedUser user; private final AuthConfig authConfig; - private final WebSession session; + private final DynamicItem session; @Inject ExternalIdDetailFactory(final ReviewDb db, final IdentifiedUser user, - final AuthConfig authConfig, final WebSession session) { + final AuthConfig authConfig, final DynamicItem session) { this.db = db; this.user = user; this.authConfig = authConfig; @@ -49,7 +50,7 @@ class ExternalIdDetailFactory extends Handler> { @Override public List call() throws OrmException { - final AccountExternalId.Key last = session.getLastLoginExternalId(); + final AccountExternalId.Key last = session.get().getLastLoginExternalId(); final List ids = db.accountExternalIds().byAccount(user.getAccountId()).toList(); diff --git a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java index 5817a55d76..5c77ae9ab2 100644 --- a/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java +++ b/gerrit-openid/src/main/java/com/google/gerrit/httpd/auth/openid/OpenIdServiceImpl.java @@ -16,6 +16,7 @@ package com.google.gerrit.httpd.auth.openid; import com.google.gerrit.common.PageLinks; import com.google.gerrit.common.auth.openid.OpenIdUrls; +import com.google.gerrit.extensions.registration.DynamicItem; import com.google.gerrit.httpd.CanonicalWebUrl; import com.google.gerrit.httpd.WebSession; import com.google.gerrit.reviewdb.client.Account; @@ -90,7 +91,7 @@ class OpenIdServiceImpl { private static final String SCHEMA_LASTNAME = "http://schema.openid.net/namePerson/last"; - private final Provider webSession; + private final DynamicItem webSession; private final Provider identifiedUser; private final CanonicalWebUrl urlProvider; private final AccountManager accountManager; @@ -102,7 +103,7 @@ class OpenIdServiceImpl { private final int papeMaxAuthAge; @Inject - OpenIdServiceImpl(final Provider cf, + OpenIdServiceImpl(final DynamicItem cf, final Provider iu, CanonicalWebUrl up, @GerritServerConfig final Config config, final AuthConfig ac, diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java index 1776a3949c..0ba0ce2b96 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/Daemon.java @@ -20,9 +20,9 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Objects; import com.google.gerrit.common.ChangeHookRunner; import com.google.gerrit.httpd.AllRequestFilter; -import com.google.gerrit.httpd.CacheBasedWebSession; import com.google.gerrit.httpd.GerritUiOptions; import com.google.gerrit.httpd.GitOverHttpModule; +import com.google.gerrit.httpd.H2CacheBasedWebSession; import com.google.gerrit.httpd.HttpCanonicalWebUrlProvider; import com.google.gerrit.httpd.RequestContextFilter; import com.google.gerrit.httpd.WebModule; @@ -407,7 +407,7 @@ public class Daemon extends SiteProgram { } modules.add(RequestContextFilter.module()); modules.add(AllRequestFilter.module()); - modules.add(CacheBasedWebSession.module()); + modules.add(H2CacheBasedWebSession.module()); modules.add(HttpContactStoreConnection.module()); modules.add(sysInjector.getInstance(GitOverHttpModule.class)); modules.add(sysInjector.getInstance(WebModule.class)); diff --git a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java index abc5ae30ad..a0f4c36300 100644 --- a/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java +++ b/gerrit-war/src/main/java/com/google/gerrit/httpd/WebAppInitializer.java @@ -332,7 +332,7 @@ public class WebAppInitializer extends GuiceServletContextListener } else { modules.add(new NoSshModule()); } - modules.add(CacheBasedWebSession.module()); + modules.add(H2CacheBasedWebSession.module()); modules.add(HttpContactStoreConnection.module()); modules.add(new HttpPluginModule());