xwss
  1. xwss
  2. XWSS-32

ttps://xwss.dev.java.net/SimpleJDK6WS.zip is broken

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: current
    • Fix Version/s: milestone 1
    • Component/s: www
    • Labels:
      None
    • Environment:

      Operating System: All
      Platform: All

    • Issuezilla Id:
      32

      Description

      On https://xwss.dev.java.net/Securing_JAVASE6_WebServices.html the https://xwss.dev.java.net/SimpleJDK6WS.zip is not in a finished state.

      In particular:

      /**
      *

      • @author kumar jayanti
        */
        public class SimpleWSClient {

      /** Creates a new instance of SimpleWSClient */
      public SimpleWSClient() {
      }

      public static void main(String[] args) throws Exception {

      try

      { // Call Web Service Operation client.MainService service = new client.MainService(); client.Main port = service.getMainPort(); ((BindingProvider)port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "Ron"); ((BindingProvider)port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "noR"); //List<Handler> chain = new ArrayList<Handler>(); //chain.add(new simplejdk6ws.SecurityHandler("client")); //((BindingProvider)port).getBinding().setHandlerChain(chain); String result = port.sayHello("TOM WITMER"); System.out.println("Result = "+result); }

      catch (Exception ex)

      { // TODO handle custom exceptions here throw ex; }

      }

      }

      As shown above the security parts are actually commented out!

      I have been trying to get this stuff to work but the sample is broken. Please fix it.

        Activity

        Hide
        kumarjayanti added a comment -

        Please follow the README.txt and i am sure it works. I downloaded it again and
        tried it just now to be sure.

        The commented handler chain is becuase this sample does not use the handler
        chain. This is one of the 3 ways demonstrated in the article. This uses XWSS 2.0
        style security and the security policy is specified in src/META-INF directory.
        Looks for files client_security_config.xml and server_security_config.xml files.

        Here is the console log of the steps i followed from the README.

        Server Side
        -----------------
        E:\FRESH\SimpleJDK6WS>cd SimpleJDK6WS\src

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>copy E:\FRESH\wsit\wsit\dist\image\metro\
        lib\webservices-api.jar E:\jdk6skid\jre\lib\endorsed
        Overwrite E:\jdk6skid\jre\lib\endorsed\webservices-api.jar? (Yes/No/All): yes
        1 file(s) copied.

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>copy E:\FRESH\wsit\wsit\dist\image\metro\
        lib\webservices-rt.jar .
        1 file(s) copied.

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>copy E:\FRESH\wsit\wsit\dist\image\metro\
        lib\webservices-tools.jar .
        1 file(s) copied.

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>apt cp .;webservices-rt.jar;webservices
        tools.jar simplejdk6ws/Main.java
        warning: Annotation types without processors: [javax.annotation.Resource]
        1 warning
        warning: Annotation types without processors: [javax.xml.bind.annotation.XmlRoot
        Element, javax.xml.bind.annotation.XmlAccessorType, javax.xml.bind.annotation.Xm
        lType, javax.xml.bind.annotation.XmlElement]
        1 warning

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>javac -cp .;webservices-rt.jar;webservice
        s-tools.jar simplejdk6ws/*.java
        simplejdk6ws\SimpleWSClient.java:31: package client does not exist
        client.MainService service =
        ^
        simplejdk6ws\SimpleWSClient.java:32: package client does not exist
        new client.MainService();
        ^
        simplejdk6ws\SimpleWSClient.java:33: package client does not exist
        client.Main port = service.getMainPort();
        ^
        3 errors

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>java -cp .;webservices-rt.jar;webservices
        -tools.jar simplejdk6ws.Main
        HelloServer is open for business at http://localhost:8080/WebServiceExample/sayh
        ello

        Client Side
        -------------
        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>wsimport -p client http://localhost:8080/
        WebServiceExample/sayhello?wsdl

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>javac -cp .;webservices-rt.jar;webservice
        s-tools.jar simplejdk6ws/*.java

        E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>java -cp .;webservices-rt.jar;webservices
        -tools.jar simplejdk6ws.SimpleWSClient
        Got Username......... : Ron
        Got Password......... : noR
        Jun 28, 2008 1:31:49 PM com.sun.xml.wss.impl.filter.DumpFilter process
        INFO: ==== Sending Message Start ====
        <?xml version="1.0" encoding="UTF-8"?>
        <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-w
        ss-wssecurity-secext-1.0.xsd" S:mustUnderstand="1">
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-2004
        01-wss-wssecurity-utility-1.0.xsd" wsu:Id="XWSSGID-1214640107656-784321985">
        <wsse:Username>Ron</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-use
        rname-token-profile-1.0#PasswordText">****</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-ws
        s-soap-message-security-1.0#Base64Binary">LdWfFxGV0+wSxiq4Wwkdp1YF</wsse:Nonce>
        <wsu:Created>2008-06-28T08:01:48Z</wsu:Created>
        </wsse:UsernameToken>
        </wsse:Security>
        </S:Header>
        <S:Body>
        <ns2:sayHello xmlns:ns2="http://simplejdk6ws/">
        <arg0>TOM WITMER</arg0>
        </ns2:sayHello>
        </S:Body>
        </S:Envelope>
        ==== Sending Message End ====

        Jun 28, 2008 1:31:51 PM com.sun.xml.wss.impl.filter.DumpFilter process
        INFO: ==== Received Message Start ====
        <?xml version="1.0" encoding="UTF-8"?>
        <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Header/>
        <S:Body>
        <ns2:sayHelloResponse xmlns:ns2="http://simplejdk6ws/">
        <return>Hello!!! TOM WITMER</return>
        </ns2:sayHelloResponse>
        </S:Body>
        </S:Envelope>
        ==== Received Message End ====
        Result = Hello!!! TOM WITMER

        Server Side Dump, when the client was run
        -------------------------------------------

        Jun 28, 2008 1:31:50 PM com.sun.xml.wss.impl.filter.DumpFilter process
        INFO: ==== Received Message Start ====
        <?xml version="1.0" encoding="UTF-8"?>
        <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-w
        ss-wssecurity-secext-1.0.xsd" S:mustUnderstand="1">
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-2004
        01-wss-wssecurity-utility-1.0.xsd" wsu:Id="XWSSGID-1214640107656-784321985">
        <wsse:Username>Ron</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-use
        rname-token-profile-1.0#PasswordText">****</wsse:Password>
        <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-ws
        s-soap-message-security-1.0#Base64Binary">LdWfFxGV0+wSxiq4Wwkdp1YF</wsse:Nonce>
        <wsu:Created>2008-06-28T08:01:48Z</wsu:Created>
        </wsse:UsernameToken>
        </wsse:Security>
        </S:Header>
        <S:Body>
        <ns2:sayHello xmlns:ns2="http://simplejdk6ws/">
        <arg0>TOM WITMER</arg0>
        </ns2:sayHello>
        </S:Body>
        </S:Envelope>
        ==== Received Message End ====

        Requester Subject Subject:
        Principal: CN=Ron
        Public Credential: Ron

        Hello!!! TOM WITMER
        Jun 28, 2008 1:31:51 PM com.sun.xml.wss.impl.filter.DumpFilter process
        INFO: ==== Sending Message Start ====
        <?xml version="1.0" encoding="UTF-8"?>
        <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Body>
        <ns2:sayHelloResponse xmlns:ns2="http://simplejdk6ws/">
        <return>Hello!!! TOM WITMER</return>
        </ns2:sayHelloResponse>
        </S:Body>
        </S:Envelope>
        ==== Sending Message End ====

        Show
        kumarjayanti added a comment - Please follow the README.txt and i am sure it works. I downloaded it again and tried it just now to be sure. The commented handler chain is becuase this sample does not use the handler chain. This is one of the 3 ways demonstrated in the article. This uses XWSS 2.0 style security and the security policy is specified in src/META-INF directory. Looks for files client_security_config.xml and server_security_config.xml files. Here is the console log of the steps i followed from the README. Server Side ----------------- E:\FRESH\SimpleJDK6WS>cd SimpleJDK6WS\src E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>copy E:\FRESH\wsit\wsit\dist\image\metro\ lib\webservices-api.jar E:\jdk6skid\jre\lib\endorsed Overwrite E:\jdk6skid\jre\lib\endorsed\webservices-api.jar? (Yes/No/All): yes 1 file(s) copied. E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>copy E:\FRESH\wsit\wsit\dist\image\metro\ lib\webservices-rt.jar . 1 file(s) copied. E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>copy E:\FRESH\wsit\wsit\dist\image\metro\ lib\webservices-tools.jar . 1 file(s) copied. E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>apt cp .;webservices-rt.jar;webservices tools.jar simplejdk6ws/Main.java warning: Annotation types without processors: [javax.annotation.Resource] 1 warning warning: Annotation types without processors: [javax.xml.bind.annotation.XmlRoot Element, javax.xml.bind.annotation.XmlAccessorType, javax.xml.bind.annotation.Xm lType, javax.xml.bind.annotation.XmlElement] 1 warning E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>javac -cp .;webservices-rt.jar;webservice s-tools.jar simplejdk6ws/*.java simplejdk6ws\SimpleWSClient.java:31: package client does not exist client.MainService service = ^ simplejdk6ws\SimpleWSClient.java:32: package client does not exist new client.MainService(); ^ simplejdk6ws\SimpleWSClient.java:33: package client does not exist client.Main port = service.getMainPort(); ^ 3 errors E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>java -cp .;webservices-rt.jar;webservices -tools.jar simplejdk6ws.Main HelloServer is open for business at http://localhost:8080/WebServiceExample/sayh ello Client Side ------------- E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>wsimport -p client http://localhost:8080/ WebServiceExample/sayhello?wsdl E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>javac -cp .;webservices-rt.jar;webservice s-tools.jar simplejdk6ws/*.java E:\FRESH\SimpleJDK6WS\SimpleJDK6WS\src>java -cp .;webservices-rt.jar;webservices -tools.jar simplejdk6ws.SimpleWSClient Got Username......... : Ron Got Password......... : noR Jun 28, 2008 1:31:49 PM com.sun.xml.wss.impl.filter.DumpFilter process INFO: ==== Sending Message Start ==== <?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-w ss-wssecurity-secext-1.0.xsd" S:mustUnderstand="1"> <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-2004 01-wss-wssecurity-utility-1.0.xsd" wsu:Id="XWSSGID-1214640107656-784321985"> <wsse:Username>Ron</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-use rname-token-profile-1.0#PasswordText">****</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-ws s-soap-message-security-1.0#Base64Binary">LdWfFxGV0+wSxiq4Wwkdp1YF</wsse:Nonce> <wsu:Created>2008-06-28T08:01:48Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </S:Header> <S:Body> <ns2:sayHello xmlns:ns2="http://simplejdk6ws/"> <arg0>TOM WITMER</arg0> </ns2:sayHello> </S:Body> </S:Envelope> ==== Sending Message End ==== Jun 28, 2008 1:31:51 PM com.sun.xml.wss.impl.filter.DumpFilter process INFO: ==== Received Message Start ==== <?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Header/> <S:Body> <ns2:sayHelloResponse xmlns:ns2="http://simplejdk6ws/"> <return>Hello!!! TOM WITMER</return> </ns2:sayHelloResponse> </S:Body> </S:Envelope> ==== Received Message End ==== Result = Hello!!! TOM WITMER Server Side Dump, when the client was run ------------------------------------------- Jun 28, 2008 1:31:50 PM com.sun.xml.wss.impl.filter.DumpFilter process INFO: ==== Received Message Start ==== <?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-w ss-wssecurity-secext-1.0.xsd" S:mustUnderstand="1"> <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-2004 01-wss-wssecurity-utility-1.0.xsd" wsu:Id="XWSSGID-1214640107656-784321985"> <wsse:Username>Ron</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-use rname-token-profile-1.0#PasswordText">****</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-ws s-soap-message-security-1.0#Base64Binary">LdWfFxGV0+wSxiq4Wwkdp1YF</wsse:Nonce> <wsu:Created>2008-06-28T08:01:48Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </S:Header> <S:Body> <ns2:sayHello xmlns:ns2="http://simplejdk6ws/"> <arg0>TOM WITMER</arg0> </ns2:sayHello> </S:Body> </S:Envelope> ==== Received Message End ==== Requester Subject Subject: Principal: CN=Ron Public Credential: Ron Hello!!! TOM WITMER Jun 28, 2008 1:31:51 PM com.sun.xml.wss.impl.filter.DumpFilter process INFO: ==== Sending Message Start ==== <?xml version="1.0" encoding="UTF-8"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:sayHelloResponse xmlns:ns2="http://simplejdk6ws/"> <return>Hello!!! TOM WITMER</return> </ns2:sayHelloResponse> </S:Body> </S:Envelope> ==== Sending Message End ====
        Hide
        gregrluck added a comment -

        Can we leave this issue open a little longer.

        I am trying to follow Option 3 on https://xwss.dev.java.net/Securing_JAVASE6_WebServices.html.

        It says:

        "So you can run the packaged version of this sample by downloading the ZIP file from :
        SimpleJDK6WS.zip"

        But there is a problem.

        The sample code shown in option 3 in the article does not match the download sample. In particular
        the article has

        public static void main(String[] args)

        { Endpoint endpoint = Endpoint.publish("http://localhost:8080/WebServiceExample/sayhello", new Main()); Binding binding = endpoint.getBinding(); //Add a SecurityHandler as the first handler on the server side List<Handler> handlerChain = new LinkedList<Handler>(); handlerChain.add(new simplejdk6ws.SecurityHandler("server")); binding.setHandlerChain(handlerChain); System.out.println("HelloServer is open for business at http://localhost:8080/WebServiceExample/sayhello"); }

        The sample, as you point out, skips the programmatic handler registration and has:

        /**

        • @param args the command line arguments
          */
          public static void main(String[] args) { // TODO code application logic here Endpoint endpoint = Endpoint.publish( "http://localhost:8080/WebServiceExample/sayhello", new Main()); //Binding binding = endpoint.getBinding(); //List<Handler> handlerChain = new LinkedList<Handler>(); //handlerChain.add(new simplejdk6ws.SecurityHandler("server")); //binding.setHandlerChain(handlerChain); System.out.println("HelloServer is open for business at http://localhost:8080/WebServiceExample/sayhello"); }

        The two are inconsistent. Also it is not clear whether this is XWSS 2 or 3.

        The README says:

        2. Download Latest WSIT build :
        (if you have access to hudson then the link is : http://kohsuke.sfbay/hudson/job/wsit-javanet-
        bleedingedge/

        I have trying to write production code here and am not interested in bleeding edge stuff. I am trying to
        use the XWSS 3.0 FCS.

        I have an existing JAX-WS application I am trying to secure.

        I am following the sample as stated in the article. So consider this bug to be the inconsistencies
        between the two as expressed above. It is very confusing if you are a newbie like me.

        What is not working for me is the following:

        Endpoint endpoint = Endpoint.publish(address, implementor);
        Binding binding = endpoint.getBinding();
        //Add a SecurityHandler as the first handler on the server side
        List<Handler> handlerChain = new LinkedList<Handler>();
        handlerChain.add(new SecurityHandler("server"));
        binding.setHandlerChain(handlerChain);
        System.out.println("Web Service listening at URI " + address);

        net.sf.ehcache.server.soap.jaxws.EhcacheWebServiceEndpoint cacheService =
        new EhcacheWebServiceEndpointService().getEhcacheWebServiceEndpointPort();

        //invoke business method
        String result = cacheService.ping();
        assertEquals("pong", result);

        cacheService.ping() should not work because I have configured security as per the article. But it keeps
        happily working as if there were no security.

        But when I compare server_security_config.xml looks nothing like the article which has:
        <xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config"
        dumpMessages="true" >
        <xwss:RequireUsernameToken passwordDigestRequired="false"/>
        </xwss:SecurityConfiguration>

        From debugging it is clear that I have a security handler registered but it is never invoked and I have
        not idea how to reconcile the article with the "download sample".

        The final thing is that I have Java 5 (Mac PowerPC so I cannot use Java 6) and I am unclear whether SimpleJDK6WS.zip really requires 6 or not. For JAX-WS 6 is not required. I am using the http.jar from 6
        which is shipped with the Jersey project.

        So, after all that, I guess I

        Show
        gregrluck added a comment - Can we leave this issue open a little longer. I am trying to follow Option 3 on https://xwss.dev.java.net/Securing_JAVASE6_WebServices.html . It says: "So you can run the packaged version of this sample by downloading the ZIP file from : SimpleJDK6WS.zip" But there is a problem. The sample code shown in option 3 in the article does not match the download sample. In particular the article has public static void main(String[] args) { Endpoint endpoint = Endpoint.publish("http://localhost:8080/WebServiceExample/sayhello", new Main()); Binding binding = endpoint.getBinding(); //Add a SecurityHandler as the first handler on the server side List<Handler> handlerChain = new LinkedList<Handler>(); handlerChain.add(new simplejdk6ws.SecurityHandler("server")); binding.setHandlerChain(handlerChain); System.out.println("HelloServer is open for business at http://localhost:8080/WebServiceExample/sayhello"); } The sample, as you point out, skips the programmatic handler registration and has: /** @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here Endpoint endpoint = Endpoint.publish( "http://localhost:8080/WebServiceExample/sayhello", new Main()); //Binding binding = endpoint.getBinding(); //List<Handler> handlerChain = new LinkedList<Handler>(); //handlerChain.add(new simplejdk6ws.SecurityHandler("server")); //binding.setHandlerChain(handlerChain); System.out.println("HelloServer is open for business at http://localhost:8080/WebServiceExample/sayhello"); } The two are inconsistent. Also it is not clear whether this is XWSS 2 or 3. The README says: 2. Download Latest WSIT build : (if you have access to hudson then the link is : http://kohsuke.sfbay/hudson/job/wsit-javanet- bleedingedge/ I have trying to write production code here and am not interested in bleeding edge stuff. I am trying to use the XWSS 3.0 FCS. I have an existing JAX-WS application I am trying to secure. I am following the sample as stated in the article. So consider this bug to be the inconsistencies between the two as expressed above. It is very confusing if you are a newbie like me. What is not working for me is the following: Endpoint endpoint = Endpoint.publish(address, implementor); Binding binding = endpoint.getBinding(); //Add a SecurityHandler as the first handler on the server side List<Handler> handlerChain = new LinkedList<Handler>(); handlerChain.add(new SecurityHandler("server")); binding.setHandlerChain(handlerChain); System.out.println("Web Service listening at URI " + address); net.sf.ehcache.server.soap.jaxws.EhcacheWebServiceEndpoint cacheService = new EhcacheWebServiceEndpointService().getEhcacheWebServiceEndpointPort(); //invoke business method String result = cacheService.ping(); assertEquals("pong", result); cacheService.ping() should not work because I have configured security as per the article. But it keeps happily working as if there were no security. But when I compare server_security_config.xml looks nothing like the article which has: <xwss:SecurityConfiguration xmlns:xwss="http://java.sun.com/xml/ns/xwss/config" dumpMessages="true" > <xwss:RequireUsernameToken passwordDigestRequired="false"/> </xwss:SecurityConfiguration> From debugging it is clear that I have a security handler registered but it is never invoked and I have not idea how to reconcile the article with the "download sample". The final thing is that I have Java 5 (Mac PowerPC so I cannot use Java 6) and I am unclear whether SimpleJDK6WS.zip really requires 6 or not. For JAX-WS 6 is not required. I am using the http.jar from 6 which is shipped with the Jersey project. So, after all that, I guess I
        Hide
        kumarjayanti added a comment -

        Hi Greg,

        Sorry for the mixup. It appears the original sample for Option 3 got
        overwritten with another one and that has caused this issue.

        I have now fixed the article as well as the sample, you can use Production
        quality Metro 1.2 to run the sample. I have updated the README.

        https://xwss.dev.java.net/Securing_JAVASE6_WebServices.html

        Thanks again for the Feedback and let me know if it worked this time around for you.

        Show
        kumarjayanti added a comment - Hi Greg, Sorry for the mixup. It appears the original sample for Option 3 got overwritten with another one and that has caused this issue. I have now fixed the article as well as the sample, you can use Production quality Metro 1.2 to run the sample. I have updated the README. https://xwss.dev.java.net/Securing_JAVASE6_WebServices.html Thanks again for the Feedback and let me know if it worked this time around for you.

          People

          • Assignee:
            xwss-issues
            Reporter:
            gregrluck
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved: