SSH client as tool
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 9 Jul 2022 08:30:46 +0000 (10:30 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 9 Jul 2022 08:30:46 +0000 (10:30 +0200)
17 files changed:
Makefile
org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java
suite/org.argeo.slc.tool/.settings/org.eclipse.jdt.core.prefs [new file with mode: 0644]
suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json
suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json
suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json
suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json
suite/org.argeo.slc.tool/bnd.bnd
suite/org.argeo.slc.tool/build.properties
suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java
suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java
suite/org.argeo.slc.tool/src/org/argeo/slc/tool/SshCli.java [new file with mode: 0644]
suite/org.argeo.slc.tool/src/org/argeo/slc/tool/graalvm/BouncyCastleFeature.java [new file with mode: 0644]
tp/org.argeo.tp.apache/org.apache.tomcat.jni.bnd [new file with mode: 0644]
tp/org.argeo.tp.sdk/org.graalvm.nativeimage.svm.bnd [new file with mode: 0644]
tp/org.argeo.tp/net.i2p.crypto.eddsa.bnd [new file with mode: 0644]
tp/org.argeo.tp/org.tukaani.xz.bnd

index 04638f6aa752f662d76cbcac99581fdd75553ec5..a0a17d608c460b9d6ecbf0d463e111e38424d754 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,8 @@ native-image:
        mkdir -p $(A2_OUTPUT)/libexec/$(A2_CATEGORY)
        cd $(A2_OUTPUT)/libexec/$(A2_CATEGORY) && /opt/graalvm-ce/bin/native-image \
                -cp $(A2_CLASSPATH):$(A2_BUNDLES_CLASSPATH) org.argeo.slc.tool.Main \
-               --enable-url-protocols=http,https -H:AdditionalSecurityProviders=sun.security.jgss.SunProvider \
+               --enable-url-protocols=http,https \
+               -H:AdditionalSecurityProviders=sun.security.jgss.SunProvider,org.bouncycastle.jce.provider.BouncyCastleProvider,net.i2p.crypto.eddsa.EdDSASecurityProvider \
                --initialize-at-build-time=org.argeo.init.logging.ThinLogging,org.slf4j.LoggerFactory \
                --no-fallback 
  
index 9792e71cc6c65240d800143df41dbed54c82a1f8..b0bfefac632fc6fe0efea9c04c89908b3635797d 100644 (file)
@@ -1019,10 +1019,11 @@ public class A2Factory {
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.osgi"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp"));
-//             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache"));
+               factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.sdk"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats"));
 //             factory.processCategory(descriptorsBase.resolve("org.argeo.tp.gis"));
+               System.exit(1);
 
                // SDK
                factory.processCategory(Paths.get("org.argeo.tp.sdk"));
@@ -1042,7 +1043,7 @@ public class A2Factory {
                factory.processEclipseArchive(Paths.get("lib/linux/aarch64/swt/rcp/org.argeo.tp.swt", "eclipse-rcp"));
                factory.processEclipseArchive(Paths.get("lib/win32/x86_64/swt/rcp/org.argeo.tp.swt", "eclipse-rcp"));
                factory.processEclipseArchive(Paths.get("lib/macosx/x86_64/swt/rcp/org.argeo.tp.swt", "eclipse-rcp"));
-               System.exit(1);
+
                factory.processEclipseArchive(Paths.get("swt/rcp/org.argeo.tp.swt", "eclipse-nebula"));
                // factory.processEclipseArchive(Paths.get("swt/rcp/org.argeo.tp.swt",
                // "eclipse-equinox"));
diff --git a/suite/org.argeo.slc.tool/.settings/org.eclipse.jdt.core.prefs b/suite/org.argeo.slc.tool/.settings/org.eclipse.jdt.core.prefs
new file mode 100644 (file)
index 0000000..997d664
--- /dev/null
@@ -0,0 +1,104 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.builder.annotationPath.allLocations=disabled
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
index 265efaef306743afcf28a6963f109d2153df61fd..a462807f16ab6b2607c3f2d835d1ebbf534c1731 100644 (file)
     {"name":"loadClass","parameterTypes":["java.lang.String"] }
   ]
 },
