Commit graph

12208 commits

Author SHA1 Message Date
wrd
760c5123ab [ios, sdk] Optimize build
Check if generated files are up-to-date to avoid cascading rebuilds.

Co-authored-by: ivk <ivk@tutao.de>
2025-10-22 10:03:49 +02:00
bir
7e1a5584bf [iOS] Fix cannot change local storage range date
The date's value was being set on every redraw, and since we handle date
selection onfocusout on iOS, this would result in date having an
outdated value if a redraw (triggered by progress monitor for example)
happens between input and focusout events.

To mitigate this, we only set the date's value `oncreate`.

Close #9642

Co-authored-by: hrb-hub <hrb-hub@users.noreply.github.com>
2025-10-22 10:03:49 +02:00
paw
3838a9e2c4 Fix SingleFactorEditDialog duplicating entries
Fixes the return key not closing the TOTP dialog.

Ensures that SingleFactorEditModel#save can only be called once at a
time.

Closes #9789
2025-10-22 10:03:49 +02:00
paw
b37af0503e [mimimi] don't panic if there isn't a console
We get a crash on Windows startup from this because there's no console.

Closes #9633
2025-10-22 10:03:49 +02:00
wrd
0825d99e7e Have Rich Text Toolbar actions for signature editor match mail editor
Inline images require transporting over IPC boundary

We have not implemented a suitable way yet

Close #9666
2025-10-22 10:03:49 +02:00
sug
da223f6ca8
export DBUS_SESSION_BUS_ADDRESS in test step in merge script
Signed-off-by: sug <sug@tutao.de>
2025-10-22 09:40:47 +02:00
abp
8a4d67906e
do not assertNotNull for _ownerEncSessionKey in temporary crypto errors
Since there is at least one case where there is no _ownerEncSessionKey
on an encrypted (aggregated) type (GroupInvitationPostReturn and its
MailAddress aggregates), we cannot assertNotNull for the attribute.
This fixes the error that was introduced by
c7a8749a71.

Co-authored-by: jomapp <17314077+jomapp@users.noreply.github.com>
2025-10-22 09:40:46 +02:00
abp
5124985d4f
remove DynamicTfVectorizer
Co-authored-by: map <mpfau@users.noreply.github.com>
2025-10-22 09:40:46 +02:00
jhm
6d4a656a69
fix not successfully decrypting instances on the entityUpdate
When trying to decrypt instances that were either not encrypted or
did not have an _ownerEncSessionKey (but a bucketKey), we failed to
set the instance on the entityUpdateData. Instead of checking for
existence of the _ownerEncSessionKey, we now resolve the optional
sessionKey using the cryptoFacade.

Co-authored-by: abp <abp@tutao.de>
2025-10-22 09:40:46 +02:00
sug
f11e59672e
improve inbox rule handling and run spam prediction after inbox rules
Instead of applying inbox rules based on the unread mail state in the
inbox folder, we introduce the new ProcessingState enum on
the mail type. If a mail has been processed by the leader client, which
is checking for matching inbox rules, the ProcessingState is
updated. If there is a matching rule the flag is updated through the
MoveMailService, if there is no matching rule, the flag is updated
using the ClientClassifierResultService. Both requests are
throttled / debounced. After processing inbox rules, spam prediction
is conducted for mails that have not yet been moved by an inbox rule.
The ProcessingState for not matching ham mails is also updated using
the ClientClassifierResultService.

This new inbox rule handing solves the following two problems:
 - when clicking on a notification it could still happen,
   that sometimes the inbox rules where not applied
 - when the inbox folder had a lot of unread mails, the loading time did
   massively increase, since inbox rules were re-applied on every load

Co-authored-by: amm <amm@tutao.de>
Co-authored-by: Nick <nif@tutao.de>
Co-authored-by: das <das@tutao.de>
Co-authored-by: abp <abp@tutao.de>
Co-authored-by: jhm <17314077+jomapp@users.noreply.github.com>
Co-authored-by: map <mpfau@users.noreply.github.com>
Co-authored-by: Kinan <104761667+kibibytium@users.noreply.github.com>
2025-10-22 09:40:45 +02:00
jhm
030bea4fe6
add TutanotaModelV96
Co-authored-by: abp <abp@tutao.de>
2025-10-22 09:25:21 +02:00
das
fd22294a18
[antispam] Add client-side local spam filtering
Implement a local machine learning model for client-side spam filtering.
The local model is implemented using tensorflow "LayersModel" to train
separate models in all available mailboxes, resulting in one model
per ownerGroup (i.e. mailbox).

