Added
- A planned meal opens the recipe it was planned from. A meal can be tied to one of the
household's own recipes - the field is in the form, it is stored, and the shopping-list transfer
reads it. The button on the meal card, though, only ever appeared for an external web address, so
the internal link had no way out: you could create it and never use it, and anyone cooking from
the week plan landed in the edit dialog instead (#936). Meal cards with a linked recipe now carry
a second button that opens it, expanded and ready to read rather than open for editing - whoever
comes from the meal plan wants to cook. It is a real link, so command-click and "copy link" work
the way they should. A meal that has both a recipe and an external address shows the recipe,
because that one stays inside the app.
Fixed
-
Events pushed to a CalDAV server carry a time zone. An event created in Yuvomi went out as
DTSTART:20260830T100000- no zone, no UTC marker, noVTIMEZONE. That is "floating time": the
standard allows it, and it means "ten o'clock on the clock of whoever reads it". Apple's Calendar
and eM Client substitute the device's own zone and land on the right hour; a Synology with a
DAViCal backend accepts the event, hands it back unchanged when asked, and never displays it in
its own web interface, because its index needs a point in time and was given none. The reporter
measured exactly that difference: the same appointment, visible in the native client, missing from
the server's own front-end (#938). Times now carry the household's zone, the same way the export
feed has since v2.24.3, and a matchingVTIMEZONEtravels with them. Recurring series keep the
zone they were imported with, so a weekly appointment does not shift by an hour across a daylight
saving change. Events already on a server take the corrected value on their next push; where the
household zone is UTC the value gets a plainZinstead. -
The currency setting is where you look for it. It sat inside the format card under Appearance
→ Region / Format, and that card is hidden whenever a region preset matches your settings exactly.
Since the currency is one of the things a preset is matched on, the effect was circular: on a
default installation the card stays shut and the field is invisible - but change the currency and
no preset matches any more, the card opens, and the field appears. It only became visible once you
had already found it, which nobody had. The note in Module options pointing at "Appearance →
Region / Format" led to exactly the place where nothing was shown; the reporter searched both and
came away empty both times (#934). The currency now sits in the region card, which is always
visible. Picking a region still fills it in - that stays the quick way, it is just no longer the
only one. A currency is not a format: dates and times say how a value is written and follow a
place, while a household can keep German formats and an account in dollars.
Security
-
A redirect can no longer strip TLS or take credentials with it. Yuvomi's outgoing requests -
calendar subscriptions, WebDAV storage, recipe mirrors, document management - carry an SSRF guard
that validates every address they connect to, and it followed redirects correctly. Two things,
though, are not properties of an address, and both were unchecked. A target server could redirect
fromhttps:tohttp:, and the follow-up request went out in the clear without the caller ever
learning of it. And the request headers travelled unchanged to whatever host the redirect named -
for CalDAV, WebDAV and DMS accounts those headers hold a plaintext password, so a hostile or
taken-over server could collect a household's credentials with a single 302 to somewhere else.
Redirects now have to stay on http/https and may not step down from https; the credential headers
are dropped when the origin changes, and only then, so a server sending/calto/cal/keeps
working. Reported as part of a security audit (#937). -
Uploads are checked against their content, not just their declaration. Every upload arrives as
a data URL, and the type in its prefix -data:application/pdf;base64,...- comes from the
sender's browser and can be set to anything. Five paths took that word for it: documents, birthday
photos, housekeeper pictures, quick-link icons and subscription logos, each with its own check and
none of them looking at the file. Yuvomi now verifies the file's own signature for PDF, PNG, JPEG,
WebP, GIF and the Office formats. Plain text and CSV keep passing unchecked - text has no header,
and a rule that guessed would reject a spreadsheet whose first cell holds angle brackets. What is
served to the browser was already protected against the execution side of this (fixed content
type,nosniff, a narrow policy); the gain here is the quiet failure - a file filed as an
insurance policy that is not one, noticed years later when whoever uploaded it is long gone.
Reported as part of a security audit (#937).