You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ace.apache.org by ja...@apache.org on 2012/04/26 10:09:58 UTC

svn commit: r1330693 - in /ace/site/trunk/content/dev-doc/design: ace-authentication.mdtext auth_api.svg auth_main_components.svg

Author: jawi
Date: Thu Apr 26 08:09:58 2012
New Revision: 1330693

URL: http://svn.apache.org/viewvc?rev=1330693&view=rev
Log:
Some clarifications to the text; corrected the used figures.

Modified:
    ace/site/trunk/content/dev-doc/design/ace-authentication.mdtext
    ace/site/trunk/content/dev-doc/design/auth_api.svg
    ace/site/trunk/content/dev-doc/design/auth_main_components.svg

Modified: ace/site/trunk/content/dev-doc/design/ace-authentication.mdtext
URL: http://svn.apache.org/viewvc/ace/site/trunk/content/dev-doc/design/ace-authentication.mdtext?rev=1330693&r1=1330692&r2=1330693&view=diff
==============================================================================
--- ace/site/trunk/content/dev-doc/design/ace-authentication.mdtext (original)
+++ ace/site/trunk/content/dev-doc/design/ace-authentication.mdtext Thu Apr 26 08:09:58 2012
@@ -1,11 +1,11 @@
 Title: ACE Authentication
+
 _Enabling authentication in ACE_
 
-last updated: April 25th, 2012
+Revision 0.9, last updated: April 26th, 2012.
 
 [TOC]
 
-
 ## Introduction
 
 When provisioning software (partly) to targets, one has to rely upon the trustworthiness of both the network and the target. Even if everything is under your control and governance, one cannot entirely be sure that unwanted access takes place. A first step in order to prevent unwanted access is *authentication*, which gives you the ability to verify the identity of someone. Once the identity is known, one can apply *authorization* in order to determine what actions are allowed and which are not.
@@ -14,24 +14,24 @@ In this article, the recently added auth
 
 ## Communication paths
 
-Before going in more depth on the authentication layer of ACE, we first need to pinpoint all places were authentication is to be applied. The following figure shows the main components in ACE and their communication paths, providing a global overview of where authentication is applicable to ACE.
+Before going in more detail on the design and configuration of the authentication layer in ACE, we first need to pinpoint all places were authentication needs to be applied. The following figure shows the main components in ACE and their communication paths, providing a global overview of where authentication is applicable to ACE.
 
 ![Figure 1: Overview of components and communication paths in ACE](auth_main_components.svg "Figure 1: Overview of components and communication paths")  
 Figure 1: Overview of components and communication paths.
 
-In figure 1, several communication paths exists (denoted by the circled digits):
+Figure 1 represents several of the communication paths that can be identified (denoted by the circled digits):
 
-1. the client communicates to the ACE server by means of both direct calls to its services as well as remoted calls (by means of HTTP[^1]);
-2. a management agent (representing the target) communicates to the ACE server through HTTP calls;
-3. the REST API exposes the entire client API in a RESTful way. Communication to the client occurs by both direct calls as well as through HTTP;
-4. the Vaadin Web UI exposes the entire client API as web application. Similar as the REST API, it communicates both directly as through HTTP with the client.
+1. the client communicates to the ACE server by means of both direct calls to its services as well as remote (HTTP[^1]) calls;
+2. a management agent (representing the target) communicates to the ACE server through remote calls;
+3. the REST API exposes the entire client and server APIs in a RESTful way. Communication to the client occurs by both direct and remote calls;
+4. the Vaadin Web UI exposes the entire client API as web application. Similar as the REST API, it communicates both directly as remotely with the client.
 
-As can be seen from the above figure, most of the communication paths are based on HTTP. The reason for this is twofold:
+As can be seen from the above figure, most of the communication paths are remoted. The reason for this is twofold:
 
 1. It allows reuse of components; for example access to the OBR-servlet is used by the both the client-API as well the web UI to upload new artifacts;
-2. it allows components to be deployed on different machines; for example, one does not need to run the client on the same machine as the server. This could be useful for working on high-latency networks.
+2. it enables scalability by allowing components to be deployed on different machines; for example, one does not need to run the client on the same machine as the server. This could be useful for working on high-latency networks.
 
-All direct communication paths do not need to be authenticated, as they require that both caller and callee run in the same virtual machine, making it impossible to be used outside the virtual machine[^2]. Hence, we only need to add an authentication layer to the HTTP endpoints. However, adding authentication to all HTTP endpoints poses us with the challenge to let the internal communication paths that rely on HTTP to authenticate themselves as well. Not doing so would prevent ACE from functioning correctly. A disadvantage of this approach is that it is an all-or-nothing approach, either all users of the HTTP endpoints use authentication, or none of them. However, the way users authenticate themselves can be different, meaning that one set of users can use HTTP basic authentication to identify themselves, while another set uses client certificates to identify themselves.
+All direct (i.e., non remoted) communication paths do not need to be authenticated, as they require that both caller and callee run in the same virtual machine, making it impossible to be used outside the virtual machine[^2]. Hence, we only need to add an authentication layer to the remote endpoints. However, adding authentication to all remote endpoints poses us with the challenge to let the "internal" communication paths that use remote calls to authenticate themselves as well. Not doing so would prevent ACE from functioning correctly. A disadvantage of this approach is that it is an all-or-nothing approach, either all users of the remote endpoints use authentication, or none of them. However, the way users authenticate themselves can be different, meaning that one set of users can use basic authentication to identify themselves, while another set uses client certificates to identify themselves.
 
 
 ## Authentication design
@@ -47,65 +47,67 @@ Based on these requirements, the design 
 ![Figure 2: Authentication layer class diagram](auth_api.svg "Figure 2: Authentication layer class diagram")  
 Figure 2: Authentication layer class diagram.
 
-The <tt>AuthenticationService</tt> is responsible for authenticating a user based on some piece of information. This piece of information can be a username/password combination, a <tt>HttpServletRequest</tt> containing authentication request headers, or any other set of information capable of uniquely identifying a user. The actual authentication itself is delegated to one or more <tt>AuthenticationProcessor</tt>s, which know how to handle  a given set of information (e.g., <tt>HttpServletRequest</tt>) and can map this information to a particular user. In more detail, the calling sequence of <tt>AuthenticationService#authenticate</tt> would be:
+The <tt>AuthenticationService</tt> is responsible for authenticating a user based on some piece of information. This piece of information can be an array containing a username/password combination, a <tt>HttpServletRequest</tt> containing authentication request headers, or any other type of information capable of uniquely identifying a user. The actual authentication itself is delegated to one or more <tt>AuthenticationProcessor</tt>s, which know how to handle  a given set of information (e.g., <tt>HttpServletRequest</tt>) and can map this information to a particular user. In more detail, the calling sequence of <tt>AuthenticationService#authenticate</tt> would be:
 
-1. <tt>AuthenticationService#authenticate</tt> is called with a blob of data, for example the <tt>HttpServletRequest</tt>;
+1. <tt>AuthenticationService#authenticate</tt> is called with a blob of data, for example a <tt>HttpServletRequest</tt>;
 2. for each known <tt>AuthenticationProcessor</tt>:
