You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/02/27 06:59:42 UTC

svn commit: r1662638 - in /felix/trunk/webconsole: ./ src/main/java/org/apache/felix/webconsole/ src/main/java/org/apache/felix/webconsole/internal/servlet/ src/main/resources/OSGI-INF/l10n/ src/main/resources/res/ui/

Author: cziegeler
Date: Fri Feb 27 05:59:41 2015
New Revision: 1662638

URL: http://svn.apache.org/r1662638
Log:
FELIX-3006 : Please create a logout button for the web console screen

Modified:
    felix/trunk/webconsole/pom.xml
    felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
    felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
    felix/trunk/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
    felix/trunk/webconsole/src/main/resources/res/ui/webconsole.css

Modified: felix/trunk/webconsole/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/pom.xml?rev=1662638&r1=1662637&r2=1662638&view=diff
==============================================================================
--- felix/trunk/webconsole/pom.xml (original)
+++ felix/trunk/webconsole/pom.xml Fri Feb 27 05:59:41 2015
@@ -41,7 +41,7 @@
         <org.json.version>20070829</org.json.version>
         <org.json.version.osgi>0.0.0.${org.json.version}</org.json.version.osgi>
         <webconsole.exports>
-            org.apache.felix.webconsole;version=3.1.3;provide:=true,
+            org.apache.felix.webconsole;version=3.2.0;provide:=true,
             org.apache.felix.webconsole.bundleinfo;version=1.0.0;provide:=true,
             org.apache.felix.webconsole.i18n;version=1.0.0;provide:=true
         </webconsole.exports>

Modified: felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java?rev=1662638&r1=1662637&r2=1662638&view=diff
==============================================================================
--- felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java (original)
+++ felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/AbstractWebConsolePlugin.java Fri Feb 27 05:59:41 2015
@@ -737,6 +737,9 @@ public abstract class AbstractWebConsole
             SortedMap categoryMap = sortMenuCategoryMap( menuMap, appRoot );
             pw.println( "<ul id=\"navmenu\">" );
             renderSubmenu( categoryMap, appRoot, pw, 0 );
+            pw.println("<li class=\"logoutButton navMenuItem-0\">");
+            pw.println("<a href=\"" + appRoot + "/logout\">${logout}</a>");
+            pw.println("</li>");
             pw.println( "</ul>" );
         }
     }

Modified: felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java?rev=1662638&r1=1662637&r2=1662638&view=diff
==============================================================================
--- felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java (original)
+++ felix/trunk/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java Fri Feb 27 05:59:41 2015
@@ -53,6 +53,8 @@ import org.apache.felix.webconsole.Abstr
 import org.apache.felix.webconsole.BrandingPlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
 import org.apache.felix.webconsole.WebConsoleSecurityProvider;
+import org.apache.felix.webconsole.WebConsoleSecurityProvider2;
+import org.apache.felix.webconsole.WebConsoleSecurityProvider3;
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.Util;
 import org.apache.felix.webconsole.internal.core.BundlesServlet;
@@ -168,6 +170,10 @@ public class OsgiManager extends Generic
 
     static final String DEFAULT_HTTP_SERVICE_SELECTOR = ""; //$NON-NLS-1$
 
