Alon Bar-Lev has uploaded a new change for review. Change subject: aaa: enable accept engine session using header ......................................................................
aaa: enable accept engine session using header new header OVIRT-INTERNAL-ENGINE-AUTH-TOKEN accepts token that is signed engine session id, as session id is plain uuid which is not enough random. a new query GetEngineSessionIdToken returns this token. ui should use the new query and apply the header to avoid double login. this may be temporary solution for 3.5 life cycle, as such applied only for restapi. query untested. Change-Id: I028082cced7043b5af0b9fa7b0548ba888996e9d Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1161734 Signed-off-by: Alon Bar-Lev <alo...@redhat.com> --- A backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/EngineSessionTokenAuthenticationFilter.java M backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/FiltersHelper.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/GetEngineSessionIdTokenQuery.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java M backend/manager/modules/restapi/webapp/src/main/webapp/WEB-INF/web.xml 5 files changed, 113 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/69/35069/1 diff --git a/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/EngineSessionTokenAuthenticationFilter.java b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/EngineSessionTokenAuthenticationFilter.java new file mode 100644 index 0000000..5640776 --- /dev/null +++ b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/EngineSessionTokenAuthenticationFilter.java @@ -0,0 +1,37 @@ +package org.ovirt.engine.core.aaa.filters; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.ovirt.engine.core.common.constants.SessionConstants; + +public class EngineSessionTokenAuthenticationFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, + ServletException { + HttpServletRequest req = (HttpServletRequest) request; + if (!FiltersHelper.isAuthenticated(req)) { + String token = req.getHeader(FiltersHelper.Constants.HEADER_ENGINE_AUTH_TOKEN); + if (token != null) { + request.setAttribute(SessionConstants.HTTP_SESSION_ENGINE_SESSION_ID_KEY, FiltersHelper.getTokenContent(token)); + } + } + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } +} diff --git a/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/FiltersHelper.java b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/FiltersHelper.java index 862a730..d082349 100644 --- a/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/FiltersHelper.java +++ b/backend/manager/modules/aaa/src/main/java/org/ovirt/engine/core/aaa/filters/FiltersHelper.java @@ -1,11 +1,18 @@ package org.ovirt.engine.core.aaa.filters; +import java.nio.charset.Charset; +import java.security.GeneralSecurityException; +import java.security.NoSuchAlgorithmException; import java.util.Enumeration; +import javax.crypto.KeyGenerator; +import javax.crypto.Mac; +import javax.crypto.SecretKey; import javax.naming.Context; import javax.naming.NamingException; import javax.servlet.http.HttpServletRequest; +import org.apache.commons.codec.binary.Base64; import org.apache.http.HeaderElement; import org.apache.http.message.BasicHeaderValueParser; import org.ovirt.engine.core.common.constants.SessionConstants; @@ -23,6 +30,18 @@ public static final String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; public static final String HEADER_PREFER = "Prefer"; public static final String HEADER_JSESSIONID_COOKIE = "JSESSIONID"; + public static final String HEADER_ENGINE_AUTH_TOKEN = "OVIRT-INTERNAL-ENGINE-AUTH-TOKEN"; + } + + private static final String HMAC_ALGO = "HmacSHA1"; + + private static SecretKey instanceKey; + static { + try { + instanceKey = KeyGenerator.getInstance(HMAC_ALGO).generateKey(); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } } public static BackendLocal getBackend(Context context) { @@ -57,4 +76,35 @@ return false; } + private static String hmacString(String s) { + try { + Mac mac = Mac.getInstance(HMAC_ALGO); + mac.init(instanceKey); + return new Base64(0).encodeToString(mac.doFinal(s.getBytes(Charset.forName("UTF-8")))); + } catch(GeneralSecurityException e) { + throw new RuntimeException(e); + } + } + + public static String getTokenInstance(String content) { + return String.format("0|%s|%s", content, hmacString(content)); + } + + public static String getTokenContent(String token) { + String s[] = token.split("\\|", 3); + if (s.length != 3) { + throw new IllegalArgumentException("Invalid session token format"); + } + if (!"0".equals(s[0])) { + throw new IllegalArgumentException("Invalid session token version"); + } + if (s[1].isEmpty() || s[2].isEmpty()) { + throw new IllegalArgumentException("Invalid session token format"); + } + if (!s[2].equals(hmacString(s[1]))) { + throw new IllegalArgumentException("Invalid session token instance"); + } + return s[1]; + } + } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/GetEngineSessionIdTokenQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/GetEngineSessionIdTokenQuery.java new file mode 100644 index 0000000..8884dd0 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/aaa/GetEngineSessionIdTokenQuery.java @@ -0,0 +1,16 @@ +package org.ovirt.engine.core.bll.aaa; + +import org.ovirt.engine.core.aaa.filters.FiltersHelper; +import org.ovirt.engine.core.bll.QueriesCommandBase; +import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; + +public class GetEngineSessionIdTokenQuery<P extends VdcQueryParametersBase> extends QueriesCommandBase<P> { + public GetEngineSessionIdTokenQuery(P parameters) { + super(parameters); + } + + protected void executeQueryCommand() { + getQueryReturnValue().setReturnValue(FiltersHelper.getTokenInstance(getParameters().getSessionId())); + getQueryReturnValue().setSucceeded(true); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index a35fde4..72b4902 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -153,6 +153,7 @@ GetDbUserByUserId(VdcQueryAuthType.User), GetDbUserByUserNameAndDomain(VdcQueryAuthType.User), GetUserBySessionId(VdcQueryAuthType.User), + GetEngineSessionIdToken(VdcQueryAuthType.User), // Directory queries: GetDirectoryUserById(VdcQueryAuthType.User), diff --git a/backend/manager/modules/restapi/webapp/src/main/webapp/WEB-INF/web.xml b/backend/manager/modules/restapi/webapp/src/main/webapp/WEB-INF/web.xml index 6805f20..9a108c4 100644 --- a/backend/manager/modules/restapi/webapp/src/main/webapp/WEB-INF/web.xml +++ b/backend/manager/modules/restapi/webapp/src/main/webapp/WEB-INF/web.xml @@ -43,6 +43,15 @@ </filter-mapping> <filter> + <filter-name>EngineSessionTokenAuthenticationFilter</filter-name> + <filter-class>org.ovirt.engine.core.aaa.filters.EngineSessionTokenAuthenticationFilter</filter-class> + </filter> + <filter-mapping> + <filter-name>EngineSessionTokenAuthenticationFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + + <filter> <filter-name>SessionValidationFilter</filter-name> <filter-class>org.ovirt.engine.core.aaa.filters.SessionValidationFilter</filter-class> </filter> -- To view, visit http://gerrit.ovirt.org/35069 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I028082cced7043b5af0b9fa7b0548ba888996e9d Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alon Bar-Lev <alo...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches