Files
proton-sdk-rs/CHANGELOG.md
T
nvrl 781301a77b feat(sharing,public-link): update public links, name bookmarks, walk shared trees
- update_public_link sets the role, custom password and expiry of a node's
  public link and keeps its URL (TS updateSharedLink). Create and update
  share the sealing of the share key and SRP verifier.
- list_bookmarks decrypts the bookmarked item's name with the share key the
  stored password unlocks, and returns the custom password in the new
  Bookmark::custom_password. The URL fragment is now only the generated
  password.
- ProtonDrivePublicLinkClient::enumerate_subtree walks a shared folder
  breadth first, several folders of a level at a time.
- Add CHANGELOG.md, update the README feature table for this and the
  previous unreleased commits, and record the TS ports in UPSTREAM_SYNC.
2026-10-25 21:27:05 +01:00

66 lines
3.3 KiB
Markdown

# Changelog
Notable changes to `proton-sdk` and `proton-drive-rs`. The format follows
[Keep a Changelog](https://keepachangelog.com/1.1.0/); versions follow semver,
and both crates are released together under the workspace version. Upstream
commits a change ports are recorded in [UPSTREAM_SYNC.md](UPSTREAM_SYNC.md).
This file starts after 0.9.2; earlier changes are in the git history.
## [Unreleased]
### Added
- **Server-side copy.** `ProtonDriveClient::copy_node(uid, new_parent, name)`
copies a file, or a folder with everything in it, without downloading and
uploading it. The copy may get a new name and may land on another volume; the
returned uid is on the target volume. Ported from the TypeScript SDK
(`copyNode`).
- **Folder size.** `ProtonDriveClient::get_folder_size(uid)` returns a
`FolderSize` with the total size and the number of descendants, trashed nodes
included. Folders count as descendants, and the size is in encrypted bytes.
Ported from the TypeScript SDK (`getFolderSize`).
- **Changing a public link.** `ProtonDriveClient::update_public_link(uid, role,
custom_password, expiration_time)` sets the role, the custom password and the
expiry of the link on a node. The URL does not change. `None` removes a custom
password or an expiry. A legacy link cannot be updated. Ported from the
TypeScript SDK (`updateSharedLink`).
- **Walking a public link.** `ProtonDrivePublicLinkClient::enumerate_subtree`
and `enumerate_subtree_reporting` return every node below a shared folder,
breadth first, listing several folders of a level at once.
- **Bookmark names.** `list_bookmarks` now decrypts the bookmarked item's name
into `Bookmark::node_name`, and returns the link's custom password in the new
`Bookmark::custom_password` field.
- **Album capabilities from the C# SDK** (`a36cc423`):
- `ProtonPhotosClient::set_album_cover`;
- `ProtonPhotosClient::delete_album_saving_photos`, which on
`AlbumContainsPhotosNotInTimeline` (code 200302) saves the photos that are
only in the album to the timeline and deletes the album again;
- `add_photos_to_album` adds photos from another volume by copying them in,
instead of refusing them;
- a photo group the server reports as incomplete is retried once with the
missing related photos.
- `ResponseCode::AlbumContainsPhotosNotInTimeline`.
- `ApiHttpClient::post_query`, a POST that only reads and may be sent again.
### Changed
- **A read is sent again when its connection drops.** A GET, a block download or
a `post_query` that loses its connection mid-request or while reading the body
is retried under the client's retry policy. A write still is not: it may have
been applied. Read-only POSTs in `proton-drive-rs` (link details, thumbnails,
photo duplicates, `checkAvailableHashes`) now use `post_query`.
- `remove_photos_from_album` refuses a photo on another volume per photo, in
the input order, without sending it.
### Fixed
- A bookmark's URL fragment is now only the generated password, as in the URL
the web client shows. It used to include the custom password as well.
### Breaking
- `Bookmark` has a new public field, `custom_password`. Code that builds a
`Bookmark` with a struct literal must set it.
- `ResponseCode` has a new variant. An exhaustive `match` on it needs an arm.