From ff6b85864271f75b795f88333f329a52db3b901f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 9 Jul 2022 10:30:46 +0200 Subject: [PATCH] SSH client as tool --- Makefile | 3 +- .../src/org/argeo/slc/factory/A2Factory.java | 5 +- .../.settings/org.eclipse.jdt.core.prefs | 104 ++++ .../META-INF/native-image/jni-config.json | 62 +- .../META-INF/native-image/proxy-config.json | 9 + .../META-INF/native-image/reflect-config.json | 531 ++++++++++++++++++ .../native-image/resource-config.json | 8 +- suite/org.argeo.slc.tool/bnd.bnd | 4 + suite/org.argeo.slc.tool/build.properties | 6 + .../src/org/argeo/slc/tool/CmsCli.java | 4 +- .../src/org/argeo/slc/tool/Main.java | 7 + .../src/org/argeo/slc/tool/SshCli.java | 132 +++++ .../slc/tool/graalvm/BouncyCastleFeature.java | 38 ++ .../org.apache.tomcat.jni.bnd | 3 + .../org.graalvm.nativeimage.svm.bnd | 4 + tp/org.argeo.tp/net.i2p.crypto.eddsa.bnd | 2 + tp/org.argeo.tp/org.tukaani.xz.bnd | 3 +- 17 files changed, 907 insertions(+), 18 deletions(-) create mode 100644 suite/org.argeo.slc.tool/.settings/org.eclipse.jdt.core.prefs create mode 100644 suite/org.argeo.slc.tool/src/org/argeo/slc/tool/SshCli.java create mode 100644 suite/org.argeo.slc.tool/src/org/argeo/slc/tool/graalvm/BouncyCastleFeature.java create mode 100644 tp/org.argeo.tp.apache/org.apache.tomcat.jni.bnd create mode 100644 tp/org.argeo.tp.sdk/org.graalvm.nativeimage.svm.bnd create mode 100644 tp/org.argeo.tp/net.i2p.crypto.eddsa.bnd diff --git a/Makefile b/Makefile index 04638f6aa..a0a17d608 100644 --- 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 diff --git a/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java b/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java index 9792e71cc..b0bfefac6 100644 --- a/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java +++ b/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java @@ -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 index 000000000..997d6645b --- /dev/null +++ b/suite/org.argeo.slc.tool/.settings/org.eclipse.jdt.core.prefs @@ -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 diff --git a/suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json index 265efaef3..a462807f1 100644 --- a/suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json +++ b/suite/org.argeo.slc.tool/META-INF/native-image/jni-config.json @@ -19,6 +19,13 @@ {"name":"loadClass","parameterTypes":["java.lang.String"] } ] }, +{ + "name":"java.lang.String", + "methods":[ + {"name":"","parameterTypes":["byte[]"] }, + {"name":"getBytes","parameterTypes":[] } + ] +}, { "name":"java.lang.Throwable", "methods":[{"name":"addSuppressed","parameterTypes":["java.lang.Throwable"] }] @@ -26,6 +33,41 @@ { "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":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.tomcat.jni.Sockaddr", + "fields":[ + {"name":"family"}, + {"name":"hostname"}, + {"name":"next"}, + {"name":"pool"}, + {"name":"port"}, + {"name":"servname"} + ], + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.eclipse.swt.browser.WebKit", "methods":[ @@ -174,16 +216,16 @@ { "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"} ] }, { diff --git a/suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json index 0d4f101c7..f9dde3405 100644 --- a/suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json +++ b/suite/org.argeo.slc.tool/META-INF/native-image/proxy-config.json @@ -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"]} + ] diff --git a/suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json index ca267156e..93ea66397 100644 --- a/suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json +++ b/suite/org.argeo.slc.tool/META-INF/native-image/reflect-config.json @@ -15,12 +15,42 @@ { "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" }, @@ -29,6 +59,48 @@ "fields":[{"name":"thisX500Name"}], "queriedMethods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }] }, +{ + "name":"net.i2p.crypto.eddsa.EdDSAKey" +}, +{ + "name":"net.i2p.crypto.eddsa.EdDSASecurityProvider", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"net.i2p.crypto.eddsa.KeyFactory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.sshd.common.SshConstants", + "allPublicFields":true +}, +{ + "name":"org.apache.sshd.common.io.nio2.Nio2ServiceFactoryFactory", + "methods":[{"name":"","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":"","parameterTypes":[] }] +}, +{ + "name":"org.apache.sshd.common.util.security.eddsa.EdDSASecurityProviderRegistrar", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl", "methods":[{"name":"","parameterTypes":[] }] @@ -61,6 +133,453 @@ "name":"org.argeo.cms.auth.SingleUserLoginModule", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.COMPOSITE$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ECGOST$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.EXTERNAL$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.EdEC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ElGamal$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.GM$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.GOST$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.IES$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.LMS$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.RSA$Mappings", + "allPublicMethods":true, + "allPublicConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.SPHINCSPlus$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.X509$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.dh.KeyPairGeneratorSpi", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi$EC", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.KeyPairGeneratorSpi$EC", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.SignatureSpi$ecDSA256", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.ec.SignatureSpi$ecDSA512", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyAgreementSpi$X25519", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyAgreementSpi$X448", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyFactorySpi$X25519", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyFactorySpi$X448", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyPairGeneratorSpi$X25519", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.edec.KeyPairGeneratorSpi$X448", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA512", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi", + "allPublicMethods":true, + "allPublicConstructors":true +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Blake2b$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Blake2s$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Blake3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.DSTU7564$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Haraka$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Keccak$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.MD2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.MD4$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.MD5$Digest", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.MD5$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD160$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD256$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.RIPEMD320$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA1$Digest", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA1$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA224$Digest", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA224$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA256$Digest", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA256$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA384$Digest", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA384$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA512$Digest", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SHA512$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.SM3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Skein$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Tiger$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.digest.Whirlpool$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.drbg.DRBG$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.keystore.BC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.keystore.BCFKS$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.AES$ECB", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.AES$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.ARIA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Blowfish$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.CAST5$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.CAST6$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Camellia$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.ChaCha$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.DES$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.DESede$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.DSTU7624$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.GOST28147$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.GOST3412_2015$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Grain128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Grainv1$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.HC128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.HC256$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.IDEA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Noekeon$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.OpenSSLPBKDF$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF1$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPBKDF2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.PBEPKCS12$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Poly1305$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.RC2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.RC5$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.RC6$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Rijndael$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SCRYPT$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SEED$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SM4$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Salsa20$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Serpent$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Shacal2$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.SipHash128$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Skipjack$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.TEA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.TLSKDF$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Threefish$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.VMPC$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.VMPCKSA3$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.XSalsa20$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.XTEA$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jcajce.provider.symmetric.Zuc$Mappings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.bouncycastle.jce.provider.BouncyCastleProvider", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.eclipse.swt.widgets.Display" }, @@ -84,6 +603,18 @@ "name":"sun.security.provider.SHA2$SHA256", "methods":[{"name":"","parameterTypes":[] }] }, +{ + "name":"sun.security.provider.SHA5$SHA512", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.X509Factory", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.rsa.RSAKeyFactory$Legacy", + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"sun.security.util.ObjectIdentifier" }, diff --git a/suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json b/suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json index 4afab34ab..f704b87a1 100644 --- a/suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json +++ b/suite/org.argeo.slc.tool/META-INF/native-image/resource-config.json @@ -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":[ @@ -97,7 +103,7 @@ }, { "name":"org.eclipse.swt.internal.SWTMessages", - "locales":[""] + "locales":["und"] }, { "name":"sun.security.util.Resources", diff --git a/suite/org.argeo.slc.tool/bnd.bnd b/suite/org.argeo.slc.tool/bnd.bnd index 8bec0656f..cd7978b58 100644 --- a/suite/org.argeo.slc.tool/bnd.bnd +++ b/suite/org.argeo.slc.tool/bnd.bnd @@ -1 +1,5 @@ Main-Class: org.argeo.slc.tool.Main + +Import-Package: \ +org.apache.sshd.client.session,\ +* \ No newline at end of file diff --git a/suite/org.argeo.slc.tool/build.properties b/suite/org.argeo.slc.tool/build.properties index 34d2e4d2d..61e47febe 100644 --- a/suite/org.argeo.slc.tool/build.properties +++ b/suite/org.argeo.slc.tool/build.properties @@ -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 diff --git a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java index 3b7b0809f..061920930 100644 --- a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java +++ b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/CmsCli.java @@ -49,10 +49,10 @@ public class CmsCli extends CommandsCli { @Override public String apply(List 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() { diff --git a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java index 089e5b3c1..26b615600 100644 --- a/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java +++ b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/Main.java @@ -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 index 000000000..bc82e40f7 --- /dev/null +++ b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/SshCli.java @@ -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 { + 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 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 index 000000000..2621fc103 --- /dev/null +++ b/suite/org.argeo.slc.tool/src/org/argeo/slc/tool/graalvm/BouncyCastleFeature.java @@ -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 index 000000000..99cb82130 --- /dev/null +++ b/tp/org.argeo.tp.apache/org.apache.tomcat.jni.bnd @@ -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 index 000000000..9673968a5 --- /dev/null +++ b/tp/org.argeo.tp.sdk/org.graalvm.nativeimage.svm.bnd @@ -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 index 000000000..f862a6b89 --- /dev/null +++ b/tp/org.argeo.tp/net.i2p.crypto.eddsa.bnd @@ -0,0 +1,2 @@ +Bundle-License: CC0-1.0 +SLC-Origin-M2: net.i2p.crypto:eddsa:0.3.0 diff --git a/tp/org.argeo.tp/org.tukaani.xz.bnd b/tp/org.argeo.tp/org.tukaani.xz.bnd index 3ea900d7e..d4a68212c 100644 --- a/tp/org.argeo.tp/org.tukaani.xz.bnd +++ b/tp/org.argeo.tp/org.tukaani.xz.bnd @@ -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 -- 2.30.2