-    - <tt>AuthenticationProcessor#canHandle</tt> is called with that blob of data. An authentication processor can decide whether the given blob is something it can handle or not;
-    - if it can be handled, the <tt>AuthenticationProcessor#authenticate</tt> is called with that blob of data, along with an instance of the UserAdmin service. The authentication processor is now responsible for converting the blob of data to an authenticated user, if possible.
+    - <tt>AuthenticationProcessor#canHandle</tt> is called with that blob of data. In this method, an authentication processor can decide whether the given blob is something it can handle or not;
+    - if it can be handled, the <tt>AuthenticationProcessor#authenticate</tt> is called with that blob of data, along with an instance of the <tt>UserAdmin</tt> service. The authentication processor is now responsible for converting the blob of data to an authenticated user, if possible.
 3. if a <tt>User</tt> object is returned from the authentication service[^3], the authentication phase will be regarded as successful. If *no* <tt>User</tt> object is returned, the authentication phase will be regarded unsuccessful.
 
-This is only half the story for authentication. As stated before, ACE internally also communicates through HTTP to access certain services. Without any changes, all those remote calls will fail due to missing credentials. If we want to leave those means of communications as-is, we would need to track down all places where remote calls are being made and inject the proper credentials at those places. However, doing this is not only *very* invasive and error prone but also not very developer friendly from a service-oriented perspective. Alternatively, we could try to include the credentials in the URL itself, making it self-contained. Not only would this approach limit our ability to use any kind of authentication mechanism (it only works for username/password combos), it also required us to supply the credentials manually each and every time we want to create a remote connection. Instead, we would like to refrain from passing around credentials, and leverage the service orien
 ted aspects of OSGi to create remote connections for us. This service could then be responsible for adding the right credentials for us, leaving the calling party totally unaware about the fact authentication might be used. Such a service is denoted in the following figure:
+This is only half the story for authentication. As stated before, ACE internally also communicates through remote endpoints to access certain services. Without any changes, all those remote calls will fail due to missing credentials. If we would leave those means of communications as-is, we need to track down all places where remote calls are being made and inject the proper credentials at each of those places. However, doing this is not only *very* invasive and error prone but also not very developer friendly from a service-oriented perspective. Alternatively, we could try to include the credentials in the URL itself, making it self-contained. Not only would this approach limit our ability to use any kind of authentication mechanism (it only works for username/password combos), it also required us to supply the credentials manually each and every time we want to create a remote connection. Instead, we would like to refrain from passing around credentials, and leverage the s
 ervice oriented aspects of OSGi to create remote connections for us. This service could then be responsible for adding the right credentials for us, leaving the calling party totally unaware about the fact authentication might be used (or not). Such a service is denoted in the following figure:
 
 ![Figure 3: Connection Factory class diagram](auth_connectionfactory.svg "Figure 3: Connection Factory class diagram")  
 Figure 3: Connection Factory class diagram.
 
-The <tt>ConnectionFactory</tt> is responsible for creating <tt>URLConnection</tt>s, given a "plain" URL. So, instead of calling <tt>URL#openConnection()</tt> or <tt>URL#openStream()</tt>, we'll now have to call <tt>ConnectionFactory#createConnection(url)</tt> instead. But, what advantage does this bring us? In order to allow the connection factory to supply the credentials to <tt>URLConnection</tt>s, it is also registered as <tt>ManagedServiceFactory</tt> that enables us to provide multiple configurations of which credentials should be supplied to what (sets of) URLs. The introduction of the connection factory allows us to abstract the creation of a connection and passing of credentials to it from the URL. Internally, the connection factory will match each URL given in <tt>createConnection</tt> with the URLs it is configured with. If a matching URL is found, it will use the credentials in that configuration to supply to the <tt>URLConnection</tt>.
+The <tt>ConnectionFactory</tt> is responsible for creating <tt>URLConnection</tt>s, given a "plain" URL. So, instead of calling <tt>URL#openConnection()</tt> or <tt>URL#openStream()</tt>, we'll now have to call <tt>ConnectionFactory#createConnection(url)</tt> instead. But what advantage does this give us? In order to allow the connection factory to supply the credentials to <tt>URLConnection</tt>s, it is also registered as <tt>ManagedServiceFactory</tt> that enables us to provide multiple configurations of which credentials should be supplied to what (sets of) URLs. The introduction of the connection factory thus allows us to abstract the creation of a connection and passing of credentials to it from the URL. Internally, the connection factory will match each URL given in <tt>createConnection</tt> with the URLs it is configured with. If a matching URL is found, it will use the credentials in that configuration to supply to the <tt>URLConnection</tt>.
 
-We've now closed the circle: we not only have defined how remote endpoints can apply authentication, but also how all calling parties can remain using these remote endpoints without having to be aware of authentication. 
-
-
-## Configuring authentication
-
-Before continuing on the details of configuring authentication for ACE, we first identify what remote services are available, and how they can be configured.
 
 ### Remote services
 
-All remote services in ACE are configurable with respect to the endpoint they can be accessed. The following table shows an overview of the remote services, including the default endpoint they use:
+We've now closed the circle: we not only have defined how remote endpoints can apply authentication, but also how all calling parties can remain using these remote endpoints without having to be aware of authentication. The only thing left, is a summary of which remote endpoints currently exist in ACE.  
+All remote services are configurable with respect to the endpoint they can be accessed. The following table shows an overview of the remote services, including the default endpoint they use:
 
-Name | Description | Endpoint | Configuration PID
+Name | Description | Endpoint | Configuration PID[^4]
 ------- | --------------- | ------------ | --------------------- 
 <tt>BundleServlet</tt> | provides access to the OBR (bundle repository) of ACE | <tt>/obr</tt> | <tt>o.a.a.obr.servlet</tt>
 <tt>DeploymentServlet</tt> | handles the actual provisioning of deployment packages to a target | <tt>/deployment</tt> |<tt>o.a.a.deployment.servlet</tt>
-<tt>LogServlet</tt> | allows any number of logs for a target to be synchronized and accessed | <tt>/auditlog</tt>[^4] | <tt>o.a.a.server.log.servlet.factory</tt><br/>**note: this is a configuration factory!**
+<tt>LogServlet</tt> | allows any number of logs for a target to be synchronized and accessed | <tt>/auditlog</tt>[^5] | <tt>o.a.a.server.log.servlet.factory</tt><br/>**note: this is a configuration factory!**
 <tt>RepositoryServlet</tt> | provides access to the various (artifact/feature/distribution/target) internal repositories of ACE | <tt>/repository</tt> | <tt>o.a.a.repository.servlet.RepositoryServlet</tt>
 <tt>RepositoryReplicationServlet</tt> | allows *relay nodes* to replicate the internal repositories of ACE | <tt>/replication</tt> | <tt>o.a.a.repository.servlet.RepositoryReplicationServlet</tt>
 <tt>RESTClientServlet</tt> | provides the RESTful interface to ACE |<tt>/client</tt> | <tt>o.a.a.client.rest</tt>
 <tt>VaadinServlet</tt> | provides the Vaadin web interface | <tt>/ace</tt> | <tt>o.a.a.webui.vaadin</tt>
 
