Commit graph

87 commits

Author SHA1 Message Date
Julian Gödde
5e431fccb3 feat(ratings): Enhance user satisfaction survey
- Added a survey and support form for when the user may be dissatisfied with the Tuta Mail or Tuta Calendar app
- Added a page allowing the user to support the Tuta project when they already left a rating
- Removed asking business users for their satisfaction with the Tuta Mail & Calendar app
- Refactored in-app rating eligibility checks & added/fixed test cases
- Ignoring app installation date & customer creation date for post-upgrade rating now
- Added usage test for support Tuta page

Co-authored-by: yoy <yoy@tutao.de>
Co-authored-by: Julian Gödde <129423545+jgoedde@users.noreply.github.com>
Co-authored-by: cag <cag@tutao.de>
2025-05-15 10:36:31 +02:00
mac-github
279278179b store ServerModelParsedInstances in offline db
Co-authored-by: nig <nig@tutao.de>
Co-authored-by: abp <abp@tutao.de>
Co-authored-by: jhm <17314077+jomapp@users.noreply.github.com>
Co-authored-by: das <das@tutao.de>
2025-05-06 18:45:27 +02:00
Kinan
edbf281b88
switch to typeIds and attrIds, add SystemMV126, TutanotaMV86, BaseMV2
Refactor our instance deserialization/serialization pipeline, both on
TypeScript and on Rust [sdk] to use typeId and attributeIds instead of
typeNames and attributeNames. We furthermore ignore cardinalities
on associations until the instance layer and always
store associations as arrays. This commit introduces **eventual
consistency** on the client, i.e. we are from now on always storing data
in the newest schema format (activeApplicationVersionsForWritingSum)
which ensures that all data is already available on the client after
updating the client to a newer version. This removes the need for
offline migrations on the client and also removes backward migrations
on the server. Furthermore, the server model types are now available
on the client, retrievable through the ApplicationTypesFacade. This is
our first step towards FastSync.

Co-authored-by: nig <nig@tutao.de>
Co-authored-by: abp <abp@tutao.de>
Co-authored-by: jomapp <17314077+jomapp@users.noreply.github.com>
Co-authored-by: map <mpfau@users.noreply.github.com>
Co-authored-by: sug <sug@tutao.de>
Co-authored-by: Kinan <104761667+kibibytium@users.noreply.github.com>
2025-04-28 12:44:35 +02:00
mab
2d35ab0d6e Introduce key verification (squash) 2025-03-19 09:29:34 +01:00
paw
327d1f3e93 [test] Test mail grouping in list based on user preference and folder
Co-authored-by: hrb-hub <181954414+hrb-hub@users.noreply.github.com>
2025-03-05 16:26:35 +01:00
paw
0321b53e3e Add ConversationListModel
- This list model groups all emails by conversation in the mail list
- Also adds setting for grouping by conversation (i.e. enables this)
- The setting is overridden for SENT and DRAFT folder types (it uses the
  other per-mail list model instead)
- Adds MailSetListModel which provides a common interface for the
  MailViewModel so that additional list models can be created; it is
  used for MailListModel and the new ConversationListModel, but it can
  be extended to even more list models in the future if it is ever
  desired.

Note: This does not include actions. Any action you do (delete, archive,
etc.) will be applied to the selected email. The purpose of this commit
is to just implement the list model. See #5051 for more information.

Closes #8223

Co-authored-by: bir <bir@tutao.de>
Co-authored-by: ivk <ivk@tutao.de>
2025-03-05 16:26:09 +01:00
ivk
71498967cd Optimize mail indexing
Re-implement downloading of mails during search indexing:
 - download mail details instead of mails from mail bags to ensure
 correctness of date range
 - always download MailSetEntry's in full chunks to avoid cache-related
 issues

Close #8564

Co-authored-by: bir <bir@tutao.de>
Co-authored-by: wrd <wrd@tutao.de>
2025-03-05 16:26:08 +01:00
vaf
cf85632e31
Refactor key derivations
This affects only Key Rotation related derivations, i.e., authentication
keys and the distribution encryption key. We do not change the user
group distribution key derivation, that is a separate change.

This moves all the binding data to the authentication key derivation
step. It doesn't really matter if it is there or in the tagged data, as
long at it is somewhere, but by using it in the key derivation salt we
increase the security of the resulting authentication key.