Initially, the training data is aggregated from the last 30 days of
received mails, and the data is stored in a separate offline database
table named spam_classification_training_data. The trained model is
stored in the table spam_classification_model. The initial training
starts after indexing, with periodic training happening
every 30 minutes and on each subsequent login.

The model will predict on incoming mails once we have received the
entity event for said mail, moving it to either inbox or spam folder.
When users move mails, we update the training data labels accordingly,
by adjusting the isSpam classification and isSpamConfidence values in
the offline database. The MoveMailService now contains a moveReason,
which indicates that the mail has been moved by our spam filter.

Client-side spam filtering can be activated using the
SpamClientClassification feature flag, and is for now only
available on the desktop client.

Co-authored-by: sug <sug@tutao.de>
Co-authored-by: kib <104761667+kibibytium@users.noreply.github.com>
Co-authored-by: abp <abp@tutao.de>
Co-authored-by: map <mpfau@users.noreply.github.com>
Co-authored-by: jhm <17314077+jomapp@users.noreply.github.com>
Co-authored-by: frm <frm@tutao.de>
Co-authored-by: das <das@tutao.de>
Co-authored-by: nif <nif@tutao.de>
Co-authored-by: amm <amm@tutao.de>
2025-10-22 09:25:20 +02:00
das
d76fcc6775
Add tensorflow.js library
Reviewed by jhm, abp, das.

The library is added to support training a spam classification model on
client. A custom rollupTensorFlow was created to only use the needed
methods on the final file, which also has multiple stubs which remove
code which is unwanted such as Requests.

Co-authored-by: jhm <17314077+jomapp@users.noreply.github.com>
Co-authored-by: abp <abp@tutao.de>
2025-10-22 09:25:20 +02:00
map
dcd9356ec6
allow downloading blobs of same file from multiple archives
Co-authored-by: abp <abp@tutao.de>
2025-10-22 09:25:20 +02:00
tutao-mac
c873ab8925 add missing try statement to CalendarEntity 2025-10-22 09:05:35 +02:00
bed
bc33998864 Disable HtmlSanitizerTest
Temporarily disable the HtmlSanitizerTest because it fails in ci
2025-10-21 13:25:27 +02:00
and
acada92d86 Fix duplicated reminders on event duplication
Prevents duplicated reminders when using the new "Duplicate Event" feature.
2025-10-21 05:59:22 +02:00
and
71c68a10ff Improve readability of parseAlarmInterval function 2025-10-20 17:16:35 +02:00
and
3e740cd50e Change CalendarEventAlarmModel.ts remove method behavior
Fixes potential failed removals in case the alarm is a different object with a different reference.
2025-10-20 17:16:35 +02:00
mup
2165a87986 [Android] Adds 16KB support
Google now requires all Android apps to support 16KB page sizes
until November to remain eligible for publishing on the Play Store.

This commit updates the Kotlin version, NDK, target and compile SDK
versions, as well all third-party dependencies used by the apps,
making our Apps compatibility with 16KB page size support.

Closes #9679
2025-10-20 17:15:32 +02:00
mup
afc4d52aba Fixes weekly events not rendering in the last week of the month
Previously, some weekly events were not correctly rendered during the last
week of the month. This was caused by the event generation loop exiting
prematurely.

This commit adjusts the loop termination condition. Now it only exits if
the event's start time exceeds the maximum date, or if no event is found
and the loop has already reached the configured limit.

Fixes #9667
2025-10-20 17:12:38 +02:00
mup
8652756351 [Android] Adds tests for WidgetDataRepository
This commit adds tests for the loadCalendars function, making sure
that calendars are correctly ordered when returned.

It also tests that event loading still working even when the loadCalendars
call fails.
2025-10-20 17:11:47 +02:00
mup
5f1751d23a [Android] Adds tests for WidgetUIViewModel
This commit introduces new tests for the Widget View Model
covering the event retrieval flow.
2025-10-20 17:11:47 +02:00
and
e3c26ed247 Apply few improvements after review
Co-authored-by: Murilo Pereira <34790144+murilopereirame@users.noreply.github.com>
2025-10-20 17:11:10 +02:00
TheHappyFella
f70e52defc Fix iCalendar parser line folding regex
The parser was using /\r?\n\s/g to unfold lines, but \s matches ALL
whitespace including newlines. This caused empty lines (e.g. between
END:VEVENT and END:VCALENDAR) to be incorrectly removed, concatenating
the lines and causing 'no end for tag VEVENT' errors.

Fixed by using /\r?\n[ \t]/g which only matches space or tab, as per
RFC 5545 specification for line folding.