-Table 1: Remote services overview. Common prefix of configuration PIDs are abbreviated, so <tt>o.a.a</tt> stands for <tt>org.apache.ace</tt>.
+
+## Configuring authentication
+
+Now we have discussed the design of the authentication layer in ACE in rather detail, lets continue with how we can configure the authentication. Note that in order to make use of this functionality, you need to use the latest TRUNK of ACE, as explained in the introduction.
 
 ### Configuring authentication for remote services
 
 In the section on the design of the authentication layer, we've mentioned that if a remote service wants to make use of authentication, it can make use of the <tt>AuthenticationService</tt>. However, one of the design requirements was that authentication should be optional as well. In order to enable or disable authentication, each remote service needs to do the following:
 
 1. add a **mandatory** configuration property <tt>authentication.enabled = false|true</tt> to their configuration. Although any kind of name for this configuration property can be used, it is *strongly* advised to stick to the same name for all services;
-2. when the configuration of a remote service is updated, it should add a service dependency to the <tt>AuthenticationService</tt>. By making this service *required* when authentication is enabled, and *optional* when authentication is disabled, we can adhere to the requirement of optionality for authentication;
+2. when the configuration of a remote service is updated, it should add a service dependency to the <tt>AuthenticationService</tt>. By making this service **required** if authentication is *enabled*, and **optional** when authentication is *disabled*, we can adhere to the requirement of optionality for authentication;
 3. in case authentication is *enabled*, each request the service obtains needs to be passed to the <tt>AuthenticationService</tt> first, and depending on its outcome, the request can continue or not.
 
-To make this more concrete, an example of how the <tt>BundleServlet</tt> is to be configured:
+To make this more concrete, we walk through an example of how the <tt>BundleServlet</tt> is to be configured. As this is a servlet (as almost all other remote endpoints in ACE), we can intercept all service requests by overriding the <tt>Servlet#service()</tt> method and perform our authentication check there. If this check is successful, we continue passing the service request, and return a "401 - Unauthorized" when the check is unsuccessful. 
 
-#### Service configuration
+#### Configuring the authentication
 
-The service configuration, located in <tt>org.apache.ace.obr.servlet.cfg</tt>, looks like:
+The service configuration, denoted by the <tt>org.apache.ace.obr.servlet.cfg</tt> in the stock ACE distribution, looks like:
 
     :::properties
     # Endpoint for this servlet
-    org.apache.ace.server.servlet.endpoint=/obr
+    org.apache.ace.server.servlet.endpoint = /obr
     # Whether or not authentication is to be used
     authentication.enabled = true
 
-In <tt>BundleServlet</tt> we add the following code:
+Note that we've added the <tt>authentication.enabled</tt> property that allows us to enable or disable the authentication check for this servlet.
+
+#### Making use of the service configuration
+
+To let the servlet pick up our configuration, it should be registered as <tt>ManagedService(Factory)</tt>. To make use of the configuration, we need to add the following code to our <tt>BundleServlet</tt>:
 
     :::java
     private volatile boolean m_useAuth;
@@ -119,9 +121,8 @@ In <tt>BundleServlet</tt> we add the fol
             if (useAuthString == null || !("true".equalsIgnoreCase(useAuthString) || "false".equalsIgnoreCase(useAuthString))) {
                 throw new ConfigurationException("authentication.enabled", "Missing or invalid value!");
             }
-            boolean useAuth = Boolean.parseBoolean(useAuthString);
-
-            m_useAuth = useAuth;
+            
+            m_useAuth = Boolean.parseBoolean(useAuthString);
         }
         else {
             m_useAuth = false;
@@ -141,9 +142,9 @@ In <tt>BundleServlet</tt> we add the fol
         );
     }
 
-As almost all of the services in ACE are managed by the Dependency Manager, we can leverage its dynamics to inject our <tt>BundleServlet</tt> with an instance of the <tt>AuthenticationService</tt> and provide us with a configuration[^5]. 
+As almost all of the services in ACE are managed by the Dependency Manager, we can leverage its dynamics to inject our <tt>BundleServlet</tt> with an instance of the <tt>AuthenticationService</tt> and provide us with a configuration[^6]. In the <tt>updated()</tt> method, we perform a check whether the prior mentioned <tt>authentication.enabled</tt> property is present in the given configuration, and if so, whether it represents a valid boolean value. The actual boolean value itself will be held in a field (<tt>m_useAuth</tt>) for later use.
 
-#### Implemention
+#### Implementing the authentication check
 
 The actual authentication implementation itself is rather trivial: we simply intercept all incoming requests in our servlet and verify whether it resolves to a valid user:
 
@@ -170,11 +171,13 @@ The actual authentication implementation
         return true;
     }
 
-Note that this implementation does not tell *how* the authentication should occur, only that it should occur. How the authentication is performed, is determined internally by the <tt>AuthenticationService</tt>, with the help of the registered <tt>AuthenticationProcessor</tt>s.
+Note that this implementation does not tell *how* the authentication should occur, only that it should occur. How the authentication is performed, is determined internally by the <tt>AuthenticationService</tt>, with the help of the registered <tt>AuthenticationProcessor</tt>s.  
+Also note that the <tt>authenticate</tt> method itself uses the previously defined field (<tt>m_useAuth</tt>) to determine whether or not the authentication check should be performed. If it is *not* performed, we consider the request to be always authenticated, in order to obtain the same semantics as we would have without this check.
 
 ### Configuring the connection factory
 
-Now that the remote service itself is no longer accepting unauthenticated requests, we need to supply the credentials to access this service to the <tt>ConnectionFactory</tt> service. This service can be configured using the PID <tt>org.apache.ace.connectionfactory</tt> (*note that it is a configuration factory!*), which would result in the following configuration for accessing our <tt>BundleServlet</tt>:
+Now that the remote service itself is no longer accepting unauthenticated requests, we need to supply the credentials to access this service to the <tt>ConnectionFactory</tt> service. This service can be configured using the PID <tt>org.apache.ace.connectionfactory</tt>. Note that it is a configuration factory, accepting multiple configurations!  
+For accessing our <tt>BundleServlet</tt>, we need to supply it the following configuration:
 
     :::properties
     # What kind of authentication should we supply
@@ -185,17 +188,17 @@ Now that the remote service itself is no
     # What is the base URL that these credentials apply to:
     authentication.baseURL = http://localhost:8080/obr/
 
-When this configuration is supplied to the <tt>ConnectionFactory</tt>, it will provide a basic HTTP authentication header to each connection created for any URL starting with "<tt>http://localhost:8080/obr/</tt>"[^6]. 
+When this configuration is supplied to the <tt>ConnectionFactory</tt>, it will provide a basic HTTP authentication header to each connection created for any URL starting with "<tt>http://localhost:8080/obr/</tt>"[^7]. 
 
 ### Configuring the management agent
 
-The management agent itself also needs to use authentication to communicate with the remote services of the ACE server. It reuses the <tt>ConnectionFactory</tt> service for this, so it needs to obtain the same set of configurations as described in the previous section. The only thing we need to do is tell the management agent were it can find those configuration files:
+The management agent itself also needs to use authentication to communicate with the remote services of the ACE server. It reuses the <tt>ConnectionFactory</tt> service for this, so it needs to obtain the same set of configurations as described in the previous section. The only thing we need to do is tell the management agent were it can find those configuration file(s):
 
     :::sh
     [localhost:~/]$ java -jar org.apache.ace.launcher-0.8.1-SNAPSHOT.jar \
      discovery=http://localhost:8080/ \
      identification=MyTarget \
