Releases: mozilla/application-services
v145.0
v145.0 (2025-10-13)
✨ What's New ✨
Swift
- Added
@unchecked Sendableto classes that conform toFeatureManifestInterface. (#6963)
Ads Client
- Added the Ads Client component to the Megazord.
- Updated the ApiError enum to AdsClientApiError to avoid naming collision.
- The
context_idis now generated and rotated via the existing eponym component crate.
Relay
⚠️ Breaking Change: The error handling for the Relay component has been refactored for stronger forward compatibility and more transparent error reporting in Swift and Kotlin via UniFFI.- API and network errors from the Relay server are now converted to a single
RelayApiError::Api { status, code, detail }variant, exposing the HTTP status code, a machine-readable error code (if present), and a human-readable detail message. - Downstream client apps can now handle server errors based on both the
statusanderror_codefields directly, without additional changes to the Rust component - even as server-side error codes evolve. - Consumers must update their error handling code to match the new
Api { status, code, detail }shape.
- API and network errors from the Relay server are now converted to a single
Places
places::storage::history_metadata::get_most_recent(limit: i32)was added to get most recent history metadata limited to a number. (#7002)
FxA Client
- Expose
getAttachedClientsfrom the uniffi layer in the Android wrapper.
🦊 What's Changed 🦊
Docs
- Updated the components strategy doc to better reflect the current state of application services. (#6991)
v144.0
v143.0
🦊 What's Changed 🦊
Android
- Upgraded NDK from r28b to r28c. (#6848)
Logins
- Updated logins verification telemetry so it can be used in iOS(#6832)
- Updated insert statement to allow updating previously deleted logins via
add_with_meta.
Webext-Storage
- Added
get_keys()method (bug 1978718)
Search
- Added
SearchEngineUrl::is_new_until(bug 1979962) - Added
SearchEngineUrl::exclude_partner_code_from_telemetry(bug 1980474) - Added
SearchEngineUrl::accepted_content_types
RC Crypto
- Fix NSS bindings for key management
Mozilla Ads Client
- Created a new component,
ads-client
v142.0
Logins
- expose constructors for
ManagedEncryptorDecryptorandNSSKeyManager - change PrimaryPasswordAuthenticator callbacks to be async (a breaking change, but not yet used by anyone)
- return Result in PrimaryPasswordAuthenticator callbacks (again a breaking change, but not yet used by anyone)
- add factory for login store with nss key manager:
create_login_store_with_nss_keymanagerto avoid round-tripping the KeyManager trait interface through JS. - add LoginStore
shutdown()function to close database connection - extend LoginStore
shutdown()to also remove the encdec
Nimbus SDK ⛅️🔬🔭
- Updated the Nimbus API Stage URL
- Updated the Nimbus SDK to support setting Gecko preferences (#6826).
Nimbus FML && CLI
- handle http status codes when fetching feature manifests from GitHub.
Search
SearchEngineUrlsnow has an optionalvisual_searchfield, supporting
visual search endpoints in engine configs.SearchEngineUrlnow has an optionaldisplay_namefield, which is useful if
a URL corresponds to a brand name distinct from the engine's brand name.
v141.0
✨ What's New ✨
Filter Adult
- Added the first version of a component for checking if base domains exist in a
list of base domains for adult websites.
Logins
- add checkpoint API:
set_checkpoint(checkpoint)andget_checkpoint()for desktop's rolling migration - add
delete_many(ids)for batch deletion within a single transaction - Add
count(),count_by_origin()andcount_by_form_action_origin()methods
Sync Manager
- Added sync settings metrics for mobile. #6786
🦊 What's Changed 🦊
Context ID
- The
ContextIDComponentconstructor no longer throws an error. This is not a breaking change since neither iOS or Android implement this yet. - The
ContextIDComponentconstructor can now synchronously invoke the rotation callback when it receives an invalid timestamp from callers; in such cases, it falls back to the current timestamp and forces an ID rotation. rotate_context_idis no longer public since consumers can useforce_rotationinstead.
Glean
- Updated to v64.4.0 (#6795)
v140.0
⚠️ Breaking Changes ⚠️
Android
- Added
RustComponentsInitializer.kttoinit_rust_components.
Context ID
- Added the first version of a component for managing and rotating context IDs
sent to MARS / Merino.
BREAKING CHANGE
- Removed
Megazord.ktand moved the contents to the newRustComponentsInitializer.kt.
🦊 What's Changed 🦊
Remote Settings
RemoteSettingsService::syncis now more efficient. It checks the remote settings changes
endpoint and only syncs collections that have been modified since the last sync.
Logins
- add logins store api methods for bulk insert and meta insert, intended to be used during migration and CSV import on desktop:
fn add_with_record(&self, entry_with_record: LoginEntryWithRecordFields): add a login together with metadatafn add_many(&self, entries: Vec<LoginEntry>): add multiple logins with single transactionfn add_many_with_records(&self, entries_with_records: Vec<LoginEntryWithRecordFields>): add multiple logins with metadata within single transaction
Glean
- Updated to v64.3.1 (#6755/#6762)
- Reverted the JNA dependency version back to 5.14.0 due Android 5/6 crashes. (#6762)
🔧 What's Fixed 🔧
Remote Settings
- Fixed setting a new app context with
RemoteSettingsService::update_config
Search
- The
SearchEngineSelector::filter_engine_configurationwill now sort any
unordered engines by name rather than identifier.
v139.0
🦊 What's Changed 🦊
Android
- Upgraded the JNA dependency version to 5.17.0. (#6649)
- Updated to a newer version of Android Components (
139.0.20250417022706). - Upgraded NDK from r28 to r28b. (#6723)
Glean
Logins
- New
NSSKeyManager, which provides an NSS-backed key manager implementation.
Given aPrimaryPasswordAuthenticatorimplementation, the NSS keystore is used
to store and retrieve the login encryption key. These features are only
available when the Logins component is compiled with thekeydbfeature.
(#6571)
Sync Pass Example
The sync-pass example has been adapted to use the NSSKeyManager. The example
program can be called with an FX profile path in which the key is stored in the
file key4.db and secured with a possibly set primary password.
(#6571)
And it has been polished up a bit: passwords are no longer displayed in plain
text, the list view has been slimmed down and a detail view has been added.
(#6685)
- Added a function to locally remove corrupted logins. (#6667)
Remote Settings
- The
RemoteSettingsServiceconstructor andRemoteSettingsService::make_clientno longer perform any IO.
This integrates better with JS, which expects all IO to happen inside async functions. - Added
RemoteSettingsClient::close, which can be used to close the underlying SQLite DB during down.
⚠️ Breaking Changes ⚠️
Remote Settings
- Several methods
RemoteSettingsServiceare now infallible, which is a breaking change for Swift code.RelevancyStoreconstructorRemoteSettingsServiceconstructorRemoteSettingsService::make_client()SearchEngineSelector::use_remote_settings_server()SuggestStoreconstructor
OHTTP Client
- The now-unused
as-ohttp-clientcomponent is now removed. It was previously
only used by firefox-ios but no longer is.
v138.0
🦊 What's Changed 🦊
Android
nss
- Initialize nss explicitly (#6596)
BREAKING CHANGE:
Components need to call nss::ensure_initialized() before using any component
that depends on NSS. Applications can depend on the init_rust_components
component to handle initialization.
rc_crypto
ensure_initialized()now returns a Result
v137.0
v136.0
Logins
The Logins component has been rewritten to use a newly introduced EncryptorDecryptor trait.
BREAKING CHANGE
The LoginsStore constructor and several API methods have been changed:
The signatures of the constructors are extended as follows:
pub fn new(path: impl AsRef<Path>, encdec: Arc<dyn EncryptorDecryptor>) -> ApiResult<Self>
pub fn new_from_db(db: LoginDb, encdec: Arc<dyn EncryptorDecryptor>) -> Self
pub fn new_in_memory(encdec: Arc<dyn EncryptorDecryptor>) -> ApiResult<Self>
The methods do not require an encryption key argument anymore, and return Login objects instead of EncryptedLogin:
pub fn list(&self) -> ApiResult<Vec<Login>>
pub fn get(&self, id: &str) -> ApiResult<Option<Login>>
pub fn get_by_base_domain(&self, base_domain: &str) -> ApiResult<Vec<Login>>
pub fn find_login_to_update(&self, entry: LoginEntry) -> ApiResult<Option<Login>>
pub fn update(&self, id: &str, entry: LoginEntry) -> ApiResult<Login>
pub fn add(&self, entry: LoginEntry) -> ApiResult<Login>
pub fn add_or_update(&self, entry: LoginEntry) -> ApiResult<Login>
New LoginsStore methods:
// Checking whether the database contains logins (does not utilize the `EncryptorDecryptor`):
is_empty(&self) -> ApiResult<bool>
// Checking for the Existence of Logins for a given base domain (also does not utilize the `EncryptorDecryptor`):
has_logins_by_base_domain(&self, base_domain: &str) -> ApiResult<bool>
The crypto primitives encrypt, decrypt, encrypt_struct and decrypt_struct are not exposed anymore via UniFFI, as well as EncryptedLogin will not be exposed anymore. In addition we also do not expose the structs RecordFields, LoginFields and SecureLoginFields anymore.
SyncEngine
The logins sync engine has been adapted for above EncryptorDecryptor trait and therefore does not support a set_local_encryption_key method anymore.
Flattened Login Struct
The flattened Login struct now does not expose internal structuring to the consumer:
Login {
// record fields
string id;
i64 times_used;
i64 time_created;
i64 time_last_used;
i64 time_password_changed;
// login fields
string origin;
string? http_realm;
string? form_action_origin;
string username_field;
string password_field;
// secure login fields
string password;
string username;
}
rc_crypto
- New low level bindings for dealing with primary password.
- New feature flag
keydbinrc_crypto/nss, which enables NSS key persistence:ensure_initialized_with_profile_dir(path: impl AsRef<Path>)initializes NSS with a profile directory and appropriate flags to persist keys (and certificates) in its internal PKCS11 software implementation. This function must be called first; ifensure_initializedis called before, it will fail. - New methods for dealing with primary password and key persistence, available within the
keydbfeature:authentication_with_primary_password_is_needed(): checks whether a primary password is set and needs to be authenticatedauthenticate_with_primary_password(primary_password: &str): method for authenticate NSS key store against a user-provided primary passwordget_or_create_aes256_key(name: &str): retrieve a key bynamefrom the internal NSS key store. If none exists, create one, persist, and return.
Remote Settings
- Added support of content signatures verification (#6534)