- Fix line folding regex in parseICalendar()
- Add tests for empty line handling and proper line folding
- Fixes parsing of calendars with empty lines between tags
2025-10-20 17:11:10 +02:00
TheHappyFella
b0d39eeb76 Add webcal and webcals protocol support for external calendars
- Accept webcal:// and webcals:// protocols in URL validation
- Automatically convert webcal/webcals URLs to https before fetching
- Update help text to show webcal example
- Add comprehensive test suite for URL normalization

This allows users to subscribe to external calendars using the standard
webcal:// and webcals:// protocols, which are automatically converted to
secure HTTPS connections before fetching.
2025-10-20 17:11:10 +02:00
mup
1a59860274 Fixes TimeOverview showing no text when no conflicts 2025-10-20 17:11:10 +02:00
mup
0dc4d11609 Adapt layout to figma
Co-authored-by: and <and@tutao.de>

Closes #9726
2025-10-20 17:11:10 +02:00
mup
652040a88a Adds conflicting events information to Event Banner
When receiving an event invitation, users may have more
than just one conflicting event, but we show only one
inside the time overview.

This commit adds an expandable panel to the event banner,
allowing users to expand it by clicking in the warning info
and quickly see which events, along the already displayed one,
are conflicting with the invitation.

Closes #9726
2025-10-20 17:11:10 +02:00
mup
92f7e212d8 Fix browser tests for CalendarModel
Co-authored-by: and <and@tutao.de>
2025-10-20 17:11:10 +02:00
and
d401a3968d Changes after review and fix CalendarTestUtils.ts 2025-10-20 17:11:10 +02:00
and
6c81f1928b [SDK] Adapt SDK and widgets to handle new calendar colors
Co-authored-by: bed <bed@tutao.de>
2025-10-20 17:11:10 +02:00
and
2c19b6c7a9 Fix missing default reminders at create/edit calendar dialog 2025-10-20 17:11:10 +02:00
and
6cd18ec33a Rename CalendarInfo 'shared' field to 'hasMultipleMembers' 2025-10-20 17:11:10 +02:00
and
3dbd0b3b73 Tutanota model changes - Add birthdayCalendarColor
Co-authored-by: bed <bed@tutao.de>
2025-10-20 17:11:09 +02:00
and
2074d44f16 Handle calendar sidebar actions 2025-10-20 17:11:09 +02:00
and
364557bb45 Merge RenderType with CalendarType and handle calendar colors without # 2025-10-20 17:11:09 +02:00
and
d11b433934 Remove leftover isClientOnly references and related code 2025-10-20 17:11:09 +02:00
and
d1ada8ddbf Remove getClientOnlyColors helper 2025-10-20 17:11:09 +02:00
and
91a0f1b912 Fix CalendarTestUtils 2025-10-20 17:11:09 +02:00
and
38f94dccd5 Fix calendar colors not rendered in the sidebar and event preview 2025-10-20 17:11:09 +02:00
and
34d4614900 Initialize calendars in the CalendarModel and implement CalendarInfoBase
- This commit introduces CalendarInfoBase as a base type to hold common fields between CalendarInfo and BirthdayCalendarInfo
- It also makes CalendarModel provide the available calendars.
- SearchViewModel dependency on the locator is removed and CalendarModel is now injected.
2025-10-20 17:11:09 +02:00
and
e2804db800 Change getSharedGroupName function arguments to receive userSettingsGroupRoot
Co-authored-by: bed <bed@tutao.de>
2025-10-20 17:11:09 +02:00
and
a2b7c94033 Rename isClientOnlyCalendar and retrieveClientOnlyEventsForUser helper functions 2025-10-20 17:11:09 +02:00
and
f36868085c Implement BirthdayCalendarInfo
Co-authored-by: bed <bed@tutao.de>
2025-10-20 17:11:09 +02:00
and
72040ad2f3 Extract CalendarSidebarRow.ts
Co-authored-by: bed <bed@tutao.de>
2025-10-20 17:11:09 +02:00
and
6f6bf58c7b Rename birthday calendar constants and remove local clients setup
With our new approach we no longer need to set up and store the birthday calendar locally.
Color will be stored in the server and name won't be editable.

Co-authored-by: bed <bed@tutao.de>
2025-10-20 17:11:09 +02:00
vis
84bbed77d1
v310.251016.1 2025-10-16 17:14:18 +02:00
vaf
490ea7e4e1
remove usages of deprecated authStatus from mail
we migrated all mails to use the authStatus from mailDetails. we should not use the deprecated status anymore. it will eventually be removed from the model
2025-10-16 16:49:06 +02:00
vaf
41dfb18bb4
do not set deprecated authStatus on mail in CryptoFacadeTest 2025-10-16 16:49:06 +02:00