-     auth=/path/to/connectionfactory/config/files
+     auth=/path/to/connectionfactory/config/file(s)
 
 Alternatively, one could adapt the code of the management agent to use the <tt>ConfigAdmin</tt> service directly for creating the individual configurations using the service factory PID <tt>org.apache.ace.connectionfactory</tt>. 
 
@@ -215,8 +218,10 @@ Alternatively, one could adapt the code 
 
 [^3]: It is up to the implementation of <tt>AuthenticationService</tt> whether the *first* found user is returned, or whether it checks if all authentication processors yield the *same* user, or any other strategy that is desired.
 
-[^4]: Amongst others, any number of log-endpoints can be defined, at least one is needed for the audit log to be synchronized between target and ACE server.
+[^4]:  The common prefix of the shown configuration PIDs are abbreviated, so "<tt>o.a.a</tt>" stands for "<tt>org.apache.ace</tt>".
+
+[^5]: Amongst others, any number of log-endpoints can be defined, at least one is needed for the audit log to be synchronized between target and ACE server.
 
-[^5]: Note that we're using a configuration dependency for this service. This way, the configuration **must** be present before the service itself is registered, which allows us to determine if authentication should be used or not.
+[^6]: Note that we're using a configuration dependency for this service. This way, the configuration **must** be present before the service itself is registered, which allows us to determine if authentication should be used or not.
 
-[^6]: Currently, a simple <tt>String#startsWith()</tt> is used to determine whether or not a URL matches a configuration. This might change in the future when a more sophisticated URL-matching strategy is needed.
+[^7]: Currently, a simple <tt>String#startsWith()</tt> is used to determine whether or not a URL matches a configuration. This might change in the future when a more sophisticated URL-matching strategy is needed.

Modified: ace/site/trunk/content/dev-doc/design/auth_api.svg
URL: http://svn.apache.org/viewvc/ace/site/trunk/content/dev-doc/design/auth_api.svg?rev=1330693&r1=1330692&r2=1330693&view=diff
==============================================================================
--- ace/site/trunk/content/dev-doc/design/auth_api.svg (original)
+++ ace/site/trunk/content/dev-doc/design/auth_api.svg Thu Apr 26 08:09:58 2012
@@ -1,113 +1,143 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg height="404" version="1.1" width="716" xmlns="http://www.w3.org/2000/svg">
-<rect fill="#ffffff" height="88" stroke="#ffffff" stroke-width="1" width="152" x="14" y="150"/>
-<rect fill="none" height="88" stroke="#000000" stroke-width="1" width="152" x="14" y="150"/>
-<text font-family="Lucida Grande" font-size="13" x="23" y="184">
+<svg height="512" version="1.1" width="716" xmlns="http://www.w3.org/2000/svg">
+<rect fill="#ffffff" height="88" stroke="#ffffff" stroke-width="1" width="152" x="14" y="158"/>
+<rect fill="none" height="88" stroke="#000000" stroke-width="1" width="152" x="14" y="158"/>
+<text font-family="Lucida Grande" font-size="13" x="21" y="192">
 AuthenticationService</text>
-<text font-family="Lucida Grande" font-size="13" x="42" y="165">
+<text font-family="Lucida Grande" font-size="13" x="42" y="173">
 &lt;&lt;interface&gt;&gt;</text>
-<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="152" x="14" y="194"/>
-<text font-family="Lucida Grande" font-size="13" x="18" y="209">
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="152" x="14" y="202"/>
+<text font-family="Lucida Grande" font-size="13" x="18" y="217">
 authenticate() : User</text>
-<rect fill="#ffffff" height="87" stroke="#ffffff" stroke-width="1" width="164" x="366" y="150"/>
-<rect fill="none" height="87" stroke="#000000" stroke-width="1" width="164" x="366" y="150"/>
-<text font-family="Lucida Grande" font-size="13" x="371" y="184">
+<rect fill="#ffffff" height="88" stroke="#ffffff" stroke-width="1" width="168" x="366" y="158"/>
+<rect fill="none" height="88" stroke="#000000" stroke-width="1" width="168" x="366" y="158"/>
+<text font-family="Lucida Grande" font-size="13" x="373" y="192">
 AuthenticationProcessor</text>
-<text font-family="Lucida Grande" font-size="13" x="400" y="165">
+<text font-family="Lucida Grande" font-size="13" x="402" y="173">
 &lt;&lt;interface&gt;&gt;</text>
-<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="164" x="366" y="194"/>
-<text font-family="Lucida Grande" font-size="13" x="370" y="209">
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="168" x="366" y="202"/>
+<text font-family="Lucida Grande" font-size="13" x="370" y="217">
 canHandle() : Boolean</text>
-<text font-family="Lucida Grande" font-size="13" x="370" y="226">
+<text font-family="Lucida Grande" font-size="13" x="370" y="234">
 authenticate() : User</text>
-<polyline fill="none" points="165,198 366,198" stroke="#000000" stroke-width="1"/>
-<polygon fill="#ffffff" points="165,198 175,193 185,198 175,203" stroke="#ffffff" stroke-width="1"/>
-<polygon fill="none" points="165,198 175,193 185,198 175,203" stroke="#000000" stroke-width="1"/>
-<text font-family="Lucida Grande" font-size="13" x="339" y="213">
-*</text>
-<rect fill="#ffffff" height="72" stroke="#ffffff" stroke-width="1" width="223" x="198" y="318"/>
-<rect fill="none" height="72" stroke="#000000" stroke-width="1" width="223" x="198" y="318"/>
-<text font-family="Lucida Grande" font-size="13" x="203" y="332">
+<rect fill="#ffffff" height="72" stroke="#ffffff" stroke-width="1" width="223" x="206" y="326"/>
+<rect fill="none" height="72" stroke="#000000" stroke-width="1" width="223" x="206" y="326"/>
+<text font-family="Lucida Grande" font-size="13" x="211" y="340">
 PasswordAuthenticationProcessor</text>
-<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="223" x="198" y="342"/>
-<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="223" x="198" y="365"/>
-<rect fill="#ffffff" height="68" stroke="#ffffff" stroke-width="1" width="224" x="478" y="318"/>
-<rect fill="none" height="68" stroke="#000000" stroke-width="1" width="224" x="478" y="318"/>
-<text font-family="Lucida Grande" font-size="13" x="483" y="332">
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="223" x="206" y="350"/>
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="223" x="206" y="373"/>
+<rect fill="#ffffff" height="68" stroke="#ffffff" stroke-width="1" width="224" x="478" y="326"/>
+<rect fill="none" height="68" stroke="#000000" stroke-width="1" width="224" x="478" y="326"/>
+<text font-family="Lucida Grande" font-size="13" x="483" y="340">
 BasicHttpAuthenticationProcessor</text>