+    private static final String HEADER_AUTHORIZATION = "Authorization"; //$NON-NLS-1$
+
+    private static final String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; //$NON-NLS-1$
+
     /**
      * The default value for the {@link #PROP_MANAGER_ROOT} configuration
      * property (value is "/system/console").
@@ -514,10 +520,16 @@ public class OsgiManager extends Generic
             }
             path = path.concat(holder.getDefaultPluginLabel());
             response.sendRedirect(path);
+            response.setContentLength(0);
             return;
         }
 
-        int slash = pathInfo.indexOf("/", 1);
+        if (pathInfo.equals("/logout")) { //$NON-NLS-1$
+            logout(request, response);
+            return;
+        }
+
+        int slash = pathInfo.indexOf("/", 1); //$NON-NLS-1$
         if (slash < 2)
         {
             slash = pathInfo.length();
@@ -568,6 +580,63 @@ public class OsgiManager extends Generic
         }
     }
 
+    private final void logout(HttpServletRequest request, HttpServletResponse response)
+        throws IOException
+    {
+        // check if special logout cookie is set, this is used to prevent
+        // from an endless loop with basic auth
+        Cookie[] cookies = request.getCookies();
+        boolean found = false;
+        if ( cookies != null )
+        {
+            for(int i=0;i<cookies.length;i++)
+            {
+                if ( cookies[i].getName().equals("logout") ) //$NON-NLS-1$
+                {
+                    found = true;
+                    break;
+                }
+            }
+        }
+        if ( found )
+        {
+            // redirect to main page
+            String url = request.getRequestURI();
+            final int lastSlash = url.lastIndexOf('/');
+            final Cookie c = new Cookie("logout", "true"); //$NON-NLS-1$ //$NON-NLS-2$
+            c.setMaxAge(0);
+            response.addCookie(c);
+            response.sendRedirect(url.substring(0, lastSlash));
+            return;
+        }
+        Object securityProvider = securityProviderTracker.getService();
+        if (securityProvider instanceof WebConsoleSecurityProvider3)
+        {
+            ((WebConsoleSecurityProvider3) securityProvider).logout(request, response);
+        }
+        else
+        {
+            // if the security provider doesn't support logout, we try to
+            // logout the default basic authentication mechanism
+            // See https://issues.apache.org/jira/browse/FELIX-3006
+
+            // check for basic authentication
+            String auth = request.getHeader(HEADER_AUTHORIZATION); //$NON-NLS-1$
+            if (null != auth && auth.toLowerCase().startsWith("basic ")) { //$NON-NLS-1$
+                Map config = getConfiguration();
+                String realm = ConfigurationUtil.getProperty(config, PROP_REALM, DEFAULT_REALM);
+                response.setHeader(HEADER_WWW_AUTHENTICATE, "Basic realm=\"" +  realm + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+                response.addCookie(new Cookie("logout", "true")); //$NON-NLS-1$ //$NON-NLS-2$
+                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+            }
+        }
+
+        // clean-up
+        request.removeAttribute(HttpContext.REMOTE_USER);
+        request.removeAttribute(HttpContext.AUTHORIZATION);
+        request.removeAttribute(WebConsoleSecurityProvider2.USER_ATTRIBUTE);
+    }
+
     private final AbstractWebConsolePlugin getConsolePlugin(final String label)
     {
         // backwards compatibility for the former "install" action which is

Modified: felix/trunk/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties?rev=1662638&r1=1662637&r2=1662638&view=diff
==============================================================================
--- felix/trunk/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties (original)
+++ felix/trunk/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties Fri Feb 27 05:59:41 2015
@@ -46,6 +46,7 @@ save=Save
 reset=Reset
 delete=Delete
 refresh=Refresh
+logout=Log out
 
 # VMStat plugin
 vmstat.pluginTitle=System Information

Modified: felix/trunk/webconsole/src/main/resources/res/ui/webconsole.css
URL: http://svn.apache.org/viewvc/felix/trunk/webconsole/src/main/resources/res/ui/webconsole.css?rev=1662638&r1=1662637&r2=1662638&view=diff
==============================================================================
--- felix/trunk/webconsole/src/main/resources/res/ui/webconsole.css (original)
+++ felix/trunk/webconsole/src/main/resources/res/ui/webconsole.css Fri Feb 27 05:59:41 2015
@@ -189,8 +189,11 @@ ul.icons li {
 	list-style: none
 }
 /* language selection element */
-#langSelect { position: absolute;	top: 5px; right: 5px }
+#langSelect { position: absolute; top: 5px; right: 5px }
 #langSelect img   { display: block; padding: 2px 0 }
+/* logout element */
+.logoutButton { float: right; text-decoration: none }
+
 
 .filterBox      { float: left; margin-left: 1em }
 .servicesFilter { width: 400px; }