We also bind the entire MAC tag system together. The idea here is to
make it easy to find the corresponding tag creation and verification in
the code, and also ensure that the parameters passed in are the same.

This also makes it easy to see how key authentication works in general.

We respect the constraint that no classes or functions may be passed in
or out of the facade (due to IPC).

tutadb#1940

Co-authored-by: vis <vis@tutao.de>
Co-authored-by: hec <hec@tutao.de>
Co-authored-by: mab <mab@tutao.de>
2025-02-06 09:26:02 +01:00
sas
343188d4d2
add constraints for key versions only accepting non-negative integers
extract PublicKeyProvider to enforce constraints in a central place
use type system and checkKeyVersionConstraints function to enforce constraints everywhere
tutadb#1933
2025-02-06 09:26:02 +01:00
ivk
5c147bb4e0 Use mailbox export tokens, Extract MailExportTokenFacade
#8098

Make `createTestEntity` deterministic and fix tests related to it.

Co-authored-by: bir <bir@tutao.de>
2025-01-27 12:02:44 +01:00
paw
23bf023d28 Add MailExportFacade
Add a facade that handles mail exporting requests and tokens.

Closes #7953

Co-authored-by: BijinDev <bir@tutao.de>
Co-authored-by: ivk <ivk@tutao.de>
2025-01-27 12:02:44 +01:00
ivk
b3147c23ed Mailbox export: downloading & persistence
Remove unused method from FileFacade

Co-authored-by: wrd <wrd@tutao.de>
2025-01-27 12:02:44 +01:00
paw
8727eec53c Add tests for MailListModel, fix loadAndSelect
These were missing from MailViewModel, so they weren't required when the
code was refactored into MailListModel. However, we still want this code
tested as it has a lot of complex logic, especially regarding entity
updates.

Also fixes a few bugs with MailListModel that were found, particularly
with loadAndSelect. We can also remove one usage of loadAndSelect as
we can synchronously select an element, too, without any loading.

Closes #8340

Co-authored-by: bir <bir@tutao.de>
2025-01-24 13:54:57 +01:00
paw
2a7af371cc Use custom ListModel for getting mails
This removes MailViewModel having to keep track of MailSetEntry<->Mail,
and it removes a lot of legacy code for getting Mail vs MailSetEntry, as
all of the implementation details for getting mails are now in
MailListModel. Additionally, everyone uses mailsets, so the legacy code
is no longer necessary.

Closes #8247

Co-authored-by: hrb-hub <181954414+hrb-hub@users.noreply.github.com>
2025-01-24 13:54:57 +01:00
paw
40b218027b Refactor element-specific behavior out of ListModel
We do not want ListModel to specifically only work on ListElement types,
or even element types in general. As such, we generalize it to a list of
some kind of elements with some kind of ID, even if these are not types
that would be stored remotely as part of the model.

Also renames entity/element to item for the ListModel.

Closes #8222

Co-authored-by: hrb-hub <181954414+hrb-hub@users.noreply.github.com>
2025-01-13 10:33:16 +01:00
jop
f920b53dc5 Implement xrechnung invoice generation
- add ability to print xrechnung invoice for business customers
- xrechnung is generated via own generator class
- generator class utilizes xml templates that are replaced with data
- improved test cases for pdf and xml invoice gen
- minor improvements and fixes to pdf gen

Co-authored-by: kibibytium <104761667+kibibytium@users.noreply.github.com>

close #3357
2024-12-12 15:47:00 +01:00
jug
9a686a5aa6 Add iOS in-app rating mechanism
- Own dialog, then, if user is happy, open native iOS in app rating dialog
- Triggers:
-- After using the app for minimum 7 days, we can show the dialog after the user created three events / after three mails
-- When the user did 10 activities within a 28-day period. (sending and email creating event. )
-- After succeeding the paywall
- Use device config to store data needed to trigger the dialog
- Added tests
- Added method to get the native app's installation date (Android & iOS)
- Added comment about `SKStoreReviewController.requestReview()` deprecation

Co-authored-by: arm <armhub@users.noreply.github.com>
Co-authored-by: jat <jat@tutao.de>
2024-12-03 10:42:38 +01:00
sug
82f2217aac Fix sorting order of mails with mailSet in MailViewModel
Previously, was mistake that we execute the same condition twice:

firstMailReceivedTimestamp > secondReceivedTimeStamp &
secondReceivedTimestamp < firstReceivedTimestamp

