You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2016/01/08 17:55:50 UTC

svn commit: r1723762 - in /qpid/java/trunk/broker-plugins/management-http/src/main/java/resources: ./ js/qpid/authorization/ js/qpid/management/ js/qpid/sasl/ js/qpid/sasl/cram-md5-hex/ js/qpid/sasl/cram-md5/ js/qpid/sasl/plain/

Author: orudyy
Date: Fri Jan  8 16:55:50 2016
New Revision: 1723762

URL: http://svn.apache.org/viewvc?rev=1723762&view=rev
Log:
QPID-6917: Change existing sasl client interfaces to give entire control over authentication procedure to implementation; change existing sasl imlementations to adhere to new interfaces

Added:
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/CredentialBasedSaslClient.js
Removed:
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/authorization/
Modified:
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/Authenticator.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/SaslClient.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/ShaSaslClient.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/UsernamePasswordProvider.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5-hex/SaslClient.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5/SaslClient.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/plain/SaslClient.js
    qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/login.html

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/index.html Fri Jan  8 16:55:50 2016
@@ -63,13 +63,15 @@
         require([
                     "dojo/parser",
                     "dojo/query",
-                    "qpid/authorization/checkUser",
                     "qpid/common/ConsoleHelper",
                     "qpid/management/Management",
                     "qpid/common/util",
                     "qpid/management/treeView",
                     "qpid/management/controller",
                     "qpid/common/updater",
+                    "dojox/html/entities",
+                    "dijit/registry",
+                    "dojo/dom",
                     "dijit/layout/BorderContainer",
                     "dijit/layout/TabContainer",
                     "dijit/layout/ContentPane",
@@ -77,18 +79,36 @@
                     "dijit/Menu",
                     "dijit/MenuItem",
                     "qpid/common/footer"
-                    ], function(parser, query, User, ConsoleHelper, Management, util, treeView, controller, updater){
+                    ], function(parser, query, ConsoleHelper, Management, util, treeView, controller, updater, entities, registry, dom){
                         parser.parse();
                         qpidManagementHelper = ConsoleHelper;
                         management = new Management("",util.xhrErrorHandler);
-                        management.init(function()
+                        management.authenticate().then(function(data)
                         {
-                            updater.registerUpdateIntervalListener(management.userPreferences);
-                            qpidManagementHelper.management = management;
-                            User.getUserAndUpdateUI(management);
-                            controller.init(management);
-                            treeView.create(getContextPath() + 'service/structure', management, query('div[qpid-type="treeView"]')[0]);
-                            dijit.Tooltip.defaultPosition = ["after-centered", "below-centered"];
+                          if(data.user)
+                          {
+                            var userName = entities.encode(String(data.user));
+                            var controlButton = registry.byId("authenticatedUserControls");
+                            if (controlButton)
+                            {
+                              controlButton.set("label", userName);
+                            }
+                            dom.byId("authenticatedUser").innerHTML = userName;
+                            dom.byId("login").style.display = "inline";
+                            management.init(function()
+                            {
+                              updater.registerUpdateIntervalListener(management.userPreferences);
+                              qpidManagementHelper.management = management;
+                              controller.init(management);
+                              treeView.create(getContextPath() + 'service/structure', management, query('div[qpid-type="treeView"]')[0]);
+                              dijit.Tooltip.defaultPosition = ["after-centered", "below-centered"];
+                            });
+                          }
+                          else
+                          {
+                            alert("User identifier is not found! Re-authenticate!");
+                            window.location = "logout";
+                          }
                         });
                     });
     </script>

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Management.js Fri Jan  8 16:55:50 2016
@@ -24,10 +24,12 @@ define(["dojo/_base/lang",
         "dojo/io-query",
         "dojo/json",
         "dojo/promise/Promise",
+        "dojo/Deferred",
+        "qpid/sasl/Authenticator",
         "qpid/common/metadata",
         "qpid/common/timezone",
         "qpid/management/UserPreferences"],
-  function (lang, array, xhr, ioQuery, json, Promise, Metadata, Timezone, UserPreferences)
+  function (lang, array, xhr, ioQuery, json, Promise, Deferred, sasl, Metadata, Timezone, UserPreferences)
   {
 
     function shallowCopy(source, target, excludes)
@@ -482,5 +484,62 @@ define(["dojo/_base/lang",
         this.userPreferences.load(callback, callback);
     };
 
+    var saslServiceUrl = "service/sasl";
+
+    Management.prototype.getSaslStatus = function()
+    {
+        return this.get({url: saslServiceUrl});
+    }
+
+    Management.prototype.sendSaslResponse = function(response)
+    {
+        return this.submit({
+                              url: saslServiceUrl,
+                              data: response,
+                              headers: {},
+                              method: "POST"
+                           });
+    };
+
+    Management.prototype.authenticate = function(forceAuthentication)
+    {
+        var that = this;
+        var deferred = new Deferred();
+        var successCallback = function(data)
+                              {
+                                that.getSaslStatus().then(function(saslData)
+                                                          {
+                                                            if (saslData.user)
+                                                            {
+                                                                deferred.resolve(saslData);
+                                                            }
+                                                            else
+                                                            {
+                                                                deferred.reject({message: "User identifier is not found!"
+                                                                                          + " Authentication failed!"});
+                                                            }
+                                                          },
+                                                          failureCallback);
+                              };
+        var failureCallback = function(data)
+                              {
+                                deferred.reject(data);
+                              };
+        this.getSaslStatus().then(function(data)
+                                             {
+                                                if (data.user && !forceAuthentication)
+                                                {
+                                                    deferred.resolve(data);
+                                                }
+                                                else
+                                                {
+                                                    sasl.authenticate(data.mechanisms, that).then(successCallback,
+                                                                                                  failureCallback);
+                                                }
+                                             },
+                                             failureCallback);
+        return deferred.promise;
+    };
+
     return Management;
   });

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/Authenticator.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/Authenticator.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/Authenticator.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/Authenticator.js Fri Jan  8 16:55:50 2016
@@ -18,71 +18,14 @@
  * under the License.
  *
  */
-define(["dojo/_base/lang"], function (lang)
+define(["dojo/_base/lang", "dojo/Deferred", "dojo/json"], function (lang, Deferred, json)
 {
-    var saslServiceUrl = "service/sasl";
-    var errorHandler = function errorHandler(error)
-    {
-        if (error.response)
-        {
-            if(error.response.status == 401)
-            {
-                alert("Authentication Failed");
-            }
-            else if(error.response.status == 403)
-            {
-                alert("Authorization Failed");
-            }
-            else
-            {
-                alert(error.message);
-            }
-        }
-        else
-        {
-            alert(error.message ? error.message : error);
-        }
-    }
-
-    var authenticate = function (management, saslClient, data, authenticationSuccessCallback, authenticationFailureCallback)
-    {
-        var response = null;
-        try
-        {
-            response = saslClient.getResponse(data);
-        }
-        catch(e)
-        {
-            authenticationFailureCallback(e);
-            return;
-        }
-
-        if (saslClient.isComplete())
-        {
-            authenticationSuccessCallback();
-        }
-        else
-        {
-            management.submit({
-                                  url: saslServiceUrl,
-                                  data: response,
-                                  headers: {},
-                                  method: "POST"
-                              }).then(function (challenge)
-                                      {
-                                        authenticate(management,
-                                                     saslClient,
-                                                     challenge,
-                                                     authenticationSuccessCallback,
-                                                     authenticationFailureCallback);
-                                      },
-                                      authenticationFailureCallback);
-        }
-    }
 
-    var loadSaslClients = function loadSaslClients(management, availableMechanisms, saslClients, onLastLoaded)
+    var loadSaslClients = function loadSaslClients(availableMechanisms, management, onLastLoaded, errorHandler)
     {
         var mechanisms = lang.clone(availableMechanisms);
+        var saslClients = [];
+
         var handleMechanisms = function handleMechanisms()
         {
             if (mechanisms.length == 0)
@@ -91,109 +34,95 @@ define(["dojo/_base/lang"], function (la
             }
             else
             {
-                loadSaslClients(management, mechanisms, saslClients, onLastLoaded);
+                loadSaslClient();
             }
         }
 
-        var mechanism = mechanisms.shift();
-        if (mechanism)
+        var loadSaslClient = function loadSaslClient()
         {
-          var url = "qpid/sasl/" + encodeURIComponent(mechanism.toLowerCase()) + "/SaslClient";
-          management.get({url:"js/" + url + ".js",
-                          handleAs: "text",
-                          headers: { "Content-Type": "text/plain"}})
-                    .then(function(data)
-                          {
-                              require([url],
-                                      function(SaslClient)
-                                      {
-                                          try
-                                          {
-                                              var saslClient = new SaslClient();
-                                              saslClient.initialized().then(function()
-                                                                            {
-                                                                                saslClients.push(saslClient);
-                                                                                handleMechanisms();
-                                                                            },
-                                                                            function(e)
-                                                                            {
-                                                                                errorHandler("Unexpected error on " +
-                                                                                             "loading of mechanism " +
-                                                                                             mechanism + ": ", e);
-                                                                                handleMechanisms();
-                                                                            }
-                                                                           );
-
-                                          }
-                                          catch(e)
+            var mechanism = mechanisms.shift();
+            if (mechanism)
+            {
+              var url = "qpid/sasl/" + encodeURIComponent(mechanism.toLowerCase()) + "/SaslClient";
+              management.get({url:"js/" + url + ".js",
+                              handleAs: "text",
+                              headers: { "Content-Type": "text/plain"}})
+                        .then(function(data)
+                              {
+                                  require([url],
+                                          function(SaslClient)
                                           {
-                                              errorHandler("Unexpected error on loading of mechanism " + mechanism +
-                                                           ": ", e);
-                                              handleMechanisms();
-                                          }
-                                      });
-                          },
-                          function(data)
-                          {
-                              if (data.response.status != 404 )
+                                              try
+                                              {
+                                                  var saslClient = new SaslClient();
+                                                  saslClients.push(saslClient);
+                                              }
+                                              catch(e)
+                                              {
+                                                  console.error("Unexpected error on loading of mechanism " +
+                                                                mechanism + ": " + json.stringify(e));
+                                              }
+                                              finally
+                                              {
+                                                handleMechanisms();
+                                              }
+                                          });
+                              },
+                              function(data)
                               {
-                                  errorHandler("Unexpected error on loading mechanism " + mechanism + ": ", data);
+                                  if (data.response.status != 404 )
+                                  {
+                                      console.error("Unexpected error on loading mechanism " +
+                                                   mechanism +
+                                                   ": " +
+                                                   json.stringify(data));
+                                  }
+                                  handleMechanisms();
                               }
-                              handleMechanisms();
-                          }
-                    );
-        }
-        else
-        {
-            handleMechanisms();
+                        );
+            }
+            else
+            {
+                handleMechanisms();
+            }
         }
+
+        handleMechanisms();
     }
 
     return {
-              authenticate:   function(management, authenticationSuccessCallback)
-                              {
-                                  management.get({url: saslServiceUrl})
-                                            .then(function(data)
-                                                  {
-                                                     var saslClients = [];
-                                                     loadSaslClients(management,
-                                                                     data.mechanisms,
-                                                                     saslClients,
-                                                                     function (saslClients)
-                                                                     {
-                                                                        saslClients.sort(function(c1, c2)
-                                                                                         {
-                                                                                           return c2.getPriority() -
-                                                                                                  c1.getPriority();
-                                                                                         });
-                                                                        if (saslClients.length > 0)
-                                                                        {
-                                                                          var saslClient = saslClients[0];
-                                                                          dojo.when(saslClient.getCredentials())
-                                                                              .then(function(data)
-                                                                                    {
-                                                                                        authenticate(management,
-                                                                                                     saslClient,
-                                                                                                     data,
-                                                                                                     authenticationSuccessCallback,
-                                                                                                     errorHandler);
-                                                                                    },
-                                                                                    errorHandler);
-                                                                        }
-                                                                        else
-                                                                        {
-                                                                          errorHandler("No SASL client available for " +
-                                                                                       data.mechanisms);
-                                                                        }
-                                                                     });
-                                                  },
-                                                  errorHandler);
-                              },
-              getUser:        function(management, authenticationSuccessCallback)
+              authenticate:   function(mechanisms, management)
                               {
-                                  management.get({url: saslServiceUrl})
-                                            .then(authenticationSuccessCallback,
-                                                  errorHandler);
+                                   var deferred = new Deferred();
+                                   var successCallback = function(data)
+                                                         {
+                                                           deferred.resolve(data);
+                                                         };
+                                   var failureCallback = function(data)
+                                                         {
+                                                           deferred.reject(data);
+                                                         };
+                                   loadSaslClients(mechanisms,
+                                                   management,
+                                                   function (saslClients)
+                                                   {
+                                                      if (saslClients.length > 0)
+                                                      {
+                                                        saslClients.sort(function(c1, c2)
+                                                                         {
+                                                                           return c2.getPriority() - c1.getPriority();
+                                                                         });
+                                                        saslClients[0].authenticate(management).then(successCallback,
+                                                                                                     failureCallback);
+                                                      }
+                                                      else
+                                                      {
+                                                        failureCallback({message:"No SASL client available for " +
+                                                                                      data.mechanisms});
+                                                      }
+                                                   },
+                                                   failureCallback);
+                                   return deferred.promise;
                               }
            };
 });

Added: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/CredentialBasedSaslClient.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/CredentialBasedSaslClient.js?rev=1723762&view=auto
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/CredentialBasedSaslClient.js (added)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/CredentialBasedSaslClient.js Fri Jan  8 16:55:50 2016
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+define(["dojo/_base/declare",
+        "dojo/_base/lang",
+        "dojox/encoding/base64",
+        "dojo/json",
+        "dojo/request/script",
+        "dojox/uuid/generateRandomUuid",
+        "dojo/Deferred",
+        "qpid/sasl/SaslClient"],
+       function(declare, lang, base64, json, script, uuid, Deferred, SaslClient)
+       {
+         return declare("qpid.sasl.CredentialBasedSaslClient",
+                        [SaslClient],
+                        {
+                            getResponse:      function(challenge)
+                                              {
+                                                  // summary:
+                                                  //        Generates response for given challenge
+                                                  // description:
+                                                  //        Handles given challenge represented as
+                                                  //       JSON object and generates response in
+                                                  //       JSON format.
+                                                  //       Method can be called multiple times
+                                                  //       for different challenges.
+                                                  //       Throws exception on various errors or
+                                                  //       authentication failures.
+                                                  // returns: JSON objectSa
+                                                  throw new TypeError("abstract");
+                                              },
+                            isComplete:       function()
+                                              {
+                                                  // summary:
+                                                  //        Returns true when no more response generation is required.
+                                                  // description:
+                                                  //        Returns true when challenge handling is complete
+                                                  // returns: boolean
+                                                  throw new TypeError("abstract");
+                                              },
+                            getCredentials:   function()
+                                              {
+                                                  // summary:
+                                                  //        Returns initial credentials
+                                                  //       to start authentication
+                                                  // description:
+                                                  //        Provides initial credentials as Promise or
+                                                  //        JSON object to start authentication process
+                                                  // returns: promise
+                                                  throw new TypeError("abstract");
+                                              },
+                            toString:         function()
+                                              {
+                                                  return "[object CredentialBasedSaslClient]";
+                                              },
+                            authenticate:     function (management)
+                                              {
+                                                  var deferred = new Deferred();
+                                                  var successCallback = function(data)
+                                                                        {
+                                                                          deferred.resolve(data);
+                                                                        };
+                                                  var failureCallback = function(data)
+                                                                        {
+                                                                          deferred.reject(data);
+                                                                        };
+
+                                                  var saslClient = this;
+                                                  var processChallenge = function processChallenge(challenge)
+                                                  {
+                                                    if (saslClient.isComplete())
+                                                    {
+                                                        successCallback(true);
+                                                        return;
+                                                    }
+
+                                                    var response = null;
+                                                    try
+                                                    {
+                                                        response = saslClient.getResponse(challenge);
+                                                    }
+                                                    catch(e)
+                                                    {
+                                                        failureCallback(e);
+                                                        return;
+                                                    }
+
+                                                    if (saslClient.isComplete() && (response == null || response == undefined))
+                                                    {
+                                                        successCallback(true);
+                                                    }
+                                                    else
+                                                    {
+                                                        management.sendSaslResponse(response)
+                                                                  .then(function(challenge)
+                                                                        {
+                                                                          processChallenge(challenge);
+                                                                        });
+                                                    }
+                                                  };
+
+                                                  dojo.when(this.getCredentials()).then(function(data)
+                                                                                        {
+                                                                                           processChallenge(data);
+                                                                                        },
+                                                                                        failureCallback);
+                                                  return deferred.promise;
+                                              }
+                        });
+       });

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/SaslClient.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/SaslClient.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/SaslClient.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/SaslClient.js Fri Jan  8 16:55:50 2016
@@ -38,28 +38,15 @@ define(["dojo/_base/lang"],
                                                       // returns: string
                                                       throw new TypeError("abstract");
                                                   },
-                                getResponse:      function(challenge)
+                                authenticate:     function(management)
                                                   {
                                                       // summary:
-                                                      //        Generates response for given challenge
+                                                      //        Authenticates and invokes callback function
+                                                      //                                  on successful authentication
                                                       // description:
-                                                      //        Handles given challenge represented as
-                                                      //       JSON object and generates response in
-                                                      //       JSON format.
-                                                      //       Method can be called multiple times
-                                                      //       for different challenges.
-                                                      //       Throws exception on various errors or
-                                                      //       authentication failures.
-                                                      // returns: JSON objectSa
-                                                      throw new TypeError("abstract");
-                                                  },
-                                isComplete:       function()
-                                                  {
-                                                      // summary:
-                                                      //        Returns true when response for last challenge is generated.
-                                                      // description:
-                                                      //        Returns true when challenge handling is complete
-                                                      // returns: boolean
+                                                      //        Performs SASL authentication as required by algorithm
+                                                      //        and returns promise
+                                                      // returns: promise
                                                       throw new TypeError("abstract");
                                                   },
                                 getPriority:      function()
@@ -78,28 +65,6 @@ define(["dojo/_base/lang"],
                                                       // returns: string
                                                       //        Returns `[object SaslClient]`.
                                                       return "[object SaslClient]";
-                                                  },
-                                initialized:      function()
-                                                  {
-                                                      // summary:
-                                                      //        Finish instance initialization.
-                                                      // description:
-                                                      //        Method must be called once before
-                                                      //        getResponse in order to finish initialization.
-                                                      //        dojo/promise/Promise is returned
-                                                      // returns: promise
-                                                      throw new TypeError("abstract");
-                                                  },
-                                getCredentials:   function()
-                                                  {
-                                                      // summary:
-                                                      //        Returns initial credentials
-                                                      //       to start authentication
-                                                      // description:
-                                                      //        Provides initial credentials as Promise or
-                                                      //        JSON object to start authentication process
-                                                      // returns: promise
-                                                      throw new TypeError("abstract");
                                                   }
                                 });
        });

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/ShaSaslClient.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/ShaSaslClient.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/ShaSaslClient.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/ShaSaslClient.js Fri Jan  8 16:55:50 2016
@@ -24,7 +24,7 @@ define(["dojo/_base/declare",
         "dojo/request/script",
         "dojox/uuid/generateRandomUuid",
         "dojo/Deferred",
-        "qpid/sasl/SaslClient",
+        "qpid/sasl/CredentialBasedSaslClient",
         "qpid/sasl/UsernamePasswordProvider"],
         function(declare, lang, base64, json, script, uuid, Deferred, SaslClient, UsernamePasswordProvider)
         {
@@ -101,7 +101,7 @@ define(["dojo/_base/declare",
           var digest = null;
           var hmac = null;
           var gs2_header= "n,,";
-          var deferred = new Deferred();
+          var initialized = new Deferred();
           return declare("qpid.sasl.ShaSaslClient",
                          [SaslClient],
                          {
@@ -123,28 +123,27 @@ define(["dojo/_base/declare",
                                                         script.get("js/crypto-js/enc-base64-min.js").then(
                                                           function()
                                                           {
-                                                            deferred.resolve("initialized");
+                                                            initialized.resolve(true);
                                                           },
                                                           function(error)
                                                           {
-                                                            deferred.reject("initialization failure: " + error);
+                                                            initialized.reject(error);
                                                             scriptLoadError(error);
                                                           }
                                                          );
                                                       },
                                                       function(error)
                                                       {
-                                                        deferred.reject("error");
+                                                        initialized.reject("error");
                                                         scriptLoadError(error);
                                                       }
                                                     );
                                                  },
-                             initialized:        function() { return deferred.promise; },
                              getMechanismName:   function() { return this._mechanism;},
                              isComplete:         function() { return this._state == "completed";},
                              getResponse:        function(data)
                                                  {
-                                                    if (deferred.promise.isResolved())
+                                                    if (initialized.promise.isResolved())
                                                     {
                                                         return this._getResponse(data);
                                                     }
@@ -242,7 +241,25 @@ define(["dojo/_base/declare",
                              toString:           function() { return "[SaslClient" + this.getMechanismName() + "]";},
                              getCredentials:     function()
                                                  {
-                                                    return UsernamePasswordProvider.get();
+                                                    var credentials = new Deferred();
+                                                    var successHandler = function(data)
+                                                                         {
+                                                                            credentials.resolve(data);
+                                                                         };
+                                                    var errorHandler = function(data)
+                                                                       {
+                                                                        credentials.reject(data)
+                                                                       };
+                                                    initialized.then(function(initData)
+                                                                     {
+                                                                       dojo.when(UsernamePasswordProvider.get())
+                                                                           .then(function(data)
+                                                                                 {
+                                                                                   successHandler(data);
+                                                                                 },
+                                                                                 errorHandler);
+                                                                     },errorHandler);
+                                                    return credentials.promise;
                                                  }
                  }
           );

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/UsernamePasswordProvider.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/UsernamePasswordProvider.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/UsernamePasswordProvider.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/UsernamePasswordProvider.js Fri Jan  8 16:55:50 2016
@@ -25,6 +25,14 @@ define(["dijit/registry",
             return {
                         get: function()
                              {
+                                 if (registry.byId("username") == null)
+                                 {
+                                    // it is not a login page
+                                    // redirecting to login.html
+                                    window.location = "login.html";
+                                    return;
+                                 }
+
                                  return {
                                             username: registry.byId("username").value,
                                             password: registry.byId("password").value

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5-hex/SaslClient.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5-hex/SaslClient.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5-hex/SaslClient.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5-hex/SaslClient.js Fri Jan  8 16:55:50 2016
@@ -28,11 +28,10 @@ define(["dojo/_base/declare",
             return declare("qpid.sasl.SaslClientCramMD5Hex", [SaslClientCramMD5],{
                  getMechanismName:   function() {return "CRAM-MD5-HEX";},
                  getPriority:        function() {return 2;},
-                 _initial:           function(data)
+                 initialize:         function(username, password)
                                      {
-                                        var hashedPassword = MD5(data.password, digestsBase.outputTypes.Hex);
-                                        this._password = hashedPassword;
-                                        this._username = data.username;
+                                        var hashedPassword = MD5(password, digestsBase.outputTypes.Hex);
+                                        this.inherited(arguments, [username, hashedPassword]);
                                      },
                  toString:           function() { return "[SaslClientCramMD5Hex]";}
             });

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5/SaslClient.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5/SaslClient.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5/SaslClient.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/cram-md5/SaslClient.js Fri Jan  8 16:55:50 2016
@@ -22,18 +22,14 @@ define(["dojo/_base/declare",
         "dojox/encoding/base64",
         "dojox/encoding/digests/_base",
         "dojox/encoding/digests/MD5",
-        "dojo/Deferred",
-        "qpid/sasl/SaslClient",
+        "qpid/sasl/CredentialBasedSaslClient",
         "qpid/sasl/UsernamePasswordProvider"],
-       function(declare, lang, base64, digestsBase, MD5, Deferred, SaslClient, UsernamePasswordProvider)
+       function(declare, lang, base64, digestsBase, MD5, SaslClient, UsernamePasswordProvider)
        {
-           var deferred = new Deferred();
-           deferred.resolve("initialized");
            return declare("qpid.sasl.SaslClientCramMD5",
                           [SaslClient],
                           {
                               _state:            "initial",
-                              initialized:       function() { return deferred.promise;},
                               getMechanismName:  function() {return "CRAM-MD5";},
                               isComplete:        function() {return this._state == "completed";},
                               getPriority:       function() {return 3;},
@@ -41,7 +37,7 @@ define(["dojo/_base/declare",
                                                  {
                                                     if (this._state == "initial")
                                                     {
-                                                      this._initial(data);
+                                                      this.initialize(data.username, data.password);
                                                       this._state = "initiated";
                                                       return {
                                                                  mechanism: this.getMechanismName()
@@ -65,35 +61,30 @@ define(["dojo/_base/declare",
                                                       var id = data.id;
 
                                                       var response = base64.encode(this._encodeUTF8( digest ));
-                                                      this._state = "generated";
+                                                      this._state = "completed";
                                                       return {
                                                                  id: id,
                                                                  response: response
                                                              };
                                                     }
-                                                    else if (this._state == "generated")
-                                                    {
-                                                      this._state = "completed";
-                                                      return null;
-                                                    }
                                                     else
                                                     {
                                                       throw {message: "Unexpected state '" + this._state +
                                                                       ". Cannot handle challenge!"};
                                                     }
-                                                             },
-                              toString:           function() { return "[SaslClientCramMD5]";},
-                              getCredentials:     function()
-                                                  {
+                                                 },
+                              toString:          function() { return "[SaslClientCramMD5]";},
+                              getCredentials:    function()
+                                                 {
                                                       return UsernamePasswordProvider.get();
-                                                  },
-                              _initial   :        function(data)
-                                                  {
-                                                     this._password = data.password;
-                                                     this._username = data.username;
-                                                  },
-                              _encodeUTF8:        function (str)
-                                                  {
+                                                 },
+                              initialize   :     function(username, password)
+                                                 {
+                                                     this._password = password;
+                                                     this._username = username;
+                                                 },
+                              _encodeUTF8:       function (str)
+                                                 {
                                                       var byteArray = [];
                                                       for (var i = 0; i < str.length; i++)
                                                       {
@@ -111,7 +102,7 @@ define(["dojo/_base/declare",
                                                           }
                                                       }
                                                       return byteArray;
-                                                  }
+                                                 }
             });
        }
 );
\ No newline at end of file

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/plain/SaslClient.js
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/plain/SaslClient.js?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/plain/SaslClient.js (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/sasl/plain/SaslClient.js Fri Jan  8 16:55:50 2016
@@ -20,17 +20,13 @@
 define(["dojo/_base/declare",
         "dojo/_base/lang",
         "dojox/encoding/base64",
-        "dojo/Deferred",
-        "qpid/sasl/SaslClient",
+        "qpid/sasl/CredentialBasedSaslClient",
         "qpid/sasl/UsernamePasswordProvider"],
-       function(declare, lang, base64, Deferred, SaslClient, UsernamePasswordProvider)
+       function(declare, lang, base64, SaslClient, UsernamePasswordProvider)
        {
-            var deferred = new Deferred();
-            deferred.resolve("initialized");
             return declare("qpid.sasl.SaslClientPlain", [SaslClient], {
                  _state:             "initial",
                  getMechanismName:   function() {return "PLAIN";},
-                 initialized:        function() { return deferred.promise; },
                  isComplete:         function() {return this._state == "completed";},
                  getPriority:        function() {return 1;},
                  getResponse:        function(challenge)
@@ -41,17 +37,12 @@ define(["dojo/_base/declare",
                                                                     .concat([0])
                                                                     .concat(this._encodeUTF8(challenge.password));
                                              var plainResponse = base64.encode(responseArray);
-                                             this._state = "generated"
+                                             this._state = "completed"
                                              return  {
                                                          mechanism: this.getMechanismName(),
                                                          response: plainResponse
                                                      };
                                          }
-                                         else if (this._state == "generated")
-                                         {
-                                             this._state = "completed";
-                                             return null;
-                                         }
                                          else
                                          {
                                              throw {message: "Unexpected state '" + this._state +

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/login.html
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/login.html?rev=1723762&r1=1723761&r2=1723762&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/login.html (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/login.html Fri Jan  8 16:55:50 2016
@@ -80,19 +80,48 @@
             <div data-dojo-type="dijit.form.Form" method="POST" id="loginForm">
                 <script type="dojo/on" data-dojo-event="submit" data-dojo-args="e">
                     e.preventDefault()
-                    if(this.validate()){
-                        require(["qpid/sasl/Authenticator","qpid/management/Management"], function(sasl, Management){
-                            var management = new Management();
-                            var redirectIfAuthenticated = function redirectIfAuthenticated(){
-                                sasl.getUser(management, function(data){
-                                    if(data.user){
-                                        window.location = "index.html";
-                                    }
-                                });
-                            };
+                    if(this.validate())
+                    {
+                        require(["qpid/management/Management", "dojo/json"],
+                                function(Management, json)
+                                {
+                                    var redirectIfAuthenticated = function redirectIfAuthenticated(data)
+                                    {
+                                        if(data.user)
+                                        {
 
-                            sasl.authenticate(management, redirectIfAuthenticated);
-                        });
+                                            window.location = "index.html";
+                                        }
+                                        else
+                                        {
+                                            alert("User identifier is not found! Authentication failed!");
+                                        }
+                                    };
+                                    var errorHandler = function errorHandler(error)
+                                    {
+                                        if (error.response)
+                                        {
+                                            if(error.response.status == 401)
+                                            {
+                                                alert("Authentication Failed");
+                                            }
+                                            else if(error.response.status == 403)
+                                            {
+                                                alert("Authorization Failed");
+                                            }
+                                            else
+                                            {
+                                                alert(error.message);
+                                            }
+                                        }
+                                        else
+                                        {
+                                            alert(error.message ? error.message : "Authentication failed:" + json.stringify(error));
+                                        }
+                                    };
+                                    var management = new Management("", errorHandler);
+                                    management.authenticate(true).then(redirectIfAuthenticated);
+                                });
                     }
                     return false;
                 </script>



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org