Alexander Wels has uploaded a new change for review.

Change subject: webadmin: REST API login popup
......................................................................

webadmin: REST API login popup

- The REST API login popup would appear when one of the following was true:
  1 The engine session hard limit was reached (10 hours) and the REST API
    ping would happen before a refresh that would cause a logout.
  2 The REST API ping would not happen due to it detecting that the refresh
    flag was not set, however the engine would internally set the refresh
    on a sub query. This causes the REST api http session to expire and on
    a sub sequent ping would cause the popup to appear.

- This patch fixes 1. We take the hard limit into account and if we are close
  enough to the hard limit the REST API ping is disabled causing the natural
  logout of the webadmin UI to happen.

Change-Id: Ia09a6495268cacbb47019e3207a63c66205e9e03
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1206908
Signed-off-by: Alexander Wels <aw...@redhat.com>
---
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServlet.java
M 
frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServletTest.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/EngineSessionTimeoutData.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java
M 
frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/system/ApplicationInit.java
5 files changed, 53 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/39447/1

diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServlet.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServlet.java
index 9259930..568d089 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServlet.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServlet.java
@@ -13,7 +13,9 @@
 
 import org.codehaus.jackson.node.ArrayNode;
 import org.codehaus.jackson.node.ObjectNode;
+import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.config.ConfigCommon;
+import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.queries.ConfigurationValues;
 import org.ovirt.engine.core.common.queries.GetConfigurationValueParameters;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
@@ -56,8 +58,8 @@
         request.setAttribute(ATTR_PLUGIN_DEFS, 
getPluginDefinitionsArray(pluginData));
 
         // Set attribute for engineSessionTimeout object
-        Integer engineSessionTimeout = 
getEngineSessionTimeout(getEngineSessionId(request));
-        request.setAttribute(ATTR_ENGINE_SESSION_TIMEOUT, 
getEngineSessionTimeoutObject(engineSessionTimeout));
+        request.setAttribute(ATTR_ENGINE_SESSION_TIMEOUT, 
getEngineSessionTimeoutObject(getUserSessionTimeout(),
+                getUserSessionHardTimeout()));
 
         super.doGet(request, response);
     }
@@ -110,15 +112,18 @@
         return arr;
     }
 