Above was same check therefore, resulted in possibly random sort orders.
This only happened in case of mailSet folders. Only happens if we have
mailId ( in case of imported mails )
2024-11-01 11:17:09 +01:00
vaf
778570faa3
Allow admin to decrypt user group key via pubAdminEncGKey
Extract AsymmetricCryptoFacade to encapsulate choice of encryption
algorithm.

Remove unauthenticated asymmetric decryption because it was only used
in a deprecated case and is the same implementation as with
authentication.

Enforce the correct protocol version and that it matches the algorithm
of recipient's key pair.

Use existing method to decrypt via adminEncGKey when changing the admin
flag.

Add cryptoWrapper dependency to make testing easier.

Minimize what re need to expose from PqFacade.

Enforce PqKeyPairs type in key rotation facade.
2024-10-07 11:01:15 +02:00
wrd
f99bd69ff0 Move indexer and mail search to mail-app 2024-09-23 16:49:37 +02:00
wrd
8ab3b14edd Move files to new folder structure
Co-authored-by: @rih-tutao
2024-07-26 16:42:13 +02:00
jop
1257ac1b77 Add fixes and test cases
Added some additional fixes for all possibilties of glpyhs used and
existing/lacking canvas support. Outsourced some code into methods for
better compartmentalization and testing.
Added one test case for the detection of "invalid" glyphs
2024-06-20 13:18:26 +00:00
vaf
d348d4b9d3
Extract keyCache from KeyLoaderFacade and UserFacade and handle user group key updates using a distribution key.
tutadb#1795
2024-06-04 16:03:09 +02:00
ivk
ad83f751b2 Extended notification preview, change credential encryption
Implemented extended notifications which include the sender.

Re-implemented credential encryption and storage, moved credential
data to the native storage, changed credential encryption on mobile to
always be device lock + implement app lock independently of encryption.

Re-implemented SSE on desktop in a more modular way.

Re-organized iOS app to share the code between the main app code and
app extensions.

Close #6608

