Server
[1.4.0] - 2026-11-09
Added
- Publisher agreements without an external service: set
ovsx.publisher-agreement.version(such as1,1.0or1.0.0) andovsx.publisher-agreement.textto make users sign before publishing; a new major version makes signatures outdated, unlessovsx.publisher-agreement.allowed-versionsnames the versions whose signatures stay valid (#2325) - An outdated agreement stops publishing until it is signed again, while a revoked or missing one also takes extensions offline on the startup compliance check (#2325)
- Admins can reinstate a revoked agreement with
POST /admin/publisher/{provider}/{loginName}/reinstate-agreementand list a user's signings, revocations and reinstatements withGET /admin/publisher/{provider}/{loginName}/agreement-history; migrationV1_82adds thepublisher_agreement_eventtable (#2325) ovsx.publisher-agreement.check-compliance-on-startruns the publisher compliance check on startup for any agreement provider (#2325)GET /admin/api/permissionslists the permissions a deployment registersGET /admin/user/searchtakes apermissionparameter, a permission name orany, to list users granted it individually; admins are not matched (#2399)- Trusted publishing registers a repository the provider cannot look up, such as a private one, as pending until its first publish presents the single-use registration code (
registrationCode, valid for 7 days); migrationV1_85(#2350)
Changed
- The Eclipse publisher agreement and OAuth login moved behind the
PublisherAgreementProviderandExternalLoginProviderextension points, andUserJson.publisherAgreementgainsloginProviderandloginProviderName(#2325) - A login of any provider returns to the page that started it, when that page is passed as
redirect, instead of theeclipselogin always going to the profile page (#2325) - Signing an agreement that is already signed answers 200 instead of 400, and
additionalLogins[].loginNameof a user is no longer set (#2325) - Upgrade: the
ovsx.eclipse.*properties, their deployment descriptor entries and the Eclipse handling ofgenerate-properties.sh(ECLIPSE_CLIENT_*, and theovsx.publishing.require-license=trueit set) are removed without a fallback, soovsx.eclipse.check-compliance-on-startbecomesovsx.publisher-agreement.check-compliance-on-start; a deployment that needs Eclipse supplies a@PrimaryPublisherAgreementProvider, otherwise everyone may publish unlessovsx.publisher-agreement.versionis set (#2325) ovsx.data.mirror.requests-per-secondnow spaces upstream requests evenly instead of allowing a burst of up to one second of requests after an idle period (#2324)- A failed namespace change is retried once, instead of ten times as JobRunr does by default (#2353)
Permissionis an open type that deployments extend throughPermissionProvider; only registered permissions can be granted, open/admin, or reserve a user's revocation to admins, and an unknown name is a 400- A request that needs a logged-in user answers 401 instead of 403 when nobody is logged in, so clients can tell an expired session from a missing permission (#2416)
Removed
CodedAuthException.ECLIPSE_MISSING_GITHUB_IDandECLIPSE_MISMATCH_GITHUB_IDare removed; a login provider that needs such codes defines them itself (#2369)- The columns
user_data.eclipse_tokenanduser_data.eclipse_person_idare dropped, withUserData.eclipseToken/eclipsePersonId,AuthTokenandAuthTokenConverter(#2369) - Upgrade: migration
V1_83fails, and so does the startup, while either column still holds data; a deployment that uses them copies the rows to its own table and sets both columns toNULLfirst, in a migration that sorts beforeV1_83(#2369) AdminService.forgetUserpublishes aUserForgottenEvent(userId)in the erasure's transaction, whether the row is deleted or anonymized, for a deployment that keeps personal data of a user elsewhere to clear it (#2369)- Tier-based rate limiting, its admin and
/user/customersendpoints, and theovsx.rate-limit.*andovsx.caching.{customer,tier,rate-limit-token,usage}.*settings are removed - Upgrade: migration
V1_84drops the six rate limit tables and refuses to run while they hold rows, so move the data out and stop writing to them first; supply aRedisClusterClientbean (or enable bucket4j'sredis-cluster-jediscache) if rate limiting provided it; storedmanage_rate_limitsgrants stop counting, and are dropped on the next access save, unless aPermissionProviderregisters that name; delete the JobRunr recurring jobscollect-usage-statsandcalculate-daily-usage-statsunless your deployment reschedules them under those ids; keep an every-admin-handler-authorizes check likeAdminEndpointPermissionCheckTestin your own admin controllers
Fixed
- Moving extensions into an existing namespace no longer reverts edits made to that namespace while its files were being copied (#2353)
- Signing the publisher agreement and the bulk revocation of publishers are refused while the registry is in read-only mode, like the other endpoints that write to the database
- Fix the startup failure with
bucket4j.enabled=trueby bumping bucket4j-spring-boot-starter to 0.14.0 (Spring Boot 4) and bucket4j to 8.15.0 (#2405) - The publisher and admin extension details show the version the registry serves as latest instead of a higher removed one (#2409)
Dependencies
- Remove the direct
guavadependency (#2324) - Bump Spring Boot to 4.0.9, with Jetty 12.1.14, Netty 4.2.19.Final and PostgreSQL driver 42.7.14
- Force the transitive
guava(fromgoogle-cloud-storage) from 33.5.0 to 33.7.2, fixing uncontrolled memory allocation when deserializing Guava's compact hash collections (#2431) - Bump OpenTelemetry from 1.63.0 to 1.67.0, fixing quadratic CPU use when parsing crafted W3C
tracestateheaders; the discontinued Zipkin exporter stays at 1.64.0 (#2430)
Web UI
[1.4.0] - 2026-11-09
Added
PageSettings.elements.errorHelpadds a deployment's help below the message of the error dialog, given the error code and message, such as a link for the code of a login provider it adds (#2369)useReportedQueryrequires anactionthat titles the error dialog with what failed, e.g. "Couldn’t load the namespace members", and anignorepredicate for the errors a page renders itself, e.g.isNotFoundfor a 404 shown as a not-found state;MainContext.handleErrortakes the dialogtitledirectly- Curated home rows are regions labelled with their title and set
aria-busywhile they load, so assistive technology can tell a loading row from a loaded one PageSettings.elements.userSettingsTabslets a deployment contribute user-settings tabs- The index exports
handleError,NO_CACHE,DelayedLoadIndicator,Timestamp,AddUserDialog,GenerateTokenDialog,SearchListContainer,createMultiSelectFilterOperators,createArrayContainsFilterOperators,SettingsHeaderandEmptyPlaceholder, for pages contributed throughadminPagesanduserSettingsTabs - Filter users on the Access Control page by granted permission and show each user's permissions as chips in the results;
useAdminUserSearchtakes an optionalpermission(#2399) - Registering a trusted publisher for a private repository shows its single-use registration code once and marks the registration as pending in the list until the first publish completes it (#2350)
Changed
- The error dialog no longer has help for the
eclipse-missing-github-idandeclipse-mismatch-github-idlogin errors, and a failed publisher agreement points topageSettings.publisherAgreement.email, or to the registry's administrators without one, instead ofwebmaster@eclipse.org; the error message itself is still shown (#2369) - The publisher agreement panel and the admin revoke dialog take the login they require from the new
publisherAgreement.loginProviderandloginProviderName(display label) fields ofUserDatainstead of assuming Eclipse; without it no extra login is asked for; their login links return to the page they were on - The publisher agreement panel shows a
revokedstatus without a sign action, a different message for anoutdatedone, and admins can reinstate a revoked agreement MainContextkeeps its value,handleErrorandupdateUserstable across renders, so consumers can depend on them in effects and skip needless re-renders- The default publisher agreement text URL is now the server's
/api/publisher-agreement, instead of/documents/publisher-agreement.md sendRequestrejects a 200 carrying an error result and no longer retries; retries belong to the query client, which waits out a 429 for queries and never retries a mutation.ExtensionRegistryServicequery methods take anAbortSignalinstead of anAbortControllerand write methods take neither; no method resolves anErrorResultany more but rejects with it, asgetUserdoes when nobody is logged in.- The error dialog is titled with what failed, e.g. "Couldn’t load the namespace members", instead of a bare "Error"
- A curated row on the home page that fails to load shows "We couldn’t load extensions at this time." with a Retry button instead of disappearing;
CuratedRowcarries the row'serrorand arefetchfor custom home pages AdminPermissionis a string,ADMIN_PERMISSIONSnames the built-in ones, and the Access Control page lists permissions from the server, so a deployment can register its own- Breaking:
AppProvidersno longer mounts theQueryClientProvideror takes aqueryClient;Mainmounts it above everything else, so a page that mountsAppProviderswithoutMainwraps it in its ownQueryClientProvider
Fixed
- A query reported through
useReportedQuery(or a page's own error effect) no longer reopens the error dialog in a loop that cannot be closed while the query stays failed (#2348) - A failed review post or removal, token revocation or user search no longer leaves its spinner running
- An expired session no longer leaves the UI logged in and failing every request until the page is reloaded: a 401 the registry confirms is the end of the session logs the user out and asks them to log in again, back to the page they were on, which needs a registry that answers 401 when nobody is logged in; any other 401 is reported as an error
- The extension details show no latest version, instead of a removed one, for an extension the registry no longer serves (#2409)
Removed
sendNonRetriableRequest,controllerFromSignaland theabortControllerfield ofServerAPIRequest: usesendRequestwithsignal, and pass aqueryFn'ssignalstraight to the service- The Rate Limiting admin pages (tiers, customers, usage stats), the user-settings Rate Limiting tab, the
manage_rate_limitspermission and the tier, customer, usage and rate limit token methods and types ofExtensionRegistryService: a deployment adds such pages throughPageSettings.elements.adminPagesanduserSettingsTabs
Dependencies
- Bump vite from 8.3.2 to 8.3.5 (#2357)
- Bump markdown-it from 14.3.2 to 14.3.3 (#2358)
- Bump undici from 8.11.2 to 8.12.3 (#2362)
- Remove
fetch-retry; the query client owns retries - Bump dompurify from 3.4.16 to 3.4.17 (#2379)
- Upgrade
yarnfrom 4.9.1 to 4.18.1 and setnpmMinimalAgeGateto 7 days, so versions published in the last 7 days are not picked for new resolutions (#2393) - Bump qs from 6.16.0 to 6.17.1 (#2429)