-<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="224" x="478" y="342"/>
-<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="224" x="478" y="363"/>
-<rect fill="#ffffff" height="66" stroke="#ffffff" stroke-width="1" width="104" x="396" y="14"/>
-<rect fill="none" height="66" stroke="#000000" stroke-width="1" width="104" x="396" y="14"/>
-<text font-family="Lucida Grande" font-size="13" x="413" y="48">
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="224" x="478" y="350"/>
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="224" x="478" y="371"/>
+<rect fill="#ffffff" height="66" stroke="#ffffff" stroke-width="1" width="168" x="366" y="14"/>
+<rect fill="none" height="66" stroke="#000000" stroke-width="1" width="168" x="366" y="14"/>
+<text font-family="Lucida Grande" font-size="13" x="415" y="48">
 UserAdmin</text>
-<text font-family="Lucida Grande" font-size="13" x="400" y="29">
+<text font-family="Lucida Grande" font-size="13" x="402" y="29">
 &lt;&lt;interface&gt;&gt;</text>
-<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="104" x="396" y="58"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="318" y2="313"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="308" y2="303"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="298" y2="293"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="288" y2="283"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="593" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="588" x2="583" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="578" x2="573" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="568" x2="563" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="558" x2="553" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="548" x2="543" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="538" x2="533" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="528" x2="523" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="518" x2="513" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="508" x2="503" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="498" x2="493" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="488" x2="483" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="478" x2="473" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="468" x2="463" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="458" x2="454" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="278" y2="273"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="268" y2="263"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="258" y2="253"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="248" y2="243"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="238" y2="236"/>
-<polygon fill="#ffffff" points="454,236 461,248 447,248" stroke="#ffffff" stroke-width="1"/>
-<polygon fill="none" points="454,236 461,248 447,248" stroke="#000000" stroke-width="1"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="302" x2="302" y1="318" y2="313"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="302" x2="302" y1="308" y2="303"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="302" x2="302" y1="298" y2="293"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="302" x2="302" y1="288" y2="283"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="302" x2="307" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="312" x2="317" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="322" x2="327" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="332" x2="337" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="342" x2="347" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="352" x2="357" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="362" x2="367" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="372" x2="377" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="382" x2="387" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="392" x2="397" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="402" x2="407" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="412" x2="417" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="422" x2="427" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="432" x2="437" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="442" x2="447" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="452" x2="454" y1="278" y2="278"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="278" y2="273"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="268" y2="263"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="258" y2="253"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="248" y2="243"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="238" y2="236"/>
-<polygon fill="#ffffff" points="454,236 461,248 447,248" stroke="#ffffff" stroke-width="1"/>
-<polygon fill="none" points="454,236 461,248 447,248" stroke="#000000" stroke-width="1"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="150" y2="145"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="140" y2="135"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="130" y2="125"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="120" y2="115"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="110" y2="105"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="100" y2="95"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="90" y2="85"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="446" x2="446" y1="80" y2="79"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="453" x2="446" y1="91" y2="79"/>
-<line fill="#000000" stroke="#000000" stroke-width="1" x1="439" x2="446" y1="91" y2="79"/>
-<text font-family="Lucida Grande" font-size="13" x="377" y="111">
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="168" x="366" y="58"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="326" y2="321"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="316" y2="311"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="306" y2="301"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="598" y1="296" y2="291"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="598" x2="593" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="588" x2="583" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="578" x2="573" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="568" x2="563" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="558" x2="553" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="548" x2="543" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="538" x2="533" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="528" x2="523" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="518" x2="513" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="508" x2="503" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="498" x2="493" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="488" x2="483" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="478" x2="473" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="468" x2="463" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="458" x2="454" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="286" y2="281"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="276" y2="271"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="266" y2="261"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="256" y2="251"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="246" y2="245"/>
+<polygon fill="#ffffff" points="454,245 461,257 447,257" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="454,245 461,257 447,257" stroke="#000000" stroke-width="1"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="310" x2="310" y1="326" y2="321"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="310" x2="310" y1="316" y2="311"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="310" x2="310" y1="306" y2="301"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="310" x2="310" y1="296" y2="291"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="310" x2="315" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="320" x2="325" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="330" x2="335" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="340" x2="345" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="350" x2="355" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="360" x2="365" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="370" x2="375" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="380" x2="385" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="390" x2="395" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="400" x2="405" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="410" x2="415" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="420" x2="425" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="430" x2="435" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="440" x2="445" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="450" x2="454" y1="286" y2="286"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="286" y2="281"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="276" y2="271"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="266" y2="261"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="256" y2="251"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="246" y2="245"/>
+<polygon fill="#ffffff" points="454,245 461,257 447,257" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="454,245 461,257 447,257" stroke="#000000" stroke-width="1"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="158" y2="153"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="148" y2="143"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="138" y2="133"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="128" y2="123"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="118" y2="113"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="108" y2="103"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="98" y2="93"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="88" y2="83"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="461" x2="454" y1="91" y2="79"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="447" x2="454" y1="91" y2="79"/>
+<text font-family="Lucida Grande" font-size="13" x="470" y="120">
 &lt;&lt;call&gt;&gt;</text>
+<rect fill="#ffffff" height="68" stroke="#ffffff" stroke-width="1" width="227" x="342" y="430"/>
+<rect fill="none" height="68" stroke="#000000" stroke-width="1" width="227" x="342" y="430"/>
+<text font-family="Lucida Grande" font-size="13" x="347" y="444">
+ClientCertAuthenticationProcessor</text>
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="227" x="342" y="454"/>
+<rect fill="#000000" height="1" stroke="#000000" stroke-width="1" width="227" x="342" y="475"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="430" y2="425"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="420" y2="415"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="410" y2="405"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="400" y2="395"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="390" y2="385"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="380" y2="375"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="370" y2="365"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="360" y2="355"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="350" y2="345"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="340" y2="335"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="330" y2="325"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="320" y2="315"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="310" y2="305"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="300" y2="295"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="290" y2="285"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="280" y2="275"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="270" y2="265"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="260" y2="255"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="454" x2="454" y1="250" y2="245"/>
+<polygon fill="#ffffff" points="454,245 461,257 447,257" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="454,245 461,257 447,257" stroke="#000000" stroke-width="1"/>
+<polyline fill="none" points="165,206 366,206" stroke="#000000" stroke-width="1"/>
+<polygon fill="#ffffff" points="165,206 175,201 185,206 175,211" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="165,206 175,201 185,206 175,211" stroke="#000000" stroke-width="1"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="354" x2="366" y1="213" y2="206"/>
+<line fill="#000000" stroke="#000000" stroke-width="1" x1="354" x2="366" y1="199" y2="206"/>
+<text font-family="Lucida Grande" font-size="13" x="225" y="201">
+&lt;&lt;delegates&gt;&gt;</text>
+<text font-family="Lucida Grande" font-size="13" x="349" y="225">
+*</text>
 </svg>

