diff --git a/product/modules/agents/windows/jax-rs/build.xml b/product/modules/agents/windows/jax-rs/build.xml new file mode 100644 index 0000000000..fe8e11092d --- /dev/null +++ b/product/modules/agents/windows/jax-rs/build.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/windows/jax-rs/pom.xml b/product/modules/agents/windows/jax-rs/pom.xml new file mode 100644 index 0000000000..1b3963e4b7 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/pom.xml @@ -0,0 +1,195 @@ + + + + + + org.wso2.cdmserver + wso2cdmserver-product + 2.0.0-SNAPSHOT + ../../../../pom.xml + + + 4.0.0 + org.wso2.carbon + cdm-windows-api + 1.0.0-SNAPSHOT + JAX-RS Windows API + JAX-RS Windows API + war + + + + + maven-compiler-plugin + + 1.5 + 1.5 + + 2.3.2 + + + maven-war-plugin + 2.2 + + WEB-INF/lib/*cxf*.jar + ${project.artifactId} + + + + + + + + deploy + + compile + + + org.apache.maven.plugins + maven-antrun-plugin + 1.7 + + + compile + + run + + + + + + + + + + + + + + + + + + + client + + test + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + + test + + java + + + + + + + + + + + + org.apache.cxf + cxf-rt-frontend-jaxws + ${cxf.version} + + + org.apache.cxf + cxf-rt-frontend-jaxrs + ${cxf.version} + + + org.apache.cxf + cxf-rt-transports-http + ${cxf.version} + + + junit + junit + test + ${junit.version} + + + commons-httpclient + commons-httpclient + 3.1 + provided + + + javax.ws.rs + jsr311-api + 1.1.1 + provided + + + com.google.code.gson + gson + 2.2.4 + + + org.wso2.carbon + org.wso2.carbon.utils + provided + + + org.wso2.carbon + org.wso2.carbon.device.mgt.common + 2.0.0-SNAPSHOT + provided + + + org.wso2.carbon + org.wso2.carbon.device.mgt.core + 2.0.0-SNAPSHOT + provided + + + org.wso2.carbon + org.wso2.carbon.logging + provided + + + log4j + log4j + 1.2.17 + + + org.bouncycastle + bcpkix-jdk15on + 1.49 + + + org.bouncycastle + bcprov-jdk15on + 1.49 + + + + 2.6.1 + 4.8.2 + + + diff --git a/product/modules/agents/windows/jax-rs/run-client.bat b/product/modules/agents/windows/jax-rs/run-client.bat new file mode 100644 index 0000000000..9bd370256d --- /dev/null +++ b/product/modules/agents/windows/jax-rs/run-client.bat @@ -0,0 +1,81 @@ +@echo off +REM --------------------------------------------------------------------------- +REM Copyright 2005,2006 WSO2, Inc. http://www.wso2.org +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +rem --------------------------------------------------------------------------- +rem Client script for the Jaxws-Jaxrs/jaxrs_basic Sample +rem +rem Environment Variable Prequisites +rem +rem WSO2AppServer_HOME Must point at your WSO2 AppServer directory +rem +rem JAVA_HOME Must point at your Java Development Kit installation. +rem +rem JAVA_OPTS (Optional) Java runtime options +rem --------------------------------------------------------------------------- +set CURRENT_DIR=%cd% + +rem Make sure prerequisite environment variables are set +if not "%JAVA_HOME%" == "" goto gotJavaHome +echo The JAVA_HOME environment variable is not defined +echo This environment variable is needed to run this program +goto end +:gotJavaHome +if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome +goto okJavaHome +:noJavaHome +echo The JAVA_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +echo NB: JAVA_HOME should point to a JDK/JRE +goto end +:okJavaHome + +rem check the WSO2AppServer_HOME environment variable +if not "%WSO2AppServer_HOME%" == "" goto gotHome +set WSO2AppServer_HOME=%CURRENT_DIR% +if exist "%WSO2AppServer_HOME\bin\version.txt" goto okHome + +rem guess the home. Jump two directories up to check if that is the home +cd ..\..\.. +set WSO2AppServer_HOME=%cd% +cd %CURRENT_DIR% + +:gotHome +if exist "%WSO2AppServer_HOME%\bin\version.txt" goto okHome + +set WSO2AppServer_HOME=%~dp0..\.. +if exist "%WSO2AppServer_HOME%\bin\version.txt" goto okHome + +echo The WSO2AppServer_HOME environment variable is not defined correctly +echo This environment variable is needed to run this program +goto end + +:okHome +rem set the classes +setlocal EnableDelayedExpansion +rem loop through the libs and add them to the class path +cd %WSO2AppServer_HOME%\samples\Jaxws-Jaxrs\jaxrs_basic +set CLIENT_CLASSPATH=.\conf;.\build\classes +FOR %%C in (.\build\lib\*.jar) DO set CLIENT_CLASSPATH=!CLIENT_CLASSPATH!;.\build\lib\%%~nC%%~xC + +rem ----- Execute The Requested Command --------------------------------------- +echo Using WSO2AppServer_HOME: %WSO2AppServer_HOME% +echo Using JAVA_HOME: %JAVA_HOME% +set _RUNJAVA="%JAVA_HOME%\bin\java" + +%_RUNJAVA% %JAVA_OPTS% -Dwso2appserver.home="%WSO2AppServer_HOME%" -cp "%CLIENT_CLASSPATH%" -Djava.endorsed.dirs="%WSO2AppServer_HOME%\lib\endorsed";"%JAVA_HOME%\jre\lib\endorsed";"%JAVA_HOME%\lib\endorsed" demo.jaxrs.client.Client http://localhost:9763/jaxrs_basic/services/customers/customerservice %* +cd %CURRENT_DIR% +endlocal +:end diff --git a/product/modules/agents/windows/jax-rs/run-client.sh b/product/modules/agents/windows/jax-rs/run-client.sh new file mode 100755 index 0000000000..279d5023c0 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/run-client.sh @@ -0,0 +1,90 @@ +#!/bin/sh +# ----------------------------------------------------------------------------- +# +# Environment Variable Prequisites +# +# CARBON_HOME Home of WSO2 AppServer installation. If not set I will try +# to figure it out. +# +# JAVA_HOME Must point at your Java Development Kit installation. +# +# NOTE: Borrowed generously from Apache Tomcat startup scripts. + +# if JAVA_HOME is not set we're not happy +if [ -z "$JAVA_HOME" ]; then + echo "You must set the JAVA_HOME variable before running WSO2 AppServer." + exit 1 +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false +os400=false +case "`uname`" in +CYGWIN*) cygwin=true;; +OS400*) os400=true;; +esac + +# resolve links - $0 may be a softlink +PRG="$0" + +while [ -h "$PRG" ]; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '.*/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`/"$link" + fi +done + +# Get standard environment variables +PRGDIR=`dirname "$PRG"` + +# Only set WSO2AppServer_HOME if not already set +[ -z "$CARBON_HOME" ] && CARBON_HOME=`cd "$PRGDIR/../../.." ; pwd` + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CARBON_HOME" ] && WSO2AppServer_HOME=`cygpath --unix "$CARBON_HOME"` + [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For OS400 +if $os400; then + # Set job priority to standard for interactive (interactive - 6) by using + # the interactive priority - 6, the helper threads that respond to requests + # will be running at the same priority as interactive jobs. + COMMAND='chgjob job('$JOBNAME') runpty(6)' + system $COMMAND + + # Enable multi threading + QIBM_MULTI_THREADED=Y + export QIBM_MULTI_THREADED +fi + +# update classpath +CLIENT_CLASSPATH="" +for f in "$CARBON_HOME"/samples/Jaxws-Jaxrs/jaxrs_basic/build/lib/*.jar +do + CLIENT_CLASSPATH=$CLIENT_CLASSPATH:$f +done +CLIENT_CLASSPATH=$CLIENT_CLASSPATH:$CLASSPATH + + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"` + CARBON_HOME=`cygpath --absolute --windows "$CARBON_HOME"` + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"` +fi + +echo Using CARBON_HOME: $CARBON_HOME +echo Using JAVA_HOME : $JAVA_HOME + +CLIENT_CLASSPATH="$CARBON_HOME/samples/Jaxws-Jaxrs/jaxrs_basic/build/classes":$CLIENT_CLASSPATH + +$JAVA_HOME/bin/java -Dwso2appserver.home="$CARBON_HOME" -classpath "$CLIENT_CLASSPATH" \ +-Djava.endorsed.dirs="$CARBON_HOME/lib/endorsed":"$JAVA_HOME/jre/lib/endorsed":"$JAVA_HOME/lib/endorsed" \ +demo.jaxrs.client.Client http://localhost:9763/jaxrs_basic/services/customers/customerservice$* diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/DiscoveryService.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/DiscoveryService.java new file mode 100644 index 0000000000..64cd0e8ecb --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/DiscoveryService.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package cdm.api.windows; + +import javax.ws.rs.*; +import javax.ws.rs.core.Response; +import java.io.InputStream; + +@Path("/EnrollmentServer") +public interface DiscoveryService { + + @Path("/Discovery.svc") + @POST + @Consumes({ "application/soap+xml;charset=utf-8", "application/xml" }) + @Produces("application/soap+xml;charset=utf-8") + Response getDiscoveryResponse( + InputStream discoveryRequest); + + @Path("/Discovery.svc") + @GET + @Consumes("text/html") + @Produces("text/html") + Response getDiscoveryOKRequest(); + + @Path("/Discovery.svc") + @GET + @Consumes({ "application/soap+xml;charset=utf-8", "application/xml" }) + @Produces("text/html") + Response getDiscoveryOKRequestWithBody(InputStream discoveryRequest); + +} diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/EnrolmentService.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/EnrolmentService.java new file mode 100644 index 0000000000..9a61a3c61d --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/EnrolmentService.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package cdm.api.windows; + +import javax.swing.text.Document; +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +@Path("/ENROLLMENTSERVER") +public interface EnrolmentService { + + @Path("/PolicyEnrollmentWebservice.svc") + @POST + @Consumes("application/soap+xml;charset=utf-8") + @Produces("application/soap+xml;charset=utf-8") + Response getPolicies(Document request); + + @Path("/DeviceEnrollmentWebservice.svc") + @POST + @Consumes("application/soap+xml;charset=utf-8") + @Produces("application/soap+xml;charset=utf-8") + Response enrollUser(Document request); + +} diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/DiscoveryServiceImpl.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/DiscoveryServiceImpl.java new file mode 100644 index 0000000000..01ef564609 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/DiscoveryServiceImpl.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package cdm.api.windows.impl; + +import cdm.api.windows.DiscoveryService; + +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.apache.log4j.Logger; + +public class DiscoveryServiceImpl implements DiscoveryService { + + private Logger LOGGER = Logger.getLogger(DiscoveryServiceImpl.class); + private String discoveryServiceFileName; + + public Response getDiscoveryResponse(InputStream discoveryRequest) { + LOGGER.info("Received Discovery Service POST Request [{}]"); + + String response = null; + try { + response = new String(Files.readAllBytes(Paths.get(discoveryServiceFileName))); + } catch (IOException e) { + LOGGER.error("An Unexpected Error has occurred while processing the request ", e); + } + LOGGER.info("Sending Discovery Response"); + + return Response.ok().entity(response).build(); + } + + public Response getDiscoveryOKRequest() { + LOGGER.info("Received a GET Request without body"); + return Response.ok().build(); + } + + public Response getDiscoveryOKRequestWithBody(InputStream discoveryRequest) { + LOGGER.info("Received a GET Request with body [{}]"); + return Response.ok().build(); + } + + public void setDiscoveryServiceFileName(String discoveryServiceFileName) { + this.discoveryServiceFileName = discoveryServiceFileName; + } + +} diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/EnrolmentServiceImpl.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/EnrolmentServiceImpl.java new file mode 100644 index 0000000000..71b797efec --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/impl/EnrolmentServiceImpl.java @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package cdm.api.windows.impl; + +import cdm.api.windows.EnrolmentService; +import org.apache.log4j.Logger; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.pkcs.PKCS10CertificationRequest; +import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequest; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; +import javax.swing.text.Document; +import javax.ws.rs.core.Response; +import javax.xml.namespace.NamespaceContext; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.Security; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Iterator; + +import cdm.api.windows.util.CertificateSigningService; + +public class EnrolmentServiceImpl implements EnrolmentService { + + private Logger LOGGER = Logger.getLogger(EnrolmentServiceImpl.class); + + static { + Security.addProvider(new BouncyCastleProvider()); + } + + private String enrollmentResponseFile; + + private String responseFile; + + private String wapProvisioningXmlFile; + + private String privatePemKeyFilePath; + + private String caCertificateFilePath; + + PrivateKey privateKey; + + X509Certificate rooCACertificate; + + public void init() { + + try { + FileInputStream in = new FileInputStream(privatePemKeyFilePath); + byte[] keyBytes = new byte[in.available()]; + in.read(keyBytes); + in.close(); + + String key = new String(keyBytes, "UTF-8"); + key = key.replaceAll( + "(-+BEGIN RSA PRIVATE KEY-+\\r?\\n|-+END RSA PRIVATE KEY-+\\r?\\n?)", ""); + + // don't use this for real projects! + BASE64Decoder decoder = new BASE64Decoder(); + keyBytes = decoder.decodeBuffer(key); + + // generate private key + + PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + + privateKey = keyFactory.generatePrivate(spec); + + LOGGER.info("Private Key Algorithm : " + privateKey.getAlgorithm()); + } catch (Exception e) { + LOGGER.error("An unexpected Error has occurred while reading CA Private Key, ", e); + } + + try { + FileInputStream fr = new FileInputStream(caCertificateFilePath); + CertificateFactory cf = CertificateFactory.getInstance("X509"); + rooCACertificate = (X509Certificate) cf.generateCertificate(fr); + + rooCACertificate.verify(rooCACertificate.getPublicKey()); + + LOGGER.info("CA Certificate Expiration Date : " + rooCACertificate.getNotAfter()); + + } catch (Exception e) { + LOGGER.error("An unexpected Error has occurred while reading CA Root Certificate, ", e); + } + + /*try { + KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA"); + gen.initialize(2048); + key = gen.generateKeyPair(); + PrivateKey privateKey = key.getPrivate(); + PublicKey publicKey = key.getPublic(); + + + *//** + * Following details need to be provided + * + * Serial number + * Signature algorithm + * Issuer Name. + * Subject Name -- or a Subject Alternative Name (SAN). + * Date range (not before, not after). + * Subject Public Key. + *//* + + X509V3CertificateGenerator v3CertGen = new X509V3CertificateGenerator(); + v3CertGen.setSerialNumber(BigInteger.valueOf(new SecureRandom().nextInt(Integer.MAX_VALUE))); + v3CertGen.setIssuerDN(new X509Principal("CN=wso2.com")); + //v3CertGen.setIssuerDN(new X509Principal("CN=wso2.com, OU=Mobile, O=wso2 L=Colombo, C=LK")); + v3CertGen.setNotBefore(new Date(System.currentTimeMillis() - 1000L * 60 * 60 * 24 * 30)); + v3CertGen.setNotAfter(new Date(System.currentTimeMillis() + (1000L * 60 * 60 * 24 * 365*10))); + v3CertGen.setSubjectDN(new X509Principal("CN=wso2.com")); + v3CertGen.setPublicKey(publicKey); + v3CertGen.setSignatureAlgorithm("SHA1withRSA"); + + rooCACertificate = v3CertGen.generateX509Certificate(privateKey); + + } catch (Exception e) { + e.printStackTrace(); + }*/ + } + + public Response getPolicies(Document request) { + LOGGER.info("Received Get Policies Request"); + String response = null; + try { + response = new String(Files.readAllBytes(Paths.get(responseFile))); + } catch (IOException e) { + LOGGER.error("An Unexpected Error has occurred while processing the request ", e); + } + + LOGGER.info("Sending Get Policy Response"); + return Response.ok().entity(response).build(); + } + + public Response enrollUser(Document request) { + LOGGER.info("Received User Enrollment Request"); + + XPath xPath = XPathFactory.newInstance().newXPath(); + xPath.setNamespaceContext(new MyNamespaceContext()); + String response = null; + + DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); + + try { + NodeList nl = (NodeList) xPath.evaluate( + "/s:Envelope/s:Body/wst:RequestSecurityToken/wsse:BinarySecurityToken", request, + XPathConstants.NODESET); + Node node = nl.item(0); + String certificateDataString = node.getTextContent(); + byte[] derByteArray = + javax.xml.bind.DatatypeConverter.parseBase64Binary(certificateDataString); + + PKCS10CertificationRequest certificationRequest = + new PKCS10CertificationRequest(derByteArray); + JcaPKCS10CertificationRequest csrReq = + new JcaPKCS10CertificationRequest(certificationRequest); + + LOGGER.info("Public Key of CSR : " + csrReq.getPublicKey()); + + X509Certificate signedCert = + CertificateSigningService.signCSR(csrReq, privateKey, rooCACertificate); + + LOGGER.info("Verifying Signed Certificate with CSR's public key : " + + signedCert.getPublicKey()); + + BASE64Encoder base64Encoder = new BASE64Encoder(); + String rootCertEncodedString = base64Encoder.encode(rooCACertificate.getEncoded()); + String signedCertEncoded = base64Encoder.encode(signedCert.getEncoded()); + + DocumentBuilder builder = domFactory.newDocumentBuilder(); + org.w3c.dom.Document dDoc = builder.parse(wapProvisioningXmlFile); + + NodeList wapParm = dDoc.getElementsByTagName("parm"); + + NamedNodeMap rootCertAttributes = wapParm.item(0).getAttributes(); + Node b64Encoded = rootCertAttributes.getNamedItem("value"); + b64Encoded.setTextContent(rootCertEncodedString); + + NamedNodeMap clientCertAttributes = wapParm.item(1).getAttributes(); + Node b64CliendEncoded = clientCertAttributes.getNamedItem("value"); + b64CliendEncoded.setTextContent(signedCertEncoded); + + String wapProvisioning = convertDocumentToString(dDoc); + String encodedWap = base64Encoder.encode(wapProvisioning.getBytes()); + + org.w3c.dom.Document responseXml = builder.parse(enrollmentResponseFile); + NodeList token = responseXml.getElementsByTagName("BinarySecurityToken"); + + Node firstToken = token.item(0); + firstToken.setTextContent(encodedWap); + + response = convertDocumentToString(responseXml); + } catch (Exception e) { + LOGGER.error("An Unexpected Error has occurred while processing the request ", e); + } + + LOGGER.info("Sending User Enrollment Response"); + return Response.ok().entity(response).build(); + } + + private String convertDocumentToString(org.w3c.dom.Document document) throws Exception { + DOMSource domSource = new DOMSource(document); + StringWriter writer = new StringWriter(); + StreamResult result = new StreamResult(writer); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.transform(domSource, result); + String wapProvisioning = writer.toString(); + + return wapProvisioning; + + } + + public void setEnrollmentResponseFile(String enrollmentResponseFile) { + this.enrollmentResponseFile = enrollmentResponseFile; + } + + public void setResponseFile(String responseFile) { + this.responseFile = responseFile; + } + + public void setWapProvisioningXmlFile(String wapProvisioningXmlFile) { + this.wapProvisioningXmlFile = wapProvisioningXmlFile; + } + + public void setPrivatePemKeyFilePath(String privatePemKeyFilePath) { + this.privatePemKeyFilePath = privatePemKeyFilePath; + } + + public void setCaCertificateFilePath(String caCertificateFilePath) { + this.caCertificateFilePath = caCertificateFilePath; + } + + public void setPrivateKey(PrivateKey privateKey) { + this.privateKey = privateKey; + } + + public void setRooCACertificate(X509Certificate rooCACertificate) { + this.rooCACertificate = rooCACertificate; + } + + private static class MyNamespaceContext implements NamespaceContext { + + public String getNamespaceURI(String prefix) { + + if ("s".equals(prefix)) { + return "http://www.w3.org/2003/05/soap-envelope"; + } else if ("wst".equals(prefix)) { + return "http://docs.oasis-open.org/ws-sx/ws-trust/200512"; + } else if ("wsse".equals(prefix)) { + return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; + } + return null; + + } + + public String getPrefix(String namespaceURI) { + return null; + } + + public Iterator getPrefixes(String namespaceURI) { + return null; + } + } +} diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/CertificateSigningService.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/CertificateSigningService.java new file mode 100644 index 0000000000..6b00694097 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/CertificateSigningService.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package cdm.api.windows.util; + +import org.apache.log4j.Logger; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.cert.X509v3CertificateBuilder; +import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; +import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils; +import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; +import org.bouncycastle.operator.ContentSigner; +import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; +import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequest; + +import java.math.BigInteger; +import java.security.PrivateKey; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; +import java.util.Date; + +public class CertificateSigningService { + + private static Logger LOGGER = Logger.getLogger(CertificateSigningService.class); + + public static X509Certificate signCSR(JcaPKCS10CertificationRequest jcaRequest, + PrivateKey privateKey, X509Certificate caCert) + throws Exception { + try { + + X509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(caCert, + BigInteger + .valueOf( + new SecureRandom() + .nextInt( + Integer.MAX_VALUE)), + new Date( + System.currentTimeMillis() - + 1000L * + 60 * + 60 * + 24 * + 30), + new Date( + System.currentTimeMillis() + + (1000L * + 60 * + 60 * + 24 * + 365 * + 10)), + new X500Name( + "CN=abimaran"), + jcaRequest + .getPublicKey()); + + JcaX509ExtensionUtils extUtils = new JcaX509ExtensionUtils(); + + ContentSigner signer = + new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(privateKey); + + X509Certificate theCert = + new JcaX509CertificateConverter().setProvider("BC").getCertificate( + certificateBuilder.build(signer)); + + LOGGER.info("Signed Certificate CN : " + theCert.getSubjectDN().getName()); + + LOGGER.info("Signed CSR's public key : " + theCert.getPublicKey()); + + return theCert; + + } catch (Exception e) { + throw new Exception("Error in signing the certificate", e); + } + } + +} diff --git a/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/WindowsAPIUtil.java b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/WindowsAPIUtil.java new file mode 100644 index 0000000000..ca784e1895 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/java/cdm/api/windows/util/WindowsAPIUtil.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package cdm.api.windows.util; + + +import com.google.gson.JsonObject; +import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; +import org.wso2.carbon.device.mgt.common.DeviceManagementConstants; + + +/** + * WindowsAPIUtil class provides utility function used by Android REST-API classes. + */ +public class WindowsAPIUtil { + + public static Device convertToDeviceObject(JsonObject json){ + Device device = new Device(); + device.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); + device.setName("Test Device"); + device.setOwner("harshan"); + return device; + } + + public static DeviceIdentifier convertToDeviceIdentifierObject(String deviceId){ + DeviceIdentifier identifier = new DeviceIdentifier(); + identifier.setId(deviceId); + identifier.setType(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID); + return identifier; + } +} diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/applicationContext.xml b/product/modules/agents/windows/jax-rs/src/main/resources/applicationContext.xml new file mode 100644 index 0000000000..5dd63f2c88 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/applicationContext.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/ca_cert.pem b/product/modules/agents/windows/jax-rs/src/main/resources/ca_cert.pem new file mode 100644 index 0000000000..6eaad0f570 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/ca_cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDXDCCAkQCCQDWxw0vNF9H8DANBgkqhkiG9w0BAQUFADBwMQswCQYDVQQGEwJM +SzEQMA4GA1UECBMHQ29sb21ibzEQMA4GA1UEBxMHQ29sb21ibzENMAsGA1UEChME +d3NvMjEPMA0GA1UECxMGbW9iaWxlMR0wGwYDVQQDFBRjYV93c28yV2luZG93c01v +YmlsZTAeFw0xNDA3MDcxMDE4MDhaFw0xNTA3MDcxMDE4MDhaMHAxCzAJBgNVBAYT +AkxLMRAwDgYDVQQIEwdDb2xvbWJvMRAwDgYDVQQHEwdDb2xvbWJvMQ0wCwYDVQQK +EwR3c28yMQ8wDQYDVQQLEwZtb2JpbGUxHTAbBgNVBAMUFGNhX3dzbzJXaW5kb3dz +TW9iaWxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+w93X1S8nOM +VM3ScGP8XY9+PnoUaFZgKaD3d9Z6cj4HPKjIzv8iTMx9JBfDjSsLiks5nJqxm1in +juck7n0tl/CZ5L2j/3DhsA4D0Ngp5JsH5ZF+Vu2T+z8wUq8UwGD6qsn/EP9jBbj/ +WN0TtOPcfhOhfJVxaNOrt+9htYad9WOeU8Rh+CIb5oQrigEd417e5d5j4wcU8QLj +sVQQ8WRCYDrnKKof834ZnViBYX4UAdLtXkWFtKcD0RM/cB2LdjydwP3HEj6pkwjT +hRLGHdVF21VCbKOF6mnQagvuseT/ynioBNY60TXb283BQ6YrDfMytvRuzguEQ/7/ +AsTPclNZxQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQB3cwy5pibn009WvAYzmw9B +oB77bt21GQO4gFLJlNkvIRrneE5SinjoO6ezWOgY3+8t9ViNeD874momq4kuE6Hb +XDZE1qqinJlqfMJQuEaFkDZKg55kO66wy5+8ioFhA9V8SpeM+SYy3ENBucxiDLQE +ZhM7RKJCpSIq0rRHJyBRbs6GoW7cOB5QQcFDfSW+/CajicWzeD/OJMIfjJezCsZ8 +GNXJpyAS/Te+ysHlfmrKMb1VMZphFNiTmpEx8OI8F/kbhmdwePaZ3SOw2kJp8e3v +Ke4/zPwB95wjz8luzU+PbqNO2K4ZKtXHk6rx5yybR1UBpYINvUEjsRI3hgy1IoE+ +-----END CERTIFICATE----- diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/ca_private.key b/product/modules/agents/windows/jax-rs/src/main/resources/ca_private.key new file mode 100644 index 0000000000..764b316630 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/ca_private.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAz+w93X1S8nOMVM3ScGP8XY9+PnoUaFZgKaD3d9Z6cj4HPKjI +zv8iTMx9JBfDjSsLiks5nJqxm1injuck7n0tl/CZ5L2j/3DhsA4D0Ngp5JsH5ZF+ +Vu2T+z8wUq8UwGD6qsn/EP9jBbj/WN0TtOPcfhOhfJVxaNOrt+9htYad9WOeU8Rh ++CIb5oQrigEd417e5d5j4wcU8QLjsVQQ8WRCYDrnKKof834ZnViBYX4UAdLtXkWF +tKcD0RM/cB2LdjydwP3HEj6pkwjThRLGHdVF21VCbKOF6mnQagvuseT/ynioBNY6 +0TXb283BQ6YrDfMytvRuzguEQ/7/AsTPclNZxQIDAQABAoIBAQCrNz+Od1fpnOrv +Hnnu4Pb82F+99Ot/K7mOLiX6Qdyc3KU690Y85m2JTk6yfPsj8VFUdTOg2OXuJWf9 +TivkU6JK3u7rJJq6i2rdffz4aji9Lkina1LdJFBacaNKQzBUZsekAiiPB660FK34 +sDw9FfIIxAOTwsAb8UoTcgVE5PCIEx7R7YdAI0/mMnd98kTc2YdcnAmGwrDFQNer +eOLhq8H/6SxUADyos3s6Tgw3/yIo9BnBpe8uPNoakEPgYJLh263uF2rJ2h0+yLDV +9F9by+yFCqyVqS8P06NI+NMe8WsYJo99RGQsLZ7PsI5jiJSTRYgOF4ROQfAcCZiK +UWKCwcwhAoGBAPOg32J8AZX64FFDqyruN/1Q6hJfkVAVM+B3dxNAYIpccLuuxJ7x +JMIWkAFfBlOoaXZzxaDIXmXrd3h5qxRTd6W/gAR9nRko7YHaK7NszpEPA8hVOjjx +kkTNs/KjlELrLspRWL+iDqR5Nscw0V9y2D6tyYuGp475wK4PmKbgcKAdAoGBANp7 +M9nFEAUTeHzdo9csbrGy6wUuCRlixFvXKOH+1ezeuNvxh0XtbJPj7FrPT4nuCKEV +Wud1w3/IRaeCYeKXaHk6eF8zN1gVkN0MAQJ+9KtfZ0QnmQSsluJfrUBGej6UYO0z +DUv5CLNYLPwOVGTb/jb5n+lY2IzjKmA+aWZRML/JAoGBAJSfUycVVzJTdXydt1Hd +OTLDpcfHnTIpfRg2SOHpp/tAIVWdbD06Bp6QfREZExb96jhkr+9BzLSITL2mG4Ou +15K5nDMhHjE3Eozgt0Ah5HIBouEXfQk39W8bvecLe2rHZifuMCHXju8vMweY9GEy +AlFaW1VOs/E40x5cTVegG5TRAoGANLxmUJtTeZYwkBtDr+2GrpfcSLzK73i6otx1 +fs9vPaSpBFXxa/yaJ7xtUaIWtdlh9dfcwF/Zl590yLEdBX+8dP6bDYekRTu3YtPB +7qNMVY1KtNXGBq3OIcgsXoZkfXR9TOP0wrDS289d1F11G39KhmSMp9uNMbynfuGx +uUPBu5kCgYA1UUtQkVPbkKaaopSrDkqAJDlsUnNVkvXH5yWqdAYI2Frw1iOwhED3 +cKmwAejf8nl1HPwfDTGQMRB5PCDkK7mWJ5w9W4MUbJ7ZiNPHloZutUTcw3Nz58cn +OZMZGR/Trtn+YLoj2526NPwKqlw0bRB27UR0KOdgPOHynI3uYPnwgQ== +-----END RSA PRIVATE KEY----- diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/discover-service.xml b/product/modules/agents/windows/jax-rs/src/main/resources/discover-service.xml new file mode 100644 index 0000000000..05f8f939b9 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/discover-service.xml @@ -0,0 +1,27 @@ + + + + http://schemas.microsoft.com/windows/management/2012/01/enrollment/IDiscoveryService/DiscoverResponse + + + d9eb2fdd-e38a-46ee-bd93-aea9dc86a3b8 + + urn:uuid: 748132ec-a575-4329-b01b-6171a9cf8478 + + + + + OnPremise + + https://EnterpriseEnrollment.wso2.com/ENROLLMENTSERVER/PolicyEnrollmentWebservice.svc + + + https://EnterpriseEnrollment.wso2.com/ENROLLMENTSERVER/DeviceEnrollmentWebservice.svc + + + + + \ No newline at end of file diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/enrollment-service.xml b/product/modules/agents/windows/jax-rs/src/main/resources/enrollment-service.xml new file mode 100644 index 0000000000..4be6e477ac --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/enrollment-service.xml @@ -0,0 +1,27 @@ + + + http://schemas.microsoft.com/windows/pki/2009/01/enrollment/RSTRC/wstep + urn:uuid:81a5419a-496b-474f-a627-5cdd33eed8ab + + + 2012-08-02T00:32:59.420Z + 2014-08-02T00:37:59.420Z + + + + + + + http://schemas.microsoft.com/5.0.0.0/ConfigurationManager/Enrollment/DeviceEnrollmentToken + + + + + 0 + + + + \ No newline at end of file diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/log4j.xml b/product/modules/agents/windows/jax-rs/src/main/resources/log4j.xml new file mode 100644 index 0000000000..7cd7d64125 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/log4j.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/policy-service.xml b/product/modules/agents/windows/jax-rs/src/main/resources/policy-service.xml new file mode 100644 index 0000000000..e38440d6bd --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/policy-service.xml @@ -0,0 +1,15 @@ + + + + http://schemas.microsoft.com/windows/pki/2009/01/enrollmentpolicy/IPolicy/GetPoliciesResponse + + + + + + + + \ No newline at end of file diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/wap-provisioning.xml b/product/modules/agents/windows/jax-rs/src/main/resources/wap-provisioning.xml new file mode 100644 index 0000000000..d51958a715 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/wap-provisioning.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/modules/agents/windows/jax-rs/src/main/resources/windows-mdm-server.properties b/product/modules/agents/windows/jax-rs/src/main/resources/windows-mdm-server.properties new file mode 100644 index 0000000000..6f092e31fb --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/resources/windows-mdm-server.properties @@ -0,0 +1,8 @@ +service.url=http://0.0.0.0:9090 + + +discovery.service.file.location=./conf/discover-service.xml +policy.certificate.file.location=./conf/policy-service.xml +enrollment.service.file.location=./conf/enrollment-service.xml + +enrollment.service.wap.provisioning.file.location=./conf/wap-provisioning.xml \ No newline at end of file diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/META-INF/webapp-classloading.xml b/product/modules/agents/windows/jax-rs/src/main/webapp/META-INF/webapp-classloading.xml new file mode 100644 index 0000000000..8521215e75 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/webapp/META-INF/webapp-classloading.xml @@ -0,0 +1,33 @@ + + + + + + + + + false + + + CXF,Carbon + diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml new file mode 100644 index 0000000000..165c967047 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/web.xml b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..777ee8a709 --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,43 @@ + + + + CDM-Windows-API + + JAX-WS/JAX-RS Endpoint + JAX-WS/JAX-RS Servlet + JAXServlet + + org.apache.cxf.transport.servlet.CXFServlet + + + service-list-stylesheet + servicelist.css + + 1 + + + JAXServlet + /* + + + 60 + + \ No newline at end of file diff --git a/product/modules/agents/windows/jax-rs/src/main/webapp/servicelist.css b/product/modules/agents/windows/jax-rs/src/main/webapp/servicelist.css new file mode 100644 index 0000000000..bbc4987c0a --- /dev/null +++ b/product/modules/agents/windows/jax-rs/src/main/webapp/servicelist.css @@ -0,0 +1,117 @@ +@CHARSET "ISO-8859-1"; + +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} + +html { + background: #efefef; +} + +body { + line-height: 1; + width:960px; + margin:auto; + background:white; + padding:10px; + box-shadow:0px 0px 5px #CCC; + font-family:"Lucida Grande","Lucida Sans","Microsoft Sans Serif", "Lucida Sans Unicode","Verdana","Sans-serif","trebuchet ms" !important; + +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; + width:960px; + border:solid 1px #ccc; +} + +table a { + font-size:12px; + color:#1e90ff; + padding:7px; +float:left; +; +} + +.heading { + font-size: 18px; + margin-top: 20px; + float:left; + color:#0067B1; + margin-bottom:20px; + padding-top:20px; +} + +.field { + font-weight: normal; + width:120px; + font-size:12px; + float:left; + padding:7px; + clear:left; +} +.value { + font-weight: bold; + font-size:12px; + float:left; + padding:7px; + clear:right; +} +.porttypename { + font-weight: bold; + font-size:14px; +} +UL { + margin-top: 0; +} +LI { + font-weight: normal; + font-size:12px; + margin-top:10px; +} + +TD { + border:1px solid #ccc; + vertical-align: text-top; + padding: 5px; +} + + diff --git a/product/pom.xml b/product/pom.xml index c9fbafc3d0..dfbfe94b77 100644 --- a/product/pom.xml +++ b/product/pom.xml @@ -35,6 +35,8 @@ + modules/agents/windows/jax-rs + modules/agents/android/jax-rs modules/p2-profile-gen modules/distribution modules/integration