package act.util;
/*-
* #%L
* ACT Framework
* %%
* Copyright (C) 2014 - 2017 ActFramework
* %%
* 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.
* #L%
*/
import act.app.ActionContext;
import act.app.App;
import act.app.util.NamedPort;
import act.conf.AppConfig;
import act.route.Router;
import org.osgl.$;
import org.osgl.mvc.result.Redirect;
import org.osgl.mvc.result.Result;
import org.osgl.util.S;
import java.util.HashMap;
import java.util.Map;
/**
* When authentication is required but missing, redirect the user to
* {@link act.conf.AppConfigKey#URL_LOGIN}
*/
public class RedirectToLoginUrl extends SingletonBase implements MissingAuthenticationHandler {
private volatile Result R = null;
private volatile Result R_AJAX = null;
private final Map<String, Result> resultMap = new HashMap<String, Result>();
private final Map<String, Result> ajaxResultMap = new HashMap<String, Result>();
private final Redirect userDefined;
public RedirectToLoginUrl(String url) {
userDefined = new Redirect(url);
}
public RedirectToLoginUrl() {
userDefined = null;
App app = App.instance();
AppConfig<?> config = app.config();
String loginUrl = config.loginUrl();
String ajaxLoginUrl = config.ajaxLoginUrl();
Router router = app.router();
$.Var<Result> result = $.var(), ajaxResult = $.var();
findResults(loginUrl, ajaxLoginUrl, result, ajaxResult, router);
R = result.get();
R_AJAX = result.get();
resultMap.put("", R);
ajaxResultMap.put("", R_AJAX);
for (NamedPort port: config.namedPorts()) {
Router routerX = app.router(port);
findResults(loginUrl, ajaxLoginUrl, result, ajaxResult, routerX);
resultMap.put(port.name(), result.get());
ajaxResultMap.put(port.name(), ajaxResult.get());
}
}
@Override
public Result result(ActionContext context) {
if (null != userDefined) {
return userDefined;
}
if (context.isAjax()) {
return _ajaxResult(context);
} else {
return _result(context);
}
}
private Result _ajaxResult(ActionContext context) {
String portId = context.router().portId();
return S.blank(portId) ? R_AJAX : ajaxResultMap.get(portId);
}
private Result _result(ActionContext context) {
String portId = context.router().portId();
return S.blank(portId) ? R : resultMap.get(portId);
}
protected void findResults(String loginUrl, String ajaxLoginUrl, $.Var<Result> result, $.Var<Result> ajaxResult, Router router) {
result.set(hasRouteTo(loginUrl, router) ? new Redirect(loginUrl) : ReturnUnauthorized.result());
ajaxResult.set(S.eq(ajaxLoginUrl, loginUrl) ? R : hasRouteTo(ajaxLoginUrl, router) ? new Redirect(ajaxLoginUrl) : ReturnUnauthorized.result());
}
protected final boolean hasRouteTo(String url, Router router) {
return null != router.findStaticGetHandler(url);
}
}