Modified: ace/site/trunk/content/dev-doc/design/auth_main_components.svg
URL: http://svn.apache.org/viewvc/ace/site/trunk/content/dev-doc/design/auth_main_components.svg?rev=1330693&r1=1330692&r2=1330693&view=diff
==============================================================================
--- ace/site/trunk/content/dev-doc/design/auth_main_components.svg (original)
+++ ace/site/trunk/content/dev-doc/design/auth_main_components.svg Thu Apr 26 08:09:58 2012
@@ -1,219 +1,223 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg height="516" version="1.1" width="896" xmlns="http://www.w3.org/2000/svg">
-<rect fill="#ffffff" height="180" stroke="#ffffff" stroke-width="1" width="200" x="662" y="122"/>
-<rect fill="none" height="180" stroke="#000000" stroke-width="1" width="200" x="662" y="122"/>
-<polygon fill="#ffffff" points="662,122 682,102 882,102 862,122" stroke="#ffffff" stroke-width="1"/>
-<polygon fill="none" points="662,122 682,102 882,102 862,122" stroke="#000000" stroke-width="1"/>
-<polygon fill="#ffffff" points="882,102 882,282 862,302 862,122" stroke="#ffffff" stroke-width="1"/>
-<polygon fill="none" points="882,102 882,282 862,302 862,122" stroke="#000000" stroke-width="1"/>
-<text font-family="Lucida Grande" font-size="13" x="670" y="137">
-Management Agent</text>
-<rect fill="#ffffff" height="300" stroke="#ffffff" stroke-width="1" width="516" x="14" y="122"/>
-<rect fill="none" height="300" stroke="#000000" stroke-width="1" width="516" x="14" y="122"/>
-<polygon fill="#ffffff" points="14,122 34,102 550,102 530,122" stroke="#ffffff" stroke-width="1"/>
-<polygon fill="none" points="14,122 34,102 550,102 530,122" stroke="#000000" stroke-width="1"/>
-<polygon fill="#ffffff" points="550,102 550,402 530,422 530,122" stroke="#ffffff" stroke-width="1"/>
-<polygon fill="none" points="550,102 550,402 530,422 530,122" stroke="#000000" stroke-width="1"/>
+<svg height="516" version="1.1" width="1006" xmlns="http://www.w3.org/2000/svg">
+<rect fill="#ffffff" height="180" stroke="#ffffff" stroke-width="1" width="200" x="14" y="122"/>
+<rect fill="none" height="180" stroke="#000000" stroke-width="1" width="200" x="14" y="122"/>
+<polygon fill="#ffffff" points="14,122 34,102 234,102 214,122" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="14,122 34,102 234,102 214,122" stroke="#000000" stroke-width="1"/>
+<polygon fill="#ffffff" points="234,102 234,282 214,302 214,122" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="234,102 234,282 214,302 214,122" stroke="#000000" stroke-width="1"/>
 <text font-family="Lucida Grande" font-size="13" x="22" y="137">
+Management Agent</text>
+<rect fill="#ffffff" height="300" stroke="#ffffff" stroke-width="1" width="516" x="334" y="122"/>
+<rect fill="none" height="300" stroke="#000000" stroke-width="1" width="516" x="334" y="122"/>
+<polygon fill="#ffffff" points="334,122 354,102 870,102 850,122" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="334,122 354,102 870,102 850,122" stroke="#000000" stroke-width="1"/>
+<polygon fill="#ffffff" points="870,102 870,402 850,422 850,122" stroke="#ffffff" stroke-width="1"/>
+<polygon fill="none" points="870,102 870,402 850,422 850,122" stroke="#000000" stroke-width="1"/>
+<text font-family="Lucida Grande" font-size="13" x="342" y="137">
 Management Server</text>
-<rect fill="#00ff" height="80" stroke="#00ff" stroke-width="1" width="120" x="352" y="174"/>
-<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="352" y="174"/>
-<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="352" y="174"/>
-<text font-family="Lucida Grande" font-size="13" x="398" y="189">
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="672" y="174"/>
+<rect fill="none" height="80" stroke="#00ff" stroke-width="1" width="120" x="672" y="174"/>
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="672" y="174"/>
+<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="672" y="174"/>
+<rect fill="#ffffff" height="0" stroke="#ffffff" stroke-width="1" width="108" x="683" y="175"/>
+<text font-family="Lucida Grande" font-size="13" x="718" y="189">
 Client</text>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="342" y="195"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="342" y="195"/>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="342" y="222"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="342" y="222"/>
-<rect fill="#00ff" height="80" stroke="#00ff" stroke-width="1" width="120" x="704" y="174"/>
-<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="704" y="174"/>
-<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="704" y="174"/>
-<text font-family="Lucida Grande" font-size="13" x="749" y="189">
-Target</text>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="694" y="195"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="694" y="195"/>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="694" y="222"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="694" y="222"/>
-<rect fill="#00ff" height="80" stroke="#00ff" stroke-width="1" width="120" x="352" y="310"/>
-<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="352" y="310"/>
-<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="352" y="310"/>
-<text font-family="Lucida Grande" font-size="13" x="372" y="325">
-REST Interface</text>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="342" y="331"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="342" y="331"/>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="342" y="358"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="342" y="358"/>
-<rect fill="#00ff" height="80" stroke="#00ff" stroke-width="1" width="120" x="56" y="174"/>
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="662" y="195"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="662" y="195"/>
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="662" y="222"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="662" y="222"/>
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="56" y="174"/>
+<rect fill="none" height="80" stroke="#00ff" stroke-width="1" width="120" x="56" y="174"/>
 <rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="56" y="174"/>
 <rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="56" y="174"/>
-<text font-family="Lucida Grande" font-size="13" x="102" y="189">
-Server</text>
+<rect fill="#ffffff" height="0" stroke="#ffffff" stroke-width="1" width="108" x="67" y="175"/>
+<text font-family="Lucida Grande" font-size="13" x="101" y="189">
+Target</text>
 <rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="46" y="195"/>
 <rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="46" y="195"/>
 <rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="46" y="222"/>
 <rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="46" y="222"/>
-<polygon fill="#ffffff" points="422,14 643,14 653,24 653,77 422,77 422,14" stroke="#ffffff" stroke-width="1"/>
-<polyline fill="none" points="422,14 643,14 653,24 653,77 422,77 422,14" stroke="#000000" stroke-width="1"/>
-<polygon fill="#b2b2b2" points="643,14 653,24 643,24 643,14" stroke="#b2b2b2" stroke-width="1"/>
-<polyline fill="none" points="643,14 653,24 643,24 643,14" stroke="#000000" stroke-width="1"/>
-<text font-family="Lucida Grande" font-size="13" x="425" y="30">
-Provides REST-ish interfaces for </text>
-<text font-family="Lucida Grande" font-size="13" x="425" y="46">
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="672" y="310"/>
+<rect fill="none" height="80" stroke="#00ff" stroke-width="1" width="120" x="672" y="310"/>
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="672" y="310"/>
+<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="672" y="310"/>
+<rect fill="#ffffff" height="0" stroke="#ffffff" stroke-width="1" width="108" x="683" y="311"/>
+<text font-family="Lucida Grande" font-size="13" x="692" y="325">
+REST Interface</text>
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="662" y="331"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="662" y="331"/>
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="662" y="358"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="662" y="358"/>
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="376" y="174"/>
+<rect fill="none" height="80" stroke="#00ff" stroke-width="1" width="120" x="376" y="174"/>
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="376" y="174"/>
+<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="376" y="174"/>
+<rect fill="#ffffff" height="0" stroke="#ffffff" stroke-width="1" width="108" x="387" y="175"/>
+<text font-family="Lucida Grande" font-size="13" x="422" y="189">
+Server</text>
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="366" y="195"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="366" y="195"/>
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="366" y="222"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="366" y="222"/>
+<polygon fill="#ffffff" points="758,14 981,14 991,24 991,77 758,77 758,14" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="758,14 981,14 991,24 991,77 758,77 758,14" stroke="#000000" stroke-width="1"/>
+<polygon fill="#ffffff" points="981,14 991,24 981,24 981,14" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="981,14 991,24 981,24 981,14" stroke="#000000" stroke-width="1"/>
+<text font-family="Lucida Grande" font-size="13" x="761" y="30">
+Provides client-side interfaces for </text>
+<text font-family="Lucida Grande" font-size="13" x="761" y="46">
 deployment packages, audit logs, </text>
