From f66e89662c091e082bd1d2feb6ac91513ccff273 Mon Sep 17 00:00:00 2001 From: Rafael Cavazin <rafaelcavazin@gmail.com> Date: Sun, 21 Jul 2013 09:59:00 -0400 Subject: [PATCH] Merge branch 'master' of https://github.com/gitblit/gitblit --- src/main/java/com/gitblit/wicket/GitBlitWebSession.java | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 165 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebSession.java b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java new file mode 100644 index 0000000..f25bcf9 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/GitBlitWebSession.java @@ -0,0 +1,165 @@ +/* + * Copyright 2011 gitblit.com. + * + * 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.gitblit.wicket; + +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.wicket.Page; +import org.apache.wicket.PageParameters; +import org.apache.wicket.RedirectToUrlException; +import org.apache.wicket.Request; +import org.apache.wicket.Session; +import org.apache.wicket.protocol.http.RequestUtils; +import org.apache.wicket.protocol.http.WebRequestCycle; +import org.apache.wicket.protocol.http.WebSession; +import org.apache.wicket.protocol.http.request.WebClientInfo; + +import com.gitblit.Constants.AuthenticationType; +import com.gitblit.models.UserModel; + +public final class GitBlitWebSession extends WebSession { + + private static final long serialVersionUID = 1L; + + protected TimeZone timezone; + + private UserModel user; + + private String errorMessage; + + private String requestUrl; + + private AtomicBoolean isForking; + + public AuthenticationType authenticationType; + + public GitBlitWebSession(Request request) { + super(request); + isForking = new AtomicBoolean(); + authenticationType = AuthenticationType.CREDENTIALS; + } + + public void invalidate() { + super.invalidate(); + user = null; + } + + /** + * Cache the requested protected resource pending successful authentication. + * + * @param pageClass + */ + public void cacheRequest(Class<? extends Page> pageClass) { + // build absolute url with correctly encoded parameters?! + Request req = WebRequestCycle.get().getRequest(); + Map<String, ?> params = req.getRequestParameters().getParameters(); + PageParameters pageParams = new PageParameters(params); + String relativeUrl = WebRequestCycle.get().urlFor(pageClass, pageParams).toString(); + requestUrl = RequestUtils.toAbsolutePath(relativeUrl); + if (isTemporary()) + { + // we must bind the temporary session into the session store + // so that we can re-use this session for reporting an error message + // on the redirected page and continuing the request after + // authentication. + bind(); + } + } + + /** + * Continue any cached request. This is used when a request for a protected + * resource is aborted/redirected pending proper authentication. Gitblit + * no longer uses Wicket's built-in mechanism for this because of Wicket's + * failure to properly handle parameters with forward-slashes. This is a + * constant source of headaches with Wicket. + * + * @return false if there is no cached request to process + */ + public boolean continueRequest() { + if (requestUrl != null) { + String url = requestUrl; + requestUrl = null; + throw new RedirectToUrlException(url); + } + return false; + } + + public boolean isLoggedIn() { + return user != null; + } + + public boolean canAdmin() { + if (user == null) { + return false; + } + return user.canAdmin(); + } + + public String getUsername() { + return user == null ? "anonymous" : user.username; + } + + public UserModel getUser() { + return user; + } + + public void setUser(UserModel user) { + this.user = user; + if (user != null) { + Locale preferredLocale = user.getPreferences().getLocale(); + if (preferredLocale != null) { + // set the user's preferred locale + setLocale(preferredLocale); + } + } + } + + public TimeZone getTimezone() { + if (timezone == null) { + timezone = ((WebClientInfo) getClientInfo()).getProperties().getTimeZone(); + } + // use server timezone if we can't determine the client timezone + if (timezone == null) { + timezone = TimeZone.getDefault(); + } + return timezone; + } + + public void cacheErrorMessage(String message) { + this.errorMessage = message; + } + + public String clearErrorMessage() { + String msg = errorMessage; + errorMessage = null; + return msg; + } + + public boolean isForking() { + return isForking.get(); + } + + public void isForking(boolean val) { + isForking.set(val); + } + + public static GitBlitWebSession get() { + return (GitBlitWebSession) Session.get(); + } +} \ No newline at end of file -- Gitblit v1.9.1