| /* | |
| * 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.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 GitBlitWebSession(Request request) { | |
| super(request); | |
| isForking = new AtomicBoolean(); | |
| } | |
| @Override | |
| 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(); | |
| } | |
| } |