<div dir="ltr"><div><div><div>Yes exactly. <br></div>But I also need to use this complex type attribute in the Endpoint.handleLoginResponse as the subjectNameID in order to avoid using the provided transient nameID ; something like : <br><br>       protected Response handleLoginResponse(String samlResponse, SAMLDocumentHolder holder, ResponseType responseType, String relayState) {

            <br>  try {
                <br>    AssertionType assertion = AssertionUtil.getAssertion(responseType, realm.getPrivateKey());
                <br>    SubjectType subject = assertion.getSubject();
                <br>    SubjectType.STSubType subType = subject.getSubType();
                <br>    NameIDType subjectNameID = (NameIDType) subType.getBaseID();
                <br>    //Map&lt;String, String&gt; notes = new HashMap&lt;&gt;();
                <br>    if (subjectNameID.getFormat() != null &amp;&amp; subjectNameID.getFormat().toString().equals(JBossSAMLURIConstants.NAMEID_FORMAT_TRANSIENT.get())) {
                        <br>      if (assertion.getAttributeStatements() != null ) {
                        <br>        for (AttributeStatementType attrStatement : assertion.getAttributeStatements()) {
                            <br>          for (AttributeStatementType.ASTChoiceType choice : attrStatement.getAttributes()) {<br>            AttributeType attribute = choice.getAttribute();
                                <br>            if (attribute.getFriendlyName().equals(&quot;eduPersonTargetID&quot;) || attribute.getName().equals(&quot;urn:oid:1.3.6.1.4.1.5923.1.1.1.10&quot;)) {
                                    <br>              if (!attribute.getAttributeValue().isEmpty()) {
                                            <br>                //TODO Use NameId of this attribute to replace subjectNameID
                                    <br>               }
                                <br>             }
                            <br>           }

                        <br>         } <br>        (...)<br>      }
                <br>    }<br><br></div>Do you think I need to patch this class in order to allow this or do you think there is a way of integration in keycloak considering the shibboleth federation use case ?<br><br></div>Best regards, Jérôme.<br><div><div><div><br><br><div><div dir="ltr"><span style="font-size:13px"><br></span></div><div dir="ltr"><span style="font-size:13px">Le ven. 22 janv. 2016 14:56, Bill Burke &lt;</span><a href="mailto:bburke@redhat.com" style="font-size:13px" target="_blank">bburke@redhat.com</a><span style="font-size:13px">&gt; a écrit :</span></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    Can you spell out exactly what you need here as I&#39;m not
    understanding.<br>
    <br>
    You need to support a complex attribute type?  Is that it?</div><div bgcolor="#FFFFFF" text="#000000"><br>
    <br>
    <div>On 1/22/2016 4:27 AM, Jérôme Blanchard
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">
        <div>
          <div>
            <div>
              <div>
                <div>
                  <div>
                    <div>
                      <div>Hi Bill, all, <br>
                        <br>
                      </div>
                      I succeed in authenticating via shibboleth
                      federation using SAML IdP but I encounter problem.<br>
                    </div>
                    One SAML attribute of our authentication response is
                    not of type String but a fulle NameID type
                    (eduPersonTargetId) and makes the authentication
                    crash because of class BaseWriter which is not able
                    to serialize an attribute which is not a String
                    (line 176).<br>
                  </div>
                  If I avoid this test, authentication works well using
                  the UsernameTemplateMapper.<br>
                </div>
                By the way, it does not solve the whole problem. The
                provider user id and the provider user name store the
                saml auth response nameid (and not an attribute) which
                makes the next IdP SAML session impossible to use the
                same keycloak account because of a change of this
                transient nameid...<br>
              </div>
              Actually, I don&#39;t see another solution than rewriting
              another Identity Provider based on Shibboleth attribute as
              a fork of the SAML provider but including.<br>
            </div>
            It will also allows me to include the Shibboleth DIscovery
            Service directly in keycloak instead of providing another
            webapp to ensure the federation idps synchronization by
            parsing periodiccaly the WAYF file.<br>
          </div>
          I will also provide a small patch for the BaseWriter in order
          to allow serialization of complex types attribute, except if
          you have in mind to do so...<br>
          <br>
        </div>
        Best regards, Jérôme.<br>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr">Le jeu. 14 janv. 2016 à 15:37, Jérôme Blanchard
          &lt;<a href="mailto:jayblanc@gmail.com" target="_blank">jayblanc@gmail.com</a>&gt;
          a écrit :<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          <div dir="ltr">
            <div>
              <div>Thanks for your answer.<br>
              </div>
              In fact Shibboleth supports others saml nameid but in the
              renater federation, it only contains transient nameid.
              Here is a part of their doc (sorry it&#39;s in french) : <br>
              <h2><a name="msg-f:1524080979926326179_msg-f:1524080948012771841_msg-f:1524074810140845538_msg-f:1523352597466697855_utilisation_des_identifiants_utilisateur_opaques">Utilisation
                  des identifiants utilisateur opaques</a></h2>
              <div>
                <p>
                  Voir <a href="https://services.renater.fr/federation/faq/shibboleth#definition_d_un_identifiant_utilisateur_opaque" title="federation:faq:shibboleth" target="_blank">la
                    description du eduPersonTargetedID</a>
                </p>
                <p>
                  Votre application a peut-être besoin de manipuler de
                  identifiants utilisateur, dont la valeur est stable
                  d&#39;une session à l&#39;autre ; par exemple pour gérer les
                  préférences utilisateur. Or, pour des raisons de
                  protection des données personnelles, les fournisseurs
                  d&#39;identités ne peuvent vous transmettre les
                  identifiants des utilisateurs. Dans ce cas, vous
                  pouvez demander aux fournisseurs d&#39;identités de vous
                  communiquer des identifiants stables mais opaques,
                  appelés <b>eduPersonTargetedID</b>. </p>
                <p>
                  Vous devrez configurer le fichier <i>AAP.xml</i> de
                  votre fournisseur de services Shibboleth comme indiqué
                  ci-dessous :
                </p>
                <pre>&lt;AttributeRule Name=&quot;urn:oid:1.3.6.1.4.1.5923.1.1.1.10&quot; Header=&quot;Shib-TargetedID&quot; Alias=&quot;targeted_id&quot;&gt;
   &lt;AnySite&gt;
     &lt;AnyValue/&gt;
   &lt;/AnySite&gt;
&lt;/AttributeRule&gt;</pre>
                <p>
                  L&#39;attribut sera accessible pour l&#39;application dans
                  l&#39;en-tête <acronym title="Hyper Text Transfer
                    Protocol">HTTP</acronym> <b><acronym title="Hyper Text Transfer Protocol">HTTP</acronym>_SHIB_TARGETEDID</b>
                  (avec Shibboleth 1.3). Le format du
                  eduPersonTargetedID est le suivant : identifiant_IdP<b>!</b>identifiant_SP<b>!</b>identifiant_utilisateur
                  <br>
                </p>
                <p><br>
                </p>
                <p>According to their doc, nameid are session based and
                  not user based so if you want stable identifier, you
                  have to ask for eduPersonTargetedID attribute !!<br>
                </p>
              </div>
              I&#39;m going to have a look at UsernameTemplateMapper.<br>
            </div>
            Thanks again, Jérôme.<br>
            <div>
              <h2><a name="msg-f:1524080979926326179_msg-f:1524080948012771841_msg-f:1524074810140845538_msg-f:1523352597466697855_comment_configurer_un_fournisseur_de_services_pour_qu_il_soit_reconnu_par_plusieurs_federations"></a></h2>
            </div>
          </div>
          <br>
          <div class="gmail_quote">
            <div dir="ltr">Le jeu. 14 janv. 2016 à 15:23, Bill Burke
              &lt;<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;
              a écrit :<br>
            </div>
            <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000"> Shibboleth only
                supports transient name ids?  I find that hard to
                believe.  Remember Keycloak would just look like any
                other client.  IMO you should go that route.<br>
                <br>
                Also though,  I think you might be able to write a
                Broker Mapper, take a look at UsernameTemplateMapper. 
                This SPI is undocumented and unsupported at the moment,
                but I hope to change that soon.</div>
              <div bgcolor="#FFFFFF" text="#000000"><br>
                <br>
                <div>On 1/14/2016 6:20 AM, Jérôme Blanchard wrote:<br>
                </div>
                <blockquote type="cite">
                  <div dir="ltr">
                    <div>
                      <div>
                        <div>
                          <div>
                            <div>
                              <div>Hi all, <br>
                                <br>
                              </div>
                              According to shibboleth specification, IdP
                              of a federation usually use transient
                              NameID which makes Shibboleth impossible
                              to interface with keycloak, even if we
                              manage the Discovery Service externally in
                              order to maintain IdP list mapping between
                              federation and keycloak.<br>
                            </div>
                            It&#39;s really annoying for me and I&#39;m trying
                            to investigate a way to solve this problem.<br>
                          </div>
                          In my federation, some doc say that if you
                          need to manage personnal user information in
                          your application, you have to rely on a
                          dedicated attribute in order to retreive real
                          user id and not the transient opaque one. In
                          this case, an attribute called
                          eduPersoneTargetedId exists and can be use by
                          shibboleth. <br>
                        </div>
                        I am trying to patch the saml broker in order to
                        take into consideration this attribute in a kind
                        of attributeToNameIdMapper but I have to admit
                        that I&#39;m lost a bit in the code.<br>
                      </div>
                      Do you think this approach is good ?<br>
                      <br>
                    </div>
                    <div>Best regards, Jérôme.<br>
                    </div>
                    <br>
                  </div>
                  <br>
                  <div class="gmail_quote">
                    <div dir="ltr">Le mer. 6 janv. 2016 à 09:31, Jérôme
                      Blanchard &lt;<a href="mailto:jayblanc@gmail.com" target="_blank">jayblanc@gmail.com</a>&gt;

                      a écrit :<br>
                    </div>
                    <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                      <div dir="ltr">
                        <div>
                          <div>
                            <div>Hi Bill, all, <br>
                              <br>
                            </div>
                            In the case of a transient only nameid,
                            would it be possible to create a dedicated
                            attribute mapper in order to use for exemple
                            the email attribute as name identifier ?<br>
                            <br>
                          </div>
                          PS : the
                          urn:mace:shibboleth:1.0:nameIdentifier is in
                          fact use in SAML v1 for request a nameid that
                          is transient also... so there is no solution
                          in this way.<br>
                          <br>
                        </div>
                        Best regards, Jérôme.<br>
                      </div>
                      <br>
                      <div class="gmail_quote">
                        <div dir="ltr">Le mar. 5 janv. 2016 à 16:13,
                          Bill Burke &lt;<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt; a
                          écrit :<br>
                        </div>
                        <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We won&#39;t be able to
                          support temporary ids (transient) for awhile
                          as it<br>
                          requires temporary user creation which
                          requires some rearchitecting.<br>
                          <br>
                          As for
                          &quot;urn:mace:shibboleth:1.0:nameIdentifier&quot; if
                          you spec it out in a<br>
                          JIRA and it is simple enough to implement
                          support for, we may be able to<br>
                          get it in.<br>
                          <br>
                          On 1/5/2016 8:18 AM, Jérôme Blanchard wrote:<br>
                          &gt; Hi Bill,<br>
                          &gt;<br>
                          &gt; Thanks for your answer regarding
                          transient and temporary ids. I<br>
                          &gt; understand the problem due to keycloak
                          account creation and binding to<br>
                          &gt; the IdP.<br>
                          &gt; Renarter is using Shibboleth ; Is there
                          is any work on shibboleth<br>
                          &gt; integration for keycloak ?<br>
                          &gt; If I look into the idps entities
                          descriptors of renater, I found that it<br>
                          &gt; uses also another nameid format based on
                          shibboleth namesapce :<br>
                          &gt;
&lt;md:NameIDFormat&gt;urn:mace:shibboleth:1.0:nameIdentifier&lt;/md:NameIDFormat&gt;<br>
                          &gt;
&lt;md:NameIDFormat&gt;urn:oasis:names:tc:SAML:2.0:nameid-format:transient&lt;/md:NameIDFormat&gt;<br>
                          &gt;<br>
                          &gt; Do you think it is possible to patch the
                          saml idp provider (or to create<br>
                          &gt; another one dedicated to shibboleth) in
                          order to integrate keycloak to<br>
                          &gt; our identity federation (renater) ?<br>
                          &gt;<br>
                          &gt; Best whiches for this upcoming year and
                          thanks for your great work<br>
                          &gt; around keycloak.<br>
                          &gt;<br>
                          &gt; Jérôme.<br>
                          &gt;<br>
                          &gt;<br>
                          &gt; Le mar. 22 déc. 2015 à 21:10, Bill Burke
                          &lt;<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a><br>
                          &gt; &lt;mailto:<a href="mailto:bburke@redhat.com" target="_blank">bburke@redhat.com</a>&gt;&gt;

                          a écrit :<br>
                          &gt;<br>
                          &gt;     Our brokering doesn&#39;t support
                          temporary user ids from the &quot;parent&quot; IDP.<br>
                          &gt;        Transient Ids in SAML or temporary
                          ids.<br>
                          &gt;<br>
                          &gt;     On 12/22/2015 11:46 AM, Jérôme
                          Blanchard wrote:<br>
                          &gt;      &gt; Hi,<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; I&#39;m trying to integrate
                          keycloak into a the french research<br>
                          &gt;     federation<br>
                          &gt;      &gt; of identity (renater) and I&#39;m
                          facing some problems.<br>
                          &gt;      &gt; Actually, when IdP respond to
                          keycloak i&#39;m getting the following<br>
                          &gt;     error :<br>
                          &gt;      &gt; PL00084: Writer: Unsupported
                          Attribute<br>
                          &gt;      &gt;
                          Value:org.keycloak.dom.saml.v2.assertion.NameIDType<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; It seems that this IdP is using
                          transient NameID policy only and<br>
                          &gt;     using<br>
                          &gt;      &gt; the unspecified field in the
                          idp config in keycloak generate this<br>
                          &gt;      &gt; exception as a return.<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; Log of the keycloak server is
                          joined.<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; I have no idea of what
                          happening because when I was using the test<br>
                          &gt;      &gt; federation, everything was
                          working but no I&#39;m in the production<br>
                          &gt;      &gt; federation, login fails.<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; The renater federation is using
                          Shibolleth and keycloak is not<br>
                          &gt;     supported<br>
                          &gt;      &gt; by federation moderators so I&#39;m
                          alone in the dark now...<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; Renater provides an IdP list
                          that I have to parse and<br>
                          &gt;     synchronized with<br>
                          &gt;      &gt; IdP in keycloak. As a return I
                          provide a list of all endpoints<br>
                          &gt;     for each<br>
                          &gt;      &gt; keycloak registered IdP to
                          allow federation IdP to answear<br>
                          &gt;     correctly to<br>
                          &gt;      &gt; the right endpoint. All of this
                          is done by a small web app deployed<br>
                          &gt;      &gt; aside keycloak and using REST
                          API to synchronize all the IdP.<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; One of the IdP entity
                          descriptor is joined. As you can see, only<br>
                          &gt;      &gt; transient nameid policy is
                          supported and if I configure keycloak<br>
                          &gt;     to use<br>
                          &gt;      &gt; email or persistent, I received
                          a response saying that the nameid<br>
                          &gt;     is not<br>
                          &gt;      &gt; supported :<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; &lt;samlp:AuthnRequest<br>
                          &gt;   
                           xmlns:samlp=&quot;urn:oasis:names:tc:SAML:2.0:protocol&quot;<br>
                          &gt;      &gt;
                          xmlns=&quot;urn:oasis:names:tc:SAML:2.0:assertion&quot;<br>
                          &gt;      &gt;<br>
                          &gt;     AssertionConsumerServiceURL=&quot;<a href="https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint" target="_blank"></a><a href="https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint" target="_blank">https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint</a>&quot;<br>
                          &gt;      &gt; Destination=&quot;<a href="https://janus.cnrs.fr/idp/profile/SAML2/POST/SSO" rel="noreferrer" target="_blank"></a><a href="https://janus.cnrs.fr/idp/profile/SAML2/POST/SSO" target="_blank">https://janus.cnrs.fr/idp/profile/SAML2/POST/SSO</a>&quot;<br>
                          &gt;      &gt; ForceAuthn=&quot;false&quot;
                          ID=&quot;ID_c53b5759-cb97-4e95-b540-877a7a6c625d&quot;<br>
                          &gt;      &gt; IsPassive=&quot;false&quot;
                          IssueInstant=&quot;2015-12-22T16:13:15.987Z&quot;<br>
                          &gt;      &gt;
                          ProtocolBinding=&quot;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST&quot;<br>
                          &gt;      &gt;
                          Version=&quot;2.0&quot;&gt;&lt;saml:Issuer<br>
                          &gt;      &gt;<br>
                          &gt;   
                           xmlns:saml=&quot;urn:oasis:names:tc:SAML:2.0:assertion&quot;&gt;<a href="https://demo-auth.ortolang.fr/auth/realms/ortolang" target="_blank"></a><a href="https://demo-auth.ortolang.fr/auth/realms/ortolang" target="_blank">https://demo-auth.ortolang.fr/auth/realms/ortolang</a>&lt;/saml:Issuer&gt;&lt;samlp:NameIDPolicy<br>
                          &gt;      &gt; AllowCreate=&quot;true&quot;<br>
                          &gt;      &gt;<br>
                          &gt;   
 Format=&quot;urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress&quot;/&gt;&lt;/samlp:AuthnRequest&gt;<br>
                          &gt;      &gt;<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; &lt;saml2p:Response
                          xmlns:saml2p=&quot;urn:oasis:names:tc:SAML:2.0:protocol&quot;<br>
                          &gt;      &gt;<br>
                          &gt;     Destination=&quot;<a href="https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint" rel="noreferrer" target="_blank"></a><a href="https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint" target="_blank">https://demo-auth.ortolang.fr/auth/realms/ortolang/broker/2db5eab3f83cbaa5a322dcf3f9ac552d/endpoint</a>&quot;<br>
                          &gt;      &gt;
                          ID=&quot;_9d03761957aade819b6823c35bbab278&quot;<br>
                          &gt;      &gt;
                          InResponseTo=&quot;ID_c53b5759-cb97-4e95-b540-877a7a6c625d&quot;<br>
                          &gt;      &gt;
                          IssueInstant=&quot;2015-12-22T16:13:16.420Z&quot;
                          Version=&quot;2.0&quot;&gt;&lt;saml2:Issuer<br>
                          &gt;      &gt;
                          xmlns:saml2=&quot;urn:oasis:names:tc:SAML:2.0:assertion&quot;<br>
                          &gt;      &gt;<br>
                          &gt;   
                           Format=&quot;urn:oasis:names:tc:SAML:2.0:nameid-format:entity&quot;&gt;<a href="https://janus.cnrs.fr/idp" target="_blank"></a><a href="https://janus.cnrs.fr/idp" target="_blank">https://janus.cnrs.fr/idp</a>&lt;/saml2:Issuer&gt;&lt;saml2p:Status&gt;&lt;saml2p:StatusCode<br>
                          &gt;      &gt;<br>
                          &gt;   
 Value=&quot;urn:oasis:names:tc:SAML:2.0:status:Responder&quot;&gt;&lt;saml2p:StatusCode<br>
                          &gt;      &gt;<br>
                          &gt;   
 Value=&quot;urn:oasis:names:tc:SAML:2.0:status:InvalidNameIDPolicy&quot;/&gt;&lt;/saml2p:StatusCode&gt;&lt;saml2p:StatusMessage&gt;Required<br>
                          &gt;      &gt; NameID format not<br>
                          &gt;      &gt;
supported&lt;/saml2p:StatusMessage&gt;&lt;/saml2p:Status&gt;&lt;/saml2p:Response&gt;<br>
                          &gt;      &gt;<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; Any help would be gracefully
                          appreciated.<br>
                          &gt;      &gt;<br>
                          &gt;      &gt; Thanks a lot, Jérôme.<br>
                          &gt;      &gt;<br>
                          &gt;      &gt;<br>
                          &gt;      &gt;<br>
                          &gt;      &gt;
                          _______________________________________________<br>
                          &gt;      &gt; keycloak-user mailing list<br>
                          &gt;      &gt; <a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>
                          &lt;mailto:<a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>&gt;<br>
                          &gt;      &gt; <a href="https://lists.jboss.org/mailman/listinfo/keycloak-user" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-user</a><br>
                          &gt;      &gt;<br>
                          &gt;<br>
                          &gt;     --<br>
                          &gt;     Bill Burke<br>
                          &gt;     JBoss, a division of Red Hat<br>
                          &gt;     <a href="http://bill.burkecentral.com" rel="noreferrer" target="_blank">http://bill.burkecentral.com</a><br>
                          &gt;   
                           _______________________________________________<br>
                          &gt;     keycloak-user mailing list<br>
                          &gt;     <a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>
                          &lt;mailto:<a href="mailto:keycloak-user@lists.jboss.org" target="_blank">keycloak-user@lists.jboss.org</a>&gt;<br>
                          &gt;     <a href="https://lists.jboss.org/mailman/listinfo/keycloak-user" rel="noreferrer" target="_blank">https://lists.jboss.org/mailman/listinfo/keycloak-user</a><br>
                          &gt;<br>
                          <br>
                          --<br>
                          Bill Burke<br>
                          JBoss, a division of Red Hat<br>
                          <a href="http://bill.burkecentral.com" rel="noreferrer" target="_blank">http://bill.burkecentral.com</a><br>
                        </blockquote>
                      </div>
                    </blockquote>
                  </div>
                </blockquote>
                <br>
                <pre cols="72">-- 
Bill Burke
JBoss, a division of Red Hat
<a href="http://bill.burkecentral.com" target="_blank">http://bill.burkecentral.com</a></pre>
              </div>
            </blockquote>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
    <pre cols="72">-- 
Bill Burke
JBoss, a division of Red Hat
<a href="http://bill.burkecentral.com" target="_blank">http://bill.burkecentral.com</a></pre>
  </div></blockquote></div></div></div></div></div></div>