News and noteworthy - phax/phoss-smp GitHub Wiki
v8.6.2 - work in progress
- Added support for ECDSA (EC) keys in the SMP keystore.
The XMLDSig signature method used to sign the Service Metadata responses now follows the key algorithm -
ecdsa-sha256for EC keys andrsa-sha256for RSA keys - for all three REST types. Previously it was hard coded to RSA-SHA256, so an SMP with an EC key failed to sign every Service Metadata response. Other key algorithms are rejected with an explicit error message. - Fixed the SML registration check on the Tasks and Problems page, which always reported "The registration of this SMP at the SML could not be determined".
The SML rejected the
Readrequest with a BadRequestFault (code 106), because the mandatoryPublisherEndpointwas missing in it. The fix is inpeppol-sml-client13.2.1, which sends aPublisherEndpointwith dummy addresses - the SML ignores them for theReadoperation. See #583
v8.6.1 - 2026-10-09
- Added an opt-in cache for the responses of the read-only REST API endpoints
GET /{ServiceGroupId}andGET /{ServiceGroupId}/services/{DocumentTypeId}, enabled viasmp.rest.cache.enabled=true. Cached Service Metadata responses are stored already signed, so a cache hit neither queries the backend nor signs again. All cached responses of a participant are invalidated as soon as anything of that participant is modified on the same SMP instance; other instances of a multi-instance setup see the modification at the latest aftersmp.rest.cache.ttl(default60s). The storage can be replaced via the new SPI interfaceISMPRestResponseCacheSPI- by default an in-memory cache with at mostsmp.rest.cache.maxitems(default10000) entries is used. See #555 - The response of the REST API Service Group import (
PUT /exchange/import/xml/v1/{UserId}) now honours theAcceptheader.application/jsonresults in a JSON response, in all other cases - including unsupported values - the existing XML response is returned. - Added a dry run mode to the Service Group import, both in the UI (Dry run checkbox) and in the REST API (URL parameter
dry-run). In a dry run the uploaded file is only analyzed and the actions that would be performed are reported - nothing is changed, neither locally nor in the SML or the Directory. An import that overwrites existing Service Groups now explicitly reports that all existing Service Information and Redirects of those Service Groups will be deleted. Stored owners that cannot be resolved and are therefore replaced by the default owner are now reported in the import result as warnings instead of only in the log. The new method overloadServiceGroupImport.importXMLVer10takes the additionalbDryRunparameter. - Updated the predefined document types to include Peppol eDEC Code Lists v9.7
- Fixed a memory leak in the REST API statistics, that made the heap grow with every distinct requested path (via ph-oton 10.7.0).
The
$funcand$timerstatistics of the REST API were keyed by the concrete requested path, and never evicted, so every distinct Participant ID and Document Type ID ever requested - including unauthenticated and unmatched requests - permanently added new entries. They are now keyed by the route template (e.g./{ServiceGroupID}/services/{DocumentTypeID}). See phax/ph-oton#57 - thx @ismailbennani - (XML) A data file that exists but cannot be parsed as XML now results in an error, instead of being ignored (via ph-commons 12.5.1). Previously the SMP silently continued without the content of that file, and the next write replaced the file and therefore deleted the only copy of the data - for the user, user group and role files a single broken file locked everybody out. See phax/ph-oton#11
- The page Administration / Monitoring / Audit Items now has three tabs: the latest entries, all entries of a selected day, and a search over the last 1 to 30 days with a per-day summary (via ph-oton-bootstrap5 1.0.0). Failed audit entries are highlighted in red. The tabs Entries by date and Search are not supported by the MongoDB backend - an info message is shown instead.
- Added the new page Administration / App Information / CSS and JS that lists all included CSS and JS resources (via ph-oton-bootstrap5 1.0.0)
v8.6.0 - 2026-09-29
- Added the reconciliation of the local Service Groups with the SML, using the
List()operation of chapter 3.1.2.7 of the SML specification, on the new page Administration / SML / Reconcile participants. It reports the participants that exist locally but are not registered at the SML - those cannot be resolved via DNS - and the participants the SML has registered for this SMP that do not exist locally - those resolve to this SMP, which then answers HTTP 404. Because the complete participant list has to be read from the SML, this runs as a long running job in the background and the result is stored on the server as a ZIP file containingsummary.xml,missing-in-sml.txtandorphans-in-sml.txt. The new configuration propertysml.sync.retention.daysdefines how long the reports are kept - the default is 30 days - andsml.sync.page.delayoptionally adds a delay between two page requests, so that reading a large SMP does not hammer the SML. Note that the SML does not offer a way to read a single participant, so the report is verified against the local state only, by re-reading the local Service Groups after the SML list was read. That removes the false positives caused by Service Groups being created or deleted while the job was running. - Added the bulk repair of the SML differences on the new page Administration / SML / Repair SML differences, based on a reconciliation report.
It registers the missing participants via
CreateList(), and resolves the orphaned ones either by removing them from the SML viaDeleteList()or by creating them as local Service Groups - the latter is what is wanted when the participants are missing locally because local data was lost. The SML calls happen in chunks ofsml.repair.chunk.size(default 100), as a long running job. Creating them locally deliberately performs no SML call at all, because these participants are already registered there - that is exactly why they show up as orphans. The SML rejects aCreateList()orDeleteList()as a whole with no per item result, so a failed chunk is retried one participant at a time - a single unusable participant therefore does not block the rest, and the log says which ones could not be handled. The page shows what would be sent before anything is sent, and the execution needs a separate confirmation. - The Migrate outbound and Migrate inbound pages now show an SML state column, so that a participant migration can be verified at the SML.
Outbound, a participant that disappeared from this SMPs list is the evidence that the receiving SMP completed
Migrate(), so the migration can be finalized. Inbound, a migrated participant must be registered for this SMP - if it is not, the takeover did not take effect. - The Unregister from SML page now shows how many participants would be deleted, read from the first page of the SML participant list. Unregistering an SMP deletes all of its participants at the SML, and every deleted participant becomes free for another SMP to claim, so this cannot reliably be undone.
- The Check DNS state action of the Service Groups page now runs as a long running job from
smp.dnscheck.async.thresholdService Groups on - the default is 500, and 0 means always. Previously it performed one DNS lookup per participant while the page was rendered, gave up after 30 seconds and still rendered a full looking table in which the remaining rows carried no information. The lookups are now performed in parallel, withsmp.dnscheck.threads(default 8) threads. - The Tasks/Problems page now verifies the registration of this SMP at the SML, using the
Read()operation of chapter 3.1.3.2 of the SML specification. It reports if this SMP is not registered at all, and if the logical address the SML resolves all participants to differs from the address this SMP is configured with - a mismatch that silently breaks every delivery and that was previously invisible from inside the SMP. The check only runs if the SML connection is enabled, an SML is selected andsml.smpidis configured. The SML is queried lazily and the result is cached for one hour, so that the page does not perform a remote call on every rendering. The new classSMLRegistrationCacheoffers aclearCache ()method to drop the cached result. - Fixed the Directory not being notified when a Process is deleted in the Endpoint Tree page.
The method
deleteSMPProcessofISMPServiceInformationManagerdid not invoke the registeredISMPServiceInformationCallbackinstances, so the automatic Directory update did not happen. It now invokesonSMPServiceInformationUpdated, because the Service Information itself still exists - it just contains one Process less. This affected the XML, the SQL and the MongoDB backend. - (XML, MongoDB) Fixed that the replacement of an existing Service Information via the REST API was handled as a deletion followed by a creation.
Both backends used Java object identity to detect an update, which can never match for a REST API call, because the request payload is converted into a newly created object.
They now replace the existing entry, so that a single
MODIFYaudit entry is written instead of aDELETEand aCREATEaudit entry, and so that the behaviour matches the SQL backend. Note that the audit log therefore no longer contains the replaced content of the Service Information - that was previously part of theDELETEaudit entry. The MongoDB backend performs the replacement in a singlereplaceOneoperation, so that a concurrent read can no longer observe the short moment in which the Service Information did not exist at all. It also throws an exception if the server does not acknowledge the replacement - inmergeSMPServiceInformationas well as indeleteSMPProcess- as it already did for an insertion. Based on #545 - thx @vinit-thummar - (XML) The lookup of a single Service Metadata is now a map lookup instead of a scan over all stored entries.
getSMPRedirectOfServiceGroupAndDocumentTypeandgetSMPServiceInformationOfServiceGroupAndDocumentTypederive the deterministic object ID from the participant ID and the document type ID and resolve it directly, so that aGETof a Service Metadata no longer walks all Redirects and all Service Informations of the installation. The new methodsSMPRedirect.createSMPRedirectID (...)andSMPServiceInformation.createSMPServiceInformationID (...)create these IDs and are used by the respective constructors as well. As a side effect the participant ID of the lookup is now unified the same way as the participant ID of the owning Service Group, so that a lookup with a differently cased participant ID finds the entry - as the Service Group lookup already did. Based on #569 - thx @vinit-thummar - Fixed the QR code for the setup of the two-factor authentication not being displayed, if the SMP runs on a read-only file system.
The PNG image was encoded via
ImageIO, which by default buffers the encoded data in a temporary file belowjava.io.tmpdir, and the creation of that file failed. The encoding now happens entirely in memory, so that no temporary file is needed. The fix is contained in ph-totp 2.1.1. Based on #567 - thx @dv0gt
v8.5.0 - 2026-09-24
- Updated to ph-commons 12.5.0, ph-schedule 6.2.0, ph-web 11.4.6, ph-oton-bootstrap5 0.9.5, peppol-commons 13.0.0, peppol-shared-ui 0.11.0, phoss-directory 0.19.0, Flyway 13.7.0, the MongoDB driver 5.12.0, protobuf 4.36.2 and Jackson 3.2.3
- peppol-commons 13.0.0 moved the network neutral base types of the Peppol libraries into separate submodules, so that Peppol, OASIS BDXR, DBNAlliance and HR eDelivery share them instead of every network carrying its own copy.
Nothing changes for a running SMP installation, and no configuration property and no REST API is affected, but the public API of phoss-SMP moved along with it.
That is relevant if you maintain a custom backend or a fork, because the transport profile manager is one of the managers that a backend has to provide:
-
ISMPTransportProfile,SMPTransportProfileandESMPTransportProfileStatemoved fromcom.helger.peppol.smptocom.helger.edelivery.smp, soISMPTransportProfileManager,SMPTransportProfileManagerXML,SMPTransportProfileManagerJDBC,SMPTransportProfileManagerMongoDB,SMPTransportProfileCacheandHCSMPTransportProfileSelectnow use the new types in their signatures -
ESMPAPITypemoved fromcom.helger.peppol.smltocom.helger.edelivery.smp, soESMPRESTType.getAPIType ()returns the new type -
EPeppolCodeListItemStatewas renamed toECodeListItemStateand moved fromcom.helger.peppolid.peppoltocom.helger.peppolid.codelist- it is used bySMPNiceNameUIto render the state of a transport profile - The DNS based URL providers moved from
com.helger.smpclient.urltocom.helger.smpclient.url.dns, andIPeppolURLProvideris deprecated in favour ofIBDXLURLProvider, so the Check DNS state action of the Service Groups page only distinguishesIBDXLURLProvidernow. Both providers that can be active -PeppolNaptrURLProviderforsmp.rest.type = peppolandBDXLURLProviderfor the OASIS BDXR types - implement it, so the behaviour is unchanged -
SMPExtensionList.getAsPeppolExtension ()was removed, so the conversion of an SMP extension into the Peppol SMP v1 data model now goes throughPeppolSMPExtensionHelper.getAsPeppolExtension (...). The OASIS BDXR SMP v1 and v2 conversions are unchanged
-
- The NAPTR lookups of the Check DNS state action of the Service Groups page and of the Remote Query API are faster for participants that are not registered in the SML:
- peppol-commons 13.0.0 performs the lookup with an absolute DNS name, so that the
searchdomains of the operating system resolver configuration are no longer appended to it. Previously an unresolvable participant caused one additional DNS query persearchentry, each of which could run into the full DNS timeout - ph-web 11.4.6 only retries a lookup via TCP if the UDP lookup ended in a transient failure, instead of also retrying the definitive answers
HOST_NOT_FOUNDandTYPE_NOT_FOUND- that previously doubled the runtime of every unresolvable lookup - ph-web 11.4.6 additionally applies the configured DNS timeout to the single resolvers inside the
ExtendedResolver, and gives each of them a smaller timeout than the overall lookup, so that a second configured DNS server is actually tried. Previously the overall timeout was already used up when the first server timed out
- peppol-commons 13.0.0 performs the lookup with an absolute DNS name, so that the
- The WAR files are roughly 2.6 MB smaller than in v8.4.3, mostly because BouncyCastle 1.86 - that comes with ph-commons 12.5.0 - is about 3 MB smaller than 1.85.2.
The module split of peppol-commons 13.0.0 itself is size neutral for phoss-SMP: the Mozilla NSS root certificates that left
peppol-commonssave 160 KB, but the OASIS BDXR identifiers that phoss-SMP needs now arrive in the separatebdxr-idandedelivery-idJARs - The configuration property
webapp.security.login.errordetailsnow defaults tofalse, so that a failed login in the management GUI shows the same generic error message, no matter whether the login name is unknown, the password is wrong, or the user is deleted, disabled or lacks the required role. Previously it defaulted totruefor backwards compatibility, which allowed an unauthenticated user to find out whether a specific user exists. Set the property totrueexplicitly to get the previous behaviour back on a development or a troubleshooting installation. The detailed reason is still written to the audit log, so it stays available under Administration / Audit. See #564 - thx @RetarusEDI. - The session cookie (
JSESSIONID) now usesSameSite=Strictby default, so that a browser does not send it on cross-site requests. The value is configurable with the new configuration propertywebapp.session.cookie.samesite, that acceptsStrict,LaxandNone- an empty value leaves the attribute untouched, so that only theweb.xmlor the application server determine it. Because ofStrict, following a link from an external page into the management GUI now leads to the login page, as the session cookie is not sent with that request. IfNoneis used, the cookie must be marked asSecureas well, otherwise browsers reject it - a warning is logged on startup in that case. See #565. - The session cookie (
JSESSIONID) can now be marked with theSecureflag, so that a browser only sends it via https, using the new configuration propertywebapp.session.cookie.secure. Possible values aretrue,falseandauto, withautobeing the default: it enables the flag, ifsmp.publicurlis anhttpsURL, and leaves it untouched otherwise, so that installations that are only reachable via plain http - like a local development instance - keep working without any change. Only the explicit valuestrueandfalseoverrule an existing setting from theweb.xmlor from the application server. The flag is set on startup, before theServletContextis initialized, because the session cookie configuration is immutable afterwards. See #563. - (MongoDB) Added the indexes that were missing on the hot paths, as the counterpart of the SQL migration
V38. They are created on startup, like all the other MongoDB indexes:dtonsmp-audit, which grows unbounded and is only ever read sorted by date, so that reading it no longer needs a collection scan with an in-memory sort;sgid, doctypeidonsmp-serviceinfoand onsmp-redirectfor the Service Metadata lookup of the REST API, which is the most frequent query of an SMP at all;owneridonsmp-servicegroupfor the listing of the Service Groups of a single owner;emailonusersfor the login; andtokens.tokenonuser-tokensfor the resolution of a Bearer token, which happens on every token authenticated REST request. Onsmp-redirectandsmp-serviceinfothe Document Type is part of the index, so that the lookup by Service Group alone - used when a Service Group is deleted - can use it as well. The first startup after the upgrade can take noticeably longer if the audit collection is large, because the index is built then. - The Service Group select boxes of the pages Endpoints, Redirects, Business Cards and Participant Migration (outbound) now load their entries on demand via Ajax, in chunks of 25 entries, instead of rendering every Service Group into the HTML.
On an SMP with many Service Groups the affected pages took very long to load, or froze the browser altogether, because select2 had to ingest one
<option>per Service Group on initialisation. The entries are now queried, searched, sorted and paged by the backend, using the new methodsgetAllSMPServiceGroups (ESMPServiceGroupFilter, IPagingSpec, String),getSMPServiceGroupCount (ESMPServiceGroupFilter, String)andcontainsAnySMPServiceGroup (ESMPServiceGroupFilter)ofISMPServiceGroupManager. The newESMPServiceGroupFilterexpresses the page specific filters - "has no Business Card" and "has no Participant Migration that prevents a new one" - as part of the backend query, with aNOT EXISTSsub select for SQL and a$lookupfor MongoDB, so that they no longer need to read the whole table. (MongoDB) Two indexes are created for that on startup:sgidon the collectionsmp-businesscard, andpidas well asdirection, stateon the collectionsmp-participant-migration. The create forms now open on "(please select)" instead of silently preselecting the first Service Group. The classHCServiceGroupSelectis now a factory with the single methodcreateAjax (...); the previous methodcreate (...)and the eager select box were removed. Based on #548 - thx @vrbyjimmy. See #546. - (SQL) Added the new database migration
V38that creates the indexes that were missing on the hot paths, for MySQL, PostgreSQL, Oracle, DB2 and SQL Server. Created in all dialects areIX_smp_endpoint_tprofileonsmp_endpoint (transportProfile)for the transport profile usage check,IX_smp_pmigration_dir_stateonsmp_pmigration (direction, state)andIX_smp_pmigration_pidonsmp_pmigration (pid)for the listing and the deletion of participant migrations,IX_smp_audit_dtonsmp_audit (dt)andIX_smp_audit_useridonsmp_audit (userid)for the audit list, which is ordered by date and filtered by user and which grows unbounded, andIX_smp_secusertoken_useridonsmp_secusertoken (userid)for the resolution of a user token to its user.IX_smp_secuser_emailonsmp_secuser (email)is created for all dialects except DB2 and SQL Server,IX_smp_ownership_usernameonsmp_ownership (username)for all except MySQL,IX_smp_secuser_loginnameonsmp_secuser (loginname)for MySQL, PostgreSQL and Oracle,IX_smp_smr_participantonsmp_service_metadata_red (businessIdentifierScheme, businessIdentifier)for PostgreSQL, DB2 and SQL Server, andIX_smp_bce_pidonsmp_bce (pid)for PostgreSQL and Oracle - the remaining dialects already have these indexes sinceV1respectivelyV8. On MySQL the columnsloginnameandemailare of typeTEXT, so they are indexed by their first 191 characters. The indexes are created unconditionally - if you already created one of them manually, drop it before starting, because the migration fails otherwise. Based on #554 - thx @ismailbennani. - (SQL) Fixed the counting of the Business Cards on MySQL, which failed with a syntax error because the statement used
COUNT (DISTINCT pid), with a blank between the name of the function and the opening parenthesis. MySQL only accepts that blank if the SQL modeIGNORE_SPACEis enabled, which is not the default. The query therefore returned -1 on MySQL, so that the Business Cards page showed a wrong total number of entries, and the button Publish all Business Cards to the Directory was permanently disabled, because it is only enabled if the total count is positive. MySQL installations are affected since v8.4.0, because the server side pagination introduced there is what started to call the counting method. Based on #559 - thx @vrbyjimmy. - (SQL) A new block of IDs is now reserved atomically, so that several SMP instances sharing one database can no longer hand out the same IDs.
Previously the counter stored in the
smp_settingsentrylatest-idwas read with a plainSELECTand written back with an absoluteUPDATE, without any locking, so that two instances reading the counter at the same time reserved the identical block of 20 IDs. The lock of the ID factory only serializes the threads of a single JVM and can not help across instances. Affected were all IDs taken from the global ID factory - among them the business card entities, contacts and identifiers, the participant migrations and the SML information - which either ran into a primary key violation or overwrote an existing row. The new counter value is now written with a conditionalUPDATEthat only matches if the stored value is still the one that was read, and the whole reservation is retried in a new transaction if another instance was faster. Additionally a failed reservation now leads to an exception, instead of silently handing out the IDs of a block that was never persisted. - Added the new REST API
PUT /{ServiceGroupId}/services/{DocumentTypeId}/{ProcessId}that adds a single Endpoint to the referenced Process, as the additive counterpart ofPUT /{ServiceGroupId}/services/{DocumentTypeId}, which overwrites all existing Processes and Endpoints of a Document Type. The expected body is a singleEndpointelement, in the flavour of the configuredsmp.rest.type. The Service Information and the Process are created on the fly if they do not exist yet, so a Document Type can be built up Endpoint by Endpoint without ever reading and re-PUTing the whole Service Metadata. An Endpoint whose validity period overlaps that of an already existing Endpoint of the same Transport Profile is rejected with400, so the call can never silently replace an existing Endpoint. Redirects are not touched by this call. The new method issaveServiceRegistrationEndpoint (String, String, String, EndpointType, SMPAPICredentials)ofSMPServerAPI,BDXR1ServerAPIandBDXR2ServerAPI. The body is read with the new marshallersSmpEndpointMarshaller,Bdxr1EndpointMarshallerandBdxr2EndpointMarshallerof the new packagecom.helger.phoss.smp.jaxb. The Peppol SMP and the OASIS BDXR SMP v1 XSD declare no globalEndpointelement, so for these two the body is read without XML Schema validation and the name of the root element is checked explicitly instead - the OASIS BDXR SMP v2 Aggregate Components XSD does declare one, so there the body is validated against the schema.
v8.4.3 - 2026-09-10
- Added support for two-factor authentication (TOTP, RFC 6238) of the management GUI, based on the new library ph-totp 2.1.0.
Based on #547 - thx @vrbyjimmy.
See #295.
The feature is opt-in and disabled by default - it must be enabled with the new configuration property
smp.totp.enabled, and changing that property requires a restart. While it is disabled, the pages Administration / Two-factor authentication and Administration / Two-factor authentication of all users are not created at all, and existing enrollments are not enforced on login - they are retained though and become effective again as soon as the property is enabled. Each user enrolls individually via a QR code respectively the shared secret as text, and the enrollment only becomes active after it was confirmed with a code from the authenticator app. On confirmation 10 single-use recovery codes are shown once - only their SHA-512 hashes are stored - and a recovery code can be used instead of an authenticator code. Members of the Administrators user group can reset the second factor of a single user, for the case that both the authenticator device and the recovery codes were lost. A one-time password can only be used once, because the time slot it was generated for is remembered per user and is checked and stored atomically, and failed attempts are slowed down with an exponential backoff. The enrollments are stored in the configured backend - the new tablesmp_sectotpfor SQL (migrationV37), the collectionsmp-user-totpfor MongoDB and the filesmp-user-totp.xmlfor the XML backend. See the Security page for the details. - Added the new configuration property
smp.totp.enabledto enable the two-factor authentication of the management GUI. It defaults tofalse. - The Status API contains the new item
smp.totp.enabled, reflecting whether the two-factor authentication of the management GUI is enabled. - Failed validations of the second authentication factor are now throttled per user, via the
LoginThrottlePerIPof ph-oton, instead of per session. Previously the counter of the exponential backoff was kept in the session only, so that discarding the session cookie reset the delay and left the second factor effectively unthrottled. A dedicated throttle key is used - the user ID with the suffix-totp- so that it can neither be reset by rotating the source IP address, nor by the successful login that clears the throttle key of the first factor. Throttling per user is safe for the second factor, because it is only reached after the password was accepted. - Added the new configuration property
smp.totp.issuerto define the issuer shown in the authenticator app of a user. It identifies this SMP instance, so that several SMPs can be told apart in the same authenticator app. If it is not set, the application title is used, which is the previous behaviour.
v8.4.2 - 2026-09-06
- Updated to ph-oton 10.6.0, ph-db 8.5.0, ph-web 11.4.5, peppol-commons 12.10.0, peppol-shared-ui 0.10.2, phoss-directory 0.17.3, Flyway 13.5.0 and Jackson 3.2.2
- (SQL) The transaction boundaries of
DBExecutor.performInTransactionwere fixed in ph-db 8.5.0, so that every writing operation of the SQL backend is atomic now. Previously every statement executed inside a transaction committed the shared connection right after it was executed, so that a failure in the middle of a multi statement operation left the already executed part committed, and the intermediate states of a transaction became visible to concurrent readers on other connections. Commit and rollback now only happen at the outermost transaction boundary. Affected is every operation that executes more than one statement: merging Service Information deletes the previous one and then inserts the service metadata, one row per process and one row per endpoint - if one of these inserts failed, the delete stayed committed and the participant was left without any endpoint. Deleting Service Information (three deletes), creating a Service Group (the service group row and the ownership row) and creating or updating a Business Card (the previous one is deleted and one row per business entity is inserted) behaved the same way. The stricter rule that comes with the fix - a failed SQL operation or a failed nested transaction marks the whole transaction for rollback, even if the caller evaluates the returnedESuccessor the affected row count and continues - does not change the behaviour of the SMP, because all SQL managers throw on an unexpected number of affected rows instead of continuing. See ph-db issue #2 - thx @vinit-thummar - The SMP can now be traced and monitored via ph-telemetry, because ph-oton 10.6.0 and ph-db 8.5.0 emit spans and metrics through it.
No configuration property of the SMP is involved, and nothing is emitted as long as no telemetry implementation is registered - without an
ITelemetryTracerSPIrespectively anITelemetryMeterSPIall emission degrades to cheap no-ops, and the delivered SMP WAR contains none. To collect the data, addcom.helger.telemetry:ph-telemetry-oteland an OpenTelemetry SDK to a custom build, subclassOtelTelemetryTracerSPIandOtelTelemetryMeterSPIwith a no-argument constructor and register the subclasses viaMETA-INF/services. Covered are the REST API invocations - the spanphoton.api.invokeplus the instrumentsphoton.api.invocationsandphoton.api.duration, where the metric dimension is the path template like/{ServiceGroupId}/services/{DocumentTypeId}and never the concrete participant ID, the rendering of the UI pages, the AJAX functions including the server side DataTables processing introduced in v8.4.0, the logins, the logouts and the failed login throttling, the asynchronous tasks of thePhotonWorkerPool- which is where the automatic Directory updates run since v8.4.0 -, the audit trail, the internal errors and the CSRF checks. For the SQL backend additionally every executed statement, every transaction and every connection acquisition (db.client.operation.duration,phdb.jdbc.statements,phdb.jdbc.transactions,phdb.jdbc.connections,phdb.jdbc.connections.activeandphdb.jdbc.connection.acquire.duration) as well as the Flyway migration run performed at startup are covered. No user ID, no login name, no IP address, no search text and no SQL parameter value is ever used as a metric dimension. - peppol-commons 12.10.0 no longer depends on Bouncy Castle, because the provider neutral
ph-securityof ph-commons 12.4.0 is sufficient to load the Peppol trust stores. This does not affect the SMP - Bouncy Castle is still on the class path viaph-xmldsig, so aBCFKSkeystore or truststore (smp.keystore.typerespectivelysmp.truststore.type) keeps working as before. - ph-web 11.4.5 caches the system default trust store - the JRE
cacertsrespectively the one named byjavax.net.ssl.trustStore- in memory, instead of loading it again for every created HTTP client that has certificate revocation checking enabled. The cache is invalidated automatically if the path, the type, the password, the file modification date or the file size of the trust store changes. - The generic parts of the server side pagination introduced in v8.4.0 were extracted into ph-oton 10.6.0 -
ITableColumn,SortColumnandTableColumnHelperin the new packagecom.helger.photon.core.pagingas well asDataTablesOnDemandHelperin ph-oton-datatables - and the SMP uses them now. The SMP classesSMPSortColumn,SMPTableColumnHelperandSMPDataTablesOnDemandwere therefore removed, andISMPTableColumnextendsITableColumnand only adds the mapping onto the SQL columns and the MongoDB fields. The column enums of the domain objects - likeESMPServiceGroupColumn- follow the ph-oton contract now:getValueProvider ()was replaced bygetSearchValueProvider (), which returnsnullif the column is not searchable, and bygetComparator (), which returnsnullif the column is not sortable, so thatisSearchable ()andisSortable ()are derived from them instead of being declared separately. This is an API change only - the paging, sorting and searching behave exactly as before. x v8.4.1 - 2026-09-04 - (SQL) Fixed that the SMP did not start up if a database migration alters the audit table
smp_audititself - as the new migrationV36of v8.4.0 does. The audit itemsql-migration-successis written from the FlywayAFTER_EACH_MIGRATEcallback, which runs inside the still open transaction of the migration, whereas theINSERTof the audit item uses its own connection - so the insert waited for the table lock held by exactly that transaction, and the transaction waited for the callback to return. The audit item is therefore now written asynchronously, so that the migration can commit and release the lock. This was reported for PostgreSQL. Based on #544 - thx @vrbyjimmy. See #543. - (SQL) Fixed that the global search of the Business Card list did not find Business Cards with multilingual names.
An entity with a single unlabelled name is stored in the column
name, whereas an entity with multiple names or with a language labelled name is stored in the JSON columnnamesand leavesnameempty - andESMPBusinessCardColumn.NAMEonly searched the former. It now searches both columns, so that the SQL backend finds the same Business Cards as the XML and the MongoDB backend, which already searched all entity names. Based on #542 - thx @vinit-thummar - (MongoDB) Fixed that the case insensitive lookup of a user by email address also matched substrings, so that e.g.
[email protected]returned the user with the email address[email protected]. The regular expression used for the comparison is now anchored at both ends, so thatUserManagerMongoDB.getUserOfEmailAddressIgnoreCase (String)requires an exact match, as the XML and the SQL user manager do. Based on #541 - thx @vinit-thummar
v8.4.0 - 2026-09-04
- Updated to the MongoDB driver 5.11.0
- Updated to ph-oton 10.5.0, ph-oton-bootstrap5 0.9.4, peppol-shared-ui 0.10.1 and phoss-directory 0.17.1
- (SQL, MongoDB) Added server side pagination, sorting and searching for the lists of Service Groups, Endpoints, Redirects, Business Cards and Participant Migrations, so that a large SMP no longer sends all rows to the browser and no longer loads all entities into memory to render a single page.
Based on #526 - thx @vrbyjimmy - with a reworked API.
See #525 and #535.
The paged manager methods take a single
IPagingSpecparameter (start index, maximum count and the fields to sort by; new in ph-commons 12.4.0) plus the search text, instead of positional index and count parameters, so that the API does not need to be extended for every additional paging or sorting aspect. - Added the new interface
ISMPTableColumnand one implementing enum per domain object -ESMPServiceGroupColumn,ESMPServiceInformationColumn,ESMPRedirectColumn,ESMPBusinessCardColumnandESMPParticipantMigrationColumn. Such a column ties the column shown in the UI to the SQL columns, to the MongoDB fields and to an in-memoryComparator, so that the four cannot drift apart, and it declares whether the column may be sorted and whether the global search covers it. The column ID is the field name used in a sort field, and it is the only field name a client may refer to: unknown or non-sortable field names are ignored instead of being passed on, so that a forged sort field can never reach the SQL statement. If no sort field remains, the first column of the enum is used, so that consecutive page requests return disjunct results.SMPTableColumnHelpercontains the backend independent resolution and the in-memory implementation, which is the reference behaviour all native backend implementations comply to. - The four paged list pages - the secure Service Groups, Endpoints, Redirects and Business Cards lists - now use the DataTables server side mode
ON_DEMANDof ph-oton 10.4.0, so that the paging, the sorting and the search field of DataTables itself drive the server side query. Previously every DataTables kept a rendered copy of the whole table in the session (modePRERENDERED), and the client side sorting therefore only sorted the rows of the currently displayed page. Now every AJAX request queries only the rows of the requested page from the respective manager, and nothing is kept in the session. Each page registers its own AJAX function - via the new classSMPDataTablesOnDemand- that renders the rows of one page. The name of a sortable table column is the ID of the respectiveISMPTableColumn, so that the column the user clicks is resolved onto the SQL column respectively the MongoDB field. Columns that are derived or that live in child entities - like the number of endpoints of a Service Group or the process ID of an endpoint - are marked as not orderable. Note that on the Endpoints and the Business Cards page the paging happens on Service Information respectively Business Card level, whereas a single row represents a single endpoint respectively a single business entity - so a page may contain more rows than the selected page size. -
Incompatible change: the public start page no longer lists the participants managed by this SMP.
It contains a static description of this SMP instead - what an SMP is, that the data is served via the SMP REST API and that phoss SMP is an Open Source solution, including the links to the MPL 2.0 and the Apache 2.0 license - so that it is rendered without a single backend query, no matter how many participants the SMP manages.
The link to the source code is only shown if
webapp.public.showsourceis enabled, as in the footer. The configuration propertieswebapp.startpage.dynamictable,webapp.startpage.participants.noneandwebapp.startpage.extensions.showwere removed accordingly, as were the methodsSMPWebAppConfiguration.isStartPageDynamicTable (),isStartPageParticipantsNone ()andisStartPageExtensionsShow (). - The Endpoint Tree page is now paged as well and shows 20 service groups per page by default.
Previously it loaded every service group and every service information into memory to render the page, which is why the "Tree view" button was hidden for SMPs with more than 1000 service groups - that limit is gone again.
A tree is not a DataTables, so the paging is driven by the server side pagination bar of the new class
SMPPaginationinstead. It mirrors the layout of a DataTables - the page size selector and the search field above the content, the information on the shown entries and the page links below it - but it is built from plain links and a GET form only, because the Content Security Policy of the application does not allow inline event handlers. The page index, the page size and the search text are request parameters, so that a single page of the tree can be bookmarked. The service information is queried per service group of the current page, instead of in one full scan. - The details view of a Service Group now also shows all Document Types, Processes and Endpoints as well as all Redirects assigned to it - previously it only showed the participant ID, the owner, the extension, the custom properties and the Business Card, so that the assigned endpoints had to be looked up on the Endpoint Tree page. The endpoints are shown as the same tree as on the Endpoint Tree page, including the transport profile, the validity and the endpoint reference of every endpoint. Every Document Type carries the link to perform an SMP query on it, and every endpoint and every redirect links to its own details page. Only the service information and the redirects of the shown service group are queried, so that the effort of the page does not depend on the size of the SMP.
- (SQL) Fixed that the SQL backend created a paged query without any
ORDER BYclause, if the request did not contain an explicit sort order - as it is the case for the initial request of a page. The rows of a page were therefore returned in an undefined order, so that consecutive pages could overlap or lose rows. - Added the new method
ISMPTableColumn.getDefaultSortOrder (), so that the default order of a domain object is declared explicitly instead of being implied by the first column of the enum. All columns with a non-nullsort order form the default order together, in their declaration order, which is how a composite key is expressed - Redirects and Endpoints e.g. sort by service group and then by document type, exactly as the hand written SQL did before the server side paging was introduced. The default order is used by all three backends whenever a client requests no order, or only unknown respectively non-sortable ones - seeSMPTableColumnHelper.getAllDefaultSortColumns (...)andgetAllDefaultSortFields (...); for the SQL backend it is passed on toDBPagingHelperof ph-db 8.4.3. It is also the initial order of the DataTables of the respective page, which is derived from the very same declaration bySMPDataTablesOnDemand.createDataTables (...), so that the order shown in the UI and the order the backend falls back to cannot drift apart. - (SQl, MongoDB) The SQL and the MongoDB backend now also apply the search natively, instead of falling back to loading all entities into memory.
The search text is always passed as a prepared statement parameter respectively as a quoted regular expression, and
LIKEwildcards (%and_) contained in the search text are escaped, so that they are matched literally. AddedSMPJDBCQueryHelper(SQL) andSMPMongoQueryHelper(MongoDB) for that; the database specificORDER BYandLIMIT/OFFSETrendering comes from ph-db 8.4.2. The XML backend uses the newgetAllPaged (...)of the ph-commons map based DAO. -
Incompatible change: the manager methods
getAllSMPServiceGroups (int, int),getAllSMPServiceGroups (String, int, int)and their counterparts for Service Information, Redirects and Business Cards were replaced by a singlegetAll... (IPagingSpec, String). The staticisMatchingSearchText (...)methods of the four manager interfaces and the classesSMPPagingHelperandSMPJDBCPagingHelperwere removed - their behaviour now lives inISMPTableColumnrespectively in ph-commons and ph-db. - The name of a Service Group export file now contains a random UUID next to the creation date and time, so that two exports created within the same second no longer overwrite each other.
The created name is additionally passed through
FilenameHelper.getAsSecureValidASCIIFilename (String), so that it is a valid filename on all platforms. Based on #536 - thx @vinit-thummar - Added the new backend aware readiness endpoint
/smp-readynext to the existing liveness endpoint/ping. It answers HTTP 200 with{"ready":true}if the configured backend can currently serve requests, and HTTP 503 with{"ready":false}if it cannot, so that a KubernetesreadinessProbestops routing traffic to a pod whose database is unavailable, without the restart loop alivenessProbewould cause. The endpoint deliberately returns nothing but the boolean - the diagnostic details stay in/smp-status. Based on #537 - thx @vinit-thummar. See #529. Added the new classesSMPReadyServlet,SMPReadyXServletHandlerandSMPReadyProvideras well as the new SPI interfaceISMPReadyProviderExtensionSPI. Every backend provides exactly one implementation of it -SMPXMLReadyProviderExtensionSPI(always ready),SMPSQLReadyProviderExtensionSPIandSMPMongoDBReadyProviderExtensionSPI. If no implementation is found at all, the SMP reports itself as not ready, so that a backend missing its readiness check cannot be mistaken for a healthy one. The readiness checks run with a time limit, configurable via the new configuration propertysmp.ready.timeout(default 2 seconds), because a readiness request must never block an HTTP thread indefinitely. Without it a silently unreachable database - one that keeps the TCP connection open but answers nothing - blocksDataSource.getConnection()forever, well beyondjdbc.pooling.max-wait. Added the new methodSMPServerConfiguration.getReadyTimeout (). - Added the new methods
SMPDataSourceSingleton.isDBConnectionPossible ()andSMPDataSourceSingleton.isDBConnectionPossible (int)and the new constantSMPDataSourceSingleton.DEFAULT_CONNECTION_VALIDATION_TIMEOUT_SECONDS. They replace the internal database check ofSMPSQLStatusProviderExtensionSPIand additionally validate the received connection, because the connection pool hands out pooled connections unvalidated as long asjdbc.pooling.test-on-borrowis disabled - which is the default. The status itemsmp.sql.db.connection-possibletherefore now also detects a database that died after the connection was pooled. - The automatic update of the Directory is now performed asynchronously in the
PhotonWorkerPool, so that a slow or an unreachable Directory no longer blocks the SMP request that triggered the update. That affects creating and updating a Business Card, deleting a Business Card - including the deletion caused by deleting a Service Group - as well as creating, updating and deleting Service Information of a participant that has a Business Card. See #481 - thx @wartab. The SMP settings and the Directory client are still resolved in the calling thread, so that the background task requires no open request scope, and the "add" and the "delete" call of a Business Card deletion are performed in a single task, so that their order is maintained. The outcome of the Directory call is therefore no longer part of the HTTP response respectively of the UI feedback - as before it is written to the log file. The explicit push actions stay synchronous, because reporting the outcome of the push is their sole purpose: the REST APIPUT /businesscard/{ServiceGroupId}/pushand the "Update Business Card in " action of the Business Card page. The "Update all participants in Directory" action was already running in the background before. Additionally, if the automatic update is enabled but no Directory host name is configured, a warning is logged instead of failing with aNullPointerException. - Added the new database migration
V36for the SQL backend. It changes the columnscreationuserid,lastmoduseridanddeleteuseridof the tablessmp_secrole,smp_secuser,smp_secusergroupandsmp_secusertokenas well as the columnuseridof the tablesmp_auditfromvarchar(20)tovarchar(45), for MySQL, PostgreSQL, Oracle, DB2 and SQL Server. All user IDs are limited to 45 characters now, so that a user ID created byGlobalIDFactory- which may be up toGlobalIDFactory.STRING_ID_MAX_LENGTH(40) characters long - fits into every column referring to a user. Previously only theidcolumns of the security tables werevarchar(45), whereas the columns referring to the creating, the modifying and the deleting user as well as the executing user of an audit item werevarchar(20). Only the length of the columns is changed - no column is added, removed or renamed, and the nullability stays as it was, so existing data is preserved. See the Migrations page for details. - REST API requests that authenticate via HTTP Basic Auth or a Bearer token are now recorded in the audit log with the ID of the authenticated user.
Previously they were recorded as
$GUEST$, because a REST request is deliberately not logged into a UI session and the audit therefore saw no current user at all. Based on #538 - thx @vinit-thummar. See #238. After the credentials were validated successfully,SMPUserManagerPhoton.validateUserCredentials (...)remembers the user ID in the new ph-oton 10.5.0 classRequestUserIDProvider, which keeps it in the request scope only. A REST request therefore still creates no HTTP session, and the remembered user ID can neither leak into a subsequent request nor replace the session user of an existing UI login. The MongoDB audit manager now resolves the current user viaGlobalUserIDProvider.getCurrentUserID (), which prefers the request user over the session user of theLoggedInUserManager. The XML and the SQL backend use the ph-oton default provider, which behaves the same way. Added the testsSMPAPIUserIDTest- covering Basic Auth, Bearer token, invalid credentials, that no session is created and that the identity does not leak into the next request - andAuditUserInterfaceTest, which performs real authenticated HTTP requests against the SQL backend and verifies the persisted audit rows.
v8.3.0 - 2026-08-30
- Updated to Flyway 13.4.0
- Updated to the MongoDB driver 5.10.0
- Updated to protobuf 4.36.0
- Updated to ph-commons 12.4.0, ph-oton 10.4.0 and ph-oton-bootstrap5 0.9.3
- Improved the Content Security Policy of the management UI.
Removed
'self'fromscript-src, because with'strict-dynamic'present all host and scheme sources are ignored by the browser anyway, and removed it fromstyle-src-attr, where only'unsafe-inline'and hashes are meaningful. Both were inert and only implied a fallback that does not exist. Addedbase-uri 'self',form-action 'self',frame-ancestors 'none'andobject-src 'none'. Note thatform-actionandframe-ancestorsdo not fall back todefault-src, so they were previously not set at all. - The CSP violation reporting now also uses the Reporting API next to the deprecated
report-uri: the policy contains areport-todirective and the newReporting-EndpointsHTTP response header names the very same endpoint. The report URI now carries the menu item ID of the page and the SMP build version as query parameters, so that a report can be attributed to a page without having to guess from the report body. Both values are non-sensitive - the policy is readable by everybody loading the page and is echoed back in every report. Reports that are caused by browser internal code or by browser extensions - recognizable by a "source-file" that is not anhttp(s)URL - are now classified as noise. They are still logged, but no longer raise an internal error, so that real violations are not drowned out any more. - (SQL) Added the new database migration
V35that adds the nullable columnjob_type varchar(100)and the indexIX_smp_long_running_job_jtto the tablesmp_long_running_job, for MySQL, PostgreSQL, Oracle, DB2 and SQL Server. The column is written by theLongRunningJobResultManagerJDBCof ph-oton 10.4.0 - without it, storing a long running job result fails. Job results created before this version keep an empty job type and therefore never match a job type filter - Fixed that in the public URL mode
forwarded-headera non-default port contained in thehostparameter of theForwardedHTTP header was dropped from all created URLs, because the port number was taken from the wrong offset of the host value. Additionally IPv6 host literals like[2001:db8::1]:8443are now split into host and port correctly. See #514 - thx @vinit-thummar - Fixed that in the public URL mode
x-forwarded-headerthe port of the incoming request was never used as a fallback, because the internal fallback flag was initialized tofalseand could never becometrue. If none of theX-Forwarded-*HTTP headers is present, the port of the incoming request is used again - previously the port was dropped from all created URLs in that case. If at least one ofX-Forwarded-ProtoorX-Forwarded-Hostis present, butX-Forwarded-Portis not, the default port of the scheme is still used. See #518 - thx @vinit-thummar - Fixed that in the public URL mode
x-forwarded-headerthe port was contained twice in all created URLs (as inhttps://example.com:8443:8443/...), if theX-Forwarded-HostHTTP header already contained a port and theX-Forwarded-PortHTTP header was present as well. An optional port is now split off theX-Forwarded-Hostvalue before the URL is created - taking bracketed IPv6 literals like[::1]:8443into account. TheX-Forwarded-Portheader still takes precedence; if it is absent, the port contained inX-Forwarded-Hostis used instead of the default port of the scheme. See #528 - thx @vinit-thummar - The relaxed SML hostname verification (accepting all TLS hostnames) is now only applied, if the host of the SML management service URL is exactly
localhostor127.0.0.1. Previously a substring check on the whole URL was performed, so that e.g.https://localhost.example.org/...,https://[email protected]/...orhttps://example.org//localhostalso disabled the TLS hostname verification. See #522 - thx @vinit-thummar - The
Bearerscheme of the REST APIAuthorizationHTTP header is now matched case-insensitively (e.g.bearerorBEARER), because HTTP authentication schemes are case-insensitive according to RFC 9110 section 11.1. The token value itself is used unchanged. See #521 - thx @vinit-thummar - Fixed that the Font Awesome 6 icon resources were not registered on the public start page and on the secure pages "Business Cards", "Endpoints" (List and Tree view), "Redirects" and "Service Groups", so that the respective icons were not displayed. This was a leftover of the Bootstrap 5 migration of v8.2.0
- Only a single Service Group export can run at a time now.
Previously every click on the "Export" button in the management UI, and every call of the REST APIs
GET /exchange/export/all/xml/v1andGET /exchange/export/byowner/{UserId}/xml/v1, started another full export - several parallel exports of a large SMP could exhaust the heap and render the server unresponsive. A second export is now rejected: the REST API returns HTTP 503 (Service Unavailable) with aRetry-AfterHTTP header, and the management UI disables the button and shows since when the running export is active. The export of a single Service Group (GET /exchange/export/specific/{ServiceGroupId}/xml/v1) and the outbound migration export are not affected, because their size is bounded. The lock is the new ph-oton classSingleRunLock, exposed asServiceGroupExportJob.LOCK. Added the new exception classSMPServiceUnavailableException. See #525 - thx @basileHalaweh - The Service Group export data is no longer built as a single in-memory XML document.
It is now serialized Service Group by Service Group, so that the memory consumption no longer depends on the total number of exported Service Groups.
The created XML is unchanged.
Added the new method
ServiceGroupExport.createExportDataXMLVer10 (ICommonsList, boolean, OutputStream), the new constantServiceGroupExport.XML_WRITER_SETTINGSand the new methodServiceGroupExport.getExportMimeType (). See #525 - thx @basileHalaweh - The Service Group export of the management UI is now executed as a background job instead of being a direct download.
Clicking "Export all Service Groups" returns immediately, the export is written to a file in the new directory
servicegroup-exportbelow the configuredwebapp.datapath, and neither an HTTP thread nor the created data is held for the duration of the export. The state and the result of the export are visible on the new ph-oton page "Administration / Application Information / Long running jobs", from where finished results can also be deleted. Added the new classServiceGroupExportJob. Note: the REST export APIs are unchanged and still return the export data directly in the HTTP response. See #525 - thx @basileHalaweh - Added the new secure page "Service Groups / Export data" that lists the previously created Service Group exports and allows to download them.
The download is addressed by the ID of the long running job that created the export - never by a file name or a path.
The resolved file must additionally be an existing regular file located directly in the
servicegroup-exportdirectory and follow the export file naming, so that no other file of the server can be retrieved through this page. The check is done on the canonical paths, so..path elements and symbolic links cannot be used to escape the export directory. Added the new methodServiceGroupExportJob.getValidExportFile (File)and the new menu item IDCMenuSecure.MENU_SERVICE_GROUPS_EXPORT_DATA. See #525 - thx @basileHalaweh - Created Service Group export files are now deleted after a configurable retention period.
The new configuration property
smp.export.retention.daysdefaults to30days;0or a negative value keeps the files forever. Outdated files - and the long running job results referring to them - are removed by a new scheduled job that runs once a day at 02:00, and additionally whenever a new export is started. Added the new classServiceGroupExportPurgeJob, the new methodServiceGroupExportJob.purgeOldExportFiles ()and the new methodSMPServerConfiguration.getExportRetentionDays (). This is the first scheduled job of phoss SMP - it shows up on the page "Administration / Application Information / Scheduled Actions". See #525 - thx @basileHalaweh - Fixed that the Service Group Import logged the failure to create a Redirect as a "success" entry of the import summary, so that the message "Error creating the new Redirect" showed up among the successful actions. The error counter was incremented correctly all the time. Additionally the Service Group Export now logs "Now exporting Business Cards" instead of the misleading "Now exporting business groups". See #532 - thx @vinit-thummar
- (SQL) Fixed that
ISMPBusinessCardManager.containsSMPBusinessCardOfID (...)returnedfalsefor every Business Card that has more than one business entity, because the number of rows of the tablesmp_bce- which holds one row per business entity - was compared to exactly1instead of being checked for at least1. As a consequence the REST APIPOST /businesscard/{ServiceGroupId}/pushrejected such a participant with "has no BusinessCard on this SMP", and - if the Directory integration with automatic update is enabled - the Directory was not informed when a Service Information of such a participant was created or changed. See #531 - thx @vinit-thummar - Fixed that the action "Update all Business Cards in the Directory" could be started an arbitrary number of times in parallel, because only a hint was shown but the button was never disabled.
Only a single push may run at a time now, guarded by the same
SingleRunLockclass. - Fixed that the bulk changes of the endpoint certificate ("Endpoints / Change Certificate") and of the endpoint URL ("Endpoints / Change URL") could be started an arbitrary number of times in parallel.
Both write to all matching endpoints, so parallel runs could interfere with each other.
Only a single bulk change of each kind may run at a time now, guarded by
SingleRunLockas well. - (MongoDB) Fixed that replacing an existing Service Information with a different object instance (as done by the REST API) invoked the
onSMPServiceInformationCreatedcallback instead ofonSMPServiceInformationUpdated. This now matches the behaviour of the XML backend. See #519 - thx @vinit-thummar - (MongoDB) Fixed that
ISMPServiceGroupManager.getAllSMPServiceGroupIDs ()returned the owner IDs instead of the Service Group IDs, because the wrong BSON field (owneridinstead ofid) was read. This affected the REST APIGET /servicegroupids/all, the Service Group Import (UI and REST APIPUT /exchange/import/xml/v1/{UserId}) and the pages "Endpoints (Tree view)" and "Tasks/Problems" in the management UI. See #524 - thx @vinit-thummar - (MongoDB) Fixed that updating a Transport Profile stored the deprecation flag in the obsolete BSON field
deprecatedinstead of the fieldstateused since v6.0.7, so that a changed state was silently lost when the Transport Profile was read again. Reading still falls back to thedeprecatedfield, if nostatefield is present, so that data written by older versions is still interpreted correctly. See #524 - thx @vinit-thummar - (MongoDB) Fixed that the audit entries created when deleting a Transport Profile used the object type
smpredirectinstead ofsmp.transport.profile. See #523 - thx @vinit-thummar - (MongoDB) Fixed that security operations that don't change anything reported
EChange.CHANGEDinstead ofEChange.UNCHANGED, because the last-modification fields were always written and therefore MongoDB always reported a modified document. This affected deleting an already deleted object, undeleting a non-deleted object, assigning a User or a Role to a User Group it is already assigned to, and unassigning a User or a Role that is not assigned. Besides the wrong return value, the modification metadata was rewritten and the success callbacks were invoked for these no-ops. The behaviour now matches the XML and SQL backends. Added the new protected methodAbstractBusinessObjectManagerMongoDB.genericUpdateOne (String, Bson, Bson)taking an additional filter, so that each state transition stays atomic. See #530 - thx @vinit-thummar - (MongoDB) Added
LongRunningJobResultManagerMongoDB.deleteResult (String)andforEachJobResult (String, Consumer), implementing the new methods of the ph-oton interfaceILongRunningJobResultManager. The job type of a long running job is now stored in the new BSON fieldjob_type(incl. an index on it), so that job results can be queried per job type. Documents written by previous versions have nojob_typefield and therefore never match a job type filter - they are still returned when querying without a filter. - (MongoDB) The endpoint usage evaluation of the Endpoint "Change URL" and "Change Certificate" pages now happens inside MongoDB.
getEndpointCount (),getEndpointURLUsageMap ()andgetEndpointCertificateUsageMap ()use an aggregation pipeline that unwinds all endpoints and groups them, so that only a scalar count respectively one small document per group is transferred, instead of transferring and deserializing every complete Service Information document - including the unrelated process, description, contact and extension data - into Java. Based on #533 - thx @vinit-thummar. See #333. The URL filtering and the certificate normalization are unchanged: the grouping happens on the stored certificate, and the different spellings of one certificate - with and without PEM header - are merged afterwards, as before. The two grouping pipelines allow disk usage, so that a large SMP no longer risks an out of memory error in the SMP itself; the spilling happens in the MongoDB server instead. Note that MongoDB Atlas shared tier clusters (M0, M2 and M5) may not support that option. Note that the Endpoint list page still reads all Service Information objects, so #333 is only partially solved by this. - (MongoDB) The collection
smp-serviceinfonow creates the indexesid,sgid,processes.endpoints.endpointreferenceandprocesses.endpoints.transportprofileon startup, as all the other MongoDB managers already did for their ID field. Next to the endpoint queries, the index onidalso speeds upupdateAllEndpointURLs (...)andupdateAllEndpointCertificates (...), which replace the matching documents by ID one by one. - Added the new method
EndpointUsageInfo.addForServiceGroupID (String, int)as the bulk version ofincrementForServiceGroupID (String), so that a backend that lets the database do the counting does not need to increment one endpoint at a time.incrementForServiceGroupID (String)is unchanged and now delegates to it. - Added the new constant
AbstractManagerMongoDB.BSON_MONGO_IDfor the MongoDB internal_idfield, because the MongoDB Java driver has no public constant for it - the only one it has is package private. - (Docker) The discarded first build stage of the
Dockerfile-release-binary-*files no longer runsapt-get upgradeand installs onlyca-certificates,wgetandunzipwith--no-install-recommends. The runtime image staystomcat:10.1-jre25. See #517 - thx @gregjotau - (Docker) The Docker README now mentions, that the SQL image contains the JDBC drivers of all supported databases (roughly 20 MB in
WEB-INF/lib) and that the unused drivers may be deleted in downstream images - (CI) The GitHub Actions build matrix now also builds with Java 26 (in addition to Java 17, 21 and 25). The Java source and target compatibility remains at Java 17. See #516 - thx @gregjotau
- (Development) The
JettyStopSMPSERVER_*classes now use the stop port 1090 instead of 8090, so that they match the stop port used by the respectiveRunInJettySMPSERVER_*classes. See #513 - thx @vinit-thummar
v8.2.0 - 2026-08-20
- The management UI was migrated from Bootstrap 4 to Bootstrap 5 (5.3.8), using the new
ph-oton-bootstrap50.9.2 library instead ofph-oton-bootstrap410.2.0. This is a change of the UI layer only - neither the REST API, nor the data models, nor the semantics of any configuration property were changed by it. Note: if you use the configuration propertywebapp.imprint.cssclasses, the values must now be Bootstrap 5 CSS class names - e.g.badge text-bg-primaryinstead of the Bootstrap 4badge badge-primary. See Configuration for details. See #511 - The REST API no longer reveals whether a specific user exists or not, when the authentication fails.
All authentication failures (unknown user, deleted user, invalid password, disabled user, unknown or deleted Bearer token) can now return the same generic error message, controlled by the new configuration property
smp.rest.auth.errordetails. For backwards compatibility it defaults totrue(detailed messages) - for security reasons it should be set tofalse. The detailed reason is always logged on the server, independent of this setting. Added the new constantSMPUserManagerPhoton.MSG_AUTH_FAILEDand the new constructorSMPUnknownUserException (String, String)taking an explicit error message. See #510 - thx @jehon - Bearer tokens are no longer written to the log file and are no longer part of the HTTP error responses of failed REST API authentications - only a shortened representation is used
- Fixed that
ISMPProcess.getEndpointCount ()returned the number of used Transport Profiles instead of the total number of contained Endpoints. If a Process contained multiple Endpoints with the same Transport Profile, the returned count was too low. See #498 - thx @gregjotau - Fixed that
ISMPProcess.getAllEndpointsOfTransportProfile (...)returnednullinstead of an empty list, if the provided Transport Profile ID wasnullor empty, violating the non-null contract of the method. See #499 - thx @gregjotau - Fixed that in the public URL mode
forwarded-headera syntactically invalidForwardedHTTP header value led to aNullPointerExceptioninstead of falling back to the data of the incoming request. - (Docker) All maintained Docker images now use
tomcat:10.1-jdk25as the runtime baseline (was JDK 21). The Java source and target compatibility remains at Java 17. See #496 - thx @gregjotau - (Docker) Fixed the build stage of
Dockerfile-release-from-source-xmlthat still used an obsolete Java 11 based toolchain - it now usesmaven:3.9-eclipse-temurin-17. See #497 - thx @gregjotau - (Docker) Fixed that
CATALINA_OPTSwas appended to before it was initialized, leading to a build warning and to the loss of the entropy option when the memory options were added. See #500 - thx @gregjotau - (Docker) All Docker images that don't compile Java inside the container now use the JRE-only
tomcat:10.1-jre25runtime baseline instead oftomcat:10.1-jdk25, making the images roughly 20% smaller. Only theDockerfile-snapshot-from-source-*files, that build phoss SMP from source inside the image, keep the JDK based baseline. See #508 - thx @gregjotau - (Docker) The build stage of
Dockerfile-release-from-source-xmlnow usesmaven:3.9-eclipse-temurin-25instead ofmaven:3.9-eclipse-temurin-17. The Java source and target compatibility remains at Java 17.
v8.1.8 - 2026-08-06
- Added a new REST API endpoint
DELETE /{ServiceGroupId}/services/{DocumentTypeId}/{ProcessId}to delete a single Process (with all its Endpoints) from a Service Metadata, without having to read-modify-PUT the whole Service Metadata. It is available for all three REST types (Peppol, BDXR v1, BDXR v2). See #491 - The SML timeout configuration properties now accept the duration grammar (e.g.
5s,1m 30s) via the new keyssml.connection.timeoutandsml.request.timeout. The legacy millisecond-typed keyssml.connection.timeout.msandsml.request.timeout.msremain supported for backwards compatibility but are deprecated for removal; a deprecation warning is now logged only once per key when they are used. - Changed the bundled default configuration to use
jdbc.execution-time-warning = 5sinstead of the deprecatedjdbc.execution-time-warning.ms = 5000, so the SQL backend no longer logs a deprecation warning on every request. See #492 - (SQL) Fixed that changing the SMP settings in the UI did not invoke the registered SMP settings change callbacks. As a consequence, a changed Directory hostname was stored in the database but the already created Directory client kept using the old URL until the application was restarted. See #495
v8.1.7 - 2026-06-25
- Updated to peppol-commons 12.5.3
- Updated to ph-commons 12.3.0
- Updated to Flyway 12.9.0
- Updated to Jackson 3.2.0
- Added support for the new
dbnalliancevalue of the configuration propertysmp.identifiertype, which activates theDBNAllianceIdentifierFactoryavailable via the newESMPIdentifierType.DBNALLIANCEenum constant (via peppol-commons 12.5.2). It behaves likebdxr2but treats Document Type and Process Identifiers as case insensitive regardless of the scheme. - (SQL) Replaced the third-party
net.jodah:expiringmapdependency with theManualCachefrom ph-commons for the internal Service Group cache - Switched the internal UI caches (Owner Name and Transport Profile) to the new ph-commons
ProviderCacheAPI - (MongoDB) An auto-generated SMP endpoint ID (created on read for endpoints stored before 8.1.2, which had no endpoint ID) is now persisted back to the database, so it is stable across reads instead of being regenerated on each access
v8.1.6 - 2026-05-29
- Updated to peppol-commons 12.5.0
- Updated to ph-schedule 6.1.1 - the internal scheduler thread no longer dies silently on
Errors likeOutOfMemoryError, and a previously possible 100% CPU busy spin on external interruption was fixed - Updated to ph-web 11.4.1 - the HTTP proxy is now activated by the presence of
http.proxy.hostandhttp.proxy.port;http.proxy.enabledonly acts as an explicit kill-switch when set tofalse - Updated to ph-oton 10.2.3 - the default password hash algorithm for new users was changed to
PBKDF2_SHA256_100000_48 - (SQL) Updated the PostgreSQL JDBC driver to 42.7.11
- (SQL) Updated to ph-db 8.4.0 - Flyway 12.6.2 is included
- Fixed a potential NPE when invalid Participant Identifiers are present in the data store
- Added specific UI error handlers on the public start page and the secure Service Group page to avoid showing the generic Internal Error UI
- Tightened endpoint validation: the Endpoint Reference URL in Peppol mode may no longer be empty
- Fixed a potential NPE if a Business Card uses an invalid country code
- Removed the Peppol G2 certificates from the default
PeppolTrustedCAobjects (via peppol-commons 12.4.3) - Hardened the CRL download path: connect timeout 10s and read timeout 60s are now applied (was unbounded).
Added an optional
CRLAllowListto mitigate SSRF against attacker-controlled certificate URLs (via ph-commons 12.2.4) - Certificate revocation checks no longer return
REVOKEDwhen the CRL distribution point is unreachable - a newREVOCATION_STATUS_UNKNOWNresult is reported instead, so valid certificates are no longer blocked during a CRL endpoint outage (via ph-commons 12.2.4) - HTTP timeout configuration properties (
http.retry.interval,http.timeout.connectionrequest,http.timeout.connect,http.timeout.response) now accept duration grammar (e.g.21s,34m,2h,2d 5m 23ms). The per-unit-suffix variants (.millis,.seconds,.minutes,.hours) are still read but now log a deprecation warning when used (via ph-web 11.4.0) - (SQL) The JDBC connection pool configuration properties (
jdbc.pooling.max-wait,jdbc.pooling.between-evictions-runs,jdbc.pooling.min-evictable-idle,jdbc.pooling.remove-abandoned-timeout,jdbc.execution-time-warning) now accept duration grammar (e.g.5s,2m,1h 30m). The legacy*.millis/*.mskeys remain supported but are deprecated and log a WARN message at runtime when used (via ph-db 8.3.0) - (SMP client) The legacy configuration properties
truststore.type,truststore.path,truststore.locationandtruststore.passwordhave been removed - thesmpclient.truststore.*variants must be used instead. A value forsmpclient.truststore.typeis now mandatory. - (SMP client) SMP-specific HTTP settings are now read from configuration keys with the
smpclient.http.*prefix (e.g.smpclient.http.timeout.connect,smpclient.http.proxy.host,smpclient.http.tls.revocation.mode). The previous keys are deprecated for removal. - (SMP client) The previously hardcoded "trust all"
TrustManagerwas removed; TLS validation now uses the configured trust store. TLS certificate revocation checking is enabled by default. TLS 1.3 is now supported in addition to TLS 1.2.
v8.1.5 - 2026-04-27
- (MongoDB) Fixed a potential NPE when migrating users without a desired locale
- (MongoDB) Made the locale handling for "User" objects more robust
- Added the new Peppol SML TLS certificates in the default truststores (via peppol-commons 12.4.2)
- (MongoDB) Fixed an error that predefined User Group IDs are not stored correctly. See #476 - thx @shubham-complyance
- Fixed a regression with configuration properties not properly replaced variables. See #478 - thx @RohiNof
v8.1.4 - 2026-04-20
- Updated to BouncyCastle 1.84 (fixing CVE-2026-5588, CVE-2025-14813 and CVE-2026-5598)
- Updated to ph-commons 12.2.x
- Updated to ph-db 8.2.x
- (SQL) Refactored the Flyway migration to use the shared
FlywayMigrationRunnerfrom ph-db - (SQL) The configuration property
target-databaseis now deprecated. The new canonical key isjdbc.database-type. The old key is still supported as a fallback. - (SQL) The configuration property
jdbc.schema-createis now deprecated. The new canonical key issmp.flyway.jdbc.schema-create. The old key is still supported as a fallback. - (SQL) New optional Flyway configuration properties:
smp.flyway.history-table,smp.flyway.debug-mode,smp.flyway.repair-mode - (SQL) Replaced the static
SMPJDBCConfigurationutility class with the instance-basedSMPJdbcConfigurationextendingJdbcConfigurationConfigfrom ph-db - (SQL) Replaced
SMPFlywayConfigurationwithSMPFlywayConfigurationBuilderextendingFlywayConfigurationBuilderConfigfrom ph-db - (SQL) Replaced
SMPDataSourceProviderwith the genericDataSourceProviderFromJdbcConfigurationfrom ph-db - Fixed UI problem, that sticky button bar was above date and time select. See #467 - thx @RohiNof
- Added hints in the UI for the new Peppol SML URLs (SML Insourcing 2026) on the SML Configuration and SMP Settings pages
- (MongoDB) Ensured ID uniqueness checks in security managers (Role, User, UserGroup, UserToken)
- (MongoDB) Improved MongoDB client provider to wait for MongoDB to be writable before proceeding
v8.1.3 - 2026-03-06
- Aligned the regular expression for SMP ID checking with the one from the SML
- New GUI page "SMP Configuration" lets you reload the configuration files from within the application without restarting the application
- (SQL) The Flyway migration V25 (move XML based SML configurations into the DB) now also correctly takes over the ID of the source object (migration introduced in 8.0.16)
- (SQL) Improved the MySQL Flyway migration V31 to deal with the existing foreign key properly
- Removed all references to the publisher DNS CNAME record, as these records will get deleted soon
- (SQL) Modified the MySQL Flyway migration V30 to change the data type of
job_datafromtexttomediumtext - (SQL) Added new Flyway migration V34 that changes a column type for MySQL column
job_datafromtexttomediumtext
v8.1.2 - 2026-03-03
- The old
X-Content-Security-Policy*headers are no longer emitted - (Security) If the public URL is configured to start with
http://noStrict-Transport-Securityheader is emitted - (Security) The default time for the
Strict-Transport-Securityheader is now 2 years - (SQL) Fixed some errors in the DB2 Flyway scripts
- Now multiple endpoints with the same combination of Participant ID, Document Type ID, Process ID and Transport Profile ID can be created, as long as they have non-overlapping validity periods. See #454 - thx @wartab
- SMP Endpoints created via the API are now also checked for overlapping validity periods and eventually rejected
- The
ISMPEndpointnow has an ID. - The Endpoint List and the Endpoint Tree now also shows the endpoint validity separately
- Removed
ISMPServiceInformationManager.findServiceInformationand added.getAllSMPEndpoints()instead - (SQL) Flyway migrates up to version 33
- The Service Group export now contains a new attribute
smp-versionat the root, indicating the SMP version used to export the data - (XML) Fixed a bug that if an SMP endpoint had only a Service Activation Date but no Expiration Date, that the Activation Date was not persisted
- (Security) The HTTP session ID is now refreshed on login, avoiding session fixation attacks
v8.1.1 - 2026-02-26
- Fixed a regression vom 8.1.0 where a trailing slash was missing after "services" in the "get all document types of participant" API results. See #452 - thx @Loulouw
v8.1.0 - 2026-02-24
- Added support for Service Group custom properties. See #423
- Added new REST APIs to support ServiceGroup custom properties.
They follow the pattern
/{ServiceGroupId}/customproperties - Defined the possibility to handle "predefined custom properties" with special value rules.
- Removed support for the configuration property
hredelivery.sg.extension.on.si - If the HR eDelivery extension mode is enabled, the custom property
hr.oibis place in the HR specific extension. See #418 - thx @magdakw - Added new REST API
/servicegroupids/allto list all service group IDs. See #429 - thx @ottyanna - All Service Group select boxes now enable filtering. See #55
- (SQL) The "Create new Business Card" page now shows up way quicker
- Added support for idempotent REST API DELETE calls. See #392 - thx @mirvnillith
- Less Peppol Directory interactions on Service Group import. See #292 - thx @JonasZal
- (SQL) Flyway migrates up to version 32
v8.0.17 - 2026-02-22
- (SQL) Started experimental support for MS SQL Server as a storage engine
v8.0.16 - 2026-02-22
- Disabled the "Check DNS state" button when more then 10K service groups are present
- (SQL) Moved the "SML Configuration" data from XML file into the DB. See #403
- (SQL) Moved the "System Migrations" data from XML file into the DB. See #307
- (SQL) Also the "Long running jobs" data as well as the "System message" are now stored in the DB instead of an XML file
- (MongoDB) Moved the "System Migrations", "Long running jobs" as well as the "System Message" now into the MongoDB
- (SQL) The performance of the "Bulk change URL" and "Bulk change certificate" operations was heavily improved
- (SQL) Flyway migrates up to version 31
v8.0.15 - 2026-02-08
- (MongoDB) From this version on, users, usergroups, roles and usertokens are completely managed inside the MongoDB. See #436 - thx @krisraich
v8.0.14 - 2026-02-05
- Fixed potential issues in the optimized parallel import when overwrite is enabled
v8.0.13 - 2026-02-04
- (SQL) Reduced the number of SQL queries for "Bulk Change Certificate" and "Bulk Change Endpoint URL" pages
- The verification of Peppol Participant Identifier Values became more strict to be 100% aligned with the Peppol Policy for use of Identifiers 4.4.0
- Heavily improved the performance of the Service Group import by parallelizing it
- Service Group Import does less Peppol Directory interactions (no duplicates)
- Made the CRL download more resilient (via ph-commons 12.1.2 update)
- The default revocation check was changed from "only CRL" to "CRL before OCSP" (via ph-commons 12.1.2 update)
- Made sure that the configuration property
sml.smp.hostnamestarts withhttp://orhttps://. See #432 - thx @AnthonyL1996
v8.0.12 - 2026-01-18
- (SQL) Added new configuration property
jdbc.pooling.test-on-borrowto enable connection testing when borrowing from the pool. Default isfalse. - (SQL) The default value for
jdbc.pooling.between-evictions-runs.milliswas changed from-1to300000(5 minutes) - (SQL) Added a table
tomcat_sessionsthat is capable of storing Tomcat session information. See #424 - thx @mySupply-JEB
v8.0.11 - 2026-01-10
- Updated to ph-commons 12.1.1
- Fixing an exception for certain query APIs if no SML was selected in the SMP Settings. See #414
- Form editing pages now have sticky button bars
- Updated to Peppol eDEC Code Lists v9.5
- (SQL) Made sure that each manager call only uses a single DB connection (some used 2 in certain cases)
- (SQL) Made some DB connection pooling settings configurable - see Configuration
- (SQL) Applied more speedy DB connection pooling default settings
v8.0.10 - 2025-12-12
- (SQL) Fixed an error that some SQL queries were not properly prefixed with the schema (if configured)
v8.0.9 - 2025-12-10
- Allow the "." in SMP IDs.
This means the SMP ID regular expression was changed to
^[a-zA-Z0-9\\-]+(\\.[a-zA-Z0-9\\-]+)*$
v8.0.8 - 2025-12-10
- Updated to ph-commons 12.1.0
- Using JSpecify annotations
- Disabled TLS hostname verification on the SMP Query API for Croatia if the
smp.hredelivery.extensionare enabled - (SQL) The Flyway scripts have been verified with Oracle Enterprise 19
- (SQL) A bug in the Participant Migration page when using Oracle was fixed (Timestamp conversion)
v8.0.7 - 2025-11-14
- When the HR eDelivery extension mode is enabled, the Extension is also serialized for Participant IDs starting with
0088:385(HR GLNs) - Fixed loading of SML configuration objects from XML that used empty strings as URL suffixes
- The pages with SMP to SML configuration show a warning when running in HR eDelivery extension mode
v8.0.6 - 2025-11-13
- Extended the SMP status to include field
smp.rest-remote-query-api.enabledcontaining the configuration property on remote query API - Deprecated the configuration property
hredelivery.sg.extension.on.siin favour of the newsmp.hredelivery.*properties - Introduced new configuration properties
smp.hredelivery.extensionandsmp.hredelivery.accesspointoibfor support of the HR eDelivery implementation. If they are used, the deprecated property must be removed.
v8.0.5 - 2025-11-04
- Improved the SML Configuration to allow edit the "URL suffix to manage SMPs" and "URL suffix to manage Participants". The default values are the ones suitable for Peppol
- The "Business Cards" page got a "Refresh" button
- The "Update all Participants in Directory" functionality is now running in the background
v8.0.4 - 2025-10-28
- Fixed a regression, that
smp.publicurlvalues without a trailing slash lead to a startup error - sigh - sorry guys
v8.0.3 - 2025-10-23
- Fixed a regression, that
smp.publicurlvalues with a trailing slash lead to a startup error
v8.0.2 - 2025-10-23
- Removed the configuration property
hredelivery.xml.root.no.nsprefixagain, because the problem was resolved on HR side - Updated to ph-commons 12.0.4 to fix a bug with a potential
NullPointerExceptionin an internal cache. See #391 - When using phoss SMP with BDXR1 or BDXR2 API type, the internal JSON representation of the extensions can now be edited to allow for all fields. See #393
- Added the configuration property
smp.publicurl.modeto the status information - Added a consistency check that
smp.forceroot=truein combination with ansmp.publicurlvalue containing a path is not allowed - Made sure, that a context path contained in
smp.publicurlis handled correctly even if the application is deployed in a different context path - Added new Wiki page on SMP Extensions
v8.0.1 - 2025-10-13
- Updated to ph-db 8.0.1
- Updated to ph-web 11.1.1
- (SQL) Fixed the schema name quoting for MySQL. See #374 - thx @mikalammi
- (SQL) Replaced internal enum
EDatabaseTypewithEDatabaseSystemTypefrom ph-db - Outbound participant migrations can now be "cancelled" by performing an inbound participant migrations on them
- Fixed exception when using the API with a non-existing participant ID. See #381 - thx @janwytze
- Fixed invalid certificate validity period display text in edge case. See #383 - thx @wartab
- Updated to Peppol eDEC Code Lists v9.4
- Added new configuration property
hredelivery.xml.root.no.nsprefixto use an empty XML namespace prefix for the root element. See #382 - thx @tnakir - Added new configuration property
hredelivery.sg.extension.on.sito copy the ServiceGroup extension over to the ServiceInformation element. See #376 - thx @horacis
v8.0.0 - 2025-08-28
- Requires Java 17 as the minimum version
- Updated to ph-commons 12.0.0
- Updated to Flyway 11.11.2
- Removed all deprecated methods marked for removal
- Made constructor of
SMPSettingsprivate - Removed support for the configuration property
smp.publicurl.modevaluedynamic-participant
v7.2.8 - 2025-08-13
- Updated to Peppol eDEC Code Lists v9.3
- The default truststores in the provided
application.propertiesfiles were changed to the new G2 + G3 combined ones - (SQL) Improved the MySQL migration v22 so that it also works with MariaDB. See #365 - thx @Dataportuser
- New Service Groups can now also be created only locally (and not in the SML) - to match the functionality of the API
- The "Check DNS State" user interface was improved so that non-clickable URLs are not displayed as links
- Added support for the public URL modes
x-forwarded-headerandforwarded-header. See #369 - thx @tramperdk
v7.2.7 - 2025-07-18
- Updated to peppol-commons 11.0.3
- When using the configuration property
smp.publicurl.modewith valuedynamic-participantis used, a warning is emitted because this does not work with the NAPTR lookup - (Security) Updated Postgres driver to mitigate CVE-2025-49146
- (Peppol) The limitation for the SML registration API to allow only
http, port 80 and the root path was removed - The login possibility from
/publicwas removed. This also means, that the configuration propertywebapp.public.login.enabledhas no effect anymore - The Peppol PKI G3 (2025) is now a know PKI in the "Certificate Information" page
- Performance improvement when using the UI through reduction of database queries checking if a user is assigned to a user group
- Extended the participant identifier value maximum length to 135 to comply to the Peppol PFUOI 4.4.0
- (SQL) The Flyway migration V22 was added to extend the participant identifier value maximum length
v7.2.6 - 2025-05-20
- SMP Redirect URLs escaping became a bit more resillient
- Fixed a regression that may create issues when reading the password from configuration file (via update to ph-commons 11.2.5)
v7.2.5 - 2025-05-14
- SMP Redirect URLs may have be incorrect when containing special characters like
#. This was solved by correctly escaping the data.
v7.2.4 - 2025-05-14
- Updated to peppol-commons 10.4.0
- Added new
/pingAPI endpoint to SMP web applications for an efficient aliveness check - The configuration files
webapp.propertiesandsmp-server.propertiesare no longer read. That was supposed to be done in v7.0.0 already. - The consistency checks for Peppol Participant IDs using the
iso6523-actorid-upisschemes were strengthened - Fixed a regression, that the "Certificate Information" page did not correctly show what went wrong
- Made sure that all SMP Redirects are listed in the
/{participantID}API response - Not showing fields "Requires Business Level Signature" and "Minimum Authentication Level" when creating a new Endpoint in Peppol mode
v7.2.3 - 2025-04-10
- (SQL) Database schema names are no longer checked with a regular expression.
- (Security) Avoid that session IDs get encoded in URLs so that they don't appear in any log files. This implies that the usage of Cookies becomes mandatory.
v7.2.2 - 2025-03-06
- Fixed a bug when editing Business Cards on the UI with CSP enabled. This was a regression from 7.2.1. See #313 - thx @MariaSpr
- Fixed an internal error, when an Endpoint with an unknown transport profile is contained. This was a regression from 7.2.0.
- Updated to Peppol eDEC Code Lists v9.1
- The Identifier Mappings were updated to support the third state "removed" as well.
- Document Type Identifiers and Process Identifiers that have the state "removed" get a red badge rendered.
v7.2.1 - 2025-02-27
- Updated to ph-web 10.4.0
- Updated to ph-oton 9.3.0
- Now the local deletion of Service Groups works as expected
- Added a work around to make sure, deletion of Participants in the Peppol Directory will work
- Improved the Content Security Policy to not allow inline JS. #312 - thx @mirvnillith
v7.2.0 - 2025-01-09
- Updated to Peppol eDEC Code Lists v9.0
- (Docker) Fixed the handling of encoded slashes in Tomcat 10
- Trimming all REST API path parameters before using them, similar to the UI
- (SQL / MongoDB) The Service Group page displays quicker, because the owner name is not queried for each SG again
- (SQL / MongoDB) The Service Endpoint list and tree page displays quicker, because the owning service group as well as the transport profile is not queried for each SG again
- Internal APIs were altered to take IDs instead of the complete objects
- Added new landing page, to make sure that the login is quick and not delayed by loading all service groups
- It is now possible to delete Service Groups only locally (so not in the SML). This can be beneficial to resolve inconsistencies
v7.1.7 - 2024-10-17
- (XML) Fixed a deadlock in bulk endpoint URL and certificate change. See #297 - thx @seciq
v7.1.6 - 2024-09-20
- (Security) Updated to protobuf 4.28.2 fixing CVE-2024-7254
v7.1.5 - 2024-08-20
- Improved the "Tasks/problems" page so that it renders quicker. It doesn't show the details of a certificate for each endpoint anymore.
- Added new REST API
/businesscard/{participantID}/pushto explicitly push a Business Card to the Directory. See #269 - thx @dextreza - Tried to lower the memory consumption for "bulk change URL" and "bulk change certificate". See #291
- (Docker) Improved the memory assignment to Tomcat inside the Docker image (
-XX:InitialRAMPercentage=10 -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80)
v7.1.4 - 2024-07-30
- Updated to peppol-commons 9.5.x
- Updated to eDEC Code Lists v8.9
- (Security) Updated to dnsjava 3.6.x fixing CVE-2024-25638
- Improved the consistency of the SMP settings by falling back to configuration values. See #267 - thx @anakinj
v7.1.3 - 2024-05-24
- Updated to peppol-commons 9.4.x
- Fixed the usage of non-Peppol compliant identifiers with the SMP identifier type
peppol-lax. See #275
v7.1.2 - 2024-04-24
- Ensured Java 21 compatibility
- Allowed the creation of identifiers with an empty identifier scheme (see peppol-commons 9.3.4)
- Marked the DE4A PKIs as deprecated and no longer supported
- Added the DBNA PKIs as known to the "Certificate information" page
- (Docker) All Docker images from 7.1.1 on are optimized to remove unused web applications
- Updated to eDEC Code Lists v8.8
- Added new SMP identifier type
peppol-lax. See #275 - thx @emilbokenstrand
v7.1.1 - 2024-02-27
- (Security) Updated to xmlsec 3.0.4 for security reasons (CVE-2023-44483)
- Updated the default Peppol Truststore to not contain the outdated trusted certificates
- (SQL) (Security) Updated to PostgreSQL JDBC driver to 42.7.2 for security reasons (CVE-2024-1597)
- Improved the error handling on invalid Directory hostnames in the "SMP Settings" page
- Removed the fields "Physical address" from "Register at SML" and "Update SML Registration" pages
v7.1.0 - 2023-12-10
- Updated to peppol-commons 9.1.x
- Updated to phoss-directory 0.13.x
- Updated to eDEC Code List v8.7 with the known names
- Updated to the Peppol SMP 1.3.0 specification -> replaced all SHA-1 with SHA-256 for the signature
- The consistency checks for Peppol Identifiers were improved to avoid less invalid identifiers
- Syntactically invalid Document Type and Process IDs are now marked with a respective "Invalid" badge
- (SQL) Added new configuration properties
smp.flyway.jdbc.*that allow the usage of a different database configuration for Flyway only
v7.0.3 - 2023-08-25
- Updated to ph-oton 9.2.0
- Updated to eDEC Code List v8.6 with the known names
- Added an explicit optical highlight on peppol-doctype-wildcard identifiers in the endpoint list
v7.0.2 - 2023-07-26
- (Security) Updated to BouncyCastle 1.75 for security reasons (CVE-2023-33201)
- (SQL) Updated to Flyway 9.21.0
v7.0.1 - 2023-07-07
- Updated to peppol-commons 9.0.6
- (Security) Updated to ph-commons 11.0.5 for security reasons (CVE-2023-34612)
- Fixed a potential exception when viewing BusinessCards with an unsupported country code
- (SQL) Updated to Flyway 9.20.0
v7.0.0 - 2023-04-29
- Updated to ph-commons 11.0.4
- Fixed support for Surrogate characters for e.g. Japanese
v7.0.0-rc1 - 2023-04-03
- Using Java 11 as the baseline
- Using Servlet API 5.0.0 as the baseline: JakartaEE 9, Java 11+, Apache Tomcat v10.0.x, Jetty 11.x
- Updated to ph-commons 11
- Added new configuration property to disable the display of the Environment Variable page (
webapp.page.admin.sysinfo.envvars.disabled). See issue #236 - thanks @smahieu87 - Improved the consistency checks for the
smp.publicurlconfiguration property. If this value is set but invalid, the SMP will refuse to start. Additionally, if the value is modified during runtime, a check on the "Problems / Tasks" page was added. See issue #237 - thanks @smahieu87
v6.0.7 - 2023-02-23
- Updated to Log4J 2.20.0
- Support for "User Tokens" for authentication at the REST API were added. That can be used as a replacement for BasicAuth. That makes the usage of the REST API more secure. See issue #196 - thanks @sakasaka19
- (SQL) Updated to Flyway 9.15.0
v6.0.6 - 2023-02-15
- Migrated web.xml to use Servlet API 3.0 XSD
- Fixed XSI schemaLocation for Oracle XSD in weblogic.xml
- Updated the known names to eDEC Code List v8.3.1
- Fixed an ArrayIndexOutOfBoundsException when a single
$character is contained in a configuration property with variable resolution enabled. See issue #234 - thanks @Kristieb - Beautified the Certificate Information page to spot errors quicker
v6.0.5 - 2022-12-15
- (SQL) Updated to Flyway 9.10.0
- (SQL) (Security) Updated the PostgreSQL JDBC driver 42.5.1 (CVE-2022-41946)
- (SQL) (Security) Updated to Google ProtoBuf 3.21.12 for security reasons (CVE-2022-3509)
v6.0.4 - 2022-11-14
- (SQL) (Security) Updated to Jackson 2.14.0 for security reasons (CVE-2022-42003)
v6.0.3 - 2022-11-07
- (Security) Updated to Woodstox Core 6.4.0 for security reasons (CVE-2022-40151, CVE-2022-40152, CVE-2022-40153, CVE-2022-40154, CVE-2022-40155, CVE-2022-40156)
- Updated to peppol-commons 8.8.1
- Deprecated SMP transport profiles
busdox-transport-as2-ver1p0(Peppol AS2 v1) andbusdox-transport-as2-ver2p0(Peppol AS2 v2) - (SQL) Updated to Flyway 9.7.0
v6.0.2 - 2022-10-04
- Updated to Log4J 2.19.0
- Fixed an exception on login, when a non-existing user tries to login (regression since 6.0.0)
- (SQL) Updated to Flyway 9.4.0
v6.0.1 - 2022-09-13
- Added a configuration property that disables the usage of Markdown in system messages at "Administration / Monitoring / Sessions" page
v6.0.0 - 2022-09-12
- Added a configuration property that disables the display of the "Administration / Monitoring / Sessions" page
- Extended the list of known DE4A trusted certificates
- Changed the CEF contact email address from
CEF-EDELIVERY-SUPPORT@...toEC-EDELIVERY-SUPPORT@...
v6.0.0-RC1 - 2022-08-26
- Updated to Apache Http Client v5.x
- Updated to ph-commmons 10.2.0
- Updated to ph-oton 8.4.1
- Updated to ph-web 9.7.1
- Removed support for Vagrant
- (SQL) Updated to Flyway 9.x dropping support for MySQL 5.7
- (SQL) Added a new configuration property to define the Flyway baseline version (
smp.flyway.baseline.version) - In case of failed logins the response is artificially delayed to complicate brute force attacks
- Added a configuration property that can be used to turn off the details about login errors (
webapp.security.login.errordetails) - Added configuration properties to replace the logo image in the public part
- The system used to configuration item was updated so that only one configuration file is needed and variables are supported
- The configuration files
private-webapp.propertiesandwebapp.propertiesare deprecated and should not be used anymore. All the properties should be placed inapplication.properties. - The system properties
peppol.smp.webapp.properties.pathandsmp.webapp.properties.pathare no longer evaluated and will lead to a startup error. - The environment variable
SMP_WEBAPP_CONFIGis no longer evaluated and will lead to a startup error. - The configuration files
private-smp-server.propertiesandsmp-server.propertiesare deprecated and should not be used anymore. All the properties should be placed inapplication.properties. - The system properties
peppol.smp.server.properties.pathandsmp.server.properties.pathare no longer evaluated and will lead to a startup error. - The environment variable
SMP_SERVER_CONFIGis no longer evaluated and will lead to a startup error.
- The configuration files
- The display of certificate information across the administration has been unified
- The operations "Register SMP at SML", "Update registration of SMP at SML" and "Delete SMP from SML" are now on separate pages instead of one page with tabs
- Endpoints without Endpoint URLs won't create invalid XML anymore with the BDXR1 REST API
v5.7.1 - 2022-08-08
- Update the name mapping for predefined document type and process IDs
- Updated to peppol-commons 8.7.6 for Peppol Code Lists v8.2
- (SQL) Fixed a DB2 issue in the V19 migration code
- (SQL) Updated the PostgreSQL JDBC driver 42.4.1 to fix CVE-2022-31197
v5.7.0 - 2022-05-17
- Updated to peppol-commons 8.7.x (updated SMP client proxy configuration keys). See Migrations page.
- Updated to phoss-directory 0.10.x (updated Directory client proxy configuration keys). See Migrations page.
- Updated to ph-oton 8.4.0 which lead to dropping support for old Internet Explorer versions for the UI.
- Added experimental support for OASIS BDXR SMP v2 via the new
smp.rest.typeConfiguration valuebdxr2 - The "not before" and the "not after" dates of the SMP certificate can be shown in the status. See issue #203 - thanks @jonaswest
- The check in "Tasks/problems" to see if the SMP is already registered to the SML was limited to the Peppol mode
- Participants previously migrated to another SMP can be migrated again, if necessary. See issue #209 - thanks @sakasaka19
- If an outbound proxy server is configured, that is displayed on the left hand side under the menu in the UI
- (SQL) Fixed a syntax error in Oracle migration V15
- (SQL) Improved the SQL syntax support for Oracle
- (SQL) Started adding support for DB2 as an SQL backend. The DB2 support is still considered experimental, so handle with care - thanks @gilescp for providing all the input
- (SQL) Added support for multilingual names in Business Cards if created via the import. See issue #210 - thanks @tmhide
- (SQL) Removed the length constraint from
smp_service_metadata_red.redirectionUrl. See issue #206 - thanks @tmhide
v5.6.2 - 2022-03-18
- SMPs configured to provide the OASIS BDXR SMP v1 REST API can now also use a context path to register at the SML
v5.6.1 - 2022-02-24
- (SQL) Fixed a syntax error in PostgreSQL migration V17. See issue #201 - thanks @tmhide
v5.6.0 - 2022-02-22
- (SQL) Initial Oracle support is available. One happy user is known, but if you have troubles, just ping me - thanks Vladimiras Kovalkovas
- Updated to the new Peppol SMP specification 1.2.0 - using Canonicalization method
http://www.w3.org/TR/2001/REC-xml-c14n-20010315from May 1st, 2022 - The "Check DNS state" of the Service Groups should now also work for non-Peppol CEF-based configurations
- Extended the REST API to support export and import of data
- Extended the REST API to support migration of participants
- Import with "overwrite" enabled, does no longer delete the Service Group in the SML but only locally
- (SQL) Changed a table name for Oracle (Flyway v16). See issue #62 - thanks @JonasZal
- (SQL) Fixed an error, that by accident the owners of other ServiceGroups were changed. See issue #195 - thanks @sakasaka19
- (SQL) Changed two columns in table
smp_secuserfromclobtovarchar(200)for Oracle (Flyway v17) - The participants migrations pages are now shown, even if the preconditions are not fulfilled. This can be used to view historic data.
- Participant migrations can now be deleted from the UI
- The participant migrations pages now have a "Refresh" button
v5.5.4 - 2022-02-18
- Updated the predefined names to Peppol Code List v8.0
- Improved the security check for Basic Auth users
- (SQL) Updated to PostgreSQL 42.3.3 for security reasons
v5.5.3 - 2022-01-12
- (SQL) Updated to Google ProtoBuf 3.19.2 for security reasons (CVE-2021-22569)
v5.5.2 - 2022-01-11
- (SQL) Fixed an error in the MySQL DDL V1 - changing the collation from
utf8tolatinto avoid "too long key" issue - (SQL) Fixed an initialization order issue when migrating DB users from the old scheme to the new scheme (Flyway version V15)
v5.5.1 - 2022-01-10
- (XML) Fixed an error in web.xml of the XML version (duplicate servlet mapping)
- Improved resilience of internal path handling
v5.5.0 - 2022-01-10
- Updated to Log4J 2.17.1 for security reasons (CVE-2021-44832)
- Updated to ph-commons 10.1.5
- Updated to ph-oton 8.3.6
- (SQL) The transport profiles are now managed in the database when using the SQL Backend (table
smp_tprofile)- All the existing transport profiles are automatically migrated into the database
- (SQL) The audit items are now also written directly to the database when using the SQL Backend (table
smp_audit) - existing entries are NOT migrated - (SQL) The security roles are now managed in the database when using the SQL Backend (table
smp_secrole) - (SQL) The users are now managed in the database when using the SQL Backend (table
smp_secuser) - (SQL) The user groups are now managed in the database when using the SQL Backend (table
smp_secusergroup)- All existing roles, users and user groups are automatically migrated from the XML based file to the DB
- (SQL) All the SMP settings as well as the ID maintenance are now managed in the database when using the SQL Backend (table
smp_settings)- All the existing SMP settings are automatically migrated into the database
- Added new property in
webapp.propertiescalledwebapp.public.showappnameto disable the display of the application name in the/publicpart - Added new property in
webapp.propertiescalledwebapp.public.showsourceto disable the display of the application source in the/publicpart - Certain HTTP redirects now correctly honour the public URL - this only affects usage behind a reverse proxy
v5.4.5 - 2021-12-21
- Updated to Log4J 2.17.0 for security reasons (CVE-2021-45105) - see https://logging.apache.org/log4j/2.x/security.html
v5.4.4 - 2021-12-14
- Updated to Log4J 2.16.0 for security reasons (CVE-2021-45046) - see https://www.lunasec.io/docs/blog/log4j-zero-day/
v5.4.3 - 2021-12-10
- Updated to Log4J 2.15.0 for security reasons (CVE-2021-44228) - see https://www.lunasec.io/docs/blog/log4j-zero-day/
v5.4.2 - 2021-11-30
- (SQL) Switching back to Flyway v7 for compatibility with MySQL v5.7.
v5.4.1 - 2021-10-30
- Fixed a regression in 5.4.0, that the parsing of date time values without a timezone failed.
v5.4.0 - 2021-09-19
- Added support for migrating service groups from and to another SMP - see the new menu items in the "Service group" area (see issue #78)
- An internal error on the "Business Cards" page was solved, if a Directory configuration was enabled using "https" but the certificate setup of the PD Client is broken
- Added an additional check on the "Certificate Information" page if the configured key store contains more than 1 key entry
- Added a new page that shows all the identifier mappings uses in the SMP (available in "Administration | Identifier Mappings")
- The return code of the
PUTandDELETEAPIs changed from 404 to 412 if the writable REST API is disabled - Extended the REST API to create and delete ServiceGroups without SML interaction (see issue #163)
- Added a new status item
smp.sql.db.connection-possiblewhen using the SQL backend - (SQL) Added a new configuration property
smp.status.sql.enabledto disable the new status item - Added a new configuration property
smp.timezoneto configure the global SMP time zone (see issue #167)
v5.3.3 - 2021-08-20
- Updated to ph-commons 10.1
- Updated to peppol-commons 8.4
- Updated to ph-oton 8.3
- A new Administration page to dynamically change the log level was added
- The page "SML certificate update" received additional checks regarding the certificate layout
- Removed superfluous
pd-client.propertiesfile - Added new status item
startup.datetime - (SQL) The new configuration item
smp.flyway.enabledallows to disable the usage of Flyway - When listing certificates, the alias is also shown if it is available
v5.3.2 - 2021-01-15
- [MongoDB] Fixed an error in the MongoDB backend that prevented the endpoint processes to be handled correctly. This is a regression error introduced in 5.2.6.
v5.3.1 - 2020-11-03
- (SQL) If the DB connection is lost during a run, it can now be re-established via the GUI
- (SQL) Fixed a concurrency issue when using the SQL backend
v5.3.0 - 2020-10-06
- When registering the SMP to the SML, it can now be done using "https" addresses (when not in Peppol mode)
- Updating to the latest Directory software includes a change in the resolution of configuration files. See the Migrations page for details.
- (SQL) Mind the changes to the DB layout
v5.3.0 Release Candidate 6 - 2020-09-09
- (SQL) Added new configuration item
jdbc.schema-createto customize whether the DB schema should be automatically created for an empty database or not
v5.3.0 Release Candidate 5 - 2020-08-30
- Fixed a bug in the Bulk Certificate Change functionality regarding the formatting of certificates
- Changed the JAXB generated classes to use Java 8 date time classes
- (SQL) Added new Status item
smp.sql.target-databasefor SQL backends - (SQL) Added new configuration item
jdbc.schemato make the JDBC Schema name customizable
v5.3.0 Release Candidate 4 - 2020-08-26
- (SQL) Removed a wrong "UNIQUE" SQL statement from the PostgreSQL init script
v5.3.0 Release Candidate 3 - 2020-08-25
- (SQL) Fixed a bug in a "DELETE" SQL statement for endpoints
v5.3.0 Release Candidate 2 - 2020-08-25
- (SQL) Added the possibility to initially setup the database using Flyway
- Changed the license of the
phoss-smp-backend-sqlmodule to Apache 2.0 because nothing of the original source code is left - (SQL) Dropped the support for the specific DB user management - only the build-in user management can be used
- Added support for a query API (see issue #145).
To use this functionality, the new configuration item
smp.rest.remote.queryapi.disabledmust be set tofalse.
v5.3.0 Release Candidate 1 - 2020-08-20
- Updated the list of known identifiers to Peppol Code list 7.2
- (SQL) The SQL backend was changed to use JPA to JDBC
- (SQL) The SQL backend now supports FlyWay for easy DB migrations
- (SQL) For the SQL backend the special table "smp_user" is migrated to internal users and the ownership is updated.
v5.2.6 - 2020-08-20
- The initialization of the UTC timezone upon startup is now more consistent
- Fixed an error that prevented the automatic deletion of Business Card when a Service Group was deleted (see issue #139)
- Improved logging on actions on Business Cards
- Fixed a rare scenario where it would have been possible to create invalid XML in querying
- Fixed an Exception with the MongoDB backend, if a process had no endpoints
- Made separate pages for "Import" and "Export" of Service Groups
- Added possibility to disable support for the HTTP OPTIONS verb (see issue #142)
- Added support for the Content Security Policy (CSP) response headers (see issue #141)
- Added possibility to remove the authorship text from the public page (see issue #140)
- The server name on the start page now uses the same algorithm for calculation as the "list servicegroup" API
- The bulk change certificate page now has an improved certificate matching algorithm (see issue #143)
- The bulk change operations (endpoint and certificate) are now running asynchronously in the background
v5.2.5 - 2020-07-12
- Fixed a regression that prohibited the creation of ServiceGroups in the SMLs, due to a bogus SoapAction (see issue #137)
v5.2.4 - 2020-06-30
- The ServiceGroup import error handling was improved
- Updated to ph-commons 9.4.0
- Split the menu item "Endpoints" into "Endpoint List" and "Endpoint Tree", so that huge data volumes are handled more easily (see issue #97)
- Speeding up the Service Group page, by not counting the document types, processes and endpoints if more than 1000 service groups are available (see issue #97)
- Made the domain name creation for the "GET /{serviceGroups}" call customizable (see issue #131)
- The XML format for known document types was extended to allow the specification of process identifiers allowed to be used with a specific document type identifier
- The bulk certificate change can now also be performed if the old certificate is not parsable
- A custom imprint can be configured on the user interface (see issue #132)
- It is ensured that all transport profiles, that are referenced in existing endpoints are existing (see issue #128)
- Added new writable REST API to remove all Endpoints and Redirects from a service group (see issue #134)
- Added new configuration property
webapp.statistics.persistto disable the writing of usage statistics files
v5.2.3 - 2020-02-23
- Fixed an error that document types with an encoded slash could not be queried (see issue #125)
v5.2.2 - 2020-02-17
- Updated to peppol-commons 8.x
- The Peppol PKI v2 certificates are officially expired and flagged as such
- The default truststore no longer contains the Peppol PKI v2 certificates
- The names of the SNAPSHOT Docker images changed (
phelger/smp:snapshot->phelger/phoss-smp-xml:snapshot,phelger/smp:snapshot-mongodb->phelger/phoss-smp-mongodb:snapshot,phelger/smp:snapshot-sql->phelger/phoss-smp-sql:snapshot) - Updated the versions of the underlying UI libraries
- The Administration area has a new page "System truststore" to show the contents of the Java default truststore (cacerts)
- The "Transport profiles" page was improved and does not necessarily scan all endpoints any more
- The "Transport profiles" page can now also delete deprecated predefined protocols
- The "Certificate Information" page now also shows the trust store content of the Directory client (if any)
- The "Tasks/problems" page now also checks the key configuration of the SMP certificate
- The "Tasks/problems" page now also checks the key store and trust store configuration of the Directory client (if any)
- A new Administration page "http client" can be used to diagnose connectivity issues
v5.2.1 - 2020-01-24
- Added default
robots.txtthat disallows every indexing - Added new configuration property
smp.rest.payload.on.error(was also added to the status JSON) - The display names of document types and processes can now be customized (see issue #112)
- Fixed NPE when creating a half-filled BusinessCard with MongoDB backend
- Using my fancy new logo - thx to Maria Petritsopoulou - http://stirringpixels.com/
- Fixed NPE when a Proxy server was configured for "http" and "https"
- The certificate information page now got a button to reload the Peppol Directory client configuration
- Changed all texts from "PEPPOL" to "Peppol" where applicable
- Fixed an internal overflow error for the certification validity period display text
- Expired certificates in the trust store are now displayed on the "Tasks/problems" page (see issue #120)
- Added possibility to easily update all participants in the Directory (see issue #116)
- Using MongoDB as the global ID provider, including a migration script
v5.2.0 - 2019-07-18
- Check the Migrations page for manual update actions
- The GitHub project was renamed from
peppol-smp-servertophoss-smp- The internal submodule names were adopted:
-
peppol-smp-server-library→phoss-smp-backend -
peppol-smp-server-sql→phoss-smp-backend-sql -
peppol-smp-server-xml→phoss-smp-backend-xml -
peppol-smp-server-webapp→phoss-smp-webapp -
peppol-smp-server-webapp-sql→phoss-smp-webapp-sql -
peppol-smp-server-webapp-xml→phoss-smp-webapp-xml
-
- The Maven artifact IDs were changed according to the new submodule names
- All internal package names were changed to reflect the new naming (
com.helger.peppol.smpserver.*was changed tocom.helger.phoss.smp.*) - System property names, configuration file names or configuration properties are NOT changed. If you don't develop against phoss SMP, nothing changed for you
- The internal submodule names were adopted:
- Slightly changed the wording in the small hint menu in the secure area (see issue #100)
- Changed the order on the "SMP Settings" page, so that "SMK/SML" comes before "Directory" (because it is more important)
- The "Tasks/problems" page now also checks, if the SMP is registered to the SML (see issue #101)
- The page "Certificate information" now knows about the "TOOP Pilot" PKI
- Added a new button on page "Transport Profiles" to ensure all default transport profiles are present
- Added new backend MongoDB (see issue #105)
- Page "Endpoints" wont show up if no transport profiles are present
- Fixed a missing call to persistence if only a process of an endpoint was deleted (only for XML backend)
- Technical details of errors are shown in more details on the UI for better tracking
- The service group import no longer creates (invisible) Business Cards if the respective service group cannot be created
- The confusing default values in page "SML registration" were moved to the field help texts and other improvements (see issue #104)
- An error in "Check DNS state" of service groups was fixed, that lead to erroneous resolutions to "127.0.0.1"
- Added a summary of the HTTP proxy configuration to the status API
- The form at
/securenow uses a hostname independent action URL for better work behind a reverse proxy - Fixed invalid triggers to the Directory if "Directory auto update" was enabled independent of the "Directory enabled" state.
- The "Business Cards" page got an icon for the selected country in the list view
v5.1.2 - 2019-05-28
- A new configuration option
webapp.public.login.enabledinwebapp.propertiescan be used to turn off the login possibility from /public URLs (see issue #102) - The Docker internal environment variable
VERSIONwas renamed toSMP_VERSIONto avoid conflicts - The Docker images now use Tomcat 9 with JRE 11 as the basis
v5.1.1 - 2019-04-23
- The random generator initialization that caused long initialization delays ways fixed (through ph-commons 9.3.2)
- The default read timeout for the SML connection was updated from 5 to 30 seconds issue #99
- The Docker images use the non-blocking random by default
v5.1.0 - 2019-03-20
- Updated user interface to use Bootstrap 4.3.1
- Reworked the REST API error handling, so that errors are propagated more clearly (see issues issue #72 and issue #80).
- Added new configuration file property
smp.rest.log.exceptionswith the default value offalse - Added new setting if Directory is required or not. Certain warnings are enabled/disabled depending on that status.
- The Status API got a new item
smp.pd.neededthat contains the new setting if the Directory is needed or not. - The certificate update API was integrated in the SMP (see issue issue #70).
- When using identifier type
simpleit is now possible to created process identifiers without a scheme (see issue issue #87). - Added new task/problem checks for "global debug" and "global production" settings.
- The Status API got a new item
smp.publicurlthat contains the public URL from the configuration file - The Status API got a new item
smp.forcerootthat contains the setting from the configuration file - If Directory automatic update is enabled, any ServiceInformation change triggers a Directory update if a Business Card is available for the respective Service Group (see issue issue #94).
- The
X-Frame-OptionsHTTP header is now by default set toSAMEORIGINto avoid click-jacking attacks. - The REST API implementation was reworked to be more secure and less prone to attacks.
- The Business Card page now always shows the possibility to manually update a ServiceGroup in the Directory
v5.0.8 - 2018-10-30
- The simple login from the
/publicnow uses HTTP method POST instead of GET (security issue) - An issue with case sensitivity in the writing REST API to create service groups was fixed, if a case-insensitive identifier factory is in used (e.g. "peppol") (see issue #57).
v5.0.7 - 2018-10-29
- Added new
webapps.propertiesconfiguration itemglobal.debugjaxwsof typebooleanto enable WS debug logging - Renamed the administration page "SML information" to "SML configuration"
- Instead of maintaining the SML URL manually in the settings, you now need to chose one of the configured "SML configurations".
This implies that the configuration property
sml.urlgot useless. - The name of the Directory can now be customized using
webapps.propertiesconfiguration itemwebapp.directory.name. By default it is "PEPPOL Directory" but it may be "TOOP Directory" for TOOP as well. This is a pure user interface configuration item and has no functional implications. - It's now possible to edit the extension of an Endpoint on the UI (see issue #74).
- Improved the visualization of extensions when viewing the details of an object
- In case a BusinessCard exists without a
ServiceGroup, this no longer causes an exception - If PEPPOL PKI v3 is configured, a certificate chain of 3 elements is expected
- The Endpoint tree view now also has a button to directly query the endpoint
- Updated to PEPPOL Directory API 0.6.2
- Error handling was improved if an error occurred when communicating with the SML.
- The Status API got a new item
build.timestamp - The SQL backend now uses MySQL Connector/Java 8.0.x.
I had issues with the timestamp handling which forced me to add
useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTCto the JDBC connection URL. But the solution is still binary compatible with the previous MySQL 5.1 connector version. - Fixed an error with same internal ID when copying Business Cards on the UI
v5.0.6 - 2018-06-04
- Fixed an error with rolling back SML transactions (see issue #71)
- The UI now has a possibility to explicitly unregister a Service Group from the SML without deleting it
- Added the possibility to configure the execution time warning (SQL version only)
- The field "is deprecated?" of transport profiles can now be handled via the UI
- A new Status API was introduced to query configuration parameters (see issue #73).
- Added a possibility to disable the status API via the Configuration
v5.0.5 - 2018-04-16
- Fixed a stupid error that the deletion of a ServiceGroup is not properly propagated to the PEPPOL Directory
- Updated to Jersey 2.27
- Updated the default truststore so that the SSL certificates of the DG DIGIT SML are contained, as there seems to be an issue with the latest Java 8 update.
- The "Create Business Card" page only shows Service Groups that don't have a Business Card yet
v5.0.4 - 2018-03-27
- A suspicious comment indicating that PEPPOL Directory is not supported by SQL backend was fixed
- The
/complete/and the/list/REST APIs are now available for the OASIS BDXR as well - The sub-projects previously licensed under EUPL 1.1/MPL 1.1 are now licensed under MPL 2.0
- The automatic PEPPOL Directory update on import/REST API was fixed (see issue #52)
- The list of managed participants on the public start page can be disabled (see issue #58).
Configure via property
webapp.startpage.participants.noneinwebapps.properties. - Warning about disabled SML can be turned off (see issue #53).
Configure via property
sml.neededinsmp-server.properties. - Added configurable timeouts from SMP to SML using the properties
sml.connection.timeout.msandsml.request.timeout.msas mentioned in issue #67. - The
Certificate informationpage now has explicit support for the new OpenPEPPOL PKI v3 - By using the predefined truststore path
truststore/complete-truststore.jkswith passwordpeppolsupport for OpenPEPPOL PKI v2 and v3 is provided - By updating to PEPPOL Directory 0.6.0 the extended PD Client configuration in file
pd-client.propertiescan be used. See https://github.com/phax/peppol-directory/#pd-client for details.
v5.0.3 - 2017-07-21
- Initial support for SMP Docker images was added
- Fixed NPE in REST API if an invalid data format was used
- Made SML registration IP and hostname configurable (see issue #49)
- Existing service groups can now be subsequently registered to the SML (see issue #51)
- The "SML registration" pages now contains a note, if the SMP is already registered to the SML.
- The default page of the PEPPOL Directory was changed to
https://directory.peppol.eu- because of the very special https setup currently used, an update to the PD client library v0.5.1 is highly recommended - An error prevented Business Cards from being imported correctly - Thanks Ger for pointing this out
- An exception when using the PEPPOL REST API in combination with an Endpoint without an URI was fixed
- The Docker image got
vimby default (see issue #45)
v5.0.2 - 2017-04-04
- Fixed an NPE in "Check DNS state" when an empty participant identifier scheme is used
- Added a new entry to the "Tasks/problems" page if the default password of the default Admin user was not changed
- Improved and unified logging a bit
- Vagrant configuration has been updated to work with the new structure from 5.0.1
- Made the public start page static to decrease server load.
The previous layout can be restored by switching the property
webapp.startpage.dynamictabletotruein thewebapp.propertiesfile. - Added support for a writable REST API to create/update/delete BusinessCards per API (see issue #43)
v5.0.1 - 2016-11-27
- There are now 2 separate web applications for the SQL and the XML backend to resolve a problem with WildFly if a
persistence.xmlis in the class path but the XML backend is used. - An incompatibility with .NET using the inclusive canonicalization algorithm was fixed ("\r\n" vs. "\n")
- The canonicalization algorithm used in the signature was changed to "exclusive" as stated in the PEPPOL SMP specification. The OASIS BDXR version still requires the use of the "inclusive" version.
v5.0.0 - 2016-11-15
- Naming the solution "phoss SMP" plus branding
- The first SMP solution to be officially CEF conformance tested - read the test protocol - read more on https://ec.europa.eu/cefdigital/wiki/display/CEFDIGITAL/phoss+SMP+first+implementation+to+pass+CEF+eDelivery+OASIS+SMP+Conformance+Tests
- Added the new logo into the application
v5.0.0 Release Candidate 2 - 2016-11-07
- Fixed extension UI handling for BDXR service groups (see issue #30)
- Delete Business Card when Service Group gets deleted (see issue #31)
- Using specific namespace prefixes for SMP REST responses ('smp' in PEPPOL mode and
bdxrin BDXR mode) - The endpoint list can now also be view as a tree structure (see issue #36)
- Identifier case sensitivity (or insensitivity) is now based upon the used identifier schemes (to comply with the generic BDXR SMP CS03 specification).
In BDXR mode all identifier types are case insensitive where in PEPPOL mode only the participant identifiers are case insensitive (when using the
iso6523-actorid-upisscheme). - Service groups, endpoints and Business Cards can now be exported and imported to simplify the migration with all data to a different SMP (see issue #37)
- Added the possibility to delete empty processes and empty document types from the list of endpoints.
- A simple Vagrant setup for SMP was provided by @jerouris and can be found at https://github.com/phax/phoss-smp/tree/peppol-smp-server-parent-pom-5.0.0-rc2/vagrant
v5.0.0 Release Candidate 1 - 2016-10-13
- A special Migrations guide was created
- PEPPOL Directory automatic update was added (see issue #25)
- When running in BDXR mode, the Signature and Digest algorithm was fixed to SHA256
- The SQL implementation for the business cards is in place (see issue #28)
v5.0.0 Beta 1 - 2016-08-06
- JDK8 is be the minimum runtime requirement, the configuration is totally backwards compatible
- The REST-API of the SMP can now supply either the PEPPOL XML format (in namespace http://busdox.org/serviceMetadata/publishing/1.0/) or the BDXR SMP XML format (in namespace http://docs.oasis-open.org/bdxr/ns/SMP/2016/05) (see issue #29)
- The "SMP - SML tools" page from http://peppol.helger.com has been integrated (see issue #22)
- It's possible to customize the SMLs to use inside the tool (see issue #23)
- A truststore for https connection with the SML can now be configured
- Keystore and truststore can be reloaded at runtime
- Identifier types are now customizable (see issue #20)
- The "minimum SQL" implementation introduced in 4.1.1 was removed again because the original requestor no longer uses it.
- Improved the integration of the PEPPOL Directory configuration into the system
- New pages for bulk changing URLs and certificates are present (see issues #4 and #27)
- Certain settings can now be changed at runtime:
- Enable or disable the writable REST APIs
- Enable or disable the PEPPOL Directory integration and specify the hostname
- Enable or disable the connection to the SML and the specify the management endpoint
- The "Transport profiles" page was moved into the "Administration" sub menu
v4.1.2 - 2016-03-05
- This is the last version supporting JDK 7
- Added experimental support for PEPPOL Directory Business Cards (properties
smp.peppol.directory.integration.enabledandsmp.peppol.directory.hostname) - see PEPPOL Directory Integration
v4.1.1 - 2016-02-23
- Added a new "minimum SQL" SMP implementation without a GUI - as simple as possible: peppol-smp-server-webapp-sqlmin
- All service group (participant) identifiers are now treated case insensitive.
- Fixed the handling of the SML migration keys as SMK 3 limits them to 24 characters
v4.1.0 - 2015-12-07
- Changed the application title to "ph-peppol-smp-server"
- Fixed some internal URL encodings in links (on the UI)
- Endpoint reference URLs are now optional - creating empty Address elements
- Fixed a problem that consecutive PUTs for service information caused an internal error and required an intermediate DELETE
- Deletion of redirects via the REST API works
- Separated the version number into a separate properties file (version.properties)
- Fixed an EclipseLink caching issue that "find"s after delete still delivered a result (SQL backend only)
- Added new smp-server property
smp.publicurlto specify the public (outside) URL of the SMP server in an easy way - Added the possibility to define custom transport profiles and use them for your endpoints
v4.0.3 - 2015-11-09
- Fixed a severe bug - the SML deletion of service groups did not work with the SQL backend - the XML backend is not affected!
- A new page "Tasks and problems" showing potential misconfiguration and action items for all service groups was added
- Added new version number property ('webapp.version' in file webapp.properties)
v4.0.2 - 2015-11-05
- Added the configuration option
smp.rest.writableapi.disabledto disable the non-standard writable REST API programmatically. See Configuration for details. - Updated the SML client so that it works with the new CIPA SMK 3.0.0 (passing SMP-ID when deleting a participant)
v4.0.1 - 2015-10-08
- fixed a problem that some signed serialized REST responses could not be validated correctly
v4.0.0 - 2015-10-04
- Initial version with management GUI and replaceable backend