News and noteworthy - phax/phoss-smp GitHub Wiki

Releases

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-sha256 for EC keys and rsa-sha256 for 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 Read request with a BadRequestFault (code 106), because the mandatory PublisherEndpoint was missing in it. The fix is in peppol-sml-client 13.2.1, which sends a PublisherEndpoint with dummy addresses - the SML ignores them for the Read operation. 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} and GET /{ServiceGroupId}/services/{DocumentTypeId}, enabled via smp.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 after smp.rest.cache.ttl (default 60s). The storage can be replaced via the new SPI interface ISMPRestResponseCacheSPI - by default an in-memory cache with at most smp.rest.cache.maxitems (default 10000) entries is used. See #555
  • The response of the REST API Service Group import (PUT /exchange/import/xml/v1/{UserId}) now honours the Accept header. application/json results 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 overload ServiceGroupImport.importXMLVer10 takes the additional bDryRun parameter.
  • 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 $func and $timer statistics 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 containing summary.xml, missing-in-sml.txt and orphans-in-sml.txt. The new configuration property sml.sync.retention.days defines how long the reports are kept - the default is 30 days - and sml.sync.page.delay optionally 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 via DeleteList() 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 of sml.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 a CreateList() or DeleteList() 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.threshold Service 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, with smp.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 and sml.smpid is 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 class SMLRegistrationCache offers a clearCache () method to drop the cached result.
  • Fixed the Directory not being notified when a Process is deleted in the Endpoint Tree page. The method deleteSMPProcess of ISMPServiceInformationManager did not invoke the registered ISMPServiceInformationCallback instances, so the automatic Directory update did not happen. It now invokes onSMPServiceInformationUpdated, 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 MODIFY audit entry is written instead of a DELETE and a CREATE audit 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 the DELETE audit entry. The MongoDB backend performs the replacement in a single replaceOne operation, 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 - in mergeSMPServiceInformation as well as in deleteSMPProcess - 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. getSMPRedirectOfServiceGroupAndDocumentType and getSMPServiceInformationOfServiceGroupAndDocumentType derive the deterministic object ID from the participant ID and the document type ID and resolve it directly, so that a GET of a Service Metadata no longer walks all Redirects and all Service Informations of the installation. The new methods SMPRedirect.createSMPRedirectID (...) and SMPServiceInformation.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 below java.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, SMPTransportProfile and ESMPTransportProfileState moved from com.helger.peppol.smp to com.helger.edelivery.smp, so ISMPTransportProfileManager, SMPTransportProfileManagerXML, SMPTransportProfileManagerJDBC, SMPTransportProfileManagerMongoDB, SMPTransportProfileCache and HCSMPTransportProfileSelect now use the new types in their signatures
    • ESMPAPIType moved from com.helger.peppol.sml to com.helger.edelivery.smp, so ESMPRESTType.getAPIType () returns the new type
    • EPeppolCodeListItemState was renamed to ECodeListItemState and moved from com.helger.peppolid.peppol to com.helger.peppolid.codelist - it is used by SMPNiceNameUI to render the state of a transport profile
    • The DNS based URL providers moved from com.helger.smpclient.url to com.helger.smpclient.url.dns, and IPeppolURLProvider is deprecated in favour of IBDXLURLProvider, so the Check DNS state action of the Service Groups page only distinguishes IBDXLURLProvider now. Both providers that can be active - PeppolNaptrURLProvider for smp.rest.type = peppol and BDXLURLProvider for 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 through PeppolSMPExtensionHelper.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 search domains of the operating system resolver configuration are no longer appended to it. Previously an unresolvable participant caused one additional DNS query per search entry, 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_FOUND and TYPE_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
  • 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-commons save 160 KB, but the OASIS BDXR identifiers that phoss-SMP needs now arrive in the separate bdxr-id and edelivery-id JARs
  • The configuration property webapp.security.login.errordetails now defaults to false, 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 to true for backwards compatibility, which allowed an unauthenticated user to find out whether a specific user exists. Set the property to true explicitly 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 uses SameSite=Strict by default, so that a browser does not send it on cross-site requests. The value is configurable with the new configuration property webapp.session.cookie.samesite, that accepts Strict, Lax and None - an empty value leaves the attribute untouched, so that only the web.xml or the application server determine it. Because of Strict, 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. If None is used, the cookie must be marked as Secure as 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 the Secure flag, so that a browser only sends it via https, using the new configuration property webapp.session.cookie.secure. Possible values are true, false and auto, with auto being the default: it enables the flag, if smp.publicurl is an https URL, 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 values true and false overrule an existing setting from the web.xml or from the application server. The flag is set on startup, before the ServletContext is 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: dt on smp-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, doctypeid on smp-serviceinfo and on smp-redirect for the Service Metadata lookup of the REST API, which is the most frequent query of an SMP at all; ownerid on smp-servicegroup for the listing of the Service Groups of a single owner; email on users for the login; and tokens.token on user-tokens for the resolution of a Bearer token, which happens on every token authenticated REST request. On smp-redirect and smp-serviceinfo the 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 methods getAllSMPServiceGroups (ESMPServiceGroupFilter, IPagingSpec, String), getSMPServiceGroupCount (ESMPServiceGroupFilter, String) and containsAnySMPServiceGroup (ESMPServiceGroupFilter) of ISMPServiceGroupManager. The new ESMPServiceGroupFilter expresses 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 a NOT EXISTS sub select for SQL and a $lookup for MongoDB, so that they no longer need to read the whole table. (MongoDB) Two indexes are created for that on startup: sgid on the collection smp-businesscard, and pid as well as direction, state on the collection smp-participant-migration. The create forms now open on "(please select)" instead of silently preselecting the first Service Group. The class HCServiceGroupSelect is now a factory with the single method createAjax (...); the previous method create (...) and the eager select box were removed. Based on #548 - thx @vrbyjimmy. See #546.
  • (SQL) Added the new database migration V38 that creates the indexes that were missing on the hot paths, for MySQL, PostgreSQL, Oracle, DB2 and SQL Server. Created in all dialects are IX_smp_endpoint_tprofile on smp_endpoint (transportProfile) for the transport profile usage check, IX_smp_pmigration_dir_state on smp_pmigration (direction, state) and IX_smp_pmigration_pid on smp_pmigration (pid) for the listing and the deletion of participant migrations, IX_smp_audit_dt on smp_audit (dt) and IX_smp_audit_userid on smp_audit (userid) for the audit list, which is ordered by date and filtered by user and which grows unbounded, and IX_smp_secusertoken_userid on smp_secusertoken (userid) for the resolution of a user token to its user. IX_smp_secuser_email on smp_secuser (email) is created for all dialects except DB2 and SQL Server, IX_smp_ownership_username on smp_ownership (username) for all except MySQL, IX_smp_secuser_loginname on smp_secuser (loginname) for MySQL, PostgreSQL and Oracle, IX_smp_smr_participant on smp_service_metadata_red (businessIdentifierScheme, businessIdentifier) for PostgreSQL, DB2 and SQL Server, and IX_smp_bce_pid on smp_bce (pid) for PostgreSQL and Oracle - the remaining dialects already have these indexes since V1 respectively V8. On MySQL the columns loginname and email are of type TEXT, 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 mode IGNORE_SPACE is 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_settings entry latest-id was read with a plain SELECT and written back with an absolute UPDATE, 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 conditional UPDATE that 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 of PUT /{ServiceGroupId}/services/{DocumentTypeId}, which overwrites all existing Processes and Endpoints of a Document Type. The expected body is a single Endpoint element, in the flavour of the configured smp.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 with 400, so the call can never silently replace an existing Endpoint. Redirects are not touched by this call. The new method is saveServiceRegistrationEndpoint (String, String, String, EndpointType, SMPAPICredentials) of SMPServerAPI, BDXR1ServerAPI and BDXR2ServerAPI. The body is read with the new marshallers SmpEndpointMarshaller, Bdxr1EndpointMarshaller and Bdxr2EndpointMarshaller of the new package com.helger.phoss.smp.jaxb. The Peppol SMP and the OASIS BDXR SMP v1 XSD declare no global Endpoint element, 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 table smp_sectotp for SQL (migration V37), the collection smp-user-totp for MongoDB and the file smp-user-totp.xml for the XML backend. See the Security page for the details.
  • Added the new configuration property smp.totp.enabled to enable the two-factor authentication of the management GUI. It defaults to false.
  • 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 LoginThrottlePerIP of 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.issuer to 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.performInTransaction were 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 returned ESuccess or 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 ITelemetryTracerSPI respectively an ITelemetryMeterSPI all emission degrades to cheap no-ops, and the delivered SMP WAR contains none. To collect the data, add com.helger.telemetry:ph-telemetry-otel and an OpenTelemetry SDK to a custom build, subclass OtelTelemetryTracerSPI and OtelTelemetryMeterSPI with a no-argument constructor and register the subclasses via META-INF/services. Covered are the REST API invocations - the span photon.api.invoke plus the instruments photon.api.invocations and photon.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 the PhotonWorkerPool - 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.active and phdb.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-security of 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 via ph-xmldsig, so a BCFKS keystore or truststore (smp.keystore.type respectively smp.truststore.type) keeps working as before.
  • ph-web 11.4.5 caches the system default trust store - the JRE cacerts respectively the one named by javax.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, SortColumn and TableColumnHelper in the new package com.helger.photon.core.paging as well as DataTablesOnDemandHelper in ph-oton-datatables - and the SMP uses them now. The SMP classes SMPSortColumn, SMPTableColumnHelper and SMPDataTablesOnDemand were therefore removed, and ISMPTableColumn extends ITableColumn and only adds the mapping onto the SQL columns and the MongoDB fields. The column enums of the domain objects - like ESMPServiceGroupColumn - follow the ph-oton contract now: getValueProvider () was replaced by getSearchValueProvider (), which returns null if the column is not searchable, and by getComparator (), which returns null if the column is not sortable, so that isSearchable () and isSortable () 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_audit itself - as the new migration V36 of v8.4.0 does. The audit item sql-migration-success is written from the Flyway AFTER_EACH_MIGRATE callback, which runs inside the still open transaction of the migration, whereas the INSERT of 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 column names and leaves name empty - and ESMPBusinessCardColumn.NAME only 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 that UserManagerMongoDB.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 IPagingSpec parameter (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 ISMPTableColumn and one implementing enum per domain object - ESMPServiceGroupColumn, ESMPServiceInformationColumn, ESMPRedirectColumn, ESMPBusinessCardColumn and ESMPParticipantMigrationColumn. Such a column ties the column shown in the UI to the SQL columns, to the MongoDB fields and to an in-memory Comparator, 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. SMPTableColumnHelper contains 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_DEMAND of 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 (mode PRERENDERED), 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 class SMPDataTablesOnDemand - that renders the rows of one page. The name of a sortable table column is the ID of the respective ISMPTableColumn, 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.showsource is enabled, as in the footer. The configuration properties webapp.startpage.dynamictable, webapp.startpage.participants.none and webapp.startpage.extensions.show were removed accordingly, as were the methods SMPWebAppConfiguration.isStartPageDynamicTable (), isStartPageParticipantsNone () and isStartPageExtensionsShow ().
  • 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 SMPPagination instead. 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 BY clause, 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-null sort 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 - see SMPTableColumnHelper.getAllDefaultSortColumns (...) and getAllDefaultSortFields (...); for the SQL backend it is passed on to DBPagingHelper of 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 by SMPDataTablesOnDemand.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 LIKE wildcards (% and _) contained in the search text are escaped, so that they are matched literally. Added SMPJDBCQueryHelper (SQL) and SMPMongoQueryHelper (MongoDB) for that; the database specific ORDER BY and LIMIT/OFFSET rendering comes from ph-db 8.4.2. The XML backend uses the new getAllPaged (...) 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 single getAll... (IPagingSpec, String). The static isMatchingSearchText (...) methods of the four manager interfaces and the classes SMPPagingHelper and SMPJDBCPagingHelper were removed - their behaviour now lives in ISMPTableColumn respectively 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-ready next 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 Kubernetes readinessProbe stops routing traffic to a pod whose database is unavailable, without the restart loop a livenessProbe would 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 classes SMPReadyServlet, SMPReadyXServletHandler and SMPReadyProvider as well as the new SPI interface ISMPReadyProviderExtensionSPI. Every backend provides exactly one implementation of it - SMPXMLReadyProviderExtensionSPI (always ready), SMPSQLReadyProviderExtensionSPI and SMPMongoDBReadyProviderExtensionSPI. 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 property smp.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 - blocks DataSource.getConnection() forever, well beyond jdbc.pooling.max-wait. Added the new method SMPServerConfiguration.getReadyTimeout ().
  • Added the new methods SMPDataSourceSingleton.isDBConnectionPossible () and SMPDataSourceSingleton.isDBConnectionPossible (int) and the new constant SMPDataSourceSingleton.DEFAULT_CONNECTION_VALIDATION_TIMEOUT_SECONDS. They replace the internal database check of SMPSQLStatusProviderExtensionSPI and additionally validate the received connection, because the connection pool hands out pooled connections unvalidated as long as jdbc.pooling.test-on-borrow is disabled - which is the default. The status item smp.sql.db.connection-possible therefore 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 API PUT /businesscard/{ServiceGroupId}/push and 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 a NullPointerException.
  • Added the new database migration V36 for the SQL backend. It changes the columns creationuserid, lastmoduserid and deleteuserid of the tables smp_secrole, smp_secuser, smp_secusergroup and smp_secusertoken as well as the column userid of the table smp_audit from varchar(20) to varchar(45), for MySQL, PostgreSQL, Oracle, DB2 and SQL Server. All user IDs are limited to 45 characters now, so that a user ID created by GlobalIDFactory - which may be up to GlobalIDFactory.STRING_ID_MAX_LENGTH (40) characters long - fits into every column referring to a user. Previously only the id columns of the security tables were varchar(45), whereas the columns referring to the creating, the modifying and the deleting user as well as the executing user of an audit item were varchar(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 class RequestUserIDProvider, 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 via GlobalUserIDProvider.getCurrentUserID (), which prefers the request user over the session user of the LoggedInUserManager. The XML and the SQL backend use the ph-oton default provider, which behaves the same way. Added the tests SMPAPIUserIDTest - covering Basic Auth, Bearer token, invalid credentials, that no session is created and that the identity does not leak into the next request - and AuditUserInterfaceTest, 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' from script-src, because with 'strict-dynamic' present all host and scheme sources are ignored by the browser anyway, and removed it from style-src-attr, where only 'unsafe-inline' and hashes are meaningful. Both were inert and only implied a fallback that does not exist. Added base-uri 'self', form-action 'self', frame-ancestors 'none' and object-src 'none'. Note that form-action and frame-ancestors do not fall back to default-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 a report-to directive and the new Reporting-Endpoints HTTP 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 an http(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 V35 that adds the nullable column job_type varchar(100) and the index IX_smp_long_running_job_jt to the table smp_long_running_job, for MySQL, PostgreSQL, Oracle, DB2 and SQL Server. The column is written by the LongRunningJobResultManagerJDBC of 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-header a non-default port contained in the host parameter of the Forwarded HTTP 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]:8443 are now split into host and port correctly. See #514 - thx @vinit-thummar
  • Fixed that in the public URL mode x-forwarded-header the port of the incoming request was never used as a fallback, because the internal fallback flag was initialized to false and could never become true. If none of the X-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 of X-Forwarded-Proto or X-Forwarded-Host is present, but X-Forwarded-Port is not, the default port of the scheme is still used. See #518 - thx @vinit-thummar
  • Fixed that in the public URL mode x-forwarded-header the port was contained twice in all created URLs (as in https://example.com:8443:8443/...), if the X-Forwarded-Host HTTP header already contained a port and the X-Forwarded-Port HTTP header was present as well. An optional port is now split off the X-Forwarded-Host value before the URL is created - taking bracketed IPv6 literals like [::1]:8443 into account. The X-Forwarded-Port header still takes precedence; if it is absent, the port contained in X-Forwarded-Host is 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 localhost or 127.0.0.1. Previously a substring check on the whole URL was performed, so that e.g. https://localhost.example.org/..., https://[email protected]/... or https://example.org//localhost also disabled the TLS hostname verification. See #522 - thx @vinit-thummar
  • The Bearer scheme of the REST API Authorization HTTP header is now matched case-insensitively (e.g. bearer or BEARER), 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/v1 and GET /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 a Retry-After HTTP 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 class SingleRunLock, exposed as ServiceGroupExportJob.LOCK. Added the new exception class SMPServiceUnavailableException. 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 constant ServiceGroupExport.XML_WRITER_SETTINGS and the new method ServiceGroupExport.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-export below the configured webapp.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 class ServiceGroupExportJob. 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-export directory 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 method ServiceGroupExportJob.getValidExportFile (File) and the new menu item ID CMenuSecure.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.days defaults to 30 days; 0 or 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 class ServiceGroupExportPurgeJob, the new method ServiceGroupExportJob.purgeOldExportFiles () and the new method SMPServerConfiguration.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 (...) returned false for every Business Card that has more than one business entity, because the number of rows of the table smp_bce - which holds one row per business entity - was compared to exactly 1 instead of being checked for at least 1. As a consequence the REST API POST /businesscard/{ServiceGroupId}/push rejected 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 SingleRunLock class.
  • 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 SingleRunLock as well.
  • (MongoDB) Fixed that replacing an existing Service Information with a different object instance (as done by the REST API) invoked the onSMPServiceInformationCreated callback instead of onSMPServiceInformationUpdated. 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 (ownerid instead of id) was read. This affected the REST API GET /servicegroupids/all, the Service Group Import (UI and REST API PUT /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 deprecated instead of the field state used since v6.0.7, so that a changed state was silently lost when the Transport Profile was read again. Reading still falls back to the deprecated field, if no state field 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 smpredirect instead of smp.transport.profile. See #523 - thx @vinit-thummar
  • (MongoDB) Fixed that security operations that don't change anything reported EChange.CHANGED instead of EChange.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 method AbstractBusinessObjectManagerMongoDB.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) and forEachJobResult (String, Consumer), implementing the new methods of the ph-oton interface ILongRunningJobResultManager. The job type of a long running job is now stored in the new BSON field job_type (incl. an index on it), so that job results can be queried per job type. Documents written by previous versions have no job_type field 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 () and getEndpointCertificateUsageMap () 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-serviceinfo now creates the indexes id, sgid, processes.endpoints.endpointreference and processes.endpoints.transportprofile on startup, as all the other MongoDB managers already did for their ID field. Next to the endpoint queries, the index on id also speeds up updateAllEndpointURLs (...) and updateAllEndpointCertificates (...), which replace the matching documents by ID one by one.
  • Added the new method EndpointUsageInfo.addForServiceGroupID (String, int) as the bulk version of incrementForServiceGroupID (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_ID for the MongoDB internal _id field, 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 runs apt-get upgrade and installs only ca-certificates, wget and unzip with --no-install-recommends. The runtime image stays tomcat: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 respective RunInJettySMPSERVER_* 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-bootstrap5 0.9.2 library instead of ph-oton-bootstrap4 10.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 property webapp.imprint.cssclasses, the values must now be Bootstrap 5 CSS class names - e.g. badge text-bg-primary instead of the Bootstrap 4 badge 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 to true (detailed messages) - for security reasons it should be set to false. The detailed reason is always logged on the server, independent of this setting. Added the new constant SMPUserManagerPhoton.MSG_AUTH_FAILED and the new constructor SMPUnknownUserException (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 (...) returned null instead of an empty list, if the provided Transport Profile ID was null or empty, violating the non-null contract of the method. See #499 - thx @gregjotau
  • Fixed that in the public URL mode forwarded-header a syntactically invalid Forwarded HTTP header value led to a NullPointerException instead of falling back to the data of the incoming request.
  • (Docker) All maintained Docker images now use tomcat:10.1-jdk25 as 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-xml that still used an obsolete Java 11 based toolchain - it now uses maven:3.9-eclipse-temurin-17. See #497 - thx @gregjotau
  • (Docker) Fixed that CATALINA_OPTS was 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-jre25 runtime baseline instead of tomcat:10.1-jdk25, making the images roughly 20% smaller. Only the Dockerfile-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-xml now uses maven:3.9-eclipse-temurin-25 instead of maven: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 keys sml.connection.timeout and sml.request.timeout. The legacy millisecond-typed keys sml.connection.timeout.ms and sml.request.timeout.ms remain 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 = 5s instead of the deprecated jdbc.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 dbnalliance value of the configuration property smp.identifiertype, which activates the DBNAllianceIdentifierFactory available via the new ESMPIdentifierType.DBNALLIANCE enum constant (via peppol-commons 12.5.2). It behaves like bdxr2 but treats Document Type and Process Identifiers as case insensitive regardless of the scheme.
  • (SQL) Replaced the third-party net.jodah:expiringmap dependency with the ManualCache from ph-commons for the internal Service Group cache
  • Switched the internal UI caches (Owner Name and Transport Profile) to the new ph-commons ProviderCache API
  • (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 like OutOfMemoryError, 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.host and http.proxy.port; http.proxy.enabled only acts as an explicit kill-switch when set to false
  • 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 PeppolTrustedCA objects (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 CRLAllowList to mitigate SSRF against attacker-controlled certificate URLs (via ph-commons 12.2.4)
  • Certificate revocation checks no longer return REVOKED when the CRL distribution point is unreachable - a new REVOCATION_STATUS_UNKNOWN result 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/*.ms keys 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.location and truststore.password have been removed - the smpclient.truststore.* variants must be used instead. A value for smpclient.truststore.type is 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" TrustManager was 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 FlywayMigrationRunner from ph-db
  • (SQL) The configuration property target-database is now deprecated. The new canonical key is jdbc.database-type. The old key is still supported as a fallback.
  • (SQL) The configuration property jdbc.schema-create is now deprecated. The new canonical key is smp.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 SMPJDBCConfiguration utility class with the instance-based SMPJdbcConfiguration extending JdbcConfigurationConfig from ph-db
  • (SQL) Replaced SMPFlywayConfiguration with SMPFlywayConfigurationBuilder extending FlywayConfigurationBuilderConfig from ph-db
  • (SQL) Replaced SMPDataSourceProvider with the generic DataSourceProviderFromJdbcConfiguration from 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_data from text to mediumtext
  • (SQL) Added new Flyway migration V34 that changes a column type for MySQL column job_data from text to mediumtext

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:// no Strict-Transport-Security header is emitted
  • (Security) The default time for the Strict-Transport-Security header 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 ISMPEndpoint now has an ID.
  • The Endpoint List and the Endpoint Tree now also shows the endpoint validity separately
  • Removed ISMPServiceInformationManager.findServiceInformation and added .getAllSMPEndpoints() instead
  • (SQL) Flyway migrates up to version 33
  • The Service Group export now contains a new attribute smp-version at 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.oib is place in the HR specific extension. See #418 - thx @magdakw
  • Added new REST API /servicegroupids/all to 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.hostname starts with http:// or https://. See #432 - thx @AnthonyL1996

v8.0.12 - 2026-01-18

  • (SQL) Added new configuration property jdbc.pooling.test-on-borrow to enable connection testing when borrowing from the pool. Default is false.
  • (SQL) The default value for jdbc.pooling.between-evictions-runs.millis was changed from -1 to 300000 (5 minutes)
  • (SQL) Added a table tomcat_sessions that 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.extension are 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.enabled containing the configuration property on remote query API
  • Deprecated the configuration property hredelivery.sg.extension.on.si in favour of the new smp.hredelivery.* properties
  • Introduced new configuration properties smp.hredelivery.extension and smp.hredelivery.accesspointoib for 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.publicurl values without a trailing slash lead to a startup error - sigh - sorry guys

v8.0.3 - 2025-10-23

  • Fixed a regression, that smp.publicurl values with a trailing slash lead to a startup error

v8.0.2 - 2025-10-23

  • Removed the configuration property hredelivery.xml.root.no.nsprefix again, because the problem was resolved on HR side
  • Updated to ph-commons 12.0.4 to fix a bug with a potential NullPointerException in 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.mode to the status information
  • Added a consistency check that smp.forceroot=true in combination with an smp.publicurl value containing a path is not allowed
  • Made sure, that a context path contained in smp.publicurl is 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 EDatabaseType with EDatabaseSystemType from 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.nsprefix to use an empty XML namespace prefix for the root element. See #382 - thx @tnakir
  • Added new configuration property hredelivery.sg.extension.on.si to 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 SMPSettings private
  • Removed support for the configuration property smp.publicurl.mode value dynamic-participant

v7.2.8 - 2025-08-13

  • Updated to Peppol eDEC Code Lists v9.3
  • The default truststores in the provided application.properties files 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-header and forwarded-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.mode with value dynamic-participant is 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 /public was removed. This also means, that the configuration property webapp.public.login.enabled has 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 /ping API endpoint to SMP web applications for an efficient aliveness check
  • The configuration files webapp.properties and smp-server.properties are 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-upis schemes 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}/push to 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.publicurl configuration 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) and busdox-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@... to EC-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.properties and webapp.properties are deprecated and should not be used anymore. All the properties should be placed in application.properties.
    • The system properties peppol.smp.webapp.properties.path and smp.webapp.properties.path are no longer evaluated and will lead to a startup error.
    • The environment variable SMP_WEBAPP_CONFIG is no longer evaluated and will lead to a startup error.
    • The configuration files private-smp-server.properties and smp-server.properties are deprecated and should not be used anymore. All the properties should be placed in application.properties.
    • The system properties peppol.smp.server.properties.path and smp.server.properties.path are no longer evaluated and will lead to a startup error.
    • The environment variable SMP_SERVER_CONFIG is no longer evaluated and will lead to a startup error.
  • 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.type Configuration value bdxr2
  • 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-20010315 from 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_secuser from clob to varchar(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 utf8 to latin to 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.properties called webapp.public.showappname to disable the display of the application name in the /public part
  • Added new property in webapp.properties called webapp.public.showsource to disable the display of the application source in the /public part
  • Certain HTTP redirects now correctly honour the public URL - this only affects usage behind a reverse proxy

v5.4.5 - 2021-12-21

v5.4.4 - 2021-12-14

v5.4.3 - 2021-12-10

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 PUT and DELETE APIs 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-possible when using the SQL backend
  • (SQL) Added a new configuration property smp.status.sql.enabled to disable the new status item
  • Added a new configuration property smp.timezone to 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.properties file
  • Added new status item startup.datetime
  • (SQL) The new configuration item smp.flyway.enabled allows 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-create to 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-database for SQL backends
  • (SQL) Added new configuration item jdbc.schema to 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-sql module 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.disabled must be set to false.

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.persist to 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.txt that 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-server to phoss-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 to com.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
  • 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 /secure now 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.enabled in webapp.properties can be used to turn off the login possibility from /public URLs (see issue #102)
  • The Docker internal environment variable VERSION was renamed to SMP_VERSION to 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.exceptions with the default value of false
  • 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.needed that 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 simple it 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.publicurl that contains the public URL from the configuration file
  • The Status API got a new item smp.forceroot that 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-Options HTTP header is now by default set to SAMEORIGIN to 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 /public now 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.properties configuration item global.debugjaxws of type boolean to 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.url got useless.
  • The name of the Directory can now be customized using webapps.properties configuration item webapp.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=UTC to 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.none in webapps.properties.
  • Warning about disabled SML can be turned off (see issue #53). Configure via property sml.needed in smp-server.properties.
  • Added configurable timeouts from SMP to SML using the properties sml.connection.timeout.ms and sml.request.timeout.ms as mentioned in issue #67.
  • The Certificate information page now has explicit support for the new OpenPEPPOL PKI v3
  • By using the predefined truststore path truststore/complete-truststore.jks with password peppol support 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.properties can 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 vim by 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.dynamictable to true in the webapp.properties file.
  • 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.xml is 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

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 bdxr in 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-upis scheme).
  • 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.enabled and smp.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.publicurl to 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.disabled to 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
⚠️ **GitHub.com Fallback** ⚠️