فهرست منبع

init from phab

xielq 5 سال پیش
والد
کامیت
efb2199fa2
100فایلهای تغییر یافته به همراه4273 افزوده شده و 0 حذف شده
  1. 75 0
      CommandLine.java
  2. BIN
      OpenAS2Server/OpenAS2HowTo.pdf
  3. 2 0
      OpenAS2Server/bin/commons-logging.properties
  4. 60 0
      OpenAS2Server/bin/gen_p12_key_par.sh
  5. 121 0
      OpenAS2Server/bin/openas2.d
  6. 18 0
      OpenAS2Server/bin/openas2.service
  7. 74 0
      OpenAS2Server/bin/start-openas2.bat
  8. 73 0
      OpenAS2Server/bin/start-openas2.sh
  9. 95 0
      OpenAS2Server/build.xml
  10. BIN
      OpenAS2Server/certificates/b2b_cypress_com/DigiCert SHA2 Secure Server CA.cer
  11. BIN
      OpenAS2Server/certificates/b2b_cypress_com/DigiCert.cer
  12. BIN
      OpenAS2Server/certificates/b2b_cypress_com/b2b_cypress_com.cer
  13. BIN
      OpenAS2Server/certificates/ohio450.ohctr.gxs.com/ohio450.ohctr.gxs.com.cer
  14. 23 0
      OpenAS2Server/certificates/self-signed/server.com/ca.crt
  15. 28 0
      OpenAS2Server/certificates/self-signed/server.com/ca.key
  16. 1 0
      OpenAS2Server/certificates/self-signed/server.com/ca.srl
  17. 21 0
      OpenAS2Server/certificates/self-signed/server.com/server.crt
  18. 17 0
      OpenAS2Server/certificates/self-signed/server.com/server.csr
  19. 30 0
      OpenAS2Server/certificates/self-signed/server.com/server.key
  20. BIN
      OpenAS2Server/certificates/self-signed/server.com/server.p12
  21. 13 0
      OpenAS2Server/certificates/self-signed/ubtob.com/Readme.md
  22. 21 0
      OpenAS2Server/certificates/self-signed/ubtob.com/UAS Root CA.crt
  23. 28 0
      OpenAS2Server/certificates/self-signed/ubtob.com/UAS Root CA.key
  24. 1 0
      OpenAS2Server/certificates/self-signed/ubtob.com/UAS Root CA.srl
  25. 20 0
      OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.crt
  26. 17 0
      OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.csr
  27. 30 0
      OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.key
  28. BIN
      OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.p12
  29. BIN
      OpenAS2Server/certificates/ubtob.com/GlobalSign Organization Validation CA - SHA256 - G2.cer
  30. BIN
      OpenAS2Server/certificates/ubtob.com/GlobalSign Root CA.cer
  31. 78 0
      OpenAS2Server/certificates/ubtob.com/ubtob.com.cer
  32. 28 0
      OpenAS2Server/certificates/ubtob.com/ubtob.com.key
  33. BIN
      OpenAS2Server/certificates/ubtob.com/ubtob.com.p12
  34. BIN
      OpenAS2Server/config/DB/openas2.mv.db
  35. 18 0
      OpenAS2Server/config/DB/openas2.trace.db
  36. 28 0
      OpenAS2Server/config/commands.xml
  37. 147 0
      OpenAS2Server/config/config.xml
  38. 29 0
      OpenAS2Server/config/db_ddl.sql
  39. 9 0
      OpenAS2Server/config/emailtemplate.txt
  40. BIN
      OpenAS2Server/config/jssechaincerts
  41. 114 0
      OpenAS2Server/config/partnerships.xml
  42. BIN
      OpenAS2Server/config/ssl_certs.jks
  43. BIN
      OpenAS2Server/config/ubtob.com.p12
  44. BIN
      OpenAS2Server/lib/bcmail-jdk15on-154.jar
  45. BIN
      OpenAS2Server/lib/bcpg-jdk15on-154.jar
  46. BIN
      OpenAS2Server/lib/bcpkix-jdk15on-154.jar
  47. BIN
      OpenAS2Server/lib/bcprov-jdk15on-154.jar
  48. BIN
      OpenAS2Server/lib/commons-lang3-3.4.jar
  49. BIN
      OpenAS2Server/lib/commons-logging-1.2.jar
  50. BIN
      OpenAS2Server/lib/dom4j-2.0.0.jar
  51. BIN
      OpenAS2Server/lib/h2-1.4.192.jar
  52. BIN
      OpenAS2Server/lib/javax.mail.jar
  53. BIN
      OpenAS2Server/lib/openas2-server.jar
  54. 137 0
      OpenAS2Server/pom.xml
  55. 248 0
      OpenAS2Server/src/main/java/CheckCertificate.java
  56. 0 0
      OpenAS2Server/src/main/java/META-INF/MANIFEST.MF
  57. 85 0
      OpenAS2Server/src/main/java/org/openas2/BaseComponent.java
  58. 96 0
      OpenAS2Server/src/main/java/org/openas2/BaseSession.java
  59. 61 0
      OpenAS2Server/src/main/java/org/openas2/Component.java
  60. 22 0
      OpenAS2Server/src/main/java/org/openas2/ComponentNotFoundException.java
  61. 41 0
      OpenAS2Server/src/main/java/org/openas2/DispositionException.java
  62. 67 0
      OpenAS2Server/src/main/java/org/openas2/OpenAS2Exception.java
  63. 98 0
      OpenAS2Server/src/main/java/org/openas2/Session.java
  64. 32 0
      OpenAS2Server/src/main/java/org/openas2/WrappedException.java
  65. 266 0
      OpenAS2Server/src/main/java/org/openas2/XMLSession.java
  66. 155 0
      OpenAS2Server/src/main/java/org/openas2/app/OpenAS2Server.java
  67. 30 0
      OpenAS2Server/src/main/java/org/openas2/app/cert/AliasedCertCommand.java
  68. 29 0
      OpenAS2Server/src/main/java/org/openas2/app/cert/ClearCertsCommand.java
  69. 36 0
      OpenAS2Server/src/main/java/org/openas2/app/cert/DeleteCertCommand.java
  70. 120 0
      OpenAS2Server/src/main/java/org/openas2/app/cert/ImportCertCommand.java
  71. 73 0
      OpenAS2Server/src/main/java/org/openas2/app/cert/ImportCertInEncodedStreamCommand.java
  72. 45 0
      OpenAS2Server/src/main/java/org/openas2/app/cert/ListCertCommand.java
  73. 44 0
      OpenAS2Server/src/main/java/org/openas2/app/cert/ViewCertCommand.java
  74. 82 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/AddPartnerCommand.java
  75. 90 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/AddPartnershipCommand.java
  76. 30 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/AliasedPartnershipsCommand.java
  77. 71 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/DeletePartnerCommand.java
  78. 53 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/DeletePartnershipCommand.java
  79. 50 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/ListPartnersCommand.java
  80. 51 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/ListPartnershipsCommand.java
  81. 50 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/RefreshPartnershipsCommand.java
  82. 49 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/StorePartnershipsCommand.java
  83. 53 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/ViewPartnerCommand.java
  84. 53 0
      OpenAS2Server/src/main/java/org/openas2/app/partner/ViewPartnershipCommand.java
  85. 28 0
      OpenAS2Server/src/main/java/org/openas2/cert/AliasedCertificateFactory.java
  86. 7 0
      OpenAS2Server/src/main/java/org/openas2/cert/BaseCertificateFactory.java
  87. 14 0
      OpenAS2Server/src/main/java/org/openas2/cert/CertificateExistsException.java
  88. 18 0
      OpenAS2Server/src/main/java/org/openas2/cert/CertificateFactory.java
  89. 41 0
      OpenAS2Server/src/main/java/org/openas2/cert/CertificateNotFoundException.java
  90. 22 0
      OpenAS2Server/src/main/java/org/openas2/cert/KeyNotFoundException.java
  91. 10 0
      OpenAS2Server/src/main/java/org/openas2/cert/KeyStoreCertificateFactory.java
  92. 377 0
      OpenAS2Server/src/main/java/org/openas2/cert/PKCS12CertificateFactory.java
  93. 32 0
      OpenAS2Server/src/main/java/org/openas2/cert/StorableCertificateFactory.java
  94. 70 0
      OpenAS2Server/src/main/java/org/openas2/cmd/BaseCommand.java
  95. 22 0
      OpenAS2Server/src/main/java/org/openas2/cmd/BaseCommandRegistry.java
  96. 23 0
      OpenAS2Server/src/main/java/org/openas2/cmd/Command.java
  97. 14 0
      OpenAS2Server/src/main/java/org/openas2/cmd/CommandException.java
  98. 43 0
      OpenAS2Server/src/main/java/org/openas2/cmd/CommandManager.java
  99. 11 0
      OpenAS2Server/src/main/java/org/openas2/cmd/CommandRegistry.java
  100. 5 0
      OpenAS2Server/src/main/java/org/openas2/cmd/CommandRegistryFactory.java

+ 75 - 0
CommandLine.java

@@ -0,0 +1,75 @@
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintStream;
+import java.net.InetAddress;
+
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+
+/**
+ * @author joseph mcverry a test program but usable with the
+ *         SocketCommandProcessor which in turns passes to command off to the
+ *         OpenAS2Server.
+ * 
+ *         uses TLS_DH_anon_WITH_AES_256_CBC_SHA cipher for the secure socket
+ *         layer;
+ * 
+ */
+public class CommandLine {
+	public static void main(String args[]) {
+		try {
+			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+			SSLSocket s = null;
+			String host, port, name, pwd;
+			if (args.length == 0) {
+				host = "localhost";
+				port = "14321";
+				name = "userID";
+				pwd = "pWd";
+
+			} else if (args.length != 4) {
+				System.out.println("format: java org.openas2.remote.CommandLine ipaddresss portnumber userid password");
+				return;
+			} else {
+				host = args[0];
+				port = args[1];
+				name = args[2];
+				pwd = args[3];
+			}
+			int iport = Integer.parseInt(port);
+			while (true) {
+				System.out.print("Enter command: ");
+				String icmd = br.readLine().trim();
+				System.out.print("");
+				if (icmd.length() < 1) {
+					System.out.println("adios");
+					return;
+				}
+				s = (SSLSocket) SSLSocketFactory.getDefault().createSocket(InetAddress.getByName(host), iport);
+				String cipherSuites = System.getProperty("CmdProcessorSocketCipher",
+						"TLS_DH_anon_WITH_AES_256_CBC_SHA");
+				final String[] enabledCipherSuites = { cipherSuites };
+				try {
+					s.setEnabledCipherSuites(enabledCipherSuites);
+				} catch (IllegalArgumentException e) {
+					e.printStackTrace();
+					System.out.println(
+							"Cipher is not supported. Try using the command line switch -DCmdProcessorSocketCipher=<some cipher suite> to use one supported by your version of java security.");
+				}
+				String cmd = "<command id=\"" + name + "\" password=\"" + pwd + "\">" + icmd + "</command>";
+				PrintStream ps = new PrintStream(s.getOutputStream(), true);
+				ps.println(cmd);
+				BufferedReader rdr = new BufferedReader(new InputStreamReader(s.getInputStream()));
+				String r;
+				while ((r = rdr.readLine()) != null) {
+					System.out.println(r);
+				}
+				s.close();
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}

BIN
OpenAS2Server/OpenAS2HowTo.pdf


+ 2 - 0
OpenAS2Server/bin/commons-logging.properties

@@ -0,0 +1,2 @@
+org.apache.commons.logging.Log=org.openas2.logging.Log
+level=INFO

+ 60 - 0
OpenAS2Server/bin/gen_p12_key_par.sh

@@ -0,0 +1,60 @@
+#!/bin/sh
+
+CertValidDays=3650
+x=`basename $0`
+if test $# -ne 4; then
+  echo "Generate a certificate to a PKCS12 key store."
+  echo "You must supply a target key store without the extension (extension will be added as .p12) and an alias for generated certificate."
+  echo "usage: ${x} <target keystore> <cert alias> <sigalg> <distinguished name>"
+  echo "            WHERE"
+  echo "               target keystore = name of the target keystore file without .p12 extension"
+  echo "               cert alias = alias name for the digital certificate"
+  echo "               sigalg = signing algorithm for the digital certificate ... SHA1, MD5 etc"
+  echo "               distinguished name = a string in the format:"
+  echo "                                       CN=<cName>, OU=<orgUnit>, O=<org>, L=<city>, S=<state>, C=<countryCode>"
+
+  echo ""
+  echo "       eg. $0 as2_certs openas2a SHA1 \"CN=OpenAS2A Testing, OU=QA, O=OpenAS2A, L=New York, S=New York, C=US\""
+  echo "OUTPUT: as2_certs.p12 -  keystore containing both public and private key"
+  echo "        openas2a.cer - certificate file the public key."
+  exit 1
+fi
+
+tgtStore=$1
+certAlias=$2
+sigAlg="$3withRSA"
+dName=$4
+
+if [ -z $JAVA_HOME ]; then
+  OS=$(uname -s)
+
+  if [[ "${OS}" == *Darwin* ]]; then
+    # Mac OS X platform
+    JAVA_HOME=$(/usr/libexec/java_home)
+  elif [[ "${OS}" == *Linux* ]]; then
+    # Linux platform
+    JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
+  elif [[ "${OS}" == *MINGW* ]]; then
+    # Windows NT platform
+    echo "Windows not supported by this script"
+  fi
+fi
+
+if [ -z $JAVA_HOME ]; then
+  echo "ERROR: Cannot find JAVA_HOME"
+  exit
+fi
+
+echo "Generate a certificate to a PKCS12 key store."
+echo "Generating certificate:  using alias $certAlias to ${tgtStore}.p12"
+read -p "Do you wish to execute this request? [Y/N]" Response
+if [  $Response != "Y" -a $Response != "y"  ] ; then
+  exit 1
+fi
+
+read -p "Enter password for keystore:" ksPwd
+$JAVA_HOME/bin/keytool -genkeypair -alias $certAlias -validity $CertValidDays  -keyalg RSA -sigalg $sigAlg -keystore ${tgtStore}.p12 -storepass $ksPwd -storetype pkcs12 -dname "$dName"
+
+$JAVA_HOME/bin/keytool -selfcert -alias $certAlias -validity $CertValidDays  -sigalg $sigAlg -keystore ${tgtStore}.p12 -storepass $ksPwd -storetype pkcs12
+
+$JAVA_HOME/bin/keytool -export -rfc -file $certAlias.cer -alias $certAlias  -keystore ${tgtStore}.p12 -storepass $ksPwd -storetype pkcs12

+ 121 - 0
OpenAS2Server/bin/openas2.d

@@ -0,0 +1,121 @@
+#!/bin/bash
+
+### BEGIN INIT INFO
+# Provides:          openas2.d
+# Required-Start:    
+# Required-Stop:     
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Startup script to launch OpenAS2 application as a daemon
+# Description:       This script can be used in any NIX based system that implements the init.d mechanism
+#					 The EXECUTABLE variable below must be set to point to the OpenAS2 startup script
+#                    See the OpenAS2HowTo.pdf for details on configuration checks for this mode of running OpenAS2
+### END INIT INFO
+
+BASE_DIR=/usr/local/edi/OpenAS2
+SERVICE_NAME=OpenAS2
+EXECUTABLE=$BASE_DIR/bin/start-openas2.sh
+export PID_FILE=$BASE_DIR/bin/OpenAS2.pid
+THIS_SCRIPT_NAME=`basename $0`
+THIS_SCRIPT_EXEC=$0
+if [ "$THIS_SCRIPT_NAME" = "$0" ]; then
+  THIS_SCRIPT_EXEC="/etc/init.d/$0"
+fi
+
+PID=""
+PID_FILE=$BASE_DIR/bin/OpenAS2.pid
+#PID=$(ps -ef | grep java | grep org.openas2.app.OpenAS2Server | awk '{print $2}')
+if [ -f $PID_FILE ]; then
+  PID=`cat $PID_FILE`
+fi
+if [ ! -z $PID ]; then
+  x=$(ps -p $PID  2>/dev/null)
+  if [ "$?" = 1 ]; then
+    PID=""
+    echo "" > $PID_FILE
+  fi
+fi
+case "$1" in
+    start)
+        echo "Starting $SERVICE_NAME ..."
+        if [ -z $PID ]; then
+          export OPENAS2_AS_DAEMON=true
+          $EXECUTABLE
+          RETVAL="$?"
+	  if [ "$RETVAL" = 0 ]; then 
+            echo "$SERVICE_NAME started ..."
+            exit 0
+          else
+            echo "ERROR $SERVICE_NAME could not be started. Review logs"
+            exit 1
+          fi
+        else
+                echo "$SERVICE_NAME is already running ..."
+        fi
+        ;;
+    stop|kill)
+        if [ ! -z $PID ]; then
+          echo "Attempting to stop $SERVICE_NAME..."
+          kill $PID
+          if [ "$?" = 0 ]; then
+            echo "" > $PID_FILE
+            echo "$SERVICE_NAME terminated ..."
+            exit 0
+          else
+            echo "ERROR: $SERVICE_NAME failed to terminate. try force-stop"
+            exit 1
+          fi
+        else
+            echo "$SERVICE_NAME is not running ..."
+            exit 0
+        fi
+        ;;
+    force-stop)
+        if [ ! -z $PID ]; then
+          echo "Attempting to force termination of $SERVICE_NAME..."
+          kill -9 $PID
+          if [ "$?" = 0 ]; then
+            echo "" > $PID_FILE
+            echo "$SERVICE_NAME terminated ..."
+            exit 0
+          else
+            echo "ERROR: $SERVICE_NAME failed to terminate. "
+            exit 1
+          fi
+        else
+                echo "$SERVICE_NAME is not running ..."
+                exit 0
+        fi
+        ;;
+    status)
+        if [ -z $PID ]; then
+                echo "$SERVICE_NAME is not running"
+        else
+                echo "$SERVICE_NAME is running"
+        fi
+        ;;
+    force-reload|restart|reload)
+        $THIS_SCRIPT_EXEC stop
+        if [ ! -z $PID ]; then
+          CNT=0
+          while ps -p $PID  2>/dev/null; do
+            sleep 1;CNT=$CNT+1;
+            CNT=$((CNT+1)); if [ $CNT -ge 5 ]; then break; fi
+          done
+          if ps -p $PID  2>/dev/null; then
+            echo "ERROR: Failed to stop $SERVICE_NAME"
+            exit 1
+          else
+            echo "" > $PID_FILE
+            PID=""
+          fi
+        fi
+        $THIS_SCRIPT_EXEC start
+        ;;
+    *)
+      echo "Usage: $0 {status|start|stop|kill|force-stop|restart|reload|force-reload}"
+      exit 1
+      ;;
+
+esac
+

+ 18 - 0
OpenAS2Server/bin/openas2.service

@@ -0,0 +1,18 @@
+[Unit]
+Description=OpenAS2 Server
+After=network.target
+
+[Service]
+Type=forking
+User=root
+Group=root
+
+Environment=OPENAS2_AS_DAEMON=true
+Environment=OPENAS2_BASE=/opt/OpenAS2
+Environment=OPENAS2_PID=/opt/OpenAS2/bin/OpenAS2.pid
+PIDFile=/opt/OpenAS2/bin/OpenAS2.pid
+WorkingDirectory=/opt/OpenAS2
+ExecStart=/opt/OpenAS2/bin/start-openas2.sh
+
+[Install]
+WantedBy=multi-user.target

+ 74 - 0
OpenAS2Server/bin/start-openas2.bat

@@ -0,0 +1,74 @@
+@echo off
+rem Purpose:  runs the OpenAS2 application
+
+rem Set some of the base system properties for the Java environment and logging
+rem remove -Dorg.apache.commons.logging.Log=org.openas2.logging.Log if using another logging package
+rem
+set EXTRA_PARMS=-Xms32m -Xmx384m  -Dorg.apache.commons.logging.Log=org.openas2.logging.Log
+rem For versions of Java that prevent restricted HTTP headers (see documentation for discussion on this)
+rem set EXTRA_PARMS=%EXTRA_PARMS% -Dsun.net.http.allowRestrictedHeaders=true
+
+
+rem set EXTRA_PARMS=%EXTRA_PARMS% -Dhttps.protocols=TLSv1.2
+
+rem Uncomment any of the following for enhanced debug
+rem set EXTRA_PARMS=%EXTRA_PARMS% -Dmaillogger.debug.enabled=true
+rem set EXTRA_PARMS=%EXTRA_PARMS% -DlogRxdMsgMimeBodyParts=true
+rem set EXTRA_PARMS=%EXTRA_PARMS% -DlogRxdMdnMimeBodyParts=true
+rem set EXTRA_PARMS=%EXTRA_PARMS% -Djavax.net.debug=SSL
+
+rem Setup the Java Virtual Machine
+if not "%JAVA%" == "" goto :Check_JAVA_END
+    if not "%JAVA_HOME%" == "" goto :TryJDKEnd
+        call :warn JAVA_HOME not set; results may vary
+:TryWOWJRE
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\WOW6432NODE\JavaSoft\Java Runtime Environment" /s /v CurrentVersion ^| find "CurrentVersion"`) DO (
+       set JAVA_VERSION=%%A
+    )
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\WOW6432NODE\JavaSoft\Java Runtime Environment\%JAVA_VERSION%" /s /v JavaHome ^| find "JavaHome"`) DO (
+       set JAVA_HOME=%%A %%B
+    )
+    if not exist "%JAVA_HOME%" goto :TryWOWJDK
+    goto TryJDKEnd
+:TryWOWJDK
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\WOW6432NODE\JavaSoft\Java Development Kit" /s /v CurrentVersion  ^| find "CurrentVersion"`) DO (
+       set JAVA_VERSION=%%A
+    )
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\WOW6432NODE\JavaSoft\Java Development Kit\%JAVA_VERSION%" /s /v JavaHome ^| find "JavaHome"`) DO (
+       set JAVA_HOME=%%A %%B
+    )
+    if not exist "%JAVA_HOME%" goto :TryJRE
+    goto TryJDKEnd
+:TryJRE
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\JavaSoft\Java Runtime Environment" /s /v CurrentVersion  ^| find "CurrentVersion"`) DO (
+       set JAVA_VERSION=%%A
+    )
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\JavaSoft\Java Runtime Environment\%JAVA_VERSION%" /s /v JavaHome ^| find "JavaHome"`) DO (
+       set JAVA_HOME=%%A %%B
+    )
+    if not exist "%JAVA_HOME%" goto :TryJDK
+    goto TryJDKEnd
+:TryJDK
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\JavaSoft\Java Development Kit" /s /v CurrentVersion  ^| find "CurrentVersion"`) DO (
+       set JAVA_VERSION=%%A
+    )
+    FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKLM\Software\JavaSoft\Java Development Kit\%JAVA_VERSION%" /s /v JavaHome ^| find "JavaHome"`) DO (
+       set JAVA_HOME=%%A %%B
+    )
+    if not exist "%JAVA_HOME%" (
+       call :warn Unable to retrieve JAVA_HOME from Registry
+    )
+:TryJDKEnd
+    if not exist "%JAVA_HOME%" (
+        call :warn JAVA_HOME is not valid: "%JAVA_HOME%"
+        goto END
+    )
+    set JAVA=%JAVA_HOME%\bin\java
+:Check_JAVA_END
+set LIB_JARS=../lib/h2-1.4.192.jar;../lib/javax.mail.jar;../lib/bcpkix-jdk15on-154.jar;../lib/bcprov-jdk15on-154.jar;../lib/bcmail-jdk15on-154.jar;../lib/commons-logging-1.2.jar;../lib/openas2-server.jar
+rem    
+"%JAVA%" %EXTRA_PARMS%  -cp .;%LIB_JARS% org.openas2.app.OpenAS2Server ../config/config.xml
+
+:warn
+:END
+

+ 73 - 0
OpenAS2Server/bin/start-openas2.sh

@@ -0,0 +1,73 @@
+#!/bin/bash
+# purpose: runs the OpenAS2 application     
+x=`basename $0`
+
+binDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+keyStorePwd=$1
+PWD_OVERRIDE=""
+
+if [ -z $PID_FILE ]; then
+  export PID_FILE=$binDir/OpenAS2.pid
+fi
+
+# Set some of the base system properties for the Java environment and logging
+# remove -Dorg.apache.commons.logging.Log=org.openas2.logging.Log if using another logging package    
+#
+EXTRA_PARMS="-Xms32m -Xmx384m -Dorg.apache.commons.logging.Log=org.openas2.logging.Log"
+
+# Set the config file location
+EXTRA_PARMS="$EXTRA_PARMS -Dopenas2.config.file=${binDir}/../config/config.xml"
+EXTRA_PARMS="$EXTRA_PARMS -Djavax.net.ssl.trustStore=${binDir}/../config/jssechaincerts"
+
+# For versions of Java that prevent restricted HTTP headers (see documentation for discussion on this)
+#EXTRA_PARMS="$EXTRA_PARMS -Dsun.net.http.allowRestrictedHeaders=true"
+
+#EXTRA_PARMS="$EXTRA_PARMS -Dhttps.protocols=TLSv1.2"
+
+# Uncomment any of the following for enhanced debug
+#EXTRA_PARMS="$EXTRA_PARMS -Dmaillogger.debug.enabled=true"
+#EXTRA_PARMS="$EXTRA_PARMS -DlogRxdMsgMimeBodyParts=true"
+#EXTRA_PARMS="$EXTRA_PARMS -DlogRxdMdnMimeBodyParts=true"
+#EXTRA_PARMS="$EXTRA_PARMS -Djavax.net.debug=SSL"
+EXTRA_PARMS="$EXTRA_PARMS -DCmdProcessorSocketCipher=SSL_DH_anon_WITH_RC4_128_MD5"
+
+if [  ! -z $keyStorePwd ]; then
+  PWD_OVERRIDE="-Dorg.openas2.cert.Password=$keyStorePwd"
+fi
+if [ -z $JAVA_HOME ]; then
+  OS=$(uname -s)
+
+  if [[ "${OS}" == *Darwin* ]]; then
+    # Mac OS X platform
+    JAVA_HOME=$(/usr/libexec/java_home)
+  elif [[ "${OS}" == *Linux* ]]; then
+    # Linux platform
+    JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
+  elif [[ "${OS}" == *MINGW* ]]; then
+    # Windows NT platform
+    echo "Windows not supported by this script"
+  fi
+fi
+
+if [ -z $JAVA_HOME ]; then
+  echo "ERROR: Cannot find JAVA_HOME"
+  exit 1
+fi
+
+LIB_JARS="${binDir}/../lib/h2-1.4.192.jar:${binDir}/../lib/javax.mail.jar:${binDir}/../lib/bcpkix-jdk15on-154.jar:${binDir}/../lib/bcprov-jdk15on-154.jar:${binDir}/../lib/bcmail-jdk15on-154.jar:${binDir}/../lib/commons-logging-1.2.jar:${binDir}/../lib/openas2-server.jar"
+JAVA_EXE=$JAVA_HOME/bin/java 
+#    
+CMD="$JAVA_EXE ${PWD_OVERRIDE} ${EXTRA_PARMS}  -cp .:${LIB_JARS}  org.openas2.app.OpenAS2Server"
+if [ "true" = "$OPENAS2_AS_DAEMON" ]; then
+  $CMD &
+  RETVAL="$?"
+  PID=$!
+  if [ "$RETVAL" = 0 ]; then
+    echo "Writing PID $PID to file $PID_FILE"
+    echo $PID > $PID_FILE
+  fi
+else
+  $CMD
+  RETVAL="$?"
+fi
+exit $RETVAL

+ 95 - 0
OpenAS2Server/build.xml

@@ -0,0 +1,95 @@
+<project name="OpenAS2" default="main" basedir=".">
+	<description>
+		Open source implementation of the AS2 standard for signed
+		encrypted and compressed document transfer
+	</description>
+	<property name="projectName" value="OpenAS2" />
+	<property name="subProject" value="Server" />
+
+	<!-- Java sources -->
+	<property name="src.dir" location="${basedir}/src/main/java" />
+
+	<property name="ant.build.javac.source" value="1.6" />
+	<property name="ant.build.javac.target" value="1.6" />
+
+	<!-- Java classes -->
+	<property name="outputDirectory" location="${basedir}/target" />
+	<property name="lib.dir" location="${basedir}/lib" />
+	<property name="lib.jar" value="openas2-server.jar" />
+	<property name="help.filename" value="OpenAS2HowTo.pdf" />
+	<property name="help.file.src" location="../docs/${help.filename}" />
+	<!-- Output, package -->
+	<property name="dist.dir" location="dist" />
+
+	<property name="release.version" value="2.2.0" />
+	<property name="manifest.file" value="${src.dir}/META-INF/MANIFEST.MF" />
+
+	<target name="init">
+		<echo message="ANT Version: ${ant.version}" />
+		<!-- Create the time stamp -->
+		<tstamp>
+			<format property="time.stamp" pattern="yyyy-MM-dd_HH:mm:ss" />
+		</tstamp>
+
+		<!-- Create the build directory structure used by compile -->
+		<mkdir dir="${outputDirectory}" />
+
+		<echo
+			message="Current version number written to MANIFEST : ${release.version}" />
+
+	</target>
+
+	<target name="compile" depends="init" description="compile the source ">
+		<!-- Compile the java code from ${src.dir} into ${outputDirectory} -->
+		<delete file="${lib.dir}/${lib.jar}" />
+		<path id="lib.path.ref">
+			<fileset dir="${lib.dir}" includes="*.jar" />
+		</path>
+		<javac compiler="modern" includeantruntime="false" srcdir="${src.dir}"
+			destdir="${outputDirectory}">
+			<compilerarg value="-Xbootclasspath/p:${toString:lib.path.ref}" />
+		</javac>
+	</target>
+
+	<target name="dist" depends="compile" description="package, output to JAR">
+		<delete file="${lib.dir}/${lib.jar}" />
+		<tstamp>
+			<format property="time.stamp" pattern="yyyy-MM-dd_HH:mm:ss" />
+		</tstamp>
+		<jar jarfile="${lib.dir}/${lib.jar}" basedir="${outputDirectory}">
+			<manifest>
+				<!-- create an executable Jar -->
+				<attribute name="Main-Class" value="org.openas2.app.OpenAS2Server" />
+				<attribute name="Built-By" value="OpenAS2 Ant Build ${time.stamp}" />
+				<attribute name="Specification-Title" value="${projectName}" />
+				<attribute name="Specification-Version" value="1.1" />
+				<attribute name="Specification-Vendor" value="${projectName}" />
+				<attribute name="Implementation-Title" value="${projectName} ${subProject}" />
+				<!-- get the correct release version number into the MANIFEST file as "Implementation-Version" -->
+				<attribute name="Implementation-Version" value="${release.version}" />
+				<attribute name="Implementation-Vendor" value="${projectName} - AS2 Open Source Project" />
+							</manifest>
+		</jar>
+
+		<delete dir="${outputDirectory}" />
+		<!-- Create the distribution directory -->
+		<mkdir dir="${dist.dir}" />
+		<!-- Add the help PDF version to the distro -->
+		<copy file="${help.file.src}" todir="${basedir}" />
+		<!-- Put everything in ${build} into the ${projectName}${subProject}-${release.version}.zip 
+			file -->
+		<zip destfile="${dist.dir}/${projectName}${subProject}-${release.version}.zip"
+			basedir="." excludes="build/**,dist/**,temp/**,logs/**,data/**" />
+		<!-- Remove the copied help file -->
+		<delete file="${help.filename}" />
+	</target>
+
+	<target name="clean" description="clean up">
+		<delete dir="${outputDirectory}" />
+		<delete dir="${dist.dir}" />
+	</target>
+
+	<!-- Default, run this -->
+	<target name="main" depends="clean, compile, dist" />
+
+</project>

BIN
OpenAS2Server/certificates/b2b_cypress_com/DigiCert SHA2 Secure Server CA.cer


BIN
OpenAS2Server/certificates/b2b_cypress_com/DigiCert.cer


BIN
OpenAS2Server/certificates/b2b_cypress_com/b2b_cypress_com.cer


BIN
OpenAS2Server/certificates/ohio450.ohctr.gxs.com/ohio450.ohctr.gxs.com.cer


+ 23 - 0
OpenAS2Server/certificates/self-signed/server.com/ca.crt

@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIIDzTCCArWgAwIBAgIJALveafhe2EoJMA0GCSqGSIb3DQEBBQUAMH0xCzAJBgNV
+BAYTAkNOMQswCQYDVQQIDAJHRDELMAkGA1UEBwwCU1oxDTALBgNVBAoMBE15Q2Ex
+DDAKBgNVBAsMA2RldjERMA8GA1UEAwwIbXljYS5jb20xJDAiBgkqhkiG9w0BCQEW
+FXN1bnlqemh1aUBvdXRsb29rLmNvbTAeFw0xODAyMjQxMTQzNDJaFw0xOTAyMjQx
+MTQzNDJaMH0xCzAJBgNVBAYTAkNOMQswCQYDVQQIDAJHRDELMAkGA1UEBwwCU1ox
+DTALBgNVBAoMBE15Q2ExDDAKBgNVBAsMA2RldjERMA8GA1UEAwwIbXljYS5jb20x
+JDAiBgkqhkiG9w0BCQEWFXN1bnlqemh1aUBvdXRsb29rLmNvbTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKL/Y/Hwo7TblvZk7KkynM5Nk2XvBrdPlvkS
+3GdawGwGS7vKZe2wL7mSYpXkLF6bwjU3kek4EU2PAw81v6c1P6v4apLeqlDViOGV
+punboZIaKReNYiAciPtDEwJ8TUc/ml8GayUOYUgRYWyrYigaNeh2Wz9lcV8ZN2LQ
+zRElqbXNuvyDNUT1E6BNjlhhD8XX/kJ1MAzRgaszUcUzf4uplPqpKMfim+c6mloG
+UYeCYKMx9UNW7LnOcI/y4d6uyIIebyV+wKC5IlZ2mKYqOrSu+2QOhntJtI2b1ecz
+k74el43sDNmTU6cpqrIlzTZF0Gegn113Qgs989wLA53g9EcWpqcCAwEAAaNQME4w
+HQYDVR0OBBYEFNc+BCpkeLHBntaPCwYxLNmW/EoCMB8GA1UdIwQYMBaAFNc+BCpk
+eLHBntaPCwYxLNmW/EoCMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AIMKLXlYCoKTIO0U9gPOqtkHmP74mEEwddaRn5qKFkVzgKgsWPu/s7CKN0xDxOxk
+MqStmKZia2On+IklVFrPXKUbIdympqGuyO37cJLxb6a691Fz/D8oFprpUMg0X29d
+ebNNNdje9NzfnmdujNiAM6qNGwSbDwVZ0HAOrtQhlIeHLKo6rjfj6g4HbedHIrEy
+X1xZMhO8D6RY8/1g1K1eECGTPE8tAd0wLuzmf9aBT6A66/Twu2TGe/R9AeOWKP5Z
+JOGFjAzDeelChO/RM4fpYIfXosMjsswrtOlzDaelnsMWDqesgAA9zenDMcG8/GF+
+tuU23so0Uhd8q8eIOh83YBQ=
+-----END CERTIFICATE-----

+ 28 - 0
OpenAS2Server/certificates/self-signed/server.com/ca.key

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCi/2Px8KO025b2
+ZOypMpzOTZNl7wa3T5b5EtxnWsBsBku7ymXtsC+5kmKV5Cxem8I1N5HpOBFNjwMP
+Nb+nNT+r+GqS3qpQ1Yjhlabp26GSGikXjWIgHIj7QxMCfE1HP5pfBmslDmFIEWFs
+q2IoGjXodls/ZXFfGTdi0M0RJam1zbr8gzVE9ROgTY5YYQ/F1/5CdTAM0YGrM1HF
+M3+LqZT6qSjH4pvnOppaBlGHgmCjMfVDVuy5znCP8uHersiCHm8lfsCguSJWdpim
+Kjq0rvtkDoZ7SbSNm9XnM5O+HpeN7AzZk1OnKaqyJc02RdBnoJ9dd0ILPfPcCwOd
+4PRHFqanAgMBAAECggEAF4ct8hp+Rvj7jY176+B2agEgqbIbEhLXBBUI45Jh/DXc
+cLsCg5DPEsZinKhXD0EEg5IF6dhCByQBmQx1Ibm5+yTcnV6uzwRDwexML62YYPKN
+w+yQoXn8++fusokmzoYLznOqu6qbuD9qBLmobYl7BpcvDLOj7cpCCG2DbFo3aRqS
+P6QI6v2kMKLSwnNeWPm62ftjtir/I5Hj2/GxOwpXXJKZJsuzwQeTQTSPi0hK8sXY
+l9ycHLXG84uloWlLimm4J5Ol+IWfIbDXkdX1Ww5AnaoRN2xnC5O3IpOJHhrMfV8Q
+2Na9APHRwDXCjmDCRsVCo0UO8aRFN/zVUQmWGDP5gQKBgQDVauYNu079sK5LYT1g
+o5yvdtde0HmSg13BWG+LX81A63AnJz1HzpeGI4LDD/We0fHIpfcv/iv+U0zmAxr4
+a3ZafFRJoxUrxVuO7t4mtkt7zKjkpXOcHf2KO+SBDK+mloDF47frH04VOK4Mp7ow
+fuzKsx9+WxXUSDY19cwWpf+h0QKBgQDDhRqYdr6t9X56yRPb1Ga4BH4p9GU2hyui
+c8JoFQhRtRwO52pEDl8zlTvFBt72jt/2HwTrkUJxHmCsz1/wB1whnXsQzXt9Il8X
+EOIFB0Z/YI1jchk/usYqKM0UKgVU+wDP5KhERvFEqypj5Sj+2lGBhMo6XC3/2sjc
+b3+6L0Sm9wKBgQDLcW4ApQ/10lk0Tmv+FbmlonpITh+2RTg4uZ8Lk7XMLyPojwVh
+0FStcGiUnkAcuDHufheXToqNlMb3dPpe2cInG+IVmDr0UNyo8pge+yQVzdEqtXXx
+2rz464M2aet/uHTlL+EBaAQ9QpzYP4PD+xqrV/mrsBStGnFjGv8EkBWSIQKBgF/S
+gQlN0P/CvB0DJSdsvnbbRNXdACmsL3drklCeVjhtMXYgdlUqUgAe2G8kgeuGdD7U
+Tv4Ab/auc6Td8V/ay41x99lxS181lDLixFLAkQ1mTYT6a2NvbyVEX9XNDlXquigp
+IUptFluYI6tXqTLV3nJCmTXm7WhiWmSmhIvEFLpbAoGAOG/Q2uKi+ulCQ5ZHbhJx
+fCcie5sWeBl25bJkSxs+BiIRgWZAD28q46M9aAHkNXk+/2bHdb+jpHpcYFuRN5oX
+/GcE171eyuk5juR2nYg5eK7q4o9RBR2cqIax+eEg19xhn6K8IycI1kS5EG8FdMV3
+Q7A48N8WVZbSq+YYYdKfNNA=
+-----END PRIVATE KEY-----

+ 1 - 0
OpenAS2Server/certificates/self-signed/server.com/ca.srl

@@ -0,0 +1 @@
+BDF6F9EBE952318C

+ 21 - 0
OpenAS2Server/certificates/self-signed/server.com/server.crt

@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmMCCQC99vnr6VIxjDANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJD
+TjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAlNaMQ0wCwYDVQQKDARNeUNhMQwwCgYD
+VQQLDANkZXYxETAPBgNVBAMMCG15Y2EuY29tMSQwIgYJKoZIhvcNAQkBFhVzdW55
+anpodWlAb3V0bG9vay5jb20wHhcNMTgwMjI0MTE0MzQyWhcNMjgwMjIyMTE0MzQy
+WjCBgTELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQHDAJTWjEPMA0G
+A1UECgwGc2VydmVyMQwwCgYDVQQLDANkZXYxEzARBgNVBAMMCnNlcnZlci5jb20x
+JDAiBgkqhkiG9w0BCQEWFXN1bnlqemh1aUBvdXRsb29rLmNvbTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAM3V5znm1hQ9jpZUhuflCl46sGaYx0ZwomwH
+lHPJSJkO4OARQHoXPlXguDCd5b4N59wnIVw2Iw7uTIx26iLhhvIrYt4Rp0sIPMwL
+u64u1FQiWmcE3uejHAZovo7HY0moN6W4cCtRyf9OY5dqRQPEYzErbc9CjIdkT4Ga
+JXihjXWbwGOn/lFYKGODvTVUb8DHRi+R82lkQTxqvts4mPzl+lXWDz1CXrJ31NhD
+H0O/oifLQvzWpcC1/VDY2F2FulOYamCMBJ4xksUnII1ztisP4yhJezxJkDb9O77y
+X6yU9Er2oiowRigNSMASVSM1IqWPa/W3QirKx3K9dSegnWlyzE8CAwEAATANBgkq
+hkiG9w0BAQUFAAOCAQEAnJJOVDW3C/WDcutcn7bMNaduCvx6Ybw37iWUT3ebMClr
+J6g+qvoqaibTnENhDSKAr6RuO4yPIbwc6Q59uWvGNiPWiKmg1YaC+BDHIHueN3wx
+jxcmu5wnVsHPAcozAEkuNrTiXIymjWOyLtWL2g/WKELv8/RlZjM/9DWlXTTjyUhU
+QGW7hPMrsq3CvDlWRUV89TsNjoIP+BMTMaXXgEn+rB4M0wBmijeB2DOcnp12r+WI
+YhsqOoheFprJ/YaSahVoBV9U3eKPMZyysl0A9SVRu91nCpiaLkQP3DsYZNvS8iy8
+74ahE5UMr4x95WQ8UtefK+u62ce0rHPlB8Iq7gQPmw==
+-----END CERTIFICATE-----

+ 17 - 0
OpenAS2Server/certificates/self-signed/server.com/server.csr

@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICxzCCAa8CAQAwgYExCzAJBgNVBAYTAkNOMQswCQYDVQQIDAJHRDELMAkGA1UE
+BwwCU1oxDzANBgNVBAoMBnNlcnZlcjEMMAoGA1UECwwDZGV2MRMwEQYDVQQDDApz
+ZXJ2ZXIuY29tMSQwIgYJKoZIhvcNAQkBFhVzdW55anpodWlAb3V0bG9vay5jb20w
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDN1ec55tYUPY6WVIbn5Qpe
+OrBmmMdGcKJsB5RzyUiZDuDgEUB6Fz5V4LgwneW+DefcJyFcNiMO7kyMduoi4Yby
+K2LeEadLCDzMC7uuLtRUIlpnBN7noxwGaL6Ox2NJqDeluHArUcn/TmOXakUDxGMx
+K23PQoyHZE+BmiV4oY11m8Bjp/5RWChjg701VG/Ax0YvkfNpZEE8ar7bOJj85fpV
+1g89Ql6yd9TYQx9Dv6Iny0L81qXAtf1Q2NhdhbpTmGpgjASeMZLFJyCNc7YrD+Mo
+SXs8SZA2/Tu+8l+slPRK9qIqMEYoDUjAElUjNSKlj2v1t0IqysdyvXUnoJ1pcsxP
+AgMBAAGgADANBgkqhkiG9w0BAQUFAAOCAQEAsy4i52vDLRuZfE92GjYZLQ+tTk95
+KXlmRfwJOF5cdpmPIQvWABzep0gxE6TzSpKzSodUHi/vWRDTjLpdHdcsFbrL4Ryt
+Ojibj6ki1el8nHhzQCkvR3fiZB7Lnulvj4KGq2eSOKxXqigUTM1CtWpMSxyVcSbL
+N28o3JFOPw6ErJnLLkBV9/sPJWSZfjNRMO5rwlFkQ+hI2fhUn7vv3ytD3HEDeWbN
+BcvebCVOaKF9x2cuuN4ed14YotrapFwBq/B3ZfVBVv6ftpx8aZxka4PpKynKZ+L6
+wEnI6gh105WSHeDkg21E+d7c+s8MS4rWfZJhLkHwIqPdgzCcGQp63uzhkQ==
+-----END CERTIFICATE REQUEST-----

+ 30 - 0
OpenAS2Server/certificates/self-signed/server.com/server.key

@@ -0,0 +1,30 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,1C2B427BB454ECA7569F94FE1DFF1904
+
+avYpk5c5quu+4Vq1rhfzlnCUxgOQ8KUTtEEqtuZUv8fbjeVOK8EXW8Eukpg2JtRl
+vnT2z+GWjyoybNIIYKPnWTEkaPWNkvLjTrY0EIt3/knK1NwHyQ6WS5b5XgA54N3I
+3CPXp8d1/5qviHFttYsUDQHylB0LfvJNdmayxbT+wewVcaLF8OMEEb3QRcmcvkS7
+GCjYQa74UAyRS/ENz4Ab7qbbddy9qCppK26+cdnL02ta5t5NWPxvFjudSVOLtUn6
+CWMnFw4DIc47IIRoja23arQ9Yr1o5NssNwueF0hzDYI59Q85A/jfW8FhUVJlppJe
+6pwVQD0lDCGgKEgwQnJNnQe06j06q0ivhnGEzw+gq/M3vi7RrnimKXZSWKz+zroo
+HwHdKF16YGhNyicjLWLJeAkNriAWgYdVirK+FGZCq2TgMMyVdBDXkBdhM4iCrqxi
+rPP7zaFZRprB3HzqN3hFrLEpH0B7o5QipNDbxvrPt06DZ+9/fOP1+uGAUhpm1Cdz
+XjNZYf1zgCOOIBpqqiNHV8wIuggjPOJYlynfhLrDwopmSeTXfmdO2WUeShJzxnnN
+ROdsGIHBoKgogQYzkkcdyufloxU49uAIpidnkXU7NZR3KKd/xG0tk5XlA5XsI+eb
+tnYrYFsqSPIp56WWlXy6AfDgbbX0uMsHkubtIrsL/uWBA5lbdJtYC8pZtO7wmV7P
+xXwffR7QIfjSKxESKg9MpqC7VdpxRuVu5xS68FNe4+6Hw2eH8xhHo5mQVaZ6wHGn
+tJJ2uzASnwBYefQXAf1JjebexfF5H7VA4aco89HjMLVup6TcikSvjuBRlDnGMQ6l
+21It5IdMnt5tij3vHSGZZ+R49SGXKl3qUwWG4q3BlBhkCX9CwDkSxuaid180KrlF
+pdDTwWU/9nVPQEK+cl3mZlQboegGhmGjDpvn9UkUd9BVAkfcGQOnsKEum+9YfMzA
+ZlVb4eGqXcT+FPZPQhs90tEbaURVQ1p4tsrFvntQHaOwnIOFvGWX21KUXAyWRm12
+bd0QE7MASIUJZztAZstdECaM73UwwxtTWZ55bVa+YYDdJROU1cUE/CQmx2KDnDBp
+yLaKu1mwQIJIppmOwzKLV/70/CVQpEMwaDpMsuV4bsLCLPTOqx9pHo+nLPyPrEk2
+1NXP+I6v4LgSo7HpJ3p2OPiI3F7efvoi0StaEiAxgyUH9VxSFtNZE1f5jKV5vfT/
++ZMqFVGpr2mar8Avs1cFpuf1Qs0vj0EkaIXVG+gRUUiyS/5T4acPD41nFfaFO7ne
+AgclxSEUjEDRlG5p3XAZx8mGZm6uVfBEri5PZ4Av/0CYKzyhBPq4rXHNh+ipHToq
+f/UtEg8XJUB/rIfUgSQdWlGfK0AhYKit/MHFVX0/lJFLrMddyPK45pgQcKdhW6us
+20kJc0V9tggA5RML2h6RY+jmQl3pFFSmijJsOKHp2TG80nzJtrduEJFuHf2Qseu2
+yecNqHT8RHwYCoRkj6B5jp3Jfm2wbgGbak5AjAKcySvPCBRxrroS58Qjx9HUHJrD
+WtR7oJu7Bg9fIn5Njdt3Pmd5+KUG9tA8wsyps1DKVD/BX0bjMgurB74PjJrtLrH1
+-----END RSA PRIVATE KEY-----

BIN
OpenAS2Server/certificates/self-signed/server.com/server.p12


+ 13 - 0
OpenAS2Server/certificates/self-signed/ubtob.com/Readme.md

@@ -0,0 +1,13 @@
+#CA
+`openssl req -newkey rsa:2048 -nodes -keyout "UAS Root CA.key" -x509 -days 9131 -out "UAS Root CA.crt" -subj "/C=CN/L=SZ/O=UAS/OU=Root CA/CN=UAS Root CA"`
+#服务器
+`openssl genrsa -aes256 -passout pass:ef3d7fc7ad47f0a84a55d27bf45b48c9 -out ubtob.com.key 2048`
+`openssl req -new -key ubtob.com.key -passin pass:ef3d7fc7ad47f0a84a55d27bf45b48c9 -out ubtob.com.csr -subj "/C=CN/ST=GD/L=SZ/O=ubtob.com/OU=Tech Research/CN=ubtob.com"`
+#签名
+`openssl x509 -req -days 3653 -in ubtob.com.csr -CA "UAS Root CA.crt" -CAkey "UAS Root CA.key" -passin pass:ef3d7fc7ad47f0a84a55d27bf45b48c9 -CAcreateserial -out ubtob.com.crt`
+#转为 pfx
+`openssl pkcs12 -export -in ubtob.com.crt -inkey ubtob.com.key -passin pass:ef3d7fc7ad47f0a84a55d27bf45b48c9 -password pass:ef3d7fc7ad47f0a84a55d27bf45b48c9 -out ubtob.com.p12 -name ubtob.com`
+
+其中:
+1. `-passin` 为私钥(文件)密码(nodes 为无加密)
+2. `-password` 指定 p12 文件的密码(导入导出)

+ 21 - 0
OpenAS2Server/certificates/self-signed/ubtob.com/UAS Root CA.crt

@@ -0,0 +1,21 @@
+-----BEGIN CERTIFICATE-----
+MIIDczCCAlugAwIBAgIJAON976rrYd4aMA0GCSqGSIb3DQEBBQUAMFAxCzAJBgNV
+BAYTAkNOMQswCQYDVQQHDAJTWjEMMAoGA1UECgwDVUFTMRAwDgYDVQQLDAdSb290
+IENBMRQwEgYDVQQDDAtVQVMgUm9vdCBDQTAeFw0xODA0MjgwNzQ5MzRaFw00MzA0
+MjgwNzQ5MzRaMFAxCzAJBgNVBAYTAkNOMQswCQYDVQQHDAJTWjEMMAoGA1UECgwD
+VUFTMRAwDgYDVQQLDAdSb290IENBMRQwEgYDVQQDDAtVQVMgUm9vdCBDQTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMkp6B9qr88wC09m8GNjlNYQbcrY
+lxhfuOp8uas7zOOa9gH6TDzUfVkrPtMn1HUM1fOrnKc2dJuar3yljNm/gHHLRQMp
+W64YHCIhIUDwFITui4FMM3cNBc+9Vp4P9I3KNxrRzTf9OVZGHXVc2EnGnbuBMIDO
+7WAOGbAkDcCo099jKFgB1Yjn/C0F4GLm8p/qjhw16TaVFBKbWr1k5ZY06y71ymhf
+KjVIH+fzaevg1wdB8PDEmc2PADHEEbc7RExCOXiE/Cy6dH/iEg3vFCRJHrsqAP1D
+yepidLFWfDjz3pPIGkEs1aNGgzNMvZDGGDn7Bt7MVerDUyq0LlcacwbD7hkCAwEA
+AaNQME4wHQYDVR0OBBYEFLN0zyg0u13QoCOQiAYpzIFlvYpzMB8GA1UdIwQYMBaA
+FLN0zyg0u13QoCOQiAYpzIFlvYpzMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEF
+BQADggEBALfEGRlx21eekqzZf1qz7OgEw19lE8c92Mt0RG1qY7Tm8N7UsTQBUyei
+mbve7AWOCM+fv2mDgTElCHFcahqvufQTCdRFDs6jjQuRYAhBJWih6VrN91LXr036
+uzjeupTtHcIdO3VfCOScoG6b15Q9J9/BEuIq/OfHc33/BHy5LJpVr5GYa8gIc2lC
+dY7TM3+BiT6F5mNayCT2TnKjme3Z2DZ80sN0FLK1w7GZgHT7ljeyeys/K5zFzMbb
+Stkx7U5DyTiqZJHIiQIDWGfX0aj6klJNGGTMc60L3D31dQ0mwlsW/CDWFtvxE8sR
+62iS+1PYQ2NywPC8UiTdJ+S615GDvBA=
+-----END CERTIFICATE-----

+ 28 - 0
OpenAS2Server/certificates/self-signed/ubtob.com/UAS Root CA.key

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJKegfaq/PMAtP
+ZvBjY5TWEG3K2JcYX7jqfLmrO8zjmvYB+kw81H1ZKz7TJ9R1DNXzq5ynNnSbmq98
+pYzZv4Bxy0UDKVuuGBwiISFA8BSE7ouBTDN3DQXPvVaeD/SNyjca0c03/TlWRh11
+XNhJxp27gTCAzu1gDhmwJA3AqNPfYyhYAdWI5/wtBeBi5vKf6o4cNek2lRQSm1q9
+ZOWWNOsu9cpoXyo1SB/n82nr4NcHQfDwxJnNjwAxxBG3O0RMQjl4hPwsunR/4hIN
+7xQkSR67KgD9Q8nqYnSxVnw4896TyBpBLNWjRoMzTL2Qxhg5+wbezFXqw1MqtC5X
+GnMGw+4ZAgMBAAECggEBAJ7+z2fddB3HNHlKvF9h+uaCz7SPIkVyiv5THJEZz+Rp
+u11uzskZjgVnZ92PUp49SfGxRzzmjp3aUi+rzbrhYI0Qg3hvPPZKOhpDozvnReCX
+ho3og5jqIxjB5u9BXyKenJVHE/PX4nStMGVtv8n4AP2Nq59zbi0ImAcfR/tptSSO
+nTPsUvAj3SL8t5qX4pAhgXgOeyzbMSTR/0Qm+L9KWog7uscqxibNuyfidYBTKtVX
+MI1umFKHW4oJyynpwdXsW7wgfQTy1NHMpBz/AQ3cw/IwSxrFOQo9y7guTFnGfvaT
+YX0IUFDGsgA4ChObJgBjR2AzYvNn837yHIQ5urZJoYECgYEA5nqTPb12nM1iI0ha
+Jh5M32OGZkEN5PEtMhmgqWAVwv9AkNO0Z69tJzjZyMqySfTmehvpFrU2YOOInZ2O
+s9SIpSXcTiA9+f/rgpV+h3N+2kRNyEVfscLXqVQwZf80sXhCd4Ts86j2oK4W9N8n
+soMq38t45jx/yC3vXmlfS3TGudECgYEA33BUrUVoLwUhFZO8GskR1KZewBAC6qHE
+pX+LS/2RXeAUBVUfaJeUHtq2ObXrG/ovWc7TyKLLBgbgGev5YH7Zv+4nU9UBjYTp
+tMzwwmXeF2qjFWQsfQRiYeNRqhIOkFEE+HwuGp6icfAatEyYMmMNOCnGRF5UWgzo
+Ll36Bjw0uckCgYB5Y3OrX99Z5J5cgN3iF7FbMpr1viuoOhIYwgCpVI8BndiOrsHk
+njN6JeomZAOVCiRdidew+w5B53TrtrETK8wwVwl6KGccBdsvcrcqdf0IzlK9OTSW
+dk2JxGqdPdWt5u3y7xKxnnsO08IJhILu9UCekBcEBDc04mShMBRdtIp6EQKBgAtW
+CqXD2LZR/0y18xw0yVfNnQ8HgO5giLaQ0wNm+QIXRUzD9dT7o8Mw+3/QD/6aYd6f
+lLUgNUa4AJSwGTXhGbEYJxykuPByJt1KbIigXHU5rs5+B5fMKiWnP9RuGBkQUz08
+J6aoF7vKH8C4BhzAU8JetDVxx7vN3dXEZNP+J/qpAoGAK6oo1Mo2LNzWWsE+fYgb
+0VWBLow13BttcLhquMofExe47dBjTzydqraIm+7GhWZ2CDGGpZKSajDWqsspp1z8
+ocbNh8ng0iSwyf36JoKU3gzB/LqwcAFPf3Rr8t4x3wNKp3b+8szZXd9QU2tt/9CN
+zCexMQG9SvZeX9h/CcGuonA=
+-----END PRIVATE KEY-----

+ 1 - 0
OpenAS2Server/certificates/self-signed/ubtob.com/UAS Root CA.srl

@@ -0,0 +1 @@
+CBFA87555B188551

+ 20 - 0
OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.crt

@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDMzCCAhsCCQDL+odVWxiFUTANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJD
+TjELMAkGA1UEBwwCU1oxDDAKBgNVBAoMA1VBUzEQMA4GA1UECwwHUm9vdCBDQTEU
+MBIGA1UEAwwLVUFTIFJvb3QgQ0EwHhcNMTgwNDI4MDc1MDA0WhcNMjgwNDI4MDc1
+MDA0WjBnMQswCQYDVQQGEwJDTjELMAkGA1UECAwCR0QxCzAJBgNVBAcMAlNaMRIw
+EAYDVQQKDAl1YnRvYi5jb20xFjAUBgNVBAsMDVRlY2ggUmVzZWFyY2gxEjAQBgNV
+BAMMCXVidG9iLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJZJ
+XVX8Vz4ub6NLvKh99lkavQoXdM8fqFgXVoUQmxRNix6ZfW0MH7v3ZQncb/p0bBFC
+19NDtejm7AIEyCZnoB3i49+hMbTbBSeCI1efZhzdLBCkh5YMmEZ9IAs4p6AEoEub
++BlHQ7VA3uNtDJZebDL9HsL/82DNv9nxeyGE2eNzIclJKfphJgfTPQgmSRLpr4um
+kEfIOjBonpBbmTnGaXw6xqRsjdQNQcHDtnkI9ezWab0Sz8BZ4CIBDZy7zxqk1w0+
+fO6CFy2k0zTIbXGwsy4v484upNWK/yPAes9P7Jef6TKYg8sb8rpzTWfhxEPQf+2K
+LlxZwAlwUlk2JoOzLIsCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAWStWXRCL5TbK
+RZFH7DETq2LUwSvay/FdC9XHNFZuGygVFb5s4ks2s1OgFsGfu+br0tISOmAjQMew
+/GAxGqSHMUKA8liCMrEE5qt4NAEsSD2sjEuxJD1WGa548QgkLCUm+6grjz5ax4EV
+lrJAj5tVpex1bJFZnB3SAkZwN2YiSu89yDlPTGsyiip5JhkYKxXqXwIL+jZhwMqY
+jqcwr5hHAH3+QEJZy9pkvXodkgzO1Wm5sr3rP8yFHUw3aX/AHrxto8fktql91e0g
+Pul9/Zu0esJf7I0mUhsaPcGnnQv4a2FXyxUtNfvVtEeyGE4pWCwj0GUoptOz2buB
+zxv43eJ8vQ==
+-----END CERTIFICATE-----

+ 17 - 0
OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.csr

@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICrDCCAZQCAQAwZzELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH
+DAJTWjESMBAGA1UECgwJdWJ0b2IuY29tMRYwFAYDVQQLDA1UZWNoIFJlc2VhcmNo
+MRIwEAYDVQQDDAl1YnRvYi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCWSV1V/Fc+Lm+jS7yoffZZGr0KF3TPH6hYF1aFEJsUTYsemX1tDB+792UJ
+3G/6dGwRQtfTQ7Xo5uwCBMgmZ6Ad4uPfoTG02wUngiNXn2Yc3SwQpIeWDJhGfSAL
+OKegBKBLm/gZR0O1QN7jbQyWXmwy/R7C//Ngzb/Z8XshhNnjcyHJSSn6YSYH0z0I
+JkkS6a+LppBHyDowaJ6QW5k5xml8OsakbI3UDUHBw7Z5CPXs1mm9Es/AWeAiAQ2c
+u88apNcNPnzughctpNM0yG1xsLMuL+POLqTViv8jwHrPT+yXn+kymIPLG/K6c01n
+4cRD0H/tii5cWcAJcFJZNiaDsyyLAgMBAAGgADANBgkqhkiG9w0BAQUFAAOCAQEA
+H6FZoV1eevJOaajrmLF1tlhD2sWtb6E4hRe15fPh3pSRrIwvRQv/WO92o4oumJmq
+SCf2e/LZWjH0kKxQbbJRpVwN0rPna/dOXhIE2nsJZfYC3nLUpROi//rxQeGOWnlY
+11uP/fWcgsKL9JPdreG+h3B6SEhMNJt6dxpRFlPKYuLZOtJUG2WR5+zmXpkyqsPK
+LWIP+1L5BmKpePkB3zaz+9FeiY6+hrBHokiezmg76z5D7VGPVFQGO2kAu9lxeyFB
+Pab6c2kcC3kTLnnNqrBSyCwmk/uLYK9c0trNLtJJFL4JeOAlzbhuziaZ/+5M4vYC
+4dZXh1cEkA5FMh0x/GfceA==
+-----END CERTIFICATE REQUEST-----

+ 30 - 0
OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.key

@@ -0,0 +1,30 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,5913D6EA8E2649B4FC892927978FBEFD
+
+UMBdUhUyie9vQFqOYvULYEcNyBGztAO3YcuTi2B1ESS4qt531G4sWgBtsNI0olu1
+7aeGunxm+odM9L9I9YFghDaVd/sPSJpcx0+ybTQFhFssYiSe4c5/0j9nonsy7PaW
+nuIjkdl9mia4Ov/2S6Fc4uex+WVhQiL+ylUfQ9VfQZlUNN7kW1ti2HPtLLXlpvD4
+1sJxSEREtPu/XPMDXS0trB1wAktQg1Jexdwp7koUhVQM3kYxkVWjAS79WPH32YLX
+jZxGn4khrxN+xj/q9IjGfdNV+UagepwHMsvTKbdKPerzUEzYwC+vHW4rbe/erbv3
++vpbqH8IGe+BMuRpFff7v9zq7IHJPj7pFTSwFdGLtF9faXMeBMykfOYCzzmRhIYJ
+y5QW9V1zetGKbTs+Fx96UAx/Rx+C1VkhfutbR8LbdVkg1XfGn25cMjzz0mLhcQe1
+1rg7jLK6ndYgpveZ9RqobAF0pa2XUf2G5aAGz5QZDrPB3OWuOG9sm8bD1HYx40mj
+S05+yBptVret+2NesSxMLb8SMsWb7uTG8dsmhqSOOj6p4x3hQPIeO556ByvvYUUB
+qAI0cEHOFwil79yQS4BmxclpUwbJGdn+k2KNWlS253u0E1Rx6gIVPgwjwDzfiTeJ
+ETtbdmAZhbR89dz9LdXK8ijwoEGrmIKh+va1bsFOvA1DNMkhtI7lUOQ/Za9+sEzK
+PgH28KjjM0FaRyUY1JyHHsmw6qbodoy9GJ7u0mTkGr7Z9X+/q+RGZT8jmFPtb7p2
+YZXvTpaFGRC8l7rljBCNB6A8VU3484SP610Tttq4un3cren5F0Occ7ufZGfL6yHr
+8lDEcV4NCVF0yCfzFfXWi0aCBTc0Ln1JPIRs9xrnT5UreInseKfdSkSJcycrjKZl
+r7YwhdW6NCw+sjn7Hqko4+ZWsvotcmXRGRuhsfJeESBXevsHB3w2Uqi65J/MDEVi
+mhv8EXGs9t8mLP6j+rMs3mm4qVM9GIr3JnIKz2kVx0c+UQl/9/YBGDd8y5ekb5th
+F09SNUfcUYbQCeSfQwDOPb8/fbajyVrJaYGb71Sw4ohpe3aTDgid3RB+RyotE0NG
++Hu404G0Pq1VYJPn3qHJTMih+CeYJvORgURtWWOdTWknhHuqIrd71JKe+3PtsFdQ
+TjffBo8/v69eYCb1xcDH/ACr69fc41gKOzAv6QudzFlbKIYIBATvKkw6CrzQSIzt
+3WPZszs7CEgiiBotBCCzryQY5Zwt6QKXQmqsdJiF+pPMI0fEwYTZ6m9Devp6Eog0
+6iSWeZMj/nmn+NqtfVe/2PbCsSNODnk0aXDTXgCMBZaw/wGdDleNekCagVy1UKwH
+blqkg/0naZ6VSsfSOudrD7bmmJCt9nHyx33C7rYg8SxfzgYPYZOmvcPdMl/6fU2f
+1n+PwBdMOU195h/IPwhYEa5gJmGK2Jib373QCSkXDw7rXgYKsnzDH8dPoaD2LErW
+oIxFdYNH9csZyvGvN5WJ03BkSVn8DV1+f2rV+hMgNNPa2wfhLcDRmfm1Fi05+eck
+QZBLma+ElJPN2mNx0VHE0cX1h9GXH+2AH55pv6AdPQRSDrBLy8rRntpgX1lQYwW4
+-----END RSA PRIVATE KEY-----

BIN
OpenAS2Server/certificates/self-signed/ubtob.com/ubtob.com.p12


BIN
OpenAS2Server/certificates/ubtob.com/GlobalSign Organization Validation CA - SHA256 - G2.cer


BIN
OpenAS2Server/certificates/ubtob.com/GlobalSign Root CA.cer


+ 78 - 0
OpenAS2Server/certificates/ubtob.com/ubtob.com.cer

@@ -0,0 +1,78 @@
+-----BEGIN CERTIFICATE-----
+MIIFWTCCBEGgAwIBAgIMI6nk74szN1LpRDNRMA0GCSqGSIb3DQEBCwUAMGYxCzAJ
+BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTwwOgYDVQQDEzNH
+bG9iYWxTaWduIE9yZ2FuaXphdGlvbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0g
+RzIwHhcNMTcwNTExMTE1MzUxWhcNMTgwNTEyMTE1MzUxWjCBgzELMAkGA1UEBhMC
+Q04xDzANBgNVBAgMBuW5v+S4nDEPMA0GA1UEBwwG5rex5ZyzMRAwDgYDVQQLEwdJ
+VCBEZXB0MSowKAYDVQQKDCHmt7HlnLPluILkvJjova/np5HmioDmnInpmZDlhazl
+j7gxFDASBgNVBAMMCyoudWJ0b2IuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAs4cosE6UN09N636lL3dE6KsIlU8h2W3Sxw1Tk5UcvZ+VpNxOVmVc
+10n4Jxe3feZs8tm/6bp47PJ7fUEO4w1PUB/iGrn4vSSc+gBKOPLrd5kow6o/Wt9m
+JmhMM8c0srCyBSN95yLktrS7FOliFik2ydCC+wbl2ob/+isFsaTH5jRnA37CzR6/
+xg9mJONB9qb7yPZXhGCYr50sDthqeCNt8EwBWmIgBDGouIVP3Rp3bZDYSEyEbDg4
+Oxdo7t9tUU5zPxvjFBNaARacCqY1jnIDkc8lg1mwbxjTPDaNz3vWhh9jyOlD9Icn
+G3hRRLE7KSwECnzkApf/vc0wYjFzWWcZnQIDAQABo4IB5zCCAeMwDgYDVR0PAQH/
+BAQDAgWgMIGgBggrBgEFBQcBAQSBkzCBkDBNBggrBgEFBQcwAoZBaHR0cDovL3Nl
+Y3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvZ3Nvcmdhbml6YXRpb252YWxzaGEy
+ZzJyMS5jcnQwPwYIKwYBBQUHMAGGM2h0dHA6Ly9vY3NwMi5nbG9iYWxzaWduLmNv
+bS9nc29yZ2FuaXphdGlvbnZhbHNoYTJnMjBWBgNVHSAETzBNMEEGCSsGAQQBoDIB
+FDA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBv
+c2l0b3J5LzAIBgZngQwBAgIwCQYDVR0TBAIwADBJBgNVHR8EQjBAMD6gPKA6hjho
+dHRwOi8vY3JsLmdsb2JhbHNpZ24uY29tL2dzL2dzb3JnYW5pemF0aW9udmFsc2hh
+MmcyLmNybDAhBgNVHREEGjAYggsqLnVidG9iLmNvbYIJdWJ0b2IuY29tMB0GA1Ud
+JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUdpUogUKC+cFr1FM/
+pyvetx8uWFowHwYDVR0jBBgwFoAUlt5h8b0cFilTHMDMfTuDAEDmGnwwDQYJKoZI
+hvcNAQELBQADggEBAFhxsKRDbd9c9Wg5zRraOlBLoh6TNDoAEkcGGRO0ftoU/7z6
+lHYC5dd7PKKDYI+ACvqhudlUHNmFcCiUrnqaPZv0/QMAOb1MnbTnUZT/Rcb5RDGN
+eI/TgymvLG1DLax5MzgoNBgAxXjyY5TP6RfezjGUPh1WB6l4EyPLyJdzyvUEZME4
+0JFWop6bZcJh74i+Ifypq3d6x/iEschRPp2OY1XkrmB4nu8nm6yW79XNdUnr8Tuf
+NWM8E/c+hEMy1jYVD/YrjqTRAdakORwNBnCgdA+ja824tWNVdW5pzF/F8iLZNiri
+AX0N9UJEaqpkzkzK4rwYgl79bbKj0Vh9PZB1CJ0=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEaTCCA1GgAwIBAgILBAAAAAABRE7wQkcwDQYJKoZIhvcNAQELBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
+MDBaFw0yNDAyMjAxMDAwMDBaMGYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMTwwOgYDVQQDEzNHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBW
+YWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDHDmw/I5N/zHClnSDDDlM/fsBOwphJykfVI+8DNIV0yKMCLkZc
+C33JiJ1Pi/D4nGyMVTXbv/Kz6vvjVudKRtkTIso21ZvBqOOWQ5PyDLzm+ebomchj
+SHh/VzZpGhkdWtHUfcKc1H/hgBKueuqI6lfYygoKOhJJomIZeg0k9zfrtHOSewUj
+mxK1zusp36QUArkBpdSmnENkiN74fv7j9R7l/tyjqORmMdlMJekYuYlZCa7pnRxt
+Nw9KHjUgKOKv1CGLAcRFrW4rY6uSa2EKTSDtc7p8zv4WtdufgPDWi2zZCHlKT3hl
+2pK8vjX5s8T5J4BO/5ZS5gIg4Qdz6V0rvbLxAgMBAAGjggElMIIBITAOBgNVHQ8B
+Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUlt5h8b0cFilT
+HMDMfTuDAEDmGnwwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0
+dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCow
+KKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYB
+BQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNv
+bS9yb290cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZI
+hvcNAQELBQADggEBAEYq7l69rgFgNzERhnF0tkZJyBAW/i9iIxerH4f4gu3K3w4s
+32R1juUYcqeMOovJrKV3UPfvnqTgoI8UV6MqX+x+bRDmuo2wCId2Dkyy2VG7EQLy
+XN0cvfNVlg/UBsD84iOKJHDTu/B5GqdhcIOKrwbFINihY9Bsrk8y1658GEV1BSl3
+30JAZGSGvip2CTFvHST0mdCF/vIhCPnG9vHQWe3WVjwIKANnuvD58ZAWR65n5ryA
+SOlCdjSXVWkkDoPWoC209fN5ikkodBpBocLTJIg1MGCUF7ThBCIxPTsvFwayuJ2G
+K1pp74P1S8SqtCr4fKGxhZSM9AyHDPSsQPhZSZg=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----

+ 28 - 0
OpenAS2Server/certificates/ubtob.com/ubtob.com.key

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCzhyiwTpQ3T03r
+fqUvd0ToqwiVTyHZbdLHDVOTlRy9n5Wk3E5WZVzXSfgnF7d95mzy2b/punjs8nt9
+QQ7jDU9QH+Iaufi9JJz6AEo48ut3mSjDqj9a32YmaEwzxzSysLIFI33nIuS2tLsU
+6WIWKTbJ0IL7BuXahv/6KwWxpMfmNGcDfsLNHr/GD2Yk40H2pvvI9leEYJivnSwO
+2Gp4I23wTAFaYiAEMai4hU/dGndtkNhITIRsODg7F2ju321RTnM/G+MUE1oBFpwK
+pjWOcgORzyWDWbBvGNM8No3Pe9aGH2PI6UP0hycbeFFEsTspLAQKfOQCl/+9zTBi
+MXNZZxmdAgMBAAECggEAat32Fp1wFUyb8ac95Xd2CZpmTZsBZ1C8u8jvC1cj+Kza
+g3yxFTTZgz6A/aRckhFsoVOFrjhWa5YcdH8ZwYbWw7d2/Lnfm5gD6b3qcOQJzvPZ
+FEBv3kRFpm9HjTrz37rW/cAW3lQjGa+T/eq/fLmj55a7oXqFsQPTtLOPfCO+6wUb
+bmnk7mZZCfSMrswDISzv6fk0Nz2pFs18RYmdwI1HeJgHlWfx0XInwxKTA2ogwQsp
+DWNzlu39OTwnSrOuuQxvE6dNoSyzJUKxOuG4M3quOx/2NBM8x5hMoOoOGtB1CQjG
+Hd+wNkpzZEVJ+jpZ4zbSl2HQbqOi58dC0Ypkrv8jgQKBgQD/kWydbO+uf2RtplNE
+nvQpiZW/MKMgOqcZfpvFjhmeHmgSpiLbCckDRpJmAIvbEYEm0zDAdMetYb6GMQku
+R+X8+VvnaSRB8+zqM9JU5SFkA8oC78ge4ZGKwq8MVgfwBZWrb6Cn3q8tOX5IQOnr
+MpEQbVWOAdFL7SdHCXqbNFd+RQKBgQCz1NWslDZ5I4LLHYSPF36h58DH4twnFYFg
+5RXak+yEvMODu5LSrwzLoN2WEFZpeDM4PTI6R0bVMHuOacUs66yaExntfY/CBdPY
+pm6/r4RSPdffzOlqh3v39o8Lo9O1MqxtDRlgEZLuk/0J/Tbd9N5ESWs3IcvPiYA6
+ZWkVCCLveQKBgQDYm28Ndpkmsr5x2PjWPkr/MaeD5js8Q7oA97gbFrdLtsXKmJkO
+QRrn9dZ7MZdX01w9hd3aIKBkqWWL4t+/JB0f7lEgr5KVe6KfVdC9N363gCalmolo
+8xIiI6OttvT/UBxssy3dWfXrRMFth+c6+x7MZ36N36h+y7/wi24pQZGuaQKBgQCm
+br5rAKkBqFnufh0nCYmLcp+63zz9dyvMb3iwWOM3XjRdAQa7soLXGsS5k9lFt5c/
+33NS+JCX0k0n2sA/+MY/upnucJzR5u7PvgkVou2F5/KZEF6e11FmhmyRS0gulP17
+1/m6LcmcwJ4Z1p4nAe+Lp59w4Pht1UY1xZFhg6xBkQKBgQDoWZ/lhkLBrz46n+mQ
+uyszk4hCr4YtsGRIUPx3pcWVZv7D8GsbsFrUudmQab0qrPiEiciLuUSr0B1PIsDk
+0tyYSel7VsufmiVAmHfOH/A7SIFBuuzf3ZeZyld6OBP6LDCpUJkhAsWCGiQxa4VV
+cvH22WdguacHObeZh0u3PMaa/Q==
+-----END PRIVATE KEY-----

BIN
OpenAS2Server/certificates/ubtob.com/ubtob.com.p12


BIN
OpenAS2Server/config/DB/openas2.mv.db


+ 18 - 0
OpenAS2Server/config/DB/openas2.trace.db

@@ -0,0 +1,18 @@
+2017-04-18 21:36:04 jdbc[3]: exception
+org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-192]
+	at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
+	at org.h2.message.DbException.get(DbException.java:179)
+	at org.h2.message.DbException.get(DbException.java:155)
+	at org.h2.message.DbException.get(DbException.java:144)
+	at org.h2.jdbc.JdbcConnection.checkClosed(JdbcConnection.java:1482)
+	at org.h2.jdbcx.JdbcXAConnection$PooledJdbcConnection.checkClosed(JdbcXAConnection.java:486)
+	at org.h2.jdbc.JdbcConnection.checkClosedForWrite(JdbcConnection.java:1467)
+	at org.h2.jdbc.JdbcConnection.rollback(JdbcConnection.java:500)
+	at org.h2.jdbcx.JdbcXAConnection$PooledJdbcConnection.close(JdbcXAConnection.java:466)
+	at org.openas2.database.H2DBHandler.shutdown(H2DBHandler.java:108)
+	at org.openas2.processor.msgtracking.DbTrackingModule$DBConnection.stop(DbTrackingModule.java:292)
+	at org.openas2.processor.msgtracking.DbTrackingModule.stop(DbTrackingModule.java:244)
+	at org.openas2.processor.DefaultProcessor.stopActiveModules(DefaultProcessor.java:101)
+	at org.openas2.app.OpenAS2Server.shutdown(OpenAS2Server.java:124)
+	at org.openas2.app.OpenAS2Server.start(OpenAS2Server.java:115)
+	at org.openas2.app.OpenAS2Server.main(OpenAS2Server.java:32)

+ 28 - 0
OpenAS2Server/config/commands.xml

@@ -0,0 +1,28 @@
+<commands>
+	<multicommand name="cert"
+		description="Certificate commands">
+		<command classname="org.openas2.app.cert.ImportCertCommand"/>
+		<command classname="org.openas2.app.cert.ImportCertInEncodedStreamCommand"/>
+		<command classname="org.openas2.app.cert.ListCertCommand"/>
+		<command classname="org.openas2.app.cert.DeleteCertCommand"/>
+		<command classname="org.openas2.app.cert.ClearCertsCommand"/>
+		<command classname="org.openas2.app.cert.ViewCertCommand"/>
+	</multicommand>
+	<multicommand name="partner"
+		description="Partner commands">
+		<command classname="org.openas2.app.partner.ListPartnersCommand"/>
+		<command classname="org.openas2.app.partner.AddPartnerCommand"/>
+		<command classname="org.openas2.app.partner.DeletePartnerCommand"/>
+		<command classname="org.openas2.app.partner.ViewPartnerCommand"/>
+	</multicommand>
+	<multicommand name="partnership"
+		description="Partnership commands">
+		<command classname="org.openas2.app.partner.RefreshPartnershipsCommand"/>
+		<command classname="org.openas2.app.partner.ListPartnershipsCommand"/>
+		<command classname="org.openas2.app.partner.AddPartnershipCommand"/>
+		<command classname="org.openas2.app.partner.DeletePartnershipCommand"/>
+		<command classname="org.openas2.app.partner.StorePartnershipsCommand"/>
+		<command classname="org.openas2.app.partner.ViewPartnershipCommand"/>
+	</multicommand>
+
+</commands>

+ 147 - 0
OpenAS2Server/config/config.xml

@@ -0,0 +1,147 @@
+<openas2>
+    <properties
+        sql_timestamp_format="yyyy-MM-dd HH:mm:ss.SSS"
+            
+    />
+	<certificates classname="org.openas2.cert.PKCS12CertificateFactory"
+		filename="%home%/ubtob.com.p12"
+		password="ef3d7fc7ad47f0a84a55d27bf45b48c9"
+		interval="300"/>		
+		
+	<partnerships classname="org.openas2.partner.XMLPartnershipFactory"
+		filename="%home%/partnerships.xml"/>
+		
+	<loggers>
+		<logger classname="org.openas2.logging.ConsoleLogger"/>
+		
+		<!-- Remove this comment to enable emailing of exceptions
+		<logger classname="org.openas2.logging.EmailLogger"
+			show="terminated"
+			javax.mail.properties.file="%home%/java.mail.properties"
+			from="openas2"
+			to="your email address"
+			smtpserver="your smtp server"
+			smtpauth="true"
+			smtpuser="mySmtpUserId"
+			smtppwd="mySmtpPwd"
+			subject="$exception.name$: $exception.message$"
+			bodytemplate="%home%/emailtemplate.txt"/>
+		-->
+		
+		<logger classname="org.openas2.logging.FileLogger"
+			filename="%home%/../logs/log.$date.yyyy-MM-dd$.txt"/>			
+                <!-- Remove this comment to enable socket logging			
+		<logger classname="org.openas2.logging.SocketLogger"
+		    ipaddr="127.0.0.1"
+			portid="19999"/>
+		-->
+	</loggers>
+
+
+	<commands classname="org.openas2.cmd.XMLCommandRegistry"
+		filename="%home%/commands.xml"/>
+	
+	<commandProcessors>
+	  <!-- <commandProcessor classname="org.openas2.cmd.processor.StreamCommandProcessor"/> -->
+	  <commandProcessor classname="org.openas2.cmd.processor.SocketCommandProcessor"  portId="9990"
+	    userid="userID" password="pWd"/>
+	</commandProcessors>
+
+
+	<processor classname="org.openas2.processor.DefaultProcessor"
+	    pendingMDN="%home%/../data/pendingMDN3"
+	    pendingMDNinfo="%home%/../data/pendinginfoMDN3"    
+	>	
+		<module classname="org.openas2.processor.sender.AS2SenderModule">
+                </module>
+		
+		<module classname="org.openas2.processor.sender.AsynchMDNSenderModule">
+                </module>
+		
+				<!-- This will parse the filename to get a sender and receiver. For instance a file
+			named OpenAS2A_OID-OpenAS2B_OID.1234 would be sent from OpenAS2A to OpenAS2B. -->
+		<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule"
+			outboxdir="%home%/../data/toAny"
+			errordir="%home%/../data/toAny/error"			
+			interval="5"			
+			delimiters="-."
+                        sendfilename="true"
+			format="sender.as2_id, receiver.as2_id, attributes.fileid"			
+			mimetype="application/EDI-X12" />
+
+		<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule"
+			outboxdir="%home%/../data/worldshine-GXS_AS2_ICSN11/"
+			errordir="%home%/../data/worldshine-GXS_AS2_ICSN11/error"			
+			interval="5"			
+			defaults="sender.as2_id=worldshine, receiver.as2_id=GXS_AS2_ICSN11"
+			sendfilename="true"
+			mimetype="application/EDIFACT"/>					
+			
+		<!-- 
+		<module classname="org.openas2.processor.receiver.AS2DirectoryPollingModule"
+			outboxdir="%home%/../data/toOpenAS2B"
+			errordir="%home%/../data/toOpenAS2B/error"			
+			interval="5"			
+			defaults="sender.as2_id=OpenAS2A_OID, receiver.as2_id=OpenAS2B_OID"			
+			sendFilename="true"
+			mimetype="application/EDI-X12"/>
+			 -->
+		
+		<module classname="org.openas2.processor.msgtracking.DbTrackingModule"
+		    db_user="sa"
+		    db_pwd="OpenAS2"
+		    db_name="openas2"
+		    db_directory="%home%/DB"
+			jdbc_driver="org.h2.Driver"			
+			jdbc_connect_string="jdbc:h2:$component.db_directory$/$component.db_name$"
+			sql_escape_character="'"
+			tcp_server_start="true"
+			tcp_server_port="9092"
+			tcp_server_password="openas2"
+		/>
+			
+		<module classname="org.openas2.processor.storage.MDNFileModule"
+			filename="%home%/../data/$mdn.msg.sender.as2_id$-$mdn.msg.receiver.as2_id$/mdn/$date.yyyy-MM-dd$/$mdn.msg.content-disposition.filename$-$mdn.msg.headers.message-id$"			
+			protocol="as2"
+			tempdir="%home%/../data/temp"/>
+			
+		<module classname="org.openas2.processor.storage.MessageFileModule"
+			filename="%home%/../data/$msg.sender.as2_id$-$msg.receiver.as2_id$/inbox/$msg.content-disposition.filename$-$msg.headers.message-id$"
+			header="%home%/../data/$msg.sender.as2_id$-$msg.receiver.as2_id$/msgheaders/$date.yyyy-MM-dd$/$msg.content-disposition.filename$-$msg.headers.message-id$"		
+			protocol="as2"
+			tempdir="%home%/../data/temp"/>		
+			
+		<module classname="org.openas2.processor.receiver.AS2ReceiverModule"			
+			port="20880"
+			errordir="%home%/../data/inbox/error"
+			errorformat="sender.as2_id, receiver.as2_id, headers.message-id"/>				
+		<!--
+		<module classname="org.openas2.processor.receiver.AS2ReceiverModule"			
+			port="10443"
+			protocol="https"
+			ssl_protocol="TLS"
+			ssl_keystore="%home%/ssl_certs.jks"
+			ssl_keystore_password="testas2"
+			errordir="%home%/../data/inbox/error"
+			errorformat="sender.as2_id, receiver.as2_id, headers.message-id"/>
+			-->
+
+		<module classname="org.openas2.processor.receiver.AS2MDNReceiverModule"			
+			port="20881"/>
+
+        <!--
+		<module classname="org.openas2.processor.receiver.AS2MDNReceiverModule"			
+			port="10444"
+			protocol="https"
+			ssl_protocol="TLS"
+			ssl_keystore="%home%/ssl_certs.jks"
+			ssl_keystore_password="testas2"
+			/>
+			-->
+		
+		<module classname="org.openas2.processor.resender.DirectoryResenderModule"
+			resenddir="%home%/../data/resend"
+			errordir="%home%/../data/resend/error"
+			resenddelay="60"/>			
+	</processor>
+</openas2>

+ 29 - 0
OpenAS2Server/config/db_ddl.sql

@@ -0,0 +1,29 @@
+set IGNORECASE TRUE;
+DROP TABLE msg_metadata IF EXISTS;
+CREATE TABLE msg_metadata ( 
+  ID INTEGER default 0 NOT NULL AUTO_INCREMENT,
+  MSG_ID LONGVARCHAR NOT NULL,
+  MDN_ID LONGVARCHAR,
+  DIRECTION VARCHAR(25) ,
+  IS_RESEND VARCHAR(1) DEFAULT 'N',
+  RESEND_COUNT INTEGER DEFAULT 0,
+  SENDER_ID VARCHAR(255) NOT NULL,
+  RECEIVER_ID VARCHAR(255) NOT NULL,
+  STATUS VARCHAR(255),
+  STATE VARCHAR(255),
+  SIGNATURE_ALGORITHM VARCHAR(255),
+  ENCRYPTION_ALGORITHM VARCHAR(255),
+  COMPRESSION VARCHAR(255),
+  FILE_NAME VARCHAR(255),
+  CONTENT_TYPE VARCHAR(255),
+  CONTENT_TRANSFER_ENCODING VARCHAR(255),
+  MDN_MODE VARCHAR(255),
+  MDN_RESPONSE LONGVARCHAR,
+  STATE_MSG LONGVARCHAR,
+  CREATE_DT TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+  UPDATE_DT TIMESTAMP,
+  
+  PRIMARY KEY (ID) );
+
+ALTER TABLE msg_metadata ADD CONSTRAINT MSG_ID_UNIQUE UNIQUE (MSG_ID);
+

+ 9 - 0
OpenAS2Server/config/emailtemplate.txt

@@ -0,0 +1,9 @@
+senderid=$message.sender.as2_id$
+receiverid=$message.receiver.as2_id$
+
+exception=$exception.name$
+description=$exception.message$
+
+trace:
+$exception.trace$
+

BIN
OpenAS2Server/config/jssechaincerts


+ 114 - 0
OpenAS2Server/config/partnerships.xml

@@ -0,0 +1,114 @@
+<partnerships>
+	<partner name="Cypress"
+		as2_id="cypressSemiconprod"
+		x509_alias="b2b.cypress.com"
+		email="Steve.Ma@cypress.com"/>	
+	<partner name="SkyeeTech"
+		as2_id="skyeetech"
+		x509_alias="ubtob.com"
+		email="sunyj@usoftchina.com"/>
+
+	<partner name="Synaptics"
+		as2_id="GXS_AS2_ICSN11"
+		x509_alias="ohio450.ohctr.gxs.com"
+		email="americasenablement@opentext.com"/>	
+	<partner name="Worldshine"
+		as2_id="worldshine"
+		x509_alias="ubtob.com"
+		email="sunyj@usoftchina.com"/>
+
+	<partner name="A"
+		as2_id="testa"
+		x509_alias="ubtob.com"
+		email="testa@testa.com"/>	
+	<partner name="B"
+		as2_id="testb"
+		x509_alias="server.com"
+		email="testb@testb.com"/>	
+
+	<partnership name="SkyeeTech-to-Cypress">
+		<sender name="SkyeeTech"/>
+		<receiver name="Cypress"/>
+		<attribute name="protocol" value="as2"/>
+		<attribute name="content_transfer_encoding" value="8bit"/>
+		<!--<attribute name="compression_type" value="ZLIB"/>-->
+		<attribute name="subject" value="From SkyeeTech to Cypress"/>
+		<attribute name="mdnsubject" value="Your requested MDN response from $receiver.as2_id$"/>
+		<attribute name="as2_url" value="https://b2b.cypress.com:5559/invoke/wm.EDIINT/receive"/>
+		<attribute name="as2_mdn_to" value="edi@cypress.com"/>
+		<!--  <attribute name="as2_receipt_option" value="http://localhost:10080"/>   ...for async MDN-->
+		<attribute name="as2_receipt_option" value="http://ubtob.com:20881"/>
+		<attribute name="as2_mdn_options" value="signed-receipt-protocol=optional, pkcs7-signature; signed-receipt-micalg=optional, SHA1"/>
+		<attribute name="encrypt" value="3DES"/>
+		<attribute name="sign" value="SHA1"/>
+		<attribute name="resend_max_retries" value="3"/>
+		<attribute name="prevent_canonicalization_for_mic" value="false"/>
+		<attribute name="no_set_transfer_encoding_for_signing" value="false"/>
+		<attribute name="no_set_transfer_encoding_for_encryption" value="false"/>
+		<attribute name="rename_digest_to_old_name" value="false"/>
+		<attribute name="remove_cms_algorithm_protection_attrib" value="false"/>
+	</partnership>
+	
+	<partnership name="Cypress-to-SkyeeTech">
+		<sender name="Cypress"/>
+		<receiver name="SkyeeTech"/>
+	</partnership>
+
+	<partnership name="Worldshine-to-Synaptics">
+		<sender name="Worldshine"/>
+		<receiver name="Synaptics"/>
+		<attribute name="protocol" value="as2"/>
+		<attribute name="content_transfer_encoding" value="8bit"/>
+		<!--<attribute name="compression_type" value="ZLIB"/>-->
+		<attribute name="subject" value="From Worldshine to Synaptics"/>
+		<attribute name="mdnsubject" value="Your requested MDN response from $receiver.as2_id$"/>
+		<attribute name="as2_url" value="http://as2.am.gxsics.com/enterprise/as2"/>
+		<attribute name="as2_mdn_to" value="americasenablement@opentext.com"/>
+		<!--  <attribute name="as2_receipt_option" value="http://localhost:10080"/>   ...for async MDN-->
+		<attribute name="as2_receipt_option" value="http://ubtob.com:20881"/>
+		<attribute name="as2_mdn_options" value="signed-receipt-protocol=optional, pkcs7-signature; signed-receipt-micalg=optional, SHA1"/>
+		<attribute name="encrypt" value="3DES"/>
+		<attribute name="sign" value="SHA1"/>
+		<attribute name="resend_max_retries" value="3"/>
+		<attribute name="prevent_canonicalization_for_mic" value="false"/>
+		<attribute name="no_set_transfer_encoding_for_signing" value="false"/>
+		<attribute name="no_set_transfer_encoding_for_encryption" value="false"/>
+		<attribute name="rename_digest_to_old_name" value="false"/>
+		<attribute name="remove_cms_algorithm_protection_attrib" value="false"/>
+	</partnership>
+	
+	<partnership name="Synaptics-to-Worldshine">
+		<sender name="Synaptics"/>
+		<receiver name="Worldshine"/>
+	</partnership>
+
+	<partnership name="A-to-B">
+		<sender name="A"/>
+		<receiver name="B"/>
+		<attribute name="protocol" value="as2"/>
+		<attribute name="content_transfer_encoding" value="8bit"/>
+		<!--<attribute name="compression_type" value="ZLIB"/>-->
+		<attribute name="subject" value="From A to B"/>
+		<attribute name="mdnsubject" value="Your requested MDN response from $receiver.as2_id$"/>
+        <!-- modify /etc/hosts to add the line: 10.8.0.14   server.com -->
+		<attribute name="as2_url" value="http://server.com:20880"/>
+		<attribute name="as2_mdn_to" value="edi@testa.com"/>
+		<!--  <attribute name="as2_receipt_option" value="http://localhost:10080"/>   ...for async MDN-->
+		<attribute name="as2_receipt_option" value="http://ubtob.com:20881"/>
+		<attribute name="as2_mdn_options" value="signed-receipt-protocol=optional, pkcs7-signature; signed-receipt-micalg=optional, SHA1"/>
+		<attribute name="encrypt" value="3DES"/>
+		<attribute name="sign" value="SHA1"/>
+		<attribute name="resend_max_retries" value="3"/>
+		<attribute name="prevent_canonicalization_for_mic" value="false"/>
+		<attribute name="no_set_transfer_encoding_for_signing" value="false"/>
+		<attribute name="no_set_transfer_encoding_for_encryption" value="false"/>
+		<attribute name="rename_digest_to_old_name" value="false"/>
+		<attribute name="remove_cms_algorithm_protection_attrib" value="false"/>
+	</partnership>
+	
+	<partnership name="B-to-A">
+		<sender name="B"/>
+		<receiver name="A"/>
+	</partnership>
+</partnerships>
+

BIN
OpenAS2Server/config/ssl_certs.jks


BIN
OpenAS2Server/config/ubtob.com.p12


BIN
OpenAS2Server/lib/bcmail-jdk15on-154.jar


BIN
OpenAS2Server/lib/bcpg-jdk15on-154.jar


BIN
OpenAS2Server/lib/bcpkix-jdk15on-154.jar


BIN
OpenAS2Server/lib/bcprov-jdk15on-154.jar


BIN
OpenAS2Server/lib/commons-lang3-3.4.jar


BIN
OpenAS2Server/lib/commons-logging-1.2.jar


BIN
OpenAS2Server/lib/dom4j-2.0.0.jar


BIN
OpenAS2Server/lib/h2-1.4.192.jar


BIN
OpenAS2Server/lib/javax.mail.jar


BIN
OpenAS2Server/lib/openas2-server.jar


+ 137 - 0
OpenAS2Server/pom.xml

@@ -0,0 +1,137 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<parent>
+		<groupId>net.sf.openas2</groupId>
+		<artifactId>OpenAS2</artifactId>
+		<version>2.4.0</version>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.openas2</groupId>
+	<artifactId>openas2-server</artifactId>
+	<version>2.2.1</version>
+	<name>OpenAS2 Server</name>
+	<url>https://sourceforge.net/projects/openas2</url>
+	<description>Open source implementation of the AS2 standard for signed encrypted and compressed document transfer</description>
+	<properties>
+		<project.dist.package.name>${project.parent.artifactId}Server-${project.version}.zip</project.dist.package.name>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<lib.dir>${basedir}/lib</lib.dir>
+		<help.filename>OpenAS2HowTo.pdf</help.filename>
+		<help.file.src>../docs/${help.filename}</help.file.src>
+		<dist.dir>dist</dist.dir>
+	</properties>
+	<build>
+		<sourceDirectory>src/main/java</sourceDirectory>
+		<directory>target</directory>
+		<outputDirectory>${project.build.directory}/classes</outputDirectory>
+		<!--   <finalName>${project.artifactId}-${project.version}</finalName> -->
+		<finalName>${project.artifactId}</finalName>
+		<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
+
+		<plugins>
+			<plugin>
+				<artifactId>maven-antrun-plugin</artifactId>
+				<version>1.8</version>
+				<executions>
+					<execution>
+						<id>default-cli</id>
+						<goals>
+							<goal>run</goal>
+						</goals>
+						<phase>package</phase>
+						<configuration>
+							<target>
+								<delete file="${lib.dir}/${project.build.finalName}.jar" />
+								<copy file="${project.build.directory}/${project.build.finalName}.jar" todir="${lib.dir}" />
+
+								<!-- Create the distribution directory -->
+								<mkdir dir="${dist.dir}" />
+								<!-- Add the help PDF version to the distro -->
+								<copy file="${help.file.src}" todir="${basedir}" />
+								<!-- create distribution package -->
+								<zip destfile="${dist.dir}/${project.dist.package.name}"
+									basedir="." excludes="dist/**,temp/**,logs/**,data/**,target/**" />
+								<!-- Remove the copied help file -->
+								<delete file="${help.filename}" />
+
+							</target>
+						</configuration>
+					</execution>
+				</executions>
+
+			</plugin>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.1</version>
+				<configuration>
+					<source>1.6</source>
+					<target>1.6</target>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>3.0.2</version>
+				<configuration>
+					<archive>
+						<index>true</index>
+						<manifest>
+							<addClasspath>true</addClasspath>
+							<mainClass>org.openas2.app.OpenAS2Server</mainClass>
+							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+							<!-- get the correct release version number into the MANIFEST file as "Implementation-Version" -->
+							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+						</manifest>
+					</archive>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<groupId>org.dom4j</groupId>
+			<artifactId>dom4j</artifactId>
+			<version>2.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.bouncycastle</groupId>
+			<artifactId>bcmail-jdk15on</artifactId>
+			<version>1.54</version>
+		</dependency>
+		<dependency>
+			<groupId>org.bouncycastle</groupId>
+			<artifactId>bcpkix-jdk15on</artifactId>
+			<version>1.54</version>
+		</dependency>
+		<dependency>
+			<groupId>org.bouncycastle</groupId>
+			<artifactId>bcprov-jdk15on</artifactId>
+			<version>1.54</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-lang3</artifactId>
+			<version>3.4</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-logging</groupId>
+			<artifactId>commons-logging</artifactId>
+			<version>1.2</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.mail</groupId>
+			<artifactId>mail</artifactId>
+			<version>1.4.7</version>
+		</dependency>
+		<dependency>
+			<groupId>com.h2database</groupId>
+			<artifactId>h2</artifactId>
+			<version>1.4.193</version>
+		</dependency>
+		<dependency>
+			<groupId>org.bouncycastle</groupId>
+			<artifactId>bcpg-jdk15on</artifactId>
+			<version>1.54</version>
+		</dependency>
+	</dependencies>
+</project>

+ 248 - 0
OpenAS2Server/src/main/java/CheckCertificate.java

@@ -0,0 +1,248 @@
+
+import javax.net.ssl.*;
+
+import java.io.*;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.PKIXParameters;
+import java.security.cert.TrustAnchor;
+import java.security.cert.X509Certificate;
+import java.util.Iterator;
+
+/**
+ * Class used to add the server's certificate to the KeyStore with your trusted
+ * certificates.
+ */
+public class CheckCertificate
+{
+
+	public static int CheckCertStore(String host, int port, String targetKeyStore, String keyStorePwd) throws Exception
+	{
+		if (keyStorePwd == null || keyStorePwd.length() < 1)
+			keyStorePwd = "changeit";
+		char[] passphrase = keyStorePwd.toCharArray();
+
+		File file = new File(targetKeyStore);
+		if (file.isFile() == false)
+		{
+			char SEP = File.separatorChar;
+			File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security");
+			/* Check if this is a JDK home */
+			if (!dir.isDirectory())
+			{
+				dir = new File(System.getProperty("java.home") + SEP + "jre" + SEP + "lib" + SEP + "security");
+			}
+			if (!dir.isDirectory()) { throw new Exception(
+						"The JSSE folder could not be identified. Please check that JSSE is installed."); }
+			file = new File(dir, "jssecacerts");
+			if (file.isFile() == false)
+			{
+				file = new File(dir, "cacerts");
+			}
+		}
+		// System.out.println("Loading KeyStore " + file + "...");
+		InputStream in = new FileInputStream(file);
+		KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
+		ks.load(in, passphrase);
+		in.close();
+		SSLSocket socket = null;
+		try {
+			socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port);
+		}
+		catch (Exception e) {
+			throw new Exception("\nSOCKET FAIL ::: Reason: " + e + "\n");
+
+		}
+		SSLParameters sslParms = socket.getSSLParameters();
+		String [] protocols = sslParms.getProtocols();
+		//String [] protocols = socket.getEnabledProtocols();
+		//for (int i = 0; i < protocols.length; i++) System.out.println("\nProtocol : " + protocols[i]);
+		TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+		tmf.init(ks);
+		X509TrustManager defaultX509TM = null;
+		
+		for (TrustManager tm : tmf.getTrustManagers()) {
+		    if (tm instanceof X509TrustManager) {
+		    	defaultX509TM = (X509TrustManager) tm;
+		        break;
+		    }
+		}
+
+		SavingTrustManager tm = new SavingTrustManager(defaultX509TM);
+		
+		
+		String lastExceptionMsg = "";
+		for (int i = 0; i < protocols.length; i++)
+		{
+			SSLContext context;
+			try
+			{
+				context = SSLContext.getInstance(protocols[i]);
+			}
+			catch (NoSuchAlgorithmException e1)
+			{
+				lastExceptionMsg = e1.getMessage();
+				continue;
+			}
+			context.init(null, new TrustManager[]{ tm }, null);
+			SSLSocketFactory factory = context.getSocketFactory();
+			try
+			{
+				socket = (SSLSocket) factory.createSocket(host, port);
+			}
+			catch (IOException io)
+            {
+				/*possibly an unsupported protocol so keep going */
+				lastExceptionMsg = io.getMessage();
+				continue;
+			}
+			catch (Exception e)
+			{
+				throw new Exception(e);
+			}
+			break; // Must have successfully connected now
+		}
+		if (socket == null)
+			throw new Exception("Failed to connect to remote system:  " + lastExceptionMsg);
+		try
+		{
+			socket.setSoTimeout(10000);
+			// System.out.println("Starting SSL handshake...");
+			socket.startHandshake();
+			socket.close();
+			//System.out.println();
+			//System.out.println("No errors, certificate is already trusted");
+			// Trusted cert so no need to do anything
+			System.out.println("No errors, certificate is already trusted");
+			return 0;
+		}
+		catch (SSLHandshakeException e)
+		{
+			//e.printStackTrace(System.out);
+			System.out.println("\nException caught starting SSL handshake so set up a local certificate store with trust chain....\n\n");
+		}
+
+		X509Certificate[] chain = tm.chain;
+		if (chain == null)
+		{
+			throw new Exception("Could not obtain server certificate chain");
+		}
+        System.out.println("Number of certificates in chain: " + chain.length);
+        // If the chain contains intermediates then Only install the certificate chain not the host cert
+       // Otherwise if the chain length is 1 then probably the root certificate is not trusted so store that
+        int startNdx = (chain.length == 1)?0:1;
+        if (startNdx == 0)
+        {
+            findClosestMatchTrustedCert(ks, chain[0]);
+            System.out.println("\n\nThe root certificate is not trusted so storing it locally... ");
+        }
+		for (int k = 0; k < chain.length; k++)
+		{
+			X509Certificate cert = chain[k];
+			String alias = host + "-" + (k + 1);
+			ks.setCertificateEntry(alias, cert);
+
+			OutputStream out = new FileOutputStream(targetKeyStore);
+			ks.store(out, passphrase);
+			out.close();
+            System.out.println("Installed certificate as trusted: " + cert.getIssuerDN() + "::" + cert.getSigAlgName());
+		}
+		return 0;
+	}
+	
+	private static void findClosestMatchTrustedCert(KeyStore ks, X509Certificate rootCert)
+	{
+        // This class retrieves the most-trusted CAs from the keystore
+        PKIXParameters params;
+		try
+		{
+			params = new PKIXParameters(ks);
+		} catch (Exception e)
+		{
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			return;
+		}
+
+        String rootCertDN = rootCert.getIssuerDN().getName();
+        String org = getDNField("O", rootCertDN).toLowerCase();
+        String org1StWord = org.replaceAll("(\\S*)[^$]*", "$1").toLowerCase();
+        System.out.println("Looking for matches to root certificate DN:\n\t" + rootCertDN
+      		  + "\n\t\tReference certificate signing algorthim: " + rootCert.getSigAlgName()
+      		  + "\n\n\tTrusted certificate(s) most closely matching \"O\" field of root certificate DN:");
+        // Get the set of trust anchors, which contain the most-trusted CA certificates
+        Iterator<TrustAnchor> it = params.getTrustAnchors().iterator();
+        boolean found = false;
+        while( it.hasNext() ) {
+            TrustAnchor ta = (TrustAnchor)it.next();
+            // Get certificate
+            X509Certificate cert = ta.getTrustedCert();
+            String dn = cert.getIssuerDN().getName();
+            String lcDN = dn.toLowerCase();
+            if (lcDN.contains(org) || lcDN.contains(org1StWord))
+            {
+              found = true;
+              System.out.println(
+            		  "\t\tTrusted certificate DN:\n\t\t" + dn
+            		+  "\n\t\tTrusted certificate signing algorthim: " + cert.getSigAlgName());
+            }
+        }
+        if (!found) System.out.println("\n\t\t\tNo matching certificates found");
+	}
+	
+	private static String getDNField(String dnFld, String dn)
+	{
+		return dn.contains(" "+dnFld+"=\"")?dn.replaceAll(".* "+dnFld+"=\"([^\"]*)\",[^$]*", "$1"):dn.replaceAll(".* "+dnFld+"=([^,]*),[^$]*", "$1");
+	}
+
+	private static class SavingTrustManager implements X509TrustManager
+	{
+
+		private final X509TrustManager tm;
+		private X509Certificate[] chain;
+
+		SavingTrustManager(X509TrustManager tm)
+		{
+			this.tm = tm;
+		}
+
+		public X509Certificate[] getAcceptedIssuers()
+		{
+			return tm.getAcceptedIssuers();
+		}
+
+		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException
+		{
+			tm.checkClientTrusted(chain, authType);
+		}
+
+		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException
+		{
+			this.chain = chain;
+			tm.checkServerTrusted(chain, authType);
+		}
+	}
+
+	public static void main(String[] args) throws Exception
+	{
+		String host;
+		int port;
+		String keyStoreFile;
+		String passphrase;
+		if ((args.length == 2) || (args.length == 3))
+		{
+			String[] c = args[0].split(":");
+			host = c[0];
+			port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
+			keyStoreFile = args[1];
+			passphrase = (args.length == 2) ? "changeit" : args[2];
+		}
+		else
+		{
+			System.out.println("Usage: java CheckCertChain <host name>[:port] <localKeystoreFile> [passphrase]");
+			return;
+		}
+		CheckCertStore(host, port, keyStoreFile, passphrase);
+	}
+}

+ 0 - 0
README.md → OpenAS2Server/src/main/java/META-INF/MANIFEST.MF


+ 85 - 0
OpenAS2Server/src/main/java/org/openas2/BaseComponent.java

@@ -0,0 +1,85 @@
+package org.openas2;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.openas2.params.InvalidParameterException;
+
+
+public class BaseComponent implements Component {
+    private Map<String, String> parameters;
+    private Session session;
+
+    public String getName() {
+        String clippedName = this.getClass().getName();
+
+        // this clips off the package information
+        StringTokenizer classParts = new StringTokenizer(clippedName, ".", false);
+
+        while (classParts.hasMoreTokens()) {
+            clippedName = classParts.nextToken();
+        }
+
+        return clippedName;
+    }
+
+    public void setParameter(String key, String value) {
+        getParameters().put(key, value);
+    }
+
+    public void setParameter(String key, int value) {
+        setParameter(key, Integer.toString(value));
+    }
+
+    public String getParameter(String key, boolean required)
+        throws InvalidParameterException {
+        String parameter = (String) getParameters().get(key);
+
+        if (required && (parameter == null)) {
+            throw new InvalidParameterException("Missing required parameter.", this, key, null);
+        }
+
+        return parameter;
+    }
+
+    public String getParameter(String key, String defaultValue)
+        throws InvalidParameterException {
+        String value = getParameter(key, false);
+
+        if (value == null) {
+            return defaultValue;
+        }
+
+        return value;
+    }
+
+    public int getParameterInt(String key, boolean required)
+        throws InvalidParameterException {
+        String value = getParameter(key, required);
+
+        if (value != null) {
+            return Integer.parseInt(value);
+        }
+
+        return 0;
+    }
+
+    public Map<String, String> getParameters() {
+        if (parameters == null) {
+            parameters = new HashMap<String, String>();
+        }
+
+        return parameters;
+    }
+
+    public Session getSession() {
+        return session;
+    }
+
+    public void init(Session session, Map<String, String> parameters) throws OpenAS2Exception {
+        this.session = session;
+        this.parameters = parameters;
+    }
+	
+}

+ 96 - 0
OpenAS2Server/src/main/java/org/openas2/BaseSession.java

@@ -0,0 +1,96 @@
+package org.openas2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.activation.CommandMap;
+import javax.activation.MailcapCommandMap;
+
+import org.openas2.cert.CertificateFactory;
+import org.openas2.partner.PartnershipFactory;
+import org.openas2.processor.Processor;
+
+
+public abstract class BaseSession implements Session {
+    private Map<String, Component> components;
+	private String baseDirectory;
+
+    /**
+     * Creates a <code>BaseSession</code> object, then calls the <code>init()</code> method.
+     *
+     * @throws OpenAS2Exception
+     *
+     * @see #init()
+     */
+    public BaseSession() throws OpenAS2Exception {
+        init();
+    }
+
+    public CertificateFactory getCertificateFactory() throws ComponentNotFoundException {
+        return (CertificateFactory) getComponent(CertificateFactory.COMPID_CERTIFICATE_FACTORY);
+    }
+
+    public void setComponent(String componentID, Component comp) {
+        Map<String, Component> objects = getComponents();
+        objects.put(componentID, comp);
+    }
+
+    public Component getComponent(String componentID) throws ComponentNotFoundException {
+        Map<String, Component> comps = getComponents();
+        Component comp = comps.get(componentID);
+
+        if (comp == null) {
+            throw new ComponentNotFoundException(componentID);
+        }
+
+        return comp;
+    }
+
+    public Map<String, Component> getComponents() {
+        if (components == null) {
+            components = new HashMap<String, Component>();
+        }
+
+        return components;
+    }
+
+    public PartnershipFactory getPartnershipFactory() throws ComponentNotFoundException {
+        return (PartnershipFactory) getComponent(PartnershipFactory.COMPID_PARTNERSHIP_FACTORY);
+    }
+
+    public Processor getProcessor() throws ComponentNotFoundException {
+        return (Processor) getComponent(Processor.COMPID_PROCESSOR);
+    }
+
+    /**
+     * This method is called by the <code>BaseSession</code> constructor to set up any global
+     * configuration settings.
+     *
+     * @throws OpenAS2Exception If an error occurs while initializing systems
+     */
+    protected void init() throws OpenAS2Exception {
+        initJavaMail();
+    }
+
+    /**
+     * Adds a group of content handlers to the Mailcap <code>CommandMap</code>. These handlers are
+     * used by the JavaMail API to encode and decode information of specific mime types.
+     *
+     * @throws OpenAS2Exception If an error occurs while initializing mime types
+     */
+    protected void initJavaMail() throws OpenAS2Exception {
+        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
+        mc.addMailcap(
+            "message/disposition-notification;; x-java-content-handler=org.openas2.util.DispositionDataContentHandler");
+        CommandMap.setDefaultCommandMap(mc);
+    }
+
+	public String getBaseDirectory() {
+		return baseDirectory;
+	}
+
+	public void setBaseDirectory(String dir) {
+		baseDirectory = dir;
+	}
+
+}

+ 61 - 0
OpenAS2Server/src/main/java/org/openas2/Component.java

@@ -0,0 +1,61 @@
+package org.openas2;
+
+import java.util.Map;
+
+
+/**
+ * The Component interface provides a standard way to dynamically create and
+ * initialize an object. Component-based objects also have access to a
+ * Session, which allow each component to access all components  registered to it's
+ * Session.   Parameters for a component are defined as static strings   Note: Any
+ * object that implements this interface must have a constructor with  no parameters, as these
+ * parameters should be passed to the init  method.
+ *
+ * @author Aaron Silinskas
+ *
+ * @see BaseComponent
+ * @see Session
+ */
+public interface Component {
+    /**
+     * Returns a name for the component. These names are not guaranteed to  be unique, and are
+     * intended for display and logging. Generally this is the class name of the
+     * Component object, without package  information.
+     *
+     * @return name of the component
+     */
+    public String getName();
+
+    /**
+     * Returns the parameters used to initialize this Component, and can also be used
+     * to modify parameters.
+     *
+     * @return map of parameter name to parameter value
+     */
+    public Map<String, String> getParameters();
+
+    /**
+     * Returns the Session used to initialize this Component. The
+     * returned session is also used to locate other components if needed.
+     *
+     * @return this component's session
+     */
+    public Session getSession();
+
+    /**
+     * After creating a Component object, this method should be called to set any
+     * parameters used by the component. Component implementations typically have
+     * required parameter checking and code to start timers and threads within this method.
+     *
+     * @param session the component uses this object to access other components
+     * @param parameters configuration values for the component
+     *
+     * @throws OpenAS2Exception If an error occurs while initializing the component
+     * @throws InvalidParameterException If a required parameter is null in the parameters
+     *         Map
+     *
+     * @see #getParameter(String key, boolean required)
+     * @see Session
+     */
+    public void init(Session session, Map<String, String> parameters) throws OpenAS2Exception;
+}