-<text font-family="Lucida Grande" font-size="13" x="425" y="62">
+<text font-family="Lucida Grande" font-size="13" x="761" y="62">
 OBR access and so on.</text>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="77" y2="82"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="87" y2="92"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="97" y2="102"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="107" y2="112"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="117" y2="122"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="127" y2="132"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="137" y2="142"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="147" y2="152"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="157" y2="162"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="462" x2="462" y1="167" y2="172"/>
-<polygon fill="#ffffff" points="78,14 295,14 305,24 305,77 78,77 78,14" stroke="#ffffff" stroke-width="1"/>
-<polyline fill="none" points="78,14 295,14 305,24 305,77 78,77 78,14" stroke="#000000" stroke-width="1"/>
-<polygon fill="#b2b2b2" points="295,14 305,24 295,24 295,14" stroke="#b2b2b2" stroke-width="1"/>
-<polyline fill="none" points="295,14 305,24 295,24 295,14" stroke="#000000" stroke-width="1"/>
-<text font-family="Lucida Grande" font-size="13" x="81" y="30">
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="77" y2="82"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="87" y2="92"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="97" y2="102"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="107" y2="112"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="117" y2="122"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="127" y2="132"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="137" y2="142"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="147" y2="152"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="157" y2="162"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="167" y2="172"/>
+<polygon fill="#ffffff" points="462,14 679,14 689,24 689,77 462,77 462,14" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="462,14 679,14 689,24 689,77 462,77 462,14" stroke="#000000" stroke-width="1"/>
+<polygon fill="#ffffff" points="679,14 689,24 679,24 679,14" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="679,14 689,24 679,24 679,14" stroke="#000000" stroke-width="1"/>
+<text font-family="Lucida Grande" font-size="13" x="465" y="30">
 Provides the real services for</text>
-<text font-family="Lucida Grande" font-size="13" x="81" y="46">
+<text font-family="Lucida Grande" font-size="13" x="465" y="46">
 deployment packages, audit logs,</text>
-<text font-family="Lucida Grande" font-size="13" x="81" y="62">
+<text font-family="Lucida Grande" font-size="13" x="465" y="62">
 OBR access and so on.</text>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="72" y2="77"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="82" y2="87"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="92" y2="97"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="102" y2="107"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="112" y2="117"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="122" y2="127"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="132" y2="137"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="142" y2="147"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="152" y2="157"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="162" y2="167"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="172" y2="174"/>
-<polygon fill="#ffffff" points="414,446 595,446 605,456 605,501 414,501 414,446" stroke="#ffffff" stroke-width="1"/>
-<polyline fill="none" points="414,446 595,446 605,456 605,501 414,501 414,446" stroke="#000000" stroke-width="1"/>
-<polygon fill="#b2b2b2" points="595,446 605,456 595,456 595,446" stroke="#b2b2b2" stroke-width="1"/>
-<polyline fill="none" points="595,446 605,456 595,456 595,446" stroke="#000000" stroke-width="1"/>
-<text font-family="Lucida Grande" font-size="13" x="417" y="462">
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="77" y2="82"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="87" y2="92"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="97" y2="102"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="107" y2="112"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="117" y2="122"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="127" y2="132"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="137" y2="142"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="147" y2="152"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="157" y2="162"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="167" y2="172"/>
+<polygon fill="#ffffff" points="758,446 939,446 949,456 949,501 758,501 758,446" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="758,446 939,446 949,456 949,501 758,501 758,446" stroke="#000000" stroke-width="1"/>
+<polygon fill="#ffffff" points="939,446 949,456 939,456 939,446" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="939,446 949,456 939,456 939,446" stroke="#000000" stroke-width="1"/>
+<text font-family="Lucida Grande" font-size="13" x="761" y="462">
 Provides a REST API for the </text>
-<text font-family="Lucida Grande" font-size="13" x="417" y="478">
+<text font-family="Lucida Grande" font-size="13" x="761" y="478">
 entire client-API.</text>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="437" x2="437" y1="446" y2="441"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="437" x2="437" y1="436" y2="431"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="437" x2="437" y1="426" y2="421"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="437" x2="437" y1="416" y2="411"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="437" x2="437" y1="406" y2="401"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="437" x2="437" y1="396" y2="391"/>
-<rect fill="#00ff" height="80" stroke="#00ff" stroke-width="1" width="120" x="56" y="310"/>
-<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="56" y="310"/>
-<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="56" y="310"/>
-<text font-family="Lucida Grande" font-size="13" x="99" y="325">
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="446" y2="441"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="436" y2="431"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="426" y2="421"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="416" y2="411"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="406" y2="401"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="774" x2="774" y1="396" y2="391"/>
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="376" y="310"/>
+<rect fill="none" height="80" stroke="#00ff" stroke-width="1" width="120" x="376" y="310"/>
+<rect fill="#ffffff" height="80" stroke="#ffffff" stroke-width="1" width="120" x="376" y="310"/>
+<rect fill="none" height="80" stroke="#000000" stroke-width="1" width="120" x="376" y="310"/>
+<rect fill="#ffffff" height="0" stroke="#ffffff" stroke-width="1" width="108" x="387" y="311"/>
+<text font-family="Lucida Grande" font-size="13" x="419" y="325">
 Web UI</text>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="46" y="331"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="46" y="331"/>
