Working login + connection list UI stub.
authorMichael Jumper <zhangmaike@users.sourceforge.net>
Thu, 11 Aug 2011 16:57:25 +0000 (09:57 -0700)
committerMichael Jumper <zhangmaike@users.sourceforge.net>
Thu, 11 Aug 2011 16:57:25 +0000 (09:57 -0700)
src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java [new file with mode: 0644]
src/main/webapp/WEB-INF/web.xml
src/main/webapp/index.xhtml
src/main/webapp/styles/login.css

diff --git a/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java b/src/main/java/net/sourceforge/guacamole/net/basic/BasicLogin.java
new file mode 100644 (file)
index 0000000..1702421
--- /dev/null
@@ -0,0 +1,88 @@
+package net.sourceforge.guacamole.net.basic;
+
+/*
+ *  Guacamole - Clientless Remote Desktop
+ *  Copyright (C) 2010  Michael Jumper
+ *
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Affero General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import net.sourceforge.guacamole.GuacamoleException;
+import net.sourceforge.guacamole.protocol.GuacamoleConfiguration;
+import net.sourceforge.guacamole.properties.GuacamoleProperties;
+import net.sourceforge.guacamole.net.basic.properties.BasicGuacamoleProperties;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BasicLogin extends HttpServlet {
+
+    private Logger logger = LoggerFactory.getLogger(BasicLogin.class);
+    
+    private AuthenticationProvider authProvider;
+
+    @Override
+    public void init() throws ServletException {
+
+        // Get auth provider instance
+        try {
+            authProvider = GuacamoleProperties.getProperty(BasicGuacamoleProperties.AUTH_PROVIDER);
+        }
+        catch (GuacamoleException e) {
+            logger.error("Error getting authentication provider from properties.", e);
+            throw new ServletException(e);
+        }
+
+    }
+
+    @Override
+    protected void service(HttpServletRequest request, HttpServletResponse response)
+    throws IOException {
+
+        HttpSession httpSession = request.getSession(true);
+
+        // Retrieve username and password from parms
+        String username = request.getParameter("username");
+        String password = request.getParameter("password");
+
+        // Get authorized config
+        GuacamoleConfiguration config;
+        try {
+            config = authProvider.getAuthorizedConfiguration(username, password);
+        }
+        catch (GuacamoleException e) {
+            logger.error("Error retrieving authorized configuration for user {}.", username);
+            response.sendError(HttpServletResponse.SC_FORBIDDEN);
+            return;
+        }
+        
+        if (config == null) {
+            logger.warn("Failed login from {} for user \"{}\".", request.getRemoteAddr(), username);
+            response.sendError(HttpServletResponse.SC_FORBIDDEN);
+            return;
+        }
+
+        logger.info("Successful login from {} for user \"{}\".", request.getRemoteAddr(), username);
+
+        httpSession.setAttribute("GUAC_AUTH_CONFIGS", new Integer(0));
+
+    }
+
+}
+
index e7e964e..3983287 100644 (file)
         </session-timeout>
     </session-config>
 
+    <!-- Basic Login Servlet -->
+    <servlet>
+        <description>Login servlet.</description>
+        <servlet-name>Login</servlet-name>
+        <servlet-class>net.sourceforge.guacamole.net.basic.BasicLogin</servlet-class>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>Login</servlet-name>
+        <url-pattern>/login</url-pattern>
+    </servlet-mapping>
+
     <!-- Guacamole Tunnel Servlet -->
     <servlet>
         <description>Tunnel servlet.</description>
index dabd762..92fc1ed 100644 (file)
@@ -29,7 +29,7 @@
 
     <body>
 
-        <div id="login-ui">
+        <div id="login-ui" style="display: none">
             <div id="login-dialog-middle">
 
                 <div id="login-dialog">
                     </form>
                 </div>
 
-                <div id="version-dialog">
-                    Guacamole ${project.version}
-                </div>
-
             </div>
         </div>
 
-        <!-- Main UI - hidden until login succeeds -->
+        <!-- Connection list UI -->
         <div id="connection-list-ui" style="display: none">
-            <!-- STUB -->
+
+            <h1>
+                <img class="logo" src="images/guacamole-logo-64.png" alt=""/>
+                Available Connections
+            </h1>
+            
+            <table class="connections">
+                <thead>
+                    <tr>
+                        <th>Name</th>
+                        <th>Protocol</th>
+                        <th>Description</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <tr>
+                        <td>zhz@localhost</td>
+                        <td>vnc</td>
+                        <td class="description">Connect to test.guac-dev.org via vnc.</td>
+                    </tr>
+                    <tr>
+                        <td>zhz@localhost</td>
+                        <td>ssh</td>
+                        <td class="description">Connect to test.guac-dev.org via ssh.</td>
+                    </tr>
+                </tbody>
+            </table>
+
         </div>
 
+        <div id="version-dialog">
+            Guacamole ${project.version}
+        </div>
 
         <!-- Init -->
         <script type="text/javascript"> /* <![CDATA[ */
 
             var loginForm = document.getElementById("login-form");
             var loginUI = document.getElementById("login-ui");
-            var display = document.getElementById("display");
+            var connectionListUI = document.getElementById("connection-list-ui");
 
             // TODO: Get connection list
             // On no-auth fail, show login UI 
                     + "&password=" + encodeURIComponent(password.value)
 
                 try {
-                    // STUB
+
+                    // Log in
+                    var xhr = new XMLHttpRequest();
+                    xhr.open("POST", "login", false);
+                    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+                    xhr.send(data);
+
+                    // Handle failures
+                    if (xhr.status != 200)
+                        throw new Error("Invalid login");
+
+                    // Hide login UI, display connections
+                    loginUI.style.display = "none";
+                    connectionListUI.style.display = "";
+
                 }
                 catch (e) {
 
 
             }
 
+            loginUI.style.display = "";
+
             /* ]]> */ </script>
 
     </body>
index 87798ae..a64b406 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 body {
-    background: black;
+    background: gray;
     font-family: sans-serif;
     padding: 0;
     margin: 0;
@@ -114,7 +114,7 @@ div#login-dialog #login-fields img.logo {
     float: left;
 }
 
-div#login-ui #version-dialog {
+div#version-dialog {
     position: fixed;
     right: 0;
     bottom: 0;
@@ -136,3 +136,57 @@ img#license {
     float: right;
     margin: 2px;
 }
+
+div#connection-list-ui {
+    background: #BCA;
+}
+
+div#connection-list-ui table {
+    width: 100%;
+    border-collapse: collapse;
+}
+
+div#connection-list-ui table thead {
+    background: #9A8;
+}
+
+div#connection-list-ui table thead tr {
+    border-top:    1px solid #676;
+    border-bottom: 1px solid gray;
+}
+
+div#connection-list-ui table tbody {
+    background: white;
+}
+
+div#connection-list-ui table tbody tr {
+    border-top:    1px solid gray;
+    border-bottom: 1px solid gray;
+}
+
+div#connection-list-ui table td {
+    padding: 0.25em;
+    text-align: center;
+}
+
+div#connection-list-ui table tbody tr:nth-child(even)       { background: #CCC; }
+div#connection-list-ui table tbody tr:nth-child(odd)       { background: #EEE; }
+
+div#connection-list-ui table td.description {
+    text-align: left;
+}
+
+div#connection-list-ui h1 {
+    
+    margin: 0;
+    padding: 0.5em;
+
+    font-size: 2em;
+    vertical-align: middle;
+    text-align: center;
+
+}
+
+div#connection-list-ui img {
+    vertical-align: middle;
+}
\ No newline at end of file