-    protected Integer getEngineSessionTimeout(String sessionId) {
-        return (Integer) runPublicQuery(VdcQueryType.GetConfigurationValue,
-                new 
GetConfigurationValueParameters(ConfigurationValues.UserSessionTimeOutInterval,
-                        ConfigCommon.defaultConfigurationVersion), sessionId);
+    protected Integer getUserSessionTimeout() {
+        return Config.<Integer> 
getValue(ConfigValues.UserSessionTimeOutInterval);
     }
 
-    protected ObjectNode getEngineSessionTimeoutObject(Integer 
engineSessionTimeout) {
+    protected Integer getUserSessionHardTimeout() {
+        return Config.<Integer> getValue(ConfigValues.UserSessionHardLimit);
+    }
+
+    protected ObjectNode getEngineSessionTimeoutObject(Integer 
engineSessionTimeout, Integer userSessionHardLimit) {
         ObjectNode obj = createObjectNode();
-        obj.put("value", String.valueOf(engineSessionTimeout)); //$NON-NLS-1$
+        obj.put("sessionTimeout", String.valueOf(engineSessionTimeout)); 
//$NON-NLS-1$
+        obj.put("sessionHardLimit", String.valueOf(userSessionHardLimit)); 
//$NON-NLS-1$
         return obj;
     }
 
diff --git 
a/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServletTest.java
 
b/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServletTest.java
index 5227e14..29300f0 100644
--- 
a/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServletTest.java
+++ 
b/frontend/webadmin/modules/frontend/src/test/java/org/ovirt/engine/ui/frontend/server/gwt/WebAdminHostPageServletTest.java
@@ -93,7 +93,7 @@
     public void testDoGet_ExtraAttributes_WithoutUserInfoObject() throws 
IOException, ServletException {
         
doReturn(mockApplicationModeObject).when(testServlet).getApplicationModeObject(any(Integer.class));
         
doReturn(mockPluginDefinitionsArray).when(testServlet).getPluginDefinitionsArray(anyListOf(PluginData.class));
-        
doReturn(mockEngineSessionTimeoutObject).when(testServlet).getEngineSessionTimeoutObject(any(Integer.class));
+        
doReturn(mockEngineSessionTimeoutObject).when(testServlet).getEngineSessionTimeoutObject(any(Integer.class),
 any(Integer.class));
         testServlet.doGet(mockRequest, mockResponse);
         
verify(mockRequest).setAttribute(WebAdminHostPageServlet.ATTR_APPLICATION_MODE, 
mockApplicationModeObject);
         
verify(mockRequest).setAttribute(WebAdminHostPageServlet.ATTR_PLUGIN_DEFS, 
mockPluginDefinitionsArray);
@@ -141,8 +141,9 @@
 
     @Test
     public void testGetEngineSessionTimeoutObject() {
-        ObjectNode result = 
testServlet.getEngineSessionTimeoutObject(Integer.valueOf(30));
-        assertEquals(result.get("value").asText(), "30"); //$NON-NLS-1$ 
//$NON-NLS-2$
+        ObjectNode result = testServlet.getEngineSessionTimeoutObject(30, 60);
+        assertEquals(result.get("sessionTimeout").asInt(), 30); //$NON-NLS-1$
+        assertEquals(result.get("sessionHardLimit").asInt(), 60); //$NON-NLS-1$
     }
 
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/EngineSessionTimeoutData.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/EngineSessionTimeoutData.java
index 92a3f35..f0c89f8 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/EngineSessionTimeoutData.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/EngineSessionTimeoutData.java
@@ -14,8 +14,11 @@
         return $wnd.engineSessionTimeout;
     }-*/;
 
-    public native String getValue() /*-{
-        return this.value;
+    public native String getSessionTimeout() /*-{
+        return this.sessionTimeout;
     }-*/;
 
+    public native String getSessionHardLimit() /*-{
+        return this.sessionHardLimit;
+    }-*/;
 }
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java
index f019b83..6bc5090 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/plugin/restapi/RestApiSessionManager.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.ui.webadmin.plugin.restapi;
 
+import java.util.Date;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -74,14 +75,22 @@
     private static final String ENGINE_AUTH_TOKEN_HEADER = 
"OVIRT-INTERNAL-ENGINE-AUTH-TOKEN"; //$NON-NLS-1$
 
     private static final int DEFAULT_ENGINE_SESSION_TIMEOUT = 30;
+    private static final int DEFAULT_HARD_LIMIT = 600;
+
+    private static final int MIN_IN_MS = 1000 * 60;
 
     // Heartbeat (delay) between REST API keep-alive requests
-    private static final int SESSION_HEARTBEAT_MS = 1000 * 60; // 1 minute
+    private static final int SESSION_HEARTBEAT_MS = MIN_IN_MS;
 
     private final EventBus eventBus;
     private final String restApiBaseUrl;
 
     private int restApiSessionTimeout;
+
+    private Integer restApiSessionHardlimit;
+    //On logout the page reloads and this will be reset.
+    private Date restApiLoginTimePlusHardLimit;
+
     private String restApiSessionId;
 
     private boolean refreshRestApiSession = false;
@@ -101,7 +110,8 @@
 
     @Override
     public void onEngineSessionRefreshed(EngineSessionRefreshedEvent event) {
-        if (restApiSessionId != null) {
+        if (restApiSessionId != null && (restApiLoginTimePlusHardLimit == null
+                || new Date().before(restApiLoginTimePlusHardLimit))) {
             refreshRestApiSession = true;
         }
     }
@@ -122,6 +132,22 @@
         restApiSessionTimeout = 2 * engineSessionTimeout;
     }
 
+    public void setHardLimit(String sessionHardLimit) {
+        try {
+            restApiSessionHardlimit = Integer.valueOf(sessionHardLimit); 
//Minutes
+        } catch (NumberFormatException ex) {
+            restApiSessionHardlimit = DEFAULT_HARD_LIMIT;
+        }
+    }
+
+    public void recordLoggedInTime() {
+        if (restApiSessionHardlimit > 0) {
+            restApiLoginTimePlusHardLimit = new Date();
+            
restApiLoginTimePlusHardLimit.setTime(restApiLoginTimePlusHardLimit.getTime()
+                    + ((restApiSessionHardlimit.longValue() - 1) * 
MIN_IN_MS)); //Subtract one refresh cycle to be sure we stop.
+        }
+    }
+
     /**
      * Build HTTP request to acquire new or keep-alive existing REST API 
session.
      * <p>
diff --git 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/system/ApplicationInit.java
 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/system/ApplicationInit.java
index 2df3460..8421331 100644
--- 
a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/system/ApplicationInit.java
+++ 
b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/system/ApplicationInit.java
@@ -78,7 +78,8 @@
         // Check for Engine user session timeout configuration
         EngineSessionTimeoutData engineSessionTimeoutData = 
EngineSessionTimeoutData.instance();
         if (engineSessionTimeoutData != null) {
-            
restApiSessionManager.setSessionTimeout(engineSessionTimeoutData.getValue());
+            
restApiSessionManager.setSessionTimeout(engineSessionTimeoutData.getSessionTimeout());
+            
restApiSessionManager.setHardLimit(engineSessionTimeoutData.getSessionHardLimit());
         }
 
         // Initiate transition to requested application place
@@ -110,6 +111,7 @@
         });
 
         performLogin(loginModel);
+        restApiSessionManager.recordLoggedInTime();
     }
 
     @Override


-- 
To view, visit https://gerrit.ovirt.org/39447
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia09a6495268cacbb47019e3207a63c66205e9e03
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Alexander Wels <aw...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to