-<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="46" y="358"/>
-<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="46" y="358"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="352" x2="347" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="342" x2="337" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="332" x2="327" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="322" x2="317" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="312" x2="307" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="302" x2="297" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="292" x2="287" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="282" x2="277" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="272" x2="267" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="262" x2="257" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="252" x2="247" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="242" x2="237" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="232" x2="227" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="222" x2="217" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="212" x2="207" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="202" x2="197" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="192" x2="187" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="182" x2="177" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="187" x2="175" y1="207" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="187" x2="175" y1="221" y2="214"/>
-<text font-family="Lucida Grande" font-size="13" x="217" y="201">
-direct / HTTP ①</text>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="704" x2="699" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="694" x2="689" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="684" x2="679" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="674" x2="669" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="664" x2="659" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="654" x2="649" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="644" x2="639" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="634" x2="629" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="624" x2="619" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="614" x2="609" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="604" x2="599" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="594" x2="589" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="584" x2="579" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="574" x2="569" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="564" x2="559" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="554" x2="549" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="544" x2="539" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="534" x2="529" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="524" x2="519" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="514" x2="509" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="504" x2="499" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="494" x2="489" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="484" x2="479" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="474" x2="471" y1="214" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="483" x2="471" y1="207" y2="214"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="483" x2="471" y1="221" y2="214"/>
-<text font-family="Lucida Grande" font-size="13" x="583" y="200">
-HTTP ②</text>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="406" x2="406" y1="310" y2="305"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="406" x2="406" y1="300" y2="295"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="406" x2="406" y1="290" y2="285"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="406" x2="406" y1="280" y2="275"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="406" x2="406" y1="270" y2="265"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="406" x2="406" y1="260" y2="255"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="413" x2="406" y1="265" y2="253"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="399" x2="406" y1="265" y2="253"/>
-<text font-family="Lucida Grande" font-size="13" x="417" y="287">
-direct / HTTP ③</text>
-<ellipse cx="404" cy="282" fill="#000000" rx="0.5" ry="0.5" stroke="#000000" stroke-width="1"/>
-<ellipse cx="405" cy="283" fill="#ffffff" rx="-0.5" ry="-0.5" stroke="#ffffff" stroke-width="1"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="175" x2="179" y1="310" y2="309"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="184" x2="189" y1="307" y2="306"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="194" x2="198" y1="304" y2="303"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="203" x2="208" y1="301" y2="300"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="213" x2="218" y1="298" y2="297"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="222" x2="227" y1="295" y2="294"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="232" x2="237" y1="292" y2="290"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="241" x2="246" y1="289" y2="287"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="251" x2="256" y1="286" y2="284"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="261" x2="265" y1="283" y2="281"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="270" x2="275" y1="280" y2="278"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="280" x2="285" y1="277" y2="275"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="289" x2="294" y1="274" y2="272"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="299" x2="304" y1="270" y2="269"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="308" x2="313" y1="267" y2="266"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="318" x2="323" y1="264" y2="263"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="328" x2="332" y1="261" y2="260"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="337" x2="342" y1="258" y2="257"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="347" x2="352" y1="255" y2="253"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="342" x2="352" y1="263" y2="253"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="338" x2="352" y1="250" y2="253"/>
-<text font-family="Lucida Grande" font-size="13" x="239" y="304">
-direct / HTTP ④</text>
-<polygon fill="#ffffff" points="70,446 235,446 245,456 245,501 70,501 70,446" stroke="#ffffff" stroke-width="1"/>
-<polyline fill="none" points="70,446 235,446 245,456 245,501 70,501 70,446" stroke="#000000" stroke-width="1"/>
-<polygon fill="#b2b2b2" points="235,446 245,456 235,456 235,446" stroke="#b2b2b2" stroke-width="1"/>
-<polyline fill="none" points="235,446 245,456 235,456 235,446" stroke="#000000" stroke-width="1"/>
-<text font-family="Lucida Grande" font-size="13" x="73" y="462">
-Provides a web interface</text>
-<text font-family="Lucida Grande" font-size="13" x="73" y="478">
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="366" y="331"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="366" y="331"/>
+<rect fill="#ffffff" height="10" stroke="#ffffff" stroke-width="1" width="20" x="366" y="358"/>
+<rect fill="none" height="10" stroke="#000000" stroke-width="1" width="20" x="366" y="358"/>
+<polygon fill="#ffffff" points="462,446 624,446 634,456 634,501 462,501 462,446" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="462,446 624,446 634,456 634,501 462,501 462,446" stroke="#000000" stroke-width="1"/>
+<polygon fill="#ffffff" points="624,446 634,456 624,456 624,446" stroke="#ffffff" stroke-width="1"/>
+<polyline fill="none" points="624,446 634,456 624,456 624,446" stroke="#000000" stroke-width="1"/>
+<text font-family="Lucida Grande" font-size="13" x="465" y="462">
+Provides a web interface </text>
+<text font-family="Lucida Grande" font-size="13" x="465" y="478">
 for the entire client-API.</text>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="446" y2="441"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="436" y2="431"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="426" y2="421"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="416" y2="411"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="406" y2="401"/>
-<line fill="#333399" stroke="#333399" stroke-width="1" x1="158" x2="158" y1="396" y2="391"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="446" y2="441"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="436" y2="431"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="426" y2="421"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="416" y2="411"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="406" y2="401"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="478" x2="478" y1="396" y2="391"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="672" x2="667" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="662" x2="657" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="652" x2="647" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="642" x2="637" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="632" x2="627" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="622" x2="617" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="612" x2="607" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="602" x2="597" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="592" x2="587" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="582" x2="577" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="572" x2="567" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="562" x2="557" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="552" x2="547" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="542" x2="537" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="532" x2="527" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="522" x2="517" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="512" x2="507" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="502" x2="497" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="507" x2="495" y1="207" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="507" x2="495" y1="221" y2="214"/>
+<text font-family="Lucida Grande" font-size="13" x="531" y="201">
+① direct + remote</text>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="726" x2="726" y1="310" y2="305"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="726" x2="726" y1="300" y2="295"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="726" x2="726" y1="290" y2="285"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="726" x2="726" y1="280" y2="275"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="726" x2="726" y1="270" y2="265"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="726" x2="726" y1="260" y2="255"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="733" x2="726" y1="265" y2="253"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="719" x2="726" y1="265" y2="253"/>
+<text font-family="Lucida Grande" font-size="13" x="734" y="287">
+③ direct + remote</text>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="495" x2="499" y1="310" y2="309"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="504" x2="509" y1="307" y2="306"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="514" x2="518" y1="304" y2="303"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="523" x2="528" y1="301" y2="300"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="533" x2="538" y1="298" y2="297"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="542" x2="547" y1="295" y2="294"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="552" x2="557" y1="292" y2="290"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="561" x2="566" y1="289" y2="287"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="571" x2="576" y1="286" y2="284"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="581" x2="585" y1="283" y2="281"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="590" x2="595" y1="280" y2="278"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="600" x2="605" y1="277" y2="275"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="609" x2="614" y1="274" y2="272"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="619" x2="624" y1="270" y2="269"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="628" x2="633" y1="267" y2="266"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="638" x2="643" y1="264" y2="263"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="648" x2="652" y1="261" y2="260"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="657" x2="662" y1="258" y2="257"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="667" x2="672" y1="255" y2="253"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="662" x2="672" y1="263" y2="253"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="658" x2="672" y1="250" y2="253"/>
+<text font-family="Lucida Grande" font-size="13" x="556" y="305">
+④ direct + remote</text>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="175" x2="180" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="185" x2="190" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="195" x2="200" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="205" x2="210" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="215" x2="220" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="225" x2="230" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="235" x2="240" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="245" x2="250" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="255" x2="260" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="265" x2="270" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="275" x2="280" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="285" x2="290" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="295" x2="300" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="305" x2="310" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="315" x2="320" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="325" x2="330" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="335" x2="340" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="345" x2="350" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="355" x2="360" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="365" x2="370" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="375" x2="376" y1="214" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="364" x2="376" y1="221" y2="214"/>
+<line fill="#333399" stroke="#333399" stroke-width="1" x1="364" x2="376" y1="207" y2="214"/>
+<text font-family="Lucida Grande" font-size="13" x="258" y="200">
+② remote</text>
 </svg>