+ 22 - 0
OpenAS2Server/src/main/java/org/openas2/ComponentNotFoundException.java

@@ -0,0 +1,22 @@
+package org.openas2;
+
+public class ComponentNotFoundException extends OpenAS2Exception {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private String componentName;
+
+    public ComponentNotFoundException(String componentName) {
+        super(componentName);
+        this.componentName = componentName;
+    }
+
+    public String getComponentName() {
+        return componentName;
+    }
+
+    public void setComponentName(String componentName) {
+        this.componentName = componentName;
+    }
+}

+ 41 - 0
OpenAS2Server/src/main/java/org/openas2/DispositionException.java

@@ -0,0 +1,41 @@
+package org.openas2;
+
+import org.openas2.util.DispositionType;
+
+public class DispositionException extends OpenAS2Exception {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private DispositionType disposition;
+	private String text;
+	
+	public DispositionException(DispositionType disposition, String text, Throwable cause) {
+		super(disposition.toString());
+		initCause(cause);
+		this.disposition = disposition;
+		this.text = text;
+	}
+	
+	public DispositionException(DispositionType disposition, String text) {
+		super(disposition.toString());
+		this.disposition = disposition;
+		this.text = text;
+	}
+
+	public DispositionType getDisposition() {
+		return disposition;
+	}
+
+	public void setDisposition(DispositionType disposition) {
+		this.disposition = disposition;
+	}
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String string) {
+		text = string;
+	}
+
+}

+ 67 - 0
OpenAS2Server/src/main/java/org/openas2/OpenAS2Exception.java

@@ -0,0 +1,67 @@
+package org.openas2;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+ ;
+
+
+public class OpenAS2Exception extends Exception {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	public static final String SOURCE_MESSAGE = "message";
+    public static final String SOURCE_FILE = "file";
+    private Map<String,Object> sources;
+	private Log logger = LogFactory.getLog(OpenAS2Exception.class.getSimpleName());
+
+    public OpenAS2Exception() {
+        log(false);
+    }
+
+    public OpenAS2Exception(String msg) {
+        super(msg);
+    }
+
+    public OpenAS2Exception(String msg, Throwable cause) {
+        super(msg, cause);
+    }
+
+    public OpenAS2Exception(Throwable cause) {
+        super(cause);
+    }
+
+    public Object getSource(String id) {
+        Map<String,Object> sources = getSources();
+
+        return sources.get(id);
+    }
+
+    public void setSources(Map<String,Object> sources) {
+        this.sources = sources;
+    }
+
+    public Map<String,Object> getSources() {
+        if (sources == null) {
+            sources = new HashMap<String,Object>();
+        }
+
+        return sources;
+    }
+
+    public void addSource(String id, Object source) {
+        Map<String,Object> sources = getSources();
+        sources.put(id, source);
+    }
+
+    public void terminate() {
+        log(true);
+    }
+
+    protected void log(boolean terminated) {
+    	logger.error("Error occurred:: " + org.openas2.logging.Log.getExceptionMsg(this) + "\n    Sources: "+ this.getSources(), this);
+    }
+}

+ 98 - 0
OpenAS2Server/src/main/java/org/openas2/Session.java

@@ -0,0 +1,98 @@
+package org.openas2;
+
+import java.util.Map;
+
+import org.openas2.cert.CertificateFactory;
+import org.openas2.partner.PartnershipFactory;
+import org.openas2.processor.Processor;
+
+
+/**
+ * The <code>Session</code> interface provides configuration and resource information, and a means for
+ * components to access the functionality of other components.
+ *
+ * @author Aaron Silinskas
+ *
+ * @see Component
+ * @see org.openas2.cert.CertificateFactory
+ * @see org.openas2.partner.PartnerFactory
+ * @see org.openas2.processor.Processor 
+ */
+public interface Session {
+
+    public static final String DEFAULT_CONTENT_TRANSFER_ENCODING = "binary";
+
+    /**
+     * Short-cut method to retrieve a certificate factory.
+     *
+     * @return the currently registered <code>CertificateFactory</code> component
+     *
+     * @throws ComponentNotFound If a <code>CertificateFactory</code> component has not been
+     *         registered
+     *
+     * @see CertificateFactory
+     * @see Component
+     */
+    public CertificateFactory getCertificateFactory() throws ComponentNotFoundException;
+
+    /**
+     * Registers a component to a specified ID.
+     *
+     * @param componentID registers the component to this ID
+     * @param comp component to register
+     *
+     * @see Component
+     */
+    public void setComponent(String componentID, Component comp);
+
+    /**
+     * Gets the <code>Component</code> currently registered with an ID
+     *
+     * @param componentID ID to search for
+     *
+     * @return the component registered to the ID or null
+     *
+     * @throws ComponentNotFound If a component is not registered with the ID
+     */
+    public Component getComponent(String componentID) throws ComponentNotFoundException;
+
+    /**
+     * Return a map of component ID's to <code>Component</code> objects.
+     *
+     * @return all registered components, mapped by ID
+     */
+    public Map<String,Component> getComponents();
+
+    /**
+     * Short-cut method to retrieve a partner factory.
+     *
+     * @return the currently registered <code>PartnerFactory</code> component
+     *
+     * @throws ComponentNotFound If a <code>PartnerFactory</code> component has not been registered
+     *
+     * @see PartnershipFactory
+     * @see Component
+     */
+    public PartnershipFactory getPartnershipFactory() throws ComponentNotFoundException;
+
+    /**
+     * Short-cut method to retrieve a processor.
+     *
+     * @return the currently registered <code>Processor</code> component
+     *
+     * @throws ComponentNotFound If a <code>Processor</code> component has not been registered
+     *
+     * @see Processor
+     * @see Component
+     */
+    public Processor getProcessor() throws ComponentNotFoundException;
+    
+	public String getBaseDirectory();
+
+	public void setBaseDirectory(String dir);
+	
+	public String getAppVersion();
+	
+	public String getAppTitle();
+
+}

+ 32 - 0
OpenAS2Server/src/main/java/org/openas2/WrappedException.java

@@ -0,0 +1,32 @@
+package org.openas2;
+
+public class WrappedException extends OpenAS2Exception {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public WrappedException() {
+        super();
+    }
+
+    public WrappedException(String msg) {
+        super(msg);
+    }
+
+    public WrappedException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
+
+    public WrappedException(Throwable cause) {
+        super(cause);
+    }
+
+    public Exception getSource() {
+        return (Exception) getCause();
+    }
+
+    public void rethrow() throws Exception {
+        throw (Exception) getCause();
+    }
+}

+ 266 - 0
OpenAS2Server/src/main/java/org/openas2/XMLSession.java

@@ -0,0 +1,266 @@
+package org.openas2;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.openas2.cert.CertificateFactory;
+import org.openas2.cmd.CommandManager;
+import org.openas2.cmd.CommandRegistry;
+import org.openas2.cmd.CommandRegistryFactory;
+import org.openas2.cmd.processor.BaseCommandProcessor;
+import org.openas2.logging.LogManager;
+import org.openas2.logging.Logger;
+import org.openas2.partner.PartnershipFactory;
+import org.openas2.processor.Processor;
+import org.openas2.processor.ProcessorModule;
+import org.openas2.util.Properties;
+import org.openas2.util.XMLUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * original author unknown
+ * 
+ * in this release added command registry methods
+ * @author joseph mcverry
+ *
+ */
+public class XMLSession extends BaseSession implements CommandRegistryFactory {
+	public static final String EL_PROPERTIES = "properties";
+	public static final String EL_CERTIFICATES = "certificates";
+	public static final String EL_CMDPROCESSOR = "commandProcessors";
+	public static final String EL_PROCESSOR = "processor";
+	public static final String EL_PARTNERSHIPS = "partnerships";
+	public static final String EL_COMMANDS = "commands";
+	public static final String EL_LOGGERS = "loggers";
+	public static final String PARAM_BASE_DIRECTORY = "basedir";
+	private CommandRegistry commandRegistry;
+	private CommandManager cmdManager;
+
+	private  String VERSION;
+	private  String TITLE;
+
+	
+	public XMLSession(InputStream in) throws OpenAS2Exception,
+			ParserConfigurationException, SAXException, IOException {
+		super();
+		load(in);
+	}
+
+	public XMLSession(String filename) throws OpenAS2Exception,
+			ParserConfigurationException, SAXException, IOException {
+		File file = new File(filename).getAbsoluteFile();
+		setBaseDirectory(file.getParent());
+		FileInputStream fin = new FileInputStream(file);
+		try {
+			load(fin);
+		} finally {
+			fin.close();
+		}
+	}
+
+	public void setCommandRegistry(CommandRegistry registry) {
+		commandRegistry = registry;
+	}
+
+	public CommandRegistry getCommandRegistry() {
+		return commandRegistry;
+	}
+
+	protected void load(InputStream in) throws ParserConfigurationException,
+			SAXException, IOException, OpenAS2Exception {
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+		DocumentBuilder parser = factory.newDocumentBuilder();
+		Document document = parser.parse(in);
+		Element root = document.getDocumentElement();
+
+		NodeList rootNodes = root.getChildNodes();
+		Node rootNode;
+		String nodeName;
+
+		for (int i = 0; i < rootNodes.getLength(); i++) {
+			rootNode = rootNodes.item(i);
+
+			nodeName = rootNode.getNodeName();
+
+			if (nodeName.equals(EL_PROPERTIES)) {
+				loadProperties(rootNode);
+			} else if (nodeName.equals(EL_CERTIFICATES)) {
+				loadCertificates(rootNode);
+			} else if (nodeName.equals(EL_PROCESSOR)) {
+				loadProcessor(rootNode);
+			} else if (nodeName.equals(EL_CMDPROCESSOR)) {
+				loadCommandProcessors(rootNode);
+			} else if (nodeName.equals(EL_PARTNERSHIPS)) {
+				loadPartnerships(rootNode);
+			} else if (nodeName.equals(EL_COMMANDS)) {
+				loadCommands(rootNode);
+			} else if (nodeName.equals(EL_LOGGERS)) {
+				loadLoggers(rootNode);
+			} else if (nodeName.equals("#text")) {
+				// do nothing
+			} else if (nodeName.equals("#comment")) {
+				// do nothing
+			} else {
+				throw new OpenAS2Exception("Undefined tag: " + nodeName);
+			}
+		}
+	}
+	
+    protected void loadProperties(Node propNode)
+    {
+    	Map<String, String> properties = XMLUtil.mapAttributes(propNode);
+    	Properties.setProperties(properties);
+    }
+
+	protected void loadCertificates(Node rootNode) throws OpenAS2Exception {
+		CertificateFactory certFx = (CertificateFactory) XMLUtil.getComponent(
+				rootNode, this);
+		setComponent(CertificateFactory.COMPID_CERTIFICATE_FACTORY, certFx);
+	}
+
+	protected void loadCommands(Node rootNode) throws OpenAS2Exception {
+		CommandRegistry cmdReg = (CommandRegistry) XMLUtil.getComponent(
+				rootNode, this);
+		setCommandRegistry(cmdReg);
+	}
+
+	protected void loadLoggers(Node rootNode) throws OpenAS2Exception {
+		
+		LogManager manager = LogManager.getLogManager();
+		if (LogManager.isRegisteredWithApache())
+			; // continue
+		else {
+			// if using the OpenAS2 loggers the log manager must registered with the jvm argument
+			// -Dorg.apache.commons.logging.Log=org.openas2.logging.Log
+			throw new OpenAS2Exception("the OpenAS2 loggers' log manager must registered with the jvm argument -Dorg.apache.commons.logging.Log=org.openas2.logging.Log");
+		}
+		NodeList loggers = rootNode.getChildNodes();
+		Node logger;
+
+		for (int i = 0; i < loggers.getLength(); i++) {
+			logger = loggers.item(i);
+
+			if (logger.getNodeName().equals("logger")) {
+				loadLogger(manager, logger);
+			}
+		}
+	}
+
+	protected void loadLogger(LogManager manager, Node loggerNode)
+			throws OpenAS2Exception {
+		Logger logger = (Logger) XMLUtil.getComponent(loggerNode, this);
+		manager.addLogger(logger);
+	}
+
+	protected void loadCommandProcessors(Node rootNode) throws OpenAS2Exception {
+		cmdManager = CommandManager.getCmdManager();
+
+		NodeList cmdProcessor = rootNode.getChildNodes();
+		Node processor;
+
+		for (int i = 0; i < cmdProcessor.getLength(); i++) {
+			processor = cmdProcessor.item(i);
+
+			if (processor.getNodeName().equals("commandProcessor")) {
+				loadCommandProcessor(cmdManager, processor);
+			}
+		}
+	}
+
+	public CommandManager getCommandManager() {
+		return cmdManager;
+	}
+
+	protected void loadCommandProcessor(CommandManager manager,
+			Node cmdPrcessorNode) throws OpenAS2Exception {
+		BaseCommandProcessor cmdProcesor = (BaseCommandProcessor) XMLUtil
+				.getComponent(cmdPrcessorNode, this);
+		manager.addProcessor(cmdProcesor);
+	}
+	protected void loadPartnerships(Node rootNode) throws OpenAS2Exception {
+		PartnershipFactory partnerFx = (PartnershipFactory) XMLUtil
+				.getComponent(rootNode, this);
+		setComponent(PartnershipFactory.COMPID_PARTNERSHIP_FACTORY, partnerFx);
+	}
+
+	protected void loadProcessor(Node rootNode) throws OpenAS2Exception {
+		Processor proc = (Processor) XMLUtil.getComponent(rootNode, this);
+		setComponent(Processor.COMPID_PROCESSOR, proc);
+
+		NodeList modules = rootNode.getChildNodes();
+		Node module;
+
+		for (int i = 0; i < modules.getLength(); i++) {
+			module = modules.item(i);
+
+			if (module.getNodeName().equals("module")) {
+				loadProcessorModule(proc, module);
+			}
+		}
+	}
+
+	protected void loadProcessorModule(Processor proc, Node moduleNode)
+			throws OpenAS2Exception {
+		ProcessorModule procmod = (ProcessorModule) XMLUtil.getComponent(
+				moduleNode, this);
+		proc.getModules().add(procmod);
+	}
+
+	private String getManifestAttribValue(String attrib) {
+	    Enumeration<?> resEnum;
+	    try {
+	        resEnum = Thread.currentThread().getContextClassLoader().getResources(JarFile.MANIFEST_NAME);
+	        while (resEnum.hasMoreElements()) {
+	            try {
+	                URL url = (URL)resEnum.nextElement();
+	                if (!url.getPath().contains("openas2")) continue;
+	                InputStream is = url.openStream();
+	                if (is != null) {
+	                    Manifest manifest = new Manifest(is);
+	                    Attributes mainAttribs = manifest.getMainAttributes();
+	                    String value = mainAttribs.getValue(attrib);
+	                    if(value != null) {
+	                        return value;
+	                    }
+	                }
+	            }
+	            catch (Exception e) {
+	                // Silently ignore wrong manifests on classpath?
+	            }
+	        }
+	    } catch (IOException e1) {
+	        // Silently ignore wrong manifests on classpath?
+	    }
+	    return null; 
+	}
+
+	public String getAppVersion()
+	{
+	    if (VERSION == null) VERSION = getManifestAttribValue("Implementation-Version");
+	    return VERSION;
+	}
+
+	public String getAppTitle()
+	{
+	    if (TITLE == null) TITLE = getManifestAttribValue("Implementation-Title") + " v" + getAppVersion();
+	    return TITLE;
+
+	}
+}

+ 155 - 0
OpenAS2Server/src/main/java/org/openas2/app/OpenAS2Server.java