Co-authored-by: wec43 <wec@tutao.de>
2024-05-22 14:10:08 +00:00
Vitor Sakaguti
a6d6d26d1a
Support group key rotation (#6588)
* Allow groups to have multiple key versions

tutadb#1628

* Adapt to model changes

* Fix CommonMailUtilsTest

* Remove symEncBucketKey from SecureExternalRecipientKeyData

* Remove deprecated types

Also fix tests that relied on them as dummy types

* Add userKeyVersion to RecoverCode

* Remove clientKey

Seems to be unused.

* Remove CreateFolderService

Unused.

* Remove symEncSessionKey from DraftCreateData

Unused.

* Remove symEncShareBucketKey from MailBox

Unused.

* Add userKeyVersion to TutanotaProperties

* Remove PasswordRetrievalService type

The service itself had been long gone.

* Remove userKeyVersion from CustomerAccountCreateData CreateMailGroupData

* Fix customer account creation

Set the key version that we actually need there: the *system* admin pub
key version.

The sender key version is not needed, because the system admin only has
RSA keys. Also, this is a new customer, so that would be version zero
anyway.

* Fix resolving bucket key with group reference

Get the right versions along the way.

* Use current group key when encrypting instance session keys

* Remove left-over key getting

Also document a couple of current key usages

* Pass group key providers to EntityClient instead of group key

* Fix types and do not provide sender key version for rsa

Fix resolveServiceSessionKey

* Rename constant to avoid confusion

There is another constant with the same name.

* Use TutanotaModelV69

* Introduce client side mechanism to handle key rotation requests

see tutadb 1771

* Do not export 128-bit key generator

It is only needed for tests within the package.

* Remove group key version when creating user area groups

Plus some minor clarity improvements.

* Fix version handling when updating drafts and sending to secure external

* Remove versions when creating external users

They are zero.

* Fix changing the admin flag

* Remove (almost) all local admin related code

* Improve readability

* Default to user key version zero when loading entropy

* Decrypt current groupKey with correct userGroupKey version

* Fix system application offline migrations

* Fix tutanota application offline migrations

* Improve offline migration functions

* Use AesKey type

* Minor improvements from review

* Use AesKey type instead of Aes128Key where possible

* Model update after rebase

* Fix getting user group key

Should never try to get from the cache like a normal group key.

* Fix getting former group key

Start ID was off-by-one.

* Minor changes from review.

We just checked all usages of all public methods of KeyLoaderFacade to make sure we're using the correct versions where we need them.

* More minor changes from review.

* Pass ownerKeyProvider instead of ownerKey when updating with the EntityClient

* Pass ownerKeyProvider only when necessary

* Document ownerKeyProvider parameter

* Fix offline database migration

* Fix unlocking the indexer data

---------

Co-authored-by: vaf <vaf@tutao.de>
Co-authored-by: bedhub <bedhub@users.noreply.github.com>
Co-authored-by: bed <bed@tutao.de>
2024-04-17 08:34:33 +00:00
Willow
a604badbad
Contact book provider (#6553)
* Added vCard import to attachments

Now, when user receives a vCard as attachment an import option is
displayed inside the attachment bubble, allowing the user to preview
and import the users contained inside that vCard.

The app handles both vCard mime types, text/vcard and text/x-vcard.

* [android] Added vCard Handling

* [android] Added readDataFile

* [ios] Fix iOS readFile function

The iOS readFile function was using the wrong Data constructor,
leading to an Error related to invalid URL when trying to read the file.

The readFile function now uses the Data(fileURLWithPath: ) instead of
Data(contentsOf: ), allowing us to pass file paths to be loaded.

* Add view file handling from native side to app's web part

Now the app is capable to handle native side calls asking for importing
files, mainly used when a user view a supported file and want that Tuta
app handles it.

Currently, the only supported format is .vcf and only on Android, since
iOS doesn't support setting our app as a handler for vcf files.

* Make array readonly

* Create ContactFacade

Implements a ContactFacade to communicate with the worker and handle
errors correctly.

* Show contact icon when attachment is a vCard file

* Add ContactFacadeTest

* Changes after review

* Moved vCard parsing logic to ContactImporter

* Create ContactImporter class

* [android] Fix readDataFile to read on I/O thread

* Implement device contacts import

Close #6467

Co-authored-by: mup <mup@tutao.de>
Co-authored-by: ivk <ivk@tutao.de>

* Fix importing contacts from Device book on Android

* Don't show incorrect mail address info on legacy plans

It is not true that legacy plans can have unlimited custom domains. Make
it not display anything here to prevent confusion.

Fixes #6540

* Changes after review

* Implement device contacts import

Close #6467

Co-authored-by: mup <mup@tutao.de>
Co-authored-by: ivk <ivk@tutao.de>

* Get Dirty info from contact on Android

This commit adds the isDirty property to a contact and return Dirty
contacts to the web part of the app, allowing the app to deal with
native updates.

* Handle native contact Updates

This commit adds a handler to deal with contacts that were added or
edited through the native. If created, inserts the new contact into the
server, otherwise, updates it.

* Apply contact deletion from native side

When user deletes a contact from the native side, the deletion is
applied to the server

* Adjust iOS types

* [android] Two-way contact sync on Android

* Reset Contact's dirty state during Contact update

* Two-way contact sync on iOS

* Fix nickname and deletedOnDevice

* Fix preview list scroll issue

* Don't show incorrect mail address info on legacy plans

It is not true that legacy plans can have unlimited custom domains. Make
it not display anything here to prevent confusion.

Fixes #6540

* Add new fields to Contact

This commit add new fields described in #6590 to the model and adapts
the ContactEditor and ContactViewer to handle the new fields.

* [android] Added new fields to Android Contact Import

* Fix Xcode warning for TaggedSqlValue

* [ios] Add new contact fields to iOS

* Add new fields to vCard

This commit adds the following fields:
- Middle Name
- Name Suffix
- Department (Inside ORG)
- URL

The field ROLE was changed to TITLE since that TITLE seems to be the
expected name for this field.

* Fix tests and add translations

This commit fixes the vCard import/export tests and adds the missing
translations for DE and DE_SIE.

* Code cleanup

* Code cleanup

* Fix bugs from review

* Reset selection in contact list view when deleting selected contents

Call selectNone on the list model to clear the selection after deleting
a selection of contacts.

Fixes #6623

* Fix wrong label on new event button tooltip

This should be newEvent_action; createEvent_label is used as a
placeholder for when the event name is empty in the edit event dialog.

Fixes #6626

* Lower the minimized mail editor overlay

The overlay was position a bit too high due to the recent
overlay changes.

* Events are removed immediately when deleting single or changing rules

Took out some code that was no longer useful. Long events are now always

taken out when updated, the new event will automatically be filled in.

close #6491
close #6444

Co-authored-by: ivk <ivk@tutao.de>

* Fix label in global settings clipping on mobile

* Makes version number copiable from about Dialog

This commit makes the Version Number, License and Company Name able
to be copied

fix #6605

* Fix SearchBar returning no results even with not enabled index

The users were able to trigger an empty search result even without
accepting to enable the search index. Now, even if the user tries
to bypass the dialog, the SearchBar will not return any result

fix #2689

* Fix Android unwanted auto login

This commit flags an intent that has already been handled by the
app as handled, avoiding that when the user opens the app an
intent re-deliver causes auto login.

fix #6322

* Fix client-side captcha verification; fix SignupFormTest

Fix Captcha matching hours 25-29 and allows it to match times that
will never be correct (but can be checked locally).

Add missing SignupFormTest to the test suite.

Fixes #6316

* Align all day events in the calendar on desktop

The ideal solution in my eyes is to rewrite the calendar header so that
the header and body for the day are in one column flex. Using flex
is better than constantly calculating the sizes of elements ourselves
both in code simplicity and performance.

Until then, this quick workaround seems to do the trick.

* Allow switching the calendar for accepted events

Co-authored-by: wec43 <wec@tutao.de>

* Change default email domain when adding email address on legacy plan

fix #6667

* Tell user they cannot add an alias before add alias dialog

* [ci, ios] Separate staging app for iOS

 - Introduce new schemes in iOS app for debug, staging and prod
 - Add new appId
 - Add jobs to get provisioning profiles/certificates for staging app
 - Introduce new Fastlane lanes
 - Add Jenkins steps to build/upload staging app

 Close #6591

* [android] Two-way contact sync on Android

* Fix an initial underscore being generated for Kotlin enum cases

Co-authored-by: paw-hub <104824185+paw-hub@users.noreply.github.com>

* Add an onboarding wizard prototype

This adds a guide that is displayed during the first run after
installing the app. This also includes it's first page,
the welcome page. This will be expanded upon in further commits.

The icon design still needs to be finalised, so
I have inserted a placeholder for now.

* Make the onboarding wizard show only on first run

This adds a property called `isSetupComplete` to `DeviceConfig` used to
determine whether the onboarding wizard has been displayed before.
The property is set to true after the wizard is completed or skipped
causing the wizard only to display once per install.

* Add notifications page to the Android version of the onboarding wizard

Includes the android implementation.

Co-authored-by: mup <mup@tutao.de>

* Fix `licc` generating incorrect code for enums

* Stop asking for notification permissions at launch

Co-authored-by: ivk <ivk@tutao.de>

* Add the theme page to the onboarding wizard

Co-authored-by: ivk <ivk@tutao.de>

* Create a wrapper for onboarding wizard pages

Co-authored-by: ivk <ivk@tutao.de>

* Add the contacts page to the onboarding wizard

Co-authored-by: ivk <ivk@tutao.de>

* Add the app lock page to the onboarding wizard

Co-authored-by: ivk <ivk@tutao.de>

* Enable back buttons in the onboarding wizard

* Implement the notifications page for iOS

Co-authored-by: paw-hub <104824185+paw-hub@users.noreply.github.com>

* Fix the next button overlapping the content in landscape view

I am not happy about the magic '92%' value but to remove it we would
need to calculate the remaining space from the breadcrumbs & dialog
height. This may do for now.

* Change the congratulations page header to 'Welcome to Tuta!'

We decided to change it during a meeting. This way we welcome the user
to the Tuta ecosystem instead of just the app.

* Change `RadioSelector` styling

This styles the `RadioSelector` into a 'radio button button' for the
lack of a better term. This was decided in a meeting.

* Remove skip button from onboarding wizard

* Fix the app lock page of the onboarding wizard having too much padding

* Change wizard breadcrumbs styling

This changes the breadcrumbs in the wizard to make the style discussed
during the meeting.

* Remove the help text from the lock method options in the onboarding flow

This is so the unlock method pages matches our design.

* Improve the text in the onboarding wizard

This tries to make the wizard less wordy & includes a couple
small fixes.

* Align buttons in the onboarding wizard

* Clean up the notification permission check on visibility change code

Co-authored-by: ivk <ivk@tutao.de>

* Use a smaller dialog for the onboarding wizard

Co-authored-by: ivk <ivk@tutao.de>

* Fix Android build breaking due to Kotlin JVM version

* Fix import errors

* Stop asking for notification permissions at launch on iOS

* Add the illustrations to the onboarding wizard

This needs some optimization as the illustrations cause the CSS
animations to lag. `Icons.ts` is not the best place to have the
illustrations so we should create a new file. We could also look at
sanitizing the SVGs once a way to keep the CSS classes in the SVG is
found.

* Disable the app lock page on the onboarding wizard if it is not needed

* Move the onboarding wizard illustrations into a separate file

The illustrations do not clutter up the icons file this way.

* Apply redesign of the onboarding wizard

This adds the next version of the illustrations and
changes some layouts.

* Optimise Onboarding Wizard Rendering

This tries to speed up the wait between pressing 'next' and the next
page of the onboarding wizard appearing.

* Bring back the visualizer plugin

We need it to diagnose chunk problems. It was removed because it was not
compatible with our version of `rollup` at the time.

Co-authored-by: ivk <ivk@tutao.de>

* Load the onboarding wizard's illustrations externally

As suggested by ivk, the illustrations are loaded in via an `img` tag
to avoid bloating the chunks. I have manually optimised and inserted the
illustrations again. This improves the performance of the wizard
drastically.

* Ignore the onboarding wizard's illustrations in screen readers

---------

Co-authored-by: mup <mrex@tuta.io>
Co-authored-by: paw <paw-hub@users.noreply.github.com>
Co-authored-by: mup <mup@tutao.de>
Co-authored-by: mac-github <mac-github@tutao.de>
Co-authored-by: mup <34790144+murilopereirame@users.noreply.github.com>
Co-authored-by: jat <jat@tutao.de>
Co-authored-by: wrd <wrd@tutao.de>
Co-authored-by: wec43 <wec@tutao.de>
Co-authored-by: tutao <hello@tutao.de>
Co-authored-by: paw-hub <104824185+paw-hub@users.noreply.github.com>
2024-03-13 09:53:51 +00:00
wrd
3ed4a8011a Tests for CalendarInviteHandler 2024-02-05 11:59:59 +01:00
jop
476d19e0f9 generate invoices on the client
includes sys model v93 for the InvoiceDataService that returns
all data needed to use the PdfInvoiceGenerator to generate a
PDF/A compliant Pdf invoice.

The generator uses the classes in src/api/worker/pdf to write create
the PDF, which contains one high-level imperative PdfDocument that and
defines the document contents and the low level PdfWriter that actually
writes the bytes to a buffer.

tutadb issue 1458
2024-01-22 12:17:29 +01:00
jhm
6e5398f971 fix list-unsubscribe header parsing
ListUnsubscribeService now expects exactly one header per line
of the headers argument to the POST request

the client now does some rudimentary parsing that is aware of multiline
headers and re-encodes the list-unsubscribe headers before the POST.

tutadb issue 1725
fix #4567
2024-01-18 14:23:01 +01:00
paw
25b38d96aa Display the time indicator in the agenda view.
Display the current time indicator in the agenda view, so that the user
can know what events are yet to come for the current day.

Includes refactoring to improve readability of ViewColumn.

Closes #6284

Co-authored-by: ivk <ivk@tutao.de>
2024-01-18 14:23:01 +01:00
ivk
10d926910a Remove code to search whitelabel and group info 2024-01-18 14:23:01 +01:00
mup
4bec472cc0 move search query tokenizer to @tutanota/utils 2024-01-18 14:23:01 +01:00
vaf
15713f1047 add tuta-crypt hybrid post-quantum encryption support
tutadb#1639
2023-12-21 10:41:51 +01:00
paw
24a129a94d Add KyberFacade, add X25519 curve implementation
tutadb#1610
tutadb#1609
2023-12-21 10:41:07 +01:00
nig
715b7cea00 Add code to migrate from keytar to safeStorage
Translated to TypeScript from PR #3742
2023-11-27 13:37:36 +00:00
nig
ba8054a3aa handle user-caused data races gracefully
in cases where a user changes the app password authentication while
being in the middle of another app password authentication, we now
cancel all outstanding promises for authentication and show a message
after the user finally hits "Ok".

#3853
2023-11-27 13:28:50 +01:00
nig
7630462b2e Rename KeyStoreFacadeImpl 2023-11-27 13:28:50 +01:00
nig
8aa989555b prevent parallel file writes resulting in corrupted attachments
sending multiple update/cancellation/invitation mails for an event
with several attendees can result in parallel writes to the file
system scratch space, which is only separating files by their name

with this commit, these files receive randomized file names.
this also required another argument to
FileFacade.putFileIntoDownloadsFolder in order to specify what name the
potentially randomized file should have once it becomes visible to the
user.

The changes also consolidate the file system access functionality
that was spread across DesktopDownloadManager, DesktopFileFacade and
DesktopUtils. The TempFs class now handles reads and writes to the
scratch space, including the single instance lock file, while the utils
make use of this to implement the single instance behavior.

the DownloadManager was removed because most of its functionality was
only used directly to implement the FileFacade interface.

close #5753
2023-11-01 14:16:59 +01:00
ivk
ae7c0e53ee Implement new behavior for upgrade reminder
close #5710
2023-09-22 10:37:15 +02:00
arm
7956aeea13 Include selected email address in password strength check at signup, closes #5787 2023-09-07 17:18:30 +02:00
wrd
deebaab898 Contact lists
Co-authored-by: ivk <ivk@tutao.de>

close #5407
2023-08-24 17:07:50 +02:00
ivk
51a0e67418 Change RestClientTest 2023-07-28 16:08:22 +02:00
ivk
ada89d6fc2 Switch to @tutao/otest from ospec 2023-07-28 16:08:22 +02:00
nig
3a68f207dd add altered event instances
* dragging & dropping, editing single instances
* deleting single altered instances
* import altered event instances from (internal) invites or ical exports

due to how altered instances are created and how we do shared calendars,
there's a bunch of not-obvious rules when creating and editing these.

* altered instances are created by cloning the original event
  (internally called progenitor), removing the repeat rule and
  adding a recurrenceId field that contains the original start
  time of the event instance. altered instances have the same
  UID as the progenitor.
* altered instances have independent sequence numbers
* our progenitors have one exclusion for each altered instance
  to make alarm handling and rendering easier. this is enforced
  during import / invite handling.
* even with read-write-access to the calendar,
  you cannot edit events that have attendees
  because you can't send updates if you're not
  the organizer, and organizer is always owner
  of the calendar.
* this means that you can't invite people to
  shared calendars
* for internal events, we keep attendee lists in
  sync between all instances. this includes attendance
  status.
* when editing the whole series, changing the start
  time or repeat rule invalidates the recurrenceIds
  of the altered instances. We delete all altered
  instances if this happens instead of trying to
  re-apply edit operations.
2023-07-28 11:19:15 +02:00
vis
7399682c16
Stop assuming properties of plans and filter instead 2023-07-06 15:16:26 +02:00
vis
d34ff617b5
Add some tests 2023-07-06 15:16:26 +02:00
ivk
c2dbe21be1 Add tests for ListModel 2023-06-29 16:58:12 +02:00
wrd
082d5690fe Updates from review, make newList plain list, update contact form list 2023-06-28 18:04:30 +02:00
ivk
88b8c399a2 List rewrite, mail list filter
Includes rewrite of Mail/Contact/Search views to use ViewModels

close #5431

Co-authored-by: wrd <wrd@tutao.de>
2023-06-15 16:03:46 +02:00
wrd
5494712711 Rewrite calendar editor and calendar popup
make updating calendar events delete the old uidIndex correctly

when updating calendar events, we sometimes had events in the
delete call that do not have the hashedUid set, causing us to
be unable to delete the uid index entry. when re-creating the
event, that leads to a db.exists error.

make sure the event popup always has the current version of the event.

now that edit operations are possible from the popup, we either need
to close the popup after it calls the model factory to make sure it's
only called once, or make sure the model factory always uses the last
version of the event.

we opted for the first option here to make sure repeated changes
to the attendance are actually sent as a response.

make contact resolution failure more controlled for external users

previously, responding to an event from an external mailbox
would try to resolve a contact for the response mail, fail,
try to create a contact and fail again on an opaque
assertNotNull.

show partial editability banner when creating new event in shared
calendar

make it possible to add alarms to invites in private calendars

don't make saving/sending invites and cancellations depend on user
choice for own events

updateExistingEvent() should call sendNotifications/saveEvent even when
there are no update worthy changes or the user did not tick the
sendUpdates checkbox because invites/cancellations must be sent in
any case and sending updates has a separate check for sendUpdates

also make the sendUpdates button on the popup use the same logic
as the shortcut when clicked (ask confirmation)

Co-authored-by: nig <nig@tutao.de>
2023-06-15 15:26:29 +02:00