+{
+  "name":"java.lang.String",
+  "methods":[
+    {"name":"<init>","parameterTypes":["byte[]"] }, 
+    {"name":"getBytes","parameterTypes":[] }
+  ]
+},
 {
   "name":"java.lang.Throwable",
   "methods":[{"name":"addSuppressed","parameterTypes":["java.lang.Throwable"] }]
 {
   "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader"
 },
+{
+  "name":"org.apache.tomcat.jni.FileInfo",
+  "fields":[
+    {"name":"atime"}, 
+    {"name":"csize"}, 
+    {"name":"ctime"}, 
+    {"name":"device"}, 
+    {"name":"filehand"}, 
+    {"name":"filetype"}, 
+    {"name":"fname"}, 
+    {"name":"group"}, 
+    {"name":"inode"}, 
+    {"name":"mtime"}, 
+    {"name":"name"}, 
+    {"name":"nlink"}, 
+    {"name":"pool"}, 
+    {"name":"protection"}, 
+    {"name":"size"}, 
+    {"name":"user"}, 
+    {"name":"valid"}
+  ],
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.tomcat.jni.Sockaddr",
+  "fields":[
+    {"name":"family"}, 
+    {"name":"hostname"}, 
+    {"name":"next"}, 
+    {"name":"pool"}, 
+    {"name":"port"}, 
+    {"name":"servname"}
+  ],
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.eclipse.swt.browser.WebKit",
   "methods":[
 {
   "name":"org.eclipse.swt.internal.gtk3.GdkEventKey",
   "fields":[
-    {"name":"window"},
-    {"name":"send_event"},
-    {"name":"time"},
-    {"name":"state"},
-    {"name":"keyval"},
-    {"name":"length"},
-    {"name":"string"},
-    {"name":"is_modifier"},
-    {"name":"hardware_keycode"},
-    {"name":"group"}
+    {"name":"group"}, 
+    {"name":"hardware_keycode"}, 
+    {"name":"is_modifier"}, 
+    {"name":"keyval"}, 
+    {"name":"length"}, 
+    {"name":"send_event"}, 
+    {"name":"state"}, 
+    {"name":"string"}, 
+    {"name":"time"}, 
+    {"name":"window"}
   ]
 },
 {
index 0d4f101c7a37a4c875e6999bee1a287fdb733380..f9dde3405e5e1f22e9699bd7c5a282a8dbaf77dc 100644 (file)
@@ -1,2 +1,11 @@
 [
+  {
+    "interfaces":["org.apache.sshd.common.channel.ChannelListener"]}
+  ,
+  {
+    "interfaces":["org.apache.sshd.common.forward.PortForwardingEventListener"]}
+  ,
+  {
+    "interfaces":["org.apache.sshd.common.session.SessionListener"]}
+  
 ]
index ca267156e5cefdc1ffc44b93a8036c209bcbe885..93ea66397229080f8c7986516d71dbe1a6c5e8e9 100644 (file)
 {
   "name":"java.lang.String"
 },
+{
+  "name":"java.security.KeyFactory",
+  "methods":[{"name":"getInstance","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+  "name":"java.security.KeyPairGenerator",
+  "methods":[{"name":"getInstance","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+  "name":"java.security.MessageDigest",
+  "methods":[{"name":"getInstance","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
 {
   "name":"java.security.SecureRandomParameters"
 },
+{
+  "name":"java.security.Signature",
+  "methods":[{"name":"getInstance","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+  "name":"java.security.cert.PKIXRevocationChecker"
+},
 {
   "name":"java.util.Date"
 },
+{
+  "name":"javax.crypto.Cipher",
+  "methods":[{"name":"getInstance","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+  "name":"javax.crypto.KeyAgreement",
+  "methods":[{"name":"getInstance","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+  "name":"javax.crypto.spec.GCMParameterSpec"
+},
 {
   "name":"javax.security.auth.login.Configuration$Parameters"
 },
   "fields":[{"name":"thisX500Name"}],
   "queriedMethods":[{"name":"<init>","parameterTypes":["sun.security.x509.X500Name"] }]
 },
+{
+  "name":"net.i2p.crypto.eddsa.EdDSAKey"
+},
+{
+  "name":"net.i2p.crypto.eddsa.EdDSASecurityProvider",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"net.i2p.crypto.eddsa.KeyFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.sshd.common.SshConstants",
+  "allPublicFields":true
+},
+{
+  "name":"org.apache.sshd.common.io.nio2.Nio2ServiceFactoryFactory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.sshd.common.session.SessionListener",
+  "methods":[
+    {"name":"sessionClosed","parameterTypes":["org.apache.sshd.common.session.Session"] }, 
+    {"name":"sessionCreated","parameterTypes":["org.apache.sshd.common.session.Session"] }, 
+    {"name":"sessionEstablished","parameterTypes":["org.apache.sshd.common.session.Session"] }, 
+    {"name":"sessionEvent","parameterTypes":["org.apache.sshd.common.session.Session","org.apache.sshd.common.session.SessionListener$Event"] }, 
+    {"name":"sessionNegotiationEnd","parameterTypes":["org.apache.sshd.common.session.Session","java.util.Map","java.util.Map","java.util.Map","java.lang.Throwable"] }, 
+    {"name":"sessionNegotiationOptionsCreated","parameterTypes":["org.apache.sshd.common.session.Session","java.util.Map"] }, 
+    {"name":"sessionNegotiationStart","parameterTypes":["org.apache.sshd.common.session.Session","java.util.Map","java.util.Map"] }, 
+    {"name":"sessionPeerIdentificationLine","parameterTypes":["org.apache.sshd.common.session.Session","java.lang.String","java.util.List"] }, 
+    {"name":"sessionPeerIdentificationReceived","parameterTypes":["org.apache.sshd.common.session.Session","java.lang.String","java.util.List"] }, 
+    {"name":"sessionPeerIdentificationSend","parameterTypes":["org.apache.sshd.common.session.Session","java.lang.String","java.util.List"] }
+  ]
+},
+{
+  "name":"org.apache.sshd.common.util.security.bouncycastle.BouncyCastleSecurityProviderRegistrar",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.apache.sshd.common.util.security.eddsa.EdDSASecurityProviderRegistrar",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl",
   "methods":[{"name":"<init>","parameterTypes":[] }]
   "name":"org.argeo.cms.auth.SingleUserLoginModule",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.COMPOSITE$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.ECGOST$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.EXTERNAL$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.EdEC$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.ElGamal$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.GM$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.GOST$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.IES$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.LMS$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings",
+  "allPublicMethods":true,
+  "allPublicConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.SPHINCSPlus$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.X509$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.dh.KeyPairGeneratorSpi",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$EC",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$EC",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.SignatureSpi$ecDSA256",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.SignatureSpi$ecDSA512",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyAgreementSpi$X25519",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyAgreementSpi$X448",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyFactorySpi$X25519",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyFactorySpi$X448",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyPairGeneratorSpi$X25519",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyPairGeneratorSpi$X448",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA512",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi",
+  "allPublicMethods":true,
+  "allPublicConstructors":true
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Blake2b$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Blake2s$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Blake3$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.DSTU7564$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Haraka$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Keccak$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.MD2$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.MD4$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.MD5$Digest",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.MD5$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD128$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD160$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD256$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD320$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA1$Digest",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA1$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA224$Digest",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA224$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA256$Digest",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA256$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA3$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA384$Digest",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA384$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA512$Digest",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SHA512$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.SM3$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Skein$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Tiger$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.digest.Whirlpool$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.drbg.DRBG$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.keystore.BC$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.keystore.BCFKS$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.AES$ECB",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.AES$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.ARIA$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Blowfish$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.CAST5$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.CAST6$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Camellia$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.ChaCha$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.DES$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.DESede$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.DSTU7624$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.GOST28147$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.GOST3412_2015$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Grain128$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Grainv1$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.HC128$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.HC256$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.IDEA$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Noekeon$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.OpenSSLPBKDF$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF1$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF2$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPKCS12$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Poly1305$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.RC2$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.RC5$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.RC6$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Rijndael$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.SCRYPT$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.SEED$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.SM4$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Salsa20$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Serpent$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Shacal2$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash128$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Skipjack$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.TEA$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.TLSKDF$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Threefish$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.VMPC$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.VMPCKSA3$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.XSalsa20$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.XTEA$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jcajce.provider.symmetric.Zuc$Mappings",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"org.bouncycastle.jce.provider.BouncyCastleProvider",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.eclipse.swt.widgets.Display"
 },
   "name":"sun.security.provider.SHA2$SHA256",
   "methods":[{"name":"<init>","parameterTypes":[] }]
 },
+{
+  "name":"sun.security.provider.SHA5$SHA512",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.provider.X509Factory",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
+{
+  "name":"sun.security.rsa.RSAKeyFactory$Legacy",
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"sun.security.util.ObjectIdentifier"
 },
index 4afab34abbecec4953935c77a89f27df5ac73542..f704b87a1f9e2de419d0afe3dbd27985cea9b46a 100644 (file)
@@ -7,6 +7,9 @@
     {
       "pattern":"\\QMETA-INF/services/javax.xml.validation.SchemaFactory\\E"
     }, 
+    {
+      "pattern":"\\Qorg/apache/sshd/sshd-version.properties\\E"
+    }, 
     {
       "pattern":"\\Qorg/argeo/cms/acr/schemas/DSMLv2.xsd\\E"
     }, 
@@ -78,6 +81,9 @@
     }, 
     {
       "pattern":"\\Qorg/eclipse/swt/internal/gtk/swt_theming_fixes_gtk_3_24_5.css\\E"
+    }, 
+    {
+      "pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"
     }
   ]},
   "bundles":[
     }, 
     {
       "name":"org.eclipse.swt.internal.SWTMessages",
-      "locales":[""]
+      "locales":["und"]
     }, 
     {
       "name":"sun.security.util.Resources",
index 8bec0656fe12d19126563d745665bc3b0d1a5955..cd7978b58e1baf0c70632f57f53f9ddf9f7bfe7d 100644 (file)
@@ -1 +1,5 @@
 Main-Class: org.argeo.slc.tool.Main
+
+Import-Package: \
+org.apache.sshd.client.session,\
+*
\ No newline at end of file
index 34d2e4d2dad529ceaeb953bfcdb63c51d69ffed2..61e47febe254f81ef6af000ae5d9045a5a3dedc9 100644 (file)
@@ -2,3 +2,9 @@ source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
                .
+additional.bundles = org.apache.sshd.common,\
+                     org.apache.sshd.core,\
+                     org.slf4j.api,\
+                     org.argeo.ext.slf4j,\
+                     org.apache.tomcat.jni
+               
\ No newline at end of file
index 3b7b0809fb86133f139086d3116eccc02839c4eb..0619209302507031b2ab0fb21f99d1f23028f56b 100644 (file)
@@ -49,10 +49,10 @@ public class CmsCli extends CommandsCli {
                @Override
                public String apply(List<String> args) {
                        CommandLine cl = toCommandLine(args);
-                       String dataÜath = cl.getOptionValue(dataOption);
+                       String dataPath = cl.getOptionValue(dataOption);
                        boolean ui = cl.hasOption(uiOption);
 
-                       Path instancePath = Paths.get(dataÜath);
+                       Path instancePath = Paths.get(dataPath);
                        System.setProperty("osgi.instance.area", instancePath.toUri().toString());
 
                        StaticCms staticCms = new StaticCms() {
index 089e5b3c18df82026a0997e2d238a8f38b39aaad..26b6156004aa1880be2e0db9db1ff766a4fbf471 100644 (file)
@@ -1,12 +1,18 @@
 package org.argeo.slc.tool;
 
+import java.security.Security;
+
 import org.apache.commons.cli.Option;
 import org.argeo.cms.cli.CommandsCli;
 import org.argeo.slc.cli.posix.PosixCommands;
 import org.argeo.slc.tool.swt.MiniDesktopCli;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
 
 /** Argeo command line tools. */
 public class Main extends CommandsCli {
+       static {
+               Security.addProvider(new BouncyCastleProvider());
+       }
 
        public Main(String commandName) {
                super(commandName);
@@ -18,6 +24,7 @@ public class Main extends CommandsCli {
                addCommandsCli(new PosixCommands("posix"));
                addCommandsCli(new CmsCli("cms"));
                addCommandsCli(new MiniDesktopCli("minidesktop"));
+               addCommandsCli(new SshCli("ssh"));
 //             addCommandsCli(new FsCommands("fs"));
 //             addCommandsCli(new JcrCommands("jcr"));
        }
diff --git a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/SshCli.java b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/SshCli.java
new file mode 100644 (file)
index 0000000..bc82e40
--- /dev/null
@@ -0,0 +1,132 @@
+package org.argeo.slc.tool;
+
+import java.io.Console;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.net.URI;
+import java.security.GeneralSecurityException;
+import java.security.KeyPair;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Scanner;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.sshd.agent.SshAgent;
+import org.apache.sshd.agent.SshAgentFactory;
+import org.apache.sshd.agent.local.LocalAgentFactory;
+import org.apache.sshd.agent.unix.UnixAgentFactory;
+import org.apache.sshd.client.config.keys.ClientIdentityLoader;
+import org.apache.sshd.common.NamedResource;
+import org.apache.sshd.common.config.keys.FilePasswordProvider;
+import org.argeo.cms.cli.CommandsCli;
+import org.argeo.cms.cli.DescribedCommand;
+import org.argeo.cms.ssh.AbstractSsh;
+import org.argeo.cms.ssh.Ssh;
+import org.argeo.cms.ssh.SshKeyPair;
+
+public class SshCli extends CommandsCli {
+       public SshCli(String commandName) {
+               super(commandName);
+               addCommand("shell", new SshShell());
+       }
+
+       @Override
+       public String getDescription() {
+               return "Argeo CMS utilities.";
+       }
+
+       static class SshShell implements DescribedCommand<String> {
+               private Option portOption;
+
+               @Override
+               public Options getOptions() {
+                       Options options = new Options();
+                       portOption = Option.builder().option("p").longOpt("port").hasArg().desc("port to connect to").build();
+                       options.addOption(portOption);
+                       return options;
+               }
+
+               @Override
+               public String apply(List<String> args) {
+                       CommandLine cl = toCommandLine(args);
+                       String portStr = cl.getOptionValue(portOption);
+                       if (portStr == null)
+                               portStr = "22";
+
+                       String host = cl.getArgList().get(0);
+
+                       String uriStr = "ssh://" + host + ":" + portStr + "/";
+                       // System.out.println(uriStr);
+                       URI uri = URI.create(uriStr);
+
+                       Ssh ssh = null;
+                       try {
+                               ssh = new Ssh(uri);
+                               boolean osAgent;
+                               SshAgent sshAgent;
+                               try {
+                                       String sshAuthSockentEnv = System.getenv(SshAgent.SSH_AUTHSOCKET_ENV_NAME);
+                                       if (sshAuthSockentEnv != null) {
+                                               ssh.getSshClient().getProperties().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME, sshAuthSockentEnv);
+                                               SshAgentFactory agentFactory = new UnixAgentFactory();
+                                               ssh.getSshClient().setAgentFactory(agentFactory);
+                                               sshAgent = agentFactory.createClient(null, ssh.getSshClient());
+                                               osAgent = true;
+                                       } else {
+                                               osAgent = false;
+                                       }
+                               } catch (Exception e) {
+                                       e.printStackTrace();
+                                       osAgent = false;
+                               }
+
+                               if (!osAgent) {
+                                       SshAgentFactory agentFactory = new LocalAgentFactory();
+                                       ssh.getSshClient().setAgentFactory(agentFactory);
+                                       sshAgent = agentFactory.createClient(null, ssh.getSshClient());
+                                       String keyPath = System.getProperty("user.home") + "/.ssh/id_rsa";
+
+                                       char[] keyPassword = AbstractSsh.readPassword();
+                                       NamedResource namedResource = new NamedResource() {
+
+                                               @Override
+                                               public String getName() {
+                                                       return keyPath;
+                                               }
+                                       };
+                                       KeyPair keyPair = ClientIdentityLoader.DEFAULT
+                                                       .loadClientIdentities(null, namedResource, FilePasswordProvider.of(new String(keyPassword)))
+                                                       .iterator().next();
+                                       sshAgent.addIdentity(keyPair, "NO COMMENT");
+                               }
+
+//                             char[] keyPassword = AbstractSsh.readPassword();
+//                             SshKeyPair keyPair = SshKeyPair.loadDefault(keyPassword);
+//                             Arrays.fill(keyPassword, '*');
+//                             ssh.setSshKeyPair(keyPair);
+//                             ssh.authenticate();
+                               ssh.verifyAuth();
+
+                               long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
+                               System.out.println("Ssh available in " + jvmUptime + " ms.");
+
+                               AbstractSsh.openShell(ssh);
+                       } catch (IOException | GeneralSecurityException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       } finally {
+                               if (ssh != null)
+                                       ssh.closeSession();
+                       }
+                       return null;
+               }
+
+               @Override
+               public String getDescription() {
+                       return "Launch a static CMS.";
+               }
+
+       }
+}
diff --git a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/graalvm/BouncyCastleFeature.java b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/graalvm/BouncyCastleFeature.java
new file mode 100644 (file)
index 0000000..2621fc1
--- /dev/null
@@ -0,0 +1,38 @@
+package org.argeo.slc.tool.graalvm;
+
+import java.security.Security;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.graalvm.nativeimage.ImageSingletons;
+import org.graalvm.nativeimage.hosted.Feature;
+import org.graalvm.nativeimage.hosted.RuntimeClassInitialization;
+import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport;
+
+import com.oracle.svm.core.annotate.AutomaticFeature;
+
+import net.i2p.crypto.eddsa.EdDSASecurityProvider;
+
+/**
+ * BounvyCastle JCE provider needs to be registered at build time.
+ * 
+ * @see https://github.com/oracle/graal/issues/2800#issuecomment-702480444
+ * @see https://github.com/micronaut-projects/micronaut-oracle-cloud/pull/17/files#r498585779
+ */
+@AutomaticFeature
+public class BouncyCastleFeature implements Feature {
+
+       @Override
+       public void afterRegistration(AfterRegistrationAccess access) {
+               RuntimeClassInitialization.initializeAtBuildTime("org.bouncycastle");
+               Security.addProvider(new BouncyCastleProvider());
+               
+               RuntimeClassInitialization.initializeAtBuildTime("net.i2p.crypto.eddsa");
+               Security.addProvider(new EdDSASecurityProvider());
+
+               RuntimeClassInitializationSupport rci = ImageSingletons.lookup(RuntimeClassInitializationSupport.class);
+               rci.rerunInitialization("org.bouncycastle.jcajce.provider.drbg.DRBG$Default", "dependency with native random");
+               rci.rerunInitialization("org.bouncycastle.jcajce.provider.drbg.DRBG$NonceAndIV",
+                               "dependency with native random");
+       }
+
+}
diff --git a/tp/org.argeo.tp.apache/org.apache.tomcat.jni.bnd b/tp/org.argeo.tp.apache/org.apache.tomcat.jni.bnd
new file mode 100644 (file)
index 0000000..99cb821
--- /dev/null
@@ -0,0 +1,3 @@
+Bundle-License: Apache-2.0
+# Use Tomcat v9 to stay compatible with JNI library v1.2 provided by Debian 11
+SLC-Origin-M2: org.apache.tomcat:tomcat-jni:9.0.43
\ No newline at end of file
diff --git a/tp/org.argeo.tp.sdk/org.graalvm.nativeimage.svm.bnd b/tp/org.argeo.tp.sdk/org.graalvm.nativeimage.svm.bnd
new file mode 100644 (file)
index 0000000..9673968
--- /dev/null
@@ -0,0 +1,4 @@
+Bundle-License: GPL-2.0-only WITH Classpath-exception-2.0
+SLC-Origin-M2: org.graalvm.nativeimage:svm:22.1.0.1
+# Workaround for errors in Eclipse PDE when using GraalVM as JCM
+Import-Package: java.*;resolution:="optional", *
\ No newline at end of file
diff --git a/tp/org.argeo.tp/net.i2p.crypto.eddsa.bnd b/tp/org.argeo.tp/net.i2p.crypto.eddsa.bnd
new file mode 100644 (file)
index 0000000..f862a6b
--- /dev/null
@@ -0,0 +1,2 @@
+Bundle-License: CC0-1.0
+SLC-Origin-M2: net.i2p.crypto:eddsa:0.3.0
index 3ea900d7ec11c6e8ecc9197cf2233856b4cb925c..d4a68212c8a1757c276b3585c508458b789bc4cd 100644 (file)
@@ -1,3 +1,2 @@
-Bundle-License: Public Domain
-Bundle-SymbolicName: org.tukaani.xz
+Bundle-License: CC0-1.0
 SLC-Origin-M2: org.tukaani:xz:1.9