@@ -0,0 +1,155 @@
+package org.openas2.app;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.OutputStreamWriter;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openas2.OpenAS2Exception;
+import org.openas2.XMLSession;
+import org.openas2.cmd.CommandManager;
+import org.openas2.cmd.CommandRegistry;
+import org.openas2.cmd.processor.BaseCommandProcessor;
+
+
+/** 
+ * original author unknown
+ * 
+ * in this release added ability to have multiple command processors
+ * @author joseph mcverry
+ *
+ */
+public class OpenAS2Server {
+	protected BufferedWriter sysOut;
+	BaseCommandProcessor cmd = null;
+	XMLSession session = null;
+
+	
+	public static void main(String[] args) {
+		OpenAS2Server server = new OpenAS2Server();
+		server.start(args);
+	}
+
+	public void start(String[] args) {
+		int exitStatus = 0;
+
+		Runtime.getRuntime().addShutdownHook(new Thread()
+        {
+            @Override
+            public void run()
+            {
+            	shutdown();
+                System.out.println("Shutdown due to process interruption!");
+            }
+        });
+		try {
+			Log logger = LogFactory.getLog(OpenAS2Server.class.getSimpleName());
+			
+			write("Retrieving config file..." + System.getProperty("line.separator"));
+			// Check for passed in as parameter first then look for system property
+			String configFile = (args.length > 0)?args[0]:System.getProperty("openas2.config.file");
+			if (configFile == null || configFile.length() < 1) {
+				// Try the default location assuming the app was started in the bin folder
+				configFile = System.getProperty("user.dir") + "/../config/config.xml";
+			}
+			File cfg = new File(configFile);
+			if (!cfg.exists()) {
+				write("No config file found: " + configFile + System.getProperty("line.separator"));
+				write("Pass as the first paramter on the command line or set the system property \"openas2.config.file\" to identify the configuration file to start OpenAS2" + System.getProperty("line.separator"));
+				throw new Exception("Missing configuration file");
+			}
+			session = new XMLSession(configFile);
+
+			write("Starting Server..." + System.getProperty("line.separator"));
+
+			// create the OpenAS2 Session object
+			// this is used by all other objects to access global configs and functionality
+			write("Loading configuration..." + System.getProperty("line.separator"));
+
+			write(session.getAppTitle() + ": Session instantiated." + System.getProperty("line.separator"));
+			// create a command processor
+
+			// get a registry of Command objects, and add Commands for the Session
+			write("Registering Session to Command Processor..." + System.getProperty("line.separator"));
+
+			CommandRegistry reg = session.getCommandRegistry();
+
+			// start the active processor modules
+			write("Starting Active Modules..." + System.getProperty("line.separator"));
+			session.getProcessor().startActiveModules();
+
+			// enter the command processing loop
+			write(session.getAppTitle() + " Started" + System.getProperty("line.separator"));
+
+			
+			logger.info("- OpenAS2 Started - V" + session.getAppVersion());
+			
+			CommandManager cmdMgr = session.getCommandManager();
+			List<BaseCommandProcessor> processors = cmdMgr.getProcessors();
+			for (int i = 0; i < processors.size(); i++) {
+				write("Loading Command Processor..." + processors.toString()
+						+ System.getProperty("line.separator"));
+				cmd = (BaseCommandProcessor) processors.get(i);
+				cmd.init();
+				cmd.addCommands(reg);
+				cmd.start();
+			}
+			breakOut : while (true) {
+				for (int i = 0; i < processors.size(); i++) {
+					cmd = (BaseCommandProcessor) processors.get(i);
+					if (cmd.isTerminated())
+						break breakOut;
+					Thread.sleep(100); 
+				}
+			}
+			logger.info("- OpenAS2 Stopped -");
+		} catch (Exception e) {
+			exitStatus = -1;
+			e.printStackTrace();
+		} catch (Error err) {
+			exitStatus = -1;
+			err.printStackTrace();
+		} finally {
+			shutdown();
+			System.exit(exitStatus);
+		}
+	}
+
+	public void shutdown()
+	{
+		if (session != null) {
+			try {
+				session.getProcessor().stopActiveModules();
+			} catch (OpenAS2Exception same) {
+				same.terminate();
+			}
+		}
+
+		if (cmd != null) {
+			try {
+				cmd.deInit();
+			} catch (OpenAS2Exception cdie) {
+				cdie.terminate();
+			}
+		}
+
+		write("OpenAS2 has shut down\r\n");
+		
+
+	}
+	
+	public void write(String msg) {
+		if (sysOut == null) {
+			sysOut = new BufferedWriter(new OutputStreamWriter(System.out));
+		}
+
+		try {
+			sysOut.write(msg);
+			sysOut.flush();
+		} catch (java.io.IOException e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 30 - 0
OpenAS2Server/src/main/java/org/openas2/app/cert/AliasedCertCommand.java

@@ -0,0 +1,30 @@
+package org.openas2.app.cert;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cert.AliasedCertificateFactory;
+import org.openas2.cert.CertificateFactory;
+import org.openas2.cmd.BaseCommand;
+import org.openas2.cmd.CommandResult;
+
+public abstract class AliasedCertCommand extends BaseCommand {
+
+    public CommandResult execute(Object[] params) {
+
+        try {
+            CertificateFactory certFx = getSession().getCertificateFactory();
+
+            if (certFx instanceof AliasedCertificateFactory) {
+                return execute((AliasedCertificateFactory) certFx, params);
+            }
+            return new CommandResult(CommandResult.TYPE_COMMAND_NOT_SUPPORTED,
+                    "Not supported by current certificate store");
+        } catch (OpenAS2Exception oae) {
+            oae.terminate();
+
+            return new CommandResult(oae);
+        }
+    }
+
+    protected abstract CommandResult execute(AliasedCertificateFactory certFx, Object[] params) throws OpenAS2Exception;
+
+}

+ 29 - 0
OpenAS2Server/src/main/java/org/openas2/app/cert/ClearCertsCommand.java

@@ -0,0 +1,29 @@
+package org.openas2.app.cert;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cert.AliasedCertificateFactory;
+import org.openas2.cmd.CommandResult;
+
+public class ClearCertsCommand extends AliasedCertCommand {
+	public String getDefaultDescription() {
+		return "Deletes all certificates from the store";
+	}
+
+	public String getDefaultName() {
+		return "clear";
+	}
+
+	public String getDefaultUsage() {
+		return "clear";
+	}
+
+	public CommandResult execute(AliasedCertificateFactory certFx,
+			Object[] params) throws OpenAS2Exception {
+		synchronized (certFx) {
+			certFx.clearCertificates();
+
+			return new CommandResult(CommandResult.TYPE_OK, "cleared");
+
+		}
+	}
+}

+ 36 - 0
OpenAS2Server/src/main/java/org/openas2/app/cert/DeleteCertCommand.java

@@ -0,0 +1,36 @@
+package org.openas2.app.cert;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cert.AliasedCertificateFactory;
+import org.openas2.cmd.CommandResult;
+
+public class DeleteCertCommand extends AliasedCertCommand {
+	public String getDefaultDescription() {
+		return "Delete the certificate and private key associated with an alias.";
+	}
+
+	public String getDefaultName() {
+		return "delete";
+	}
+
+	public String getDefaultUsage() {
+		return "delete <alias>";
+	}
+
+	public CommandResult execute(AliasedCertificateFactory certFx,
+			Object[] params) throws OpenAS2Exception {
+		if (params.length < 1) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (certFx) {
+			String alias = params[0].toString();
+
+			certFx.removeCertificate(alias);
+
+			return new CommandResult(CommandResult.TYPE_OK, "deleted " + alias);
+
+		}
+	}
+}

+ 120 - 0
OpenAS2Server/src/main/java/org/openas2/app/cert/ImportCertCommand.java

@@ -0,0 +1,120 @@
+package org.openas2.app.cert;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.Key;
+import java.security.KeyStore;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Enumeration;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.WrappedException;
+import org.openas2.cert.AliasedCertificateFactory;
+import org.openas2.cmd.CommandResult;
+import org.openas2.util.AS2Util;
+
+public class ImportCertCommand extends AliasedCertCommand {
+	public String getDefaultDescription() {
+		return "Import a certificate into the current certificate store";
+	}
+
+	public String getDefaultName() {
+		return "import";
+	}
+
+	public String getDefaultUsage() {
+		return "import <alias> <filename> [<password>]";
+	}
+
+	public CommandResult execute(AliasedCertificateFactory certFx,
+			Object[] params) throws OpenAS2Exception {
+		if (params.length < 2) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (certFx) {
+			String alias = params[0].toString();
+			String filename = params[1].toString();
+			String password = null;
+
+			if (params.length > 2) {
+				password = params[2].toString();
+			}
+
+			try {
+				if (filename.endsWith(".p12")) {
+					if (password == null) {
+						return new CommandResult(
+								CommandResult.TYPE_INVALID_PARAM_COUNT,
+								getUsage()
+										+ " (Password is required for p12 files)");
+					}
+
+					return importPrivateKey(certFx, alias, filename, password);
+				}
+				return importCert(certFx, alias, filename);
+			} catch (Exception e) {
+				throw new WrappedException(e);
+			}
+		}
+	}
+
+	protected CommandResult importCert(AliasedCertificateFactory certFx,
+			String alias, String filename) throws IOException,
+			CertificateException, OpenAS2Exception {
+		FileInputStream fis = new FileInputStream(filename);
+		BufferedInputStream bis = new BufferedInputStream(fis);
+
+		java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory
+				.getInstance("X.509");
+
+		CommandResult cmdRes = new CommandResult(CommandResult.TYPE_OK,
+				"Certificate(s) imported successfully");
+
+		while (bis.available() > 0) {
+			Certificate cert = cf.generateCertificate(bis);
+
+			if (cert instanceof X509Certificate) {
+				certFx.addCertificate(alias, (X509Certificate) cert, true);
+				cmdRes.getResults().add(
+						"Imported certificate: " + cert.toString());
+
+				return cmdRes;
+			}
+		}
+
+		return new CommandResult(CommandResult.TYPE_ERROR,
+				"No valid X509 certificates found");
+	}
+
+	protected CommandResult importPrivateKey(AliasedCertificateFactory certFx,
+			String alias, String filename, String password) throws Exception {
+		KeyStore ks = AS2Util.getCryptoHelper().getKeyStore();
+		ks.load(new FileInputStream(filename), password.toCharArray());
+
+		Enumeration<String> aliases = ks.aliases();
+
+		while (aliases.hasMoreElements()) {
+			String certAlias = aliases.nextElement().toString();
+			Certificate cert = ks.getCertificate(certAlias);
+
+			if (cert instanceof X509Certificate) {
+				certFx.addCertificate(alias, (X509Certificate) cert, true);
+
+				Key certKey = ks.getKey(certAlias, password.toCharArray());
+				certFx.addPrivateKey(alias, certKey, password);
+
+				return new CommandResult(CommandResult.TYPE_OK,
+						"Imported certificate and key: " + cert.toString());
+			}
+		}
+
+		return new CommandResult(CommandResult.TYPE_ERROR,
+				"No valid X509 certificates found");
+
+	}
+}

+ 73 - 0
OpenAS2Server/src/main/java/org/openas2/app/cert/ImportCertInEncodedStreamCommand.java

@@ -0,0 +1,73 @@
+package org.openas2.app.cert;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.WrappedException;
+import org.openas2.cert.AliasedCertificateFactory;
+import org.openas2.cmd.CommandResult;
+import org.openas2.util.ByteCoder;
+
+public class ImportCertInEncodedStreamCommand extends AliasedCertCommand {
+	public String getDefaultDescription() {
+		return "Import a certificate into the current certificate store using an encoded byte stream";
+	}
+
+	public String getDefaultName() {
+		return "importbystream";
+	}
+
+	public String getDefaultUsage() {
+		return "importbybstream <alias> <encodedCertificateStream>";
+	}
+
+	public CommandResult execute(AliasedCertificateFactory certFx,
+			Object[] params) throws OpenAS2Exception {
+		if (params.length != 2) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (certFx) {
+			try {
+				return importCert(certFx, params[0].toString(), params[1].toString());
+			} catch (Exception e) {
+				throw new WrappedException(e);
+			}
+		}
+	}
+
+	protected CommandResult importCert(AliasedCertificateFactory certFx,
+			String alias, String encodedCert) throws IOException,
+			CertificateException, OpenAS2Exception {
+		
+		ByteArrayInputStream bais = new ByteArrayInputStream(ByteCoder.decode(encodedCert).getBytes());
+		
+		java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory
+				.getInstance("X.509");
+
+		CommandResult cmdRes = new CommandResult(CommandResult.TYPE_OK,
+				"Certificate(s) imported successfully");
+
+		while (bais.available() > 0) {
+			Certificate cert = cf.generateCertificate(bais);
+
+			if (cert instanceof X509Certificate) {
+				certFx.addCertificate(alias, (X509Certificate) cert, true);
+				cmdRes.getResults().add(
+						"Imported certificate: " + cert.toString());
+
+				return cmdRes;
+			}
+		}
+
+		return new CommandResult(CommandResult.TYPE_ERROR,
+				"No valid X509 certificates found");
+	}
+
+
+}

+ 45 - 0
OpenAS2Server/src/main/java/org/openas2/app/cert/ListCertCommand.java

@@ -0,0 +1,45 @@
+package org.openas2.app.cert;
+
+import java.security.cert.X509Certificate;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cert.AliasedCertificateFactory;
+import org.openas2.cmd.CommandResult;
+
+public class ListCertCommand extends AliasedCertCommand {
+	public String getDefaultDescription() {
+		return "List all certificate aliases in the current certificate store";
+	}
+
+	public String getDefaultName() {
+		return "list";
+	}
+
+	public String getDefaultUsage() {
+		return "list";
+	}
+
+	public CommandResult execute(AliasedCertificateFactory certFx,
+			Object[] params) throws OpenAS2Exception {
+		synchronized (certFx) {
+			Map<String, X509Certificate> certs = certFx.getCertificates();
+			Iterator<Map.Entry<String,X509Certificate>> certIt = certs.entrySet().iterator();
+			Map.Entry<String,X509Certificate> currentCert;
+			CommandResult cmdRes = new CommandResult(CommandResult.TYPE_OK);
+
+			while (certIt.hasNext()) {
+				currentCert = certIt.next();
+				cmdRes.getResults().add(currentCert.getKey().toString());
+			}
+
+			if (cmdRes.getResults().size() == 0) {
+				cmdRes.getResults().add("No certificates available");
+			}
+
+			return cmdRes;
+
+		}
+	}
+}

+ 44 - 0
OpenAS2Server/src/main/java/org/openas2/app/cert/ViewCertCommand.java

@@ -0,0 +1,44 @@
+package org.openas2.app.cert;
+
+import java.security.cert.Certificate;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cert.AliasedCertificateFactory;
+import org.openas2.cmd.CommandResult;
+
+/**
+ * view certs by alias
+ *
+ * @author Don Hillsberry
+ */
+public class ViewCertCommand extends AliasedCertCommand {
+	public String getDefaultDescription() {
+		return "View the certificate associated with an alias.";
+	}
+
+	public String getDefaultName() {
+		return "view";
+	}
+
+	public String getDefaultUsage() {
+		return "view <alias>";
+	}
+
+	protected CommandResult execute(AliasedCertificateFactory certFx,
+			Object[] params) throws OpenAS2Exception {
+		if (params.length < 1) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (certFx) {
+
+			String alias = params[0].toString();
+
+			Certificate cert = certFx.getCertificate(alias);
+
+			return new CommandResult(CommandResult.TYPE_OK, cert.toString());
+
+		}
+	}
+}

+ 82 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/AddPartnerCommand.java

@@ -0,0 +1,82 @@
+package org.openas2.app.partner;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.PartnershipFactory;
+import org.openas2.partner.XMLPartnershipFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * adds a new partner entry in partnership store
+ * 
+ * @author joseph mcverry
+ * 
+ */
+public class AddPartnerCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "Add a new partner to partnership store.";
+	}
+
+	public String getDefaultName() {
+		return "add";
+	}
+
+	public String getDefaultUsage() {
+		return "add name <attribute 1=value 1> <attribute 2=value 2> ... <attribute n=value n>";
+	}
+
+	public CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+		if (params.length < 1) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (partFx) {
+
+			DocumentBuilder db = null;
+			try {
+				db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			} catch (ParserConfigurationException e) {
+				throw new OpenAS2Exception(e);
+			} catch (FactoryConfigurationError e) {
+				throw new OpenAS2Exception(e);
+			}
+
+			Document doc = db.newDocument();
+
+			Element root = doc.createElement("partner");
+			doc.appendChild(root);
+
+			for (int i = 0; i < params.length; i++) {
+				String param = (String) params[i];
+				int pos = param.indexOf('=');
+				if (i == 0) {
+					root.setAttribute("name", param);
+				} else if (pos == 0) {
+					return new CommandResult(CommandResult.TYPE_ERROR,
+							"incoming parameter missing name");
+				} else if (pos > 0) {
+					root.setAttribute(param.substring(0, pos), param
+							.substring(pos + 1));
+
+				} else
+					return new CommandResult(CommandResult.TYPE_ERROR,
+							"incoming parameter missing value");
+
+			}
+
+			((XMLPartnershipFactory) partFx).loadPartner(partFx.getPartners(),
+					root);
+
+			return new CommandResult(CommandResult.TYPE_OK);
+		}
+
+	}
+}

+ 90 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/AddPartnershipCommand.java

@@ -0,0 +1,90 @@
+package org.openas2.app.partner;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.PartnershipFactory;
+import org.openas2.partner.XMLPartnershipFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/** adds a new partnership entry in partneship store
+ * 
+ * @author joseph mcverry
+ *
+ */
+public class AddPartnershipCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "Add a new partnership definition to partnership store.";
+	}
+
+	public String getDefaultName() {
+		return "add";
+	}
+
+	public String getDefaultUsage() {
+		return "add name senderId receiverId <attribute 1=value 1> <attribute 2=value 2> ... <attribute n=value n>";
+	}
+
+	public CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+		if (params.length < 3) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (partFx) {
+
+			DocumentBuilder db = null;
+			try {
+				db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+			} catch (ParserConfigurationException e) {
+				throw new OpenAS2Exception(e);
+			} catch (FactoryConfigurationError e) {
+				throw new OpenAS2Exception(e);
+			}
+
+			Document doc = db.newDocument();
+
+			Element root = doc.createElement("partnership");
+			doc.appendChild(root);
+
+			for (int i = 0; i < params.length; i++) {
+				String param = (String) params[i];
+				int pos = param.indexOf('=');
+				if (i == 0) {
+					root.setAttribute("name", param);
+				} else if (i == 1) {
+					Element elem = doc.createElement("sender");
+					elem.setAttribute("name", param);
+					root.appendChild(elem);
+				} else if (i == 2) {
+					Element elem = doc.createElement("receiver");
+					elem.setAttribute("name", param);
+					root.appendChild(elem);
+				} else if (pos == 0) {
+					return new CommandResult(CommandResult.TYPE_ERROR,
+							"incoming parameter missing name");
+				} else if (pos > 0) {
+					Element elem = doc.createElement("attribute");
+					elem.setAttribute("name", param.substring(0, pos));
+					elem.setAttribute("value", param.substring(pos + 1));
+					root.appendChild(elem);
+
+				} else
+					return new CommandResult(CommandResult.TYPE_ERROR,
+							"incoming parameter missing value");
+
+			}
+
+			((XMLPartnershipFactory) partFx).loadPartnership(partFx
+					.getPartners(), partFx.getPartnerships(), root);
+
+			return new CommandResult(CommandResult.TYPE_OK);
+		}
+	}
+}

+ 30 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/AliasedPartnershipsCommand.java

@@ -0,0 +1,30 @@
+package org.openas2.app.partner;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.BaseCommand;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.PartnershipFactory;
+
+public abstract class AliasedPartnershipsCommand extends BaseCommand {
+
+	public CommandResult execute(Object[] params) {
+
+		try {
+			PartnershipFactory partFx = getSession().getPartnershipFactory();
+
+			if (partFx instanceof PartnershipFactory) {
+				return execute((PartnershipFactory) partFx, params);
+			}
+			return new CommandResult(CommandResult.TYPE_COMMAND_NOT_SUPPORTED,
+					"Not supported by current partnership store");
+		} catch (OpenAS2Exception oae) {
+			oae.terminate();
+
+			return new CommandResult(oae);
+		}
+	}
+
+	protected abstract CommandResult execute(PartnershipFactory partFx,
+			Object[] params) throws OpenAS2Exception;
+
+}

+ 71 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/DeletePartnerCommand.java

@@ -0,0 +1,71 @@
+package org.openas2.app.partner;
+
+import java.util.Iterator;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.Partnership;
+import org.openas2.partner.PartnershipFactory;
+
+/** removes a partner entry in partnership store
+ * 
+ * @author joseph mcverry
+ *
+ */
+public class DeletePartnerCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "Delete the partnership associated with an name.";
+	}
+
+	public String getDefaultName() {
+		return "delete";
+	}
+
+	public String getDefaultUsage() {
+		return "delete <name>";
+	}
+
+	public CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+		if (params.length < 1) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (partFx) {
+
+			String name = params[0].toString();
+			Iterator<String> parts = partFx.getPartners().keySet().iterator();
+
+			boolean found = false;
+
+			while (parts.hasNext()) {
+				String partName = parts.next().toString();
+				if (partName.equals(name)) {
+					found = true;
+				}
+			}
+
+			if (found == false)
+				return new CommandResult(CommandResult.TYPE_ERROR,
+						"Unknown partner name");
+
+			Iterator<Partnership> partnerships = partFx.getPartnerships().iterator();
+			boolean partnershipFound = false;
+			while (partnerships.hasNext() && partnershipFound == false) {
+				Partnership part = (Partnership) partnerships.next();
+				partnershipFound = part.getReceiverIDs().containsValue(name)
+						|| part.getSenderIDs().containsValue(name);
+			}
+
+			if (partnershipFound) {
+				return new CommandResult(CommandResult.TYPE_ERROR,
+						"Can not delete partner; it is tied to some partnerships");
+			}
+
+			partFx.getPartners().remove(name);
+
+			return new CommandResult(CommandResult.TYPE_OK);
+		}
+	}
+}

+ 53 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/DeletePartnershipCommand.java

@@ -0,0 +1,53 @@
+package org.openas2.app.partner;
+
+import java.util.Iterator;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.Partnership;
+import org.openas2.partner.PartnershipFactory;
+
+/** removes a partnership entry in partnership store
+ * 
+ * @author joseph mcverry
+ *
+ */
+public class DeletePartnershipCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "Delete the partnership associated with an name.";
+	}
+
+	public String getDefaultName() {
+		return "delete";
+	}
+
+	public String getDefaultUsage() {
+		return "delete <name>";
+	}
+
+	public CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+		if (params.length < 1) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (partFx) {
+
+			String name = params[0].toString();
+			Iterator<Partnership> parts = partFx.getPartnerships().iterator();
+
+			while (parts.hasNext()) {
+				Partnership part = (Partnership) parts.next();
+				if (part.getName().equals(name)) {
+					partFx.getPartnerships().remove(part);
+					return new CommandResult(CommandResult.TYPE_OK, "deleted "
+							+ name);
+				}
+			}
+
+			return new CommandResult(CommandResult.TYPE_ERROR,
+					"Unknown partnership name");
+		}
+	}
+}

+ 50 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/ListPartnersCommand.java

@@ -0,0 +1,50 @@
+package org.openas2.app.partner;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.PartnershipFactory;
+
+/**
+ * list partner entries in partnership store
+ * 
+ * @author joseph mcverry
+ * 
+ */
+public class ListPartnersCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "List all partners in the current partnership store";
+	}
+
+	public String getDefaultName() {
+		return "list";
+	}
+
+	public String getDefaultUsage() {
+		return "list";
+	}
+
+	public CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+
+		synchronized (partFx) {
+
+			Map<String, Object> partners = partFx.getPartners();
+			Iterator<String> partIt = partners.keySet().iterator();
+
+			CommandResult cmdRes = new CommandResult(CommandResult.TYPE_OK);
+
+			while (partIt.hasNext()) {
+				cmdRes.getResults().add(partIt.next().toString());
+			}
+
+			if (cmdRes.getResults().size() == 0) {
+				cmdRes.getResults().add("No partner definitions available");
+			}
+
+			return cmdRes;
+		}
+	}
+}

+ 51 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/ListPartnershipsCommand.java

@@ -0,0 +1,51 @@
+package org.openas2.app.partner;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.Partnership;
+import org.openas2.partner.PartnershipFactory;
+
+/**
+ * list partnerships in partnership store by names
+ * 
+ * @author joseph mcverry
+ * 
+ */
+public class ListPartnershipsCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "List all partnerships in the current partnership store";
+	}
+
+	public String getDefaultName() {
+		return "list";
+	}
+
+	public String getDefaultUsage() {
+		return "list";
+	}
+
+	public CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+		synchronized (partFx) {
+
+			List<Partnership> parts = partFx.getPartnerships();
+			Iterator<Partnership> partIt = parts.iterator();
+
+			CommandResult cmdRes = new CommandResult(CommandResult.TYPE_OK);
+
+			while (partIt.hasNext()) {
+				Partnership part = partIt.next();
+				cmdRes.getResults().add(part.getName());
+			}
+
+			if (cmdRes.getResults().size() == 0) {
+				cmdRes.getResults().add("No partnerships available");
+			}
+
+			return cmdRes;
+		}
+	}
+}

+ 50 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/RefreshPartnershipsCommand.java

@@ -0,0 +1,50 @@
+package org.openas2.app.partner;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.BaseCommand;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.PartnershipFactory;
+import org.openas2.partner.RefreshablePartnershipFactory;
+
+/**
+ * reloads the partnership store
+ * 
+ *
+ */
+public class RefreshPartnershipsCommand extends BaseCommand {
+	public String getDefaultDescription() {
+		return "Refresh the current partnerships from storage";
+	}
+
+	public String getDefaultName() {
+		return "refresh";
+	}
+
+	public String getDefaultUsage() {
+		return "refresh";
+	}
+
+	public CommandResult execute(Object[] params) {
+		try {
+			PartnershipFactory partnerFx = getSession().getPartnershipFactory();
+
+			synchronized (partnerFx) {
+
+				if (partnerFx instanceof RefreshablePartnershipFactory) {
+					((RefreshablePartnershipFactory) partnerFx).refresh();
+
+					return new CommandResult(CommandResult.TYPE_OK,
+							"Refreshed partnerships");
+				}
+				return new CommandResult(
+						CommandResult.TYPE_COMMAND_NOT_SUPPORTED,
+						"Not supported by current certificate store");
+			}
+
+		} catch (OpenAS2Exception oae) {
+			oae.terminate();
+
+			return new CommandResult(oae);
+		}
+	}
+}

+ 49 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/StorePartnershipsCommand.java

@@ -0,0 +1,49 @@
+package org.openas2.app.partner;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.BaseCommand;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.PartnershipFactory;
+import org.openas2.partner.XMLPartnershipFactory;
+
+/**
+ * replaces the partnership store, backs up the original store
+ * @author joseph mcverry
+ *
+ */
+public class StorePartnershipsCommand extends BaseCommand {
+	public String getDefaultDescription() {
+		return "Stores the current partnerships in storage";
+	}
+
+	public String getDefaultName() {
+		return "store";
+	}
+
+	public String getDefaultUsage() {
+		return "store";
+	}
+
+	public CommandResult execute(Object[] params) {
+
+		try {
+			PartnershipFactory partnerFx = getSession().getPartnershipFactory();
+			synchronized (getSession().getPartnershipFactory()) {
+
+				if (partnerFx instanceof XMLPartnershipFactory) {
+					((XMLPartnershipFactory) partnerFx).storePartnership();
+
+					return new CommandResult(CommandResult.TYPE_OK,
+							"Stored partnerships");
+				}
+				return new CommandResult(
+						CommandResult.TYPE_COMMAND_NOT_SUPPORTED,
+						"Not supported by current partnership store, must be XML");
+			}
+		} catch (OpenAS2Exception oae) {
+			oae.terminate();
+
+			return new CommandResult(oae);
+		}
+	}
+}

+ 53 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/ViewPartnerCommand.java

@@ -0,0 +1,53 @@
+package org.openas2.app.partner;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.PartnershipFactory;
+
+/**
+ * view the partner entries in the partnership store
+ * 
+ * @author Joe McVerry
+ */
+public class ViewPartnerCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "View the partner entry in the partnership store.";
+	}
+
+	public String getDefaultName() {
+		return "view";
+	}
+
+	public String getDefaultUsage() {
+		return "view <name>";
+	}
+
+	protected CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+		if (params.length < 1) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+		synchronized (partFx) {
+
+			String name = params[0].toString();
+
+			Iterator<String> parts = partFx.getPartners().keySet().iterator();
+
+			while (parts.hasNext()) {
+				String partName = parts.next().toString();
+				if (partName.equals(name)) {
+					Map<Object, Object> partDefs = (Map<Object, Object>) partFx.getPartners().get(name);
+					String out = name + "\n" + partDefs.toString();
+					return new CommandResult(CommandResult.TYPE_OK, out);
+				}
+			}
+
+			return new CommandResult(CommandResult.TYPE_ERROR,
+					"Unknown partner name");
+		}
+	}
+}

+ 53 - 0
OpenAS2Server/src/main/java/org/openas2/app/partner/ViewPartnershipCommand.java

