soap-webservices — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited soap-webservices (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
from the contract, never the reverse.
src/main/resources/wsdl/src/main/resources/xsd/wsdl/providerName/v2/)..xjb) for allcustomisations.
<jaxb:bindings version="3.0"
xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jaxb:bindings schemaLocation="service.xsd" node="/xs:schema">
<jaxb:bindings node="//xs:element[@name='Faktura']">
<jaxb:class name="Invoice"/>
</jaxb:bindings>
<jaxb:bindings node="//xs:element[@name='Kwota']">
<jaxb:property name="amount"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>docs/TRANSLATIONS.md at the project root using the followingstructure:
| Source Schema | Original Element | Mapped Name | Description |
|---|---|---|---|
service.xsd | Faktura | Invoice | Accounts payable invoice document |
service.xsd | Kwota | amount | Monetary amount in PLN |
docs/TRANSLATIONS.md alongside thetranslation table.
layout.buildDirectory for dynamic target paths.
build/ to .gitignore.sourceSets to automatically mark the generation output directory as a generated source root.JavaExec tasks with isolated dependency configurations (jaxb, cxfTools) over outdated third-partyGradle plugins.
Example: XSD to Java (XJC):
val generatedJaxbDir = layout.buildDirectory.dir("generated/sources/jaxb")
tasks.register<JavaExec>("genJaxb") {
description = "Generate JAXB classes from XSD"
group = "jaxb"
val xsdFile = file("src/main/resources/xsd/schema.xsd")
val bindingFile = file("src/main/resources/xsd/bindings.xjb")
val outputDir = generatedJaxbDir.get().asFile
inputs.file(xsdFile); inputs.file(bindingFile); outputs.dir(outputDir)
classpath = configurations["jaxb"]
mainClass.set("com.sun.tools.xjc.XJCFacade")
args("-d", outputDir.absolutePath, "-p", "com.example.generated.model",
"-encoding", "UTF-8", "-no-header", "-b", bindingFile.absolutePath,
xsdFile.absolutePath)
doFirst { outputDir.mkdirs() }
}Example: WSDL to Java (Apache CXF):
val generatedWsdlDir = layout.buildDirectory.dir("generated/sources/wsdl")
tasks.register<JavaExec>("generateFromWsdl") {
group = "wsdl2java"; description = "Generate classes from WSDL"
mainClass.set("org.apache.cxf.tools.wsdlto.WSDLToJava")
classpath = configurations["cxfTools"]
val outputDir = generatedWsdlDir.get().asFile
outputs.dir(outputDir)
args("-d", outputDir.absolutePath, "-p", "com.example.generated.wsdl",
"-client", "-wsdlLocation", "classpath:wsdl/service.wsdl",
"src/main/resources/wsdl/service.wsdl")
}SourceSet configuration:
sourceSets {
main { java { srcDir(generatedJaxbDir); srcDir(generatedWsdlDir) } }
}
tasks.withType<JavaCompile> { dependsOn("genJaxb", "generateFromWsdl") }#### XXE Prevention
injection attacks:
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);#### TLS Enforcement
SOAP servers.
#### Connection Pooling
PoolingHttpClientConnectionManager or CXF's HTTPConduit) forthe underlying transport layer to improve throughput under concurrent load.
Service class once (as a Spring Bean or application-scoped singleton) to avoid the highcost of repeatedly parsing the WSDL on every request.
Service singleton and obtain Port instances from it per-request, or pool and reuse Port instances ina thread-safe manner.
Wss4jSecurityInterceptor) when the integration partner requires message-levelsecurity beyond transport TLS.
UsernameToken with PasswordDigest mode. Never transmit passwords inplaintext in the SOAP header.
KMS or Java KeyStore (PKCS12). Never store private keys in plaintext files.
Wss4jSecurityInterceptor example:Wss4jSecurityInterceptor interceptor = new Wss4jSecurityInterceptor();
interceptor.setSecurementActions("UsernameToken");
interceptor.setSecurementUsername("serviceUser");
interceptor.setSecurementPassword(passwordFromVault);
interceptor.setSecurementPasswordType(WSConstants.PW_DIGEST);SOAPFaultException at the service client boundary and map it to a typed application exception beforepropagating to business logic. Never let raw SOAPFaultException reach an HTTP API response.
WARN level after redacting any PII in the detailelement. Use ERROR level only for unexpected system faults.
DEBUG level using a Spring-WS PayloadLoggingInterceptor ora custom ClientInterceptor.
complete SOAP envelopes by default.
SOAPFaultException with a system fault code, connection timeouts.RetryConfig retryConfig = RetryConfig.custom()
.maxAttempts(3)
.waitDuration(Duration.ofMillis(500))
.intervalFunction(IntervalFunction.ofExponentialRandomBackoff(500, 2.0, 0.5))
.retryOnException(e -> e instanceof SoapSystemFaultException)
.build();WireMockExtension for JUnit 5) to stub SOAP endpoints in unit and integration tests. Never call realexternal SOAP services in automated tests.
src/test/resources/wiremock/ versioned alongside the WSDL.certification.
and malformed response.
documents) larger than 10 KB to avoid base64 encoding overhead.
javax.xml.ws.soap.MTOMFeature on the service port when MTOM is required:MTOMFeature mtomFeature = new MTOMFeature(true, 10240); // threshold 10 KB
MyService port = service.getMyServicePort(mtomFeature);abuse.
(e.g., wsdl/providerName/v2/).
generated code.
build.gradle.kts.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.