@@ -0,0 +1,53 @@
+package org.openas2.app.partner;
+
+import java.util.Iterator;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.cmd.CommandResult;
+import org.openas2.partner.Partnership;
+import org.openas2.partner.PartnershipFactory;
+
+/**
+ * view the partnership in the partnership stores
+ * 
+ * @author Don Hillsberry
+ */
+public class ViewPartnershipCommand extends AliasedPartnershipsCommand {
+	public String getDefaultDescription() {
+		return "View the partnership entry in partnership store.";
+	}
+
+	public String getDefaultName() {
+		return "view";
+	}
+
+	public String getDefaultUsage() {
+		return "view <name>";
+	}
+
+	protected CommandResult execute(PartnershipFactory partFx, Object[] params)
+			throws OpenAS2Exception {
+		if (params.length < 1) {
+			return new CommandResult(CommandResult.TYPE_INVALID_PARAM_COUNT,
+					getUsage());
+		}
+
+		synchronized (partFx) {
+
+			String name = params[0].toString();
+
+			Iterator<Partnership> parts = partFx.getPartnerships().iterator();
+
+			while (parts.hasNext()) {
+				Partnership part = (Partnership) parts.next();
+				if (part.getName().equals(name))
+					return new CommandResult(CommandResult.TYPE_OK, part
+							.toString());
+			}
+
+			return new CommandResult(CommandResult.TYPE_ERROR,
+					"Unknown partnership name");
+		}
+
+	}
+}

+ 28 - 0
OpenAS2Server/src/main/java/org/openas2/cert/AliasedCertificateFactory.java

@@ -0,0 +1,28 @@
+package org.openas2.cert;
+
+import java.security.Key;
+import java.security.cert.X509Certificate;
+import java.util.Map;
+
+import org.openas2.OpenAS2Exception;
+
+
+public interface AliasedCertificateFactory extends CertificateFactory {
+    public X509Certificate getCertificate(String alias)
+        throws OpenAS2Exception;
+
+    public Map<String,X509Certificate> getCertificates() throws OpenAS2Exception;
+
+    public void addCertificate(String alias, X509Certificate cert, boolean overwrite)
+        throws OpenAS2Exception;
+
+    public void addPrivateKey(String alias, Key key, String password)
+        throws OpenAS2Exception;
+
+    public void clearCertificates() throws OpenAS2Exception;
+
+    public void removeCertificate(X509Certificate cert)
+        throws OpenAS2Exception;
+
+    public void removeCertificate(String alias) throws OpenAS2Exception;
+}

+ 7 - 0
OpenAS2Server/src/main/java/org/openas2/cert/BaseCertificateFactory.java

@@ -0,0 +1,7 @@
+package org.openas2.cert;
+
+import org.openas2.BaseComponent;
+
+public abstract class BaseCertificateFactory extends BaseComponent implements CertificateFactory {
+	
+}

+ 14 - 0
OpenAS2Server/src/main/java/org/openas2/cert/CertificateExistsException.java

@@ -0,0 +1,14 @@
+package org.openas2.cert;
+
+import org.openas2.OpenAS2Exception;
+
+public class CertificateExistsException extends OpenAS2Exception {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public CertificateExistsException(String alias) {
+		super(alias);
+	}
+}

+ 18 - 0
OpenAS2Server/src/main/java/org/openas2/cert/CertificateFactory.java

@@ -0,0 +1,18 @@
+package org.openas2.cert;
+
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+
+import org.openas2.Component;
+import org.openas2.OpenAS2Exception;
+import org.openas2.message.Message;
+import org.openas2.message.MessageMDN;
+
+public interface CertificateFactory extends Component {
+	public static final String COMPID_CERTIFICATE_FACTORY = "certificatefactory";
+	
+	public X509Certificate getCertificate(Message msg, String partnershipType) throws OpenAS2Exception;
+	public PrivateKey getPrivateKey(Message msg, X509Certificate cert) throws OpenAS2Exception;
+	public X509Certificate getCertificate(MessageMDN msg, String partnershipType) throws OpenAS2Exception;
+	public PrivateKey getPrivateKey(MessageMDN msg, X509Certificate cert) throws OpenAS2Exception;
+}

+ 41 - 0
OpenAS2Server/src/main/java/org/openas2/cert/CertificateNotFoundException.java

@@ -0,0 +1,41 @@
+package org.openas2.cert;
+
+import java.security.cert.X509Certificate;
+
+import org.openas2.OpenAS2Exception;
+
+
+public class CertificateNotFoundException extends OpenAS2Exception {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	private String alias;
+    private String partnershipType;
+
+    public CertificateNotFoundException(String partnershipType, String alias) {
+        super("Type: " + partnershipType + ", Alias: " + alias);
+        this.partnershipType = partnershipType;
+        this.alias = alias;
+    }
+
+    public CertificateNotFoundException(X509Certificate cert) {
+        super("Certificate not in store: " + cert.toString());
+    }
+
+    public void setAlias(String string) {
+        alias = string;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setPartnershipType(String string) {
+        partnershipType = string;
+    }
+
+    public String getPartnershipType() {
+        return partnershipType;
+    }
+}

+ 22 - 0
OpenAS2Server/src/main/java/org/openas2/cert/KeyNotFoundException.java

@@ -0,0 +1,22 @@
+package org.openas2.cert;
+
+import java.security.cert.X509Certificate;
+
+import org.openas2.OpenAS2Exception;
+
+public class KeyNotFoundException extends OpenAS2Exception {
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public KeyNotFoundException(X509Certificate cert, String alias) {
+		super("Certificate: " + cert + ", Alias: " + alias);
+	}
+	
+	public KeyNotFoundException(X509Certificate cert, String alias, Throwable cause) {
+		super("Certificate: " + cert + ", Alias: " + alias);
+		initCause(cause);
+	}
+}

+ 10 - 0
OpenAS2Server/src/main/java/org/openas2/cert/KeyStoreCertificateFactory.java

@@ -0,0 +1,10 @@
+package org.openas2.cert;
+
+import java.security.KeyStore;
+
+public interface KeyStoreCertificateFactory extends CertificateFactory {
+
+    public void setKeyStore(KeyStore keyStore);
+    public KeyStore getKeyStore();
+
+}

+ 377 - 0
OpenAS2Server/src/main/java/org/openas2/cert/PKCS12CertificateFactory.java

@@ -0,0 +1,377 @@
+package org.openas2.cert;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.GeneralSecurityException;
+import java.security.Key;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.security.cert.X509Certificate;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openas2.OpenAS2Exception;
+import org.openas2.Session;
+import org.openas2.WrappedException;
+import org.openas2.message.Message;
+import org.openas2.message.MessageMDN;
+import org.openas2.params.InvalidParameterException;
+import org.openas2.partner.Partnership;
+import org.openas2.partner.SecurePartnership;
+import org.openas2.util.AS2Util;
+import org.openas2.util.FileMonitor;
+import org.openas2.util.FileMonitorListener;
+
+public class PKCS12CertificateFactory extends BaseCertificateFactory implements
+        AliasedCertificateFactory, KeyStoreCertificateFactory, StorableCertificateFactory,
+        FileMonitorListener {
+    public static final String PARAM_FILENAME = "filename";
+    public static final String PARAM_PASSWORD = "password";
+    public static final String PARAM_INTERVAL = "interval";
+    private FileMonitor fileMonitor;
+    private KeyStore keyStore;
+
+	private Log logger = LogFactory.getLog(PKCS12CertificateFactory.class.getSimpleName());
+    
+    public String getAlias(Partnership partnership, String partnershipType) throws OpenAS2Exception {
+        String alias = null;
+
+        if (partnershipType == Partnership.PTYPE_RECEIVER) {
+            alias = partnership.getReceiverID(SecurePartnership.PID_X509_ALIAS);
+        } else if (partnershipType == Partnership.PTYPE_SENDER) {
+            alias = partnership.getSenderID(SecurePartnership.PID_X509_ALIAS);
+        }
+
+        if (alias == null) {
+            throw new CertificateNotFoundException(partnershipType, null);
+        }
+
+        return alias;
+    }
+
+    public X509Certificate getCertificate(String alias) throws OpenAS2Exception {
+        try {
+            KeyStore ks = getKeyStore();
+            X509Certificate cert = (X509Certificate) ks.getCertificate(alias);
+
+            if (cert == null) {
+                throw new CertificateNotFoundException(null, alias);
+            }
+
+            return cert;
+        } catch (KeyStoreException kse) {
+            throw new WrappedException(kse);
+        }
+    }
+
+    public X509Certificate getCertificate(Message msg, String partnershipType)
+            throws OpenAS2Exception {
+        try {
+            return getCertificate(getAlias(msg.getPartnership(), partnershipType));
+        } catch (CertificateNotFoundException cnfe) {
+            cnfe.setPartnershipType(partnershipType);
+            throw cnfe;
+        }
+    }
+
+    public X509Certificate getCertificate(MessageMDN mdn, String partnershipType)
+            throws OpenAS2Exception {
+        try {
+            return getCertificate(getAlias(mdn.getPartnership(), partnershipType));
+        } catch (CertificateNotFoundException cnfe) {
+            cnfe.setPartnershipType(partnershipType);
+            throw cnfe;
+        }
+    }
+
+    public Map<String,X509Certificate> getCertificates() throws OpenAS2Exception {
+        KeyStore ks = getKeyStore();
+
+        try {
+            Map<String,X509Certificate> certs = new HashMap<String,X509Certificate>();
+            String certAlias;
+
+            Enumeration<String> e = ks.aliases();
+
+            while (e.hasMoreElements()) {
+                certAlias = (String) e.nextElement();
+                certs.put(certAlias, (X509Certificate) ks.getCertificate(certAlias));
+            }
+
+            return certs;
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+
+    public void setFileMonitor(FileMonitor fileMonitor) {
+        this.fileMonitor = fileMonitor;
+    }
+
+    public FileMonitor getFileMonitor() throws InvalidParameterException {
+        boolean createMonitor = ((fileMonitor == null) && (getParameter(PARAM_INTERVAL, false) != null));
+
+        if (!createMonitor && fileMonitor != null) {
+            String filename = fileMonitor.getFilename();
+            createMonitor = ((filename != null) && !filename.equals(getFilename()));
+        }
+
+        if (createMonitor) {
+            if (fileMonitor != null) {
+                fileMonitor.stop();
+            }
+
+            int interval = getParameterInt(PARAM_INTERVAL, true);
+            File file = new File(getFilename());
+            fileMonitor = new FileMonitor(file, interval);
+            fileMonitor.addListener(this);
+        }
+
+        return fileMonitor;
+    }
+
+    public void setFilename(String filename) {
+        getParameters().put(PARAM_FILENAME, filename);
+    }
+
+    public String getFilename() throws InvalidParameterException {
+        return getParameter(PARAM_FILENAME, true);
+    }
+
+    public void setKeyStore(KeyStore keyStore) {
+        this.keyStore = keyStore;
+    }
+
+    public KeyStore getKeyStore() {
+        return keyStore;
+    }
+
+    public void setPassword(char[] password) {
+        getParameters().put(PARAM_PASSWORD, new String(password));
+    }
+
+    public char[] getPassword() throws InvalidParameterException {
+        return getParameter(PARAM_PASSWORD, true).toCharArray();
+    }
+
+    public PrivateKey getPrivateKey(X509Certificate cert) throws OpenAS2Exception {
+        KeyStore ks = getKeyStore();
+        String alias = null;
+
+        try {
+            alias = ks.getCertificateAlias(cert);
+
+            if (alias == null) {
+                throw new KeyNotFoundException(cert, "-- alias null from getCertificateAlias(cert) call");
+            }
+
+            PrivateKey key = (PrivateKey) ks.getKey(alias, getPassword());
+
+            if (key == null) {
+                throw new KeyNotFoundException(cert, "-- key null from getKey(" + alias + ") call");
+            }
+
+            return key;
+        } catch (GeneralSecurityException e) {
+            throw new KeyNotFoundException(cert, alias, e);
+        }
+    }
+
+    public PrivateKey getPrivateKey(Message msg, X509Certificate cert) throws OpenAS2Exception {
+        return getPrivateKey(cert);
+    }
+
+    public PrivateKey getPrivateKey(MessageMDN mdn, X509Certificate cert) throws OpenAS2Exception {
+        return getPrivateKey(cert);
+    }
+
+    public void addCertificate(String alias, X509Certificate cert, boolean overwrite)
+            throws OpenAS2Exception {
+        KeyStore ks = getKeyStore();
+
+        try {
+            if (ks.containsAlias(alias) && !overwrite) {
+                throw new CertificateExistsException(alias);
+            }
+
+            ks.setCertificateEntry(alias, cert);
+            save(getFilename(), getPassword());
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+
+    public void addPrivateKey(String alias, Key key, String password) throws OpenAS2Exception {
+        KeyStore ks = getKeyStore();
+
+        try {
+            if (!ks.containsAlias(alias)) {
+                throw new CertificateNotFoundException(null, alias);
+            }
+
+            Certificate[] certChain = ks.getCertificateChain(alias);
+            if (certChain == null)
+            {
+            	X509Certificate x509cert = (X509Certificate)ks.getCertificate(alias);
+            	if (x509cert.getSubjectDN().equals(x509cert.getIssuerDN()))
+                {
+                     // Trust chain is to itself
+                    certChain = new X509Certificate[] { x509cert, x509cert };
+                    if (logger.isInfoEnabled()) logger.info("Detected self-signed certificate and allowed import. Alias: " + alias);
+                }
+            }
+            ks.setKeyEntry(alias, key, password.toCharArray(), certChain);
+
+            save(getFilename(), getPassword());
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+
+    public void clearCertificates() throws OpenAS2Exception {
+        KeyStore ks = getKeyStore();
+
+        try {
+            Enumeration<String> aliases = ks.aliases();
+
+            while (aliases.hasMoreElements()) {
+                ks.deleteEntry((String) aliases.nextElement());
+            }
+
+            save(getFilename(), getPassword());
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+
+    public void handle(FileMonitor monitor, File file, int eventID) {
+        switch (eventID) {
+        case FileMonitorListener.EVENT_MODIFIED:
+
+            try {
+                load();
+                logger.info("- Certificates Reloaded -");
+            } catch (OpenAS2Exception oae) {
+                oae.terminate();
+            }
+
+            break;
+        }
+    }
+
+    public void init(Session session, Map<String, String> options) throws OpenAS2Exception {
+        super.init(session, options);
+        
+        // Override the password if it was passed as a system property
+        String pwd = System.getProperty("org.openas2.cert.Password");
+        if (pwd != null)
+        {
+        	setPassword(pwd.toCharArray());
+        }
+        try {
+            this.keyStore = AS2Util.getCryptoHelper().getKeyStore();
+        } catch (Exception e) {
+            throw new WrappedException(e);
+        }
+
+        load(getFilename(), getPassword());
+    }
+
+    public void load(String filename, char[] password) throws OpenAS2Exception {
+        try {
+            FileInputStream fIn = new FileInputStream(filename);
+
+            load(fIn, password);
+
+            fIn.close();
+        } catch (IOException ioe) {
+            throw new WrappedException(ioe);
+        }
+    }
+
+    public void load(InputStream in, char[] password) throws OpenAS2Exception {
+        try {
+            KeyStore ks = getKeyStore();
+
+            synchronized (ks) {
+                ks.load(in, password);
+            }
+
+            getFileMonitor();
+        } catch (IOException ioe) {
+            throw new WrappedException(ioe);
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+
+    public void load() throws OpenAS2Exception {
+        load(getFilename(), getPassword());
+    }
+
+    public void removeCertificate(X509Certificate cert) throws OpenAS2Exception {
+        KeyStore ks = getKeyStore();
+
+        try {
+            String alias = ks.getCertificateAlias(cert);
+
+            if (alias == null) {
+                throw new CertificateNotFoundException(cert);
+            }
+
+            removeCertificate(alias);
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+
+    public void removeCertificate(String alias) throws OpenAS2Exception {
+        KeyStore ks = getKeyStore();
+
+        try {
+            if (ks.getCertificate(alias) == null) {
+                throw new CertificateNotFoundException(null, alias);
+            }
+
+            ks.deleteEntry(alias);
+            save(getFilename(), getPassword());
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+
+    public void save() throws OpenAS2Exception {
+        save(getFilename(), getPassword());
+    }
+
+    public void save(String filename, char[] password) throws OpenAS2Exception {
+        try {
+            FileOutputStream fOut = new FileOutputStream(filename, false);
+
+            save(fOut, password);
+
+            fOut.close();
+        } catch (IOException ioe) {
+            throw new WrappedException(ioe);
+        }
+    }
+
+    public void save(OutputStream out, char[] password) throws OpenAS2Exception {
+        try {
+            getKeyStore().store(out, password);
+        } catch (IOException ioe) {
+            throw new WrappedException(ioe);
+        } catch (GeneralSecurityException gse) {
+            throw new WrappedException(gse);
+        }
+    }
+}

+ 32 - 0
OpenAS2Server/src/main/java/org/openas2/cert/StorableCertificateFactory.java

@@ -0,0 +1,32 @@
+package org.openas2.cert;
+
+
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.openas2.OpenAS2Exception;
+import org.openas2.params.InvalidParameterException;
+
+
+
+public interface StorableCertificateFactory extends CertificateFactory {
+    public void setFilename(String filename);
+
+    public String getFilename() throws InvalidParameterException;
+
+    public void setPassword(char[] password);
+
+    public char[] getPassword() throws InvalidParameterException;
+
+    public void load() throws OpenAS2Exception;
+
+    public void load(String filename, char[] password) throws OpenAS2Exception;
+
+    public void load(InputStream in, char[] password) throws OpenAS2Exception;
+
+    public void save() throws OpenAS2Exception;
+
+    public void save(String filename, char[] password) throws OpenAS2Exception;
+
+    public void save(OutputStream out, char[] password) throws OpenAS2Exception;
+}

+ 70 - 0
OpenAS2Server/src/main/java/org/openas2/cmd/BaseCommand.java

@@ -0,0 +1,70 @@
+package org.openas2.cmd;
+
+import java.util.Map;
+
+import org.openas2.BaseComponent;
+import org.openas2.OpenAS2Exception;
+import org.openas2.Session;
+import org.openas2.params.InvalidParameterException;
+
+
+public abstract class BaseCommand extends BaseComponent implements Command {
+    public static final String PARAM_NAME = "name";
+    public static final String PARAM_DESCRIPTION = "description";
+    public static final String PARAM_USAGE = "usage";    
+	
+	public void init(Session session, Map<String,String> parameters) throws OpenAS2Exception {
+		super.init(session, parameters);
+		if (getName() == null) {
+			setName(getDefaultName());
+		};
+		if (getDescription() == null) {
+			setDescription(getDefaultDescription());
+		}
+		if (getUsage() == null) {
+			setUsage(getDefaultUsage());
+		}
+	}
+
+    public String getDescription() {
+        try {
+            return getParameter(PARAM_DESCRIPTION, false);
+        } catch (InvalidParameterException e) {
+            return null;
+        }
+    }
+
+    public String getName() {
+        try {
+			return getParameter(PARAM_NAME, false);
+		} catch (InvalidParameterException e) {
+			return null;
+		}
+    }
+
+    public String getUsage() {
+		try {
+			return getParameter(PARAM_USAGE, false);
+		} catch (InvalidParameterException e) {
+			return null;
+		}
+    }
+	
+	public abstract String getDefaultName();
+	public abstract String getDefaultDescription();
+	public abstract String getDefaultUsage();
+		
+    public abstract CommandResult execute(Object[] params);
+
+    public void setDescription(String desc) {
+        setParameter(PARAM_DESCRIPTION, desc);
+    }
+
+	public void setName(String name) {
+        setParameter(PARAM_NAME, name);
+    }
+
+	public void setUsage(String usage) {
+        setParameter(PARAM_USAGE, usage);
+    }
+}

+ 22 - 0
OpenAS2Server/src/main/java/org/openas2/cmd/BaseCommandRegistry.java

@@ -0,0 +1,22 @@
+package org.openas2.cmd;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openas2.BaseComponent;
+
+public class BaseCommandRegistry extends BaseComponent implements CommandRegistry {
+	private List<Command> commands;
+	    
+	public List<Command> getCommands() {
+		if (commands == null) {
+			commands = new ArrayList<Command>();
+		}
+		return commands;
+	}
+
+	public void setCommands(List<Command> commands) {
+		this.commands = commands;
+	}
+	
+}

+ 23 - 0
OpenAS2Server/src/main/java/org/openas2/cmd/Command.java

@@ -0,0 +1,23 @@
+package org.openas2.cmd;
+
+import org.openas2.Component;
+import org.openas2.Session;
+
+
+public interface Command extends Component {
+    public void setDescription(String desc);
+
+    public String getDescription();
+
+    public void setName(String name);
+
+    public String getName();
+
+    public Session getSession();
+
+    public void setUsage(String usage);
+
+    public String getUsage();
+
+    public CommandResult execute(Object[] params);
+}

+ 14 - 0
OpenAS2Server/src/main/java/org/openas2/cmd/CommandException.java

@@ -0,0 +1,14 @@
+package org.openas2.cmd;
+
+import org.openas2.OpenAS2Exception;
+
+public class CommandException extends OpenAS2Exception {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public CommandException(String msg) {
+		super(msg);
+	}
+}

+ 43 - 0
OpenAS2Server/src/main/java/org/openas2/cmd/CommandManager.java

@@ -0,0 +1,43 @@
+package org.openas2.cmd;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.openas2.cmd.processor.BaseCommandProcessor;
+
+/**
+ * command calls the registered command processors
+ * 
+ * @author joseph mcverry
+ *
+ */
+public class CommandManager {
+	private static CommandManager defaultManager;
+	private List<BaseCommandProcessor> processors;
+
+	public static CommandManager getCmdManager() {
+		if (defaultManager == null) {
+			defaultManager = new CommandManager();
+		}
+
+		return defaultManager;
+	}
+
+	public void setProcessors(List<BaseCommandProcessor> listeners) {
+		this.processors = listeners;
+	}
+
+	public List<BaseCommandProcessor> getProcessors() {
+		if (processors == null) {
+			processors = new ArrayList<BaseCommandProcessor>();
+		}
+
+		return processors;
+	}
+
+	public void addProcessor(BaseCommandProcessor processor) {
+		List<BaseCommandProcessor> processors = getProcessors();
+		processors.add(processor);
+	}
+
+}

+ 11 - 0
OpenAS2Server/src/main/java/org/openas2/cmd/CommandRegistry.java

@@ -0,0 +1,11 @@
+package org.openas2.cmd;
+
+import java.util.List;
+
+import org.openas2.Component;
+
+public interface CommandRegistry extends Component {
+
+	List<Command> getCommands();
+
+}

+ 5 - 0
OpenAS2Server/src/main/java/org/openas2/cmd/CommandRegistryFactory.java

@@ -0,0 +1,5 @@
+package org.openas2.cmd;
+
+public interface CommandRegistryFactory {
+	public CommandRegistry getCommandRegistry();
+}

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است