mirror of
https://github.com/twonlyapp/twonly-app.git
synced 2026-07-18 07:14:08 +00:00
Compare commits
No commits in common. "main" and "v0.2.29" have entirely different histories.
301 changed files with 7507 additions and 94032 deletions
43
CHANGELOG.md
43
CHANGELOG.md
|
|
@ -1,48 +1,5 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## 0.3.7
|
|
||||||
|
|
||||||
- Fix: Multiple UI issues
|
|
||||||
|
|
||||||
## 0.3.6
|
|
||||||
|
|
||||||
- Improve: Visibility of the verification badge
|
|
||||||
|
|
||||||
## 0.3.5
|
|
||||||
|
|
||||||
- Fix: Performance issue caused by an out-of-sync Signal session
|
|
||||||
- Fix: Multiple smaller bug fixes
|
|
||||||
|
|
||||||
## 0.3.3
|
|
||||||
|
|
||||||
- Fix: Multiple UI issues
|
|
||||||
- Fix: Camera initialization issue
|
|
||||||
|
|
||||||
## 0.3.2
|
|
||||||
|
|
||||||
- Fix: Multiple smaller performance and UI issues
|
|
||||||
|
|
||||||
## 0.3.1
|
|
||||||
|
|
||||||
- New: Promotion of sharing contacts when contact is new to twonly
|
|
||||||
- Improve: Onboarding of new users to the verification badges
|
|
||||||
- Improve: Better feedback when a QR code is scanned
|
|
||||||
- Fix: Shared contacts now correctly show the blue verification badge
|
|
||||||
- Fix: Suppressed link previews for scanned QR codes
|
|
||||||
- Fix: Black screen on iOS when a link is clicked
|
|
||||||
- Fix: Fixed size of the typing indicator to prevent the chat from glitching
|
|
||||||
- Fix: Push notifications are not shown for chats that are already open
|
|
||||||
- Fix: Multiple smaller performance and UI issues
|
|
||||||
|
|
||||||
## 0.3.0
|
|
||||||
|
|
||||||
- Improved: Design of some UI components
|
|
||||||
- Improved: Memories viewer shows state for batch operations and has improved performance
|
|
||||||
- Fix: Issue with background notifications on Android
|
|
||||||
- Fix: Changed minimum threshold for the user discovery to 3
|
|
||||||
- Fix: Multiple UI issues
|
|
||||||
- Fix: Auto-detect if FCM token does not work and trigger a reset
|
|
||||||
|
|
||||||
## 0.2.26
|
## 0.2.26
|
||||||
|
|
||||||
- New: Import images from the gallery
|
- New: Import images from the gallery
|
||||||
|
|
|
||||||
33
README.md
33
README.md
|
|
@ -35,6 +35,7 @@ If you decide to give twonly a try, please keep in mind that it is still in its
|
||||||
- End-to-End encryption using the [Signal Protocol](https://de.wikipedia.org/wiki/Signal-Protokoll)
|
- End-to-End encryption using the [Signal Protocol](https://de.wikipedia.org/wiki/Signal-Protokoll)
|
||||||
- Open Source and can be downloaded directly from GitHub
|
- Open Source and can be downloaded directly from GitHub
|
||||||
- No email or phone number required to register
|
- No email or phone number required to register
|
||||||
|
- Privacy friendly - Everything is stored on the device
|
||||||
- The backend is hosted exclusively in Europe
|
- The backend is hosted exclusively in Europe
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
@ -42,6 +43,7 @@ If you decide to give twonly a try, please keep in mind that it is still in its
|
||||||
### Currently
|
### Currently
|
||||||
|
|
||||||
- Focus on user-friendliness so that people enjoy using the app
|
- Focus on user-friendliness so that people enjoy using the app
|
||||||
|
- User discovery without a phone number
|
||||||
- Passwordless recovery without a phone number
|
- Passwordless recovery without a phone number
|
||||||
- Implementation of features so that Snapchat can actually be replaced
|
- Implementation of features so that Snapchat can actually be replaced
|
||||||
- E2EE cloud backup of memories
|
- E2EE cloud backup of memories
|
||||||
|
|
@ -61,9 +63,36 @@ If you discover a security issue in twonly, please adhere to the coordinated vul
|
||||||
us your report to security@twonly.eu. We also offer for critical security issues a small bug bounties, but we can not
|
us your report to security@twonly.eu. We also offer for critical security issues a small bug bounties, but we can not
|
||||||
guarantee a bounty currently :/
|
guarantee a bounty currently :/
|
||||||
|
|
||||||
## Contribution
|
<!-- ## Contribution
|
||||||
|
|
||||||
|
If you have any questions or feature requests, feel free to start a new discussion. Issues are limited to bugs, and for maintainers only. -->
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Setup Instructions (macOS)</summary>
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Some dependencies are downloaded directly from the source as there are some new changes which are not yet published on
|
||||||
|
pub.dev or because they require some special installation.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git submodule update --init --recursive
|
||||||
|
|
||||||
|
cd dependencies/flutter_zxing
|
||||||
|
git submodule update --init --recursive
|
||||||
|
./scripts/update_ios_macos_src.s
|
||||||
|
```
|
||||||
|
|
||||||
|
## Debugging files
|
||||||
|
|
||||||
|
```bash
|
||||||
|
run-as eu.twonly.testing ls /data/user/0/eu.twonly.testing/
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
Currently there are still some core features and rewrites open I want to do like the switch to the MLS protocol involving a huge rewrite in Rust. Because of this, contributions are currently not wanted. You can still view the code (if you find any security issues please contact me!). Also, issues are currently closed. If you find a bug, please use the in-app option as there you can upload your debug log which helps a lot.
|
|
||||||
|
|
||||||
## Signing Keys
|
## Signing Keys
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,6 @@ analyzer:
|
||||||
- "lib/core/**"
|
- "lib/core/**"
|
||||||
- "lib/src/localization/**"
|
- "lib/src/localization/**"
|
||||||
- "rust_builder/"
|
- "rust_builder/"
|
||||||
- "scripts/"
|
|
||||||
- "build/"
|
|
||||||
- "dependencies/**"
|
- "dependencies/**"
|
||||||
- "pubspec.yaml"
|
- "pubspec.yaml"
|
||||||
- "**.arb"
|
- "**.arb"
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ plugins {
|
||||||
// START: FlutterFire Configuration
|
// START: FlutterFire Configuration
|
||||||
id 'com.google.gms.google-services'
|
id 'com.google.gms.google-services'
|
||||||
// END: FlutterFire Configuration
|
// END: FlutterFire Configuration
|
||||||
|
id "kotlin-android"
|
||||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||||
id "dev.flutter.flutter-gradle-plugin"
|
id "dev.flutter.flutter-gradle-plugin"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,3 @@
|
||||||
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
|
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
# This builtInKotlin flag was added automatically by Flutter migrator
|
|
||||||
android.builtInKotlin=false
|
|
||||||
# This newDsl flag was added automatically by Flutter migrator
|
|
||||||
android.newDsl=false
|
|
||||||
|
|
|
||||||
|
|
@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
|
||||||
|
|
@ -18,11 +18,11 @@ pluginManagement {
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
|
||||||
id "com.android.application" version '8.11.1' apply false
|
id "com.android.application" version '8.9.1' apply false
|
||||||
// START: FlutterFire Configuration
|
// START: FlutterFire Configuration
|
||||||
id "com.google.gms.google-services" version "4.3.15" apply false
|
id "com.google.gms.google-services" version "4.3.15" apply false
|
||||||
// END: FlutterFire Configuration
|
// END: FlutterFire Configuration
|
||||||
id "org.jetbrains.kotlin.android" version "2.2.20" apply false
|
id "org.jetbrains.kotlin.android" version "2.1.0" apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
include ":app"
|
include ":app"
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -33,7 +33,7 @@ platform :android do
|
||||||
|
|
||||||
# Load release notes from CHANGELOG.md
|
# Load release notes from CHANGELOG.md
|
||||||
changelog_path = File.expand_path("../CHANGELOG.md", __dir__)
|
changelog_path = File.expand_path("../CHANGELOG.md", __dir__)
|
||||||
release_notes = "Small bug fixes."
|
release_notes = "Automated local release via Fastlane"
|
||||||
if File.exist?(changelog_path)
|
if File.exist?(changelog_path)
|
||||||
changelog_content = File.read(changelog_path)
|
changelog_content = File.read(changelog_path)
|
||||||
escaped_version = Regexp.escape(version)
|
escaped_version = Regexp.escape(version)
|
||||||
|
|
@ -122,11 +122,6 @@ platform :android do
|
||||||
UI.message("Starting F-Droid deployment...")
|
UI.message("Starting F-Droid deployment...")
|
||||||
FileUtils.mkdir_p(fdroid_repo_dir)
|
FileUtils.mkdir_p(fdroid_repo_dir)
|
||||||
|
|
||||||
# Delete all APK files in the directory
|
|
||||||
sh("rm -f #{fdroid_repo_dir}/*.apk")
|
|
||||||
|
|
||||||
UI.message("All APK files deleted.")
|
|
||||||
|
|
||||||
apks.each do |apk_path|
|
apks.each do |apk_path|
|
||||||
basename = File.basename(apk_path)
|
basename = File.basename(apk_path)
|
||||||
new_name = "eu.twonly_v#{version}-#{basename}"
|
new_name = "eu.twonly_v#{version}-#{basename}"
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,6 @@ class NotificationService: UNNotificationServiceExtension {
|
||||||
self.contentHandler = contentHandler
|
self.contentHandler = contentHandler
|
||||||
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
|
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
|
||||||
|
|
||||||
// Store the current timestamp in Keychain for iOS FCM messaging tracking
|
|
||||||
let nowMs = String(format: "%.0f", Date().timeIntervalSince1970 * 1000)
|
|
||||||
writeToKeychain(key: "last_fcm_message_timestamp", value: nowMs)
|
|
||||||
NSLog("Received APNs push notification, updated last_fcm_message_timestamp to \(nowMs)")
|
|
||||||
|
|
||||||
if let bestAttemptContent = bestAttemptContent {
|
if let bestAttemptContent = bestAttemptContent {
|
||||||
|
|
||||||
guard bestAttemptContent.userInfo as? [String: Any] != nil,
|
guard bestAttemptContent.userInfo as? [String: Any] != nil,
|
||||||
|
|
@ -193,7 +188,6 @@ func readFromKeychain(key: String) -> String? {
|
||||||
let query: [String: Any] = [
|
let query: [String: Any] = [
|
||||||
kSecClass as String: kSecClassGenericPassword,
|
kSecClass as String: kSecClassGenericPassword,
|
||||||
kSecAttrAccount as String: key,
|
kSecAttrAccount as String: key,
|
||||||
kSecAttrService as String: "flutter_secure_storage_service",
|
|
||||||
kSecReturnData as String: kCFBooleanTrue!,
|
kSecReturnData as String: kCFBooleanTrue!,
|
||||||
kSecMatchLimit as String: kSecMatchLimitOne,
|
kSecMatchLimit as String: kSecMatchLimitOne,
|
||||||
kSecAttrAccessGroup as String: "CN332ZUGRP.eu.twonly.shared", // Use your access group
|
kSecAttrAccessGroup as String: "CN332ZUGRP.eu.twonly.shared", // Use your access group
|
||||||
|
|
@ -211,36 +205,6 @@ func readFromKeychain(key: String) -> String? {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function to write to Keychain
|
|
||||||
func writeToKeychain(key: String, value: String) {
|
|
||||||
guard let data = value.data(using: .utf8) else {
|
|
||||||
NSLog("Failed to convert value to data for keychain key: \(key)")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let query: [String: Any] = [
|
|
||||||
kSecClass as String: kSecClassGenericPassword,
|
|
||||||
kSecAttrAccount as String: key,
|
|
||||||
kSecAttrService as String: "flutter_secure_storage_service",
|
|
||||||
kSecAttrAccessGroup as String: "CN332ZUGRP.eu.twonly.shared"
|
|
||||||
]
|
|
||||||
|
|
||||||
// Delete existing item first to ensure a clean overwrite
|
|
||||||
SecItemDelete(query as CFDictionary)
|
|
||||||
|
|
||||||
// Add the new item with background-compatible accessibility
|
|
||||||
var addQuery = query
|
|
||||||
addQuery[kSecValueData as String] = data
|
|
||||||
addQuery[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
|
|
||||||
|
|
||||||
let status = SecItemAdd(addQuery as CFDictionary, nil)
|
|
||||||
if status != errSecSuccess {
|
|
||||||
NSLog("Failed to write keychain item for key \(key): \(status)")
|
|
||||||
} else {
|
|
||||||
NSLog("Successfully wrote keychain item for key: \(key)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func getPushNotificationText(pushNotification: PushNotification, userKnown: Bool) -> (String, String) {
|
func getPushNotificationText(pushNotification: PushNotification, userKnown: Bool) -> (String, String) {
|
||||||
let systemLanguage = Locale.current.language.languageCode?.identifier ?? "en" // Get the current system language
|
let systemLanguage = Locale.current.language.languageCode?.identifier ?? "en" // Get the current system language
|
||||||
|
|
||||||
|
|
|
||||||
33
ios/Podfile
33
ios/Podfile
|
|
@ -28,9 +28,17 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe
|
||||||
|
|
||||||
flutter_ios_podfile_setup
|
flutter_ios_podfile_setup
|
||||||
|
|
||||||
|
pod 'Firebase', :modular_headers => true
|
||||||
|
pod 'FirebaseMessaging', :modular_headers => true
|
||||||
|
pod 'FirebaseCoreInternal', :modular_headers => true
|
||||||
|
pod 'GoogleUtilities', :modular_headers => true
|
||||||
|
pod 'FirebaseCore', :modular_headers => true
|
||||||
|
pod 'SwiftProtobuf'
|
||||||
|
# pod 'sqlite3', :modular_headers => true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
target 'Runner' do
|
target 'Runner' do
|
||||||
pod 'SwiftProtobuf'
|
|
||||||
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
|
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
|
||||||
target 'RunnerTests' do
|
target 'RunnerTests' do
|
||||||
inherit! :search_paths
|
inherit! :search_paths
|
||||||
|
|
@ -68,28 +76,6 @@ post_install do |installer|
|
||||||
|
|
||||||
## dart: PermissionGroup.mediaLibrary
|
## dart: PermissionGroup.mediaLibrary
|
||||||
'PERMISSION_PHOTOS=1',
|
'PERMISSION_PHOTOS=1',
|
||||||
|
|
||||||
## dart: PermissionGroup.location, PermissionGroup.locationAlways, PermissionGroup.locationWhenInUse
|
|
||||||
'PERMISSION_LOCATION=0',
|
|
||||||
|
|
||||||
## dart: PermissionGroup.contacts
|
|
||||||
'PERMISSION_CONTACTS=0',
|
|
||||||
|
|
||||||
## dart: PermissionGroup.calendar, PermissionGroup.reminders
|
|
||||||
'PERMISSION_EVENTS=0',
|
|
||||||
'PERMISSION_REMINDERS=0',
|
|
||||||
|
|
||||||
## dart: PermissionGroup.speech
|
|
||||||
'PERMISSION_SPEECH_RECOGNITION=0',
|
|
||||||
|
|
||||||
## dart: PermissionGroup.bluetooth
|
|
||||||
'PERMISSION_BLUETOOTH=0',
|
|
||||||
|
|
||||||
## dart: PermissionGroup.appTrackingTransparency
|
|
||||||
'PERMISSION_APP_TRACKING_TRANSPARENCY=0',
|
|
||||||
|
|
||||||
## dart: PermissionGroup.sensors
|
|
||||||
'PERMISSION_SENSORS=0',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
@ -97,6 +83,5 @@ post_install do |installer|
|
||||||
end
|
end
|
||||||
|
|
||||||
target 'NotificationService' do
|
target 'NotificationService' do
|
||||||
pod 'SwiftProtobuf'
|
|
||||||
# pod 'Firebase/Messaging'
|
# pod 'Firebase/Messaging'
|
||||||
end
|
end
|
||||||
|
|
|
||||||
355
ios/Podfile.lock
355
ios/Podfile.lock
|
|
@ -1,18 +1,136 @@
|
||||||
PODS:
|
PODS:
|
||||||
|
- app_links (7.0.0):
|
||||||
|
- Flutter
|
||||||
- audio_waveforms (0.0.1):
|
- audio_waveforms (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- background_downloader (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- camera_avfoundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- connectivity_plus (0.0.1):
|
||||||
|
- Flutter
|
||||||
- cryptography_flutter_plus (0.2.0):
|
- cryptography_flutter_plus (0.2.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- device_info_plus (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- DKImagePickerController/Core (4.3.9):
|
||||||
|
- DKImagePickerController/ImageDataManager
|
||||||
|
- DKImagePickerController/Resource
|
||||||
|
- DKImagePickerController/ImageDataManager (4.3.9)
|
||||||
|
- DKImagePickerController/PhotoGallery (4.3.9):
|
||||||
|
- DKImagePickerController/Core
|
||||||
|
- DKPhotoGallery
|
||||||
|
- DKImagePickerController/Resource (4.3.9)
|
||||||
|
- DKPhotoGallery (0.0.19):
|
||||||
|
- DKPhotoGallery/Core (= 0.0.19)
|
||||||
|
- DKPhotoGallery/Model (= 0.0.19)
|
||||||
|
- DKPhotoGallery/Preview (= 0.0.19)
|
||||||
|
- DKPhotoGallery/Resource (= 0.0.19)
|
||||||
|
- SDWebImage
|
||||||
|
- SwiftyGif
|
||||||
|
- DKPhotoGallery/Core (0.0.19):
|
||||||
|
- DKPhotoGallery/Model
|
||||||
|
- DKPhotoGallery/Preview
|
||||||
|
- SDWebImage
|
||||||
|
- SwiftyGif
|
||||||
|
- DKPhotoGallery/Model (0.0.19):
|
||||||
|
- SDWebImage
|
||||||
|
- SwiftyGif
|
||||||
|
- DKPhotoGallery/Preview (0.0.19):
|
||||||
|
- DKPhotoGallery/Model
|
||||||
|
- DKPhotoGallery/Resource
|
||||||
|
- SDWebImage
|
||||||
|
- SwiftyGif
|
||||||
|
- DKPhotoGallery/Resource (0.0.19):
|
||||||
|
- SDWebImage
|
||||||
|
- SwiftyGif
|
||||||
|
- emoji_picker_flutter (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- file_picker (0.0.1):
|
||||||
|
- DKImagePickerController/PhotoGallery
|
||||||
|
- Flutter
|
||||||
|
- Firebase (12.9.0):
|
||||||
|
- Firebase/Core (= 12.9.0)
|
||||||
|
- Firebase/Core (12.9.0):
|
||||||
|
- Firebase/CoreOnly
|
||||||
|
- FirebaseAnalytics (~> 12.9.0)
|
||||||
|
- Firebase/CoreOnly (12.9.0):
|
||||||
|
- FirebaseCore (~> 12.9.0)
|
||||||
|
- Firebase/Installations (12.9.0):
|
||||||
|
- Firebase/CoreOnly
|
||||||
|
- FirebaseInstallations (~> 12.9.0)
|
||||||
|
- Firebase/Messaging (12.9.0):
|
||||||
|
- Firebase/CoreOnly
|
||||||
|
- FirebaseMessaging (~> 12.9.0)
|
||||||
|
- firebase_app_installations (0.4.1):
|
||||||
|
- Firebase/Installations (= 12.9.0)
|
||||||
|
- firebase_core
|
||||||
|
- Flutter
|
||||||
|
- firebase_core (4.6.0):
|
||||||
|
- Firebase/CoreOnly (= 12.9.0)
|
||||||
|
- Flutter
|
||||||
|
- firebase_messaging (16.1.3):
|
||||||
|
- Firebase/Messaging (= 12.9.0)
|
||||||
|
- firebase_core
|
||||||
|
- Flutter
|
||||||
|
- FirebaseAnalytics (12.9.0):
|
||||||
|
- FirebaseAnalytics/Default (= 12.9.0)
|
||||||
|
- FirebaseCore (~> 12.9.0)
|
||||||
|
- FirebaseInstallations (~> 12.9.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- FirebaseAnalytics/Default (12.9.0):
|
||||||
|
- FirebaseCore (~> 12.9.0)
|
||||||
|
- FirebaseInstallations (~> 12.9.0)
|
||||||
|
- GoogleAppMeasurement/Default (= 12.9.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- FirebaseCore (12.9.0):
|
||||||
|
- FirebaseCoreInternal (~> 12.9.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
|
- GoogleUtilities/Logger (~> 8.1)
|
||||||
|
- FirebaseCoreInternal (12.9.0):
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
|
- FirebaseInstallations (12.9.0):
|
||||||
|
- FirebaseCore (~> 12.9.0)
|
||||||
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||||
|
- PromisesObjC (~> 2.4)
|
||||||
|
- FirebaseMessaging (12.9.0):
|
||||||
|
- FirebaseCore (~> 12.9.0)
|
||||||
|
- FirebaseInstallations (~> 12.9.0)
|
||||||
|
- GoogleDataTransport (~> 10.1)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
|
- GoogleUtilities/Reachability (~> 8.1)
|
||||||
|
- GoogleUtilities/UserDefaults (~> 8.1)
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
- Flutter (1.0.0)
|
- Flutter (1.0.0)
|
||||||
- flutter_image_compress_common (1.0.0):
|
- flutter_image_compress_common (1.0.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
- Mantle
|
- Mantle
|
||||||
- SDWebImage
|
- SDWebImage
|
||||||
- SDWebImageWebPCoder
|
- SDWebImageWebPCoder
|
||||||
|
- flutter_keyboard_visibility_temp_fork (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- flutter_local_notifications (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- flutter_secure_storage_darwin (10.0.0):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
- flutter_sharing_intent (1.0.1):
|
- flutter_sharing_intent (1.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- flutter_volume_controller (0.0.1):
|
- flutter_volume_controller (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- gal (1.0.0):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
- google_mlkit_barcode_scanning (0.14.2):
|
- google_mlkit_barcode_scanning (0.14.2):
|
||||||
- Flutter
|
- Flutter
|
||||||
- google_mlkit_commons
|
- google_mlkit_commons
|
||||||
|
|
@ -24,6 +142,33 @@ PODS:
|
||||||
- Flutter
|
- Flutter
|
||||||
- google_mlkit_commons
|
- google_mlkit_commons
|
||||||
- GoogleMLKit/FaceDetection (~> 9.0.0)
|
- GoogleMLKit/FaceDetection (~> 9.0.0)
|
||||||
|
- GoogleAdsOnDeviceConversion (3.2.0):
|
||||||
|
- GoogleUtilities/Environment (~> 8.1)
|
||||||
|
- GoogleUtilities/Logger (~> 8.1)
|
||||||
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- GoogleAppMeasurement/Core (12.9.0):
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- GoogleAppMeasurement/Default (12.9.0):
|
||||||
|
- GoogleAdsOnDeviceConversion (~> 3.2.0)
|
||||||
|
- GoogleAppMeasurement/Core (= 12.9.0)
|
||||||
|
- GoogleAppMeasurement/IdentitySupport (= 12.9.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
|
- GoogleAppMeasurement/IdentitySupport (12.9.0):
|
||||||
|
- GoogleAppMeasurement/Core (= 12.9.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/MethodSwizzler (~> 8.1)
|
||||||
|
- GoogleUtilities/Network (~> 8.1)
|
||||||
|
- "GoogleUtilities/NSData+zlib (~> 8.1)"
|
||||||
|
- nanopb (~> 3.30910.0)
|
||||||
- GoogleDataTransport (10.1.0):
|
- GoogleDataTransport (10.1.0):
|
||||||
- nanopb (~> 3.30910.0)
|
- nanopb (~> 3.30910.0)
|
||||||
- PromisesObjC (~> 2.4)
|
- PromisesObjC (~> 2.4)
|
||||||
|
|
@ -40,16 +185,54 @@ PODS:
|
||||||
- GoogleToolboxForMac/Defines (= 4.2.1)
|
- GoogleToolboxForMac/Defines (= 4.2.1)
|
||||||
- "GoogleToolboxForMac/NSData+zlib (4.2.1)":
|
- "GoogleToolboxForMac/NSData+zlib (4.2.1)":
|
||||||
- GoogleToolboxForMac/Defines (= 4.2.1)
|
- GoogleToolboxForMac/Defines (= 4.2.1)
|
||||||
|
- GoogleUtilities (8.1.0):
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (= 8.1.0)
|
||||||
|
- GoogleUtilities/Environment (= 8.1.0)
|
||||||
|
- GoogleUtilities/Logger (= 8.1.0)
|
||||||
|
- GoogleUtilities/MethodSwizzler (= 8.1.0)
|
||||||
|
- GoogleUtilities/Network (= 8.1.0)
|
||||||
|
- "GoogleUtilities/NSData+zlib (= 8.1.0)"
|
||||||
|
- GoogleUtilities/Privacy (= 8.1.0)
|
||||||
|
- GoogleUtilities/Reachability (= 8.1.0)
|
||||||
|
- GoogleUtilities/SwizzlerTestHelpers (= 8.1.0)
|
||||||
|
- GoogleUtilities/UserDefaults (= 8.1.0)
|
||||||
|
- GoogleUtilities/AppDelegateSwizzler (8.1.0):
|
||||||
|
- GoogleUtilities/Environment
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- GoogleUtilities/Network
|
||||||
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Environment (8.1.0):
|
- GoogleUtilities/Environment (8.1.0):
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Logger (8.1.0):
|
- GoogleUtilities/Logger (8.1.0):
|
||||||
- GoogleUtilities/Environment
|
- GoogleUtilities/Environment
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
|
- GoogleUtilities/MethodSwizzler (8.1.0):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- GoogleUtilities/Privacy
|
||||||
|
- GoogleUtilities/Network (8.1.0):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- "GoogleUtilities/NSData+zlib"
|
||||||
|
- GoogleUtilities/Privacy
|
||||||
|
- GoogleUtilities/Reachability
|
||||||
|
- "GoogleUtilities/NSData+zlib (8.1.0)":
|
||||||
|
- GoogleUtilities/Privacy
|
||||||
- GoogleUtilities/Privacy (8.1.0)
|
- GoogleUtilities/Privacy (8.1.0)
|
||||||
|
- GoogleUtilities/Reachability (8.1.0):
|
||||||
|
- GoogleUtilities/Logger
|
||||||
|
- GoogleUtilities/Privacy
|
||||||
|
- GoogleUtilities/SwizzlerTestHelpers (8.1.0):
|
||||||
|
- GoogleUtilities/MethodSwizzler
|
||||||
- GoogleUtilities/UserDefaults (8.1.0):
|
- GoogleUtilities/UserDefaults (8.1.0):
|
||||||
- GoogleUtilities/Logger
|
- GoogleUtilities/Logger
|
||||||
- GoogleUtilities/Privacy
|
- GoogleUtilities/Privacy
|
||||||
- GTMSessionFetcher/Core (3.5.0)
|
- GTMSessionFetcher/Core (3.5.0)
|
||||||
|
- image_picker_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- in_app_purchase_storekit (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- integration_test (0.0.1):
|
||||||
|
- Flutter
|
||||||
- libwebp (1.5.0):
|
- libwebp (1.5.0):
|
||||||
- libwebp/demux (= 1.5.0)
|
- libwebp/demux (= 1.5.0)
|
||||||
- libwebp/mux (= 1.5.0)
|
- libwebp/mux (= 1.5.0)
|
||||||
|
|
@ -62,6 +245,9 @@ PODS:
|
||||||
- libwebp/sharpyuv (1.5.0)
|
- libwebp/sharpyuv (1.5.0)
|
||||||
- libwebp/webp (1.5.0):
|
- libwebp/webp (1.5.0):
|
||||||
- libwebp/sharpyuv
|
- libwebp/sharpyuv
|
||||||
|
- local_auth_darwin (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
- Mantle (2.2.0):
|
- Mantle (2.2.0):
|
||||||
- Mantle/extobjc (= 2.2.0)
|
- Mantle/extobjc (= 2.2.0)
|
||||||
- Mantle/extobjc (2.2.0)
|
- Mantle/extobjc (2.2.0)
|
||||||
|
|
@ -90,11 +276,18 @@ PODS:
|
||||||
- nanopb/encode (= 3.30910.0)
|
- nanopb/encode (= 3.30910.0)
|
||||||
- nanopb/decode (3.30910.0)
|
- nanopb/decode (3.30910.0)
|
||||||
- nanopb/encode (3.30910.0)
|
- nanopb/encode (3.30910.0)
|
||||||
|
- package_info_plus (0.4.5):
|
||||||
|
- Flutter
|
||||||
- permission_handler_apple (9.3.0):
|
- permission_handler_apple (9.3.0):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- photo_manager (3.9.0):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
- pro_video_editor (0.0.1):
|
- pro_video_editor (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- PromisesObjC (2.4.0)
|
- PromisesObjC (2.4.0)
|
||||||
|
- restart_app (1.7.3):
|
||||||
|
- Flutter
|
||||||
- rust_lib_twonly (0.0.1):
|
- rust_lib_twonly (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- screen_protector (1.5.1):
|
- screen_protector (1.5.1):
|
||||||
|
|
@ -107,29 +300,90 @@ PODS:
|
||||||
- SDWebImageWebPCoder (0.15.0):
|
- SDWebImageWebPCoder (0.15.0):
|
||||||
- libwebp (~> 1.0)
|
- libwebp (~> 1.0)
|
||||||
- SDWebImage/Core (~> 5.17)
|
- SDWebImage/Core (~> 5.17)
|
||||||
- SwiftProtobuf (1.38.0)
|
- Sentry/HybridSDK (8.58.0)
|
||||||
|
- sentry_flutter (9.16.0):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- Sentry/HybridSDK (= 8.58.0)
|
||||||
|
- share_plus (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- shared_preferences_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- sqflite_darwin (0.0.4):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- SwiftProtobuf (1.36.1)
|
||||||
|
- SwiftyGif (5.4.5)
|
||||||
|
- url_launcher_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- video_player_avfoundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
- workmanager_apple (0.0.1):
|
- workmanager_apple (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
|
- app_links (from `.symlinks/plugins/app_links/ios`)
|
||||||
- audio_waveforms (from `.symlinks/plugins/audio_waveforms/ios`)
|
- audio_waveforms (from `.symlinks/plugins/audio_waveforms/ios`)
|
||||||
|
- background_downloader (from `.symlinks/plugins/background_downloader/ios`)
|
||||||
|
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
|
||||||
|
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
||||||
- cryptography_flutter_plus (from `.symlinks/plugins/cryptography_flutter_plus/ios`)
|
- cryptography_flutter_plus (from `.symlinks/plugins/cryptography_flutter_plus/ios`)
|
||||||
|
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||||
|
- emoji_picker_flutter (from `.symlinks/plugins/emoji_picker_flutter/ios`)
|
||||||
|
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||||
|
- Firebase
|
||||||
|
- firebase_app_installations (from `.symlinks/plugins/firebase_app_installations/ios`)
|
||||||
|
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
|
||||||
|
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
|
||||||
|
- FirebaseCore
|
||||||
|
- FirebaseCoreInternal
|
||||||
|
- FirebaseMessaging
|
||||||
- Flutter (from `Flutter`)
|
- Flutter (from `Flutter`)
|
||||||
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
|
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
|
||||||
|
- flutter_keyboard_visibility_temp_fork (from `.symlinks/plugins/flutter_keyboard_visibility_temp_fork/ios`)
|
||||||
|
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
|
||||||
|
- flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`)
|
||||||
- flutter_sharing_intent (from `.symlinks/plugins/flutter_sharing_intent/ios`)
|
- flutter_sharing_intent (from `.symlinks/plugins/flutter_sharing_intent/ios`)
|
||||||
- flutter_volume_controller (from `.symlinks/plugins/flutter_volume_controller/ios`)
|
- flutter_volume_controller (from `.symlinks/plugins/flutter_volume_controller/ios`)
|
||||||
|
- gal (from `.symlinks/plugins/gal/darwin`)
|
||||||
- google_mlkit_barcode_scanning (from `.symlinks/plugins/google_mlkit_barcode_scanning/ios`)
|
- google_mlkit_barcode_scanning (from `.symlinks/plugins/google_mlkit_barcode_scanning/ios`)
|
||||||
- google_mlkit_commons (from `.symlinks/plugins/google_mlkit_commons/ios`)
|
- google_mlkit_commons (from `.symlinks/plugins/google_mlkit_commons/ios`)
|
||||||
- google_mlkit_face_detection (from `.symlinks/plugins/google_mlkit_face_detection/ios`)
|
- google_mlkit_face_detection (from `.symlinks/plugins/google_mlkit_face_detection/ios`)
|
||||||
|
- GoogleUtilities
|
||||||
|
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||||
|
- in_app_purchase_storekit (from `.symlinks/plugins/in_app_purchase_storekit/darwin`)
|
||||||
|
- integration_test (from `.symlinks/plugins/integration_test/ios`)
|
||||||
|
- local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`)
|
||||||
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||||
|
- photo_manager (from `.symlinks/plugins/photo_manager/darwin`)
|
||||||
- pro_video_editor (from `.symlinks/plugins/pro_video_editor/ios`)
|
- pro_video_editor (from `.symlinks/plugins/pro_video_editor/ios`)
|
||||||
|
- restart_app (from `.symlinks/plugins/restart_app/ios`)
|
||||||
- rust_lib_twonly (from `.symlinks/plugins/rust_lib_twonly/ios`)
|
- rust_lib_twonly (from `.symlinks/plugins/rust_lib_twonly/ios`)
|
||||||
- screen_protector (from `.symlinks/plugins/screen_protector/ios`)
|
- screen_protector (from `.symlinks/plugins/screen_protector/ios`)
|
||||||
|
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
|
||||||
|
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||||
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
|
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
|
||||||
- SwiftProtobuf
|
- SwiftProtobuf
|
||||||
|
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||||
|
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
|
||||||
- workmanager_apple (from `.symlinks/plugins/workmanager_apple/ios`)
|
- workmanager_apple (from `.symlinks/plugins/workmanager_apple/ios`)
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
|
- DKImagePickerController
|
||||||
|
- DKPhotoGallery
|
||||||
|
- Firebase
|
||||||
|
- FirebaseAnalytics
|
||||||
|
- FirebaseCore
|
||||||
|
- FirebaseCoreInternal
|
||||||
|
- FirebaseInstallations
|
||||||
|
- FirebaseMessaging
|
||||||
|
- GoogleAdsOnDeviceConversion
|
||||||
|
- GoogleAppMeasurement
|
||||||
- GoogleDataTransport
|
- GoogleDataTransport
|
||||||
- GoogleMLKit
|
- GoogleMLKit
|
||||||
- GoogleToolboxForMac
|
- GoogleToolboxForMac
|
||||||
|
|
@ -147,54 +401,138 @@ SPEC REPOS:
|
||||||
- ScreenProtectorKit
|
- ScreenProtectorKit
|
||||||
- SDWebImage
|
- SDWebImage
|
||||||
- SDWebImageWebPCoder
|
- SDWebImageWebPCoder
|
||||||
|
- Sentry
|
||||||
- SwiftProtobuf
|
- SwiftProtobuf
|
||||||
|
- SwiftyGif
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
|
app_links:
|
||||||
|
:path: ".symlinks/plugins/app_links/ios"
|
||||||
audio_waveforms:
|
audio_waveforms:
|
||||||
:path: ".symlinks/plugins/audio_waveforms/ios"
|
:path: ".symlinks/plugins/audio_waveforms/ios"
|
||||||
|
background_downloader:
|
||||||
|
:path: ".symlinks/plugins/background_downloader/ios"
|
||||||
|
camera_avfoundation:
|
||||||
|
:path: ".symlinks/plugins/camera_avfoundation/ios"
|
||||||
|
connectivity_plus:
|
||||||
|
:path: ".symlinks/plugins/connectivity_plus/ios"
|
||||||
cryptography_flutter_plus:
|
cryptography_flutter_plus:
|
||||||
:path: ".symlinks/plugins/cryptography_flutter_plus/ios"
|
:path: ".symlinks/plugins/cryptography_flutter_plus/ios"
|
||||||
|
device_info_plus:
|
||||||
|
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||||
|
emoji_picker_flutter:
|
||||||
|
:path: ".symlinks/plugins/emoji_picker_flutter/ios"
|
||||||
|
file_picker:
|
||||||
|
:path: ".symlinks/plugins/file_picker/ios"
|
||||||
|
firebase_app_installations:
|
||||||
|
:path: ".symlinks/plugins/firebase_app_installations/ios"
|
||||||
|
firebase_core:
|
||||||
|
:path: ".symlinks/plugins/firebase_core/ios"
|
||||||
|
firebase_messaging:
|
||||||
|
:path: ".symlinks/plugins/firebase_messaging/ios"
|
||||||
Flutter:
|
Flutter:
|
||||||
:path: Flutter
|
:path: Flutter
|
||||||
flutter_image_compress_common:
|
flutter_image_compress_common:
|
||||||
:path: ".symlinks/plugins/flutter_image_compress_common/ios"
|
:path: ".symlinks/plugins/flutter_image_compress_common/ios"
|
||||||
|
flutter_keyboard_visibility_temp_fork:
|
||||||
|
:path: ".symlinks/plugins/flutter_keyboard_visibility_temp_fork/ios"
|
||||||
|
flutter_local_notifications:
|
||||||
|
:path: ".symlinks/plugins/flutter_local_notifications/ios"
|
||||||
|
flutter_secure_storage_darwin:
|
||||||
|
:path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin"
|
||||||
flutter_sharing_intent:
|
flutter_sharing_intent:
|
||||||
:path: ".symlinks/plugins/flutter_sharing_intent/ios"
|
:path: ".symlinks/plugins/flutter_sharing_intent/ios"
|
||||||
flutter_volume_controller:
|
flutter_volume_controller:
|
||||||
:path: ".symlinks/plugins/flutter_volume_controller/ios"
|
:path: ".symlinks/plugins/flutter_volume_controller/ios"
|
||||||
|
gal:
|
||||||
|
:path: ".symlinks/plugins/gal/darwin"
|
||||||
google_mlkit_barcode_scanning:
|
google_mlkit_barcode_scanning:
|
||||||
:path: ".symlinks/plugins/google_mlkit_barcode_scanning/ios"
|
:path: ".symlinks/plugins/google_mlkit_barcode_scanning/ios"
|
||||||
google_mlkit_commons:
|
google_mlkit_commons:
|
||||||
:path: ".symlinks/plugins/google_mlkit_commons/ios"
|
:path: ".symlinks/plugins/google_mlkit_commons/ios"
|
||||||
google_mlkit_face_detection:
|
google_mlkit_face_detection:
|
||||||
:path: ".symlinks/plugins/google_mlkit_face_detection/ios"
|
:path: ".symlinks/plugins/google_mlkit_face_detection/ios"
|
||||||
|
image_picker_ios:
|
||||||
|
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||||
|
in_app_purchase_storekit:
|
||||||
|
:path: ".symlinks/plugins/in_app_purchase_storekit/darwin"
|
||||||
|
integration_test:
|
||||||
|
:path: ".symlinks/plugins/integration_test/ios"
|
||||||
|
local_auth_darwin:
|
||||||
|
:path: ".symlinks/plugins/local_auth_darwin/darwin"
|
||||||
|
package_info_plus:
|
||||||
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
||||||
|
photo_manager:
|
||||||
|
:path: ".symlinks/plugins/photo_manager/darwin"
|
||||||
pro_video_editor:
|
pro_video_editor:
|
||||||
:path: ".symlinks/plugins/pro_video_editor/ios"
|
:path: ".symlinks/plugins/pro_video_editor/ios"
|
||||||
|
restart_app:
|
||||||
|
:path: ".symlinks/plugins/restart_app/ios"
|
||||||
rust_lib_twonly:
|
rust_lib_twonly:
|
||||||
:path: ".symlinks/plugins/rust_lib_twonly/ios"
|
:path: ".symlinks/plugins/rust_lib_twonly/ios"
|
||||||
screen_protector:
|
screen_protector:
|
||||||
:path: ".symlinks/plugins/screen_protector/ios"
|
:path: ".symlinks/plugins/screen_protector/ios"
|
||||||
|
sentry_flutter:
|
||||||
|
:path: ".symlinks/plugins/sentry_flutter/ios"
|
||||||
|
share_plus:
|
||||||
|
:path: ".symlinks/plugins/share_plus/ios"
|
||||||
|
shared_preferences_foundation:
|
||||||
|
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||||
|
sqflite_darwin:
|
||||||
|
:path: ".symlinks/plugins/sqflite_darwin/darwin"
|
||||||
|
url_launcher_ios:
|
||||||
|
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||||
|
video_player_avfoundation:
|
||||||
|
:path: ".symlinks/plugins/video_player_avfoundation/darwin"
|
||||||
workmanager_apple:
|
workmanager_apple:
|
||||||
:path: ".symlinks/plugins/workmanager_apple/ios"
|
:path: ".symlinks/plugins/workmanager_apple/ios"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
|
app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8
|
||||||
audio_waveforms: a6dde7fe7c0ea05f06ffbdb0f7c1b2b2ba6cedcf
|
audio_waveforms: a6dde7fe7c0ea05f06ffbdb0f7c1b2b2ba6cedcf
|
||||||
|
background_downloader: 50e91d979067b82081aba359d7d916b3ba5fadad
|
||||||
|
camera_avfoundation: 968a9a5323c79a99c166ad9d7866bfd2047b5a9b
|
||||||
|
connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd
|
||||||
cryptography_flutter_plus: 44f4e9e4079395fcbb3e7809c0ac2c6ae2d9576f
|
cryptography_flutter_plus: 44f4e9e4079395fcbb3e7809c0ac2c6ae2d9576f
|
||||||
|
device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe
|
||||||
|
DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c
|
||||||
|
DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60
|
||||||
|
emoji_picker_flutter: ece213fc274bdddefb77d502d33080dc54e616cc
|
||||||
|
file_picker: a0560bc09d61de87f12d246fc47d2119e6ef37be
|
||||||
|
Firebase: 065f2bb395062046623036d8e6dc857bc2521d56
|
||||||
|
firebase_app_installations: 1abd8d071ea2022d7888f7a9713710c37136ff91
|
||||||
|
firebase_core: 8e6f58412ca227827c366b92e7cee047a2148c60
|
||||||
|
firebase_messaging: c3aa897e0d40109cfb7927c40dc0dea799863f3b
|
||||||
|
FirebaseAnalytics: cd7d01d352f3c237c9a0e31552c257cd0b0c0352
|
||||||
|
FirebaseCore: 428912f751178b06bef0a1793effeb4a5e09a9b8
|
||||||
|
FirebaseCoreInternal: b321eafae5362113bc182956fafc9922cfc77b72
|
||||||
|
FirebaseInstallations: 7b64ffd006032b2b019a59b803858df5112d9eaa
|
||||||
|
FirebaseMessaging: 7d6cdbff969127c4151c824fe432f0e301210f15
|
||||||
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||||
flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
|
flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
|
||||||
|
flutter_keyboard_visibility_temp_fork: 95b2d534bacf6ac62e7fcbe5c2a9e2c2a17ce06f
|
||||||
|
flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb
|
||||||
|
flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23
|
||||||
flutter_sharing_intent: 0c1e53949f09fa8df8ac2268505687bde8ff264c
|
flutter_sharing_intent: 0c1e53949f09fa8df8ac2268505687bde8ff264c
|
||||||
flutter_volume_controller: c2be490cb0487e8b88d0d9fc2b7e1c139a4ebccb
|
flutter_volume_controller: c2be490cb0487e8b88d0d9fc2b7e1c139a4ebccb
|
||||||
|
gal: baecd024ebfd13c441269ca7404792a7152fde89
|
||||||
google_mlkit_barcode_scanning: 12d8422d8f7b00726dedf9cac00188a2b98750c2
|
google_mlkit_barcode_scanning: 12d8422d8f7b00726dedf9cac00188a2b98750c2
|
||||||
google_mlkit_commons: a5e4ffae5bc59ea4c7b9025dc72cb6cb79dc1166
|
google_mlkit_commons: a5e4ffae5bc59ea4c7b9025dc72cb6cb79dc1166
|
||||||
google_mlkit_face_detection: ee4b72cfae062b4c972204be955d83055a4bfd36
|
google_mlkit_face_detection: ee4b72cfae062b4c972204be955d83055a4bfd36
|
||||||
|
GoogleAdsOnDeviceConversion: d68c69dd9581a0f5da02617b6f377e5be483970f
|
||||||
|
GoogleAppMeasurement: fce7c1c90640d2f9f5c56771f71deacb2ba3f98c
|
||||||
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
|
||||||
GoogleMLKit: b1eee21a41c57704fe72483b15c85cb2c0cd7444
|
GoogleMLKit: b1eee21a41c57704fe72483b15c85cb2c0cd7444
|
||||||
GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8
|
GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8
|
||||||
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
|
||||||
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
|
||||||
|
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
|
||||||
|
in_app_purchase_storekit: 22cca7d08eebca9babdf4d07d0baccb73325d3c8
|
||||||
|
integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e
|
||||||
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
|
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
|
||||||
|
local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb
|
||||||
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
|
||||||
MLImage: 0de5c6c2bf9e93b80ef752e2797f0836f03b58c0
|
MLImage: 0de5c6c2bf9e93b80ef752e2797f0836f03b58c0
|
||||||
MLKitBarcodeScanning: 39de223e7b1b8a8fbf10816a536dd292d8a39343
|
MLKitBarcodeScanning: 39de223e7b1b8a8fbf10816a536dd292d8a39343
|
||||||
|
|
@ -202,17 +540,28 @@ SPEC CHECKSUMS:
|
||||||
MLKitFaceDetection: 32549f1e70e6e7731261bf9cea2b74095e2531cb
|
MLKitFaceDetection: 32549f1e70e6e7731261bf9cea2b74095e2531cb
|
||||||
MLKitVision: 39a5a812db83c4a0794445088e567f3631c11961
|
MLKitVision: 39a5a812db83c4a0794445088e567f3631c11961
|
||||||
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
|
||||||
|
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
||||||
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
|
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
|
||||||
|
photo_manager: 25fd77df14f4f0ba5ef99e2c61814dde77e2bceb
|
||||||
pro_video_editor: 44ef9a6d48dbd757ed428cf35396dd05f35c7830
|
pro_video_editor: 44ef9a6d48dbd757ed428cf35396dd05f35c7830
|
||||||
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
|
||||||
|
restart_app: 0714144901e260eae68f7afc2fc4aacc1a323ad2
|
||||||
rust_lib_twonly: 73165b05d0cda50db45852db63f49caa7f319520
|
rust_lib_twonly: 73165b05d0cda50db45852db63f49caa7f319520
|
||||||
screen_protector: 18c6aca2dc5d2a832f6787a5318f97f03e9d3150
|
screen_protector: 18c6aca2dc5d2a832f6787a5318f97f03e9d3150
|
||||||
ScreenProtectorKit: 6ceb3e0808341a9bc15d175bff40dfdd4b32da71
|
ScreenProtectorKit: 6ceb3e0808341a9bc15d175bff40dfdd4b32da71
|
||||||
SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf
|
SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf
|
||||||
SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377
|
SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377
|
||||||
SwiftProtobuf: d724b5145bfc609d9a49c1e3e3a3dabb07273ffb
|
Sentry: d587a8fe91ca13503ecd69a1905f3e8a0fcf61be
|
||||||
|
sentry_flutter: 31101687061fb85211ebab09ce6eb8db4e9ba74f
|
||||||
|
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||||
|
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
||||||
|
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||||
|
SwiftProtobuf: 9e106a71456f4d3f6a3b0c8fd87ef0be085efc38
|
||||||
|
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
|
||||||
|
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
|
||||||
|
video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a
|
||||||
workmanager_apple: 904529ae31e97fc5be632cf628507652294a0778
|
workmanager_apple: 904529ae31e97fc5be632cf628507652294a0778
|
||||||
|
|
||||||
PODFILE CHECKSUM: 245e6d5f26c858edb6b99a7d972cc93ead4d55cf
|
PODFILE CHECKSUM: ae041999f13ba7b2285ff9ad9bc688ed647bbcb7
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
COCOAPODS: 1.16.2
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@
|
||||||
D25D4D7A2EFF41DB0029F805 /* ShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D25D4D702EFF41DB0029F805 /* ShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
D25D4D7A2EFF41DB0029F805 /* ShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = D25D4D702EFF41DB0029F805 /* ShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
D2B2E0FF2F63819600E729C1 /* VideoCompressionChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B2E0FE2F63819600E729C1 /* VideoCompressionChannel.swift */; };
|
D2B2E0FF2F63819600E729C1 /* VideoCompressionChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B2E0FE2F63819600E729C1 /* VideoCompressionChannel.swift */; };
|
||||||
F3C66D726A2EB28484DF0B10 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 16FBC6F5B58E1C6646F5D447 /* GoogleService-Info.plist */; };
|
F3C66D726A2EB28484DF0B10 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 16FBC6F5B58E1C6646F5D447 /* GoogleService-Info.plist */; };
|
||||||
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
|
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
|
@ -115,7 +114,6 @@
|
||||||
E96A5ACA32A7118204F050A5 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
E96A5ACA32A7118204F050A5 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
EE2CCFEE4ABECF33852F7735 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
EE2CCFEE4ABECF33852F7735 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
F02F7A1D63544AA9F23A1085 /* Pods-NotificationService.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.profile.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.profile.xcconfig"; sourceTree = "<group>"; };
|
F02F7A1D63544AA9F23A1085 /* Pods-NotificationService.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.profile.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
|
@ -167,7 +165,6 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
|
|
||||||
CA4FDF5DD8F229C30DE512AF /* Pods_Runner.framework in Frameworks */,
|
CA4FDF5DD8F229C30DE512AF /* Pods_Runner.framework in Frameworks */,
|
||||||
D25D4D1E2EF626E30029F805 /* StoreKit.framework in Frameworks */,
|
D25D4D1E2EF626E30029F805 /* StoreKit.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
|
|
@ -203,7 +200,6 @@
|
||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */,
|
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||||
|
|
@ -311,9 +307,6 @@
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
};
|
};
|
||||||
97C146ED1CF9000F007C117D /* Runner */ = {
|
97C146ED1CF9000F007C117D /* Runner */ = {
|
||||||
packageProductDependencies = (
|
|
||||||
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
|
|
||||||
);
|
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
|
@ -385,9 +378,6 @@
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
/* Begin PBXProject section */
|
||||||
97C146E61CF9000F007C117D /* Project object */ = {
|
97C146E61CF9000F007C117D /* Project object */ = {
|
||||||
packageReferences = (
|
|
||||||
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
|
|
||||||
);
|
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
BuildIndependentTargetsInParallel = YES;
|
BuildIndependentTargetsInParallel = YES;
|
||||||
|
|
@ -1319,18 +1309,6 @@
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
/* Begin XCLocalSwiftPackageReference section */
|
|
||||||
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
|
|
||||||
isa = XCLocalSwiftPackageReference;
|
|
||||||
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
|
|
||||||
};
|
|
||||||
/* End XCLocalSwiftPackageReference section */
|
|
||||||
/* Begin XCSwiftPackageProductDependency section */
|
|
||||||
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
productName = FlutterGeneratedPluginSwiftPackage;
|
|
||||||
};
|
|
||||||
/* End XCSwiftPackageProductDependency section */
|
|
||||||
};
|
};
|
||||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
||||||
{
|
|
||||||
"pins" : [
|
|
||||||
{
|
|
||||||
"identity" : "abseil-cpp-binary",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/abseil-cpp-binary.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5",
|
|
||||||
"version" : "1.2024072200.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "app-check",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/app-check.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "61b85103a1aeed8218f17c794687781505fbbef5",
|
|
||||||
"version" : "11.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "firebase-ios-sdk",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/firebase-ios-sdk",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "8d5b4189f1f482df8d5c58c9985ea70491ef5382",
|
|
||||||
"version" : "12.14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "flutterfire",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/flutterfire",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "a10a4148e769fadb01b1ff8d6bb76e9137f35b81",
|
|
||||||
"version" : "4.6.0-firebase-core-swift"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "google-ads-on-device-conversion-ios-sdk",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "9bfcc6cf435b2e7c5562c1900b8680c594fa9a64",
|
|
||||||
"version" : "3.6.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "googleappmeasurement",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/GoogleAppMeasurement.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "219e564a8510e983e675c94f77f7f7c50049f22d",
|
|
||||||
"version" : "12.14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "googledatatransport",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/GoogleDataTransport.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "617af071af9aa1d6a091d59a202910ac482128f9",
|
|
||||||
"version" : "10.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "googleutilities",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/GoogleUtilities.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "60da361632d0de02786f709bdc0c4df340f7613e",
|
|
||||||
"version" : "8.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "grpc-binary",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/grpc-binary.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6",
|
|
||||||
"version" : "1.69.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "gtm-session-fetcher",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/gtm-session-fetcher.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "c0ac7575d70050c2973ba2318bd5af47f8e8153a",
|
|
||||||
"version" : "5.3.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "interop-ios-for-google-sdks",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/interop-ios-for-google-sdks.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe",
|
|
||||||
"version" : "101.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "leveldb",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/leveldb.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
|
|
||||||
"version" : "1.22.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "nanopb",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/nanopb.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1",
|
|
||||||
"version" : "2.30910.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "promises",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/promises.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac",
|
|
||||||
"version" : "2.4.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "sentry-cocoa",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/getsentry/sentry-cocoa",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "16cd512711375fa73f25ae5e373f596bdf4251ae",
|
|
||||||
"version" : "8.58.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version" : 2
|
|
||||||
}
|
|
||||||
|
|
@ -5,24 +5,6 @@
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES">
|
||||||
<PreActions>
|
|
||||||
<ExecutionAction
|
|
||||||
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
|
||||||
<ActionContent
|
|
||||||
title = "Run Prepare Flutter Framework Script"
|
|
||||||
scriptText = "/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare ">
|
|
||||||
<EnvironmentBuildable>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
|
||||||
BuildableName = "Runner.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</EnvironmentBuildable>
|
|
||||||
</ActionContent>
|
|
||||||
</ExecutionAction>
|
|
||||||
</PreActions>
|
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
||||||
|
|
|
||||||
|
|
@ -1,140 +0,0 @@
|
||||||
{
|
|
||||||
"pins" : [
|
|
||||||
{
|
|
||||||
"identity" : "abseil-cpp-binary",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/abseil-cpp-binary.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5",
|
|
||||||
"version" : "1.2024072200.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "app-check",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/app-check.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "61b85103a1aeed8218f17c794687781505fbbef5",
|
|
||||||
"version" : "11.2.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "firebase-ios-sdk",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/firebase-ios-sdk",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "8d5b4189f1f482df8d5c58c9985ea70491ef5382",
|
|
||||||
"version" : "12.14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "flutterfire",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/flutterfire",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "a10a4148e769fadb01b1ff8d6bb76e9137f35b81",
|
|
||||||
"version" : "4.6.0-firebase-core-swift"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "google-ads-on-device-conversion-ios-sdk",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "9bfcc6cf435b2e7c5562c1900b8680c594fa9a64",
|
|
||||||
"version" : "3.6.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "googleappmeasurement",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/GoogleAppMeasurement.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "219e564a8510e983e675c94f77f7f7c50049f22d",
|
|
||||||
"version" : "12.14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "googledatatransport",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/GoogleDataTransport.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "617af071af9aa1d6a091d59a202910ac482128f9",
|
|
||||||
"version" : "10.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "googleutilities",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/GoogleUtilities.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "60da361632d0de02786f709bdc0c4df340f7613e",
|
|
||||||
"version" : "8.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "grpc-binary",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/grpc-binary.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "75b31c842f664a0f46a2e590a570e370249fd8f6",
|
|
||||||
"version" : "1.69.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "gtm-session-fetcher",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/gtm-session-fetcher.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "c0ac7575d70050c2973ba2318bd5af47f8e8153a",
|
|
||||||
"version" : "5.3.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "interop-ios-for-google-sdks",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/interop-ios-for-google-sdks.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe",
|
|
||||||
"version" : "101.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "leveldb",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/leveldb.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
|
|
||||||
"version" : "1.22.5"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "nanopb",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/firebase/nanopb.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1",
|
|
||||||
"version" : "2.30910.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "promises",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/google/promises.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac",
|
|
||||||
"version" : "2.4.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "sentry-cocoa",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/getsentry/sentry-cocoa",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "16cd512711375fa73f25ae5e373f596bdf4251ae",
|
|
||||||
"version" : "8.58.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version" : 2
|
|
||||||
}
|
|
||||||
|
|
@ -55,8 +55,6 @@
|
||||||
<string>Use your microphone to enable audio when making videos.</string>
|
<string>Use your microphone to enable audio when making videos.</string>
|
||||||
<key>NSPhotoLibraryUsageDescription</key>
|
<key>NSPhotoLibraryUsageDescription</key>
|
||||||
<string>twonly will save photos or videos to your library.</string>
|
<string>twonly will save photos or videos to your library.</string>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
|
||||||
<string>This app does not use or store your location information.</string>
|
|
||||||
<key>UIApplicationSceneManifest</key>
|
<key>UIApplicationSceneManifest</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>UIApplicationSupportsMultipleScenes</key>
|
<key>UIApplicationSupportsMultipleScenes</key>
|
||||||
|
|
|
||||||
34
lib/app.dart
34
lib/app.dart
|
|
@ -5,13 +5,9 @@ import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:twonly/globals.dart';
|
import 'package:twonly/globals.dart';
|
||||||
import 'package:twonly/locator.dart';
|
import 'package:twonly/locator.dart';
|
||||||
import 'package:twonly/src/constants/keyvalue.keys.dart';
|
|
||||||
import 'package:twonly/src/constants/routes.keys.dart';
|
|
||||||
import 'package:twonly/src/localization/generated/app_localizations.dart';
|
import 'package:twonly/src/localization/generated/app_localizations.dart';
|
||||||
import 'package:twonly/src/model/json/onboarding_state.model.dart';
|
|
||||||
import 'package:twonly/src/providers/routing.provider.dart';
|
import 'package:twonly/src/providers/routing.provider.dart';
|
||||||
import 'package:twonly/src/providers/settings.provider.dart';
|
import 'package:twonly/src/providers/settings.provider.dart';
|
||||||
import 'package:twonly/src/utils/keyvalue.dart';
|
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
import 'package:twonly/src/utils/pow.dart';
|
import 'package:twonly/src/utils/pow.dart';
|
||||||
import 'package:twonly/src/visual/components/app_outdated.comp.dart';
|
import 'package:twonly/src/visual/components/app_outdated.comp.dart';
|
||||||
|
|
@ -22,7 +18,7 @@ import 'package:twonly/src/visual/views/home.view.dart';
|
||||||
import 'package:twonly/src/visual/views/onboarding/onboarding.view.dart';
|
import 'package:twonly/src/visual/views/onboarding/onboarding.view.dart';
|
||||||
import 'package:twonly/src/visual/views/onboarding/register.view.dart';
|
import 'package:twonly/src/visual/views/onboarding/register.view.dart';
|
||||||
import 'package:twonly/src/visual/views/onboarding/setup.view.dart';
|
import 'package:twonly/src/visual/views/onboarding/setup.view.dart';
|
||||||
import 'package:twonly/src/visual/views/recovery_from_secure_storage.view.dart';
|
import 'package:twonly/src/visual/views/recovery.view.dart';
|
||||||
import 'package:twonly/src/visual/views/unlock_twonly.view.dart';
|
import 'package:twonly/src/visual/views/unlock_twonly.view.dart';
|
||||||
|
|
||||||
class App extends StatefulWidget {
|
class App extends StatefulWidget {
|
||||||
|
|
@ -155,10 +151,6 @@ class _AppMainWidgetState extends State<AppMainWidget> {
|
||||||
|
|
||||||
Future<void> initAsync() async {
|
Future<void> initAsync() async {
|
||||||
Log.info('AppWidgetState: initAsync started');
|
Log.info('AppWidgetState: initAsync started');
|
||||||
final onboardingState = await KeyValueStore.getModel<OnboardingState>(
|
|
||||||
KeyValueKeys.onboardingState,
|
|
||||||
);
|
|
||||||
_showOnboarding = !onboardingState.hasOnboardingFinished;
|
|
||||||
if (userService.isUserCreated) {
|
if (userService.isUserCreated) {
|
||||||
if (_initialPage != 0) {
|
if (_initialPage != 0) {
|
||||||
final count = await twonlyDB.contactsDao.getContactsCount();
|
final count = await twonlyDB.contactsDao.getContactsCount();
|
||||||
|
|
@ -188,18 +180,7 @@ class _AppMainWidgetState extends State<AppMainWidget> {
|
||||||
} else {
|
} else {
|
||||||
_proofOfWork = (null, disabled);
|
_proofOfWork = (null, disabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (onboardingState.hasStartedPasswordlessRecovery ||
|
|
||||||
onboardingState.emailRecoveryRequested) {
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
||||||
routerProvider.push(Routes.recoverPasswordless);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// await PasswordlessRecoveryService.handleRecoveryLink(
|
|
||||||
// 'https://me.twonly.eu/r/#7fdb8f08-0927-4e44-8761-038993414e48/1p7SKEzpxE3wSW9FQw60EUI4OpSW2U4EskdXLw8xg48',
|
|
||||||
// );
|
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_isLoaded = true;
|
_isLoaded = true;
|
||||||
|
|
@ -227,8 +208,7 @@ class _AppMainWidgetState extends State<AppMainWidget> {
|
||||||
_isTwonlyLocked = false;
|
_isTwonlyLocked = false;
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
} else if (!userService.currentUser.skipSetupPages &&
|
} else if (!userService.currentUser.skipSetupPages && userService.currentUser.currentSetupPage != null) {
|
||||||
userService.currentUser.currentSetupPage != null) {
|
|
||||||
// This will only be shown in case the user have not skipped
|
// This will only be shown in case the user have not skipped
|
||||||
child = SetupView(
|
child = SetupView(
|
||||||
onUpdate: () => setState(() {
|
onUpdate: () => setState(() {
|
||||||
|
|
@ -242,13 +222,9 @@ class _AppMainWidgetState extends State<AppMainWidget> {
|
||||||
}
|
}
|
||||||
} else if (_showOnboarding) {
|
} else if (_showOnboarding) {
|
||||||
child = OnboardingView(
|
child = OnboardingView(
|
||||||
callbackOnSuccess: () async {
|
callbackOnSuccess: () => setState(() {
|
||||||
await KeyValueStore.update<OnboardingState>(
|
_showOnboarding = false;
|
||||||
key: KeyValueKeys.onboardingState,
|
}),
|
||||||
update: (state) => state.hasOnboardingFinished = true,
|
|
||||||
);
|
|
||||||
if (mounted) setState(() => _showOnboarding = false);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
child = RegisterView(
|
child = RegisterView(
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,8 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
|
||||||
|
|
||||||
// These functions are ignored because they are not marked as `pub`: `get_callbacks`
|
// These functions are ignored because they are not marked as `pub`: `get_callbacks`
|
||||||
// These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `FlutterCallbacks`, `Logging`, `UserDiscoveryCallbacks`
|
// These types are ignored because they are neither used by any `pub` functions nor (for structs and enums) marked `#[frb(unignore)]`: `FlutterCallbacks`, `Logging`, `UserDiscoveryCallbacks`
|
||||||
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `clone`, `clone`
|
|
||||||
|
|
||||||
Future<void> initFlutterCallbacks({
|
Future<void> initFlutterCallbacks({
|
||||||
required int callbackId,
|
|
||||||
required FutureOr<RustStreamSink<String>> Function() loggingGetStreamSink,
|
required FutureOr<RustStreamSink<String>> Function() loggingGetStreamSink,
|
||||||
required FutureOr<Uint8List?> Function(Uint8List) userDiscoverySignData,
|
required FutureOr<Uint8List?> Function(Uint8List) userDiscoverySignData,
|
||||||
required FutureOr<bool> Function(Uint8List, Uint8List, Uint8List)
|
required FutureOr<bool> Function(Uint8List, Uint8List, Uint8List)
|
||||||
|
|
@ -41,7 +39,6 @@ Future<void> initFlutterCallbacks({
|
||||||
required FutureOr<Uint8List?> Function(PlatformInt64)
|
required FutureOr<Uint8List?> Function(PlatformInt64)
|
||||||
userDiscoveryGetContactPromotion,
|
userDiscoveryGetContactPromotion,
|
||||||
}) => RustLib.instance.api.crateBridgeCallbacksInitFlutterCallbacks(
|
}) => RustLib.instance.api.crateBridgeCallbacksInitFlutterCallbacks(
|
||||||
callbackId: callbackId,
|
|
||||||
loggingGetStreamSink: loggingGetStreamSink,
|
loggingGetStreamSink: loggingGetStreamSink,
|
||||||
userDiscoverySignData: userDiscoverySignData,
|
userDiscoverySignData: userDiscoverySignData,
|
||||||
userDiscoveryVerifySignature: userDiscoveryVerifySignature,
|
userDiscoveryVerifySignature: userDiscoveryVerifySignature,
|
||||||
|
|
|
||||||
|
|
@ -1,173 +0,0 @@
|
||||||
// This file is automatically generated, so please do not edit it.
|
|
||||||
// @generated by `flutter_rust_bridge`@ 2.12.0.
|
|
||||||
|
|
||||||
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
|
|
||||||
|
|
||||||
import '../../bridge.dart';
|
|
||||||
import '../../frb_generated.dart';
|
|
||||||
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
|
|
||||||
|
|
||||||
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`
|
|
||||||
|
|
||||||
class UserDiscoveryStoreFlutter {
|
|
||||||
const UserDiscoveryStoreFlutter();
|
|
||||||
|
|
||||||
Future<AnnouncedUser?> getAnnouncedUserByPublicId({
|
|
||||||
required PlatformInt64 publicId,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterGetAnnouncedUserByPublicId(
|
|
||||||
that: this,
|
|
||||||
publicId: publicId,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<String> getConfig() => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterGetConfig(
|
|
||||||
that: this,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<Uint8List?> getContactPromotion({
|
|
||||||
required PlatformInt64 contactId,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterGetContactPromotion(
|
|
||||||
that: this,
|
|
||||||
contactId: contactId,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<Uint8List?> getContactVersion({
|
|
||||||
required PlatformInt64 contactId,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterGetContactVersion(
|
|
||||||
that: this,
|
|
||||||
contactId: contactId,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<List<OtherPromotion>> getOtherPromotionsByPublicId({
|
|
||||||
required PlatformInt64 publicId,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterGetOtherPromotionsByPublicId(
|
|
||||||
that: this,
|
|
||||||
publicId: publicId,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<List<Uint8List>> getOwnPromotionsAfterVersion({
|
|
||||||
required int version,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterGetOwnPromotionsAfterVersion(
|
|
||||||
that: this,
|
|
||||||
version: version,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<Uint8List> getShareForContact({
|
|
||||||
required PlatformInt64 contactId,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterGetShareForContact(
|
|
||||||
that: this,
|
|
||||||
contactId: contactId,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> pushNewUserRelation({
|
|
||||||
required PlatformInt64 fromContactId,
|
|
||||||
required AnnouncedUser announcedUser,
|
|
||||||
PlatformInt64? publicKeyVerifiedTimestamp,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterPushNewUserRelation(
|
|
||||||
that: this,
|
|
||||||
fromContactId: fromContactId,
|
|
||||||
announcedUser: announcedUser,
|
|
||||||
publicKeyVerifiedTimestamp: publicKeyVerifiedTimestamp,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> pushOwnPromotionAndClearOldVersion({
|
|
||||||
required PlatformInt64 contactId,
|
|
||||||
required int version,
|
|
||||||
required List<int> promotion,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterPushOwnPromotionAndClearOldVersion(
|
|
||||||
that: this,
|
|
||||||
contactId: contactId,
|
|
||||||
version: version,
|
|
||||||
promotion: promotion,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> setContactVersion({
|
|
||||||
required PlatformInt64 contactId,
|
|
||||||
required List<int> update,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterSetContactVersion(
|
|
||||||
that: this,
|
|
||||||
contactId: contactId,
|
|
||||||
update: update,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> setShares({required List<Uint8List> shares}) => RustLib
|
|
||||||
.instance
|
|
||||||
.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterSetShares(
|
|
||||||
that: this,
|
|
||||||
shares: shares,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> storeOtherPromotion({
|
|
||||||
required OtherPromotion promotion,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterStoreOtherPromotion(
|
|
||||||
that: this,
|
|
||||||
promotion: promotion,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<void> updateConfig({required String update}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryStoreFlutterUpdateConfig(
|
|
||||||
that: this,
|
|
||||||
update: update,
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode => 0;
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) =>
|
|
||||||
identical(this, other) ||
|
|
||||||
other is UserDiscoveryStoreFlutter && runtimeType == other.runtimeType;
|
|
||||||
}
|
|
||||||
|
|
||||||
class UserDiscoveryUtilsFlutter {
|
|
||||||
const UserDiscoveryUtilsFlutter();
|
|
||||||
|
|
||||||
Future<Uint8List> signData({required List<int> inputData}) => RustLib
|
|
||||||
.instance
|
|
||||||
.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryUtilsFlutterSignData(
|
|
||||||
that: this,
|
|
||||||
inputData: inputData,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<bool> verifySignature({
|
|
||||||
required List<int> inputData,
|
|
||||||
required List<int> pubkey,
|
|
||||||
required List<int> signature,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryUtilsFlutterVerifySignature(
|
|
||||||
that: this,
|
|
||||||
inputData: inputData,
|
|
||||||
pubkey: pubkey,
|
|
||||||
signature: signature,
|
|
||||||
);
|
|
||||||
|
|
||||||
Future<bool> verifyStoredPubkey({
|
|
||||||
required PlatformInt64 fromContactId,
|
|
||||||
required List<int> pubkey,
|
|
||||||
}) => RustLib.instance.api
|
|
||||||
.crateBridgeCallbacksUserDiscoveryUserDiscoveryUtilsFlutterVerifyStoredPubkey(
|
|
||||||
that: this,
|
|
||||||
fromContactId: fromContactId,
|
|
||||||
pubkey: pubkey,
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode => 0;
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) =>
|
|
||||||
identical(this, other) ||
|
|
||||||
other is UserDiscoveryUtilsFlutter && runtimeType == other.runtimeType;
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
// This file is automatically generated, so please do not edit it.
|
|
||||||
// @generated by `flutter_rust_bridge`@ 2.12.0.
|
|
||||||
|
|
||||||
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
|
|
||||||
|
|
||||||
import '../frb_generated.dart';
|
|
||||||
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
|
|
||||||
|
|
||||||
class RustUtils {
|
|
||||||
const RustUtils();
|
|
||||||
|
|
||||||
static Future<List<Uint8List>> generateShares({
|
|
||||||
required List<int> secret,
|
|
||||||
required int total,
|
|
||||||
required int threshold,
|
|
||||||
}) => RustLib.instance.api.crateBridgeWrapperRustUtilsGenerateShares(
|
|
||||||
secret: secret,
|
|
||||||
total: total,
|
|
||||||
threshold: threshold,
|
|
||||||
);
|
|
||||||
|
|
||||||
static Future<Uint8List> recoverSecret({
|
|
||||||
required List<Uint8List> shares,
|
|
||||||
required int threshold,
|
|
||||||
}) => RustLib.instance.api.crateBridgeWrapperRustUtilsRecoverSecret(
|
|
||||||
shares: shares,
|
|
||||||
threshold: threshold,
|
|
||||||
);
|
|
||||||
|
|
||||||
@override
|
|
||||||
int get hashCode => 0;
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool operator ==(Object other) =>
|
|
||||||
identical(this, other) ||
|
|
||||||
other is RustUtils && runtimeType == other.runtimeType;
|
|
||||||
}
|
|
||||||
|
|
@ -20,12 +20,6 @@ class RustKeyManager {
|
||||||
static Future<PlatformInt64?> getUserId() => RustLib.instance.api
|
static Future<PlatformInt64?> getUserId() => RustLib.instance.api
|
||||||
.crateBridgeWrapperKeyManagerRustKeyManagerGetUserId();
|
.crateBridgeWrapperKeyManagerRustKeyManagerGetUserId();
|
||||||
|
|
||||||
static Future<void> importSerialized({required List<int> serializedBytes}) =>
|
|
||||||
RustLib.instance.api
|
|
||||||
.crateBridgeWrapperKeyManagerRustKeyManagerImportSerialized(
|
|
||||||
serializedBytes: serializedBytes,
|
|
||||||
);
|
|
||||||
|
|
||||||
static Future<void> importSignalIdentity({
|
static Future<void> importSignalIdentity({
|
||||||
required List<int> identityKeyPairStructure,
|
required List<int> identityKeyPairStructure,
|
||||||
required PlatformInt64 registrationId,
|
required PlatformInt64 registrationId,
|
||||||
|
|
@ -59,10 +53,6 @@ class RustKeyManager {
|
||||||
signedPreKeyId: signedPreKeyId,
|
signedPreKeyId: signedPreKeyId,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Serialize the key_manager. Needed for the passwordless_recovery feature.
|
|
||||||
static Future<Uint8List> serialize() => RustLib.instance.api
|
|
||||||
.crateBridgeWrapperKeyManagerRustKeyManagerSerialize();
|
|
||||||
|
|
||||||
static Future<void> setUserId({required PlatformInt64 userId}) => RustLib
|
static Future<void> setUserId({required PlatformInt64 userId}) => RustLib
|
||||||
.instance
|
.instance
|
||||||
.api
|
.api
|
||||||
|
|
|
||||||
|
|
@ -9,45 +9,36 @@ import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
|
||||||
class FlutterUserDiscovery {
|
class FlutterUserDiscovery {
|
||||||
const FlutterUserDiscovery();
|
const FlutterUserDiscovery();
|
||||||
|
|
||||||
static Future<Uint8List> getCurrentVersion({required int callbackId}) =>
|
static Future<Uint8List> getCurrentVersion() => RustLib.instance.api
|
||||||
RustLib.instance.api
|
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryGetCurrentVersion();
|
||||||
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryGetCurrentVersion(
|
|
||||||
callbackId: callbackId,
|
|
||||||
);
|
|
||||||
|
|
||||||
static Future<List<Uint8List>> getNewMessages({
|
static Future<List<Uint8List>> getNewMessages({
|
||||||
required int callbackId,
|
|
||||||
required PlatformInt64 contactId,
|
required PlatformInt64 contactId,
|
||||||
required List<int> receivedVersion,
|
required List<int> receivedVersion,
|
||||||
}) => RustLib.instance.api
|
}) => RustLib.instance.api
|
||||||
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryGetNewMessages(
|
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryGetNewMessages(
|
||||||
callbackId: callbackId,
|
|
||||||
contactId: contactId,
|
contactId: contactId,
|
||||||
receivedVersion: receivedVersion,
|
receivedVersion: receivedVersion,
|
||||||
);
|
);
|
||||||
|
|
||||||
static Future<void> handleNewMessages({
|
static Future<void> handleNewMessages({
|
||||||
required int callbackId,
|
|
||||||
required PlatformInt64 contactId,
|
required PlatformInt64 contactId,
|
||||||
PlatformInt64? publicKeyVerifiedTimestamp,
|
PlatformInt64? publicKeyVerifiedTimestamp,
|
||||||
required List<Uint8List> messages,
|
required List<Uint8List> messages,
|
||||||
}) => RustLib.instance.api
|
}) => RustLib.instance.api
|
||||||
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryHandleNewMessages(
|
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryHandleNewMessages(
|
||||||
callbackId: callbackId,
|
|
||||||
contactId: contactId,
|
contactId: contactId,
|
||||||
publicKeyVerifiedTimestamp: publicKeyVerifiedTimestamp,
|
publicKeyVerifiedTimestamp: publicKeyVerifiedTimestamp,
|
||||||
messages: messages,
|
messages: messages,
|
||||||
);
|
);
|
||||||
|
|
||||||
static Future<void> initializeOrUpdate({
|
static Future<void> initializeOrUpdate({
|
||||||
required int callbackId,
|
|
||||||
required int threshold,
|
required int threshold,
|
||||||
required PlatformInt64 userId,
|
required PlatformInt64 userId,
|
||||||
required List<int> publicKey,
|
required List<int> publicKey,
|
||||||
required bool sharePromotion,
|
required bool sharePromotion,
|
||||||
}) => RustLib.instance.api
|
}) => RustLib.instance.api
|
||||||
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryInitializeOrUpdate(
|
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryInitializeOrUpdate(
|
||||||
callbackId: callbackId,
|
|
||||||
threshold: threshold,
|
threshold: threshold,
|
||||||
userId: userId,
|
userId: userId,
|
||||||
publicKey: publicKey,
|
publicKey: publicKey,
|
||||||
|
|
@ -55,23 +46,19 @@ class FlutterUserDiscovery {
|
||||||
);
|
);
|
||||||
|
|
||||||
static Future<Uint8List?> shouldRequestNewMessages({
|
static Future<Uint8List?> shouldRequestNewMessages({
|
||||||
required int callbackId,
|
|
||||||
required PlatformInt64 contactId,
|
required PlatformInt64 contactId,
|
||||||
required List<int> version,
|
required List<int> version,
|
||||||
}) => RustLib.instance.api
|
}) => RustLib.instance.api
|
||||||
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryShouldRequestNewMessages(
|
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryShouldRequestNewMessages(
|
||||||
callbackId: callbackId,
|
|
||||||
contactId: contactId,
|
contactId: contactId,
|
||||||
version: version,
|
version: version,
|
||||||
);
|
);
|
||||||
|
|
||||||
static Future<void> updateVerificationStateForUser({
|
static Future<void> updateVerificationStateForUser({
|
||||||
required int callbackId,
|
|
||||||
required PlatformInt64 contactId,
|
required PlatformInt64 contactId,
|
||||||
PlatformInt64? publicKeyVerifiedTimestamp,
|
PlatformInt64? publicKeyVerifiedTimestamp,
|
||||||
}) => RustLib.instance.api
|
}) => RustLib.instance.api
|
||||||
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryUpdateVerificationStateForUser(
|
.crateBridgeWrapperUserDiscoveryFlutterUserDiscoveryUpdateVerificationStateForUser(
|
||||||
callbackId: callbackId,
|
|
||||||
contactId: contactId,
|
contactId: contactId,
|
||||||
publicKeyVerifiedTimestamp: publicKeyVerifiedTimestamp,
|
publicKeyVerifiedTimestamp: publicKeyVerifiedTimestamp,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -5,8 +5,6 @@
|
||||||
|
|
||||||
import 'bridge.dart';
|
import 'bridge.dart';
|
||||||
import 'bridge/callbacks.dart';
|
import 'bridge/callbacks.dart';
|
||||||
import 'bridge/callbacks/user_discovery.dart';
|
|
||||||
import 'bridge/wrapper.dart';
|
|
||||||
import 'bridge/wrapper/backup.dart';
|
import 'bridge/wrapper/backup.dart';
|
||||||
import 'bridge/wrapper/key_manager.dart';
|
import 'bridge/wrapper/key_manager.dart';
|
||||||
import 'bridge/wrapper/user_discovery.dart';
|
import 'bridge/wrapper/user_discovery.dart';
|
||||||
|
|
@ -136,19 +134,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
InitConfig dco_decode_box_autoadd_init_config(dynamic raw);
|
InitConfig dco_decode_box_autoadd_init_config(dynamic raw);
|
||||||
|
|
||||||
@protected
|
|
||||||
OtherPromotion dco_decode_box_autoadd_other_promotion(dynamic raw);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter dco_decode_box_autoadd_user_discovery_store_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter dco_decode_box_autoadd_user_discovery_utils_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw);
|
FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -220,9 +205,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
RustKeyManager dco_decode_rust_key_manager(dynamic raw);
|
RustKeyManager dco_decode_rust_key_manager(dynamic raw);
|
||||||
|
|
||||||
@protected
|
|
||||||
RustUtils dco_decode_rust_utils(dynamic raw);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int dco_decode_u_32(dynamic raw);
|
int dco_decode_u_32(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -235,16 +217,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void dco_decode_unit(dynamic raw);
|
void dco_decode_unit(dynamic raw);
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter dco_decode_user_discovery_store_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter dco_decode_user_discovery_utils_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt dco_decode_usize(dynamic raw);
|
BigInt dco_decode_usize(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -294,21 +266,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
InitConfig sse_decode_box_autoadd_init_config(SseDeserializer deserializer);
|
InitConfig sse_decode_box_autoadd_init_config(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
OtherPromotion sse_decode_box_autoadd_other_promotion(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter sse_decode_box_autoadd_user_discovery_store_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter sse_decode_box_autoadd_user_discovery_utils_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
FlutterUserDiscovery sse_decode_flutter_user_discovery(
|
FlutterUserDiscovery sse_decode_flutter_user_discovery(
|
||||||
SseDeserializer deserializer,
|
SseDeserializer deserializer,
|
||||||
|
|
@ -400,9 +357,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
RustKeyManager sse_decode_rust_key_manager(SseDeserializer deserializer);
|
RustKeyManager sse_decode_rust_key_manager(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
RustUtils sse_decode_rust_utils(SseDeserializer deserializer);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int sse_decode_u_32(SseDeserializer deserializer);
|
int sse_decode_u_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
|
@ -415,16 +369,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void sse_decode_unit(SseDeserializer deserializer);
|
void sse_decode_unit(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter sse_decode_user_discovery_store_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter sse_decode_user_discovery_utils_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt sse_decode_usize(SseDeserializer deserializer);
|
BigInt sse_decode_usize(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
|
@ -573,24 +517,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
SseSerializer serializer,
|
SseSerializer serializer,
|
||||||
);
|
);
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_box_autoadd_other_promotion(
|
|
||||||
OtherPromotion self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_box_autoadd_user_discovery_store_flutter(
|
|
||||||
UserDiscoveryStoreFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_box_autoadd_user_discovery_utils_flutter(
|
|
||||||
UserDiscoveryUtilsFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_flutter_user_discovery(
|
void sse_encode_flutter_user_discovery(
|
||||||
FlutterUserDiscovery self,
|
FlutterUserDiscovery self,
|
||||||
|
|
@ -708,9 +634,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
SseSerializer serializer,
|
SseSerializer serializer,
|
||||||
);
|
);
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_rust_utils(RustUtils self, SseSerializer serializer);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_u_32(int self, SseSerializer serializer);
|
void sse_encode_u_32(int self, SseSerializer serializer);
|
||||||
|
|
||||||
|
|
@ -723,18 +646,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_unit(void self, SseSerializer serializer);
|
void sse_encode_unit(void self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_user_discovery_store_flutter(
|
|
||||||
UserDiscoveryStoreFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_user_discovery_utils_flutter(
|
|
||||||
UserDiscoveryUtilsFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_usize(BigInt self, SseSerializer serializer);
|
void sse_encode_usize(BigInt self, SseSerializer serializer);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,6 @@
|
||||||
|
|
||||||
import 'bridge.dart';
|
import 'bridge.dart';
|
||||||
import 'bridge/callbacks.dart';
|
import 'bridge/callbacks.dart';
|
||||||
import 'bridge/callbacks/user_discovery.dart';
|
|
||||||
import 'bridge/wrapper.dart';
|
|
||||||
import 'bridge/wrapper/backup.dart';
|
import 'bridge/wrapper/backup.dart';
|
||||||
import 'bridge/wrapper/key_manager.dart';
|
import 'bridge/wrapper/key_manager.dart';
|
||||||
import 'bridge/wrapper/user_discovery.dart';
|
import 'bridge/wrapper/user_discovery.dart';
|
||||||
|
|
@ -138,19 +136,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
InitConfig dco_decode_box_autoadd_init_config(dynamic raw);
|
InitConfig dco_decode_box_autoadd_init_config(dynamic raw);
|
||||||
|
|
||||||
@protected
|
|
||||||
OtherPromotion dco_decode_box_autoadd_other_promotion(dynamic raw);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter dco_decode_box_autoadd_user_discovery_store_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter dco_decode_box_autoadd_user_discovery_utils_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw);
|
FlutterUserDiscovery dco_decode_flutter_user_discovery(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -222,9 +207,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
RustKeyManager dco_decode_rust_key_manager(dynamic raw);
|
RustKeyManager dco_decode_rust_key_manager(dynamic raw);
|
||||||
|
|
||||||
@protected
|
|
||||||
RustUtils dco_decode_rust_utils(dynamic raw);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int dco_decode_u_32(dynamic raw);
|
int dco_decode_u_32(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -237,16 +219,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void dco_decode_unit(dynamic raw);
|
void dco_decode_unit(dynamic raw);
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter dco_decode_user_discovery_store_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter dco_decode_user_discovery_utils_flutter(
|
|
||||||
dynamic raw,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt dco_decode_usize(dynamic raw);
|
BigInt dco_decode_usize(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -296,21 +268,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
InitConfig sse_decode_box_autoadd_init_config(SseDeserializer deserializer);
|
InitConfig sse_decode_box_autoadd_init_config(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
OtherPromotion sse_decode_box_autoadd_other_promotion(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter sse_decode_box_autoadd_user_discovery_store_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter sse_decode_box_autoadd_user_discovery_utils_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
FlutterUserDiscovery sse_decode_flutter_user_discovery(
|
FlutterUserDiscovery sse_decode_flutter_user_discovery(
|
||||||
SseDeserializer deserializer,
|
SseDeserializer deserializer,
|
||||||
|
|
@ -402,9 +359,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
RustKeyManager sse_decode_rust_key_manager(SseDeserializer deserializer);
|
RustKeyManager sse_decode_rust_key_manager(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
RustUtils sse_decode_rust_utils(SseDeserializer deserializer);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
int sse_decode_u_32(SseDeserializer deserializer);
|
int sse_decode_u_32(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
|
@ -417,16 +371,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void sse_decode_unit(SseDeserializer deserializer);
|
void sse_decode_unit(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryStoreFlutter sse_decode_user_discovery_store_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
UserDiscoveryUtilsFlutter sse_decode_user_discovery_utils_flutter(
|
|
||||||
SseDeserializer deserializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
BigInt sse_decode_usize(SseDeserializer deserializer);
|
BigInt sse_decode_usize(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
|
@ -575,24 +519,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
SseSerializer serializer,
|
SseSerializer serializer,
|
||||||
);
|
);
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_box_autoadd_other_promotion(
|
|
||||||
OtherPromotion self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_box_autoadd_user_discovery_store_flutter(
|
|
||||||
UserDiscoveryStoreFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_box_autoadd_user_discovery_utils_flutter(
|
|
||||||
UserDiscoveryUtilsFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_flutter_user_discovery(
|
void sse_encode_flutter_user_discovery(
|
||||||
FlutterUserDiscovery self,
|
FlutterUserDiscovery self,
|
||||||
|
|
@ -710,9 +636,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
SseSerializer serializer,
|
SseSerializer serializer,
|
||||||
);
|
);
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_rust_utils(RustUtils self, SseSerializer serializer);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_u_32(int self, SseSerializer serializer);
|
void sse_encode_u_32(int self, SseSerializer serializer);
|
||||||
|
|
||||||
|
|
@ -725,18 +648,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_unit(void self, SseSerializer serializer);
|
void sse_encode_unit(void self, SseSerializer serializer);
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_user_discovery_store_flutter(
|
|
||||||
UserDiscoveryStoreFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
|
||||||
void sse_encode_user_discovery_utils_flutter(
|
|
||||||
UserDiscoveryUtilsFlutter self,
|
|
||||||
SseSerializer serializer,
|
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_usize(BigInt self, SseSerializer serializer);
|
void sse_encode_usize(BigInt self, SseSerializer serializer);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:math';
|
|
||||||
import 'package:camera/camera.dart';
|
import 'package:camera/camera.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
|
|
||||||
final int isolateCallbackId = Random().nextInt(0x7FFFFFFF);
|
|
||||||
|
|
||||||
class AppEnvironment {
|
class AppEnvironment {
|
||||||
static late String cacheDir;
|
static late String cacheDir;
|
||||||
static late String supportDir;
|
static late String supportDir;
|
||||||
|
|
@ -35,6 +32,6 @@ class AppState {
|
||||||
static bool isInBackgroundTask = false;
|
static bool isInBackgroundTask = false;
|
||||||
static bool allowErrorTrackingViaSentry = false;
|
static bool allowErrorTrackingViaSentry = false;
|
||||||
static bool gotMessageFromServer = false;
|
static bool gotMessageFromServer = false;
|
||||||
static int latestAppVersionId = 117;
|
static int latestAppVersionId = 116;
|
||||||
static bool hasCameraPermissions = false;
|
static bool hasCameraPermissions = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:camera/camera.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:mutex/mutex.dart';
|
import 'package:mutex/mutex.dart';
|
||||||
|
|
@ -33,7 +32,7 @@ import 'package:twonly/src/utils/startup_guard.dart';
|
||||||
|
|
||||||
final _initMutex = Mutex();
|
final _initMutex = Mutex();
|
||||||
|
|
||||||
/// This function is used to initialize the absolute minimum so it
|
/// This function is used to initialized the absolute minimum so it
|
||||||
/// can also be used by the backend without the UI was loaded.
|
/// can also be used by the backend without the UI was loaded.
|
||||||
Future<bool> twonlyMinimumInitialization() async {
|
Future<bool> twonlyMinimumInitialization() async {
|
||||||
Log.info('twonlyMinimumInitialization: called');
|
Log.info('twonlyMinimumInitialization: called');
|
||||||
|
|
@ -41,13 +40,16 @@ Future<bool> twonlyMinimumInitialization() async {
|
||||||
lockName: 'init',
|
lockName: 'init',
|
||||||
mutex: _initMutex,
|
mutex: _initMutex,
|
||||||
action: () async {
|
action: () async {
|
||||||
Log.info('twonlyMinimumInitialization started');
|
Log.info('twonlyMinimumInitialization: started');
|
||||||
setupLocator();
|
setupLocator();
|
||||||
|
|
||||||
|
Log.info('twonlyMinimumInitialization: RustLib.init()');
|
||||||
await RustLib.init();
|
await RustLib.init();
|
||||||
|
|
||||||
|
Log.info('twonlyMinimumInitialization: initFlutterCallbacksForRust()');
|
||||||
await initFlutterCallbacksForRust();
|
await initFlutterCallbacksForRust();
|
||||||
|
|
||||||
|
Log.info('twonlyMinimumInitialization: bridge.initializeTwonlyFlutter()');
|
||||||
try {
|
try {
|
||||||
await bridge.initializeTwonlyFlutter(
|
await bridge.initializeTwonlyFlutter(
|
||||||
config: bridge.InitConfig(
|
config: bridge.InitConfig(
|
||||||
|
|
@ -69,21 +71,12 @@ Future<bool> twonlyMinimumInitialization() async {
|
||||||
void main() async {
|
void main() async {
|
||||||
final binding = SentryWidgetsFlutterBinding.ensureInitialized();
|
final binding = SentryWidgetsFlutterBinding.ensureInitialized();
|
||||||
await AppEnvironment.init();
|
await AppEnvironment.init();
|
||||||
|
|
||||||
// Preload available cameras in the background to speed up camera tab startup
|
|
||||||
unawaited(
|
|
||||||
availableCameras().then((cameras) {
|
|
||||||
AppEnvironment.cameras = cameras;
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
final stopwatch = Stopwatch()..start();
|
final stopwatch = Stopwatch()..start();
|
||||||
|
|
||||||
unawaited(StartupGuard.markAppStartup());
|
unawaited(StartupGuard.markAppStartup());
|
||||||
|
|
||||||
var storageError = await twonlyMinimumInitialization();
|
var storageError = await twonlyMinimumInitialization();
|
||||||
await FcmNotificationService.initStartup();
|
await initFCMService();
|
||||||
await setupPushNotification();
|
|
||||||
|
|
||||||
var userExists = false;
|
var userExists = false;
|
||||||
|
|
||||||
|
|
@ -116,8 +109,6 @@ void main() async {
|
||||||
unawaited(initFileDownloader());
|
unawaited(initFileDownloader());
|
||||||
|
|
||||||
if (userExists) {
|
if (userExists) {
|
||||||
unawaited(FcmNotificationService.initAfterUserLoaded());
|
|
||||||
|
|
||||||
if (userService.currentUser.allowErrorTrackingViaSentry) {
|
if (userService.currentUser.allowErrorTrackingViaSentry) {
|
||||||
AppState.allowErrorTrackingViaSentry = true;
|
AppState.allowErrorTrackingViaSentry = true;
|
||||||
await SentryFlutter.init(
|
await SentryFlutter.init(
|
||||||
|
|
@ -173,6 +164,7 @@ Future<void> postStartupTasks() async {
|
||||||
unawaited(MediaFileService.purgeTempFolder());
|
unawaited(MediaFileService.purgeTempFolder());
|
||||||
|
|
||||||
// 2. Service initializations
|
// 2. Service initializations
|
||||||
|
unawaited(setupPushNotification());
|
||||||
unawaited(finishStartedPreprocessing());
|
unawaited(finishStartedPreprocessing());
|
||||||
unawaited(createPushAvatars());
|
unawaited(createPushAvatars());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
import 'package:twonly/core/bridge/callbacks.dart';
|
import 'package:twonly/core/bridge/callbacks.dart';
|
||||||
import 'package:twonly/globals.dart';
|
|
||||||
import 'package:twonly/src/callbacks/logging.callbacks.dart';
|
import 'package:twonly/src/callbacks/logging.callbacks.dart';
|
||||||
import 'package:twonly/src/callbacks/user_discovery.callbacks.dart';
|
import 'package:twonly/src/callbacks/user_discovery.callbacks.dart';
|
||||||
|
|
||||||
Future<void> initFlutterCallbacksForRust() async {
|
Future<void> initFlutterCallbacksForRust() async {
|
||||||
await initFlutterCallbacks(
|
await initFlutterCallbacks(
|
||||||
callbackId: isolateCallbackId,
|
|
||||||
loggingGetStreamSink: LoggingCallbacks.getStreamSink,
|
loggingGetStreamSink: LoggingCallbacks.getStreamSink,
|
||||||
userDiscoverySetShares: UserDiscoveryCallbacks.setShares,
|
userDiscoverySetShares: UserDiscoveryCallbacks.setShares,
|
||||||
userDiscoveryGetShareForContact:
|
userDiscoveryGetShareForContact:
|
||||||
|
|
|
||||||
|
|
@ -314,11 +314,9 @@ class UserDiscoveryCallbacks {
|
||||||
|
|
||||||
static Future<Uint8List?> getContactPromotion(int contactId) async {
|
static Future<Uint8List?> getContactPromotion(int contactId) async {
|
||||||
try {
|
try {
|
||||||
final query = twonlyDB.select(twonlyDB.userDiscoveryOwnPromotions)
|
final row = await (twonlyDB.select(
|
||||||
..where((tbl) => tbl.contactId.equals(contactId))
|
twonlyDB.userDiscoveryOwnPromotions,
|
||||||
..orderBy([(tbl) => OrderingTerm.desc(tbl.versionId)])
|
)..where((tbl) => tbl.contactId.equals(contactId))).getSingleOrNull();
|
||||||
..limit(1);
|
|
||||||
final row = await query.getSingleOrNull();
|
|
||||||
return row?.promotion;
|
return row?.promotion;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.error(e);
|
Log.error(e);
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ abstract class VideoCompressionChannel {
|
||||||
});
|
});
|
||||||
return outputPath;
|
return outputPath;
|
||||||
} on PlatformException catch (e) {
|
} on PlatformException catch (e) {
|
||||||
Log.warn('Failed to compress video: $e');
|
Log.error('Failed to compress video: $e');
|
||||||
return null;
|
return null;
|
||||||
} finally {
|
} finally {
|
||||||
_currentProgressCallback = null;
|
_currentProgressCallback = null;
|
||||||
|
|
|
||||||
|
|
@ -3,5 +3,4 @@ class KeyValueKeys {
|
||||||
'last_periodic_task_execution';
|
'last_periodic_task_execution';
|
||||||
static const String currentBackupState = 'current_backup_state';
|
static const String currentBackupState = 'current_backup_state';
|
||||||
static const String backupRecoveryState = 'backup_recovery_state';
|
static const String backupRecoveryState = 'backup_recovery_state';
|
||||||
static const String onboardingState = 'onboarding_state';
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ class Routes {
|
||||||
static String profileContact(int contactId) => '/profile/contact/$contactId';
|
static String profileContact(int contactId) => '/profile/contact/$contactId';
|
||||||
|
|
||||||
static const String cameraQRScanner = '/camera/qr_scanner';
|
static const String cameraQRScanner = '/camera/qr_scanner';
|
||||||
static const String recoverPasswordless = '/recover/passwordless';
|
|
||||||
|
|
||||||
static const String settings = '/settings';
|
static const String settings = '/settings';
|
||||||
static const String settingsProfile = '/settings/profile';
|
static const String settingsProfile = '/settings/profile';
|
||||||
|
|
@ -36,6 +35,8 @@ class Routes {
|
||||||
'/settings/privacy/block_users';
|
'/settings/privacy/block_users';
|
||||||
static const String settingsPrivacyUserDiscovery =
|
static const String settingsPrivacyUserDiscovery =
|
||||||
'/settings/privacy/user_discovery';
|
'/settings/privacy/user_discovery';
|
||||||
|
static const String settingsPrivacyProfileSelection =
|
||||||
|
'/settings/privacy/profile_selection';
|
||||||
static const String settingsNotification = '/settings/notification';
|
static const String settingsNotification = '/settings/notification';
|
||||||
static const String settingsStorage = '/settings/storage_data';
|
static const String settingsStorage = '/settings/storage_data';
|
||||||
static const String settingsStorageManage = '/settings/storage_data/manage';
|
static const String settingsStorageManage = '/settings/storage_data/manage';
|
||||||
|
|
@ -61,7 +62,5 @@ class Routes {
|
||||||
'/settings/developer/automated_testing';
|
'/settings/developer/automated_testing';
|
||||||
static const String settingsDeveloperReduceFlames =
|
static const String settingsDeveloperReduceFlames =
|
||||||
'/settings/developer/reduce_flames';
|
'/settings/developer/reduce_flames';
|
||||||
static const String settingsDeveloperInformations =
|
|
||||||
'/settings/developer/informations';
|
|
||||||
static const String settingsInvite = '/settings/invite';
|
static const String settingsInvite = '/settings/invite';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,4 @@ class SecureStorageKeys {
|
||||||
// Not required for backup...
|
// Not required for backup...
|
||||||
static const String receivingPushKeys = 'push_keys_receiving';
|
static const String receivingPushKeys = 'push_keys_receiving';
|
||||||
static const String sendingPushKeys = 'push_keys_sending';
|
static const String sendingPushKeys = 'push_keys_sending';
|
||||||
static const String lastFcmMessageTimestamp = 'last_fcm_message_timestamp';
|
|
||||||
static const String lastServerMessageTimestamp =
|
|
||||||
'last_server_message_timestamp';
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -56,18 +56,6 @@ class ContactsDao extends DatabaseAccessor<TwonlyDB> with _$ContactsDaoMixin {
|
||||||
return (delete(contacts)..where((t) => t.userId.equals(userId))).go();
|
return (delete(contacts)..where((t) => t.userId.equals(userId))).go();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> resetRecoveryDataForAllContacts() async {
|
|
||||||
await update(
|
|
||||||
contacts,
|
|
||||||
).write(
|
|
||||||
const ContactsCompanion(
|
|
||||||
recoveryIsTrustedFriend: Value(false),
|
|
||||||
recoveryLastHeartbeat: Value(null),
|
|
||||||
recoverySecretShare: Value(null),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> updateContact(
|
Future<void> updateContact(
|
||||||
int userId,
|
int userId,
|
||||||
ContactsCompanion updatedValues,
|
ContactsCompanion updatedValues,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:clock/clock.dart' show clock;
|
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:hashlib/random.dart';
|
import 'package:hashlib/random.dart';
|
||||||
import 'package:twonly/locator.dart';
|
import 'package:twonly/locator.dart';
|
||||||
|
|
@ -128,7 +127,7 @@ class GroupsDao extends DatabaseAccessor<TwonlyDB> with _$GroupsDaoMixin {
|
||||||
|
|
||||||
final result = await _insertGroup(insertGroup);
|
final result = await _insertGroup(insertGroup);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
await into(groupMembers).insertOnConflictUpdate(
|
await into(groupMembers).insert(
|
||||||
GroupMembersCompanion(
|
GroupMembersCompanion(
|
||||||
groupId: Value(result.groupId),
|
groupId: Value(result.groupId),
|
||||||
contactId: Value(
|
contactId: Value(
|
||||||
|
|
@ -328,16 +327,12 @@ class GroupsDao extends DatabaseAccessor<TwonlyDB> with _$GroupsDaoMixin {
|
||||||
String groupId,
|
String groupId,
|
||||||
DateTime newLastMessage,
|
DateTime newLastMessage,
|
||||||
) async {
|
) async {
|
||||||
final now = clock.now();
|
|
||||||
final clampedLastMessage = newLastMessage.isAfter(now)
|
|
||||||
? now
|
|
||||||
: newLastMessage;
|
|
||||||
await (update(groups)..where(
|
await (update(groups)..where(
|
||||||
(t) =>
|
(t) =>
|
||||||
t.groupId.equals(groupId) &
|
t.groupId.equals(groupId) &
|
||||||
(t.lastMessageExchange.isSmallerThanValue(clampedLastMessage)),
|
(t.lastMessageExchange.isSmallerThanValue(newLastMessage)),
|
||||||
))
|
))
|
||||||
.write(GroupsCompanion(lastMessageExchange: Value(clampedLastMessage)));
|
.write(GroupsCompanion(lastMessageExchange: Value(newLastMessage)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<Group>> watchNonDirectGroupsForMember(int contactId) {
|
Stream<List<Group>> watchNonDirectGroupsForMember(int contactId) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import 'package:clock/clock.dart';
|
import 'package:clock/clock.dart';
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:twonly/core/bridge/wrapper/user_discovery.dart';
|
import 'package:twonly/core/bridge/wrapper/user_discovery.dart';
|
||||||
import 'package:twonly/globals.dart';
|
|
||||||
import 'package:twonly/locator.dart';
|
import 'package:twonly/locator.dart';
|
||||||
import 'package:twonly/src/database/tables/contacts.table.dart';
|
import 'package:twonly/src/database/tables/contacts.table.dart';
|
||||||
import 'package:twonly/src/database/tables/groups.table.dart';
|
import 'package:twonly/src/database/tables/groups.table.dart';
|
||||||
|
|
@ -57,70 +56,18 @@ class KeyVerificationDao extends DatabaseAccessor<TwonlyDB>
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> isContactVerified(int contactId) async {
|
Future<bool> isContactVerified(int contactId) async {
|
||||||
final verifierKv = alias(keyVerifications, 'verifierKv');
|
final row =
|
||||||
final query = select(keyVerifications).join([
|
await (select(keyVerifications)
|
||||||
leftOuterJoin(
|
..where((kv) => kv.contactId.equals(contactId))
|
||||||
verifierKv,
|
..limit(1))
|
||||||
verifierKv.contactId.equalsExp(keyVerifications.verifiedBy),
|
.getSingleOrNull();
|
||||||
),
|
return row != null;
|
||||||
])..where(keyVerifications.contactId.equals(contactId));
|
|
||||||
|
|
||||||
final rows = await query.get();
|
|
||||||
for (final row in rows) {
|
|
||||||
final kv = row.readTable(keyVerifications);
|
|
||||||
final hasVerifierKv = row.readTableOrNull(verifierKv) != null;
|
|
||||||
if (kv.type == VerificationType.contactSharedByVerified) {
|
|
||||||
if (hasVerifierKv) return true;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<(KeyVerification, Contact?)>> watchContactVerification(
|
Stream<List<KeyVerification>> watchContactVerification(int contactId) {
|
||||||
int contactId,
|
return (select(
|
||||||
) {
|
keyVerifications,
|
||||||
final verifier = alias(contacts, 'verifier');
|
)..where((kv) => kv.contactId.equals(contactId))).watch();
|
||||||
final verifierKv = alias(keyVerifications, 'verifierKv');
|
|
||||||
final query = select(keyVerifications).join([
|
|
||||||
leftOuterJoin(
|
|
||||||
verifier,
|
|
||||||
verifier.userId.equalsExp(keyVerifications.verifiedBy),
|
|
||||||
),
|
|
||||||
leftOuterJoin(
|
|
||||||
verifierKv,
|
|
||||||
verifierKv.contactId.equalsExp(keyVerifications.verifiedBy),
|
|
||||||
),
|
|
||||||
])..where(keyVerifications.contactId.equals(contactId));
|
|
||||||
|
|
||||||
return query.watch().map((rows) {
|
|
||||||
final uniqueKvs =
|
|
||||||
<int, (KeyVerification, Contact?, bool isVerifierVerified)>{};
|
|
||||||
|
|
||||||
for (final row in rows) {
|
|
||||||
final kv = row.readTable(keyVerifications);
|
|
||||||
final contact = row.readTableOrNull(verifier);
|
|
||||||
final hasVerifierKv = row.readTableOrNull(verifierKv) != null;
|
|
||||||
|
|
||||||
final existing = uniqueKvs[kv.verificationId];
|
|
||||||
if (existing == null || hasVerifierKv) {
|
|
||||||
uniqueKvs[kv.verificationId] = (kv, contact, hasVerifierKv);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return uniqueKvs.values
|
|
||||||
.where((item) {
|
|
||||||
final kv = item.$1;
|
|
||||||
final isVerifierVerified = item.$3;
|
|
||||||
if (kv.type == VerificationType.contactSharedByVerified) {
|
|
||||||
return isVerifierVerified;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
})
|
|
||||||
.map((item) => (item.$1, item.$2))
|
|
||||||
.toList();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<KeyVerification>> getContactVerification(int contactId) async {
|
Future<List<KeyVerification>> getContactVerification(int contactId) async {
|
||||||
|
|
@ -259,70 +206,16 @@ class KeyVerificationDao extends DatabaseAccessor<TwonlyDB>
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<int> watchUnverifiedGroupMembersCount(String groupId) {
|
Future<void> addKeyVerification(int contactId, VerificationType type) async {
|
||||||
final gm = groupMembers;
|
|
||||||
final directKv = alias(keyVerifications, 'directKv');
|
|
||||||
final ur = userDiscoveryUserRelations;
|
|
||||||
final verifierKv = alias(keyVerifications, 'verifierKv');
|
|
||||||
|
|
||||||
final query = select(gm).join([
|
|
||||||
leftOuterJoin(directKv, directKv.contactId.equalsExp(gm.contactId)),
|
|
||||||
leftOuterJoin(
|
|
||||||
ur,
|
|
||||||
ur.announcedUserId.equalsExp(gm.contactId) &
|
|
||||||
ur.publicKeyVerifiedTimestamp.isNotNull() &
|
|
||||||
ur.fromContactId.equalsExp(gm.contactId).not(),
|
|
||||||
),
|
|
||||||
leftOuterJoin(
|
|
||||||
verifierKv,
|
|
||||||
verifierKv.contactId.equalsExp(ur.fromContactId),
|
|
||||||
),
|
|
||||||
])..where(gm.groupId.equals(groupId));
|
|
||||||
|
|
||||||
return query.watch().map((rows) {
|
|
||||||
if (rows.isEmpty) return 0;
|
|
||||||
|
|
||||||
final memberTrustMap = <int, ({bool direct, bool partial})>{};
|
|
||||||
|
|
||||||
for (final row in rows) {
|
|
||||||
final contactId = row.readTable(gm).contactId;
|
|
||||||
final isDirect = row.readTableOrNull(directKv) != null;
|
|
||||||
final isPartial = row.readTableOrNull(verifierKv) != null;
|
|
||||||
|
|
||||||
final current =
|
|
||||||
memberTrustMap[contactId] ?? (direct: false, partial: false);
|
|
||||||
memberTrustMap[contactId] = (
|
|
||||||
direct: current.direct || isDirect,
|
|
||||||
partial: current.partial || isPartial,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
var count = 0;
|
|
||||||
for (final trust in memberTrustMap.values) {
|
|
||||||
if (!trust.direct && !trust.partial) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> addKeyVerification(
|
|
||||||
int contactId,
|
|
||||||
VerificationType type, {
|
|
||||||
int? verifiedBy,
|
|
||||||
}) async {
|
|
||||||
try {
|
try {
|
||||||
await into(keyVerifications).insertOnConflictUpdate(
|
await into(keyVerifications).insertOnConflictUpdate(
|
||||||
KeyVerificationsCompanion(
|
KeyVerificationsCompanion(
|
||||||
contactId: Value(contactId),
|
contactId: Value(contactId),
|
||||||
type: Value(type),
|
type: Value(type),
|
||||||
verifiedBy: Value(verifiedBy),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
if (userService.currentUser.isUserDiscoveryEnabled) {
|
if (userService.currentUser.isUserDiscoveryEnabled) {
|
||||||
await FlutterUserDiscovery.updateVerificationStateForUser(
|
await FlutterUserDiscovery.updateVerificationStateForUser(
|
||||||
callbackId: isolateCallbackId,
|
|
||||||
contactId: contactId,
|
contactId: contactId,
|
||||||
publicKeyVerifiedTimestamp: clock.now().millisecondsSinceEpoch,
|
publicKeyVerifiedTimestamp: clock.now().millisecondsSinceEpoch,
|
||||||
);
|
);
|
||||||
|
|
@ -339,7 +232,6 @@ class KeyVerificationDao extends DatabaseAccessor<TwonlyDB>
|
||||||
)..where((kv) => kv.contactId.equals(contactId))).go();
|
)..where((kv) => kv.contactId.equals(contactId))).go();
|
||||||
if (userService.currentUser.isUserDiscoveryEnabled) {
|
if (userService.currentUser.isUserDiscoveryEnabled) {
|
||||||
await FlutterUserDiscovery.updateVerificationStateForUser(
|
await FlutterUserDiscovery.updateVerificationStateForUser(
|
||||||
callbackId: isolateCallbackId,
|
|
||||||
contactId: contactId,
|
contactId: contactId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -359,7 +251,6 @@ class KeyVerificationDao extends DatabaseAccessor<TwonlyDB>
|
||||||
final remaining = await getContactVerification(contactId);
|
final remaining = await getContactVerification(contactId);
|
||||||
if (remaining.isEmpty && userService.currentUser.isUserDiscoveryEnabled) {
|
if (remaining.isEmpty && userService.currentUser.isUserDiscoveryEnabled) {
|
||||||
await FlutterUserDiscovery.updateVerificationStateForUser(
|
await FlutterUserDiscovery.updateVerificationStateForUser(
|
||||||
callbackId: isolateCallbackId,
|
|
||||||
contactId: contactId,
|
contactId: contactId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,12 @@
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:hashlib/random.dart';
|
import 'package:hashlib/random.dart';
|
||||||
import 'package:twonly/src/database/tables/mediafiles.table.dart';
|
import 'package:twonly/src/database/tables/mediafiles.table.dart';
|
||||||
import 'package:twonly/src/database/tables/messages.table.dart';
|
|
||||||
import 'package:twonly/src/database/twonly.db.dart';
|
import 'package:twonly/src/database/twonly.db.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
|
|
||||||
part 'mediafiles.dao.g.dart';
|
part 'mediafiles.dao.g.dart';
|
||||||
|
|
||||||
@DriftAccessor(tables: [MediaFiles, Messages])
|
@DriftAccessor(tables: [MediaFiles])
|
||||||
class MediaFilesDao extends DatabaseAccessor<TwonlyDB>
|
class MediaFilesDao extends DatabaseAccessor<TwonlyDB>
|
||||||
with _$MediaFilesDaoMixin {
|
with _$MediaFilesDaoMixin {
|
||||||
// this constructor is required so that the main database can create an instance
|
// this constructor is required so that the main database can create an instance
|
||||||
|
|
@ -142,11 +141,7 @@ class MediaFilesDao extends DatabaseAccessor<TwonlyDB>
|
||||||
Stream<List<MediaFile>> watchAllStoredMediaFiles() {
|
Stream<List<MediaFile>> watchAllStoredMediaFiles() {
|
||||||
final query =
|
final query =
|
||||||
(select(mediaFiles)..where((t) => t.stored.equals(true))).join([])
|
(select(mediaFiles)..where((t) => t.stored.equals(true))).join([])
|
||||||
..groupBy([
|
..groupBy([mediaFiles.storedFileHash]);
|
||||||
const CustomExpression<Object>(
|
|
||||||
'COALESCE(stored_file_hash, media_id)',
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
return query.map((row) => row.readTable(mediaFiles)).watch();
|
return query.map((row) => row.readTable(mediaFiles)).watch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -157,17 +152,6 @@ class MediaFilesDao extends DatabaseAccessor<TwonlyDB>
|
||||||
.watch();
|
.watch();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<MediaFile>> watchMediaFilesForGroup(String groupId) {
|
|
||||||
final query = select(mediaFiles).join([
|
|
||||||
innerJoin(
|
|
||||||
db.messages,
|
|
||||||
db.messages.mediaId.equalsExp(mediaFiles.mediaId),
|
|
||||||
useColumns: false,
|
|
||||||
),
|
|
||||||
])..where(db.messages.groupId.equals(groupId));
|
|
||||||
return query.map((row) => row.readTable(mediaFiles)).watch();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> updateAllRetransmissionUploadingState() async {
|
Future<void> updateAllRetransmissionUploadingState() async {
|
||||||
await (update(mediaFiles)..where(
|
await (update(mediaFiles)..where(
|
||||||
(t) =>
|
(t) =>
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,6 @@ part of 'mediafiles.dao.dart';
|
||||||
// ignore_for_file: type=lint
|
// ignore_for_file: type=lint
|
||||||
mixin _$MediaFilesDaoMixin on DatabaseAccessor<TwonlyDB> {
|
mixin _$MediaFilesDaoMixin on DatabaseAccessor<TwonlyDB> {
|
||||||
$MediaFilesTable get mediaFiles => attachedDatabase.mediaFiles;
|
$MediaFilesTable get mediaFiles => attachedDatabase.mediaFiles;
|
||||||
$GroupsTable get groups => attachedDatabase.groups;
|
|
||||||
$ContactsTable get contacts => attachedDatabase.contacts;
|
|
||||||
$MessagesTable get messages => attachedDatabase.messages;
|
|
||||||
MediaFilesDaoManager get managers => MediaFilesDaoManager(this);
|
MediaFilesDaoManager get managers => MediaFilesDaoManager(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -16,10 +13,4 @@ class MediaFilesDaoManager {
|
||||||
MediaFilesDaoManager(this._db);
|
MediaFilesDaoManager(this._db);
|
||||||
$$MediaFilesTableTableManager get mediaFiles =>
|
$$MediaFilesTableTableManager get mediaFiles =>
|
||||||
$$MediaFilesTableTableManager(_db.attachedDatabase, _db.mediaFiles);
|
$$MediaFilesTableTableManager(_db.attachedDatabase, _db.mediaFiles);
|
||||||
$$GroupsTableTableManager get groups =>
|
|
||||||
$$GroupsTableTableManager(_db.attachedDatabase, _db.groups);
|
|
||||||
$$ContactsTableTableManager get contacts =>
|
|
||||||
$$ContactsTableTableManager(_db.attachedDatabase, _db.contacts);
|
|
||||||
$$MessagesTableTableManager get messages =>
|
|
||||||
$$MessagesTableTableManager(_db.attachedDatabase, _db.messages);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,25 +32,15 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
MessagesDao(super.db);
|
MessagesDao(super.db);
|
||||||
|
|
||||||
Stream<List<Message>> watchMessageNotOpened(String groupId) {
|
Stream<List<Message>> watchMessageNotOpened(String groupId) {
|
||||||
final query =
|
return (select(messages)
|
||||||
select(messages).join([
|
|
||||||
leftOuterJoin(
|
|
||||||
mediaFiles,
|
|
||||||
mediaFiles.mediaId.equalsExp(messages.mediaId),
|
|
||||||
),
|
|
||||||
])
|
|
||||||
..where(
|
..where(
|
||||||
messages.openedAt.isNull() &
|
(t) =>
|
||||||
messages.groupId.equals(groupId) &
|
t.openedAt.isNull() &
|
||||||
messages.isDeletedFromSender.equals(false) &
|
t.groupId.equals(groupId) &
|
||||||
(messages.mediaId.isNull() |
|
t.isDeletedFromSender.equals(false),
|
||||||
mediaFiles.downloadState.isNull() |
|
|
||||||
mediaFiles.downloadState
|
|
||||||
.equals(DownloadState.reuploadRequested.name)
|
|
||||||
.not()),
|
|
||||||
)
|
)
|
||||||
..orderBy([OrderingTerm.desc(messages.createdAt)]);
|
..orderBy([(t) => OrderingTerm.desc(t.createdAt)]))
|
||||||
return query.map((row) => row.readTable(messages)).watch();
|
.watch();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<Message>> watchMediaNotOpened(String groupId) {
|
Stream<List<Message>> watchMediaNotOpened(String groupId) {
|
||||||
|
|
@ -60,39 +50,18 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
mediaFiles,
|
mediaFiles,
|
||||||
mediaFiles.mediaId.equalsExp(messages.mediaId),
|
mediaFiles.mediaId.equalsExp(messages.mediaId),
|
||||||
),
|
),
|
||||||
])
|
])..where(
|
||||||
..where(
|
|
||||||
(mediaFiles.downloadState.isNull() |
|
|
||||||
mediaFiles.downloadState
|
mediaFiles.downloadState
|
||||||
.equals(DownloadState.reuploadRequested.name)
|
.equals(DownloadState.reuploadRequested.name)
|
||||||
.not()) &
|
.not() &
|
||||||
mediaFiles.type.equals(MediaType.audio.name).not() &
|
mediaFiles.type.equals(MediaType.audio.name).not() &
|
||||||
messages.openedAt.isNull() &
|
messages.openedAt.isNull() &
|
||||||
messages.groupId.equals(groupId) &
|
messages.groupId.equals(groupId) &
|
||||||
messages.mediaId.isNotNull() &
|
messages.mediaId.isNotNull() &
|
||||||
messages.senderId.isNotNull() &
|
messages.senderId.isNotNull() &
|
||||||
messages.type.equals(MessageType.media.name),
|
messages.type.equals(MessageType.media.name),
|
||||||
)
|
|
||||||
..orderBy([OrderingTerm.asc(messages.createdAt)]);
|
|
||||||
return query.map((row) => row.readTable(messages)).watch();
|
|
||||||
}
|
|
||||||
|
|
||||||
Stream<List<MediaFile>> watchUnopenedMediaFiles() {
|
|
||||||
final query =
|
|
||||||
select(messages).join([
|
|
||||||
leftOuterJoin(
|
|
||||||
mediaFiles,
|
|
||||||
mediaFiles.mediaId.equalsExp(messages.mediaId),
|
|
||||||
),
|
|
||||||
])..where(
|
|
||||||
messages.openedAt.isNull() &
|
|
||||||
messages.mediaId.isNotNull() &
|
|
||||||
messages.type.equals(MessageType.media.name) &
|
|
||||||
mediaFiles.downloadState.equals(DownloadState.ready.name) &
|
|
||||||
(mediaFiles.type.equals(MediaType.image.name) |
|
|
||||||
mediaFiles.type.equals(MediaType.gif.name)),
|
|
||||||
);
|
);
|
||||||
return query.map((row) => row.readTable(mediaFiles)).watch();
|
return query.map((row) => row.readTable(messages)).watch();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Stream<Message?>> watchLastMessage(String groupId) async {
|
Future<Stream<Message?>> watchLastMessage(String groupId) async {
|
||||||
|
|
@ -102,29 +71,19 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
milliseconds: group!.deleteMessagesAfterMilliseconds,
|
milliseconds: group!.deleteMessagesAfterMilliseconds,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final query =
|
return (select(messages)
|
||||||
select(messages).join([
|
|
||||||
leftOuterJoin(
|
|
||||||
mediaFiles,
|
|
||||||
mediaFiles.mediaId.equalsExp(messages.mediaId),
|
|
||||||
),
|
|
||||||
])
|
|
||||||
..where(
|
..where(
|
||||||
messages.groupId.equals(groupId) &
|
(t) =>
|
||||||
|
t.groupId.equals(groupId) &
|
||||||
// messages in groups will only be removed in case all members have received it...
|
// messages in groups will only be removed in case all members have received it...
|
||||||
// so ensuring that this message is not shown in the messages anymore
|
// so ensuring that this message is not shown in the messages anymore
|
||||||
(messages.openedAt.isBiggerThanValue(deletionTime) |
|
(t.openedAt.isBiggerThanValue(deletionTime) |
|
||||||
messages.openedAt.isNull() |
|
t.openedAt.isNull() |
|
||||||
messages.mediaStored.equals(true)) &
|
t.mediaStored.equals(true)),
|
||||||
(mediaFiles.downloadState
|
|
||||||
.equals(DownloadState.reuploadRequested.name)
|
|
||||||
.not() |
|
|
||||||
mediaFiles.downloadState.isNull()),
|
|
||||||
)
|
)
|
||||||
..orderBy([OrderingTerm.desc(messages.createdAt)])
|
..orderBy([(t) => OrderingTerm.desc(t.createdAt)])
|
||||||
..limit(1);
|
..limit(1))
|
||||||
|
.watchSingleOrNull();
|
||||||
return query.map((row) => row.readTable(messages)).watchSingleOrNull();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Stream<List<Message>>> watchByGroupId(String groupId) async {
|
Future<Stream<List<Message>>> watchByGroupId(String groupId) async {
|
||||||
|
|
@ -134,33 +93,24 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
milliseconds: group!.deleteMessagesAfterMilliseconds,
|
milliseconds: group!.deleteMessagesAfterMilliseconds,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final query =
|
return ((select(messages)..where(
|
||||||
select(messages).join([
|
(t) =>
|
||||||
leftOuterJoin(
|
t.groupId.equals(groupId) &
|
||||||
mediaFiles,
|
// messages in groups will only be removed in case all members have received it...
|
||||||
mediaFiles.mediaId.equalsExp(messages.mediaId),
|
// so ensuring that this message is not shown in the messages anymore
|
||||||
),
|
(t.openedAt.isBiggerThanValue(deletionTime) |
|
||||||
])
|
t.openedAt.isNull() |
|
||||||
..where(
|
t.mediaStored.equals(true)) &
|
||||||
messages.groupId.equals(groupId) &
|
(t.isDeletedFromSender.equals(true) |
|
||||||
(messages.openedAt.isBiggerThanValue(deletionTime) |
|
(t.type.equals(MessageType.text.name).not() &
|
||||||
messages.openedAt.isNull() |
|
t.type.equals(MessageType.media.name).not()) |
|
||||||
messages.mediaStored.equals(true)) &
|
(t.type.equals(MessageType.text.name) &
|
||||||
(messages.isDeletedFromSender.equals(true) |
|
t.content.isNotNull()) |
|
||||||
(messages.type.equals(MessageType.text.name).not() &
|
(t.type.equals(MessageType.media.name) &
|
||||||
messages.type.equals(MessageType.media.name).not()) |
|
t.mediaId.isNotNull())),
|
||||||
(messages.type.equals(MessageType.text.name) &
|
))
|
||||||
messages.content.isNotNull()) |
|
..orderBy([(t) => OrderingTerm.asc(t.createdAt)]))
|
||||||
(messages.type.equals(MessageType.media.name) &
|
.watch();
|
||||||
messages.mediaId.isNotNull() &
|
|
||||||
(mediaFiles.downloadState.isNull() |
|
|
||||||
mediaFiles.downloadState
|
|
||||||
.equals(DownloadState.reuploadRequested.name)
|
|
||||||
.not()))),
|
|
||||||
)
|
|
||||||
..orderBy([OrderingTerm.asc(messages.createdAt)]);
|
|
||||||
|
|
||||||
return query.map((row) => row.readTable(messages)).watch();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<List<(GroupMember, Contact)>> watchMembersByGroupId(String groupId) {
|
Stream<List<(GroupMember, Contact)>> watchMembersByGroupId(String groupId) {
|
||||||
|
|
@ -211,8 +161,7 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
m.isDeletedFromSender.equals(true)) |
|
m.isDeletedFromSender.equals(true)) |
|
||||||
m.mediaStored.equals(false)) &
|
m.mediaStored.equals(false)) &
|
||||||
// Only remove the message when ALL members have seen it. Otherwise the receipt will also be deleted which could cause issues in case a member opens the image later..
|
// Only remove the message when ALL members have seen it. Otherwise the receipt will also be deleted which could cause issues in case a member opens the image later..
|
||||||
((m.openedByAll.isNotNull() &
|
(m.openedByAll.isSmallerThanValue(deletionTime) |
|
||||||
m.openedByAll.isSmallerThanValue(deletionTime)) |
|
|
||||||
(m.isDeletedFromSender.equals(true) &
|
(m.isDeletedFromSender.equals(true) &
|
||||||
m.createdAt.isSmallerThanValue(deletionTime))),
|
m.createdAt.isSmallerThanValue(deletionTime))),
|
||||||
))
|
))
|
||||||
|
|
@ -284,7 +233,6 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
String text,
|
String text,
|
||||||
DateTime timestamp,
|
DateTime timestamp,
|
||||||
) async {
|
) async {
|
||||||
await transaction(() async {
|
|
||||||
final msg = await getMessageById(messageId).getSingleOrNull();
|
final msg = await getMessageById(messageId).getSingleOrNull();
|
||||||
if (msg == null || msg.content == null || msg.senderId != contactId) {
|
if (msg == null || msg.content == null || msg.senderId != contactId) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -305,7 +253,6 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
modifiedAt: Value(timestamp),
|
modifiedAt: Value(timestamp),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> handleMessagesOpened(
|
Future<void> handleMessagesOpened(
|
||||||
|
|
@ -313,37 +260,21 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
List<String> messageIds,
|
List<String> messageIds,
|
||||||
DateTime timestamp,
|
DateTime timestamp,
|
||||||
) async {
|
) async {
|
||||||
if (contactId.present) {
|
|
||||||
final contactExists = await twonlyDB.contactsDao.getContactById(
|
|
||||||
contactId.value,
|
|
||||||
);
|
|
||||||
if (contactExists == null) {
|
|
||||||
Log.info(
|
|
||||||
'handleMessagesOpened: Contact ${contactId.value} does not exist in database, ignoring messages opened action.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (final messageId in messageIds) {
|
for (final messageId in messageIds) {
|
||||||
try {
|
try {
|
||||||
await transaction(() async {
|
var actionTimestamp = timestamp;
|
||||||
final msg = await getMessageById(messageId).getSingleOrNull();
|
final msg = await getMessageById(messageId).getSingleOrNull();
|
||||||
if (msg == null) {
|
if (msg != null && actionTimestamp.isBefore(msg.createdAt)) {
|
||||||
Log.info(
|
|
||||||
'handleMessagesOpened: Message $messageId does not exist in database, skipping.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var ts = timestamp;
|
|
||||||
if (ts.isBefore(msg.createdAt)) {
|
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'Receiver clock skew detected for message $messageId. '
|
'Receiver clock skew detected for message $messageId. '
|
||||||
'Action timestamp $ts is before message creation ${msg.createdAt}. '
|
'Action timestamp $actionTimestamp is before message creation ${msg.createdAt}. '
|
||||||
'Clamping to creation time.',
|
'Clamping to creation time.',
|
||||||
);
|
);
|
||||||
ts = msg.createdAt;
|
actionTimestamp = msg.createdAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final ts = actionTimestamp;
|
||||||
|
await transaction(() async {
|
||||||
await into(messageActions).insertOnConflictUpdate(
|
await into(messageActions).insertOnConflictUpdate(
|
||||||
MessageActionsCompanion(
|
MessageActionsCompanion(
|
||||||
messageId: Value(messageId),
|
messageId: Value(messageId),
|
||||||
|
|
@ -377,7 +308,7 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
messages,
|
messages,
|
||||||
)..where((tbl) => tbl.messageId.equals(messageId))).write(
|
)..where((tbl) => tbl.messageId.equals(messageId))).write(
|
||||||
MessagesCompanion(
|
MessagesCompanion(
|
||||||
openedAt: Value(timestamp),
|
openedAt: Value(actionTimestamp),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -386,11 +317,7 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
'handleMessagesOpened completed for message $messageId',
|
'handleMessagesOpened completed for message $messageId',
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn('handleMessagesOpened failed for $messageId: $e');
|
Log.error('handleMessagesOpened failed for $messageId: $e');
|
||||||
Log.error(
|
|
||||||
'handleMessagesOpened failed for: $e',
|
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -400,21 +327,7 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
String messageId,
|
String messageId,
|
||||||
DateTime timestamp,
|
DateTime timestamp,
|
||||||
) async {
|
) async {
|
||||||
final contactExists = await twonlyDB.contactsDao.getContactById(contactId);
|
|
||||||
if (contactExists == null) {
|
|
||||||
Log.info(
|
|
||||||
'handleMessageAckByServer: Contact $contactId does not exist in database, ignoring message ack.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await transaction(() async {
|
await transaction(() async {
|
||||||
final msg = await getMessageById(messageId).getSingleOrNull();
|
|
||||||
if (msg == null) {
|
|
||||||
Log.info(
|
|
||||||
'handleMessageAckByServer: Message $messageId does not exist in database, skipping.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await into(messageActions).insertOnConflictUpdate(
|
await into(messageActions).insertOnConflictUpdate(
|
||||||
MessageActionsCompanion(
|
MessageActionsCompanion(
|
||||||
messageId: Value(messageId),
|
messageId: Value(messageId),
|
||||||
|
|
@ -528,15 +441,6 @@ class MessagesDao extends DatabaseAccessor<TwonlyDB> with _$MessagesDaoMixin {
|
||||||
.getSingleOrNull();
|
.getSingleOrNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<MessageAction?> watchLastMessageAction(String messageId) {
|
|
||||||
return (((select(messageActions)..where(
|
|
||||||
(t) => t.messageId.equals(messageId),
|
|
||||||
))
|
|
||||||
..orderBy([(t) => OrderingTerm.desc(t.actionAt)]))
|
|
||||||
..limit(1))
|
|
||||||
.watchSingleOrNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> deleteMessagesById(String messageId) {
|
Future<void> deleteMessagesById(String messageId) {
|
||||||
return (delete(messages)..where((t) => t.messageId.equals(messageId))).go();
|
return (delete(messages)..where((t) => t.messageId.equals(messageId))).go();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,15 +30,11 @@ class ReactionsDao extends DatabaseAccessor<TwonlyDB> with _$ReactionsDaoMixin {
|
||||||
.getMessageById(messageId)
|
.getMessageById(messageId)
|
||||||
.getSingleOrNull();
|
.getSingleOrNull();
|
||||||
if (msg == null) {
|
if (msg == null) {
|
||||||
Log.warn('updateReaction: Message $messageId not found!');
|
Log.error('updateReaction: Message $messageId not found!');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (msg.groupId != groupId) {
|
if (msg.groupId != groupId) {
|
||||||
Log.warn('updateReaction: Message groupId ${msg.groupId} != $groupId');
|
Log.error('updateReaction: Message groupId ${msg.groupId} != $groupId');
|
||||||
Log.error(
|
|
||||||
'updateReaction: Message groupId mismatch',
|
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -201,8 +201,8 @@ class ReceiptsDao extends DatabaseAccessor<TwonlyDB> with _$ReceiptsDaoMixin {
|
||||||
);
|
);
|
||||||
final updatedReceipt = await getReceiptById(newReceiptId);
|
final updatedReceipt = await getReceiptById(newReceiptId);
|
||||||
if (updatedReceipt == null) {
|
if (updatedReceipt == null) {
|
||||||
Log.warn(
|
Log.error(
|
||||||
'[$oldReceiptId] Tried to change the receipt ID to $newReceiptId, but could not get the updated receipt...',
|
'Tried to change the receipt ID, but could not get the updated receipt...',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return updatedReceipt;
|
return updatedReceipt;
|
||||||
|
|
@ -253,9 +253,6 @@ class ReceiptsDao extends DatabaseAccessor<TwonlyDB> with _$ReceiptsDaoMixin {
|
||||||
Future<void> gotReceipt(String receiptId) async {
|
Future<void> gotReceipt(String receiptId) async {
|
||||||
await into(
|
await into(
|
||||||
receivedReceipts,
|
receivedReceipts,
|
||||||
).insert(
|
).insert(ReceivedReceiptsCompanion(receiptId: Value(receiptId)));
|
||||||
ReceivedReceiptsCompanion(receiptId: Value(receiptId)),
|
|
||||||
mode: InsertMode.insertOrIgnore,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:twonly/locator.dart';
|
|
||||||
import 'package:twonly/src/database/tables/contacts.table.dart';
|
import 'package:twonly/src/database/tables/contacts.table.dart';
|
||||||
import 'package:twonly/src/database/tables/user_discovery.table.dart';
|
import 'package:twonly/src/database/tables/user_discovery.table.dart';
|
||||||
import 'package:twonly/src/database/twonly.db.dart';
|
import 'package:twonly/src/database/twonly.db.dart';
|
||||||
|
|
@ -185,51 +184,23 @@ class UserDiscoveryDao extends DatabaseAccessor<TwonlyDB>
|
||||||
results[user]!.add(relationData);
|
results[user]!.add(relationData);
|
||||||
}
|
}
|
||||||
|
|
||||||
final threshold = userService.currentUser.userDiscoveryThreshold;
|
|
||||||
results.removeWhere((user, relations) => relations.length < threshold);
|
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<int> watchNewAnnouncementsWithDataCount() {
|
Stream<int> watchNewAnnouncementsWithDataCount() {
|
||||||
final announcedContact = alias(contacts, 'announcedContact');
|
final countExp = userDiscoveryAnnouncedUsers.announcedUserId.count();
|
||||||
final query =
|
|
||||||
select(userDiscoveryAnnouncedUsers).join([
|
final query = selectOnly(userDiscoveryAnnouncedUsers)
|
||||||
innerJoin(
|
..addColumns([countExp])
|
||||||
userDiscoveryUserRelations,
|
..where(
|
||||||
userDiscoveryUserRelations.announcedUserId.equalsExp(
|
// Filters: Has a username AND has not been shown to the user yet
|
||||||
userDiscoveryAnnouncedUsers.announcedUserId,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
leftOuterJoin(
|
|
||||||
announcedContact,
|
|
||||||
announcedContact.userId.equalsExp(
|
|
||||||
userDiscoveryAnnouncedUsers.announcedUserId,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
])..where(
|
|
||||||
// Filters: Has a username AND has not been shown to the user yet AND is not an existing contact
|
|
||||||
userDiscoveryAnnouncedUsers.username.isNotNull() &
|
userDiscoveryAnnouncedUsers.username.isNotNull() &
|
||||||
userDiscoveryAnnouncedUsers.wasShownToTheUser.equals(false) &
|
userDiscoveryAnnouncedUsers.wasShownToTheUser.equals(false) &
|
||||||
userDiscoveryAnnouncedUsers.isHidden.equals(false) &
|
userDiscoveryAnnouncedUsers.isHidden.equals(false),
|
||||||
(announcedContact.userId.isNull() |
|
|
||||||
announcedContact.deletedByUser.equals(true)),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return query.watch().map((rows) {
|
return query.watchSingle().map((row) => row.read(countExp) ?? 0);
|
||||||
final relationCounts = <int, int>{};
|
|
||||||
for (final row in rows) {
|
|
||||||
final announcedUserId = row
|
|
||||||
.readTable(userDiscoveryAnnouncedUsers)
|
|
||||||
.announcedUserId;
|
|
||||||
relationCounts[announcedUserId] =
|
|
||||||
(relationCounts[announcedUserId] ?? 0) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
final threshold = userService.currentUser.userDiscoveryThreshold;
|
|
||||||
return relationCounts.values.where((count) => count >= threshold).length;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> markAllValidAnnouncedUsersAsShown() async {
|
Future<void> markAllValidAnnouncedUsersAsShown() async {
|
||||||
|
|
@ -263,12 +234,6 @@ class UserDiscoveryDao extends DatabaseAccessor<TwonlyDB>
|
||||||
)..where((tbl) => tbl.announcedUserId.equals(id))).getSingleOrNull();
|
)..where((tbl) => tbl.announcedUserId.equals(id))).getSingleOrNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream<UserDiscoveryAnnouncedUser?> watchAnnouncedUser(int id) {
|
|
||||||
return (select(
|
|
||||||
userDiscoveryAnnouncedUsers,
|
|
||||||
)..where((tbl) => tbl.announcedUserId.equals(id))).watchSingleOrNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
Stream<List<UserDiscoveryAnnouncedUser>> watchAllAnnouncedUsers() =>
|
Stream<List<UserDiscoveryAnnouncedUser>> watchAllAnnouncedUsers() =>
|
||||||
select(userDiscoveryAnnouncedUsers).watch();
|
select(userDiscoveryAnnouncedUsers).watch();
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -42,9 +42,7 @@ class SignalPreKeyStore extends PreKeyStore {
|
||||||
);
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await twonlyDB
|
await twonlyDB.into(twonlyDB.signalPreKeyStores).insert(preKeyCompanion);
|
||||||
.into(twonlyDB.signalPreKeyStores)
|
|
||||||
.insert(preKeyCompanion, mode: InsertMode.insertOrReplace);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.error('$e');
|
Log.error('$e');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,26 +23,15 @@ class Contacts extends Table {
|
||||||
|
|
||||||
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
|
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
|
||||||
|
|
||||||
// User Discovery
|
// contact_versions: HashMap<UserID, Vec<u8>>,
|
||||||
BlobColumn get userDiscoveryVersion => blob().nullable()();
|
BlobColumn get userDiscoveryVersion => blob().nullable()();
|
||||||
|
|
||||||
BoolColumn get userDiscoveryExcluded =>
|
BoolColumn get userDiscoveryExcluded =>
|
||||||
boolean().withDefault(const Constant(false))();
|
boolean().withDefault(const Constant(false))();
|
||||||
|
|
||||||
BoolColumn get userDiscoveryManualApproved =>
|
BoolColumn get userDiscoveryManualApproved =>
|
||||||
boolean().nullable().withDefault(const Constant(false))();
|
boolean().nullable().withDefault(const Constant(false))();
|
||||||
|
|
||||||
// Passwordless-Recovery
|
|
||||||
BoolColumn get recoveryIsTrustedFriend =>
|
|
||||||
boolean().withDefault(const Constant(false))();
|
|
||||||
DateTimeColumn get recoveryLastHeartbeat => dateTime().nullable()();
|
|
||||||
BlobColumn get recoverySecretShare => blob().nullable()();
|
|
||||||
|
|
||||||
// This is the share from the contact in case the contact has selected this user as his trusted friend.
|
|
||||||
BlobColumn get recoveryContactsSecretShare => blob().nullable()();
|
|
||||||
DateTimeColumn get recoveryContactsLastHeartbeat => dateTime().nullable()();
|
|
||||||
IntColumn get recoveryContactsThreshold => integer().nullable()();
|
|
||||||
|
|
||||||
BoolColumn get askForFriendPromotions => boolean().nullable()();
|
|
||||||
|
|
||||||
IntColumn get mediaSendCounter => integer().withDefault(const Constant(0))();
|
IntColumn get mediaSendCounter => integer().withDefault(const Constant(0))();
|
||||||
IntColumn get mediaReceivedCounter =>
|
IntColumn get mediaReceivedCounter =>
|
||||||
integer().withDefault(const Constant(0))();
|
integer().withDefault(const Constant(0))();
|
||||||
|
|
@ -68,11 +57,6 @@ class KeyVerifications extends Table {
|
||||||
onDelete: KeyAction.cascade,
|
onDelete: KeyAction.cascade,
|
||||||
)();
|
)();
|
||||||
TextColumn get type => textEnum<VerificationType>()();
|
TextColumn get type => textEnum<VerificationType>()();
|
||||||
IntColumn get verifiedBy => integer().nullable().references(
|
|
||||||
Contacts,
|
|
||||||
#userId,
|
|
||||||
onDelete: KeyAction.cascade,
|
|
||||||
)();
|
|
||||||
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
|
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ class TwonlyDB extends _$TwonlyDB {
|
||||||
TwonlyDB.forTesting(DatabaseConnection super.connection);
|
TwonlyDB.forTesting(DatabaseConnection super.connection);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get schemaVersion => 22;
|
int get schemaVersion => 17;
|
||||||
|
|
||||||
static QueryExecutor _openConnection() {
|
static QueryExecutor _openConnection() {
|
||||||
final connection = driftDatabase(
|
final connection = driftDatabase(
|
||||||
|
|
@ -233,59 +233,14 @@ class TwonlyDB extends _$TwonlyDB {
|
||||||
schema.userDiscoveryAnnouncedUsers.wasAskedFriends,
|
schema.userDiscoveryAnnouncedUsers.wasAskedFriends,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
from17To18: (m, schema) async {
|
|
||||||
await m.addColumn(
|
|
||||||
schema.contacts,
|
|
||||||
schema.contacts.askForFriendPromotions,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
from18To19: (m, schema) async {
|
|
||||||
await m.addColumn(
|
|
||||||
schema.keyVerifications,
|
|
||||||
schema.keyVerifications.verifiedBy,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
from19To20: (m, schema) async {
|
|
||||||
await m.addColumn(
|
|
||||||
schema.contacts,
|
|
||||||
schema.contacts.recoveryIsTrustedFriend,
|
|
||||||
);
|
|
||||||
await m.addColumn(
|
|
||||||
schema.contacts,
|
|
||||||
schema.contacts.recoveryLastHeartbeat,
|
|
||||||
);
|
|
||||||
await m.addColumn(
|
|
||||||
schema.contacts,
|
|
||||||
schema.contacts.recoverySecretShare,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
from20To21: (m, schema) async {
|
|
||||||
await m.addColumn(
|
|
||||||
schema.contacts,
|
|
||||||
schema.contacts.recoveryContactsSecretShare,
|
|
||||||
);
|
|
||||||
await m.addColumn(
|
|
||||||
schema.contacts,
|
|
||||||
schema.contacts.recoveryContactsLastHeartbeat,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
from21To22: (m, schema) async {
|
|
||||||
await m.addColumn(
|
|
||||||
schema.contacts,
|
|
||||||
schema.contacts.recoveryContactsThreshold,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
)(m, from, to);
|
)(m, from, to);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void markUpdated() {
|
void markUpdated() {
|
||||||
notifyUpdates({
|
notifyUpdates({TableUpdate.onTable(messages, kind: UpdateKind.update)});
|
||||||
TableUpdate.onTable(messages, kind: UpdateKind.update),
|
notifyUpdates({TableUpdate.onTable(contacts, kind: UpdateKind.update)});
|
||||||
TableUpdate.onTable(contacts, kind: UpdateKind.update),
|
|
||||||
TableUpdate.onTable(groups, kind: UpdateKind.update),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> printTableSizes() async {
|
Future<void> printTableSizes() async {
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -101,7 +101,7 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @registerSlogan.
|
/// No description provided for @registerSlogan.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Stay in touch privately.'**
|
/// **'Stay in touch with friends privately and securely.'**
|
||||||
String get registerSlogan;
|
String get registerSlogan;
|
||||||
|
|
||||||
/// No description provided for @onboardingWelcomeTitle.
|
/// No description provided for @onboardingWelcomeTitle.
|
||||||
|
|
@ -140,6 +140,18 @@ abstract class AppLocalizations {
|
||||||
/// **'Say goodbye to addictive features! twonly was created for sharing moments, free from useless distractions or ads.'**
|
/// **'Say goodbye to addictive features! twonly was created for sharing moments, free from useless distractions or ads.'**
|
||||||
String get onboardingFocusBody;
|
String get onboardingFocusBody;
|
||||||
|
|
||||||
|
/// No description provided for @onboardingSendTwonliesTitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Send twonlies'**
|
||||||
|
String get onboardingSendTwonliesTitle;
|
||||||
|
|
||||||
|
/// No description provided for @onboardingSendTwonliesBody.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Share moments securely with your partner. twonly ensures that only your partner can open it, keeping your moments with your partner a two(o)nly thing!'**
|
||||||
|
String get onboardingSendTwonliesBody;
|
||||||
|
|
||||||
/// No description provided for @onboardingNotProductTitle.
|
/// No description provided for @onboardingNotProductTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -149,13 +161,19 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @onboardingNotProductBody.
|
/// No description provided for @onboardingNotProductBody.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'twonly is financed by an optional subscription. Your data will never be sold.'**
|
/// **'twonly is financed by donations and an optional subscription. Your data will never be sold.'**
|
||||||
String get onboardingNotProductBody;
|
String get onboardingNotProductBody;
|
||||||
|
|
||||||
|
/// No description provided for @onboardingGetStartedTitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Let\'s go!'**
|
||||||
|
String get onboardingGetStartedTitle;
|
||||||
|
|
||||||
/// No description provided for @registerUsernameSlogan.
|
/// No description provided for @registerUsernameSlogan.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Create your account'**
|
/// **'Your public username'**
|
||||||
String get registerUsernameSlogan;
|
String get registerUsernameSlogan;
|
||||||
|
|
||||||
/// No description provided for @registerUsernameDecoration.
|
/// No description provided for @registerUsernameDecoration.
|
||||||
|
|
@ -302,12 +320,24 @@ abstract class AppLocalizations {
|
||||||
/// **'Username not found'**
|
/// **'Username not found'**
|
||||||
String get searchUsernameNotFound;
|
String get searchUsernameNotFound;
|
||||||
|
|
||||||
|
/// No description provided for @searchUsernameNotFoundBody.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'There is no user with the username \"{username}\" registered'**
|
||||||
|
String searchUsernameNotFoundBody(Object username);
|
||||||
|
|
||||||
/// No description provided for @searchUsernameNewFollowerTitle.
|
/// No description provided for @searchUsernameNewFollowerTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Open requests'**
|
/// **'Open requests'**
|
||||||
String get searchUsernameNewFollowerTitle;
|
String get searchUsernameNewFollowerTitle;
|
||||||
|
|
||||||
|
/// No description provided for @chatListViewSearchUserNameBtn.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Add your first twonly contact!'**
|
||||||
|
String get chatListViewSearchUserNameBtn;
|
||||||
|
|
||||||
/// No description provided for @chatListDetailInput.
|
/// No description provided for @chatListDetailInput.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -482,6 +512,12 @@ abstract class AppLocalizations {
|
||||||
/// **'Store in Gallery'**
|
/// **'Store in Gallery'**
|
||||||
String get settingsStorageDataStoreInGTitle;
|
String get settingsStorageDataStoreInGTitle;
|
||||||
|
|
||||||
|
/// No description provided for @settingsStorageDataStoreInGSubtitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Store saved images additional in the systems gallery.'**
|
||||||
|
String get settingsStorageDataStoreInGSubtitle;
|
||||||
|
|
||||||
/// No description provided for @settingsStorageDataMediaAutoDownload.
|
/// No description provided for @settingsStorageDataMediaAutoDownload.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -575,13 +611,13 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @settingsPrivacyBlockUsers.
|
/// No description provided for @settingsPrivacyBlockUsers.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Block contacts'**
|
/// **'Block users'**
|
||||||
String get settingsPrivacyBlockUsers;
|
String get settingsPrivacyBlockUsers;
|
||||||
|
|
||||||
/// No description provided for @settingsPrivacyBlockUsersDesc.
|
/// No description provided for @settingsPrivacyBlockUsersDesc.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Blocked contacts will not be able to communicate with you. You can unblock a blocked contact at any time.'**
|
/// **'Blocked users will not be able to communicate with you. You can unblock a blocked user at any time.'**
|
||||||
String get settingsPrivacyBlockUsersDesc;
|
String get settingsPrivacyBlockUsersDesc;
|
||||||
|
|
||||||
/// No description provided for @settingsPrivacyBlockUsersCount.
|
/// No description provided for @settingsPrivacyBlockUsersCount.
|
||||||
|
|
@ -590,6 +626,54 @@ abstract class AppLocalizations {
|
||||||
/// **'{len} contact(s)'**
|
/// **'{len} contact(s)'**
|
||||||
String settingsPrivacyBlockUsersCount(Object len);
|
String settingsPrivacyBlockUsersCount(Object len);
|
||||||
|
|
||||||
|
/// No description provided for @settingsPrivacyProfileSelectionTitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Security Profile'**
|
||||||
|
String get settingsPrivacyProfileSelectionTitle;
|
||||||
|
|
||||||
|
/// No description provided for @settingsPrivacyProfileSelectionDesc.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Choose your setup path and security configuration'**
|
||||||
|
String get settingsPrivacyProfileSelectionDesc;
|
||||||
|
|
||||||
|
/// No description provided for @securityProfileTitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Security Profile'**
|
||||||
|
String get securityProfileTitle;
|
||||||
|
|
||||||
|
/// No description provided for @securityProfileSubtitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Choose the level of protection that fits your daily use. This can be changed at any time in your settings.'**
|
||||||
|
String get securityProfileSubtitle;
|
||||||
|
|
||||||
|
/// No description provided for @securityProfileNormalTitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Normal Protection'**
|
||||||
|
String get securityProfileNormalTitle;
|
||||||
|
|
||||||
|
/// No description provided for @securityProfileNormalDesc.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Good balance between a convenient mode without bothering you too much.'**
|
||||||
|
String get securityProfileNormalDesc;
|
||||||
|
|
||||||
|
/// No description provided for @securityProfileStrictTitle.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Strict Protection'**
|
||||||
|
String get securityProfileStrictTitle;
|
||||||
|
|
||||||
|
/// No description provided for @securityProfileStrictDesc.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Maximum anti-phishing protection but may be inconvenient.'**
|
||||||
|
String get securityProfileStrictDesc;
|
||||||
|
|
||||||
/// No description provided for @settingsNotification.
|
/// No description provided for @settingsNotification.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -851,63 +935,21 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @contactVerifyNumberTitle.
|
/// No description provided for @contactVerifyNumberTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Verify contacts'**
|
/// **'Verify contact'**
|
||||||
String get contactVerifyNumberTitle;
|
String get contactVerifyNumberTitle;
|
||||||
|
|
||||||
/// No description provided for @verifyUserIdentity.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Verify {username}\'s identity'**
|
|
||||||
String verifyUserIdentity(Object username);
|
|
||||||
|
|
||||||
/// No description provided for @contactVerifyNumberSubtitle.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Verify the identity of your contacts to make sure you are texting the right person.'**
|
|
||||||
String get contactVerifyNumberSubtitle;
|
|
||||||
|
|
||||||
/// No description provided for @inChatContactNotVerified.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Contact not verified.'**
|
|
||||||
String get inChatContactNotVerified;
|
|
||||||
|
|
||||||
/// No description provided for @groupMembersNotVerified.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'{count} members are not verified.'**
|
|
||||||
String groupMembersNotVerified(Object count);
|
|
||||||
|
|
||||||
/// No description provided for @userVerifiedTitle.
|
/// No description provided for @userVerifiedTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Contact verified'**
|
/// **'User verified'**
|
||||||
String get userVerifiedTitle;
|
String get userVerifiedTitle;
|
||||||
|
|
||||||
/// No description provided for @scanUserQrCode.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Scan {username}\'s QR code'**
|
|
||||||
String scanUserQrCode(Object username);
|
|
||||||
|
|
||||||
/// No description provided for @openOwnQrCode.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Open your own QR code'**
|
|
||||||
String get openOwnQrCode;
|
|
||||||
|
|
||||||
/// No description provided for @contactVerifiedBy.
|
/// No description provided for @contactVerifiedBy.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Verified by {username}'**
|
/// **'Verified by {username}'**
|
||||||
String contactVerifiedBy(Object username);
|
String contactVerifiedBy(Object username);
|
||||||
|
|
||||||
/// No description provided for @contactSharedByUnknown.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Shared by a verified contact (username not available)'**
|
|
||||||
String get contactSharedByUnknown;
|
|
||||||
|
|
||||||
/// No description provided for @verificationTypeQrScanned.
|
/// No description provided for @verificationTypeQrScanned.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -971,13 +1013,13 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @contactBlockBody.
|
/// No description provided for @contactBlockBody.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'A blocked contact will no longer be able to send you messages and their profile will be hidden from view. To unblock a contact, simply navigate to Settings > Privacy > Blocked Contacts.'**
|
/// **'A blocked user will no longer be able to send you messages and their profile will be hidden from view. To unblock a user, simply navigate to Settings > Privacy > Blocked Users.'**
|
||||||
String get contactBlockBody;
|
String get contactBlockBody;
|
||||||
|
|
||||||
/// No description provided for @contactRemove.
|
/// No description provided for @contactRemove.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Remove contact'**
|
/// **'Remove user'**
|
||||||
String get contactRemove;
|
String get contactRemove;
|
||||||
|
|
||||||
/// No description provided for @contactRemoveTitle.
|
/// No description provided for @contactRemoveTitle.
|
||||||
|
|
@ -989,7 +1031,7 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @contactRemoveBody.
|
/// No description provided for @contactRemoveBody.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Permanently remove the contact. If the contact tries to send you a new message, you will have to accept the contact again first.'**
|
/// **'Permanently remove the user. If the user tries to send you a new message, you will have to accept the user again first.'**
|
||||||
String get contactRemoveBody;
|
String get contactRemoveBody;
|
||||||
|
|
||||||
/// No description provided for @undo.
|
/// No description provided for @undo.
|
||||||
|
|
@ -1163,8 +1205,8 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @userFoundBody.
|
/// No description provided for @userFoundBody.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Do you want to connect with {username}?'**
|
/// **'Do you want to create a follow request?'**
|
||||||
String userFoundBody(String username);
|
String get userFoundBody;
|
||||||
|
|
||||||
/// No description provided for @errorInternalError.
|
/// No description provided for @errorInternalError.
|
||||||
///
|
///
|
||||||
|
|
@ -1592,18 +1634,6 @@ abstract class AppLocalizations {
|
||||||
/// **'Change password'**
|
/// **'Change password'**
|
||||||
String get backupChangePassword;
|
String get backupChangePassword;
|
||||||
|
|
||||||
/// No description provided for @backupChangePasswordAuthReason.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Changing backup password'**
|
|
||||||
String get backupChangePasswordAuthReason;
|
|
||||||
|
|
||||||
/// No description provided for @backupChangePasswordAuthFailed.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'You can only change your password after you have authenticated!'**
|
|
||||||
String get backupChangePasswordAuthFailed;
|
|
||||||
|
|
||||||
/// No description provided for @twonlySafeRecoverTitle.
|
/// No description provided for @twonlySafeRecoverTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -1691,7 +1721,7 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @reportUser.
|
/// No description provided for @reportUser.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'Report contact'**
|
/// **'Report user'**
|
||||||
String get reportUser;
|
String get reportUser;
|
||||||
|
|
||||||
/// No description provided for @newDeviceRegistered.
|
/// No description provided for @newDeviceRegistered.
|
||||||
|
|
@ -1928,12 +1958,6 @@ abstract class AppLocalizations {
|
||||||
/// **'Already in Group'**
|
/// **'Already in Group'**
|
||||||
String get alreadyInGroup;
|
String get alreadyInGroup;
|
||||||
|
|
||||||
/// No description provided for @contactNotVerified.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Not verified'**
|
|
||||||
String get contactNotVerified;
|
|
||||||
|
|
||||||
/// No description provided for @removeContactFromGroupTitle.
|
/// No description provided for @removeContactFromGroupTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -2336,6 +2360,18 @@ abstract class AppLocalizations {
|
||||||
/// **'Draft'**
|
/// **'Draft'**
|
||||||
String get draftMessage;
|
String get draftMessage;
|
||||||
|
|
||||||
|
/// No description provided for @exportMemories.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Export memories (Beta)'**
|
||||||
|
String get exportMemories;
|
||||||
|
|
||||||
|
/// No description provided for @importMemories.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Import memories (Beta)'**
|
||||||
|
String get importMemories;
|
||||||
|
|
||||||
/// No description provided for @voiceMessageSlideToCancel.
|
/// No description provided for @voiceMessageSlideToCancel.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -2372,12 +2408,6 @@ abstract class AppLocalizations {
|
||||||
/// **'Let a friend scan this QR code to add you'**
|
/// **'Let a friend scan this QR code to add you'**
|
||||||
String get addContactQrSheetSubtext;
|
String get addContactQrSheetSubtext;
|
||||||
|
|
||||||
/// No description provided for @letUserScanQrCode.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Let {username} scan this QR code'**
|
|
||||||
String letUserScanQrCode(Object username);
|
|
||||||
|
|
||||||
/// No description provided for @finishSetupCardTitle.
|
/// No description provided for @finishSetupCardTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -2585,7 +2615,7 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @verifiedPublicKey.
|
/// No description provided for @verifiedPublicKey.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'The identity of {username} has been successfully verified.'**
|
/// **'The public key of {username} has been verified and is valid.'**
|
||||||
String verifiedPublicKey(Object username);
|
String verifiedPublicKey(Object username);
|
||||||
|
|
||||||
/// No description provided for @memoriesAYearAgo.
|
/// No description provided for @memoriesAYearAgo.
|
||||||
|
|
@ -2735,13 +2765,13 @@ abstract class AppLocalizations {
|
||||||
/// No description provided for @verificationBadgeGeneralDesc.
|
/// No description provided for @verificationBadgeGeneralDesc.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'The badge gives you the peace of mind that you are messaging the *right person* and your *messages remain confidential*.'**
|
/// **'The checkmark gives you the certainty that you are messaging the right person. You can verify contacts at any time by scanning their QR code.'**
|
||||||
String get verificationBadgeGeneralDesc;
|
String get verificationBadgeGeneralDesc;
|
||||||
|
|
||||||
/// No description provided for @verificationBadgeGreenDesc.
|
/// No description provided for @verificationBadgeGreenDesc.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'A contact you have *personally verified* using the QR code.'**
|
/// **'A contact you have *personally* verified.'**
|
||||||
String get verificationBadgeGreenDesc;
|
String get verificationBadgeGreenDesc;
|
||||||
|
|
||||||
/// No description provided for @verificationBadgeYellowDesc.
|
/// No description provided for @verificationBadgeYellowDesc.
|
||||||
|
|
@ -2756,36 +2786,6 @@ abstract class AppLocalizations {
|
||||||
/// **'A contact whose identity has *not* yet been verified.'**
|
/// **'A contact whose identity has *not* yet been verified.'**
|
||||||
String get verificationBadgeRedDesc;
|
String get verificationBadgeRedDesc;
|
||||||
|
|
||||||
/// No description provided for @scanNow.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Scan now'**
|
|
||||||
String get scanNow;
|
|
||||||
|
|
||||||
/// No description provided for @qrScannerVerifyHint.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'To verify, the other person must open their QR code (Chat Lists > QR code button at the bottom right)'**
|
|
||||||
String get qrScannerVerifyHint;
|
|
||||||
|
|
||||||
/// No description provided for @qrScannerVerifyUserHint.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'To verify, {username} must open their QR code (Chat Lists > QR code button at the bottom right)'**
|
|
||||||
String qrScannerVerifyUserHint(Object username);
|
|
||||||
|
|
||||||
/// No description provided for @openQrCode.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Open QR code'**
|
|
||||||
String get openQrCode;
|
|
||||||
|
|
||||||
/// No description provided for @letFriendScanQrToVerify.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Let a friend scan this QR code to verify you'**
|
|
||||||
String get letFriendScanQrToVerify;
|
|
||||||
|
|
||||||
/// No description provided for @deleteVerificationTitle.
|
/// No description provided for @deleteVerificationTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -2804,18 +2804,18 @@ abstract class AppLocalizations {
|
||||||
/// **'{username} has scanned your QR code and is now verified.'**
|
/// **'{username} has scanned your QR code and is now verified.'**
|
||||||
String secretQrTokenVerifiedSnackbar(Object username);
|
String secretQrTokenVerifiedSnackbar(Object username);
|
||||||
|
|
||||||
/// No description provided for @askForFriendPromotionsPrompt.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Help {username} find familiar faces on twonly by sharing mutual friends.'**
|
|
||||||
String askForFriendPromotionsPrompt(Object username);
|
|
||||||
|
|
||||||
/// No description provided for @mutualGroupsTitle.
|
/// No description provided for @mutualGroupsTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'{count, plural, =1{1 mutual group} other{{count} mutual groups}}'**
|
/// **'{count, plural, =1{1 mutual group} other{{count} mutual groups}}'**
|
||||||
String mutualGroupsTitle(num count);
|
String mutualGroupsTitle(num count);
|
||||||
|
|
||||||
|
/// No description provided for @mutualGroupsSentMessages.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'{count, plural, =1{1 message sent} other{{count} messages sent}}'**
|
||||||
|
String mutualGroupsSentMessages(num count);
|
||||||
|
|
||||||
/// No description provided for @chatEntryFlameRestored.
|
/// No description provided for @chatEntryFlameRestored.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -2888,6 +2888,12 @@ abstract class AppLocalizations {
|
||||||
/// **'When the typing indicator is turned off, you can\'t see when others are typing a message.'**
|
/// **'When the typing indicator is turned off, you can\'t see when others are typing a message.'**
|
||||||
String get settingsTypingIndicationSubtitle;
|
String get settingsTypingIndicationSubtitle;
|
||||||
|
|
||||||
|
/// No description provided for @scanQrOrShow.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Scan / Show QR'**
|
||||||
|
String get scanQrOrShow;
|
||||||
|
|
||||||
/// No description provided for @contactActionBlock.
|
/// No description provided for @contactActionBlock.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -2942,6 +2948,12 @@ abstract class AppLocalizations {
|
||||||
/// **'Mutual Friends'**
|
/// **'Mutual Friends'**
|
||||||
String get userDiscoverySettingsTitle;
|
String get userDiscoverySettingsTitle;
|
||||||
|
|
||||||
|
/// No description provided for @userDiscoveryWhyThisIsUsed.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Why this is used'**
|
||||||
|
String get userDiscoveryWhyThisIsUsed;
|
||||||
|
|
||||||
/// No description provided for @userDiscoveryFeatureOffers.
|
/// No description provided for @userDiscoveryFeatureOffers.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -3224,6 +3236,12 @@ abstract class AppLocalizations {
|
||||||
/// **'Back'**
|
/// **'Back'**
|
||||||
String get back;
|
String get back;
|
||||||
|
|
||||||
|
/// No description provided for @onboardingExampleLabel.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Example'**
|
||||||
|
String get onboardingExampleLabel;
|
||||||
|
|
||||||
/// No description provided for @makerChangedUsername.
|
/// No description provided for @makerChangedUsername.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -3392,6 +3410,12 @@ abstract class AppLocalizations {
|
||||||
/// **'Drag to Zoom'**
|
/// **'Drag to Zoom'**
|
||||||
String get dragToZoom;
|
String get dragToZoom;
|
||||||
|
|
||||||
|
/// No description provided for @showUsername.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Show username'**
|
||||||
|
String get showUsername;
|
||||||
|
|
||||||
/// No description provided for @onboardingProfileSelectionTitle.
|
/// No description provided for @onboardingProfileSelectionTitle.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -3618,6 +3642,30 @@ abstract class AppLocalizations {
|
||||||
/// **'There are no images on your device.'**
|
/// **'There are no images on your device.'**
|
||||||
String get importGalleryNoImagesFoundDesc;
|
String get importGalleryNoImagesFoundDesc;
|
||||||
|
|
||||||
|
/// No description provided for @importGalleryShowAllImages.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Show all images'**
|
||||||
|
String get importGalleryShowAllImages;
|
||||||
|
|
||||||
|
/// No description provided for @importGalleryShowTwonlyAlbum.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Show twonly album'**
|
||||||
|
String get importGalleryShowTwonlyAlbum;
|
||||||
|
|
||||||
|
/// No description provided for @importGalleryToggleDescAll.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Viewing all images on your device.'**
|
||||||
|
String get importGalleryToggleDescAll;
|
||||||
|
|
||||||
|
/// No description provided for @importGalleryToggleDescTwonly.
|
||||||
|
///
|
||||||
|
/// In en, this message translates to:
|
||||||
|
/// **'Viewing the \"twonly\" album.'**
|
||||||
|
String get importGalleryToggleDescTwonly;
|
||||||
|
|
||||||
/// No description provided for @importGalleryFilterTwonly.
|
/// No description provided for @importGalleryFilterTwonly.
|
||||||
///
|
///
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
|
|
@ -3641,498 +3689,6 @@ abstract class AppLocalizations {
|
||||||
/// In en, this message translates to:
|
/// In en, this message translates to:
|
||||||
/// **'{count, plural, =1{Import 1 item} other{Import {count} items}}'**
|
/// **'{count, plural, =1{Import 1 item} other{Import {count} items}}'**
|
||||||
String importGalleryImportCount(num count);
|
String importGalleryImportCount(num count);
|
||||||
|
|
||||||
/// No description provided for @emptyChatListTitle.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Find your first friend'**
|
|
||||||
String get emptyChatListTitle;
|
|
||||||
|
|
||||||
/// No description provided for @emptyChatListDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Let friends scan your QR code, or share them your profile.'**
|
|
||||||
String get emptyChatListDesc;
|
|
||||||
|
|
||||||
/// No description provided for @emptyChatListShareBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Share your profile'**
|
|
||||||
String get emptyChatListShareBtn;
|
|
||||||
|
|
||||||
/// No description provided for @emptyChatListScanBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'QR Code'**
|
|
||||||
String get emptyChatListScanBtn;
|
|
||||||
|
|
||||||
/// No description provided for @emptyChatListAddUsernameBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'By Username'**
|
|
||||||
String get emptyChatListAddUsernameBtn;
|
|
||||||
|
|
||||||
/// No description provided for @avatarCustomizeRandomize.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Randomize'**
|
|
||||||
String get avatarCustomizeRandomize;
|
|
||||||
|
|
||||||
/// No description provided for @avatarCustomizeReset.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Reset'**
|
|
||||||
String get avatarCustomizeReset;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecovery.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Passwordless Recovery'**
|
|
||||||
String get passwordlessRecovery;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNotConfigured.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Not configured'**
|
|
||||||
String get passwordlessRecoveryNotConfigured;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryTestPin.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Test PIN'**
|
|
||||||
String get passwordlessRecoveryTestPin;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryTestPinTitle.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Test PIN'**
|
|
||||||
String get passwordlessRecoveryTestPinTitle;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryTestPinHint.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Enter your PIN'**
|
|
||||||
String get passwordlessRecoveryTestPinHint;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryTestPinCorrect.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'PIN is correct!'**
|
|
||||||
String get passwordlessRecoveryTestPinCorrect;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryTestPinIncorrect.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Incorrect PIN.'**
|
|
||||||
String get passwordlessRecoveryTestPinIncorrect;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryTest.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Test'**
|
|
||||||
String get passwordlessRecoveryTest;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySecondFactorNone.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'None'**
|
|
||||||
String get passwordlessRecoverySecondFactorNone;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySecondFactorEmailLabel.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Email ({email})'**
|
|
||||||
String passwordlessRecoverySecondFactorEmailLabel(Object email);
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySecondFactorPin.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'PIN'**
|
|
||||||
String get passwordlessRecoverySecondFactorPin;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySecondFactorEmail.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Email'**
|
|
||||||
String get passwordlessRecoverySecondFactorEmail;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryModify.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Modify Recovery Settings'**
|
|
||||||
String get passwordlessRecoveryModify;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryModifyDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Update your recovery configuration'**
|
|
||||||
String get passwordlessRecoveryModifyDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySecondFactor.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Second Factor'**
|
|
||||||
String get passwordlessRecoverySecondFactor;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNoFriendsFound.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'No trusted friends found.'**
|
|
||||||
String get passwordlessRecoveryNoFriendsFound;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryActiveFriends.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Active Friends'**
|
|
||||||
String get passwordlessRecoveryActiveFriends;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryActiveFriendsDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'These trusted friends are actively using twonly and can probably help you recover your account.'**
|
|
||||||
String get passwordlessRecoveryActiveFriendsDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInactiveFriends.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Inactive Friends'**
|
|
||||||
String get passwordlessRecoveryInactiveFriends;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInactiveFriendsDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'These friends either have not yet received their share or do not use twonly actively anymore, which could mean that they maybe cannot help.'**
|
|
||||||
String get passwordlessRecoveryInactiveFriendsDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNotEnoughFriends.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Not enough friends selected. You need at least 3.'**
|
|
||||||
String get passwordlessRecoveryNotEnoughFriends;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryLoading.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Loading...'**
|
|
||||||
String get passwordlessRecoveryLoading;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryEnableSuccess.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Passwordless recovery successfully enabled!'**
|
|
||||||
String get passwordlessRecoveryEnableSuccess;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryEnableFailed.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Failed to enable passwordless recovery.'**
|
|
||||||
String get passwordlessRecoveryEnableFailed;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNeedAtLeast3.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'You need at least 3 trusted friends.'**
|
|
||||||
String get passwordlessRecoveryNeedAtLeast3;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInvalidPin.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Invalid PIN'**
|
|
||||||
String get passwordlessRecoveryInvalidPin;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryEnterPin.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Please enter a PIN.'**
|
|
||||||
String get passwordlessRecoveryEnterPin;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryPinMinLength.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'PIN must be at least 4 digits.'**
|
|
||||||
String get passwordlessRecoveryPinMinLength;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryEnterEmail.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Please enter an email address.'**
|
|
||||||
String get passwordlessRecoveryEnterEmail;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryEnableBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Enable Passwordless Recovery'**
|
|
||||||
String get passwordlessRecoveryEnableBtn;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryRecoverBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Recover passwordless'**
|
|
||||||
String get passwordlessRecoveryRecoverBtn;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryModifyBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Modify Passwordless Recovery'**
|
|
||||||
String get passwordlessRecoveryModifyBtn;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryStatusEnabled.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Enabled • {count} trusted friends'**
|
|
||||||
String passwordlessRecoveryStatusEnabled(num count);
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInfoHowItWorks.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'How it works'**
|
|
||||||
String get passwordlessRecoveryInfoHowItWorks;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInfoHowItWorksDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Because twonly operates without central user accounts or phone numbers to maximize privacy, we rely on a decentralized recovery mechanism. Using Shamir\'s Secret Sharing, your cryptographic identity is split into independent shares and distributed among your trusted friends. To restore access, a predefined threshold of these friends must combine their shares.'**
|
|
||||||
String get passwordlessRecoveryInfoHowItWorksDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInfoWhySecondFactor.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Why a Second Factor?'**
|
|
||||||
String get passwordlessRecoveryInfoWhySecondFactor;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInfoWhySecondFactorDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'The second factor (Email or PIN) serves as a vital cryptographic safeguard against malicious collusion. If your trusted friends were to coordinate their shares behind your back, they still wouldn\'t be able to decrypt your identity without the second factor key.'**
|
|
||||||
String get passwordlessRecoveryInfoWhySecondFactorDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInfoGotIt.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Got it'**
|
|
||||||
String get passwordlessRecoveryInfoGotIt;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryMethod.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Second factor method'**
|
|
||||||
String get passwordlessRecoveryMethod;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryMethodNoneDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Without second-factor, your friends could collaborate to recover your account. Therefore, it is recommended to configure a second-factor.'**
|
|
||||||
String get passwordlessRecoveryMethodNoneDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryMethodPinHint.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Enter PIN'**
|
|
||||||
String get passwordlessRecoveryMethodPinHint;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryMethodEmailHint.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Enter recovery email address'**
|
|
||||||
String get passwordlessRecoveryMethodEmailHint;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryMethodEmailDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Your email address is *never stored on the server* and is only sent to it in the event of a recovery.'**
|
|
||||||
String get passwordlessRecoveryMethodEmailDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryThresholdDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'To recover your account you need {count} of your selected trusted friends.'**
|
|
||||||
String passwordlessRecoveryThresholdDesc(num count);
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryThresholdTitle.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Required trusted friends for recovery'**
|
|
||||||
String get passwordlessRecoveryThresholdTitle;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySelectFriendsNeeded.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Select friends ({count} more needed)'**
|
|
||||||
String passwordlessRecoverySelectFriendsNeeded(num count);
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySelectFriends.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Select trusted friends'**
|
|
||||||
String get passwordlessRecoverySelectFriends;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNoFriendsSelected.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'No trusted friends selected yet'**
|
|
||||||
String get passwordlessRecoveryNoFriendsSelected;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySubtitle.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Recover your identity without a password.'**
|
|
||||||
String get passwordlessRecoverySubtitle;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessExplanation.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'If enabled, you can recover your account by asking your selected friends to help you.'**
|
|
||||||
String get recoverPasswordlessExplanation;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessNotificationCardTitle.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Enable notifications'**
|
|
||||||
String get recoverPasswordlessNotificationCardTitle;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessNotificationCardSubtitle.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Get notified when a friend has helped you recover your account.'**
|
|
||||||
String get recoverPasswordlessNotificationCardSubtitle;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessNotificationCardBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Enable push notifications'**
|
|
||||||
String get recoverPasswordlessNotificationCardBtn;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessQrInstructions.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Let friends scan the QR code or share the link.'**
|
|
||||||
String get recoverPasswordlessQrInstructions;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessShareBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Share Recovery Link'**
|
|
||||||
String get recoverPasswordlessShareBtn;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessCopyBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Copy'**
|
|
||||||
String get recoverPasswordlessCopyBtn;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessCopiedSnackbar.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Link copied to clipboard!'**
|
|
||||||
String get recoverPasswordlessCopiedSnackbar;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNoShareStored.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'No recovery share stored for this contact.'**
|
|
||||||
String get passwordlessRecoveryNoShareStored;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryShareSent.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Recovery share successfully sent!'**
|
|
||||||
String get passwordlessRecoveryShareSent;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNetworkError.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Network error, please ensure you have internet'**
|
|
||||||
String get passwordlessRecoveryNetworkError;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryInvalidEmail.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'The email address is invalid.'**
|
|
||||||
String get passwordlessRecoveryInvalidEmail;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryResendEmail.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Resend recovery email'**
|
|
||||||
String get passwordlessRecoveryResendEmail;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryHelpAFriend.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Help a Friend'**
|
|
||||||
String get passwordlessRecoveryHelpAFriend;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySelectContactDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Please select the contact who requested recovery below to send them their recovery key.'**
|
|
||||||
String get passwordlessRecoverySelectContactDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoverySearchContacts.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Search contacts...'**
|
|
||||||
String get passwordlessRecoverySearchContacts;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNoContactsFound.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'No contacts found'**
|
|
||||||
String get passwordlessRecoveryNoContactsFound;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryCantHelpHim.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'You can\'t help him'**
|
|
||||||
String get passwordlessRecoveryCantHelpHim;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryDoesAskedYou.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Does {username} has asked you?'**
|
|
||||||
String passwordlessRecoveryDoesAskedYou(Object username);
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryVerifySourceDesc.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Please ensure that you actualy received the link/qr code from your friend! If you are unsure, please verify again and then click again on the link or come back.'**
|
|
||||||
String get passwordlessRecoveryVerifySourceDesc;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryNo.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'No'**
|
|
||||||
String get passwordlessRecoveryNo;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryYes.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Yes'**
|
|
||||||
String get passwordlessRecoveryYes;
|
|
||||||
|
|
||||||
/// No description provided for @passwordlessRecoveryYesWithTimer.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Yes ({seconds}s)'**
|
|
||||||
String passwordlessRecoveryYesWithTimer(Object seconds);
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessBeingRecoveredLabel.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Account being recovered'**
|
|
||||||
String get recoverPasswordlessBeingRecoveredLabel;
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessSharesReceived.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'{received} of {threshold} friends have shared'**
|
|
||||||
String recoverPasswordlessSharesReceived(Object received, Object threshold);
|
|
||||||
|
|
||||||
/// No description provided for @recoverPasswordlessRecoverNowBtn.
|
|
||||||
///
|
|
||||||
/// In en, this message translates to:
|
|
||||||
/// **'Recover now'**
|
|
||||||
String get recoverPasswordlessRecoverNowBtn;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class _AppLocalizationsDelegate
|
class _AppLocalizationsDelegate
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,8 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
AppLocalizationsDe([String locale = 'de']) : super(locale);
|
AppLocalizationsDe([String locale = 'de']) : super(locale);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get registerSlogan => 'Privat in Kontakt bleiben.';
|
String get registerSlogan =>
|
||||||
|
'Privat und sicher mit Freunden in Kontakt bleiben.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingWelcomeTitle => 'Willkommen bei twonly!';
|
String get onboardingWelcomeTitle => 'Willkommen bei twonly!';
|
||||||
|
|
@ -33,15 +34,25 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get onboardingFocusBody =>
|
String get onboardingFocusBody =>
|
||||||
'Verabschiede dich von süchtig machenden Funktionen! twonly wurde für das Teilen von Momenten ohne nutzlose Ablenkungen oder Werbung entwickelt.';
|
'Verabschiede dich von süchtig machenden Funktionen! twonly wurde für das Teilen von Momenten ohne nutzlose Ablenkungen oder Werbung entwickelt.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onboardingSendTwonliesTitle => 'twonlies senden';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onboardingSendTwonliesBody =>
|
||||||
|
'Teile Momente sicher mit deinem Partner. twonly stellt sicher, dass nur dein Partner sie öffnen kann, sodass deine Momente mit deinem Partner eine two(o)nly Sache bleiben!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingNotProductTitle => 'Du bist nicht das Produkt!';
|
String get onboardingNotProductTitle => 'Du bist nicht das Produkt!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingNotProductBody =>
|
String get onboardingNotProductBody =>
|
||||||
'twonly wird durch ein optionales Abonnement finanziert. Deine Daten werden niemals verkauft.';
|
'twonly wird durch Spenden und ein optionales Abonnement finanziert. Deine Daten werden niemals verkauft.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get registerUsernameSlogan => 'Konto erstellen';
|
String get onboardingGetStartedTitle => 'Auf geht\'s';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get registerUsernameSlogan => 'Dein öffentlicher Benutzername';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get registerUsernameDecoration => 'Benutzername';
|
String get registerUsernameDecoration => 'Benutzername';
|
||||||
|
|
@ -116,9 +127,18 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get searchUsernameNotFound => 'Benutzername nicht gefunden';
|
String get searchUsernameNotFound => 'Benutzername nicht gefunden';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String searchUsernameNotFoundBody(Object username) {
|
||||||
|
return 'Es wurde kein Benutzer mit dem Benutzernamen \"$username\" gefunden.';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get searchUsernameNewFollowerTitle => 'Offene Anfragen';
|
String get searchUsernameNewFollowerTitle => 'Offene Anfragen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chatListViewSearchUserNameBtn =>
|
||||||
|
'Füge deinen ersten twonly-Kontakt hinzu!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chatListDetailInput => 'Nachricht eingeben';
|
String get chatListDetailInput => 'Nachricht eingeben';
|
||||||
|
|
||||||
|
|
@ -210,6 +230,10 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get settingsStorageDataStoreInGTitle => 'In der Galerie speichern';
|
String get settingsStorageDataStoreInGTitle => 'In der Galerie speichern';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsStorageDataStoreInGSubtitle =>
|
||||||
|
'Speichere Bilder zusätzlich in der Systemgalerie.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsStorageDataMediaAutoDownload =>
|
String get settingsStorageDataMediaAutoDownload =>
|
||||||
'Automatischer Mediendownload';
|
'Automatischer Mediendownload';
|
||||||
|
|
@ -257,17 +281,45 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get settingsPrivacy => 'Datenschutz & Sicherheit';
|
String get settingsPrivacy => 'Datenschutz & Sicherheit';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsPrivacyBlockUsers => 'Kontakte blockieren';
|
String get settingsPrivacyBlockUsers => 'Benutzer blockieren';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsPrivacyBlockUsersDesc =>
|
String get settingsPrivacyBlockUsersDesc =>
|
||||||
'Blockierte Kontakte können nicht mit dir kommunizieren. Du kannst einen blockierten Kontakt jederzeit wieder entsperren.';
|
'Blockierte Benutzer können nicht mit dir kommunizieren. Du kannst einen blockierten Benutzer jederzeit wieder entsperren.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String settingsPrivacyBlockUsersCount(Object len) {
|
String settingsPrivacyBlockUsersCount(Object len) {
|
||||||
return '$len Kontakt(e)';
|
return '$len Kontakt(e)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsPrivacyProfileSelectionTitle => 'Sicherheitsprofil';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsPrivacyProfileSelectionDesc =>
|
||||||
|
'Wähle deinen Setup-Pfad und deine Sicherheitskonfiguration';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileTitle => 'Sicherheitsprofil';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileSubtitle =>
|
||||||
|
'Wähle das Schutzniveau, das zu deiner täglichen Nutzung passt. Dies kann jederzeit in den Einstellungen geändert werden.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileNormalTitle => 'Normaler Schutz';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileNormalDesc =>
|
||||||
|
'Gute Balance zwischen Komfort und Sicherheit, ohne dich zu sehr einzuschränken.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileStrictTitle => 'Strikter Schutz';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileStrictDesc =>
|
||||||
|
'Maximaler Schutz vor Phishing, kann aber unkomfortabel sein.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsNotification => 'Benachrichtigung';
|
String get settingsNotification => 'Benachrichtigung';
|
||||||
|
|
||||||
|
|
@ -380,7 +432,7 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactUsLastWarning =>
|
String get contactUsLastWarning =>
|
||||||
'Dies sind die Informationen, die an uns gesendet werden. Bitte prüfe sie und klicke dann auf „Abschicken“.';
|
'Dies sind die Informationen, die an uns gesendet werden. Bitte prüfen Sie sie und klicke dann auf „Abschicken“.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactUsSuccess => 'Feedback erfolgreich übermittelt!';
|
String get contactUsSuccess => 'Feedback erfolgreich übermittelt!';
|
||||||
|
|
@ -409,45 +461,16 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
'Dein Konto wird gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.';
|
'Dein Konto wird gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactVerifyNumberTitle => 'Kontakte verifizieren';
|
String get contactVerifyNumberTitle => 'Benutzer verifizieren';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String verifyUserIdentity(Object username) {
|
String get userVerifiedTitle => 'Benutzer verifiziert';
|
||||||
return 'Identität von $username verifizieren';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contactVerifyNumberSubtitle =>
|
|
||||||
'Überprüfe die Identität deiner Kontakte, um sicherzugehen, dass du mit der richtigen Person schreibst.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get inChatContactNotVerified => 'Kontakt nicht verifiziert.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String groupMembersNotVerified(Object count) {
|
|
||||||
return '$count Mitglieder sind nicht verifiziert.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get userVerifiedTitle => 'Kontakt verifiziert';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String scanUserQrCode(Object username) {
|
|
||||||
return 'QR-Code von $username scannen';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get openOwnQrCode => 'Eigenen QR-Code öffnen';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String contactVerifiedBy(Object username) {
|
String contactVerifiedBy(Object username) {
|
||||||
return 'Verifiziert von $username';
|
return 'Verifiziert von $username';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get contactSharedByUnknown =>
|
|
||||||
'Geteilt von einem verifizierten Kontakt (Benutzername nicht verfügbar)';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationTypeQrScanned => 'Du hast den QR-Code gescannt.';
|
String get verificationTypeQrScanned => 'Du hast den QR-Code gescannt.';
|
||||||
|
|
||||||
|
|
@ -486,10 +509,10 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactBlockBody =>
|
String get contactBlockBody =>
|
||||||
'Ein blockierter Kontakt kann dir keine Nachrichten mehr senden, und deren Profil ist nicht mehr sichtbar. Um die Blockierung eines Kontakts aufzuheben, navigiere einfach zu Einstellungen > Datenschutz > Blockierte Kontakte.';
|
'Ein blockierter Benutzer kann dir keine Nachrichten mehr senden, und deren Profil ist nicht mehr sichtbar. Um die Blockierung eines Benutzers aufzuheben, navigiere einfach zu Einstellungen > Datenschutz > Blockierte Benutzer.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactRemove => 'Kontakt löschen';
|
String get contactRemove => 'Benutzer löschen';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String contactRemoveTitle(Object username) {
|
String contactRemoveTitle(Object username) {
|
||||||
|
|
@ -498,7 +521,7 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactRemoveBody =>
|
String get contactRemoveBody =>
|
||||||
'Den Kontakt dauerhaft entfernen. Wenn der Kontakt versucht, dir eine neue Nachricht zu senden, musst du den Kontakt erst wieder akzeptieren.';
|
'Den Benutzer dauerhaft entfernen. Wenn der Benutzer versucht, dir eine neue Nachricht zu senden, musst du den Benutzer erst wieder akzeptieren.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get undo => 'Rückgängig';
|
String get undo => 'Rückgängig';
|
||||||
|
|
@ -588,9 +611,7 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String userFoundBody(String username) {
|
String get userFoundBody => 'Möchtest du eine Folgeanfrage stellen?';
|
||||||
return 'Möchtest du dich mit $username vernetzen?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get errorInternalError =>
|
String get errorInternalError =>
|
||||||
|
|
@ -838,14 +859,7 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get backupTwonlySaveNow => 'Jetzt speichern';
|
String get backupTwonlySaveNow => 'Jetzt speichern';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get backupChangePassword => 'Passwort ändern';
|
String get backupChangePassword => 'Password ändern';
|
||||||
|
|
||||||
@override
|
|
||||||
String get backupChangePasswordAuthReason => 'Backup-Passwort ändern';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get backupChangePasswordAuthFailed =>
|
|
||||||
'Du kannst dein Passwort nur ändern, wenn du dich authentifiziert hast!';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get twonlySafeRecoverTitle => 'Backup wiederherstellen';
|
String get twonlySafeRecoverTitle => 'Backup wiederherstellen';
|
||||||
|
|
@ -895,7 +909,7 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get reportUserReason => 'Meldegrund';
|
String get reportUserReason => 'Meldegrund';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get reportUser => 'Kontakt melden';
|
String get reportUser => 'Benutzer melden';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get newDeviceRegistered =>
|
String get newDeviceRegistered =>
|
||||||
|
|
@ -1030,9 +1044,6 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get alreadyInGroup => 'Bereits Mitglied';
|
String get alreadyInGroup => 'Bereits Mitglied';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contactNotVerified => 'Nicht verifiziert';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String removeContactFromGroupTitle(Object username) {
|
String removeContactFromGroupTitle(Object username) {
|
||||||
return '$username aus dieser Gruppe entfernen?';
|
return '$username aus dieser Gruppe entfernen?';
|
||||||
|
|
@ -1295,6 +1306,12 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get draftMessage => 'Entwurf';
|
String get draftMessage => 'Entwurf';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exportMemories => 'Memories exportieren (Beta)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importMemories => 'Memories importieren (Beta)';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get voiceMessageSlideToCancel => 'Zum Abbrechen ziehen';
|
String get voiceMessageSlideToCancel => 'Zum Abbrechen ziehen';
|
||||||
|
|
||||||
|
|
@ -1314,11 +1331,6 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get addContactQrSheetSubtext =>
|
String get addContactQrSheetSubtext =>
|
||||||
'Lass einen Freund diesen QR-Code scannen, um dich hinzuzufügen';
|
'Lass einen Freund diesen QR-Code scannen, um dich hinzuzufügen';
|
||||||
|
|
||||||
@override
|
|
||||||
String letUserScanQrCode(Object username) {
|
|
||||||
return 'Lass $username diesen QR-Code scannen';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get finishSetupCardTitle => 'Profil vervollständigen';
|
String get finishSetupCardTitle => 'Profil vervollständigen';
|
||||||
|
|
||||||
|
|
@ -1445,7 +1457,7 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String verifiedPublicKey(Object username) {
|
String verifiedPublicKey(Object username) {
|
||||||
return 'Die Identität von $username wurde erfolgreich überprüft.';
|
return 'Der öffentliche Schlüssel von $username wurde überprüft und ist gültig.';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -1544,11 +1556,11 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationBadgeGeneralDesc =>
|
String get verificationBadgeGeneralDesc =>
|
||||||
'Der Haken gibt dir die Sicherheit, dass du mit der *richtigen Person* schreibst und deine *Nachrichten vertraulich* bleiben.';
|
'Der Haken gibt dir die Sicherheit, dass du mit der richtigen Person schreibst. Du kannst Kontakte jederzeit verifizieren, indem du deren QR-Code scannst.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationBadgeGreenDesc =>
|
String get verificationBadgeGreenDesc =>
|
||||||
'Ein Kontakt, den du über den QR-code *persönlich verifiziert* hast.';
|
'Ein Kontakt, den du *persönlich verifiziert* hast.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationBadgeYellowDesc =>
|
String get verificationBadgeYellowDesc =>
|
||||||
|
|
@ -1558,25 +1570,6 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get verificationBadgeRedDesc =>
|
String get verificationBadgeRedDesc =>
|
||||||
'Ein Kontakt, dessen Identität noch *nicht überprüft* wurde.';
|
'Ein Kontakt, dessen Identität noch *nicht überprüft* wurde.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanNow => 'Jetzt scannen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get qrScannerVerifyHint =>
|
|
||||||
'Zum Verifizieren muss die andere Person ihren QR-Code öffnen (Chat-Liste > QR-Code-Button unten rechts)';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String qrScannerVerifyUserHint(Object username) {
|
|
||||||
return 'Zum Verifizieren muss $username seinen QR-Code öffnen (Chat-Liste > QR-Code-Button unten rechts)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get openQrCode => 'QR-Code öffnen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get letFriendScanQrToVerify =>
|
|
||||||
'Lass einen Freund diesen QR-Code scannen, um euch zu verifizieren';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get deleteVerificationTitle => 'Verifizierung löschen?';
|
String get deleteVerificationTitle => 'Verifizierung löschen?';
|
||||||
|
|
||||||
|
|
@ -1589,11 +1582,6 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
return '$username hat deinen QR-Code gescannt und ist nun verifiziert.';
|
return '$username hat deinen QR-Code gescannt und ist nun verifiziert.';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String askForFriendPromotionsPrompt(Object username) {
|
|
||||||
return 'Hilf $username, bekannte Gesichter auf twonly zu finden, indem du gemeinsame Freunde teilst.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mutualGroupsTitle(num count) {
|
String mutualGroupsTitle(num count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
|
@ -1605,6 +1593,17 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
return '$_temp0';
|
return '$_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String mutualGroupsSentMessages(num count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: '$count Nachrichten gesendet',
|
||||||
|
one: '1 Nachricht gesendet',
|
||||||
|
);
|
||||||
|
return '$_temp0';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chatEntryFlameRestored(Object count) {
|
String chatEntryFlameRestored(Object count) {
|
||||||
return '$count Flammen wiederhergestellt';
|
return '$count Flammen wiederhergestellt';
|
||||||
|
|
@ -1650,6 +1649,9 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get settingsTypingIndicationSubtitle =>
|
String get settingsTypingIndicationSubtitle =>
|
||||||
'Bei deaktivierten Tipp-Indikatoren kannst du nicht sehen, wenn andere gerade eine Nachricht tippen.';
|
'Bei deaktivierten Tipp-Indikatoren kannst du nicht sehen, wenn andere gerade eine Nachricht tippen.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get scanQrOrShow => 'QR scannen / anzeigen';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactActionBlock => 'Blockieren';
|
String get contactActionBlock => 'Blockieren';
|
||||||
|
|
||||||
|
|
@ -1681,6 +1683,9 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get userDiscoverySettingsTitle => 'Gemeinsame Freunde';
|
String get userDiscoverySettingsTitle => 'Gemeinsame Freunde';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get userDiscoveryWhyThisIsUsed => 'Warum dies verwendet wird';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get userDiscoveryFeatureOffers => 'Dein Nutzen auf einen Blick';
|
String get userDiscoveryFeatureOffers => 'Dein Nutzen auf einen Blick';
|
||||||
|
|
||||||
|
|
@ -1848,6 +1853,9 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get back => 'Zurück';
|
String get back => 'Zurück';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onboardingExampleLabel => 'Beispiel';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String makerChangedUsername(Object maker, Object oldName, Object newName) {
|
String makerChangedUsername(Object maker, Object oldName, Object newName) {
|
||||||
return '$maker hat den Benutzernamen von $oldName zu $newName geändert.';
|
return '$maker hat den Benutzernamen von $oldName zu $newName geändert.';
|
||||||
|
|
@ -1948,6 +1956,9 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get dragToZoom => 'Zum Zoomen ziehen';
|
String get dragToZoom => 'Zum Zoomen ziehen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get showUsername => 'Benutzernamen anzeigen';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingProfileSelectionTitle => 'Wähle deinen Setup-Weg';
|
String get onboardingProfileSelectionTitle => 'Wähle deinen Setup-Weg';
|
||||||
|
|
||||||
|
|
@ -2082,6 +2093,20 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
String get importGalleryNoImagesFoundDesc =>
|
String get importGalleryNoImagesFoundDesc =>
|
||||||
'Es befinden sich keine Bilder auf deinem Gerät.';
|
'Es befinden sich keine Bilder auf deinem Gerät.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryShowAllImages => 'Alle Bilder anzeigen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryShowTwonlyAlbum => 'twonly-Album anzeigen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryToggleDescAll =>
|
||||||
|
'Es werden alle Bilder auf deinem Gerät angezeigt.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryToggleDescTwonly =>
|
||||||
|
'Es wird das \"twonly\"-Album angezeigt.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get importGalleryFilterTwonly => 'Nur das twonly-Album anzeigen';
|
String get importGalleryFilterTwonly => 'Nur das twonly-Album anzeigen';
|
||||||
|
|
||||||
|
|
@ -2102,296 +2127,4 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||||
);
|
);
|
||||||
return '$_temp0';
|
return '$_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListTitle => 'Finde deinen ersten Freund';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListDesc =>
|
|
||||||
'Lass Freunde deinen QR-Code scannen oder teile dein Profil mit ihnen.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListShareBtn => 'Profil teilen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListScanBtn => 'QR-Code';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListAddUsernameBtn => 'Per Benutzername';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get avatarCustomizeRandomize => 'Zufällig';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get avatarCustomizeReset => 'Zurücksetzen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecovery => 'Passwortloses Backup';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNotConfigured => 'Nicht konfiguriert';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPin => 'PIN testen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinTitle => 'PIN testen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinHint => 'Gib deine PIN ein';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinCorrect => 'PIN ist korrekt!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinIncorrect => 'Falsche PIN.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTest => 'Testen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactorNone => 'Keiner';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoverySecondFactorEmailLabel(Object email) {
|
|
||||||
return 'E-Mail ($email)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactorPin => 'PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactorEmail => 'E-Mail';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryModify => 'Einstellungen bearbeiten';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryModifyDesc =>
|
|
||||||
'Aktualisiere deine Backupkonfiguration';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactor => 'Zweiter Faktor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoFriendsFound => 'Keine Freunde gefunden.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryActiveFriends => 'Aktive Freunde';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryActiveFriendsDesc =>
|
|
||||||
'Diese Freunde nutzen twonly aktiv und können dir wahrscheinlich helfen, dein Konto wiederherzustellen.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInactiveFriends => 'Inaktive Freunde';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInactiveFriendsDesc =>
|
|
||||||
'Diese Freunde haben entweder ihren Teil noch nicht erhalten oder nutzen twonly nicht mehr aktiv, was bedeutet, dass sie möglicherweise nicht helfen können.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNotEnoughFriends =>
|
|
||||||
'Nicht genügend Freunde ausgewählt. Du brauchst mindestens 3.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryLoading => 'Wird geladen...';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnableSuccess =>
|
|
||||||
'Passwortloses Backup erfolgreich aktiviert!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnableFailed =>
|
|
||||||
'Fehler beim Aktivieren des passwortlosen Backups.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNeedAtLeast3 =>
|
|
||||||
'Du brauchst mindestens 3 Freunde.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInvalidPin => 'Ungültige PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnterPin => 'Bitte gib eine PIN ein.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryPinMinLength =>
|
|
||||||
'Die PIN muss mindestens 4 Ziffern lang sein.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnterEmail =>
|
|
||||||
'Bitte gib eine E-Mail-Adresse ein.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnableBtn => 'Passwortloses Backup aktivieren';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryRecoverBtn => 'Passwortlos wiederherstellen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryModifyBtn => 'Passwortloses Backup bearbeiten';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryStatusEnabled(num count) {
|
|
||||||
return 'Aktiviert • $count Freunde';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoHowItWorks => 'Wie es funktioniert';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoHowItWorksDesc =>
|
|
||||||
'Da twonly ohne zentrale Benutzerkonten oder Telefonnummern funktioniert, um deine Privatsphäre zu maximieren, setzen wir auf einen dezentralen Wiederherstellungsmechanismus. Mit Shamir\'s Secret Sharing wird deine kryptografische Identität in unabhängige Teile aufgeteilt und an deine Freunde verteilt. Um den Zugriff wiederherzustellen, muss ein vorher festgelegter Schwellenwert dieser Freunde ihre Teile kombinieren.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoWhySecondFactor =>
|
|
||||||
'Warum ein zweiter Faktor?';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoWhySecondFactorDesc =>
|
|
||||||
'Der zweite Faktor (E-Mail oder PIN) dient als wichtiger kryptografischer Schutz vor bösartiger Absprache. Wenn sich deine Freunde hinter deinem Rücken absprechen würden, könnten sie deine Identität ohne den Schlüssel für den zweiten Faktor trotzdem nicht entschlüsseln.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoGotIt => 'Verstanden';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethod => 'Methode für den zweiten Faktor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodNoneDesc =>
|
|
||||||
'Ohne zweiten Faktor könnten sich deine Freunde absprechen, um dein Konto wiederherzustellen. Daher wird empfohlen, einen zweiten Faktor zu konfigurieren.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodPinHint => 'PIN eingeben';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodEmailHint =>
|
|
||||||
'Wiederherstellungs-E-Mail-Adresse eingeben';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodEmailDesc =>
|
|
||||||
'Deine E-Mail-Adresse wird *niemals auf dem Server gespeichert* und nur im Falle einer Wiederherstellung an ihn gesendet.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryThresholdDesc(num count) {
|
|
||||||
return 'Um dein Konto wiederherzustellen, brauchst du $count deiner ausgewählten Freunde.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryThresholdTitle =>
|
|
||||||
'Benötigte Freunde für das Backup';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoverySelectFriendsNeeded(num count) {
|
|
||||||
return 'Freunde auswählen ($count weitere benötigt)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySelectFriends => 'Freunde auswählen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoFriendsSelected =>
|
|
||||||
'Noch keine Freunde ausgewählt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySubtitle =>
|
|
||||||
'Stelle deine Identität ohne Passwort wieder her.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessExplanation =>
|
|
||||||
'Wenn du die passwortlose Wiederherstellung aktiviert hast, kannst du dein Konto mithilfe deiner Freunde wiederherstellen.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessNotificationCardTitle =>
|
|
||||||
'Benachrichtigungen aktivieren';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessNotificationCardSubtitle =>
|
|
||||||
'Lass dich benachrichtigen, wenn ein Freund dir geholfen hat, dein Konto wiederherzustellen.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessNotificationCardBtn =>
|
|
||||||
'Push-Benachrichtigungen aktivieren';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessQrInstructions =>
|
|
||||||
'Lass deine Freunde den QR-Code scannen oder teile den Link.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessShareBtn => 'Wiederherstellungs-Link teilen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessCopyBtn => 'Kopieren';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessCopiedSnackbar =>
|
|
||||||
'Link in die Zwischenablage kopiert!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoShareStored =>
|
|
||||||
'Kein Wiederherstellungs-Teil für diesen Kontakt gespeichert.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryShareSent =>
|
|
||||||
'Wiederherstellungs-Teil erfolgreich gesendet!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNetworkError =>
|
|
||||||
'Netzwerkfehler, bitte stelle sicher, dass du Internet hast';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInvalidEmail =>
|
|
||||||
'Die E-Mail-Adresse ist ungültig.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryResendEmail => 'E-Mail erneut senden';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryHelpAFriend => 'Einem Freund helfen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySelectContactDesc =>
|
|
||||||
'Wähle den Kontakt aus, dem du helfen möchtest.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySearchContacts => 'Kontakte suchen...';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoContactsFound => 'Keine Kontakte gefunden';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryCantHelpHim => 'Du kannst ihm nicht helfen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryDoesAskedYou(Object username) {
|
|
||||||
return 'Hat $username dich gefragt?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryVerifySourceDesc =>
|
|
||||||
'Bitte stelle sicher, dass du den Link/QR-Code tatsächlich von deinem Freund erhalten hast! Wenn du dir unsicher bist, verifiziere dies bitte erneut und klicke dann noch einmal auf den Link oder kehre zurück.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNo => 'Nein';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryYes => 'Ja';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryYesWithTimer(Object seconds) {
|
|
||||||
return 'Ja (${seconds}s)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessBeingRecoveredLabel =>
|
|
||||||
'Konto wird wiederhergestellt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String recoverPasswordlessSharesReceived(Object received, Object threshold) {
|
|
||||||
return '$received von $threshold Freunden haben geteilt';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessRecoverNowBtn => 'Jetzt wiederherstellen';
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,8 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get registerSlogan => 'Stay in touch privately.';
|
String get registerSlogan =>
|
||||||
|
'Stay in touch with friends privately and securely.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingWelcomeTitle => 'Welcome to twonly!';
|
String get onboardingWelcomeTitle => 'Welcome to twonly!';
|
||||||
|
|
@ -32,15 +33,25 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
String get onboardingFocusBody =>
|
String get onboardingFocusBody =>
|
||||||
'Say goodbye to addictive features! twonly was created for sharing moments, free from useless distractions or ads.';
|
'Say goodbye to addictive features! twonly was created for sharing moments, free from useless distractions or ads.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onboardingSendTwonliesTitle => 'Send twonlies';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onboardingSendTwonliesBody =>
|
||||||
|
'Share moments securely with your partner. twonly ensures that only your partner can open it, keeping your moments with your partner a two(o)nly thing!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingNotProductTitle => 'You are not the product!';
|
String get onboardingNotProductTitle => 'You are not the product!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingNotProductBody =>
|
String get onboardingNotProductBody =>
|
||||||
'twonly is financed by an optional subscription. Your data will never be sold.';
|
'twonly is financed by donations and an optional subscription. Your data will never be sold.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get registerUsernameSlogan => 'Create your account';
|
String get onboardingGetStartedTitle => 'Let\'s go!';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get registerUsernameSlogan => 'Your public username';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get registerUsernameDecoration => 'Username';
|
String get registerUsernameDecoration => 'Username';
|
||||||
|
|
@ -115,9 +126,17 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get searchUsernameNotFound => 'Username not found';
|
String get searchUsernameNotFound => 'Username not found';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String searchUsernameNotFoundBody(Object username) {
|
||||||
|
return 'There is no user with the username \"$username\" registered';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get searchUsernameNewFollowerTitle => 'Open requests';
|
String get searchUsernameNewFollowerTitle => 'Open requests';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chatListViewSearchUserNameBtn => 'Add your first twonly contact!';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chatListDetailInput => 'Type a message';
|
String get chatListDetailInput => 'Type a message';
|
||||||
|
|
||||||
|
|
@ -208,6 +227,10 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get settingsStorageDataStoreInGTitle => 'Store in Gallery';
|
String get settingsStorageDataStoreInGTitle => 'Store in Gallery';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsStorageDataStoreInGSubtitle =>
|
||||||
|
'Store saved images additional in the systems gallery.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsStorageDataMediaAutoDownload => 'Media auto-download';
|
String get settingsStorageDataMediaAutoDownload => 'Media auto-download';
|
||||||
|
|
||||||
|
|
@ -254,17 +277,45 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
String get settingsPrivacy => 'Privacy & Security';
|
String get settingsPrivacy => 'Privacy & Security';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsPrivacyBlockUsers => 'Block contacts';
|
String get settingsPrivacyBlockUsers => 'Block users';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsPrivacyBlockUsersDesc =>
|
String get settingsPrivacyBlockUsersDesc =>
|
||||||
'Blocked contacts will not be able to communicate with you. You can unblock a blocked contact at any time.';
|
'Blocked users will not be able to communicate with you. You can unblock a blocked user at any time.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String settingsPrivacyBlockUsersCount(Object len) {
|
String settingsPrivacyBlockUsersCount(Object len) {
|
||||||
return '$len contact(s)';
|
return '$len contact(s)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsPrivacyProfileSelectionTitle => 'Security Profile';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get settingsPrivacyProfileSelectionDesc =>
|
||||||
|
'Choose your setup path and security configuration';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileTitle => 'Security Profile';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileSubtitle =>
|
||||||
|
'Choose the level of protection that fits your daily use. This can be changed at any time in your settings.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileNormalTitle => 'Normal Protection';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileNormalDesc =>
|
||||||
|
'Good balance between a convenient mode without bothering you too much.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileStrictTitle => 'Strict Protection';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get securityProfileStrictDesc =>
|
||||||
|
'Maximum anti-phishing protection but may be inconvenient.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settingsNotification => 'Notification';
|
String get settingsNotification => 'Notification';
|
||||||
|
|
||||||
|
|
@ -405,45 +456,16 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
'Your account will be deleted. There is no change to restore it.';
|
'Your account will be deleted. There is no change to restore it.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactVerifyNumberTitle => 'Verify contacts';
|
String get contactVerifyNumberTitle => 'Verify contact';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String verifyUserIdentity(Object username) {
|
String get userVerifiedTitle => 'User verified';
|
||||||
return 'Verify $username\'s identity';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contactVerifyNumberSubtitle =>
|
|
||||||
'Verify the identity of your contacts to make sure you are texting the right person.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get inChatContactNotVerified => 'Contact not verified.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String groupMembersNotVerified(Object count) {
|
|
||||||
return '$count members are not verified.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get userVerifiedTitle => 'Contact verified';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String scanUserQrCode(Object username) {
|
|
||||||
return 'Scan $username\'s QR code';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get openOwnQrCode => 'Open your own QR code';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String contactVerifiedBy(Object username) {
|
String contactVerifiedBy(Object username) {
|
||||||
return 'Verified by $username';
|
return 'Verified by $username';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get contactSharedByUnknown =>
|
|
||||||
'Shared by a verified contact (username not available)';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationTypeQrScanned => 'You scanned their QR code.';
|
String get verificationTypeQrScanned => 'You scanned their QR code.';
|
||||||
|
|
||||||
|
|
@ -482,10 +504,10 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactBlockBody =>
|
String get contactBlockBody =>
|
||||||
'A blocked contact will no longer be able to send you messages and their profile will be hidden from view. To unblock a contact, simply navigate to Settings > Privacy > Blocked Contacts.';
|
'A blocked user will no longer be able to send you messages and their profile will be hidden from view. To unblock a user, simply navigate to Settings > Privacy > Blocked Users.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactRemove => 'Remove contact';
|
String get contactRemove => 'Remove user';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String contactRemoveTitle(Object username) {
|
String contactRemoveTitle(Object username) {
|
||||||
|
|
@ -494,7 +516,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactRemoveBody =>
|
String get contactRemoveBody =>
|
||||||
'Permanently remove the contact. If the contact tries to send you a new message, you will have to accept the contact again first.';
|
'Permanently remove the user. If the user tries to send you a new message, you will have to accept the user again first.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get undo => 'Undo';
|
String get undo => 'Undo';
|
||||||
|
|
@ -584,9 +606,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String userFoundBody(String username) {
|
String get userFoundBody => 'Do you want to create a follow request?';
|
||||||
return 'Do you want to connect with $username?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get errorInternalError =>
|
String get errorInternalError =>
|
||||||
|
|
@ -835,13 +855,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get backupChangePassword => 'Change password';
|
String get backupChangePassword => 'Change password';
|
||||||
|
|
||||||
@override
|
|
||||||
String get backupChangePasswordAuthReason => 'Changing backup password';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get backupChangePasswordAuthFailed =>
|
|
||||||
'You can only change your password after you have authenticated!';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get twonlySafeRecoverTitle => 'Restore backup';
|
String get twonlySafeRecoverTitle => 'Restore backup';
|
||||||
|
|
||||||
|
|
@ -890,7 +903,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
String get reportUserReason => 'Reporting reason';
|
String get reportUserReason => 'Reporting reason';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get reportUser => 'Report contact';
|
String get reportUser => 'Report user';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get newDeviceRegistered =>
|
String get newDeviceRegistered =>
|
||||||
|
|
@ -1024,9 +1037,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get alreadyInGroup => 'Already in Group';
|
String get alreadyInGroup => 'Already in Group';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contactNotVerified => 'Not verified';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String removeContactFromGroupTitle(Object username) {
|
String removeContactFromGroupTitle(Object username) {
|
||||||
return 'Remove $username from this group?';
|
return 'Remove $username from this group?';
|
||||||
|
|
@ -1287,6 +1297,12 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get draftMessage => 'Draft';
|
String get draftMessage => 'Draft';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get exportMemories => 'Export memories (Beta)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importMemories => 'Import memories (Beta)';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get voiceMessageSlideToCancel => 'Slide to cancel';
|
String get voiceMessageSlideToCancel => 'Slide to cancel';
|
||||||
|
|
||||||
|
|
@ -1306,11 +1322,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
String get addContactQrSheetSubtext =>
|
String get addContactQrSheetSubtext =>
|
||||||
'Let a friend scan this QR code to add you';
|
'Let a friend scan this QR code to add you';
|
||||||
|
|
||||||
@override
|
|
||||||
String letUserScanQrCode(Object username) {
|
|
||||||
return 'Let $username scan this QR code';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get finishSetupCardTitle => 'Complete your profile';
|
String get finishSetupCardTitle => 'Complete your profile';
|
||||||
|
|
||||||
|
|
@ -1434,7 +1445,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String verifiedPublicKey(Object username) {
|
String verifiedPublicKey(Object username) {
|
||||||
return 'The identity of $username has been successfully verified.';
|
return 'The public key of $username has been verified and is valid.';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -1531,11 +1542,11 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationBadgeGeneralDesc =>
|
String get verificationBadgeGeneralDesc =>
|
||||||
'The badge gives you the peace of mind that you are messaging the *right person* and your *messages remain confidential*.';
|
'The checkmark gives you the certainty that you are messaging the right person. You can verify contacts at any time by scanning their QR code.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationBadgeGreenDesc =>
|
String get verificationBadgeGreenDesc =>
|
||||||
'A contact you have *personally verified* using the QR code.';
|
'A contact you have *personally* verified.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get verificationBadgeYellowDesc =>
|
String get verificationBadgeYellowDesc =>
|
||||||
|
|
@ -1545,25 +1556,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
String get verificationBadgeRedDesc =>
|
String get verificationBadgeRedDesc =>
|
||||||
'A contact whose identity has *not* yet been verified.';
|
'A contact whose identity has *not* yet been verified.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanNow => 'Scan now';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get qrScannerVerifyHint =>
|
|
||||||
'To verify, the other person must open their QR code (Chat Lists > QR code button at the bottom right)';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String qrScannerVerifyUserHint(Object username) {
|
|
||||||
return 'To verify, $username must open their QR code (Chat Lists > QR code button at the bottom right)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get openQrCode => 'Open QR code';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get letFriendScanQrToVerify =>
|
|
||||||
'Let a friend scan this QR code to verify you';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get deleteVerificationTitle => 'Delete verification?';
|
String get deleteVerificationTitle => 'Delete verification?';
|
||||||
|
|
||||||
|
|
@ -1576,11 +1568,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
return '$username has scanned your QR code and is now verified.';
|
return '$username has scanned your QR code and is now verified.';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String askForFriendPromotionsPrompt(Object username) {
|
|
||||||
return 'Help $username find familiar faces on twonly by sharing mutual friends.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mutualGroupsTitle(num count) {
|
String mutualGroupsTitle(num count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
|
@ -1592,6 +1579,17 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
return '$_temp0';
|
return '$_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String mutualGroupsSentMessages(num count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: '$count messages sent',
|
||||||
|
one: '1 message sent',
|
||||||
|
);
|
||||||
|
return '$_temp0';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chatEntryFlameRestored(Object count) {
|
String chatEntryFlameRestored(Object count) {
|
||||||
return '$count flames restored';
|
return '$count flames restored';
|
||||||
|
|
@ -1637,6 +1635,9 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
String get settingsTypingIndicationSubtitle =>
|
String get settingsTypingIndicationSubtitle =>
|
||||||
'When the typing indicator is turned off, you can\'t see when others are typing a message.';
|
'When the typing indicator is turned off, you can\'t see when others are typing a message.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get scanQrOrShow => 'Scan / Show QR';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contactActionBlock => 'Block';
|
String get contactActionBlock => 'Block';
|
||||||
|
|
||||||
|
|
@ -1668,6 +1669,9 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get userDiscoverySettingsTitle => 'Mutual Friends';
|
String get userDiscoverySettingsTitle => 'Mutual Friends';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get userDiscoveryWhyThisIsUsed => 'Why this is used';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get userDiscoveryFeatureOffers => 'Your benefits at a glance';
|
String get userDiscoveryFeatureOffers => 'Your benefits at a glance';
|
||||||
|
|
||||||
|
|
@ -1835,6 +1839,9 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get back => 'Back';
|
String get back => 'Back';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get onboardingExampleLabel => 'Example';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String makerChangedUsername(Object maker, Object oldName, Object newName) {
|
String makerChangedUsername(Object maker, Object oldName, Object newName) {
|
||||||
return '$maker changed their username from $oldName to $newName.';
|
return '$maker changed their username from $oldName to $newName.';
|
||||||
|
|
@ -1934,6 +1941,9 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
@override
|
@override
|
||||||
String get dragToZoom => 'Drag to Zoom';
|
String get dragToZoom => 'Drag to Zoom';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get showUsername => 'Show username';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get onboardingProfileSelectionTitle => 'Choose your setup path';
|
String get onboardingProfileSelectionTitle => 'Choose your setup path';
|
||||||
|
|
||||||
|
|
@ -2068,6 +2078,18 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
String get importGalleryNoImagesFoundDesc =>
|
String get importGalleryNoImagesFoundDesc =>
|
||||||
'There are no images on your device.';
|
'There are no images on your device.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryShowAllImages => 'Show all images';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryShowTwonlyAlbum => 'Show twonly album';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryToggleDescAll => 'Viewing all images on your device.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get importGalleryToggleDescTwonly => 'Viewing the \"twonly\" album.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get importGalleryFilterTwonly => 'Only show the twonly-Album';
|
String get importGalleryFilterTwonly => 'Only show the twonly-Album';
|
||||||
|
|
||||||
|
|
@ -2087,292 +2109,4 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||||
);
|
);
|
||||||
return '$_temp0';
|
return '$_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListTitle => 'Find your first friend';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListDesc =>
|
|
||||||
'Let friends scan your QR code, or share them your profile.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListShareBtn => 'Share your profile';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListScanBtn => 'QR Code';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get emptyChatListAddUsernameBtn => 'By Username';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get avatarCustomizeRandomize => 'Randomize';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get avatarCustomizeReset => 'Reset';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecovery => 'Passwordless Recovery';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNotConfigured => 'Not configured';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPin => 'Test PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinTitle => 'Test PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinHint => 'Enter your PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinCorrect => 'PIN is correct!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTestPinIncorrect => 'Incorrect PIN.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryTest => 'Test';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactorNone => 'None';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoverySecondFactorEmailLabel(Object email) {
|
|
||||||
return 'Email ($email)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactorPin => 'PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactorEmail => 'Email';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryModify => 'Modify Recovery Settings';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryModifyDesc =>
|
|
||||||
'Update your recovery configuration';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySecondFactor => 'Second Factor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoFriendsFound => 'No trusted friends found.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryActiveFriends => 'Active Friends';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryActiveFriendsDesc =>
|
|
||||||
'These trusted friends are actively using twonly and can probably help you recover your account.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInactiveFriends => 'Inactive Friends';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInactiveFriendsDesc =>
|
|
||||||
'These friends either have not yet received their share or do not use twonly actively anymore, which could mean that they maybe cannot help.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNotEnoughFriends =>
|
|
||||||
'Not enough friends selected. You need at least 3.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryLoading => 'Loading...';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnableSuccess =>
|
|
||||||
'Passwordless recovery successfully enabled!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnableFailed =>
|
|
||||||
'Failed to enable passwordless recovery.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNeedAtLeast3 =>
|
|
||||||
'You need at least 3 trusted friends.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInvalidPin => 'Invalid PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnterPin => 'Please enter a PIN.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryPinMinLength =>
|
|
||||||
'PIN must be at least 4 digits.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnterEmail => 'Please enter an email address.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryEnableBtn => 'Enable Passwordless Recovery';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryRecoverBtn => 'Recover passwordless';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryModifyBtn => 'Modify Passwordless Recovery';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryStatusEnabled(num count) {
|
|
||||||
return 'Enabled • $count trusted friends';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoHowItWorks => 'How it works';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoHowItWorksDesc =>
|
|
||||||
'Because twonly operates without central user accounts or phone numbers to maximize privacy, we rely on a decentralized recovery mechanism. Using Shamir\'s Secret Sharing, your cryptographic identity is split into independent shares and distributed among your trusted friends. To restore access, a predefined threshold of these friends must combine their shares.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoWhySecondFactor => 'Why a Second Factor?';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoWhySecondFactorDesc =>
|
|
||||||
'The second factor (Email or PIN) serves as a vital cryptographic safeguard against malicious collusion. If your trusted friends were to coordinate their shares behind your back, they still wouldn\'t be able to decrypt your identity without the second factor key.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInfoGotIt => 'Got it';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethod => 'Second factor method';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodNoneDesc =>
|
|
||||||
'Without second-factor, your friends could collaborate to recover your account. Therefore, it is recommended to configure a second-factor.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodPinHint => 'Enter PIN';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodEmailHint =>
|
|
||||||
'Enter recovery email address';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryMethodEmailDesc =>
|
|
||||||
'Your email address is *never stored on the server* and is only sent to it in the event of a recovery.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryThresholdDesc(num count) {
|
|
||||||
return 'To recover your account you need $count of your selected trusted friends.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryThresholdTitle =>
|
|
||||||
'Required trusted friends for recovery';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoverySelectFriendsNeeded(num count) {
|
|
||||||
return 'Select friends ($count more needed)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySelectFriends => 'Select trusted friends';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoFriendsSelected =>
|
|
||||||
'No trusted friends selected yet';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySubtitle =>
|
|
||||||
'Recover your identity without a password.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessExplanation =>
|
|
||||||
'If enabled, you can recover your account by asking your selected friends to help you.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessNotificationCardTitle => 'Enable notifications';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessNotificationCardSubtitle =>
|
|
||||||
'Get notified when a friend has helped you recover your account.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessNotificationCardBtn =>
|
|
||||||
'Enable push notifications';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessQrInstructions =>
|
|
||||||
'Let friends scan the QR code or share the link.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessShareBtn => 'Share Recovery Link';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessCopyBtn => 'Copy';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessCopiedSnackbar => 'Link copied to clipboard!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoShareStored =>
|
|
||||||
'No recovery share stored for this contact.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryShareSent =>
|
|
||||||
'Recovery share successfully sent!';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNetworkError =>
|
|
||||||
'Network error, please ensure you have internet';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryInvalidEmail =>
|
|
||||||
'The email address is invalid.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryResendEmail => 'Resend recovery email';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryHelpAFriend => 'Help a Friend';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySelectContactDesc =>
|
|
||||||
'Please select the contact who requested recovery below to send them their recovery key.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoverySearchContacts => 'Search contacts...';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNoContactsFound => 'No contacts found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryCantHelpHim => 'You can\'t help him';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryDoesAskedYou(Object username) {
|
|
||||||
return 'Does $username has asked you?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryVerifySourceDesc =>
|
|
||||||
'Please ensure that you actualy received the link/qr code from your friend! If you are unsure, please verify again and then click again on the link or come back.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryNo => 'No';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get passwordlessRecoveryYes => 'Yes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String passwordlessRecoveryYesWithTimer(Object seconds) {
|
|
||||||
return 'Yes (${seconds}s)';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessBeingRecoveredLabel =>
|
|
||||||
'Account being recovered';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String recoverPasswordlessSharesReceived(Object received, Object threshold) {
|
|
||||||
return '$received of $threshold friends have shared';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get recoverPasswordlessRecoverNowBtn => 'Recover now';
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit b7d703c82a5ac0b6776847cb4eb6d637620f6585
|
Subproject commit 189bf8f4dbe2bee4f19a15b9640b8826e4f2e235
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
import 'package:json_annotation/json_annotation.dart';
|
|
||||||
|
|
||||||
part 'onboarding_state.model.g.dart';
|
|
||||||
|
|
||||||
/// Holds information about a single trusted friend who has already shared their
|
|
||||||
/// recovery part.
|
|
||||||
@JsonSerializable()
|
|
||||||
class ReceivedRecoveryShare {
|
|
||||||
ReceivedRecoveryShare({
|
|
||||||
required this.messageId,
|
|
||||||
required this.trustedFriendDisplayName,
|
|
||||||
required this.myDisplayName,
|
|
||||||
required this.myUserId,
|
|
||||||
required this.myAvatarSvg,
|
|
||||||
required this.threshold,
|
|
||||||
required this.sharedSecretDataBytes,
|
|
||||||
});
|
|
||||||
|
|
||||||
factory ReceivedRecoveryShare.fromJson(Map<String, dynamic> json) =>
|
|
||||||
_$ReceivedRecoveryShareFromJson(json);
|
|
||||||
|
|
||||||
final int messageId;
|
|
||||||
|
|
||||||
final String trustedFriendDisplayName;
|
|
||||||
|
|
||||||
final String myDisplayName;
|
|
||||||
final int myUserId;
|
|
||||||
final List<int>? myAvatarSvg;
|
|
||||||
|
|
||||||
final int threshold;
|
|
||||||
|
|
||||||
final List<int> sharedSecretDataBytes;
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$ReceivedRecoveryShareToJson(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@JsonSerializable()
|
|
||||||
class OnboardingState {
|
|
||||||
OnboardingState({
|
|
||||||
this.hasOnboardingFinished = false,
|
|
||||||
this.hasStartedPasswordlessRecovery = false,
|
|
||||||
this.notificationId,
|
|
||||||
this.downloadAuthToken,
|
|
||||||
this.serverRegistered = false,
|
|
||||||
this.encryptionKey,
|
|
||||||
this.emailRecoveryRequested = false,
|
|
||||||
});
|
|
||||||
|
|
||||||
factory OnboardingState.fromJson(Map<String, dynamic> json) =>
|
|
||||||
_$OnboardingStateFromJson(json);
|
|
||||||
|
|
||||||
bool hasOnboardingFinished;
|
|
||||||
bool hasStartedPasswordlessRecovery;
|
|
||||||
|
|
||||||
String? notificationId;
|
|
||||||
List<int>? downloadAuthToken;
|
|
||||||
bool serverRegistered;
|
|
||||||
List<int>? encryptionKey;
|
|
||||||
bool emailRecoveryRequested;
|
|
||||||
|
|
||||||
|
|
||||||
List<ReceivedRecoveryShare> receivedShares = [];
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$OnboardingStateToJson(this);
|
|
||||||
}
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
|
||||||
|
|
||||||
part of 'onboarding_state.model.dart';
|
|
||||||
|
|
||||||
// **************************************************************************
|
|
||||||
// JsonSerializableGenerator
|
|
||||||
// **************************************************************************
|
|
||||||
|
|
||||||
ReceivedRecoveryShare _$ReceivedRecoveryShareFromJson(
|
|
||||||
Map<String, dynamic> json,
|
|
||||||
) => ReceivedRecoveryShare(
|
|
||||||
messageId: (json['messageId'] as num).toInt(),
|
|
||||||
trustedFriendDisplayName: json['trustedFriendDisplayName'] as String,
|
|
||||||
myDisplayName: json['myDisplayName'] as String,
|
|
||||||
myUserId: (json['myUserId'] as num).toInt(),
|
|
||||||
myAvatarSvg: (json['myAvatarSvg'] as List<dynamic>?)
|
|
||||||
?.map((e) => (e as num).toInt())
|
|
||||||
.toList(),
|
|
||||||
threshold: (json['threshold'] as num).toInt(),
|
|
||||||
sharedSecretDataBytes: (json['sharedSecretDataBytes'] as List<dynamic>)
|
|
||||||
.map((e) => (e as num).toInt())
|
|
||||||
.toList(),
|
|
||||||
);
|
|
||||||
|
|
||||||
Map<String, dynamic> _$ReceivedRecoveryShareToJson(
|
|
||||||
ReceivedRecoveryShare instance,
|
|
||||||
) => <String, dynamic>{
|
|
||||||
'messageId': instance.messageId,
|
|
||||||
'trustedFriendDisplayName': instance.trustedFriendDisplayName,
|
|
||||||
'myDisplayName': instance.myDisplayName,
|
|
||||||
'myUserId': instance.myUserId,
|
|
||||||
'myAvatarSvg': instance.myAvatarSvg,
|
|
||||||
'threshold': instance.threshold,
|
|
||||||
'sharedSecretDataBytes': instance.sharedSecretDataBytes,
|
|
||||||
};
|
|
||||||
|
|
||||||
OnboardingState _$OnboardingStateFromJson(Map<String, dynamic> json) =>
|
|
||||||
OnboardingState(
|
|
||||||
hasOnboardingFinished: json['hasOnboardingFinished'] as bool? ?? false,
|
|
||||||
hasStartedPasswordlessRecovery:
|
|
||||||
json['hasStartedPasswordlessRecovery'] as bool? ?? false,
|
|
||||||
notificationId: json['notificationId'] as String?,
|
|
||||||
downloadAuthToken: (json['downloadAuthToken'] as List<dynamic>?)
|
|
||||||
?.map((e) => (e as num).toInt())
|
|
||||||
.toList(),
|
|
||||||
serverRegistered: json['serverRegistered'] as bool? ?? false,
|
|
||||||
encryptionKey: (json['encryptionKey'] as List<dynamic>?)
|
|
||||||
?.map((e) => (e as num).toInt())
|
|
||||||
.toList(),
|
|
||||||
emailRecoveryRequested:
|
|
||||||
json['emailRecoveryRequested'] as bool? ?? false,
|
|
||||||
)
|
|
||||||
..receivedShares = (json['receivedShares'] as List<dynamic>)
|
|
||||||
.map((e) => ReceivedRecoveryShare.fromJson(e as Map<String, dynamic>))
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
Map<String, dynamic> _$OnboardingStateToJson(OnboardingState instance) =>
|
|
||||||
<String, dynamic>{
|
|
||||||
'hasOnboardingFinished': instance.hasOnboardingFinished,
|
|
||||||
'hasStartedPasswordlessRecovery': instance.hasStartedPasswordlessRecovery,
|
|
||||||
'notificationId': instance.notificationId,
|
|
||||||
'downloadAuthToken': instance.downloadAuthToken,
|
|
||||||
'serverRegistered': instance.serverRegistered,
|
|
||||||
'encryptionKey': instance.encryptionKey,
|
|
||||||
'emailRecoveryRequested': instance.emailRecoveryRequested,
|
|
||||||
'receivedShares': instance.receivedShares,
|
|
||||||
};
|
|
||||||
|
|
@ -40,6 +40,9 @@ class UserData {
|
||||||
@JsonKey(defaultValue: SetupProfile.standard)
|
@JsonKey(defaultValue: SetupProfile.standard)
|
||||||
SetupProfile setupProfile = SetupProfile.standard;
|
SetupProfile setupProfile = SetupProfile.standard;
|
||||||
|
|
||||||
|
@JsonKey(defaultValue: SecurityProfile.normal)
|
||||||
|
SecurityProfile securityProfile = SecurityProfile.normal;
|
||||||
|
|
||||||
// --- SUBSCRIPTION DTA ---
|
// --- SUBSCRIPTION DTA ---
|
||||||
|
|
||||||
@JsonKey(defaultValue: 'Free')
|
@JsonKey(defaultValue: 'Free')
|
||||||
|
|
@ -111,8 +114,8 @@ class UserData {
|
||||||
@JsonKey(defaultValue: 4)
|
@JsonKey(defaultValue: 4)
|
||||||
int requiredSendImages = 4;
|
int requiredSendImages = 4;
|
||||||
|
|
||||||
@JsonKey(defaultValue: 3)
|
@JsonKey(defaultValue: 2)
|
||||||
int userDiscoveryThreshold = 3;
|
int userDiscoveryThreshold = 2;
|
||||||
|
|
||||||
@JsonKey(defaultValue: false)
|
@JsonKey(defaultValue: false)
|
||||||
bool userDiscoveryRequiresManualApproval = false;
|
bool userDiscoveryRequiresManualApproval = false;
|
||||||
|
|
@ -125,9 +128,6 @@ class UserData {
|
||||||
|
|
||||||
// -- Custom DATA --
|
// -- Custom DATA --
|
||||||
|
|
||||||
@JsonKey(defaultValue: true)
|
|
||||||
bool askForFriendPromotions = true;
|
|
||||||
|
|
||||||
@JsonKey(defaultValue: 100_000)
|
@JsonKey(defaultValue: 100_000)
|
||||||
int currentPreKeyIndexStart = 100_000;
|
int currentPreKeyIndexStart = 100_000;
|
||||||
|
|
||||||
|
|
@ -153,8 +153,6 @@ class UserData {
|
||||||
@JsonKey(defaultValue: false)
|
@JsonKey(defaultValue: false)
|
||||||
bool isBackupEnabled = false;
|
bool isBackupEnabled = false;
|
||||||
|
|
||||||
PasswordLessRecovery? passwordLessRecovery;
|
|
||||||
|
|
||||||
// Used for push notifcation via FCM.
|
// Used for push notifcation via FCM.
|
||||||
String? fcmToken;
|
String? fcmToken;
|
||||||
|
|
||||||
|
|
@ -202,34 +200,3 @@ class TwonlySafeBackup {
|
||||||
List<int> encryptionKey;
|
List<int> encryptionKey;
|
||||||
Map<String, dynamic> toJson() => _$TwonlySafeBackupToJson(this);
|
Map<String, dynamic> toJson() => _$TwonlySafeBackupToJson(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonSerializable()
|
|
||||||
class PasswordLessRecovery {
|
|
||||||
PasswordLessRecovery(this.threshold);
|
|
||||||
|
|
||||||
factory PasswordLessRecovery.fromJson(Map<String, dynamic> json) =>
|
|
||||||
_$PasswordLessRecoveryFromJson(json);
|
|
||||||
|
|
||||||
// Only stored, so the user can see his deposit email address...
|
|
||||||
String? email;
|
|
||||||
|
|
||||||
// <--
|
|
||||||
// Data shared with trusted friends
|
|
||||||
|
|
||||||
int threshold;
|
|
||||||
// Trusted friends are able to brute-force the pin -> Server delets after X tries
|
|
||||||
List<int>? pinSeed;
|
|
||||||
List<int>? pinUnlockToken;
|
|
||||||
|
|
||||||
// Stored not on the server, so the server is unable to link a email to a user until the actuall recovery or can
|
|
||||||
// brute-force the pin
|
|
||||||
List<int>? encryptedServerKeyNonce;
|
|
||||||
// --->
|
|
||||||
|
|
||||||
// Checking with the server that the server data is valid and not delted throug the pin protection for example.
|
|
||||||
DateTime? lastServerHeartbeat;
|
|
||||||
DateTime? lastContactHeartbeat;
|
|
||||||
List<int>? encryptedServerKey;
|
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => _$PasswordLessRecoveryToJson(this);
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,12 @@ UserData _$UserDataFromJson(Map<String, dynamic> json) =>
|
||||||
..setupProfile =
|
..setupProfile =
|
||||||
$enumDecodeNullable(_$SetupProfileEnumMap, json['setupProfile']) ??
|
$enumDecodeNullable(_$SetupProfileEnumMap, json['setupProfile']) ??
|
||||||
SetupProfile.standard
|
SetupProfile.standard
|
||||||
|
..securityProfile =
|
||||||
|
$enumDecodeNullable(
|
||||||
|
_$SecurityProfileEnumMap,
|
||||||
|
json['securityProfile'],
|
||||||
|
) ??
|
||||||
|
SecurityProfile.normal
|
||||||
..subscriptionPlanIdStore = json['subscriptionPlanIdStore'] as String?
|
..subscriptionPlanIdStore = json['subscriptionPlanIdStore'] as String?
|
||||||
..lastImageSend = json['lastImageSend'] == null
|
..lastImageSend = json['lastImageSend'] == null
|
||||||
? null
|
? null
|
||||||
|
|
@ -56,7 +62,7 @@ UserData _$UserDataFromJson(Map<String, dynamic> json) =>
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
..storeMediaFilesInGallery =
|
..storeMediaFilesInGallery =
|
||||||
json['storeMediaFilesInGallery'] as bool? ?? true
|
json['storeMediaFilesInGallery'] as bool? ?? false
|
||||||
..autoStoreAllSendUnlimitedMediaFiles =
|
..autoStoreAllSendUnlimitedMediaFiles =
|
||||||
json['autoStoreAllSendUnlimitedMediaFiles'] as bool? ?? false
|
json['autoStoreAllSendUnlimitedMediaFiles'] as bool? ?? false
|
||||||
..typingIndicators = json['typingIndicators'] as bool? ?? true
|
..typingIndicators = json['typingIndicators'] as bool? ?? true
|
||||||
|
|
@ -72,14 +78,13 @@ UserData _$UserDataFromJson(Map<String, dynamic> json) =>
|
||||||
json['isUserDiscoveryEnabled'] as bool? ?? false
|
json['isUserDiscoveryEnabled'] as bool? ?? false
|
||||||
..requiredSendImages = (json['requiredSendImages'] as num?)?.toInt() ?? 4
|
..requiredSendImages = (json['requiredSendImages'] as num?)?.toInt() ?? 4
|
||||||
..userDiscoveryThreshold =
|
..userDiscoveryThreshold =
|
||||||
(json['userDiscoveryThreshold'] as num?)?.toInt() ?? 3
|
(json['userDiscoveryThreshold'] as num?)?.toInt() ?? 2
|
||||||
..userDiscoveryRequiresManualApproval =
|
..userDiscoveryRequiresManualApproval =
|
||||||
json['userDiscoveryRequiresManualApproval'] as bool? ?? false
|
json['userDiscoveryRequiresManualApproval'] as bool? ?? false
|
||||||
..userDiscoverySharePromotion =
|
..userDiscoverySharePromotion =
|
||||||
json['userDiscoverySharePromotion'] as bool? ?? true
|
json['userDiscoverySharePromotion'] as bool? ?? true
|
||||||
..userDiscoveryInitializationError =
|
..userDiscoveryInitializationError =
|
||||||
json['userDiscoveryInitializationError'] as bool? ?? false
|
json['userDiscoveryInitializationError'] as bool? ?? false
|
||||||
..askForFriendPromotions = json['askForFriendPromotions'] as bool? ?? true
|
|
||||||
..currentPreKeyIndexStart =
|
..currentPreKeyIndexStart =
|
||||||
(json['currentPreKeyIndexStart'] as num?)?.toInt() ?? 100000
|
(json['currentPreKeyIndexStart'] as num?)?.toInt() ?? 100000
|
||||||
..currentSignedPreKeyIndexStart =
|
..currentSignedPreKeyIndexStart =
|
||||||
|
|
@ -97,11 +102,6 @@ UserData _$UserDataFromJson(Map<String, dynamic> json) =>
|
||||||
json['twonlySafeBackup'] as Map<String, dynamic>,
|
json['twonlySafeBackup'] as Map<String, dynamic>,
|
||||||
)
|
)
|
||||||
..isBackupEnabled = json['isBackupEnabled'] as bool? ?? false
|
..isBackupEnabled = json['isBackupEnabled'] as bool? ?? false
|
||||||
..passwordLessRecovery = json['passwordLessRecovery'] == null
|
|
||||||
? null
|
|
||||||
: PasswordLessRecovery.fromJson(
|
|
||||||
json['passwordLessRecovery'] as Map<String, dynamic>,
|
|
||||||
)
|
|
||||||
..fcmToken = json['fcmToken'] as String?
|
..fcmToken = json['fcmToken'] as String?
|
||||||
..askedForUserStudyPermission =
|
..askedForUserStudyPermission =
|
||||||
json['askedForUserStudyPermission'] as bool? ?? false
|
json['askedForUserStudyPermission'] as bool? ?? false
|
||||||
|
|
@ -126,6 +126,7 @@ Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{
|
||||||
'isDeveloper': instance.isDeveloper,
|
'isDeveloper': instance.isDeveloper,
|
||||||
'deviceId': instance.deviceId,
|
'deviceId': instance.deviceId,
|
||||||
'setupProfile': _$SetupProfileEnumMap[instance.setupProfile]!,
|
'setupProfile': _$SetupProfileEnumMap[instance.setupProfile]!,
|
||||||
|
'securityProfile': _$SecurityProfileEnumMap[instance.securityProfile]!,
|
||||||
'subscriptionPlan': instance.subscriptionPlan,
|
'subscriptionPlan': instance.subscriptionPlan,
|
||||||
'subscriptionPlanIdStore': instance.subscriptionPlanIdStore,
|
'subscriptionPlanIdStore': instance.subscriptionPlanIdStore,
|
||||||
'lastImageSend': instance.lastImageSend?.toIso8601String(),
|
'lastImageSend': instance.lastImageSend?.toIso8601String(),
|
||||||
|
|
@ -160,7 +161,6 @@ Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{
|
||||||
instance.userDiscoveryRequiresManualApproval,
|
instance.userDiscoveryRequiresManualApproval,
|
||||||
'userDiscoverySharePromotion': instance.userDiscoverySharePromotion,
|
'userDiscoverySharePromotion': instance.userDiscoverySharePromotion,
|
||||||
'userDiscoveryInitializationError': instance.userDiscoveryInitializationError,
|
'userDiscoveryInitializationError': instance.userDiscoveryInitializationError,
|
||||||
'askForFriendPromotions': instance.askForFriendPromotions,
|
|
||||||
'currentPreKeyIndexStart': instance.currentPreKeyIndexStart,
|
'currentPreKeyIndexStart': instance.currentPreKeyIndexStart,
|
||||||
'currentSignedPreKeyIndexStart': instance.currentSignedPreKeyIndexStart,
|
'currentSignedPreKeyIndexStart': instance.currentSignedPreKeyIndexStart,
|
||||||
'lastChangeLogHash': instance.lastChangeLogHash,
|
'lastChangeLogHash': instance.lastChangeLogHash,
|
||||||
|
|
@ -169,7 +169,6 @@ Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{
|
||||||
'canUseLoginTokenForAuth': instance.canUseLoginTokenForAuth,
|
'canUseLoginTokenForAuth': instance.canUseLoginTokenForAuth,
|
||||||
'twonlySafeBackup': instance.twonlySafeBackup,
|
'twonlySafeBackup': instance.twonlySafeBackup,
|
||||||
'isBackupEnabled': instance.isBackupEnabled,
|
'isBackupEnabled': instance.isBackupEnabled,
|
||||||
'passwordLessRecovery': instance.passwordLessRecovery,
|
|
||||||
'fcmToken': instance.fcmToken,
|
'fcmToken': instance.fcmToken,
|
||||||
'askedForUserStudyPermission': instance.askedForUserStudyPermission,
|
'askedForUserStudyPermission': instance.askedForUserStudyPermission,
|
||||||
'userStudyParticipantsToken': instance.userStudyParticipantsToken,
|
'userStudyParticipantsToken': instance.userStudyParticipantsToken,
|
||||||
|
|
@ -185,6 +184,12 @@ Map<String, dynamic> _$UserDataToJson(UserData instance) => <String, dynamic>{
|
||||||
const _$SetupProfileEnumMap = {
|
const _$SetupProfileEnumMap = {
|
||||||
SetupProfile.standard: 'standard',
|
SetupProfile.standard: 'standard',
|
||||||
SetupProfile.customized: 'customized',
|
SetupProfile.customized: 'customized',
|
||||||
|
SetupProfile.maximum: 'maximum',
|
||||||
|
};
|
||||||
|
|
||||||
|
const _$SecurityProfileEnumMap = {
|
||||||
|
SecurityProfile.normal: 'normal',
|
||||||
|
SecurityProfile.strict: 'strict',
|
||||||
};
|
};
|
||||||
|
|
||||||
const _$ThemeModeEnumMap = {
|
const _$ThemeModeEnumMap = {
|
||||||
|
|
@ -227,40 +232,3 @@ const _$LastBackupUploadStateEnumMap = {
|
||||||
LastBackupUploadState.failed: 'failed',
|
LastBackupUploadState.failed: 'failed',
|
||||||
LastBackupUploadState.success: 'success',
|
LastBackupUploadState.success: 'success',
|
||||||
};
|
};
|
||||||
|
|
||||||
PasswordLessRecovery _$PasswordLessRecoveryFromJson(
|
|
||||||
Map<String, dynamic> json,
|
|
||||||
) => PasswordLessRecovery((json['threshold'] as num).toInt())
|
|
||||||
..email = json['email'] as String?
|
|
||||||
..pinSeed = (json['pinSeed'] as List<dynamic>?)
|
|
||||||
?.map((e) => (e as num).toInt())
|
|
||||||
.toList()
|
|
||||||
..pinUnlockToken = (json['pinUnlockToken'] as List<dynamic>?)
|
|
||||||
?.map((e) => (e as num).toInt())
|
|
||||||
.toList()
|
|
||||||
..encryptedServerKeyNonce =
|
|
||||||
(json['encryptedServerKeyNonce'] as List<dynamic>?)
|
|
||||||
?.map((e) => (e as num).toInt())
|
|
||||||
.toList()
|
|
||||||
..lastServerHeartbeat = json['lastServerHeartbeat'] == null
|
|
||||||
? null
|
|
||||||
: DateTime.parse(json['lastServerHeartbeat'] as String)
|
|
||||||
..lastContactHeartbeat = json['lastContactHeartbeat'] == null
|
|
||||||
? null
|
|
||||||
: DateTime.parse(json['lastContactHeartbeat'] as String)
|
|
||||||
..encryptedServerKey = (json['encryptedServerKey'] as List<dynamic>?)
|
|
||||||
?.map((e) => (e as num).toInt())
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
Map<String, dynamic> _$PasswordLessRecoveryToJson(
|
|
||||||
PasswordLessRecovery instance,
|
|
||||||
) => <String, dynamic>{
|
|
||||||
'email': instance.email,
|
|
||||||
'threshold': instance.threshold,
|
|
||||||
'pinSeed': instance.pinSeed,
|
|
||||||
'pinUnlockToken': instance.pinUnlockToken,
|
|
||||||
'encryptedServerKeyNonce': instance.encryptedServerKeyNonce,
|
|
||||||
'lastServerHeartbeat': instance.lastServerHeartbeat?.toIso8601String(),
|
|
||||||
'lastContactHeartbeat': instance.lastContactHeartbeat?.toIso8601String(),
|
|
||||||
'encryptedServerKey': instance.encryptedServerKey,
|
|
||||||
};
|
|
||||||
|
|
|
||||||
|
|
@ -809,301 +809,6 @@ class Handshake_AuthenticateWithLoginToken extends $pb.GeneratedMessage {
|
||||||
void clearInBackground() => $_clearField(5);
|
void clearInBackground() => $_clearField(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
class Handshake_GetServerKeyForPasswordLessRecovery
|
|
||||||
extends $pb.GeneratedMessage {
|
|
||||||
factory Handshake_GetServerKeyForPasswordLessRecovery({
|
|
||||||
$fixnum.Int64? userId,
|
|
||||||
$core.List<$core.int>? encryptedServerKeyNone,
|
|
||||||
$core.List<$core.int>? pinUnlockToken,
|
|
||||||
$core.List<$core.int>? pinProtectionKey,
|
|
||||||
$core.String? email,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (userId != null) result.userId = userId;
|
|
||||||
if (encryptedServerKeyNone != null)
|
|
||||||
result.encryptedServerKeyNone = encryptedServerKeyNone;
|
|
||||||
if (pinUnlockToken != null) result.pinUnlockToken = pinUnlockToken;
|
|
||||||
if (pinProtectionKey != null) result.pinProtectionKey = pinProtectionKey;
|
|
||||||
if (email != null) result.email = email;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery._();
|
|
||||||
|
|
||||||
factory Handshake_GetServerKeyForPasswordLessRecovery.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory Handshake_GetServerKeyForPasswordLessRecovery.fromJson(
|
|
||||||
$core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'Handshake.GetServerKeyForPasswordLessRecovery',
|
|
||||||
package:
|
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aInt64(1, _omitFieldNames ? '' : 'userId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'encryptedServerKeyNone', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'pinUnlockToken', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
4, _omitFieldNames ? '' : 'pinProtectionKey', $pb.PbFieldType.OY)
|
|
||||||
..aOS(5, _omitFieldNames ? '' : 'email')
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery copyWith(
|
|
||||||
void Function(Handshake_GetServerKeyForPasswordLessRecovery)
|
|
||||||
updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as Handshake_GetServerKeyForPasswordLessRecovery))
|
|
||||||
as Handshake_GetServerKeyForPasswordLessRecovery;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Handshake_GetServerKeyForPasswordLessRecovery create() =>
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery._();
|
|
||||||
@$core.override
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery createEmptyInstance() =>
|
|
||||||
create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Handshake_GetServerKeyForPasswordLessRecovery getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery>(create);
|
|
||||||
static Handshake_GetServerKeyForPasswordLessRecovery? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$fixnum.Int64 get userId => $_getI64(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set userId($fixnum.Int64 value) => $_setInt64(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasUserId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearUserId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get encryptedServerKeyNone => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set encryptedServerKeyNone($core.List<$core.int> value) =>
|
|
||||||
$_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasEncryptedServerKeyNone() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearEncryptedServerKeyNone() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get pinUnlockToken => $_getN(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set pinUnlockToken($core.List<$core.int> value) => $_setBytes(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasPinUnlockToken() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearPinUnlockToken() => $_clearField(3);
|
|
||||||
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.List<$core.int> get pinProtectionKey => $_getN(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
set pinProtectionKey($core.List<$core.int> value) => $_setBytes(3, value);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.bool hasPinProtectionKey() => $_has(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
void clearPinProtectionKey() => $_clearField(4);
|
|
||||||
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
$core.String get email => $_getSZ(4);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
set email($core.String value) => $_setString(4, value);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
$core.bool hasEmail() => $_has(4);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
void clearEmail() => $_clearField(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Handshake_RegisterPasswordlessNotification extends $pb.GeneratedMessage {
|
|
||||||
factory Handshake_RegisterPasswordlessNotification({
|
|
||||||
$core.String? notificationId,
|
|
||||||
$core.List<$core.int>? downloadAuthToken,
|
|
||||||
$core.String? langCode,
|
|
||||||
$core.String? googleFcm,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (notificationId != null) result.notificationId = notificationId;
|
|
||||||
if (downloadAuthToken != null) result.downloadAuthToken = downloadAuthToken;
|
|
||||||
if (langCode != null) result.langCode = langCode;
|
|
||||||
if (googleFcm != null) result.googleFcm = googleFcm;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handshake_RegisterPasswordlessNotification._();
|
|
||||||
|
|
||||||
factory Handshake_RegisterPasswordlessNotification.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory Handshake_RegisterPasswordlessNotification.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'Handshake.RegisterPasswordlessNotification',
|
|
||||||
package:
|
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aOS(1, _omitFieldNames ? '' : 'notificationId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'downloadAuthToken', $pb.PbFieldType.OY)
|
|
||||||
..aOS(3, _omitFieldNames ? '' : 'langCode')
|
|
||||||
..aOS(4, _omitFieldNames ? '' : 'googleFcm')
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Handshake_RegisterPasswordlessNotification clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Handshake_RegisterPasswordlessNotification copyWith(
|
|
||||||
void Function(Handshake_RegisterPasswordlessNotification) updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as Handshake_RegisterPasswordlessNotification))
|
|
||||||
as Handshake_RegisterPasswordlessNotification;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Handshake_RegisterPasswordlessNotification create() =>
|
|
||||||
Handshake_RegisterPasswordlessNotification._();
|
|
||||||
@$core.override
|
|
||||||
Handshake_RegisterPasswordlessNotification createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Handshake_RegisterPasswordlessNotification getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
Handshake_RegisterPasswordlessNotification>(create);
|
|
||||||
static Handshake_RegisterPasswordlessNotification? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.String get notificationId => $_getSZ(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set notificationId($core.String value) => $_setString(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasNotificationId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearNotificationId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get downloadAuthToken => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set downloadAuthToken($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasDownloadAuthToken() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearDownloadAuthToken() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.String get langCode => $_getSZ(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set langCode($core.String value) => $_setString(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasLangCode() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearLangCode() => $_clearField(3);
|
|
||||||
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.String get googleFcm => $_getSZ(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
set googleFcm($core.String value) => $_setString(3, value);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.bool hasGoogleFcm() => $_has(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
void clearGoogleFcm() => $_clearField(4);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Handshake_CheckForPasswordlessNotification extends $pb.GeneratedMessage {
|
|
||||||
factory Handshake_CheckForPasswordlessNotification({
|
|
||||||
$core.String? notificationId,
|
|
||||||
$core.List<$core.int>? downloadAuthToken,
|
|
||||||
$core.Iterable<$fixnum.Int64>? alreadyReceivedMessageIds,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (notificationId != null) result.notificationId = notificationId;
|
|
||||||
if (downloadAuthToken != null) result.downloadAuthToken = downloadAuthToken;
|
|
||||||
if (alreadyReceivedMessageIds != null)
|
|
||||||
result.alreadyReceivedMessageIds.addAll(alreadyReceivedMessageIds);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Handshake_CheckForPasswordlessNotification._();
|
|
||||||
|
|
||||||
factory Handshake_CheckForPasswordlessNotification.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory Handshake_CheckForPasswordlessNotification.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'Handshake.CheckForPasswordlessNotification',
|
|
||||||
package:
|
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aOS(1, _omitFieldNames ? '' : 'notificationId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'downloadAuthToken', $pb.PbFieldType.OY)
|
|
||||||
..p<$fixnum.Int64>(3, _omitFieldNames ? '' : 'alreadyReceivedMessageIds',
|
|
||||||
$pb.PbFieldType.K6)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Handshake_CheckForPasswordlessNotification clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Handshake_CheckForPasswordlessNotification copyWith(
|
|
||||||
void Function(Handshake_CheckForPasswordlessNotification) updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as Handshake_CheckForPasswordlessNotification))
|
|
||||||
as Handshake_CheckForPasswordlessNotification;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Handshake_CheckForPasswordlessNotification create() =>
|
|
||||||
Handshake_CheckForPasswordlessNotification._();
|
|
||||||
@$core.override
|
|
||||||
Handshake_CheckForPasswordlessNotification createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Handshake_CheckForPasswordlessNotification getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
Handshake_CheckForPasswordlessNotification>(create);
|
|
||||||
static Handshake_CheckForPasswordlessNotification? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.String get notificationId => $_getSZ(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set notificationId($core.String value) => $_setString(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasNotificationId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearNotificationId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get downloadAuthToken => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set downloadAuthToken($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasDownloadAuthToken() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearDownloadAuthToken() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$pb.PbList<$fixnum.Int64> get alreadyReceivedMessageIds => $_getList(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Handshake_Handshake {
|
enum Handshake_Handshake {
|
||||||
register,
|
register,
|
||||||
getAuthChallenge,
|
getAuthChallenge,
|
||||||
|
|
@ -1112,9 +817,6 @@ enum Handshake_Handshake {
|
||||||
requestPOW,
|
requestPOW,
|
||||||
authenticateWithLoginToken,
|
authenticateWithLoginToken,
|
||||||
getUseridByUsername,
|
getUseridByUsername,
|
||||||
getServerKeyForPasswordlessRecovery,
|
|
||||||
registerPasswordlessNotification,
|
|
||||||
checkForPasswordlessNotification,
|
|
||||||
notSet
|
notSet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1127,12 +829,6 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
Handshake_RequestPOW? requestPOW,
|
Handshake_RequestPOW? requestPOW,
|
||||||
Handshake_AuthenticateWithLoginToken? authenticateWithLoginToken,
|
Handshake_AuthenticateWithLoginToken? authenticateWithLoginToken,
|
||||||
Handshake_GetUserIdByUsername? getUseridByUsername,
|
Handshake_GetUserIdByUsername? getUseridByUsername,
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery?
|
|
||||||
getServerKeyForPasswordlessRecovery,
|
|
||||||
Handshake_RegisterPasswordlessNotification?
|
|
||||||
registerPasswordlessNotification,
|
|
||||||
Handshake_CheckForPasswordlessNotification?
|
|
||||||
checkForPasswordlessNotification,
|
|
||||||
}) {
|
}) {
|
||||||
final result = create();
|
final result = create();
|
||||||
if (register != null) result.register = register;
|
if (register != null) result.register = register;
|
||||||
|
|
@ -1144,15 +840,6 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
result.authenticateWithLoginToken = authenticateWithLoginToken;
|
result.authenticateWithLoginToken = authenticateWithLoginToken;
|
||||||
if (getUseridByUsername != null)
|
if (getUseridByUsername != null)
|
||||||
result.getUseridByUsername = getUseridByUsername;
|
result.getUseridByUsername = getUseridByUsername;
|
||||||
if (getServerKeyForPasswordlessRecovery != null)
|
|
||||||
result.getServerKeyForPasswordlessRecovery =
|
|
||||||
getServerKeyForPasswordlessRecovery;
|
|
||||||
if (registerPasswordlessNotification != null)
|
|
||||||
result.registerPasswordlessNotification =
|
|
||||||
registerPasswordlessNotification;
|
|
||||||
if (checkForPasswordlessNotification != null)
|
|
||||||
result.checkForPasswordlessNotification =
|
|
||||||
checkForPasswordlessNotification;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1174,9 +861,6 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
5: Handshake_Handshake.requestPOW,
|
5: Handshake_Handshake.requestPOW,
|
||||||
6: Handshake_Handshake.authenticateWithLoginToken,
|
6: Handshake_Handshake.authenticateWithLoginToken,
|
||||||
7: Handshake_Handshake.getUseridByUsername,
|
7: Handshake_Handshake.getUseridByUsername,
|
||||||
8: Handshake_Handshake.getServerKeyForPasswordlessRecovery,
|
|
||||||
9: Handshake_Handshake.registerPasswordlessNotification,
|
|
||||||
10: Handshake_Handshake.checkForPasswordlessNotification,
|
|
||||||
0: Handshake_Handshake.notSet
|
0: Handshake_Handshake.notSet
|
||||||
};
|
};
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
||||||
|
|
@ -1184,7 +868,7 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
package:
|
package:
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'),
|
const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'),
|
||||||
createEmptyInstance: create)
|
createEmptyInstance: create)
|
||||||
..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
..oo(0, [1, 2, 3, 4, 5, 6, 7])
|
||||||
..aOM<Handshake_Register>(1, _omitFieldNames ? '' : 'register',
|
..aOM<Handshake_Register>(1, _omitFieldNames ? '' : 'register',
|
||||||
subBuilder: Handshake_Register.create)
|
subBuilder: Handshake_Register.create)
|
||||||
..aOM<Handshake_GetAuthChallenge>(
|
..aOM<Handshake_GetAuthChallenge>(
|
||||||
|
|
@ -1203,15 +887,6 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
..aOM<Handshake_GetUserIdByUsername>(
|
..aOM<Handshake_GetUserIdByUsername>(
|
||||||
7, _omitFieldNames ? '' : 'getUseridByUsername',
|
7, _omitFieldNames ? '' : 'getUseridByUsername',
|
||||||
subBuilder: Handshake_GetUserIdByUsername.create)
|
subBuilder: Handshake_GetUserIdByUsername.create)
|
||||||
..aOM<Handshake_GetServerKeyForPasswordLessRecovery>(
|
|
||||||
8, _omitFieldNames ? '' : 'getServerKeyForPasswordlessRecovery',
|
|
||||||
subBuilder: Handshake_GetServerKeyForPasswordLessRecovery.create)
|
|
||||||
..aOM<Handshake_RegisterPasswordlessNotification>(
|
|
||||||
9, _omitFieldNames ? '' : 'registerPasswordlessNotification',
|
|
||||||
subBuilder: Handshake_RegisterPasswordlessNotification.create)
|
|
||||||
..aOM<Handshake_CheckForPasswordlessNotification>(
|
|
||||||
10, _omitFieldNames ? '' : 'checkForPasswordlessNotification',
|
|
||||||
subBuilder: Handshake_CheckForPasswordlessNotification.create)
|
|
||||||
..hasRequiredFields = false;
|
..hasRequiredFields = false;
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
||||||
|
|
@ -1239,9 +914,6 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
@$pb.TagNumber(5)
|
@$pb.TagNumber(5)
|
||||||
@$pb.TagNumber(6)
|
@$pb.TagNumber(6)
|
||||||
@$pb.TagNumber(7)
|
@$pb.TagNumber(7)
|
||||||
@$pb.TagNumber(8)
|
|
||||||
@$pb.TagNumber(9)
|
|
||||||
@$pb.TagNumber(10)
|
|
||||||
Handshake_Handshake whichHandshake() =>
|
Handshake_Handshake whichHandshake() =>
|
||||||
_Handshake_HandshakeByTag[$_whichOneof(0)]!;
|
_Handshake_HandshakeByTag[$_whichOneof(0)]!;
|
||||||
@$pb.TagNumber(1)
|
@$pb.TagNumber(1)
|
||||||
|
|
@ -1251,9 +923,6 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
@$pb.TagNumber(5)
|
@$pb.TagNumber(5)
|
||||||
@$pb.TagNumber(6)
|
@$pb.TagNumber(6)
|
||||||
@$pb.TagNumber(7)
|
@$pb.TagNumber(7)
|
||||||
@$pb.TagNumber(8)
|
|
||||||
@$pb.TagNumber(9)
|
|
||||||
@$pb.TagNumber(10)
|
|
||||||
void clearHandshake() => $_clearField($_whichOneof(0));
|
void clearHandshake() => $_clearField($_whichOneof(0));
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
@$pb.TagNumber(1)
|
||||||
|
|
@ -1337,51 +1006,6 @@ class Handshake extends $pb.GeneratedMessage {
|
||||||
void clearGetUseridByUsername() => $_clearField(7);
|
void clearGetUseridByUsername() => $_clearField(7);
|
||||||
@$pb.TagNumber(7)
|
@$pb.TagNumber(7)
|
||||||
Handshake_GetUserIdByUsername ensureGetUseridByUsername() => $_ensure(6);
|
Handshake_GetUserIdByUsername ensureGetUseridByUsername() => $_ensure(6);
|
||||||
|
|
||||||
@$pb.TagNumber(8)
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery
|
|
||||||
get getServerKeyForPasswordlessRecovery => $_getN(7);
|
|
||||||
@$pb.TagNumber(8)
|
|
||||||
set getServerKeyForPasswordlessRecovery(
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery value) =>
|
|
||||||
$_setField(8, value);
|
|
||||||
@$pb.TagNumber(8)
|
|
||||||
$core.bool hasGetServerKeyForPasswordlessRecovery() => $_has(7);
|
|
||||||
@$pb.TagNumber(8)
|
|
||||||
void clearGetServerKeyForPasswordlessRecovery() => $_clearField(8);
|
|
||||||
@$pb.TagNumber(8)
|
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery
|
|
||||||
ensureGetServerKeyForPasswordlessRecovery() => $_ensure(7);
|
|
||||||
|
|
||||||
@$pb.TagNumber(9)
|
|
||||||
Handshake_RegisterPasswordlessNotification
|
|
||||||
get registerPasswordlessNotification => $_getN(8);
|
|
||||||
@$pb.TagNumber(9)
|
|
||||||
set registerPasswordlessNotification(
|
|
||||||
Handshake_RegisterPasswordlessNotification value) =>
|
|
||||||
$_setField(9, value);
|
|
||||||
@$pb.TagNumber(9)
|
|
||||||
$core.bool hasRegisterPasswordlessNotification() => $_has(8);
|
|
||||||
@$pb.TagNumber(9)
|
|
||||||
void clearRegisterPasswordlessNotification() => $_clearField(9);
|
|
||||||
@$pb.TagNumber(9)
|
|
||||||
Handshake_RegisterPasswordlessNotification
|
|
||||||
ensureRegisterPasswordlessNotification() => $_ensure(8);
|
|
||||||
|
|
||||||
@$pb.TagNumber(10)
|
|
||||||
Handshake_CheckForPasswordlessNotification
|
|
||||||
get checkForPasswordlessNotification => $_getN(9);
|
|
||||||
@$pb.TagNumber(10)
|
|
||||||
set checkForPasswordlessNotification(
|
|
||||||
Handshake_CheckForPasswordlessNotification value) =>
|
|
||||||
$_setField(10, value);
|
|
||||||
@$pb.TagNumber(10)
|
|
||||||
$core.bool hasCheckForPasswordlessNotification() => $_has(9);
|
|
||||||
@$pb.TagNumber(10)
|
|
||||||
void clearCheckForPasswordlessNotification() => $_clearField(10);
|
|
||||||
@$pb.TagNumber(10)
|
|
||||||
Handshake_CheckForPasswordlessNotification
|
|
||||||
ensureCheckForPasswordlessNotification() => $_ensure(9);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ApplicationData_TextMessage extends $pb.GeneratedMessage {
|
class ApplicationData_TextMessage extends $pb.GeneratedMessage {
|
||||||
|
|
@ -2558,160 +2182,6 @@ class ApplicationData_Deprecated extends $pb.GeneratedMessage {
|
||||||
static ApplicationData_Deprecated? _defaultInstance;
|
static ApplicationData_Deprecated? _defaultInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ApplicationData_RegisterPasswordLessRecovery
|
|
||||||
extends $pb.GeneratedMessage {
|
|
||||||
factory ApplicationData_RegisterPasswordLessRecovery({
|
|
||||||
$core.List<$core.int>? encryptedServerKey,
|
|
||||||
$core.List<$core.int>? pinUnlockToken,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (encryptedServerKey != null)
|
|
||||||
result.encryptedServerKey = encryptedServerKey;
|
|
||||||
if (pinUnlockToken != null) result.pinUnlockToken = pinUnlockToken;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery._();
|
|
||||||
|
|
||||||
factory ApplicationData_RegisterPasswordLessRecovery.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory ApplicationData_RegisterPasswordLessRecovery.fromJson(
|
|
||||||
$core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'ApplicationData.RegisterPasswordLessRecovery',
|
|
||||||
package:
|
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
1, _omitFieldNames ? '' : 'encryptedServerKey', $pb.PbFieldType.OY,
|
|
||||||
protoName: 'encryptedServerKey')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'pinUnlockToken', $pb.PbFieldType.OY,
|
|
||||||
protoName: 'pinUnlockToken')
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery copyWith(
|
|
||||||
void Function(ApplicationData_RegisterPasswordLessRecovery)
|
|
||||||
updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as ApplicationData_RegisterPasswordLessRecovery))
|
|
||||||
as ApplicationData_RegisterPasswordLessRecovery;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static ApplicationData_RegisterPasswordLessRecovery create() =>
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery._();
|
|
||||||
@$core.override
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery createEmptyInstance() =>
|
|
||||||
create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static ApplicationData_RegisterPasswordLessRecovery getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery>(create);
|
|
||||||
static ApplicationData_RegisterPasswordLessRecovery? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.List<$core.int> get encryptedServerKey => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set encryptedServerKey($core.List<$core.int> value) => $_setBytes(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasEncryptedServerKey() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearEncryptedServerKey() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get pinUnlockToken => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set pinUnlockToken($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasPinUnlockToken() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearPinUnlockToken() => $_clearField(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
class ApplicationData_PasswordlessNotification extends $pb.GeneratedMessage {
|
|
||||||
factory ApplicationData_PasswordlessNotification({
|
|
||||||
$core.String? notificationId,
|
|
||||||
$core.List<$core.int>? encryptedMessage,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (notificationId != null) result.notificationId = notificationId;
|
|
||||||
if (encryptedMessage != null) result.encryptedMessage = encryptedMessage;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
ApplicationData_PasswordlessNotification._();
|
|
||||||
|
|
||||||
factory ApplicationData_PasswordlessNotification.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory ApplicationData_PasswordlessNotification.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'ApplicationData.PasswordlessNotification',
|
|
||||||
package:
|
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'client_to_server'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aOS(1, _omitFieldNames ? '' : 'notificationId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'encryptedMessage', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
ApplicationData_PasswordlessNotification clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
ApplicationData_PasswordlessNotification copyWith(
|
|
||||||
void Function(ApplicationData_PasswordlessNotification) updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as ApplicationData_PasswordlessNotification))
|
|
||||||
as ApplicationData_PasswordlessNotification;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static ApplicationData_PasswordlessNotification create() =>
|
|
||||||
ApplicationData_PasswordlessNotification._();
|
|
||||||
@$core.override
|
|
||||||
ApplicationData_PasswordlessNotification createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static ApplicationData_PasswordlessNotification getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
ApplicationData_PasswordlessNotification>(create);
|
|
||||||
static ApplicationData_PasswordlessNotification? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.String get notificationId => $_getSZ(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set notificationId($core.String value) => $_setString(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasNotificationId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearNotificationId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get encryptedMessage => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set encryptedMessage($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasEncryptedMessage() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearEncryptedMessage() => $_clearField(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ApplicationData_ApplicationData {
|
enum ApplicationData_ApplicationData {
|
||||||
textMessage,
|
textMessage,
|
||||||
getUserByUsername,
|
getUserByUsername,
|
||||||
|
|
@ -2739,8 +2209,6 @@ enum ApplicationData_ApplicationData {
|
||||||
ipaForceCheck,
|
ipaForceCheck,
|
||||||
addAdditionalUser,
|
addAdditionalUser,
|
||||||
setLoginToken,
|
setLoginToken,
|
||||||
registerPasswordlessRecovery,
|
|
||||||
passwordlessNotification,
|
|
||||||
notSet
|
notSet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2772,8 +2240,6 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
ApplicationData_IPAForceCheck? ipaForceCheck,
|
ApplicationData_IPAForceCheck? ipaForceCheck,
|
||||||
ApplicationData_AddAdditionalUser? addAdditionalUser,
|
ApplicationData_AddAdditionalUser? addAdditionalUser,
|
||||||
ApplicationData_SetLoginToken? setLoginToken,
|
ApplicationData_SetLoginToken? setLoginToken,
|
||||||
ApplicationData_RegisterPasswordLessRecovery? registerPasswordlessRecovery,
|
|
||||||
ApplicationData_PasswordlessNotification? passwordlessNotification,
|
|
||||||
}) {
|
}) {
|
||||||
final result = create();
|
final result = create();
|
||||||
if (textMessage != null) result.textMessage = textMessage;
|
if (textMessage != null) result.textMessage = textMessage;
|
||||||
|
|
@ -2808,10 +2274,6 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
if (ipaForceCheck != null) result.ipaForceCheck = ipaForceCheck;
|
if (ipaForceCheck != null) result.ipaForceCheck = ipaForceCheck;
|
||||||
if (addAdditionalUser != null) result.addAdditionalUser = addAdditionalUser;
|
if (addAdditionalUser != null) result.addAdditionalUser = addAdditionalUser;
|
||||||
if (setLoginToken != null) result.setLoginToken = setLoginToken;
|
if (setLoginToken != null) result.setLoginToken = setLoginToken;
|
||||||
if (registerPasswordlessRecovery != null)
|
|
||||||
result.registerPasswordlessRecovery = registerPasswordlessRecovery;
|
|
||||||
if (passwordlessNotification != null)
|
|
||||||
result.passwordlessNotification = passwordlessNotification;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2852,8 +2314,6 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
28: ApplicationData_ApplicationData.ipaForceCheck,
|
28: ApplicationData_ApplicationData.ipaForceCheck,
|
||||||
29: ApplicationData_ApplicationData.addAdditionalUser,
|
29: ApplicationData_ApplicationData.addAdditionalUser,
|
||||||
30: ApplicationData_ApplicationData.setLoginToken,
|
30: ApplicationData_ApplicationData.setLoginToken,
|
||||||
31: ApplicationData_ApplicationData.registerPasswordlessRecovery,
|
|
||||||
32: ApplicationData_ApplicationData.passwordlessNotification,
|
|
||||||
0: ApplicationData_ApplicationData.notSet
|
0: ApplicationData_ApplicationData.notSet
|
||||||
};
|
};
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
||||||
|
|
@ -2887,9 +2347,7 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
27,
|
27,
|
||||||
28,
|
28,
|
||||||
29,
|
29,
|
||||||
30,
|
30
|
||||||
31,
|
|
||||||
32
|
|
||||||
])
|
])
|
||||||
..aOM<ApplicationData_TextMessage>(1, _omitFieldNames ? '' : 'textMessage',
|
..aOM<ApplicationData_TextMessage>(1, _omitFieldNames ? '' : 'textMessage',
|
||||||
protoName: 'textMessage',
|
protoName: 'textMessage',
|
||||||
|
|
@ -2981,12 +2439,6 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
..aOM<ApplicationData_SetLoginToken>(
|
..aOM<ApplicationData_SetLoginToken>(
|
||||||
30, _omitFieldNames ? '' : 'setLoginToken',
|
30, _omitFieldNames ? '' : 'setLoginToken',
|
||||||
subBuilder: ApplicationData_SetLoginToken.create)
|
subBuilder: ApplicationData_SetLoginToken.create)
|
||||||
..aOM<ApplicationData_RegisterPasswordLessRecovery>(
|
|
||||||
31, _omitFieldNames ? '' : 'registerPasswordlessRecovery',
|
|
||||||
subBuilder: ApplicationData_RegisterPasswordLessRecovery.create)
|
|
||||||
..aOM<ApplicationData_PasswordlessNotification>(
|
|
||||||
32, _omitFieldNames ? '' : 'passwordlessNotification',
|
|
||||||
subBuilder: ApplicationData_PasswordlessNotification.create)
|
|
||||||
..hasRequiredFields = false;
|
..hasRequiredFields = false;
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
||||||
|
|
@ -3034,8 +2486,6 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
@$pb.TagNumber(28)
|
@$pb.TagNumber(28)
|
||||||
@$pb.TagNumber(29)
|
@$pb.TagNumber(29)
|
||||||
@$pb.TagNumber(30)
|
@$pb.TagNumber(30)
|
||||||
@$pb.TagNumber(31)
|
|
||||||
@$pb.TagNumber(32)
|
|
||||||
ApplicationData_ApplicationData whichApplicationData() =>
|
ApplicationData_ApplicationData whichApplicationData() =>
|
||||||
_ApplicationData_ApplicationDataByTag[$_whichOneof(0)]!;
|
_ApplicationData_ApplicationDataByTag[$_whichOneof(0)]!;
|
||||||
@$pb.TagNumber(1)
|
@$pb.TagNumber(1)
|
||||||
|
|
@ -3064,8 +2514,6 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
@$pb.TagNumber(28)
|
@$pb.TagNumber(28)
|
||||||
@$pb.TagNumber(29)
|
@$pb.TagNumber(29)
|
||||||
@$pb.TagNumber(30)
|
@$pb.TagNumber(30)
|
||||||
@$pb.TagNumber(31)
|
|
||||||
@$pb.TagNumber(32)
|
|
||||||
void clearApplicationData() => $_clearField($_whichOneof(0));
|
void clearApplicationData() => $_clearField($_whichOneof(0));
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
@$pb.TagNumber(1)
|
||||||
|
|
@ -3371,36 +2819,6 @@ class ApplicationData extends $pb.GeneratedMessage {
|
||||||
void clearSetLoginToken() => $_clearField(30);
|
void clearSetLoginToken() => $_clearField(30);
|
||||||
@$pb.TagNumber(30)
|
@$pb.TagNumber(30)
|
||||||
ApplicationData_SetLoginToken ensureSetLoginToken() => $_ensure(25);
|
ApplicationData_SetLoginToken ensureSetLoginToken() => $_ensure(25);
|
||||||
|
|
||||||
@$pb.TagNumber(31)
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery
|
|
||||||
get registerPasswordlessRecovery => $_getN(26);
|
|
||||||
@$pb.TagNumber(31)
|
|
||||||
set registerPasswordlessRecovery(
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery value) =>
|
|
||||||
$_setField(31, value);
|
|
||||||
@$pb.TagNumber(31)
|
|
||||||
$core.bool hasRegisterPasswordlessRecovery() => $_has(26);
|
|
||||||
@$pb.TagNumber(31)
|
|
||||||
void clearRegisterPasswordlessRecovery() => $_clearField(31);
|
|
||||||
@$pb.TagNumber(31)
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery
|
|
||||||
ensureRegisterPasswordlessRecovery() => $_ensure(26);
|
|
||||||
|
|
||||||
@$pb.TagNumber(32)
|
|
||||||
ApplicationData_PasswordlessNotification get passwordlessNotification =>
|
|
||||||
$_getN(27);
|
|
||||||
@$pb.TagNumber(32)
|
|
||||||
set passwordlessNotification(
|
|
||||||
ApplicationData_PasswordlessNotification value) =>
|
|
||||||
$_setField(32, value);
|
|
||||||
@$pb.TagNumber(32)
|
|
||||||
$core.bool hasPasswordlessNotification() => $_has(27);
|
|
||||||
@$pb.TagNumber(32)
|
|
||||||
void clearPasswordlessNotification() => $_clearField(32);
|
|
||||||
@$pb.TagNumber(32)
|
|
||||||
ApplicationData_PasswordlessNotification ensurePasswordlessNotification() =>
|
|
||||||
$_ensure(27);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Response_PreKey extends $pb.GeneratedMessage {
|
class Response_PreKey extends $pb.GeneratedMessage {
|
||||||
|
|
|
||||||
|
|
@ -152,33 +152,6 @@ const Handshake$json = {
|
||||||
'9': 0,
|
'9': 0,
|
||||||
'10': 'getUseridByUsername'
|
'10': 'getUseridByUsername'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'1': 'get_server_key_for_passwordless_recovery',
|
|
||||||
'3': 8,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.client_to_server.Handshake.GetServerKeyForPasswordLessRecovery',
|
|
||||||
'9': 0,
|
|
||||||
'10': 'getServerKeyForPasswordlessRecovery'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'register_passwordless_notification',
|
|
||||||
'3': 9,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.client_to_server.Handshake.RegisterPasswordlessNotification',
|
|
||||||
'9': 0,
|
|
||||||
'10': 'registerPasswordlessNotification'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'check_for_passwordless_notification',
|
|
||||||
'3': 10,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.client_to_server.Handshake.CheckForPasswordlessNotification',
|
|
||||||
'9': 0,
|
|
||||||
'10': 'checkForPasswordlessNotification'
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
'3': [
|
'3': [
|
||||||
Handshake_RequestPOW$json,
|
Handshake_RequestPOW$json,
|
||||||
|
|
@ -187,10 +160,7 @@ const Handshake$json = {
|
||||||
Handshake_GetUserIdByUsername$json,
|
Handshake_GetUserIdByUsername$json,
|
||||||
Handshake_GetAuthToken$json,
|
Handshake_GetAuthToken$json,
|
||||||
Handshake_Authenticate$json,
|
Handshake_Authenticate$json,
|
||||||
Handshake_AuthenticateWithLoginToken$json,
|
Handshake_AuthenticateWithLoginToken$json
|
||||||
Handshake_GetServerKeyForPasswordLessRecovery$json,
|
|
||||||
Handshake_RegisterPasswordlessNotification$json,
|
|
||||||
Handshake_CheckForPasswordlessNotification$json
|
|
||||||
],
|
],
|
||||||
'8': [
|
'8': [
|
||||||
{'1': 'Handshake'},
|
{'1': 'Handshake'},
|
||||||
|
|
@ -333,95 +303,6 @@ const Handshake_AuthenticateWithLoginToken$json = {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
@$core.Deprecated('Use handshakeDescriptor instead')
|
|
||||||
const Handshake_GetServerKeyForPasswordLessRecovery$json = {
|
|
||||||
'1': 'GetServerKeyForPasswordLessRecovery',
|
|
||||||
'2': [
|
|
||||||
{'1': 'user_id', '3': 1, '4': 1, '5': 3, '10': 'userId'},
|
|
||||||
{
|
|
||||||
'1': 'encrypted_server_key_none',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'encryptedServerKeyNone'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'pin_unlock_token',
|
|
||||||
'3': 3,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 0,
|
|
||||||
'10': 'pinUnlockToken',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'pin_protection_key',
|
|
||||||
'3': 4,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 1,
|
|
||||||
'10': 'pinProtectionKey',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{'1': 'email', '3': 5, '4': 1, '5': 9, '9': 2, '10': 'email', '17': true},
|
|
||||||
],
|
|
||||||
'8': [
|
|
||||||
{'1': '_pin_unlock_token'},
|
|
||||||
{'1': '_pin_protection_key'},
|
|
||||||
{'1': '_email'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use handshakeDescriptor instead')
|
|
||||||
const Handshake_RegisterPasswordlessNotification$json = {
|
|
||||||
'1': 'RegisterPasswordlessNotification',
|
|
||||||
'2': [
|
|
||||||
{'1': 'notification_id', '3': 1, '4': 1, '5': 9, '10': 'notificationId'},
|
|
||||||
{
|
|
||||||
'1': 'download_auth_token',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'downloadAuthToken'
|
|
||||||
},
|
|
||||||
{'1': 'lang_code', '3': 3, '4': 1, '5': 9, '10': 'langCode'},
|
|
||||||
{
|
|
||||||
'1': 'google_fcm',
|
|
||||||
'3': 4,
|
|
||||||
'4': 1,
|
|
||||||
'5': 9,
|
|
||||||
'9': 0,
|
|
||||||
'10': 'googleFcm',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'8': [
|
|
||||||
{'1': '_google_fcm'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use handshakeDescriptor instead')
|
|
||||||
const Handshake_CheckForPasswordlessNotification$json = {
|
|
||||||
'1': 'CheckForPasswordlessNotification',
|
|
||||||
'2': [
|
|
||||||
{'1': 'notification_id', '3': 1, '4': 1, '5': 9, '10': 'notificationId'},
|
|
||||||
{
|
|
||||||
'1': 'download_auth_token',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'downloadAuthToken'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'already_received_message_ids',
|
|
||||||
'3': 3,
|
|
||||||
'4': 3,
|
|
||||||
'5': 3,
|
|
||||||
'10': 'alreadyReceivedMessageIds'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `Handshake`. Decode as a `google.protobuf.DescriptorProto`.
|
/// Descriptor for `Handshake`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
final $typed_data.Uint8List handshakeDescriptor = $convert.base64Decode(
|
final $typed_data.Uint8List handshakeDescriptor = $convert.base64Decode(
|
||||||
'CglIYW5kc2hha2USQgoIcmVnaXN0ZXIYASABKAsyJC5jbGllbnRfdG9fc2VydmVyLkhhbmRzaG'
|
'CglIYW5kc2hha2USQgoIcmVnaXN0ZXIYASABKAsyJC5jbGllbnRfdG9fc2VydmVyLkhhbmRzaG'
|
||||||
|
|
@ -435,47 +316,26 @@ final $typed_data.Uint8List handshakeDescriptor = $convert.base64Decode(
|
||||||
'MjYuY2xpZW50X3RvX3NlcnZlci5IYW5kc2hha2UuQXV0aGVudGljYXRlV2l0aExvZ2luVG9rZW'
|
'MjYuY2xpZW50X3RvX3NlcnZlci5IYW5kc2hha2UuQXV0aGVudGljYXRlV2l0aExvZ2luVG9rZW'
|
||||||
'5IAFIaYXV0aGVudGljYXRlV2l0aExvZ2luVG9rZW4SZgoWZ2V0X3VzZXJpZF9ieV91c2VybmFt'
|
'5IAFIaYXV0aGVudGljYXRlV2l0aExvZ2luVG9rZW4SZgoWZ2V0X3VzZXJpZF9ieV91c2VybmFt'
|
||||||
'ZRgHIAEoCzIvLmNsaWVudF90b19zZXJ2ZXIuSGFuZHNoYWtlLkdldFVzZXJJZEJ5VXNlcm5hbW'
|
'ZRgHIAEoCzIvLmNsaWVudF90b19zZXJ2ZXIuSGFuZHNoYWtlLkdldFVzZXJJZEJ5VXNlcm5hbW'
|
||||||
'VIAFITZ2V0VXNlcmlkQnlVc2VybmFtZRKYAQooZ2V0X3NlcnZlcl9rZXlfZm9yX3Bhc3N3b3Jk'
|
'VIAFITZ2V0VXNlcmlkQnlVc2VybmFtZRoMCgpSZXF1ZXN0UE9XGsoDCghSZWdpc3RlchIaCgh1'
|
||||||
'bGVzc19yZWNvdmVyeRgIIAEoCzI/LmNsaWVudF90b19zZXJ2ZXIuSGFuZHNoYWtlLkdldFNlcn'
|
'c2VybmFtZRgBIAEoCVIIdXNlcm5hbWUSJAoLaW52aXRlX2NvZGUYAiABKAlIAFIKaW52aXRlQ2'
|
||||||
'ZlcktleUZvclBhc3N3b3JkTGVzc1JlY292ZXJ5SABSI2dldFNlcnZlcktleUZvclBhc3N3b3Jk'
|
'9kZYgBARIuChNwdWJsaWNfaWRlbnRpdHlfa2V5GAMgASgMUhFwdWJsaWNJZGVudGl0eUtleRIj'
|
||||||
'bGVzc1JlY292ZXJ5EowBCiJyZWdpc3Rlcl9wYXNzd29yZGxlc3Nfbm90aWZpY2F0aW9uGAkgAS'
|
'Cg1zaWduZWRfcHJla2V5GAQgASgMUgxzaWduZWRQcmVrZXkSNgoXc2lnbmVkX3ByZWtleV9zaW'
|
||||||
'gLMjwuY2xpZW50X3RvX3NlcnZlci5IYW5kc2hha2UuUmVnaXN0ZXJQYXNzd29yZGxlc3NOb3Rp'
|
'duYXR1cmUYBSABKAxSFXNpZ25lZFByZWtleVNpZ25hdHVyZRIoChBzaWduZWRfcHJla2V5X2lk'
|
||||||
'ZmljYXRpb25IAFIgcmVnaXN0ZXJQYXNzd29yZGxlc3NOb3RpZmljYXRpb24SjQEKI2NoZWNrX2'
|
'GAYgASgDUg5zaWduZWRQcmVrZXlJZBInCg9yZWdpc3RyYXRpb25faWQYByABKANSDnJlZ2lzdH'
|
||||||
'Zvcl9wYXNzd29yZGxlc3Nfbm90aWZpY2F0aW9uGAogASgLMjwuY2xpZW50X3RvX3NlcnZlci5I'
|
'JhdGlvbklkEhUKBmlzX2lvcxgIIAEoCFIFaXNJb3MSGwoJbGFuZ19jb2RlGAkgASgJUghsYW5n'
|
||||||
'YW5kc2hha2UuQ2hlY2tGb3JQYXNzd29yZGxlc3NOb3RpZmljYXRpb25IAFIgY2hlY2tGb3JQYX'
|
'Q29kZRIiCg1wcm9vZl9vZl93b3JrGAogASgDUgtwcm9vZk9mV29yaxIkCgtsb2dpbl90b2tlbh'
|
||||||
'Nzd29yZGxlc3NOb3RpZmljYXRpb24aDAoKUmVxdWVzdFBPVxrKAwoIUmVnaXN0ZXISGgoIdXNl'
|
'gLIAEoDEgBUgpsb2dpblRva2VuiAEBQg4KDF9pbnZpdGVfY29kZUIOCgxfbG9naW5fdG9rZW4a'
|
||||||
'cm5hbWUYASABKAlSCHVzZXJuYW1lEiQKC2ludml0ZV9jb2RlGAIgASgJSABSCmludml0ZUNvZG'
|
'EgoQR2V0QXV0aENoYWxsZW5nZRoxChNHZXRVc2VySWRCeVVzZXJuYW1lEhoKCHVzZXJuYW1lGA'
|
||||||
'WIAQESLgoTcHVibGljX2lkZW50aXR5X2tleRgDIAEoDFIRcHVibGljSWRlbnRpdHlLZXkSIwoN'
|
'EgASgJUgh1c2VybmFtZRpDCgxHZXRBdXRoVG9rZW4SFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklk'
|
||||||
'c2lnbmVkX3ByZWtleRgEIAEoDFIMc2lnbmVkUHJla2V5EjYKF3NpZ25lZF9wcmVrZXlfc2lnbm'
|
'EhoKCHJlc3BvbnNlGAIgASgMUghyZXNwb25zZRroAQoMQXV0aGVudGljYXRlEhcKB3VzZXJfaW'
|
||||||
'F0dXJlGAUgASgMUhVzaWduZWRQcmVrZXlTaWduYXR1cmUSKAoQc2lnbmVkX3ByZWtleV9pZBgG'
|
'QYASABKANSBnVzZXJJZBIdCgphdXRoX3Rva2VuGAIgASgMUglhdXRoVG9rZW4SJAoLYXBwX3Zl'
|
||||||
'IAEoA1IOc2lnbmVkUHJla2V5SWQSJwoPcmVnaXN0cmF0aW9uX2lkGAcgASgDUg5yZWdpc3RyYX'
|
'cnNpb24YAyABKAlIAFIKYXBwVmVyc2lvbogBARIgCglkZXZpY2VfaWQYBCABKANIAVIIZGV2aW'
|
||||||
'Rpb25JZBIVCgZpc19pb3MYCCABKAhSBWlzSW9zEhsKCWxhbmdfY29kZRgJIAEoCVIIbGFuZ0Nv'
|
'NlSWSIAQESKAoNaW5fYmFja2dyb3VuZBgFIAEoCEgCUgxpbkJhY2tncm91bmSIAQFCDgoMX2Fw'
|
||||||
'ZGUSIgoNcHJvb2Zfb2Zfd29yaxgKIAEoA1ILcHJvb2ZPZldvcmsSJAoLbG9naW5fdG9rZW4YCy'
|
'cF92ZXJzaW9uQgwKCl9kZXZpY2VfaWRCEAoOX2luX2JhY2tncm91bmQaxgEKGkF1dGhlbnRpY2'
|
||||||
'ABKAxIAVIKbG9naW5Ub2tlbogBAUIOCgxfaW52aXRlX2NvZGVCDgoMX2xvZ2luX3Rva2VuGhIK'
|
'F0ZVdpdGhMb2dpblRva2VuEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBIsChJzZWNyZXRfbG9n'
|
||||||
'EEdldEF1dGhDaGFsbGVuZ2UaMQoTR2V0VXNlcklkQnlVc2VybmFtZRIaCgh1c2VybmFtZRgBIA'
|
'aW5fdG9rZW4YAiABKAxSEHNlY3JldExvZ2luVG9rZW4SHwoLYXBwX3ZlcnNpb24YAyABKAlSCm'
|
||||||
'EoCVIIdXNlcm5hbWUaQwoMR2V0QXV0aFRva2VuEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBIa'
|
'FwcFZlcnNpb24SGwoJZGV2aWNlX2lkGAQgASgDUghkZXZpY2VJZBIjCg1pbl9iYWNrZ3JvdW5k'
|
||||||
'CghyZXNwb25zZRgCIAEoDFIIcmVzcG9uc2Ua6AEKDEF1dGhlbnRpY2F0ZRIXCgd1c2VyX2lkGA'
|
'GAUgASgIUgxpbkJhY2tncm91bmRCCwoJSGFuZHNoYWtl');
|
||||||
'EgASgDUgZ1c2VySWQSHQoKYXV0aF90b2tlbhgCIAEoDFIJYXV0aFRva2VuEiQKC2FwcF92ZXJz'
|
|
||||||
'aW9uGAMgASgJSABSCmFwcFZlcnNpb26IAQESIAoJZGV2aWNlX2lkGAQgASgDSAFSCGRldmljZU'
|
|
||||||
'lkiAEBEigKDWluX2JhY2tncm91bmQYBSABKAhIAlIMaW5CYWNrZ3JvdW5kiAEBQg4KDF9hcHBf'
|
|
||||||
'dmVyc2lvbkIMCgpfZGV2aWNlX2lkQhAKDl9pbl9iYWNrZ3JvdW5kGsYBChpBdXRoZW50aWNhdG'
|
|
||||||
'VXaXRoTG9naW5Ub2tlbhIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQSLAoSc2VjcmV0X2xvZ2lu'
|
|
||||||
'X3Rva2VuGAIgASgMUhBzZWNyZXRMb2dpblRva2VuEh8KC2FwcF92ZXJzaW9uGAMgASgJUgphcH'
|
|
||||||
'BWZXJzaW9uEhsKCWRldmljZV9pZBgEIAEoA1IIZGV2aWNlSWQSIwoNaW5fYmFja2dyb3VuZBgF'
|
|
||||||
'IAEoCFIMaW5CYWNrZ3JvdW5kGqwCCiNHZXRTZXJ2ZXJLZXlGb3JQYXNzd29yZExlc3NSZWNvdm'
|
|
||||||
'VyeRIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQSOQoZZW5jcnlwdGVkX3NlcnZlcl9rZXlfbm9u'
|
|
||||||
'ZRgCIAEoDFIWZW5jcnlwdGVkU2VydmVyS2V5Tm9uZRItChBwaW5fdW5sb2NrX3Rva2VuGAMgAS'
|
|
||||||
'gMSABSDnBpblVubG9ja1Rva2VuiAEBEjEKEnBpbl9wcm90ZWN0aW9uX2tleRgEIAEoDEgBUhBw'
|
|
||||||
'aW5Qcm90ZWN0aW9uS2V5iAEBEhkKBWVtYWlsGAUgASgJSAJSBWVtYWlsiAEBQhMKEV9waW5fdW'
|
|
||||||
'5sb2NrX3Rva2VuQhUKE19waW5fcHJvdGVjdGlvbl9rZXlCCAoGX2VtYWlsGssBCiBSZWdpc3Rl'
|
|
||||||
'clBhc3N3b3JkbGVzc05vdGlmaWNhdGlvbhInCg9ub3RpZmljYXRpb25faWQYASABKAlSDm5vdG'
|
|
||||||
'lmaWNhdGlvbklkEi4KE2Rvd25sb2FkX2F1dGhfdG9rZW4YAiABKAxSEWRvd25sb2FkQXV0aFRv'
|
|
||||||
'a2VuEhsKCWxhbmdfY29kZRgDIAEoCVIIbGFuZ0NvZGUSIgoKZ29vZ2xlX2ZjbRgEIAEoCUgAUg'
|
|
||||||
'lnb29nbGVGY22IAQFCDQoLX2dvb2dsZV9mY20avAEKIENoZWNrRm9yUGFzc3dvcmRsZXNzTm90'
|
|
||||||
'aWZpY2F0aW9uEicKD25vdGlmaWNhdGlvbl9pZBgBIAEoCVIObm90aWZpY2F0aW9uSWQSLgoTZG'
|
|
||||||
'93bmxvYWRfYXV0aF90b2tlbhgCIAEoDFIRZG93bmxvYWRBdXRoVG9rZW4SPwocYWxyZWFkeV9y'
|
|
||||||
'ZWNlaXZlZF9tZXNzYWdlX2lkcxgDIAMoA1IZYWxyZWFkeVJlY2VpdmVkTWVzc2FnZUlkc0ILCg'
|
|
||||||
'lIYW5kc2hha2U=');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use applicationDataDescriptor instead')
|
@$core.Deprecated('Use applicationDataDescriptor instead')
|
||||||
const ApplicationData$json = {
|
const ApplicationData$json = {
|
||||||
|
|
@ -715,24 +575,6 @@ const ApplicationData$json = {
|
||||||
'9': 0,
|
'9': 0,
|
||||||
'10': 'setLoginToken'
|
'10': 'setLoginToken'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'1': 'register_passwordless_recovery',
|
|
||||||
'3': 31,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.client_to_server.ApplicationData.RegisterPasswordLessRecovery',
|
|
||||||
'9': 0,
|
|
||||||
'10': 'registerPasswordlessRecovery'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'passwordless_notification',
|
|
||||||
'3': 32,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.client_to_server.ApplicationData.PasswordlessNotification',
|
|
||||||
'9': 0,
|
|
||||||
'10': 'passwordlessNotification'
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
'3': [
|
'3': [
|
||||||
ApplicationData_TextMessage$json,
|
ApplicationData_TextMessage$json,
|
||||||
|
|
@ -754,9 +596,7 @@ const ApplicationData$json = {
|
||||||
ApplicationData_DeleteAccount$json,
|
ApplicationData_DeleteAccount$json,
|
||||||
ApplicationData_AddAdditionalUser$json,
|
ApplicationData_AddAdditionalUser$json,
|
||||||
ApplicationData_SetLoginToken$json,
|
ApplicationData_SetLoginToken$json,
|
||||||
ApplicationData_Deprecated$json,
|
ApplicationData_Deprecated$json
|
||||||
ApplicationData_RegisterPasswordLessRecovery$json,
|
|
||||||
ApplicationData_PasswordlessNotification$json
|
|
||||||
],
|
],
|
||||||
'8': [
|
'8': [
|
||||||
{'1': 'ApplicationData'},
|
{'1': 'ApplicationData'},
|
||||||
|
|
@ -935,47 +775,6 @@ const ApplicationData_Deprecated$json = {
|
||||||
'1': 'Deprecated',
|
'1': 'Deprecated',
|
||||||
};
|
};
|
||||||
|
|
||||||
@$core.Deprecated('Use applicationDataDescriptor instead')
|
|
||||||
const ApplicationData_RegisterPasswordLessRecovery$json = {
|
|
||||||
'1': 'RegisterPasswordLessRecovery',
|
|
||||||
'2': [
|
|
||||||
{
|
|
||||||
'1': 'encryptedServerKey',
|
|
||||||
'3': 1,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'encryptedServerKey'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'pinUnlockToken',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 0,
|
|
||||||
'10': 'pinUnlockToken',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'8': [
|
|
||||||
{'1': '_pinUnlockToken'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use applicationDataDescriptor instead')
|
|
||||||
const ApplicationData_PasswordlessNotification$json = {
|
|
||||||
'1': 'PasswordlessNotification',
|
|
||||||
'2': [
|
|
||||||
{'1': 'notification_id', '3': 1, '4': 1, '5': 9, '10': 'notificationId'},
|
|
||||||
{
|
|
||||||
'1': 'encrypted_message',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'encryptedMessage'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `ApplicationData`. Decode as a `google.protobuf.DescriptorProto`.
|
/// Descriptor for `ApplicationData`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
|
final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
|
||||||
'Cg9BcHBsaWNhdGlvbkRhdGESUQoLdGV4dE1lc3NhZ2UYASABKAsyLS5jbGllbnRfdG9fc2Vydm'
|
'Cg9BcHBsaWNhdGlvbkRhdGESUQoLdGV4dE1lc3NhZ2UYASABKAsyLS5jbGllbnRfdG9fc2Vydm'
|
||||||
|
|
@ -1021,36 +820,27 @@ final $typed_data.Uint8List applicationDataDescriptor = $convert.base64Decode(
|
||||||
'dmVBZGRpdGlvbmFsVXNlchJjChFhZGRBZGRpdGlvbmFsVXNlchgdIAEoCzIzLmNsaWVudF90b1'
|
'dmVBZGRpdGlvbmFsVXNlchJjChFhZGRBZGRpdGlvbmFsVXNlchgdIAEoCzIzLmNsaWVudF90b1'
|
||||||
'9zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkFkZEFkZGl0aW9uYWxVc2VySABSEWFkZEFkZGl0aW9u'
|
'9zZXJ2ZXIuQXBwbGljYXRpb25EYXRhLkFkZEFkZGl0aW9uYWxVc2VySABSEWFkZEFkZGl0aW9u'
|
||||||
'YWxVc2VyElkKD3NldF9sb2dpbl90b2tlbhgeIAEoCzIvLmNsaWVudF90b19zZXJ2ZXIuQXBwbG'
|
'YWxVc2VyElkKD3NldF9sb2dpbl90b2tlbhgeIAEoCzIvLmNsaWVudF90b19zZXJ2ZXIuQXBwbG'
|
||||||
'ljYXRpb25EYXRhLlNldExvZ2luVG9rZW5IAFINc2V0TG9naW5Ub2tlbhKGAQoecmVnaXN0ZXJf'
|
'ljYXRpb25EYXRhLlNldExvZ2luVG9rZW5IAFINc2V0TG9naW5Ub2tlbhpqCgtUZXh0TWVzc2Fn'
|
||||||
'cGFzc3dvcmRsZXNzX3JlY292ZXJ5GB8gASgLMj4uY2xpZW50X3RvX3NlcnZlci5BcHBsaWNhdG'
|
'ZRIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQSEgoEYm9keRgDIAEoDFIEYm9keRIgCglwdXNoX2'
|
||||||
'lvbkRhdGEuUmVnaXN0ZXJQYXNzd29yZExlc3NSZWNvdmVyeUgAUhxyZWdpc3RlclBhc3N3b3Jk'
|
'RhdGEYBCABKAxIAFIIcHVzaERhdGGIAQFCDAoKX3B1c2hfZGF0YRovChFHZXRVc2VyQnlVc2Vy'
|
||||||
'bGVzc1JlY292ZXJ5EnkKGXBhc3N3b3JkbGVzc19ub3RpZmljYXRpb24YICABKAsyOi5jbGllbn'
|
'bmFtZRIaCgh1c2VybmFtZRgBIAEoCVIIdXNlcm5hbWUaLAoOQ2hhbmdlVXNlcm5hbWUSGgoIdX'
|
||||||
'RfdG9fc2VydmVyLkFwcGxpY2F0aW9uRGF0YS5QYXNzd29yZGxlc3NOb3RpZmljYXRpb25IAFIY'
|
'Nlcm5hbWUYASABKAlSCHVzZXJuYW1lGjUKFFVwZGF0ZUdvb2dsZUZjbVRva2VuEh0KCmdvb2ds'
|
||||||
'cGFzc3dvcmRsZXNzTm90aWZpY2F0aW9uGmoKC1RleHRNZXNzYWdlEhcKB3VzZXJfaWQYASABKA'
|
'ZV9mY20YASABKAlSCWdvb2dsZUZjbRomCgtHZXRVc2VyQnlJZBIXCgd1c2VyX2lkGAEgASgDUg'
|
||||||
'NSBnVzZXJJZBISCgRib2R5GAMgASgMUgRib2R5EiAKCXB1c2hfZGF0YRgEIAEoDEgAUghwdXNo'
|
'Z1c2VySWQaEwoRR2V0QXZhaWxhYmxlUGxhbnMaFwoVR2V0QWRkQWNjb3VudHNJbnZpdGVzGhUK'
|
||||||
'RGF0YYgBAUIMCgpfcHVzaF9kYXRhGi8KEUdldFVzZXJCeVVzZXJuYW1lEhoKCHVzZXJuYW1lGA'
|
'E0dldEN1cnJlbnRQbGFuSW5mb3MaLwoUUmVtb3ZlQWRkaXRpb25hbFVzZXISFwoHdXNlcl9pZB'
|
||||||
'EgASgJUgh1c2VybmFtZRosCg5DaGFuZ2VVc2VybmFtZRIaCgh1c2VybmFtZRgBIAEoCVIIdXNl'
|
'gBIAEoA1IGdXNlcklkGi0KEkdldFByZWtleXNCeVVzZXJJZBIXCgd1c2VyX2lkGAEgASgDUgZ1'
|
||||||
'cm5hbWUaNQoUVXBkYXRlR29vZ2xlRmNtVG9rZW4SHQoKZ29vZ2xlX2ZjbRgBIAEoCVIJZ29vZ2'
|
'c2VySWQaMgoXR2V0U2lnbmVkUHJlS2V5QnlVc2VySWQSFwoHdXNlcl9pZBgBIAEoA1IGdXNlck'
|
||||||
'xlRmNtGiYKC0dldFVzZXJCeUlkEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBoTChFHZXRBdmFp'
|
'lkGpsBChJVcGRhdGVTaWduZWRQcmVLZXkSKAoQc2lnbmVkX3ByZWtleV9pZBgBIAEoA1IOc2ln'
|
||||||
'bGFibGVQbGFucxoXChVHZXRBZGRBY2NvdW50c0ludml0ZXMaFQoTR2V0Q3VycmVudFBsYW5Jbm'
|
'bmVkUHJla2V5SWQSIwoNc2lnbmVkX3ByZWtleRgCIAEoDFIMc2lnbmVkUHJla2V5EjYKF3NpZ2'
|
||||||
'ZvcxovChRSZW1vdmVBZGRpdGlvbmFsVXNlchIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQaLQoS'
|
'5lZF9wcmVrZXlfc2lnbmF0dXJlGAMgASgMUhVzaWduZWRQcmVrZXlTaWduYXR1cmUaNQoMRG93'
|
||||||
'R2V0UHJla2V5c0J5VXNlcklkEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBoyChdHZXRTaWduZW'
|
'bmxvYWREb25lEiUKDmRvd25sb2FkX3Rva2VuGAEgASgMUg1kb3dubG9hZFRva2VuGk4KClJlcG'
|
||||||
'RQcmVLZXlCeVVzZXJJZBIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQamwEKElVwZGF0ZVNpZ25l'
|
'9ydFVzZXISKAoQcmVwb3J0ZWRfdXNlcl9pZBgBIAEoA1IOcmVwb3J0ZWRVc2VySWQSFgoGcmVh'
|
||||||
'ZFByZUtleRIoChBzaWduZWRfcHJla2V5X2lkGAEgASgDUg5zaWduZWRQcmVrZXlJZBIjCg1zaW'
|
'c29uGAIgASgJUgZyZWFzb24acQoLSVBBUHVyY2hhc2USHQoKcHJvZHVjdF9pZBgBIAEoCVIJcH'
|
||||||
'duZWRfcHJla2V5GAIgASgMUgxzaWduZWRQcmVrZXkSNgoXc2lnbmVkX3ByZWtleV9zaWduYXR1'
|
'JvZHVjdElkEhYKBnNvdXJjZRgCIAEoCVIGc291cmNlEisKEXZlcmlmaWNhdGlvbl9kYXRhGAMg'
|
||||||
'cmUYAyABKAxSFXNpZ25lZFByZWtleVNpZ25hdHVyZRo1CgxEb3dubG9hZERvbmUSJQoOZG93bm'
|
'ASgJUhB2ZXJpZmljYXRpb25EYXRhGg8KDUlQQUZvcmNlQ2hlY2saDwoNRGVsZXRlQWNjb3VudB'
|
||||||
'xvYWRfdG9rZW4YASABKAxSDWRvd25sb2FkVG9rZW4aTgoKUmVwb3J0VXNlchIoChByZXBvcnRl'
|
'osChFBZGRBZGRpdGlvbmFsVXNlchIXCgd1c2VyX2lkGAEgASgDUgZ1c2VySWQaMAoNU2V0TG9n'
|
||||||
'ZF91c2VyX2lkGAEgASgDUg5yZXBvcnRlZFVzZXJJZBIWCgZyZWFzb24YAiABKAlSBnJlYXNvbh'
|
'aW5Ub2tlbhIfCgtsb2dpbl90b2tlbhgBIAEoDFIKbG9naW5Ub2tlbhoMCgpEZXByZWNhdGVkQh'
|
||||||
'pxCgtJUEFQdXJjaGFzZRIdCgpwcm9kdWN0X2lkGAEgASgJUglwcm9kdWN0SWQSFgoGc291cmNl'
|
'EKD0FwcGxpY2F0aW9uRGF0YQ==');
|
||||||
'GAIgASgJUgZzb3VyY2USKwoRdmVyaWZpY2F0aW9uX2RhdGEYAyABKAlSEHZlcmlmaWNhdGlvbk'
|
|
||||||
'RhdGEaDwoNSVBBRm9yY2VDaGVjaxoPCg1EZWxldGVBY2NvdW50GiwKEUFkZEFkZGl0aW9uYWxV'
|
|
||||||
'c2VyEhcKB3VzZXJfaWQYASABKANSBnVzZXJJZBowCg1TZXRMb2dpblRva2VuEh8KC2xvZ2luX3'
|
|
||||||
'Rva2VuGAEgASgMUgpsb2dpblRva2VuGgwKCkRlcHJlY2F0ZWQajgEKHFJlZ2lzdGVyUGFzc3dv'
|
|
||||||
'cmRMZXNzUmVjb3ZlcnkSLgoSZW5jcnlwdGVkU2VydmVyS2V5GAEgASgMUhJlbmNyeXB0ZWRTZX'
|
|
||||||
'J2ZXJLZXkSKwoOcGluVW5sb2NrVG9rZW4YAiABKAxIAFIOcGluVW5sb2NrVG9rZW6IAQFCEQoP'
|
|
||||||
'X3BpblVubG9ja1Rva2VuGnAKGFBhc3N3b3JkbGVzc05vdGlmaWNhdGlvbhInCg9ub3RpZmljYX'
|
|
||||||
'Rpb25faWQYASABKAlSDm5vdGlmaWNhdGlvbklkEisKEWVuY3J5cHRlZF9tZXNzYWdlGAIgASgM'
|
|
||||||
'UhBlbmNyeXB0ZWRNZXNzYWdlQhEKD0FwcGxpY2F0aW9uRGF0YQ==');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use responseDescriptor instead')
|
@$core.Deprecated('Use responseDescriptor instead')
|
||||||
const Response$json = {
|
const Response$json = {
|
||||||
|
|
|
||||||
|
|
@ -93,10 +93,6 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||||
ErrorCode._(1035, _omitEnumNames ? '' : 'UserIsNotInFreePlan');
|
ErrorCode._(1035, _omitEnumNames ? '' : 'UserIsNotInFreePlan');
|
||||||
static const ErrorCode ForegroundSessionConnected =
|
static const ErrorCode ForegroundSessionConnected =
|
||||||
ErrorCode._(1036, _omitEnumNames ? '' : 'ForegroundSessionConnected');
|
ErrorCode._(1036, _omitEnumNames ? '' : 'ForegroundSessionConnected');
|
||||||
static const ErrorCode NoRecoveryData =
|
|
||||||
ErrorCode._(1037, _omitEnumNames ? '' : 'NoRecoveryData');
|
|
||||||
static const ErrorCode InvalidRecoveryData =
|
|
||||||
ErrorCode._(1038, _omitEnumNames ? '' : 'InvalidRecoveryData');
|
|
||||||
|
|
||||||
static const $core.List<ErrorCode> values = <ErrorCode>[
|
static const $core.List<ErrorCode> values = <ErrorCode>[
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
@ -138,8 +134,6 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||||
IPAPaymentExpired,
|
IPAPaymentExpired,
|
||||||
UserIsNotInFreePlan,
|
UserIsNotInFreePlan,
|
||||||
ForegroundSessionConnected,
|
ForegroundSessionConnected,
|
||||||
NoRecoveryData,
|
|
||||||
InvalidRecoveryData,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
static final $core.Map<$core.int, ErrorCode> _byValue =
|
static final $core.Map<$core.int, ErrorCode> _byValue =
|
||||||
|
|
|
||||||
|
|
@ -58,8 +58,6 @@ const ErrorCode$json = {
|
||||||
{'1': 'IPAPaymentExpired', '2': 1034},
|
{'1': 'IPAPaymentExpired', '2': 1034},
|
||||||
{'1': 'UserIsNotInFreePlan', '2': 1035},
|
{'1': 'UserIsNotInFreePlan', '2': 1035},
|
||||||
{'1': 'ForegroundSessionConnected', '2': 1036},
|
{'1': 'ForegroundSessionConnected', '2': 1036},
|
||||||
{'1': 'NoRecoveryData', '2': 1037},
|
|
||||||
{'1': 'InvalidRecoveryData', '2': 1038},
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -82,5 +80,4 @@ final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode(
|
||||||
'EIUIEhcKEkFwcFZlcnNpb25PdXRkYXRlZBCGCBIYChNOZXdEZXZpY2VSZWdpc3RlcmVkEIcIEh'
|
'EIUIEhcKEkFwcFZlcnNpb25PdXRkYXRlZBCGCBIYChNOZXdEZXZpY2VSZWdpc3RlcmVkEIcIEh'
|
||||||
'cKEkludmFsaWRQcm9vZk9mV29yaxCICBIZChRSZWdpc3RyYXRpb25EaXNhYmxlZBCJCBIWChFJ'
|
'cKEkludmFsaWRQcm9vZk9mV29yaxCICBIZChRSZWdpc3RyYXRpb25EaXNhYmxlZBCJCBIWChFJ'
|
||||||
'UEFQYXltZW50RXhwaXJlZBCKCBIYChNVc2VySXNOb3RJbkZyZWVQbGFuEIsIEh8KGkZvcmVncm'
|
'UEFQYXltZW50RXhwaXJlZBCKCBIYChNVc2VySXNOb3RJbkZyZWVQbGFuEIsIEh8KGkZvcmVncm'
|
||||||
'91bmRTZXNzaW9uQ29ubmVjdGVkEIwIEhMKDk5vUmVjb3ZlcnlEYXRhEI0IEhgKE0ludmFsaWRS'
|
'91bmRTZXNzaW9uQ29ubmVjdGVkEIwI');
|
||||||
'ZWNvdmVyeURhdGEQjgg=');
|
|
||||||
|
|
|
||||||
|
|
@ -1505,136 +1505,6 @@ class Response_ProofOfWork extends $pb.GeneratedMessage {
|
||||||
void clearDifficulty() => $_clearField(2);
|
void clearDifficulty() => $_clearField(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
class Response_PasswordlessNotificationMessage extends $pb.GeneratedMessage {
|
|
||||||
factory Response_PasswordlessNotificationMessage({
|
|
||||||
$fixnum.Int64? id,
|
|
||||||
$core.List<$core.int>? encryptedMessage,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (id != null) result.id = id;
|
|
||||||
if (encryptedMessage != null) result.encryptedMessage = encryptedMessage;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Response_PasswordlessNotificationMessage._();
|
|
||||||
|
|
||||||
factory Response_PasswordlessNotificationMessage.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory Response_PasswordlessNotificationMessage.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'Response.PasswordlessNotificationMessage',
|
|
||||||
package:
|
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aInt64(1, _omitFieldNames ? '' : 'id')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'encryptedMessage', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Response_PasswordlessNotificationMessage clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Response_PasswordlessNotificationMessage copyWith(
|
|
||||||
void Function(Response_PasswordlessNotificationMessage) updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as Response_PasswordlessNotificationMessage))
|
|
||||||
as Response_PasswordlessNotificationMessage;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Response_PasswordlessNotificationMessage create() =>
|
|
||||||
Response_PasswordlessNotificationMessage._();
|
|
||||||
@$core.override
|
|
||||||
Response_PasswordlessNotificationMessage createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Response_PasswordlessNotificationMessage getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
Response_PasswordlessNotificationMessage>(create);
|
|
||||||
static Response_PasswordlessNotificationMessage? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$fixnum.Int64 get id => $_getI64(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set id($fixnum.Int64 value) => $_setInt64(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get encryptedMessage => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set encryptedMessage($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasEncryptedMessage() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearEncryptedMessage() => $_clearField(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Response_PasswordlessNotificationMessages extends $pb.GeneratedMessage {
|
|
||||||
factory Response_PasswordlessNotificationMessages({
|
|
||||||
$core.Iterable<Response_PasswordlessNotificationMessage>? messages,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (messages != null) result.messages.addAll(messages);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Response_PasswordlessNotificationMessages._();
|
|
||||||
|
|
||||||
factory Response_PasswordlessNotificationMessages.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory Response_PasswordlessNotificationMessages.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'Response.PasswordlessNotificationMessages',
|
|
||||||
package:
|
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..pPM<Response_PasswordlessNotificationMessage>(
|
|
||||||
1, _omitFieldNames ? '' : 'messages',
|
|
||||||
subBuilder: Response_PasswordlessNotificationMessage.create)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Response_PasswordlessNotificationMessages clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
Response_PasswordlessNotificationMessages copyWith(
|
|
||||||
void Function(Response_PasswordlessNotificationMessages) updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as Response_PasswordlessNotificationMessages))
|
|
||||||
as Response_PasswordlessNotificationMessages;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Response_PasswordlessNotificationMessages create() =>
|
|
||||||
Response_PasswordlessNotificationMessages._();
|
|
||||||
@$core.override
|
|
||||||
Response_PasswordlessNotificationMessages createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static Response_PasswordlessNotificationMessages getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
Response_PasswordlessNotificationMessages>(create);
|
|
||||||
static Response_PasswordlessNotificationMessages? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$pb.PbList<Response_PasswordlessNotificationMessage> get messages =>
|
|
||||||
$_getList(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum Response_Ok_Ok {
|
enum Response_Ok_Ok {
|
||||||
none,
|
none,
|
||||||
userid,
|
userid,
|
||||||
|
|
@ -1651,8 +1521,6 @@ enum Response_Ok_Ok {
|
||||||
downloadtokens,
|
downloadtokens,
|
||||||
signedprekey,
|
signedprekey,
|
||||||
proofOfWork,
|
proofOfWork,
|
||||||
passwordlessRecoveryServerKey,
|
|
||||||
passwordlessNotificationMessages,
|
|
||||||
notSet
|
notSet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1673,8 +1541,6 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
Response_DownloadTokens? downloadtokens,
|
Response_DownloadTokens? downloadtokens,
|
||||||
Response_SignedPreKey? signedprekey,
|
Response_SignedPreKey? signedprekey,
|
||||||
Response_ProofOfWork? proofOfWork,
|
Response_ProofOfWork? proofOfWork,
|
||||||
$core.List<$core.int>? passwordlessRecoveryServerKey,
|
|
||||||
Response_PasswordlessNotificationMessages? passwordlessNotificationMessages,
|
|
||||||
}) {
|
}) {
|
||||||
final result = create();
|
final result = create();
|
||||||
if (none != null) result.none = none;
|
if (none != null) result.none = none;
|
||||||
|
|
@ -1693,11 +1559,6 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
if (downloadtokens != null) result.downloadtokens = downloadtokens;
|
if (downloadtokens != null) result.downloadtokens = downloadtokens;
|
||||||
if (signedprekey != null) result.signedprekey = signedprekey;
|
if (signedprekey != null) result.signedprekey = signedprekey;
|
||||||
if (proofOfWork != null) result.proofOfWork = proofOfWork;
|
if (proofOfWork != null) result.proofOfWork = proofOfWork;
|
||||||
if (passwordlessRecoveryServerKey != null)
|
|
||||||
result.passwordlessRecoveryServerKey = passwordlessRecoveryServerKey;
|
|
||||||
if (passwordlessNotificationMessages != null)
|
|
||||||
result.passwordlessNotificationMessages =
|
|
||||||
passwordlessNotificationMessages;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1726,8 +1587,6 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
13: Response_Ok_Ok.downloadtokens,
|
13: Response_Ok_Ok.downloadtokens,
|
||||||
14: Response_Ok_Ok.signedprekey,
|
14: Response_Ok_Ok.signedprekey,
|
||||||
15: Response_Ok_Ok.proofOfWork,
|
15: Response_Ok_Ok.proofOfWork,
|
||||||
16: Response_Ok_Ok.passwordlessRecoveryServerKey,
|
|
||||||
17: Response_Ok_Ok.passwordlessNotificationMessages,
|
|
||||||
0: Response_Ok_Ok.notSet
|
0: Response_Ok_Ok.notSet
|
||||||
};
|
};
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
||||||
|
|
@ -1735,7 +1594,7 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
package:
|
package:
|
||||||
const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'),
|
const $pb.PackageName(_omitMessageNames ? '' : 'server_to_client'),
|
||||||
createEmptyInstance: create)
|
createEmptyInstance: create)
|
||||||
..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])
|
..oo(0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
|
||||||
..aOB(1, _omitFieldNames ? '' : 'None', protoName: 'None')
|
..aOB(1, _omitFieldNames ? '' : 'None', protoName: 'None')
|
||||||
..aInt64(2, _omitFieldNames ? '' : 'userid')
|
..aInt64(2, _omitFieldNames ? '' : 'userid')
|
||||||
..a<$core.List<$core.int>>(
|
..a<$core.List<$core.int>>(
|
||||||
|
|
@ -1765,13 +1624,6 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
subBuilder: Response_SignedPreKey.create)
|
subBuilder: Response_SignedPreKey.create)
|
||||||
..aOM<Response_ProofOfWork>(15, _omitFieldNames ? '' : 'proofOfWork',
|
..aOM<Response_ProofOfWork>(15, _omitFieldNames ? '' : 'proofOfWork',
|
||||||
protoName: 'proofOfWork', subBuilder: Response_ProofOfWork.create)
|
protoName: 'proofOfWork', subBuilder: Response_ProofOfWork.create)
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
16,
|
|
||||||
_omitFieldNames ? '' : 'passwordlessRecoveryServerKey',
|
|
||||||
$pb.PbFieldType.OY)
|
|
||||||
..aOM<Response_PasswordlessNotificationMessages>(
|
|
||||||
17, _omitFieldNames ? '' : 'passwordlessNotificationMessages',
|
|
||||||
subBuilder: Response_PasswordlessNotificationMessages.create)
|
|
||||||
..hasRequiredFields = false;
|
..hasRequiredFields = false;
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
||||||
|
|
@ -1808,8 +1660,6 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
@$pb.TagNumber(13)
|
@$pb.TagNumber(13)
|
||||||
@$pb.TagNumber(14)
|
@$pb.TagNumber(14)
|
||||||
@$pb.TagNumber(15)
|
@$pb.TagNumber(15)
|
||||||
@$pb.TagNumber(16)
|
|
||||||
@$pb.TagNumber(17)
|
|
||||||
Response_Ok_Ok whichOk() => _Response_Ok_OkByTag[$_whichOneof(0)]!;
|
Response_Ok_Ok whichOk() => _Response_Ok_OkByTag[$_whichOneof(0)]!;
|
||||||
@$pb.TagNumber(1)
|
@$pb.TagNumber(1)
|
||||||
@$pb.TagNumber(2)
|
@$pb.TagNumber(2)
|
||||||
|
|
@ -1826,8 +1676,6 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
@$pb.TagNumber(13)
|
@$pb.TagNumber(13)
|
||||||
@$pb.TagNumber(14)
|
@$pb.TagNumber(14)
|
||||||
@$pb.TagNumber(15)
|
@$pb.TagNumber(15)
|
||||||
@$pb.TagNumber(16)
|
|
||||||
@$pb.TagNumber(17)
|
|
||||||
void clearOk() => $_clearField($_whichOneof(0));
|
void clearOk() => $_clearField($_whichOneof(0));
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
@$pb.TagNumber(1)
|
||||||
|
|
@ -1987,31 +1835,6 @@ class Response_Ok extends $pb.GeneratedMessage {
|
||||||
void clearProofOfWork() => $_clearField(15);
|
void clearProofOfWork() => $_clearField(15);
|
||||||
@$pb.TagNumber(15)
|
@$pb.TagNumber(15)
|
||||||
Response_ProofOfWork ensureProofOfWork() => $_ensure(14);
|
Response_ProofOfWork ensureProofOfWork() => $_ensure(14);
|
||||||
|
|
||||||
@$pb.TagNumber(16)
|
|
||||||
$core.List<$core.int> get passwordlessRecoveryServerKey => $_getN(15);
|
|
||||||
@$pb.TagNumber(16)
|
|
||||||
set passwordlessRecoveryServerKey($core.List<$core.int> value) =>
|
|
||||||
$_setBytes(15, value);
|
|
||||||
@$pb.TagNumber(16)
|
|
||||||
$core.bool hasPasswordlessRecoveryServerKey() => $_has(15);
|
|
||||||
@$pb.TagNumber(16)
|
|
||||||
void clearPasswordlessRecoveryServerKey() => $_clearField(16);
|
|
||||||
|
|
||||||
@$pb.TagNumber(17)
|
|
||||||
Response_PasswordlessNotificationMessages
|
|
||||||
get passwordlessNotificationMessages => $_getN(16);
|
|
||||||
@$pb.TagNumber(17)
|
|
||||||
set passwordlessNotificationMessages(
|
|
||||||
Response_PasswordlessNotificationMessages value) =>
|
|
||||||
$_setField(17, value);
|
|
||||||
@$pb.TagNumber(17)
|
|
||||||
$core.bool hasPasswordlessNotificationMessages() => $_has(16);
|
|
||||||
@$pb.TagNumber(17)
|
|
||||||
void clearPasswordlessNotificationMessages() => $_clearField(17);
|
|
||||||
@$pb.TagNumber(17)
|
|
||||||
Response_PasswordlessNotificationMessages
|
|
||||||
ensurePasswordlessNotificationMessages() => $_ensure(16);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Response_Response { ok, error, notSet }
|
enum Response_Response { ok, error, notSet }
|
||||||
|
|
|
||||||
|
|
@ -176,8 +176,6 @@ const Response$json = {
|
||||||
Response_UploadToken$json,
|
Response_UploadToken$json,
|
||||||
Response_DownloadTokens$json,
|
Response_DownloadTokens$json,
|
||||||
Response_ProofOfWork$json,
|
Response_ProofOfWork$json,
|
||||||
Response_PasswordlessNotificationMessage$json,
|
|
||||||
Response_PasswordlessNotificationMessages$json,
|
|
||||||
Response_Ok$json
|
Response_Ok$json
|
||||||
],
|
],
|
||||||
'8': [
|
'8': [
|
||||||
|
|
@ -511,36 +509,6 @@ const Response_ProofOfWork$json = {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
@$core.Deprecated('Use responseDescriptor instead')
|
|
||||||
const Response_PasswordlessNotificationMessage$json = {
|
|
||||||
'1': 'PasswordlessNotificationMessage',
|
|
||||||
'2': [
|
|
||||||
{'1': 'id', '3': 1, '4': 1, '5': 3, '10': 'id'},
|
|
||||||
{
|
|
||||||
'1': 'encrypted_message',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'encryptedMessage'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use responseDescriptor instead')
|
|
||||||
const Response_PasswordlessNotificationMessages$json = {
|
|
||||||
'1': 'PasswordlessNotificationMessages',
|
|
||||||
'2': [
|
|
||||||
{
|
|
||||||
'1': 'messages',
|
|
||||||
'3': 1,
|
|
||||||
'4': 3,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.server_to_client.Response.PasswordlessNotificationMessage',
|
|
||||||
'10': 'messages'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use responseDescriptor instead')
|
@$core.Deprecated('Use responseDescriptor instead')
|
||||||
const Response_Ok$json = {
|
const Response_Ok$json = {
|
||||||
'1': 'Ok',
|
'1': 'Ok',
|
||||||
|
|
@ -655,23 +623,6 @@ const Response_Ok$json = {
|
||||||
'9': 0,
|
'9': 0,
|
||||||
'10': 'proofOfWork'
|
'10': 'proofOfWork'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'1': 'passwordless_recovery_server_key',
|
|
||||||
'3': 16,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 0,
|
|
||||||
'10': 'passwordlessRecoveryServerKey'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'passwordless_notification_messages',
|
|
||||||
'3': 17,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.server_to_client.Response.PasswordlessNotificationMessages',
|
|
||||||
'9': 0,
|
|
||||||
'10': 'passwordlessNotificationMessages'
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
'8': [
|
'8': [
|
||||||
{'1': 'Ok'},
|
{'1': 'Ok'},
|
||||||
|
|
@ -726,29 +677,22 @@ final $typed_data.Uint8List responseDescriptor = $convert.base64Decode(
|
||||||
'cKD2Rvd25sb2FkX3Rva2VucxgCIAMoDFIOZG93bmxvYWRUb2tlbnMaOQoORG93bmxvYWRUb2tl'
|
'cKD2Rvd25sb2FkX3Rva2VucxgCIAMoDFIOZG93bmxvYWRUb2tlbnMaOQoORG93bmxvYWRUb2tl'
|
||||||
'bnMSJwoPZG93bmxvYWRfdG9rZW5zGAEgAygMUg5kb3dubG9hZFRva2VucxpFCgtQcm9vZk9mV2'
|
'bnMSJwoPZG93bmxvYWRfdG9rZW5zGAEgAygMUg5kb3dubG9hZFRva2VucxpFCgtQcm9vZk9mV2'
|
||||||
'9yaxIWCgZwcmVmaXgYASABKAlSBnByZWZpeBIeCgpkaWZmaWN1bHR5GAIgASgDUgpkaWZmaWN1'
|
'9yaxIWCgZwcmVmaXgYASABKAlSBnByZWZpeBIeCgpkaWZmaWN1bHR5GAIgASgDUgpkaWZmaWN1'
|
||||||
'bHR5Gl4KH1Bhc3N3b3JkbGVzc05vdGlmaWNhdGlvbk1lc3NhZ2USDgoCaWQYASABKANSAmlkEi'
|
'bHR5GtcHCgJPaxIUCgROb25lGAEgASgISABSBE5vbmUSGAoGdXNlcmlkGAIgASgDSABSBnVzZX'
|
||||||
'sKEWVuY3J5cHRlZF9tZXNzYWdlGAIgASgMUhBlbmNyeXB0ZWRNZXNzYWdlGnoKIFBhc3N3b3Jk'
|
'JpZBImCg1hdXRoY2hhbGxlbmdlGAMgASgMSABSDWF1dGhjaGFsbGVuZ2USSgoLdXBsb2FkdG9r'
|
||||||
'bGVzc05vdGlmaWNhdGlvbk1lc3NhZ2VzElYKCG1lc3NhZ2VzGAEgAygLMjouc2VydmVyX3RvX2'
|
'ZW4YBCABKAsyJi5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlVwbG9hZFRva2VuSABSC3VwbG'
|
||||||
'NsaWVudC5SZXNwb25zZS5QYXNzd29yZGxlc3NOb3RpZmljYXRpb25NZXNzYWdlUghtZXNzYWdl'
|
'9hZHRva2VuEkEKCHVzZXJkYXRhGAUgASgLMiMuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5V'
|
||||||
'cxqwCQoCT2sSFAoETm9uZRgBIAEoCEgAUgROb25lEhgKBnVzZXJpZBgCIAEoA0gAUgZ1c2VyaW'
|
'c2VyRGF0YUgAUgh1c2VyZGF0YRIeCglhdXRodG9rZW4YBiABKAxIAFIJYXV0aHRva2VuEkoKDG'
|
||||||
'QSJgoNYXV0aGNoYWxsZW5nZRgDIAEoDEgAUg1hdXRoY2hhbGxlbmdlEkoKC3VwbG9hZHRva2Vu'
|
'RlcHJlY2F0ZWRfNxgHIAEoCzIlLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuRGVwcmVjYXRl'
|
||||||
'GAQgASgLMiYuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5VcGxvYWRUb2tlbkgAUgt1cGxvYW'
|
'ZEgAUgtkZXByZWNhdGVkNxJQCg1hdXRoZW50aWNhdGVkGAggASgLMiguc2VydmVyX3RvX2NsaW'
|
||||||
'R0b2tlbhJBCgh1c2VyZGF0YRgFIAEoCzIjLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuVXNl'
|
'VudC5SZXNwb25zZS5BdXRoZW50aWNhdGVkSABSDWF1dGhlbnRpY2F0ZWQSOAoFcGxhbnMYCSAB'
|
||||||
'ckRhdGFIAFIIdXNlcmRhdGESHgoJYXV0aHRva2VuGAYgASgMSABSCWF1dGh0b2tlbhJKCgxkZX'
|
'KAsyIC5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlBsYW5zSABSBXBsYW5zEk0KDHBsYW5iYW'
|
||||||
'ByZWNhdGVkXzcYByABKAsyJS5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLkRlcHJlY2F0ZWRI'
|
'xsYW5jZRgKIAEoCzInLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuUGxhbkJhbGxhbmNlSABS'
|
||||||
'AFILZGVwcmVjYXRlZDcSUAoNYXV0aGVudGljYXRlZBgIIAEoCzIoLnNlcnZlcl90b19jbGllbn'
|
'DHBsYW5iYWxsYW5jZRJMCg1kZXByZWNhdGVkXzExGAsgASgLMiUuc2VydmVyX3RvX2NsaWVudC'
|
||||||
'QuUmVzcG9uc2UuQXV0aGVudGljYXRlZEgAUg1hdXRoZW50aWNhdGVkEjgKBXBsYW5zGAkgASgL'
|
'5SZXNwb25zZS5EZXByZWNhdGVkSABSDGRlcHJlY2F0ZWQxMRJfChJhZGRhY2NvdW50c2ludml0'
|
||||||
'MiAuc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5QbGFuc0gAUgVwbGFucxJNCgxwbGFuYmFsbG'
|
'ZXMYDCABKAsyLS5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLkFkZEFjY291bnRzSW52aXRlc0'
|
||||||
'FuY2UYCiABKAsyJy5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlBsYW5CYWxsYW5jZUgAUgxw'
|
'gAUhJhZGRhY2NvdW50c2ludml0ZXMSUwoOZG93bmxvYWR0b2tlbnMYDSABKAsyKS5zZXJ2ZXJf'
|
||||||
'bGFuYmFsbGFuY2USTAoNZGVwcmVjYXRlZF8xMRgLIAEoCzIlLnNlcnZlcl90b19jbGllbnQuUm'
|
'dG9fY2xpZW50LlJlc3BvbnNlLkRvd25sb2FkVG9rZW5zSABSDmRvd25sb2FkdG9rZW5zEk0KDH'
|
||||||
'VzcG9uc2UuRGVwcmVjYXRlZEgAUgxkZXByZWNhdGVkMTESXwoSYWRkYWNjb3VudHNpbnZpdGVz'
|
'NpZ25lZHByZWtleRgOIAEoCzInLnNlcnZlcl90b19jbGllbnQuUmVzcG9uc2UuU2lnbmVkUHJl'
|
||||||
'GAwgASgLMi0uc2VydmVyX3RvX2NsaWVudC5SZXNwb25zZS5BZGRBY2NvdW50c0ludml0ZXNIAF'
|
'S2V5SABSDHNpZ25lZHByZWtleRJKCgtwcm9vZk9mV29yaxgPIAEoCzImLnNlcnZlcl90b19jbG'
|
||||||
'ISYWRkYWNjb3VudHNpbnZpdGVzElMKDmRvd25sb2FkdG9rZW5zGA0gASgLMikuc2VydmVyX3Rv'
|
'llbnQuUmVzcG9uc2UuUHJvb2ZPZldvcmtIAFILcHJvb2ZPZldvcmtCBAoCT2tCCgoIUmVzcG9u'
|
||||||
'X2NsaWVudC5SZXNwb25zZS5Eb3dubG9hZFRva2Vuc0gAUg5kb3dubG9hZHRva2VucxJNCgxzaW'
|
'c2U=');
|
||||||
'duZWRwcmVrZXkYDiABKAsyJy5zZXJ2ZXJfdG9fY2xpZW50LlJlc3BvbnNlLlNpZ25lZFByZUtl'
|
|
||||||
'eUgAUgxzaWduZWRwcmVrZXkSSgoLcHJvb2ZPZldvcmsYDyABKAsyJi5zZXJ2ZXJfdG9fY2xpZW'
|
|
||||||
'50LlJlc3BvbnNlLlByb29mT2ZXb3JrSABSC3Byb29mT2ZXb3JrEkkKIHBhc3N3b3JkbGVzc19y'
|
|
||||||
'ZWNvdmVyeV9zZXJ2ZXJfa2V5GBAgASgMSABSHXBhc3N3b3JkbGVzc1JlY292ZXJ5U2VydmVyS2'
|
|
||||||
'V5EosBCiJwYXNzd29yZGxlc3Nfbm90aWZpY2F0aW9uX21lc3NhZ2VzGBEgASgLMjsuc2VydmVy'
|
|
||||||
'X3RvX2NsaWVudC5SZXNwb25zZS5QYXNzd29yZGxlc3NOb3RpZmljYXRpb25NZXNzYWdlc0gAUi'
|
|
||||||
'BwYXNzd29yZGxlc3NOb3RpZmljYXRpb25NZXNzYWdlc0IECgJPa0IKCghSZXNwb25zZQ==');
|
|
||||||
|
|
|
||||||
|
|
@ -368,12 +368,10 @@ class EncryptedContent_GroupCreate extends $pb.GeneratedMessage {
|
||||||
factory EncryptedContent_GroupCreate({
|
factory EncryptedContent_GroupCreate({
|
||||||
$core.List<$core.int>? stateKey,
|
$core.List<$core.int>? stateKey,
|
||||||
$core.List<$core.int>? groupPublicKey,
|
$core.List<$core.int>? groupPublicKey,
|
||||||
$core.String? groupName,
|
|
||||||
}) {
|
}) {
|
||||||
final result = create();
|
final result = create();
|
||||||
if (stateKey != null) result.stateKey = stateKey;
|
if (stateKey != null) result.stateKey = stateKey;
|
||||||
if (groupPublicKey != null) result.groupPublicKey = groupPublicKey;
|
if (groupPublicKey != null) result.groupPublicKey = groupPublicKey;
|
||||||
if (groupName != null) result.groupName = groupName;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -393,7 +391,6 @@ class EncryptedContent_GroupCreate extends $pb.GeneratedMessage {
|
||||||
3, _omitFieldNames ? '' : 'stateKey', $pb.PbFieldType.OY)
|
3, _omitFieldNames ? '' : 'stateKey', $pb.PbFieldType.OY)
|
||||||
..a<$core.List<$core.int>>(
|
..a<$core.List<$core.int>>(
|
||||||
4, _omitFieldNames ? '' : 'groupPublicKey', $pb.PbFieldType.OY)
|
4, _omitFieldNames ? '' : 'groupPublicKey', $pb.PbFieldType.OY)
|
||||||
..aOS(5, _omitFieldNames ? '' : 'groupName')
|
|
||||||
..hasRequiredFields = false;
|
..hasRequiredFields = false;
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
||||||
|
|
@ -436,15 +433,6 @@ class EncryptedContent_GroupCreate extends $pb.GeneratedMessage {
|
||||||
$core.bool hasGroupPublicKey() => $_has(1);
|
$core.bool hasGroupPublicKey() => $_has(1);
|
||||||
@$pb.TagNumber(4)
|
@$pb.TagNumber(4)
|
||||||
void clearGroupPublicKey() => $_clearField(4);
|
void clearGroupPublicKey() => $_clearField(4);
|
||||||
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
$core.String get groupName => $_getSZ(2);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
set groupName($core.String value) => $_setString(2, value);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
$core.bool hasGroupName() => $_has(2);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
void clearGroupName() => $_clearField(5);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class EncryptedContent_GroupJoin extends $pb.GeneratedMessage {
|
class EncryptedContent_GroupJoin extends $pb.GeneratedMessage {
|
||||||
|
|
@ -1839,154 +1827,6 @@ class EncryptedContent_KeyVerificationProof extends $pb.GeneratedMessage {
|
||||||
void clearCalculatedMac() => $_clearField(1);
|
void clearCalculatedMac() => $_clearField(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
class EncryptedContent_PasswordLessRecovery extends $pb.GeneratedMessage {
|
|
||||||
factory EncryptedContent_PasswordLessRecovery({
|
|
||||||
$core.List<$core.int>? recoverySecretShare,
|
|
||||||
$core.bool? delete,
|
|
||||||
$fixnum.Int64? threshold,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (recoverySecretShare != null)
|
|
||||||
result.recoverySecretShare = recoverySecretShare;
|
|
||||||
if (delete != null) result.delete = delete;
|
|
||||||
if (threshold != null) result.threshold = threshold;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
EncryptedContent_PasswordLessRecovery._();
|
|
||||||
|
|
||||||
factory EncryptedContent_PasswordLessRecovery.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory EncryptedContent_PasswordLessRecovery.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'EncryptedContent.PasswordLessRecovery',
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
1, _omitFieldNames ? '' : 'recoverySecretShare', $pb.PbFieldType.OY,
|
|
||||||
protoName: 'recoverySecretShare')
|
|
||||||
..aOB(2, _omitFieldNames ? '' : 'delete')
|
|
||||||
..aInt64(3, _omitFieldNames ? '' : 'threshold')
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedContent_PasswordLessRecovery clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedContent_PasswordLessRecovery copyWith(
|
|
||||||
void Function(EncryptedContent_PasswordLessRecovery) updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as EncryptedContent_PasswordLessRecovery))
|
|
||||||
as EncryptedContent_PasswordLessRecovery;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedContent_PasswordLessRecovery create() =>
|
|
||||||
EncryptedContent_PasswordLessRecovery._();
|
|
||||||
@$core.override
|
|
||||||
EncryptedContent_PasswordLessRecovery createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedContent_PasswordLessRecovery getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
EncryptedContent_PasswordLessRecovery>(create);
|
|
||||||
static EncryptedContent_PasswordLessRecovery? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.List<$core.int> get recoverySecretShare => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set recoverySecretShare($core.List<$core.int> value) => $_setBytes(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasRecoverySecretShare() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearRecoverySecretShare() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool get delete => $_getBF(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set delete($core.bool value) => $_setBool(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasDelete() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearDelete() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$fixnum.Int64 get threshold => $_getI64(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set threshold($fixnum.Int64 value) => $_setInt64(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasThreshold() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearThreshold() => $_clearField(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
class EncryptedContent_PasswordLessRecoveryHeartbeat
|
|
||||||
extends $pb.GeneratedMessage {
|
|
||||||
factory EncryptedContent_PasswordLessRecoveryHeartbeat({
|
|
||||||
$core.List<$core.int>? hash,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (hash != null) result.hash = hash;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat._();
|
|
||||||
|
|
||||||
factory EncryptedContent_PasswordLessRecoveryHeartbeat.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory EncryptedContent_PasswordLessRecoveryHeartbeat.fromJson(
|
|
||||||
$core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'EncryptedContent.PasswordLessRecoveryHeartbeat',
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
1, _omitFieldNames ? '' : 'hash', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat copyWith(
|
|
||||||
void Function(EncryptedContent_PasswordLessRecoveryHeartbeat)
|
|
||||||
updates) =>
|
|
||||||
super.copyWith((message) => updates(
|
|
||||||
message as EncryptedContent_PasswordLessRecoveryHeartbeat))
|
|
||||||
as EncryptedContent_PasswordLessRecoveryHeartbeat;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedContent_PasswordLessRecoveryHeartbeat create() =>
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat._();
|
|
||||||
@$core.override
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat createEmptyInstance() =>
|
|
||||||
create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedContent_PasswordLessRecoveryHeartbeat getDefault() =>
|
|
||||||
_defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat>(create);
|
|
||||||
static EncryptedContent_PasswordLessRecoveryHeartbeat? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.List<$core.int> get hash => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set hash($core.List<$core.int> value) => $_setBytes(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasHash() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearHash() => $_clearField(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
class EncryptedContent extends $pb.GeneratedMessage {
|
class EncryptedContent extends $pb.GeneratedMessage {
|
||||||
factory EncryptedContent({
|
factory EncryptedContent({
|
||||||
$core.String? groupId,
|
$core.String? groupId,
|
||||||
|
|
@ -2012,10 +1852,6 @@ class EncryptedContent extends $pb.GeneratedMessage {
|
||||||
EncryptedContent_UserDiscoveryRequest? userDiscoveryRequest,
|
EncryptedContent_UserDiscoveryRequest? userDiscoveryRequest,
|
||||||
EncryptedContent_UserDiscoveryUpdate? userDiscoveryUpdate,
|
EncryptedContent_UserDiscoveryUpdate? userDiscoveryUpdate,
|
||||||
EncryptedContent_KeyVerificationProof? keyVerificationProof,
|
EncryptedContent_KeyVerificationProof? keyVerificationProof,
|
||||||
$core.bool? askForFriendPromotions,
|
|
||||||
EncryptedContent_PasswordLessRecovery? passwordlessRecovery,
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat?
|
|
||||||
passwordlessRecoveryHeartbeat,
|
|
||||||
}) {
|
}) {
|
||||||
final result = create();
|
final result = create();
|
||||||
if (groupId != null) result.groupId = groupId;
|
if (groupId != null) result.groupId = groupId;
|
||||||
|
|
@ -2048,12 +1884,6 @@ class EncryptedContent extends $pb.GeneratedMessage {
|
||||||
result.userDiscoveryUpdate = userDiscoveryUpdate;
|
result.userDiscoveryUpdate = userDiscoveryUpdate;
|
||||||
if (keyVerificationProof != null)
|
if (keyVerificationProof != null)
|
||||||
result.keyVerificationProof = keyVerificationProof;
|
result.keyVerificationProof = keyVerificationProof;
|
||||||
if (askForFriendPromotions != null)
|
|
||||||
result.askForFriendPromotions = askForFriendPromotions;
|
|
||||||
if (passwordlessRecovery != null)
|
|
||||||
result.passwordlessRecovery = passwordlessRecovery;
|
|
||||||
if (passwordlessRecoveryHeartbeat != null)
|
|
||||||
result.passwordlessRecoveryHeartbeat = passwordlessRecoveryHeartbeat;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2125,13 +1955,6 @@ class EncryptedContent extends $pb.GeneratedMessage {
|
||||||
..aOM<EncryptedContent_KeyVerificationProof>(
|
..aOM<EncryptedContent_KeyVerificationProof>(
|
||||||
24, _omitFieldNames ? '' : 'keyVerificationProof',
|
24, _omitFieldNames ? '' : 'keyVerificationProof',
|
||||||
subBuilder: EncryptedContent_KeyVerificationProof.create)
|
subBuilder: EncryptedContent_KeyVerificationProof.create)
|
||||||
..aOB(25, _omitFieldNames ? '' : 'askForFriendPromotions')
|
|
||||||
..aOM<EncryptedContent_PasswordLessRecovery>(
|
|
||||||
26, _omitFieldNames ? '' : 'passwordlessRecovery',
|
|
||||||
subBuilder: EncryptedContent_PasswordLessRecovery.create)
|
|
||||||
..aOM<EncryptedContent_PasswordLessRecoveryHeartbeat>(
|
|
||||||
27, _omitFieldNames ? '' : 'passwordlessRecoveryHeartbeat',
|
|
||||||
subBuilder: EncryptedContent_PasswordLessRecoveryHeartbeat.create)
|
|
||||||
..hasRequiredFields = false;
|
..hasRequiredFields = false;
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
||||||
|
|
@ -2415,43 +2238,6 @@ class EncryptedContent extends $pb.GeneratedMessage {
|
||||||
@$pb.TagNumber(24)
|
@$pb.TagNumber(24)
|
||||||
EncryptedContent_KeyVerificationProof ensureKeyVerificationProof() =>
|
EncryptedContent_KeyVerificationProof ensureKeyVerificationProof() =>
|
||||||
$_ensure(22);
|
$_ensure(22);
|
||||||
|
|
||||||
@$pb.TagNumber(25)
|
|
||||||
$core.bool get askForFriendPromotions => $_getBF(23);
|
|
||||||
@$pb.TagNumber(25)
|
|
||||||
set askForFriendPromotions($core.bool value) => $_setBool(23, value);
|
|
||||||
@$pb.TagNumber(25)
|
|
||||||
$core.bool hasAskForFriendPromotions() => $_has(23);
|
|
||||||
@$pb.TagNumber(25)
|
|
||||||
void clearAskForFriendPromotions() => $_clearField(25);
|
|
||||||
|
|
||||||
@$pb.TagNumber(26)
|
|
||||||
EncryptedContent_PasswordLessRecovery get passwordlessRecovery => $_getN(24);
|
|
||||||
@$pb.TagNumber(26)
|
|
||||||
set passwordlessRecovery(EncryptedContent_PasswordLessRecovery value) =>
|
|
||||||
$_setField(26, value);
|
|
||||||
@$pb.TagNumber(26)
|
|
||||||
$core.bool hasPasswordlessRecovery() => $_has(24);
|
|
||||||
@$pb.TagNumber(26)
|
|
||||||
void clearPasswordlessRecovery() => $_clearField(26);
|
|
||||||
@$pb.TagNumber(26)
|
|
||||||
EncryptedContent_PasswordLessRecovery ensurePasswordlessRecovery() =>
|
|
||||||
$_ensure(24);
|
|
||||||
|
|
||||||
@$pb.TagNumber(27)
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat
|
|
||||||
get passwordlessRecoveryHeartbeat => $_getN(25);
|
|
||||||
@$pb.TagNumber(27)
|
|
||||||
set passwordlessRecoveryHeartbeat(
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat value) =>
|
|
||||||
$_setField(27, value);
|
|
||||||
@$pb.TagNumber(27)
|
|
||||||
$core.bool hasPasswordlessRecoveryHeartbeat() => $_has(25);
|
|
||||||
@$pb.TagNumber(27)
|
|
||||||
void clearPasswordlessRecoveryHeartbeat() => $_clearField(27);
|
|
||||||
@$pb.TagNumber(27)
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat
|
|
||||||
ensurePasswordlessRecoveryHeartbeat() => $_ensure(25);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const $core.bool _omitFieldNames =
|
const $core.bool _omitFieldNames =
|
||||||
|
|
|
||||||
|
|
@ -79,20 +79,16 @@ class EncryptedContent_ErrorMessages_Type extends $pb.ProtobufEnum {
|
||||||
static const EncryptedContent_ErrorMessages_Type SESSION_OUT_OF_SYNC =
|
static const EncryptedContent_ErrorMessages_Type SESSION_OUT_OF_SYNC =
|
||||||
EncryptedContent_ErrorMessages_Type._(
|
EncryptedContent_ErrorMessages_Type._(
|
||||||
3, _omitEnumNames ? '' : 'SESSION_OUT_OF_SYNC');
|
3, _omitEnumNames ? '' : 'SESSION_OUT_OF_SYNC');
|
||||||
static const EncryptedContent_ErrorMessages_Type
|
|
||||||
GROUP_NOT_FOUND_OR_NOT_A_MEMBER = EncryptedContent_ErrorMessages_Type._(
|
|
||||||
4, _omitEnumNames ? '' : 'GROUP_NOT_FOUND_OR_NOT_A_MEMBER');
|
|
||||||
|
|
||||||
static const $core.List<EncryptedContent_ErrorMessages_Type> values =
|
static const $core.List<EncryptedContent_ErrorMessages_Type> values =
|
||||||
<EncryptedContent_ErrorMessages_Type>[
|
<EncryptedContent_ErrorMessages_Type>[
|
||||||
ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD,
|
ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD,
|
||||||
UNKNOWN_MESSAGE_TYPE,
|
UNKNOWN_MESSAGE_TYPE,
|
||||||
SESSION_OUT_OF_SYNC,
|
SESSION_OUT_OF_SYNC,
|
||||||
GROUP_NOT_FOUND_OR_NOT_A_MEMBER,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
static final $core.List<EncryptedContent_ErrorMessages_Type?> _byValue =
|
static final $core.List<EncryptedContent_ErrorMessages_Type?> _byValue =
|
||||||
$pb.ProtobufEnum.$_initByValueList(values, 4);
|
$pb.ProtobufEnum.$_initByValueList(values, 3);
|
||||||
static EncryptedContent_ErrorMessages_Type? valueOf($core.int value) =>
|
static EncryptedContent_ErrorMessages_Type? valueOf($core.int value) =>
|
||||||
value < 0 || value >= _byValue.length ? null : _byValue[value];
|
value < 0 || value >= _byValue.length ? null : _byValue[value];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -186,22 +186,13 @@ const EncryptedContent$json = {
|
||||||
'10': 'senderUserDiscoveryVersion',
|
'10': 'senderUserDiscoveryVersion',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'1': 'ask_for_friend_promotions',
|
|
||||||
'3': 25,
|
|
||||||
'4': 1,
|
|
||||||
'5': 8,
|
|
||||||
'9': 4,
|
|
||||||
'10': 'askForFriendPromotions',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
'1': 'message_update',
|
'1': 'message_update',
|
||||||
'3': 5,
|
'3': 5,
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.MessageUpdate',
|
'6': '.EncryptedContent.MessageUpdate',
|
||||||
'9': 5,
|
'9': 4,
|
||||||
'10': 'messageUpdate',
|
'10': 'messageUpdate',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -211,7 +202,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.Media',
|
'6': '.EncryptedContent.Media',
|
||||||
'9': 6,
|
'9': 5,
|
||||||
'10': 'media',
|
'10': 'media',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -221,7 +212,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.MediaUpdate',
|
'6': '.EncryptedContent.MediaUpdate',
|
||||||
'9': 7,
|
'9': 6,
|
||||||
'10': 'mediaUpdate',
|
'10': 'mediaUpdate',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -231,7 +222,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.ContactUpdate',
|
'6': '.EncryptedContent.ContactUpdate',
|
||||||
'9': 8,
|
'9': 7,
|
||||||
'10': 'contactUpdate',
|
'10': 'contactUpdate',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -241,7 +232,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.ContactRequest',
|
'6': '.EncryptedContent.ContactRequest',
|
||||||
'9': 9,
|
'9': 8,
|
||||||
'10': 'contactRequest',
|
'10': 'contactRequest',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -251,7 +242,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.FlameSync',
|
'6': '.EncryptedContent.FlameSync',
|
||||||
'9': 10,
|
'9': 9,
|
||||||
'10': 'flameSync',
|
'10': 'flameSync',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -261,7 +252,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.PushKeys',
|
'6': '.EncryptedContent.PushKeys',
|
||||||
'9': 11,
|
'9': 10,
|
||||||
'10': 'pushKeys',
|
'10': 'pushKeys',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -271,7 +262,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.Reaction',
|
'6': '.EncryptedContent.Reaction',
|
||||||
'9': 12,
|
'9': 11,
|
||||||
'10': 'reaction',
|
'10': 'reaction',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -281,7 +272,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.TextMessage',
|
'6': '.EncryptedContent.TextMessage',
|
||||||
'9': 13,
|
'9': 12,
|
||||||
'10': 'textMessage',
|
'10': 'textMessage',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -291,7 +282,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.GroupCreate',
|
'6': '.EncryptedContent.GroupCreate',
|
||||||
'9': 14,
|
'9': 13,
|
||||||
'10': 'groupCreate',
|
'10': 'groupCreate',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -301,7 +292,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.GroupJoin',
|
'6': '.EncryptedContent.GroupJoin',
|
||||||
'9': 15,
|
'9': 14,
|
||||||
'10': 'groupJoin',
|
'10': 'groupJoin',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -311,7 +302,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.GroupUpdate',
|
'6': '.EncryptedContent.GroupUpdate',
|
||||||
'9': 16,
|
'9': 15,
|
||||||
'10': 'groupUpdate',
|
'10': 'groupUpdate',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -321,7 +312,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.ResendGroupPublicKey',
|
'6': '.EncryptedContent.ResendGroupPublicKey',
|
||||||
'9': 17,
|
'9': 16,
|
||||||
'10': 'resendGroupPublicKey',
|
'10': 'resendGroupPublicKey',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -331,7 +322,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.ErrorMessages',
|
'6': '.EncryptedContent.ErrorMessages',
|
||||||
'9': 18,
|
'9': 17,
|
||||||
'10': 'errorMessages',
|
'10': 'errorMessages',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -341,7 +332,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.AdditionalDataMessage',
|
'6': '.EncryptedContent.AdditionalDataMessage',
|
||||||
'9': 19,
|
'9': 18,
|
||||||
'10': 'additionalDataMessage',
|
'10': 'additionalDataMessage',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -351,7 +342,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.TypingIndicator',
|
'6': '.EncryptedContent.TypingIndicator',
|
||||||
'9': 20,
|
'9': 19,
|
||||||
'10': 'typingIndicator',
|
'10': 'typingIndicator',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -361,7 +352,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.UserDiscoveryRequest',
|
'6': '.EncryptedContent.UserDiscoveryRequest',
|
||||||
'9': 21,
|
'9': 20,
|
||||||
'10': 'userDiscoveryRequest',
|
'10': 'userDiscoveryRequest',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -371,7 +362,7 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.UserDiscoveryUpdate',
|
'6': '.EncryptedContent.UserDiscoveryUpdate',
|
||||||
'9': 22,
|
'9': 21,
|
||||||
'10': 'userDiscoveryUpdate',
|
'10': 'userDiscoveryUpdate',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
|
|
@ -381,30 +372,10 @@ const EncryptedContent$json = {
|
||||||
'4': 1,
|
'4': 1,
|
||||||
'5': 11,
|
'5': 11,
|
||||||
'6': '.EncryptedContent.KeyVerificationProof',
|
'6': '.EncryptedContent.KeyVerificationProof',
|
||||||
'9': 23,
|
'9': 22,
|
||||||
'10': 'keyVerificationProof',
|
'10': 'keyVerificationProof',
|
||||||
'17': true
|
'17': true
|
||||||
},
|
},
|
||||||
{
|
|
||||||
'1': 'passwordless_recovery',
|
|
||||||
'3': 26,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.EncryptedContent.PasswordLessRecovery',
|
|
||||||
'9': 24,
|
|
||||||
'10': 'passwordlessRecovery',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'passwordless_recovery_heartbeat',
|
|
||||||
'3': 27,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.EncryptedContent.PasswordLessRecoveryHeartbeat',
|
|
||||||
'9': 25,
|
|
||||||
'10': 'passwordlessRecoveryHeartbeat',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
'3': [
|
'3': [
|
||||||
EncryptedContent_ErrorMessages$json,
|
EncryptedContent_ErrorMessages$json,
|
||||||
|
|
@ -425,16 +396,13 @@ const EncryptedContent$json = {
|
||||||
EncryptedContent_TypingIndicator$json,
|
EncryptedContent_TypingIndicator$json,
|
||||||
EncryptedContent_UserDiscoveryRequest$json,
|
EncryptedContent_UserDiscoveryRequest$json,
|
||||||
EncryptedContent_UserDiscoveryUpdate$json,
|
EncryptedContent_UserDiscoveryUpdate$json,
|
||||||
EncryptedContent_KeyVerificationProof$json,
|
EncryptedContent_KeyVerificationProof$json
|
||||||
EncryptedContent_PasswordLessRecovery$json,
|
|
||||||
EncryptedContent_PasswordLessRecoveryHeartbeat$json
|
|
||||||
],
|
],
|
||||||
'8': [
|
'8': [
|
||||||
{'1': '_group_id'},
|
{'1': '_group_id'},
|
||||||
{'1': '_is_direct_chat'},
|
{'1': '_is_direct_chat'},
|
||||||
{'1': '_sender_profile_counter'},
|
{'1': '_sender_profile_counter'},
|
||||||
{'1': '_sender_user_discovery_version'},
|
{'1': '_sender_user_discovery_version'},
|
||||||
{'1': '_ask_for_friend_promotions'},
|
|
||||||
{'1': '_message_update'},
|
{'1': '_message_update'},
|
||||||
{'1': '_media'},
|
{'1': '_media'},
|
||||||
{'1': '_media_update'},
|
{'1': '_media_update'},
|
||||||
|
|
@ -454,8 +422,6 @@ const EncryptedContent$json = {
|
||||||
{'1': '_user_discovery_request'},
|
{'1': '_user_discovery_request'},
|
||||||
{'1': '_user_discovery_update'},
|
{'1': '_user_discovery_update'},
|
||||||
{'1': '_key_verification_proof'},
|
{'1': '_key_verification_proof'},
|
||||||
{'1': '_passwordless_recovery'},
|
|
||||||
{'1': '_passwordless_recovery_heartbeat'},
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -489,7 +455,6 @@ const EncryptedContent_ErrorMessages_Type$json = {
|
||||||
{'1': 'ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD', '2': 0},
|
{'1': 'ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD', '2': 0},
|
||||||
{'1': 'UNKNOWN_MESSAGE_TYPE', '2': 2},
|
{'1': 'UNKNOWN_MESSAGE_TYPE', '2': 2},
|
||||||
{'1': 'SESSION_OUT_OF_SYNC', '2': 3},
|
{'1': 'SESSION_OUT_OF_SYNC', '2': 3},
|
||||||
{'1': 'GROUP_NOT_FOUND_OR_NOT_A_MEMBER', '2': 4},
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -499,18 +464,6 @@ const EncryptedContent_GroupCreate$json = {
|
||||||
'2': [
|
'2': [
|
||||||
{'1': 'state_key', '3': 3, '4': 1, '5': 12, '10': 'stateKey'},
|
{'1': 'state_key', '3': 3, '4': 1, '5': 12, '10': 'stateKey'},
|
||||||
{'1': 'group_public_key', '3': 4, '4': 1, '5': 12, '10': 'groupPublicKey'},
|
{'1': 'group_public_key', '3': 4, '4': 1, '5': 12, '10': 'groupPublicKey'},
|
||||||
{
|
|
||||||
'1': 'group_name',
|
|
||||||
'3': 5,
|
|
||||||
'4': 1,
|
|
||||||
'5': 9,
|
|
||||||
'9': 0,
|
|
||||||
'10': 'groupName',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'8': [
|
|
||||||
{'1': '_group_name'},
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -979,150 +932,109 @@ const EncryptedContent_KeyVerificationProof$json = {
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
@$core.Deprecated('Use encryptedContentDescriptor instead')
|
|
||||||
const EncryptedContent_PasswordLessRecovery$json = {
|
|
||||||
'1': 'PasswordLessRecovery',
|
|
||||||
'2': [
|
|
||||||
{
|
|
||||||
'1': 'recoverySecretShare',
|
|
||||||
'3': 1,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 0,
|
|
||||||
'10': 'recoverySecretShare',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{'1': 'delete', '3': 2, '4': 1, '5': 8, '10': 'delete'},
|
|
||||||
{'1': 'threshold', '3': 3, '4': 1, '5': 3, '10': 'threshold'},
|
|
||||||
],
|
|
||||||
'8': [
|
|
||||||
{'1': '_recoverySecretShare'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use encryptedContentDescriptor instead')
|
|
||||||
const EncryptedContent_PasswordLessRecoveryHeartbeat$json = {
|
|
||||||
'1': 'PasswordLessRecoveryHeartbeat',
|
|
||||||
'2': [
|
|
||||||
{'1': 'hash', '3': 1, '4': 1, '5': 12, '10': 'hash'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `EncryptedContent`. Decode as a `google.protobuf.DescriptorProto`.
|
/// Descriptor for `EncryptedContent`. Decode as a `google.protobuf.DescriptorProto`.
|
||||||
final $typed_data.Uint8List encryptedContentDescriptor = $convert.base64Decode(
|
final $typed_data.Uint8List encryptedContentDescriptor = $convert.base64Decode(
|
||||||
'ChBFbmNyeXB0ZWRDb250ZW50Eh4KCGdyb3VwX2lkGAIgASgJSABSB2dyb3VwSWSIAQESKQoOaX'
|
'ChBFbmNyeXB0ZWRDb250ZW50Eh4KCGdyb3VwX2lkGAIgASgJSABSB2dyb3VwSWSIAQESKQoOaX'
|
||||||
'NfZGlyZWN0X2NoYXQYAyABKAhIAVIMaXNEaXJlY3RDaGF0iAEBEjkKFnNlbmRlcl9wcm9maWxl'
|
'NfZGlyZWN0X2NoYXQYAyABKAhIAVIMaXNEaXJlY3RDaGF0iAEBEjkKFnNlbmRlcl9wcm9maWxl'
|
||||||
'X2NvdW50ZXIYBCABKANIAlIUc2VuZGVyUHJvZmlsZUNvdW50ZXKIAQESRgodc2VuZGVyX3VzZX'
|
'X2NvdW50ZXIYBCABKANIAlIUc2VuZGVyUHJvZmlsZUNvdW50ZXKIAQESRgodc2VuZGVyX3VzZX'
|
||||||
'JfZGlzY292ZXJ5X3ZlcnNpb24YFSABKAxIA1Iac2VuZGVyVXNlckRpc2NvdmVyeVZlcnNpb26I'
|
'JfZGlzY292ZXJ5X3ZlcnNpb24YFSABKAxIA1Iac2VuZGVyVXNlckRpc2NvdmVyeVZlcnNpb26I'
|
||||||
'AQESPgoZYXNrX2Zvcl9mcmllbmRfcHJvbW90aW9ucxgZIAEoCEgEUhZhc2tGb3JGcmllbmRQcm'
|
'AQESSwoObWVzc2FnZV91cGRhdGUYBSABKAsyHy5FbmNyeXB0ZWRDb250ZW50Lk1lc3NhZ2VVcG'
|
||||||
'9tb3Rpb25ziAEBEksKDm1lc3NhZ2VfdXBkYXRlGAUgASgLMh8uRW5jcnlwdGVkQ29udGVudC5N'
|
'RhdGVIBFINbWVzc2FnZVVwZGF0ZYgBARIyCgVtZWRpYRgGIAEoCzIXLkVuY3J5cHRlZENvbnRl'
|
||||||
'ZXNzYWdlVXBkYXRlSAVSDW1lc3NhZ2VVcGRhdGWIAQESMgoFbWVkaWEYBiABKAsyFy5FbmNyeX'
|
'bnQuTWVkaWFIBVIFbWVkaWGIAQESRQoMbWVkaWFfdXBkYXRlGAcgASgLMh0uRW5jcnlwdGVkQ2'
|
||||||
'B0ZWRDb250ZW50Lk1lZGlhSAZSBW1lZGlhiAEBEkUKDG1lZGlhX3VwZGF0ZRgHIAEoCzIdLkVu'
|
'9udGVudC5NZWRpYVVwZGF0ZUgGUgttZWRpYVVwZGF0ZYgBARJLCg5jb250YWN0X3VwZGF0ZRgI'
|
||||||
'Y3J5cHRlZENvbnRlbnQuTWVkaWFVcGRhdGVIB1ILbWVkaWFVcGRhdGWIAQESSwoOY29udGFjdF'
|
'IAEoCzIfLkVuY3J5cHRlZENvbnRlbnQuQ29udGFjdFVwZGF0ZUgHUg1jb250YWN0VXBkYXRliA'
|
||||||
'91cGRhdGUYCCABKAsyHy5FbmNyeXB0ZWRDb250ZW50LkNvbnRhY3RVcGRhdGVICFINY29udGFj'
|
'EBEk4KD2NvbnRhY3RfcmVxdWVzdBgJIAEoCzIgLkVuY3J5cHRlZENvbnRlbnQuQ29udGFjdFJl'
|
||||||
'dFVwZGF0ZYgBARJOCg9jb250YWN0X3JlcXVlc3QYCSABKAsyIC5FbmNyeXB0ZWRDb250ZW50Lk'
|
'cXVlc3RICFIOY29udGFjdFJlcXVlc3SIAQESPwoKZmxhbWVfc3luYxgKIAEoCzIbLkVuY3J5cH'
|
||||||
'NvbnRhY3RSZXF1ZXN0SAlSDmNvbnRhY3RSZXF1ZXN0iAEBEj8KCmZsYW1lX3N5bmMYCiABKAsy'
|
'RlZENvbnRlbnQuRmxhbWVTeW5jSAlSCWZsYW1lU3luY4gBARI8CglwdXNoX2tleXMYCyABKAsy'
|
||||||
'Gy5FbmNyeXB0ZWRDb250ZW50LkZsYW1lU3luY0gKUglmbGFtZVN5bmOIAQESPAoJcHVzaF9rZX'
|
'Gi5FbmNyeXB0ZWRDb250ZW50LlB1c2hLZXlzSApSCHB1c2hLZXlziAEBEjsKCHJlYWN0aW9uGA'
|
||||||
'lzGAsgASgLMhouRW5jcnlwdGVkQ29udGVudC5QdXNoS2V5c0gLUghwdXNoS2V5c4gBARI7Cghy'
|
'wgASgLMhouRW5jcnlwdGVkQ29udGVudC5SZWFjdGlvbkgLUghyZWFjdGlvbogBARJFCgx0ZXh0'
|
||||||
'ZWFjdGlvbhgMIAEoCzIaLkVuY3J5cHRlZENvbnRlbnQuUmVhY3Rpb25IDFIIcmVhY3Rpb26IAQ'
|
'X21lc3NhZ2UYDSABKAsyHS5FbmNyeXB0ZWRDb250ZW50LlRleHRNZXNzYWdlSAxSC3RleHRNZX'
|
||||||
'ESRQoMdGV4dF9tZXNzYWdlGA0gASgLMh0uRW5jcnlwdGVkQ29udGVudC5UZXh0TWVzc2FnZUgN'
|
'NzYWdliAEBEkUKDGdyb3VwX2NyZWF0ZRgOIAEoCzIdLkVuY3J5cHRlZENvbnRlbnQuR3JvdXBD'
|
||||||
'Ugt0ZXh0TWVzc2FnZYgBARJFCgxncm91cF9jcmVhdGUYDiABKAsyHS5FbmNyeXB0ZWRDb250ZW'
|
'cmVhdGVIDVILZ3JvdXBDcmVhdGWIAQESPwoKZ3JvdXBfam9pbhgPIAEoCzIbLkVuY3J5cHRlZE'
|
||||||
'50Lkdyb3VwQ3JlYXRlSA5SC2dyb3VwQ3JlYXRliAEBEj8KCmdyb3VwX2pvaW4YDyABKAsyGy5F'
|
'NvbnRlbnQuR3JvdXBKb2luSA5SCWdyb3VwSm9pbogBARJFCgxncm91cF91cGRhdGUYECABKAsy'
|
||||||
'bmNyeXB0ZWRDb250ZW50Lkdyb3VwSm9pbkgPUglncm91cEpvaW6IAQESRQoMZ3JvdXBfdXBkYX'
|
'HS5FbmNyeXB0ZWRDb250ZW50Lkdyb3VwVXBkYXRlSA9SC2dyb3VwVXBkYXRliAEBEmIKF3Jlc2'
|
||||||
'RlGBAgASgLMh0uRW5jcnlwdGVkQ29udGVudC5Hcm91cFVwZGF0ZUgQUgtncm91cFVwZGF0ZYgB'
|
'VuZF9ncm91cF9wdWJsaWNfa2V5GBEgASgLMiYuRW5jcnlwdGVkQ29udGVudC5SZXNlbmRHcm91'
|
||||||
'ARJiChdyZXNlbmRfZ3JvdXBfcHVibGljX2tleRgRIAEoCzImLkVuY3J5cHRlZENvbnRlbnQuUm'
|
'cFB1YmxpY0tleUgQUhRyZXNlbmRHcm91cFB1YmxpY0tleYgBARJLCg5lcnJvcl9tZXNzYWdlcx'
|
||||||
'VzZW5kR3JvdXBQdWJsaWNLZXlIEVIUcmVzZW5kR3JvdXBQdWJsaWNLZXmIAQESSwoOZXJyb3Jf'
|
'gSIAEoCzIfLkVuY3J5cHRlZENvbnRlbnQuRXJyb3JNZXNzYWdlc0gRUg1lcnJvck1lc3NhZ2Vz'
|
||||||
'bWVzc2FnZXMYEiABKAsyHy5FbmNyeXB0ZWRDb250ZW50LkVycm9yTWVzc2FnZXNIElINZXJyb3'
|
'iAEBEmQKF2FkZGl0aW9uYWxfZGF0YV9tZXNzYWdlGBMgASgLMicuRW5jcnlwdGVkQ29udGVudC'
|
||||||
'JNZXNzYWdlc4gBARJkChdhZGRpdGlvbmFsX2RhdGFfbWVzc2FnZRgTIAEoCzInLkVuY3J5cHRl'
|
'5BZGRpdGlvbmFsRGF0YU1lc3NhZ2VIElIVYWRkaXRpb25hbERhdGFNZXNzYWdliAEBElEKEHR5'
|
||||||
'ZENvbnRlbnQuQWRkaXRpb25hbERhdGFNZXNzYWdlSBNSFWFkZGl0aW9uYWxEYXRhTWVzc2FnZY'
|
'cGluZ19pbmRpY2F0b3IYFCABKAsyIS5FbmNyeXB0ZWRDb250ZW50LlR5cGluZ0luZGljYXRvck'
|
||||||
'gBARJRChB0eXBpbmdfaW5kaWNhdG9yGBQgASgLMiEuRW5jcnlwdGVkQ29udGVudC5UeXBpbmdJ'
|
'gTUg90eXBpbmdJbmRpY2F0b3KIAQESYQoWdXNlcl9kaXNjb3ZlcnlfcmVxdWVzdBgWIAEoCzIm'
|
||||||
'bmRpY2F0b3JIFFIPdHlwaW5nSW5kaWNhdG9yiAEBEmEKFnVzZXJfZGlzY292ZXJ5X3JlcXVlc3'
|
'LkVuY3J5cHRlZENvbnRlbnQuVXNlckRpc2NvdmVyeVJlcXVlc3RIFFIUdXNlckRpc2NvdmVyeV'
|
||||||
'QYFiABKAsyJi5FbmNyeXB0ZWRDb250ZW50LlVzZXJEaXNjb3ZlcnlSZXF1ZXN0SBVSFHVzZXJE'
|
'JlcXVlc3SIAQESXgoVdXNlcl9kaXNjb3ZlcnlfdXBkYXRlGBcgASgLMiUuRW5jcnlwdGVkQ29u'
|
||||||
'aXNjb3ZlcnlSZXF1ZXN0iAEBEl4KFXVzZXJfZGlzY292ZXJ5X3VwZGF0ZRgXIAEoCzIlLkVuY3'
|
'dGVudC5Vc2VyRGlzY292ZXJ5VXBkYXRlSBVSE3VzZXJEaXNjb3ZlcnlVcGRhdGWIAQESYQoWa2'
|
||||||
'J5cHRlZENvbnRlbnQuVXNlckRpc2NvdmVyeVVwZGF0ZUgWUhN1c2VyRGlzY292ZXJ5VXBkYXRl'
|
'V5X3ZlcmlmaWNhdGlvbl9wcm9vZhgYIAEoCzImLkVuY3J5cHRlZENvbnRlbnQuS2V5VmVyaWZp'
|
||||||
'iAEBEmEKFmtleV92ZXJpZmljYXRpb25fcHJvb2YYGCABKAsyJi5FbmNyeXB0ZWRDb250ZW50Lk'
|
'Y2F0aW9uUHJvb2ZIFlIUa2V5VmVyaWZpY2F0aW9uUHJvb2aIAQEa8AEKDUVycm9yTWVzc2FnZX'
|
||||||
'tleVZlcmlmaWNhdGlvblByb29mSBdSFGtleVZlcmlmaWNhdGlvblByb29miAEBEmAKFXBhc3N3'
|
'MSOAoEdHlwZRgBIAEoDjIkLkVuY3J5cHRlZENvbnRlbnQuRXJyb3JNZXNzYWdlcy5UeXBlUgR0'
|
||||||
'b3JkbGVzc19yZWNvdmVyeRgaIAEoCzImLkVuY3J5cHRlZENvbnRlbnQuUGFzc3dvcmRMZXNzUm'
|
'eXBlEiwKEnJlbGF0ZWRfcmVjZWlwdF9pZBgCIAEoCVIQcmVsYXRlZFJlY2VpcHRJZCJ3CgRUeX'
|
||||||
'Vjb3ZlcnlIGFIUcGFzc3dvcmRsZXNzUmVjb3ZlcnmIAQESfAofcGFzc3dvcmRsZXNzX3JlY292'
|
'BlEjwKOEVSUk9SX1BST0NFU1NJTkdfTUVTU0FHRV9DUkVBVEVEX0FDQ09VTlRfUkVRVUVTVF9J'
|
||||||
'ZXJ5X2hlYXJ0YmVhdBgbIAEoCzIvLkVuY3J5cHRlZENvbnRlbnQuUGFzc3dvcmRMZXNzUmVjb3'
|
'TlNURUFEEAASGAoUVU5LTk9XTl9NRVNTQUdFX1RZUEUQAhIXChNTRVNTSU9OX09VVF9PRl9TWU'
|
||||||
'ZlcnlIZWFydGJlYXRIGVIdcGFzc3dvcmRsZXNzUmVjb3ZlcnlIZWFydGJlYXSIAQEalgIKDUVy'
|
'5DEAMaVAoLR3JvdXBDcmVhdGUSGwoJc3RhdGVfa2V5GAMgASgMUghzdGF0ZUtleRIoChBncm91'
|
||||||
'cm9yTWVzc2FnZXMSOAoEdHlwZRgBIAEoDjIkLkVuY3J5cHRlZENvbnRlbnQuRXJyb3JNZXNzYW'
|
'cF9wdWJsaWNfa2V5GAQgASgMUg5ncm91cFB1YmxpY0tleRo1CglHcm91cEpvaW4SKAoQZ3JvdX'
|
||||||
'dlcy5UeXBlUgR0eXBlEiwKEnJlbGF0ZWRfcmVjZWlwdF9pZBgCIAEoCVIQcmVsYXRlZFJlY2Vp'
|
'BfcHVibGljX2tleRgBIAEoDFIOZ3JvdXBQdWJsaWNLZXkaFgoUUmVzZW5kR3JvdXBQdWJsaWNL'
|
||||||
'cHRJZCKcAQoEVHlwZRI8CjhFUlJPUl9QUk9DRVNTSU5HX01FU1NBR0VfQ1JFQVRFRF9BQ0NPVU'
|
'ZXkayAIKC0dyb3VwVXBkYXRlEioKEWdyb3VwX2FjdGlvbl90eXBlGAEgASgJUg9ncm91cEFjdG'
|
||||||
'5UX1JFUVVFU1RfSU5TVEVBRBAAEhgKFFVOS05PV05fTUVTU0FHRV9UWVBFEAISFwoTU0VTU0lP'
|
'lvblR5cGUSMwoTYWZmZWN0ZWRfY29udGFjdF9pZBgCIAEoA0gAUhFhZmZlY3RlZENvbnRhY3RJ'
|
||||||
'Tl9PVVRfT0ZfU1lOQxADEiMKH0dST1VQX05PVF9GT1VORF9PUl9OT1RfQV9NRU1CRVIQBBqHAQ'
|
'ZIgBARIpCg5uZXdfZ3JvdXBfbmFtZRgDIAEoCUgBUgxuZXdHcm91cE5hbWWIAQESVwombmV3X2'
|
||||||
'oLR3JvdXBDcmVhdGUSGwoJc3RhdGVfa2V5GAMgASgMUghzdGF0ZUtleRIoChBncm91cF9wdWJs'
|
'RlbGV0ZV9tZXNzYWdlc19hZnRlcl9taWxsaXNlY29uZHMYBCABKANIAlIibmV3RGVsZXRlTWVz'
|
||||||
'aWNfa2V5GAQgASgMUg5ncm91cFB1YmxpY0tleRIiCgpncm91cF9uYW1lGAUgASgJSABSCWdyb3'
|
'c2FnZXNBZnRlck1pbGxpc2Vjb25kc4gBAUIWChRfYWZmZWN0ZWRfY29udGFjdF9pZEIRCg9fbm'
|
||||||
'VwTmFtZYgBAUINCgtfZ3JvdXBfbmFtZRo1CglHcm91cEpvaW4SKAoQZ3JvdXBfcHVibGljX2tl'
|
'V3X2dyb3VwX25hbWVCKQonX25ld19kZWxldGVfbWVzc2FnZXNfYWZ0ZXJfbWlsbGlzZWNvbmRz'
|
||||||
'eRgBIAEoDFIOZ3JvdXBQdWJsaWNLZXkaFgoUUmVzZW5kR3JvdXBQdWJsaWNLZXkayAIKC0dyb3'
|
'Gq8BCgtUZXh0TWVzc2FnZRIqChFzZW5kZXJfbWVzc2FnZV9pZBgBIAEoCVIPc2VuZGVyTWVzc2'
|
||||||
'VwVXBkYXRlEioKEWdyb3VwX2FjdGlvbl90eXBlGAEgASgJUg9ncm91cEFjdGlvblR5cGUSMwoT'
|
'FnZUlkEhIKBHRleHQYAiABKAlSBHRleHQSHAoJdGltZXN0YW1wGAMgASgDUgl0aW1lc3RhbXAS'
|
||||||
'YWZmZWN0ZWRfY29udGFjdF9pZBgCIAEoA0gAUhFhZmZlY3RlZENvbnRhY3RJZIgBARIpCg5uZX'
|
'LQoQcXVvdGVfbWVzc2FnZV9pZBgEIAEoCUgAUg5xdW90ZU1lc3NhZ2VJZIgBAUITChFfcXVvdG'
|
||||||
'dfZ3JvdXBfbmFtZRgDIAEoCUgBUgxuZXdHcm91cE5hbWWIAQESVwombmV3X2RlbGV0ZV9tZXNz'
|
'VfbWVzc2FnZV9pZBrOAQoVQWRkaXRpb25hbERhdGFNZXNzYWdlEioKEXNlbmRlcl9tZXNzYWdl'
|
||||||
'YWdlc19hZnRlcl9taWxsaXNlY29uZHMYBCABKANIAlIibmV3RGVsZXRlTWVzc2FnZXNBZnRlck'
|
'X2lkGAEgASgJUg9zZW5kZXJNZXNzYWdlSWQSHAoJdGltZXN0YW1wGAIgASgDUgl0aW1lc3RhbX'
|
||||||
'1pbGxpc2Vjb25kc4gBAUIWChRfYWZmZWN0ZWRfY29udGFjdF9pZEIRCg9fbmV3X2dyb3VwX25h'
|
'ASEgoEdHlwZRgDIAEoCVIEdHlwZRI7ChdhZGRpdGlvbmFsX21lc3NhZ2VfZGF0YRgEIAEoDEgA'
|
||||||
'bWVCKQonX25ld19kZWxldGVfbWVzc2FnZXNfYWZ0ZXJfbWlsbGlzZWNvbmRzGq8BCgtUZXh0TW'
|
'UhVhZGRpdGlvbmFsTWVzc2FnZURhdGGIAQFCGgoYX2FkZGl0aW9uYWxfbWVzc2FnZV9kYXRhGm'
|
||||||
'Vzc2FnZRIqChFzZW5kZXJfbWVzc2FnZV9pZBgBIAEoCVIPc2VuZGVyTWVzc2FnZUlkEhIKBHRl'
|
'QKCFJlYWN0aW9uEioKEXRhcmdldF9tZXNzYWdlX2lkGAEgASgJUg90YXJnZXRNZXNzYWdlSWQS'
|
||||||
'eHQYAiABKAlSBHRleHQSHAoJdGltZXN0YW1wGAMgASgDUgl0aW1lc3RhbXASLQoQcXVvdGVfbW'
|
'FAoFZW1vamkYAiABKAlSBWVtb2ppEhYKBnJlbW92ZRgDIAEoCFIGcmVtb3ZlGr4CCg1NZXNzYW'
|
||||||
'Vzc2FnZV9pZBgEIAEoCUgAUg5xdW90ZU1lc3NhZ2VJZIgBAUITChFfcXVvdGVfbWVzc2FnZV9p'
|
'dlVXBkYXRlEjgKBHR5cGUYASABKA4yJC5FbmNyeXB0ZWRDb250ZW50Lk1lc3NhZ2VVcGRhdGUu'
|
||||||
'ZBrOAQoVQWRkaXRpb25hbERhdGFNZXNzYWdlEioKEXNlbmRlcl9tZXNzYWdlX2lkGAEgASgJUg'
|
'VHlwZVIEdHlwZRIvChFzZW5kZXJfbWVzc2FnZV9pZBgCIAEoCUgAUg9zZW5kZXJNZXNzYWdlSW'
|
||||||
'9zZW5kZXJNZXNzYWdlSWQSHAoJdGltZXN0YW1wGAIgASgDUgl0aW1lc3RhbXASEgoEdHlwZRgD'
|
'SIAQESPQobbXVsdGlwbGVfdGFyZ2V0X21lc3NhZ2VfaWRzGAMgAygJUhhtdWx0aXBsZVRhcmdl'
|
||||||
'IAEoCVIEdHlwZRI7ChdhZGRpdGlvbmFsX21lc3NhZ2VfZGF0YRgEIAEoDEgAUhVhZGRpdGlvbm'
|
'dE1lc3NhZ2VJZHMSFwoEdGV4dBgEIAEoCUgBUgR0ZXh0iAEBEhwKCXRpbWVzdGFtcBgFIAEoA1'
|
||||||
'FsTWVzc2FnZURhdGGIAQFCGgoYX2FkZGl0aW9uYWxfbWVzc2FnZV9kYXRhGmQKCFJlYWN0aW9u'
|
'IJdGltZXN0YW1wIi0KBFR5cGUSCgoGREVMRVRFEAASDQoJRURJVF9URVhUEAESCgoGT1BFTkVE'
|
||||||
'EioKEXRhcmdldF9tZXNzYWdlX2lkGAEgASgJUg90YXJnZXRNZXNzYWdlSWQSFAoFZW1vamkYAi'
|
'EAJCFAoSX3NlbmRlcl9tZXNzYWdlX2lkQgcKBV90ZXh0GoUGCgVNZWRpYRIqChFzZW5kZXJfbW'
|
||||||
'ABKAlSBWVtb2ppEhYKBnJlbW92ZRgDIAEoCFIGcmVtb3ZlGr4CCg1NZXNzYWdlVXBkYXRlEjgK'
|
'Vzc2FnZV9pZBgBIAEoCVIPc2VuZGVyTWVzc2FnZUlkEjAKBHR5cGUYAiABKA4yHC5FbmNyeXB0'
|
||||||
'BHR5cGUYASABKA4yJC5FbmNyeXB0ZWRDb250ZW50Lk1lc3NhZ2VVcGRhdGUuVHlwZVIEdHlwZR'
|
'ZWRDb250ZW50Lk1lZGlhLlR5cGVSBHR5cGUSRgodZGlzcGxheV9saW1pdF9pbl9taWxsaXNlY2'
|
||||||
'IvChFzZW5kZXJfbWVzc2FnZV9pZBgCIAEoCUgAUg9zZW5kZXJNZXNzYWdlSWSIAQESPQobbXVs'
|
'9uZHMYAyABKANIAFIaZGlzcGxheUxpbWl0SW5NaWxsaXNlY29uZHOIAQESNwoXcmVxdWlyZXNf'
|
||||||
'dGlwbGVfdGFyZ2V0X21lc3NhZ2VfaWRzGAMgAygJUhhtdWx0aXBsZVRhcmdldE1lc3NhZ2VJZH'
|
'YXV0aGVudGljYXRpb24YBCABKAhSFnJlcXVpcmVzQXV0aGVudGljYXRpb24SHAoJdGltZXN0YW'
|
||||||
'MSFwoEdGV4dBgEIAEoCUgBUgR0ZXh0iAEBEhwKCXRpbWVzdGFtcBgFIAEoA1IJdGltZXN0YW1w'
|
'1wGAUgASgDUgl0aW1lc3RhbXASLQoQcXVvdGVfbWVzc2FnZV9pZBgGIAEoCUgBUg5xdW90ZU1l'
|
||||||
'Ii0KBFR5cGUSCgoGREVMRVRFEAASDQoJRURJVF9URVhUEAESCgoGT1BFTkVEEAJCFAoSX3Nlbm'
|
'c3NhZ2VJZIgBARIqCg5kb3dubG9hZF90b2tlbhgHIAEoDEgCUg1kb3dubG9hZFRva2VuiAEBEi'
|
||||||
'Rlcl9tZXNzYWdlX2lkQgcKBV90ZXh0GoUGCgVNZWRpYRIqChFzZW5kZXJfbWVzc2FnZV9pZBgB'
|
'oKDmVuY3J5cHRpb25fa2V5GAggASgMSANSDWVuY3J5cHRpb25LZXmIAQESKgoOZW5jcnlwdGlv'
|
||||||
'IAEoCVIPc2VuZGVyTWVzc2FnZUlkEjAKBHR5cGUYAiABKA4yHC5FbmNyeXB0ZWRDb250ZW50Lk'
|
'bl9tYWMYCSABKAxIBFINZW5jcnlwdGlvbk1hY4gBARIuChBlbmNyeXB0aW9uX25vbmNlGAogAS'
|
||||||
'1lZGlhLlR5cGVSBHR5cGUSRgodZGlzcGxheV9saW1pdF9pbl9taWxsaXNlY29uZHMYAyABKANI'
|
'gMSAVSD2VuY3J5cHRpb25Ob25jZYgBARI7ChdhZGRpdGlvbmFsX21lc3NhZ2VfZGF0YRgLIAEo'
|
||||||
'AFIaZGlzcGxheUxpbWl0SW5NaWxsaXNlY29uZHOIAQESNwoXcmVxdWlyZXNfYXV0aGVudGljYX'
|
'DEgGUhVhZGRpdGlvbmFsTWVzc2FnZURhdGGIAQEiPgoEVHlwZRIMCghSRVVQTE9BRBAAEgkKBU'
|
||||||
'Rpb24YBCABKAhSFnJlcXVpcmVzQXV0aGVudGljYXRpb24SHAoJdGltZXN0YW1wGAUgASgDUgl0'
|
'lNQUdFEAESCQoFVklERU8QAhIHCgNHSUYQAxIJCgVBVURJTxAEQiAKHl9kaXNwbGF5X2xpbWl0'
|
||||||
'aW1lc3RhbXASLQoQcXVvdGVfbWVzc2FnZV9pZBgGIAEoCUgBUg5xdW90ZU1lc3NhZ2VJZIgBAR'
|
'X2luX21pbGxpc2Vjb25kc0ITChFfcXVvdGVfbWVzc2FnZV9pZEIRCg9fZG93bmxvYWRfdG9rZW'
|
||||||
'IqCg5kb3dubG9hZF90b2tlbhgHIAEoDEgCUg1kb3dubG9hZFRva2VuiAEBEioKDmVuY3J5cHRp'
|
'5CEQoPX2VuY3J5cHRpb25fa2V5QhEKD19lbmNyeXB0aW9uX21hY0ITChFfZW5jcnlwdGlvbl9u'
|
||||||
'b25fa2V5GAggASgMSANSDWVuY3J5cHRpb25LZXmIAQESKgoOZW5jcnlwdGlvbl9tYWMYCSABKA'
|
'b25jZUIaChhfYWRkaXRpb25hbF9tZXNzYWdlX2RhdGEaqQEKC01lZGlhVXBkYXRlEjYKBHR5cG'
|
||||||
'xIBFINZW5jcnlwdGlvbk1hY4gBARIuChBlbmNyeXB0aW9uX25vbmNlGAogASgMSAVSD2VuY3J5'
|
'UYASABKA4yIi5FbmNyeXB0ZWRDb250ZW50Lk1lZGlhVXBkYXRlLlR5cGVSBHR5cGUSKgoRdGFy'
|
||||||
'cHRpb25Ob25jZYgBARI7ChdhZGRpdGlvbmFsX21lc3NhZ2VfZGF0YRgLIAEoDEgGUhVhZGRpdG'
|
'Z2V0X21lc3NhZ2VfaWQYAiABKAlSD3RhcmdldE1lc3NhZ2VJZCI2CgRUeXBlEgwKCFJFT1BFTk'
|
||||||
'lvbmFsTWVzc2FnZURhdGGIAQEiPgoEVHlwZRIMCghSRVVQTE9BRBAAEgkKBUlNQUdFEAESCQoF'
|
'VEEAASCgoGU1RPUkVEEAESFAoQREVDUllQVElPTl9FUlJPUhACGngKDkNvbnRhY3RSZXF1ZXN0'
|
||||||
'VklERU8QAhIHCgNHSUYQAxIJCgVBVURJTxAEQiAKHl9kaXNwbGF5X2xpbWl0X2luX21pbGxpc2'
|
'EjkKBHR5cGUYASABKA4yJS5FbmNyeXB0ZWRDb250ZW50LkNvbnRhY3RSZXF1ZXN0LlR5cGVSBH'
|
||||||
'Vjb25kc0ITChFfcXVvdGVfbWVzc2FnZV9pZEIRCg9fZG93bmxvYWRfdG9rZW5CEQoPX2VuY3J5'
|
'R5cGUiKwoEVHlwZRILCgdSRVFVRVNUEAASCgoGUkVKRUNUEAESCgoGQUNDRVBUEAIapAIKDUNv'
|
||||||
'cHRpb25fa2V5QhEKD19lbmNyeXB0aW9uX21hY0ITChFfZW5jcnlwdGlvbl9ub25jZUIaChhfYW'
|
'bnRhY3RVcGRhdGUSOAoEdHlwZRgBIAEoDjIkLkVuY3J5cHRlZENvbnRlbnQuQ29udGFjdFVwZG'
|
||||||
'RkaXRpb25hbF9tZXNzYWdlX2RhdGEaqQEKC01lZGlhVXBkYXRlEjYKBHR5cGUYASABKA4yIi5F'
|
'F0ZS5UeXBlUgR0eXBlEjcKFWF2YXRhcl9zdmdfY29tcHJlc3NlZBgCIAEoDEgAUhNhdmF0YXJT'
|
||||||
'bmNyeXB0ZWRDb250ZW50Lk1lZGlhVXBkYXRlLlR5cGVSBHR5cGUSKgoRdGFyZ2V0X21lc3NhZ2'
|
'dmdDb21wcmVzc2VkiAEBEh8KCHVzZXJuYW1lGAMgASgJSAFSCHVzZXJuYW1liAEBEiYKDGRpc3'
|
||||||
'VfaWQYAiABKAlSD3RhcmdldE1lc3NhZ2VJZCI2CgRUeXBlEgwKCFJFT1BFTkVEEAASCgoGU1RP'
|
'BsYXlfbmFtZRgEIAEoCUgCUgtkaXNwbGF5TmFtZYgBASIfCgRUeXBlEgsKB1JFUVVFU1QQABIK'
|
||||||
'UkVEEAESFAoQREVDUllQVElPTl9FUlJPUhACGngKDkNvbnRhY3RSZXF1ZXN0EjkKBHR5cGUYAS'
|
'CgZVUERBVEUQAUIYChZfYXZhdGFyX3N2Z19jb21wcmVzc2VkQgsKCV91c2VybmFtZUIPCg1fZG'
|
||||||
'ABKA4yJS5FbmNyeXB0ZWRDb250ZW50LkNvbnRhY3RSZXF1ZXN0LlR5cGVSBHR5cGUiKwoEVHlw'
|
'lzcGxheV9uYW1lGtkBCghQdXNoS2V5cxIzCgR0eXBlGAEgASgOMh8uRW5jcnlwdGVkQ29udGVu'
|
||||||
'ZRILCgdSRVFVRVNUEAASCgoGUkVKRUNUEAESCgoGQUNDRVBUEAIapAIKDUNvbnRhY3RVcGRhdG'
|
'dC5QdXNoS2V5cy5UeXBlUgR0eXBlEhoKBmtleV9pZBgCIAEoA0gAUgVrZXlJZIgBARIVCgNrZX'
|
||||||
'USOAoEdHlwZRgBIAEoDjIkLkVuY3J5cHRlZENvbnRlbnQuQ29udGFjdFVwZGF0ZS5UeXBlUgR0'
|
'kYAyABKAxIAVIDa2V5iAEBEiIKCmNyZWF0ZWRfYXQYBCABKANIAlIJY3JlYXRlZEF0iAEBIh8K'
|
||||||
'eXBlEjcKFWF2YXRhcl9zdmdfY29tcHJlc3NlZBgCIAEoDEgAUhNhdmF0YXJTdmdDb21wcmVzc2'
|
'BFR5cGUSCwoHUkVRVUVTVBAAEgoKBlVQREFURRABQgkKB19rZXlfaWRCBgoEX2tleUINCgtfY3'
|
||||||
'VkiAEBEh8KCHVzZXJuYW1lGAMgASgJSAFSCHVzZXJuYW1liAEBEiYKDGRpc3BsYXlfbmFtZRgE'
|
'JlYXRlZF9hdBqvAQoJRmxhbWVTeW5jEiMKDWZsYW1lX2NvdW50ZXIYASABKANSDGZsYW1lQ291'
|
||||||
'IAEoCUgCUgtkaXNwbGF5TmFtZYgBASIfCgRUeXBlEgsKB1JFUVVFU1QQABIKCgZVUERBVEUQAU'
|
'bnRlchI5ChlsYXN0X2ZsYW1lX2NvdW50ZXJfY2hhbmdlGAIgASgDUhZsYXN0RmxhbWVDb3VudG'
|
||||||
'IYChZfYXZhdGFyX3N2Z19jb21wcmVzc2VkQgsKCV91c2VybmFtZUIPCg1fZGlzcGxheV9uYW1l'
|
'VyQ2hhbmdlEh8KC2Jlc3RfZnJpZW5kGAMgASgIUgpiZXN0RnJpZW5kEiEKDGZvcmNlX3VwZGF0'
|
||||||
'GtkBCghQdXNoS2V5cxIzCgR0eXBlGAEgASgOMh8uRW5jcnlwdGVkQ29udGVudC5QdXNoS2V5cy'
|
'ZRgEIAEoCFILZm9yY2VVcGRhdGUaTQoPVHlwaW5nSW5kaWNhdG9yEhsKCWlzX3R5cGluZxgBIA'
|
||||||
'5UeXBlUgR0eXBlEhoKBmtleV9pZBgCIAEoA0gAUgVrZXlJZIgBARIVCgNrZXkYAyABKAxIAVID'
|
'EoCFIIaXNUeXBpbmcSHQoKY3JlYXRlZF9hdBgCIAEoA1IJY3JlYXRlZEF0Gj8KFFVzZXJEaXNj'
|
||||||
'a2V5iAEBEiIKCmNyZWF0ZWRfYXQYBCABKANIAlIJY3JlYXRlZEF0iAEBIh8KBFR5cGUSCwoHUk'
|
'b3ZlcnlSZXF1ZXN0EicKD2N1cnJlbnRfdmVyc2lvbhgBIAEoDFIOY3VycmVudFZlcnNpb24aMQ'
|
||||||
'VRVUVTVBAAEgoKBlVQREFURRABQgkKB19rZXlfaWRCBgoEX2tleUINCgtfY3JlYXRlZF9hdBqv'
|
'oTVXNlckRpc2NvdmVyeVVwZGF0ZRIaCghtZXNzYWdlcxgBIAMoDFIIbWVzc2FnZXMaPQoUS2V5'
|
||||||
'AQoJRmxhbWVTeW5jEiMKDWZsYW1lX2NvdW50ZXIYASABKANSDGZsYW1lQ291bnRlchI5ChlsYX'
|
'VmVyaWZpY2F0aW9uUHJvb2YSJQoOY2FsY3VsYXRlZF9tYWMYASABKAxSDWNhbGN1bGF0ZWRNYW'
|
||||||
'N0X2ZsYW1lX2NvdW50ZXJfY2hhbmdlGAIgASgDUhZsYXN0RmxhbWVDb3VudGVyQ2hhbmdlEh8K'
|
'NCCwoJX2dyb3VwX2lkQhEKD19pc19kaXJlY3RfY2hhdEIZChdfc2VuZGVyX3Byb2ZpbGVfY291'
|
||||||
'C2Jlc3RfZnJpZW5kGAMgASgIUgpiZXN0RnJpZW5kEiEKDGZvcmNlX3VwZGF0ZRgEIAEoCFILZm'
|
'bnRlckIgCh5fc2VuZGVyX3VzZXJfZGlzY292ZXJ5X3ZlcnNpb25CEQoPX21lc3NhZ2VfdXBkYX'
|
||||||
'9yY2VVcGRhdGUaTQoPVHlwaW5nSW5kaWNhdG9yEhsKCWlzX3R5cGluZxgBIAEoCFIIaXNUeXBp'
|
'RlQggKBl9tZWRpYUIPCg1fbWVkaWFfdXBkYXRlQhEKD19jb250YWN0X3VwZGF0ZUISChBfY29u'
|
||||||
'bmcSHQoKY3JlYXRlZF9hdBgCIAEoA1IJY3JlYXRlZEF0Gj8KFFVzZXJEaXNjb3ZlcnlSZXF1ZX'
|
'dGFjdF9yZXF1ZXN0Qg0KC19mbGFtZV9zeW5jQgwKCl9wdXNoX2tleXNCCwoJX3JlYWN0aW9uQg'
|
||||||
'N0EicKD2N1cnJlbnRfdmVyc2lvbhgBIAEoDFIOY3VycmVudFZlcnNpb24aMQoTVXNlckRpc2Nv'
|
'8KDV90ZXh0X21lc3NhZ2VCDwoNX2dyb3VwX2NyZWF0ZUINCgtfZ3JvdXBfam9pbkIPCg1fZ3Jv'
|
||||||
'dmVyeVVwZGF0ZRIaCghtZXNzYWdlcxgBIAMoDFIIbWVzc2FnZXMaPQoUS2V5VmVyaWZpY2F0aW'
|
'dXBfdXBkYXRlQhoKGF9yZXNlbmRfZ3JvdXBfcHVibGljX2tleUIRCg9fZXJyb3JfbWVzc2FnZX'
|
||||||
'9uUHJvb2YSJQoOY2FsY3VsYXRlZF9tYWMYASABKAxSDWNhbGN1bGF0ZWRNYWMamwEKFFBhc3N3'
|
'NCGgoYX2FkZGl0aW9uYWxfZGF0YV9tZXNzYWdlQhMKEV90eXBpbmdfaW5kaWNhdG9yQhkKF191'
|
||||||
'b3JkTGVzc1JlY292ZXJ5EjUKE3JlY292ZXJ5U2VjcmV0U2hhcmUYASABKAxIAFITcmVjb3Zlcn'
|
'c2VyX2Rpc2NvdmVyeV9yZXF1ZXN0QhgKFl91c2VyX2Rpc2NvdmVyeV91cGRhdGVCGQoXX2tleV'
|
||||||
'lTZWNyZXRTaGFyZYgBARIWCgZkZWxldGUYAiABKAhSBmRlbGV0ZRIcCgl0aHJlc2hvbGQYAyAB'
|
'92ZXJpZmljYXRpb25fcHJvb2Y=');
|
||||||
'KANSCXRocmVzaG9sZEIWChRfcmVjb3ZlcnlTZWNyZXRTaGFyZRozCh1QYXNzd29yZExlc3NSZW'
|
|
||||||
'NvdmVyeUhlYXJ0YmVhdBISCgRoYXNoGAEgASgMUgRoYXNoQgsKCV9ncm91cF9pZEIRCg9faXNf'
|
|
||||||
'ZGlyZWN0X2NoYXRCGQoXX3NlbmRlcl9wcm9maWxlX2NvdW50ZXJCIAoeX3NlbmRlcl91c2VyX2'
|
|
||||||
'Rpc2NvdmVyeV92ZXJzaW9uQhwKGl9hc2tfZm9yX2ZyaWVuZF9wcm9tb3Rpb25zQhEKD19tZXNz'
|
|
||||||
'YWdlX3VwZGF0ZUIICgZfbWVkaWFCDwoNX21lZGlhX3VwZGF0ZUIRCg9fY29udGFjdF91cGRhdG'
|
|
||||||
'VCEgoQX2NvbnRhY3RfcmVxdWVzdEINCgtfZmxhbWVfc3luY0IMCgpfcHVzaF9rZXlzQgsKCV9y'
|
|
||||||
'ZWFjdGlvbkIPCg1fdGV4dF9tZXNzYWdlQg8KDV9ncm91cF9jcmVhdGVCDQoLX2dyb3VwX2pvaW'
|
|
||||||
'5CDwoNX2dyb3VwX3VwZGF0ZUIaChhfcmVzZW5kX2dyb3VwX3B1YmxpY19rZXlCEQoPX2Vycm9y'
|
|
||||||
'X21lc3NhZ2VzQhoKGF9hZGRpdGlvbmFsX2RhdGFfbWVzc2FnZUITChFfdHlwaW5nX2luZGljYX'
|
|
||||||
'RvckIZChdfdXNlcl9kaXNjb3ZlcnlfcmVxdWVzdEIYChZfdXNlcl9kaXNjb3ZlcnlfdXBkYXRl'
|
|
||||||
'QhkKF19rZXlfdmVyaWZpY2F0aW9uX3Byb29mQhgKFl9wYXNzd29yZGxlc3NfcmVjb3ZlcnlCIg'
|
|
||||||
'ogX3Bhc3N3b3JkbGVzc19yZWNvdmVyeV9oZWFydGJlYXQ=');
|
|
||||||
|
|
|
||||||
|
|
@ -1,544 +0,0 @@
|
||||||
// This is a generated file - do not edit.
|
|
||||||
//
|
|
||||||
// Generated from passwordless_recovery.proto.
|
|
||||||
|
|
||||||
// @dart = 3.3
|
|
||||||
|
|
||||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
|
||||||
// ignore_for_file: constant_identifier_names
|
|
||||||
// ignore_for_file: curly_braces_in_flow_control_structures
|
|
||||||
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
|
|
||||||
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
|
|
||||||
|
|
||||||
import 'dart:core' as $core;
|
|
||||||
|
|
||||||
import 'package:fixnum/fixnum.dart' as $fixnum;
|
|
||||||
import 'package:protobuf/protobuf.dart' as $pb;
|
|
||||||
|
|
||||||
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
|
|
||||||
|
|
||||||
/// Send from the person who tries to recover their account.
|
|
||||||
/// This can be done via a link, which will then be opend in the app of the contact.
|
|
||||||
/// The contact than has to manualy select from which user he got the request.
|
|
||||||
/// -> Using this phishing is harder, as the user has to manualy select the user to recovery
|
|
||||||
/// -> The user who wants to recover his account does not need to remember her old username
|
|
||||||
class RecoveryRequest extends $pb.GeneratedMessage {
|
|
||||||
factory RecoveryRequest({
|
|
||||||
$core.String? notificationId,
|
|
||||||
$core.List<$core.int>? publicKey,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (notificationId != null) result.notificationId = notificationId;
|
|
||||||
if (publicKey != null) result.publicKey = publicKey;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
RecoveryRequest._();
|
|
||||||
|
|
||||||
factory RecoveryRequest.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory RecoveryRequest.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'RecoveryRequest',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aOS(1, _omitFieldNames ? '' : 'notificationId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'publicKey', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryRequest clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryRequest copyWith(void Function(RecoveryRequest) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as RecoveryRequest))
|
|
||||||
as RecoveryRequest;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryRequest create() => RecoveryRequest._();
|
|
||||||
@$core.override
|
|
||||||
RecoveryRequest createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryRequest getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<RecoveryRequest>(create);
|
|
||||||
static RecoveryRequest? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.String get notificationId => $_getSZ(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set notificationId($core.String value) => $_setString(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasNotificationId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearNotificationId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get publicKey => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set publicKey($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasPublicKey() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearPublicKey() => $_clearField(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used as envelope for TrustedFriendShare and RecoveryData
|
|
||||||
class EncryptedEnvelope extends $pb.GeneratedMessage {
|
|
||||||
factory EncryptedEnvelope({
|
|
||||||
$core.List<$core.int>? encryptedData,
|
|
||||||
$core.List<$core.int>? iv,
|
|
||||||
$core.List<$core.int>? mac,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (encryptedData != null) result.encryptedData = encryptedData;
|
|
||||||
if (iv != null) result.iv = iv;
|
|
||||||
if (mac != null) result.mac = mac;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
EncryptedEnvelope._();
|
|
||||||
|
|
||||||
factory EncryptedEnvelope.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory EncryptedEnvelope.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'EncryptedEnvelope',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
1, _omitFieldNames ? '' : 'encryptedData', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'iv', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'mac', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedEnvelope clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedEnvelope copyWith(void Function(EncryptedEnvelope) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as EncryptedEnvelope))
|
|
||||||
as EncryptedEnvelope;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedEnvelope create() => EncryptedEnvelope._();
|
|
||||||
@$core.override
|
|
||||||
EncryptedEnvelope createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedEnvelope getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<EncryptedEnvelope>(create);
|
|
||||||
static EncryptedEnvelope? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.List<$core.int> get encryptedData => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set encryptedData($core.List<$core.int> value) => $_setBytes(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasEncryptedData() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearEncryptedData() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get iv => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set iv($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasIv() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearIv() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get mac => $_getN(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set mac($core.List<$core.int> value) => $_setBytes(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasMac() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearMac() => $_clearField(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
class TrustedFriendShare_User extends $pb.GeneratedMessage {
|
|
||||||
factory TrustedFriendShare_User({
|
|
||||||
$fixnum.Int64? userId,
|
|
||||||
$core.String? displayName,
|
|
||||||
$core.List<$core.int>? avatar,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (userId != null) result.userId = userId;
|
|
||||||
if (displayName != null) result.displayName = displayName;
|
|
||||||
if (avatar != null) result.avatar = avatar;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
TrustedFriendShare_User._();
|
|
||||||
|
|
||||||
factory TrustedFriendShare_User.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory TrustedFriendShare_User.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'TrustedFriendShare.User',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aInt64(1, _omitFieldNames ? '' : 'userId')
|
|
||||||
..aOS(2, _omitFieldNames ? '' : 'displayName')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'avatar', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare_User clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare_User copyWith(
|
|
||||||
void Function(TrustedFriendShare_User) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as TrustedFriendShare_User))
|
|
||||||
as TrustedFriendShare_User;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare_User create() => TrustedFriendShare_User._();
|
|
||||||
@$core.override
|
|
||||||
TrustedFriendShare_User createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare_User getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<TrustedFriendShare_User>(create);
|
|
||||||
static TrustedFriendShare_User? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$fixnum.Int64 get userId => $_getI64(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set userId($fixnum.Int64 value) => $_setInt64(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasUserId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearUserId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.String get displayName => $_getSZ(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set displayName($core.String value) => $_setString(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasDisplayName() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearDisplayName() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get avatar => $_getN(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set avatar($core.List<$core.int> value) => $_setBytes(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasAvatar() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearAvatar() => $_clearField(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Send from the trusted friend to
|
|
||||||
/// This is encrypted with the received public key.
|
|
||||||
class TrustedFriendShare extends $pb.GeneratedMessage {
|
|
||||||
factory TrustedFriendShare({
|
|
||||||
TrustedFriendShare_User? trustedFriend,
|
|
||||||
TrustedFriendShare_User? shareUser,
|
|
||||||
$core.int? threshold,
|
|
||||||
$core.List<$core.int>? sharedSecretData,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (trustedFriend != null) result.trustedFriend = trustedFriend;
|
|
||||||
if (shareUser != null) result.shareUser = shareUser;
|
|
||||||
if (threshold != null) result.threshold = threshold;
|
|
||||||
if (sharedSecretData != null) result.sharedSecretData = sharedSecretData;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
TrustedFriendShare._();
|
|
||||||
|
|
||||||
factory TrustedFriendShare.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory TrustedFriendShare.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'TrustedFriendShare',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aOM<TrustedFriendShare_User>(1, _omitFieldNames ? '' : 'trustedFriend',
|
|
||||||
subBuilder: TrustedFriendShare_User.create)
|
|
||||||
..aOM<TrustedFriendShare_User>(2, _omitFieldNames ? '' : 'shareUser',
|
|
||||||
subBuilder: TrustedFriendShare_User.create)
|
|
||||||
..aI(3, _omitFieldNames ? '' : 'threshold')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
4, _omitFieldNames ? '' : 'sharedSecretData', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare copyWith(void Function(TrustedFriendShare) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as TrustedFriendShare))
|
|
||||||
as TrustedFriendShare;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare create() => TrustedFriendShare._();
|
|
||||||
@$core.override
|
|
||||||
TrustedFriendShare createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<TrustedFriendShare>(create);
|
|
||||||
static TrustedFriendShare? _defaultInstance;
|
|
||||||
|
|
||||||
/// This allows to display the user which user has send him his recovery data.
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
TrustedFriendShare_User get trustedFriend => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set trustedFriend(TrustedFriendShare_User value) => $_setField(1, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasTrustedFriend() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearTrustedFriend() => $_clearField(1);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
TrustedFriendShare_User ensureTrustedFriend() => $_ensure(0);
|
|
||||||
|
|
||||||
/// This allows to display the userdata, showing that he is recovering the correct person.
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
TrustedFriendShare_User get shareUser => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set shareUser(TrustedFriendShare_User value) => $_setField(2, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasShareUser() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearShareUser() => $_clearField(2);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
TrustedFriendShare_User ensureShareUser() => $_ensure(1);
|
|
||||||
|
|
||||||
/// The minimum threshold required to decrypte the shares.
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.int get threshold => $_getIZ(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set threshold($core.int value) => $_setSignedInt32(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasThreshold() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearThreshold() => $_clearField(3);
|
|
||||||
|
|
||||||
/// The actual share which will become: SharedSecretData
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.List<$core.int> get sharedSecretData => $_getN(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
set sharedSecretData($core.List<$core.int> value) => $_setBytes(3, value);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.bool hasSharedSecretData() => $_has(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
void clearSharedSecretData() => $_clearField(4);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The user identity keys. Can be used to restore the data backup.
|
|
||||||
class RecoveryData extends $pb.GeneratedMessage {
|
|
||||||
factory RecoveryData({
|
|
||||||
$fixnum.Int64? userId,
|
|
||||||
$core.List<$core.int>? keyManager,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (userId != null) result.userId = userId;
|
|
||||||
if (keyManager != null) result.keyManager = keyManager;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
RecoveryData._();
|
|
||||||
|
|
||||||
factory RecoveryData.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory RecoveryData.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'RecoveryData',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aInt64(1, _omitFieldNames ? '' : 'userId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'keyManager', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryData clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryData copyWith(void Function(RecoveryData) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as RecoveryData))
|
|
||||||
as RecoveryData;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryData create() => RecoveryData._();
|
|
||||||
@$core.override
|
|
||||||
RecoveryData createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryData getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<RecoveryData>(create);
|
|
||||||
static RecoveryData? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$fixnum.Int64 get userId => $_getI64(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set userId($fixnum.Int64 value) => $_setInt64(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasUserId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearUserId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get keyManager => $_getN(1);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set keyManager($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasKeyManager() => $_has(1);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearKeyManager() => $_clearField(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// After received all shares this is decrypted by the user restoring its own
|
|
||||||
class SharedSecretData extends $pb.GeneratedMessage {
|
|
||||||
factory SharedSecretData({
|
|
||||||
$core.List<$core.int>? recoveryData,
|
|
||||||
$core.List<$core.int>? encryptedServerKeyNonce,
|
|
||||||
$core.List<$core.int>? pinSeed,
|
|
||||||
$core.List<$core.int>? pinUnlockToken,
|
|
||||||
$core.String? emailHint,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (recoveryData != null) result.recoveryData = recoveryData;
|
|
||||||
if (encryptedServerKeyNonce != null)
|
|
||||||
result.encryptedServerKeyNonce = encryptedServerKeyNonce;
|
|
||||||
if (pinSeed != null) result.pinSeed = pinSeed;
|
|
||||||
if (pinUnlockToken != null) result.pinUnlockToken = pinUnlockToken;
|
|
||||||
if (emailHint != null) result.emailHint = emailHint;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedSecretData._();
|
|
||||||
|
|
||||||
factory SharedSecretData.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory SharedSecretData.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'SharedSecretData',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
1, _omitFieldNames ? '' : 'recoveryData', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'encryptedServerKeyNonce', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
4, _omitFieldNames ? '' : 'pinSeed', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
5, _omitFieldNames ? '' : 'pinUnlockToken', $pb.PbFieldType.OY)
|
|
||||||
..aOS(6, _omitFieldNames ? '' : 'emailHint')
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData copyWith(void Function(SharedSecretData) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as SharedSecretData))
|
|
||||||
as SharedSecretData;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData create() => SharedSecretData._();
|
|
||||||
@$core.override
|
|
||||||
SharedSecretData createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<SharedSecretData>(create);
|
|
||||||
static SharedSecretData? _defaultInstance;
|
|
||||||
|
|
||||||
/// The recovery data is encrypted in case a second factor was chosen.
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.List<$core.int> get recoveryData => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set recoveryData($core.List<$core.int> value) => $_setBytes(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasRecoveryData() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearRecoveryData() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get encryptedServerKeyNonce => $_getN(1);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set encryptedServerKeyNonce($core.List<$core.int> value) =>
|
|
||||||
$_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasEncryptedServerKeyNonce() => $_has(1);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearEncryptedServerKeyNonce() => $_clearField(3);
|
|
||||||
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.List<$core.int> get pinSeed => $_getN(2);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
set pinSeed($core.List<$core.int> value) => $_setBytes(2, value);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.bool hasPinSeed() => $_has(2);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
void clearPinSeed() => $_clearField(4);
|
|
||||||
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
$core.List<$core.int> get pinUnlockToken => $_getN(3);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
set pinUnlockToken($core.List<$core.int> value) => $_setBytes(3, value);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
$core.bool hasPinUnlockToken() => $_has(3);
|
|
||||||
@$pb.TagNumber(5)
|
|
||||||
void clearPinUnlockToken() => $_clearField(5);
|
|
||||||
|
|
||||||
@$pb.TagNumber(6)
|
|
||||||
$core.String get emailHint => $_getSZ(4);
|
|
||||||
@$pb.TagNumber(6)
|
|
||||||
set emailHint($core.String value) => $_setString(4, value);
|
|
||||||
@$pb.TagNumber(6)
|
|
||||||
$core.bool hasEmailHint() => $_has(4);
|
|
||||||
@$pb.TagNumber(6)
|
|
||||||
void clearEmailHint() => $_clearField(6);
|
|
||||||
}
|
|
||||||
|
|
||||||
const $core.bool _omitFieldNames =
|
|
||||||
$core.bool.fromEnvironment('protobuf.omit_field_names');
|
|
||||||
const $core.bool _omitMessageNames =
|
|
||||||
$core.bool.fromEnvironment('protobuf.omit_message_names');
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
// This is a generated file - do not edit.
|
|
||||||
//
|
|
||||||
// Generated from passwordless_recovery.proto.
|
|
||||||
|
|
||||||
// @dart = 3.3
|
|
||||||
|
|
||||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
|
||||||
// ignore_for_file: constant_identifier_names
|
|
||||||
// ignore_for_file: curly_braces_in_flow_control_structures
|
|
||||||
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
|
|
||||||
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
|
|
||||||
|
|
@ -1,170 +0,0 @@
|
||||||
// This is a generated file - do not edit.
|
|
||||||
//
|
|
||||||
// Generated from passwordless_recovery.proto.
|
|
||||||
|
|
||||||
// @dart = 3.3
|
|
||||||
|
|
||||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
|
||||||
// ignore_for_file: constant_identifier_names
|
|
||||||
// ignore_for_file: curly_braces_in_flow_control_structures
|
|
||||||
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
|
|
||||||
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
|
|
||||||
// ignore_for_file: unused_import
|
|
||||||
|
|
||||||
import 'dart:convert' as $convert;
|
|
||||||
import 'dart:core' as $core;
|
|
||||||
import 'dart:typed_data' as $typed_data;
|
|
||||||
|
|
||||||
@$core.Deprecated('Use recoveryRequestDescriptor instead')
|
|
||||||
const RecoveryRequest$json = {
|
|
||||||
'1': 'RecoveryRequest',
|
|
||||||
'2': [
|
|
||||||
{'1': 'notification_id', '3': 1, '4': 1, '5': 9, '10': 'notificationId'},
|
|
||||||
{'1': 'public_key', '3': 2, '4': 1, '5': 12, '10': 'publicKey'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `RecoveryRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List recoveryRequestDescriptor = $convert.base64Decode(
|
|
||||||
'Cg9SZWNvdmVyeVJlcXVlc3QSJwoPbm90aWZpY2F0aW9uX2lkGAEgASgJUg5ub3RpZmljYXRpb2'
|
|
||||||
'5JZBIdCgpwdWJsaWNfa2V5GAIgASgMUglwdWJsaWNLZXk=');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use encryptedEnvelopeDescriptor instead')
|
|
||||||
const EncryptedEnvelope$json = {
|
|
||||||
'1': 'EncryptedEnvelope',
|
|
||||||
'2': [
|
|
||||||
{'1': 'encrypted_data', '3': 1, '4': 1, '5': 12, '10': 'encryptedData'},
|
|
||||||
{'1': 'iv', '3': 2, '4': 1, '5': 12, '10': 'iv'},
|
|
||||||
{'1': 'mac', '3': 3, '4': 1, '5': 12, '10': 'mac'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `EncryptedEnvelope`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List encryptedEnvelopeDescriptor = $convert.base64Decode(
|
|
||||||
'ChFFbmNyeXB0ZWRFbnZlbG9wZRIlCg5lbmNyeXB0ZWRfZGF0YRgBIAEoDFINZW5jcnlwdGVkRG'
|
|
||||||
'F0YRIOCgJpdhgCIAEoDFICaXYSEAoDbWFjGAMgASgMUgNtYWM=');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use trustedFriendShareDescriptor instead')
|
|
||||||
const TrustedFriendShare$json = {
|
|
||||||
'1': 'TrustedFriendShare',
|
|
||||||
'2': [
|
|
||||||
{
|
|
||||||
'1': 'trusted_friend',
|
|
||||||
'3': 1,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.passwordless_recovery.TrustedFriendShare.User',
|
|
||||||
'10': 'trustedFriend'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'share_user',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.passwordless_recovery.TrustedFriendShare.User',
|
|
||||||
'10': 'shareUser'
|
|
||||||
},
|
|
||||||
{'1': 'threshold', '3': 3, '4': 1, '5': 5, '10': 'threshold'},
|
|
||||||
{
|
|
||||||
'1': 'shared_secret_data',
|
|
||||||
'3': 4,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'sharedSecretData'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'3': [TrustedFriendShare_User$json],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use trustedFriendShareDescriptor instead')
|
|
||||||
const TrustedFriendShare_User$json = {
|
|
||||||
'1': 'User',
|
|
||||||
'2': [
|
|
||||||
{'1': 'user_id', '3': 1, '4': 1, '5': 3, '10': 'userId'},
|
|
||||||
{'1': 'display_name', '3': 2, '4': 1, '5': 9, '10': 'displayName'},
|
|
||||||
{'1': 'avatar', '3': 3, '4': 1, '5': 12, '10': 'avatar'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `TrustedFriendShare`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List trustedFriendShareDescriptor = $convert.base64Decode(
|
|
||||||
'ChJUcnVzdGVkRnJpZW5kU2hhcmUSVQoOdHJ1c3RlZF9mcmllbmQYASABKAsyLi5wYXNzd29yZG'
|
|
||||||
'xlc3NfcmVjb3ZlcnkuVHJ1c3RlZEZyaWVuZFNoYXJlLlVzZXJSDXRydXN0ZWRGcmllbmQSTQoK'
|
|
||||||
'c2hhcmVfdXNlchgCIAEoCzIuLnBhc3N3b3JkbGVzc19yZWNvdmVyeS5UcnVzdGVkRnJpZW5kU2'
|
|
||||||
'hhcmUuVXNlclIJc2hhcmVVc2VyEhwKCXRocmVzaG9sZBgDIAEoBVIJdGhyZXNob2xkEiwKEnNo'
|
|
||||||
'YXJlZF9zZWNyZXRfZGF0YRgEIAEoDFIQc2hhcmVkU2VjcmV0RGF0YRpaCgRVc2VyEhcKB3VzZX'
|
|
||||||
'JfaWQYASABKANSBnVzZXJJZBIhCgxkaXNwbGF5X25hbWUYAiABKAlSC2Rpc3BsYXlOYW1lEhYK'
|
|
||||||
'BmF2YXRhchgDIAEoDFIGYXZhdGFy');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use recoveryDataDescriptor instead')
|
|
||||||
const RecoveryData$json = {
|
|
||||||
'1': 'RecoveryData',
|
|
||||||
'2': [
|
|
||||||
{'1': 'user_id', '3': 1, '4': 1, '5': 3, '10': 'userId'},
|
|
||||||
{'1': 'key_manager', '3': 3, '4': 1, '5': 12, '10': 'keyManager'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `RecoveryData`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List recoveryDataDescriptor = $convert.base64Decode(
|
|
||||||
'CgxSZWNvdmVyeURhdGESFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkEh8KC2tleV9tYW5hZ2VyGA'
|
|
||||||
'MgASgMUgprZXlNYW5hZ2Vy');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use sharedSecretDataDescriptor instead')
|
|
||||||
const SharedSecretData$json = {
|
|
||||||
'1': 'SharedSecretData',
|
|
||||||
'2': [
|
|
||||||
{'1': 'recovery_data', '3': 1, '4': 1, '5': 12, '10': 'recoveryData'},
|
|
||||||
{
|
|
||||||
'1': 'encrypted_server_key_nonce',
|
|
||||||
'3': 3,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 0,
|
|
||||||
'10': 'encryptedServerKeyNonce',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'pin_seed',
|
|
||||||
'3': 4,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 1,
|
|
||||||
'10': 'pinSeed',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'pin_unlock_token',
|
|
||||||
'3': 5,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 2,
|
|
||||||
'10': 'pinUnlockToken',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'email_hint',
|
|
||||||
'3': 6,
|
|
||||||
'4': 1,
|
|
||||||
'5': 9,
|
|
||||||
'9': 3,
|
|
||||||
'10': 'emailHint',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'8': [
|
|
||||||
{'1': '_encrypted_server_key_nonce'},
|
|
||||||
{'1': '_pin_seed'},
|
|
||||||
{'1': '_pin_unlock_token'},
|
|
||||||
{'1': '_email_hint'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `SharedSecretData`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List sharedSecretDataDescriptor = $convert.base64Decode(
|
|
||||||
'ChBTaGFyZWRTZWNyZXREYXRhEiMKDXJlY292ZXJ5X2RhdGEYASABKAxSDHJlY292ZXJ5RGF0YR'
|
|
||||||
'JAChplbmNyeXB0ZWRfc2VydmVyX2tleV9ub25jZRgDIAEoDEgAUhdlbmNyeXB0ZWRTZXJ2ZXJL'
|
|
||||||
'ZXlOb25jZYgBARIeCghwaW5fc2VlZBgEIAEoDEgBUgdwaW5TZWVkiAEBEi0KEHBpbl91bmxvY2'
|
|
||||||
'tfdG9rZW4YBSABKAxIAlIOcGluVW5sb2NrVG9rZW6IAQESIgoKZW1haWxfaGludBgGIAEoCUgD'
|
|
||||||
'UgllbWFpbEhpbnSIAQFCHQobX2VuY3J5cHRlZF9zZXJ2ZXJfa2V5X25vbmNlQgsKCV9waW5fc2'
|
|
||||||
'VlZEITChFfcGluX3VubG9ja190b2tlbkINCgtfZW1haWxfaGludA==');
|
|
||||||
|
|
@ -1,670 +0,0 @@
|
||||||
// This is a generated file - do not edit.
|
|
||||||
//
|
|
||||||
// Generated from types.proto.
|
|
||||||
|
|
||||||
// @dart = 3.3
|
|
||||||
|
|
||||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
|
||||||
// ignore_for_file: constant_identifier_names
|
|
||||||
// ignore_for_file: curly_braces_in_flow_control_structures
|
|
||||||
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
|
|
||||||
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
|
|
||||||
|
|
||||||
import 'dart:core' as $core;
|
|
||||||
|
|
||||||
import 'package:fixnum/fixnum.dart' as $fixnum;
|
|
||||||
import 'package:protobuf/protobuf.dart' as $pb;
|
|
||||||
|
|
||||||
export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;
|
|
||||||
|
|
||||||
/// Send from the person who tries to recover their account.
|
|
||||||
/// This can be done via a link, which will then be opend in the app of the contact.
|
|
||||||
/// The contact than has to manualy select from which user he got the request.
|
|
||||||
/// -> Using this phishing is harder, as the user has to manualy select the user to recovery
|
|
||||||
/// -> The user who wants to recover his account does not need to remember her old username
|
|
||||||
class RecoveryRequest extends $pb.GeneratedMessage {
|
|
||||||
factory RecoveryRequest({
|
|
||||||
$fixnum.Int64? tempId,
|
|
||||||
$core.List<$core.int>? publicKey,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (tempId != null) result.tempId = tempId;
|
|
||||||
if (publicKey != null) result.publicKey = publicKey;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
RecoveryRequest._();
|
|
||||||
|
|
||||||
factory RecoveryRequest.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory RecoveryRequest.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'RecoveryRequest',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aInt64(1, _omitFieldNames ? '' : 'tempId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'publicKey', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryRequest clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryRequest copyWith(void Function(RecoveryRequest) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as RecoveryRequest))
|
|
||||||
as RecoveryRequest;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryRequest create() => RecoveryRequest._();
|
|
||||||
@$core.override
|
|
||||||
RecoveryRequest createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryRequest getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<RecoveryRequest>(create);
|
|
||||||
static RecoveryRequest? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$fixnum.Int64 get tempId => $_getI64(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set tempId($fixnum.Int64 value) => $_setInt64(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasTempId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearTempId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get publicKey => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set publicKey($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasPublicKey() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearPublicKey() => $_clearField(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Used as envelope for TrustedFriendShare and RecoveryData
|
|
||||||
class EncryptedEnvelope extends $pb.GeneratedMessage {
|
|
||||||
factory EncryptedEnvelope({
|
|
||||||
$core.List<$core.int>? encryptedData,
|
|
||||||
$core.List<$core.int>? iv,
|
|
||||||
$core.List<$core.int>? mac,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (encryptedData != null) result.encryptedData = encryptedData;
|
|
||||||
if (iv != null) result.iv = iv;
|
|
||||||
if (mac != null) result.mac = mac;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
EncryptedEnvelope._();
|
|
||||||
|
|
||||||
factory EncryptedEnvelope.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory EncryptedEnvelope.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'EncryptedEnvelope',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
1, _omitFieldNames ? '' : 'encryptedData', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'iv', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'mac', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedEnvelope clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
EncryptedEnvelope copyWith(void Function(EncryptedEnvelope) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as EncryptedEnvelope))
|
|
||||||
as EncryptedEnvelope;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedEnvelope create() => EncryptedEnvelope._();
|
|
||||||
@$core.override
|
|
||||||
EncryptedEnvelope createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static EncryptedEnvelope getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<EncryptedEnvelope>(create);
|
|
||||||
static EncryptedEnvelope? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.List<$core.int> get encryptedData => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set encryptedData($core.List<$core.int> value) => $_setBytes(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasEncryptedData() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearEncryptedData() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get iv => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set iv($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasIv() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearIv() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get mac => $_getN(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set mac($core.List<$core.int> value) => $_setBytes(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasMac() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearMac() => $_clearField(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
class TrustedFriendShare_User extends $pb.GeneratedMessage {
|
|
||||||
factory TrustedFriendShare_User({
|
|
||||||
$fixnum.Int64? userId,
|
|
||||||
$core.String? displayName,
|
|
||||||
$core.List<$core.int>? avatar,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (userId != null) result.userId = userId;
|
|
||||||
if (displayName != null) result.displayName = displayName;
|
|
||||||
if (avatar != null) result.avatar = avatar;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
TrustedFriendShare_User._();
|
|
||||||
|
|
||||||
factory TrustedFriendShare_User.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory TrustedFriendShare_User.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'TrustedFriendShare.User',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aInt64(1, _omitFieldNames ? '' : 'userId')
|
|
||||||
..aOS(2, _omitFieldNames ? '' : 'displayName')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'avatar', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare_User clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare_User copyWith(
|
|
||||||
void Function(TrustedFriendShare_User) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as TrustedFriendShare_User))
|
|
||||||
as TrustedFriendShare_User;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare_User create() => TrustedFriendShare_User._();
|
|
||||||
@$core.override
|
|
||||||
TrustedFriendShare_User createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare_User getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<TrustedFriendShare_User>(create);
|
|
||||||
static TrustedFriendShare_User? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$fixnum.Int64 get userId => $_getI64(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set userId($fixnum.Int64 value) => $_setInt64(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasUserId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearUserId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.String get displayName => $_getSZ(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set displayName($core.String value) => $_setString(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasDisplayName() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearDisplayName() => $_clearField(2);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get avatar => $_getN(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set avatar($core.List<$core.int> value) => $_setBytes(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasAvatar() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearAvatar() => $_clearField(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Send from the trusted friend to
|
|
||||||
/// This is encrypted with the received public key.
|
|
||||||
class TrustedFriendShare extends $pb.GeneratedMessage {
|
|
||||||
factory TrustedFriendShare({
|
|
||||||
TrustedFriendShare_User? trustedFriend,
|
|
||||||
TrustedFriendShare_User? shareUser,
|
|
||||||
$core.int? threshold,
|
|
||||||
$core.List<$core.int>? sharedSecretData,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (trustedFriend != null) result.trustedFriend = trustedFriend;
|
|
||||||
if (shareUser != null) result.shareUser = shareUser;
|
|
||||||
if (threshold != null) result.threshold = threshold;
|
|
||||||
if (sharedSecretData != null) result.sharedSecretData = sharedSecretData;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
TrustedFriendShare._();
|
|
||||||
|
|
||||||
factory TrustedFriendShare.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory TrustedFriendShare.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'TrustedFriendShare',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aOM<TrustedFriendShare_User>(1, _omitFieldNames ? '' : 'trustedFriend',
|
|
||||||
subBuilder: TrustedFriendShare_User.create)
|
|
||||||
..aOM<TrustedFriendShare_User>(2, _omitFieldNames ? '' : 'shareUser',
|
|
||||||
subBuilder: TrustedFriendShare_User.create)
|
|
||||||
..aI(3, _omitFieldNames ? '' : 'threshold')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
4, _omitFieldNames ? '' : 'sharedSecretData', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
TrustedFriendShare copyWith(void Function(TrustedFriendShare) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as TrustedFriendShare))
|
|
||||||
as TrustedFriendShare;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare create() => TrustedFriendShare._();
|
|
||||||
@$core.override
|
|
||||||
TrustedFriendShare createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static TrustedFriendShare getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<TrustedFriendShare>(create);
|
|
||||||
static TrustedFriendShare? _defaultInstance;
|
|
||||||
|
|
||||||
/// This allows to display the user which user has send him his recovery data.
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
TrustedFriendShare_User get trustedFriend => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set trustedFriend(TrustedFriendShare_User value) => $_setField(1, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasTrustedFriend() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearTrustedFriend() => $_clearField(1);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
TrustedFriendShare_User ensureTrustedFriend() => $_ensure(0);
|
|
||||||
|
|
||||||
/// This allows to display the userdata, showing that he is recovering the correct person.
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
TrustedFriendShare_User get shareUser => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set shareUser(TrustedFriendShare_User value) => $_setField(2, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasShareUser() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearShareUser() => $_clearField(2);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
TrustedFriendShare_User ensureShareUser() => $_ensure(1);
|
|
||||||
|
|
||||||
/// The minimum threshold required to decrypte the shares.
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.int get threshold => $_getIZ(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set threshold($core.int value) => $_setSignedInt32(2, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasThreshold() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearThreshold() => $_clearField(3);
|
|
||||||
|
|
||||||
/// The actual share which will become: SharedSecretData
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.List<$core.int> get sharedSecretData => $_getN(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
set sharedSecretData($core.List<$core.int> value) => $_setBytes(3, value);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.bool hasSharedSecretData() => $_has(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
void clearSharedSecretData() => $_clearField(4);
|
|
||||||
}
|
|
||||||
|
|
||||||
class SharedSecretData_SecondFactorPin extends $pb.GeneratedMessage {
|
|
||||||
factory SharedSecretData_SecondFactorPin({
|
|
||||||
$core.List<$core.int>? unlockToken,
|
|
||||||
$core.List<$core.int>? pinSeed,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (unlockToken != null) result.unlockToken = unlockToken;
|
|
||||||
if (pinSeed != null) result.pinSeed = pinSeed;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedSecretData_SecondFactorPin._();
|
|
||||||
|
|
||||||
factory SharedSecretData_SecondFactorPin.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory SharedSecretData_SecondFactorPin.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'SharedSecretData.SecondFactorPin',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
1, _omitFieldNames ? '' : 'unlockToken', $pb.PbFieldType.OY)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
2, _omitFieldNames ? '' : 'pinSeed', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData_SecondFactorPin clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData_SecondFactorPin copyWith(
|
|
||||||
void Function(SharedSecretData_SecondFactorPin) updates) =>
|
|
||||||
super.copyWith(
|
|
||||||
(message) => updates(message as SharedSecretData_SecondFactorPin))
|
|
||||||
as SharedSecretData_SecondFactorPin;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData_SecondFactorPin create() =>
|
|
||||||
SharedSecretData_SecondFactorPin._();
|
|
||||||
@$core.override
|
|
||||||
SharedSecretData_SecondFactorPin createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData_SecondFactorPin getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<SharedSecretData_SecondFactorPin>(
|
|
||||||
create);
|
|
||||||
static SharedSecretData_SecondFactorPin? _defaultInstance;
|
|
||||||
|
|
||||||
/// Required to try the PIN to get the share from the server.
|
|
||||||
/// This prevents that someone else can lock the pin, as the server only
|
|
||||||
/// allows 3 tries then after 1 day again 3 tries until the key is deleted.
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.List<$core.int> get unlockToken => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set unlockToken($core.List<$core.int> value) => $_setBytes(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasUnlockToken() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearUnlockToken() => $_clearField(1);
|
|
||||||
|
|
||||||
/// This never is send to the server but used to hash the pin before sending it to the server.
|
|
||||||
/// This prevents that the server every knows the shot 4-diget PIN.
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.List<$core.int> get pinSeed => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set pinSeed($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasPinSeed() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearPinSeed() => $_clearField(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
class SharedSecretData_SecondFactorMail extends $pb.GeneratedMessage {
|
|
||||||
factory SharedSecretData_SecondFactorMail() => create();
|
|
||||||
|
|
||||||
SharedSecretData_SecondFactorMail._();
|
|
||||||
|
|
||||||
factory SharedSecretData_SecondFactorMail.fromBuffer(
|
|
||||||
$core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory SharedSecretData_SecondFactorMail.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'SharedSecretData.SecondFactorMail',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData_SecondFactorMail clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData_SecondFactorMail copyWith(
|
|
||||||
void Function(SharedSecretData_SecondFactorMail) updates) =>
|
|
||||||
super.copyWith((message) =>
|
|
||||||
updates(message as SharedSecretData_SecondFactorMail))
|
|
||||||
as SharedSecretData_SecondFactorMail;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData_SecondFactorMail create() =>
|
|
||||||
SharedSecretData_SecondFactorMail._();
|
|
||||||
@$core.override
|
|
||||||
SharedSecretData_SecondFactorMail createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData_SecondFactorMail getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<SharedSecretData_SecondFactorMail>(
|
|
||||||
create);
|
|
||||||
static SharedSecretData_SecondFactorMail? _defaultInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// After received all shares this is decrypted by the user restoring its own
|
|
||||||
class SharedSecretData extends $pb.GeneratedMessage {
|
|
||||||
factory SharedSecretData({
|
|
||||||
RecoveryData? recoveryData,
|
|
||||||
SharedSecretData_SecondFactorMail? secondFactorMail,
|
|
||||||
SharedSecretData_SecondFactorPin? secondFactorPin,
|
|
||||||
$core.List<$core.int>? recoveryDataEncrypted,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (recoveryData != null) result.recoveryData = recoveryData;
|
|
||||||
if (secondFactorMail != null) result.secondFactorMail = secondFactorMail;
|
|
||||||
if (secondFactorPin != null) result.secondFactorPin = secondFactorPin;
|
|
||||||
if (recoveryDataEncrypted != null)
|
|
||||||
result.recoveryDataEncrypted = recoveryDataEncrypted;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedSecretData._();
|
|
||||||
|
|
||||||
factory SharedSecretData.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory SharedSecretData.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'SharedSecretData',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aOM<RecoveryData>(1, _omitFieldNames ? '' : 'recoveryData',
|
|
||||||
subBuilder: RecoveryData.create)
|
|
||||||
..aOM<SharedSecretData_SecondFactorMail>(
|
|
||||||
2, _omitFieldNames ? '' : 'secondFactorMail',
|
|
||||||
subBuilder: SharedSecretData_SecondFactorMail.create)
|
|
||||||
..aOM<SharedSecretData_SecondFactorPin>(
|
|
||||||
3, _omitFieldNames ? '' : 'secondFactorPin',
|
|
||||||
subBuilder: SharedSecretData_SecondFactorPin.create)
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
4, _omitFieldNames ? '' : 'recoveryDataEncrypted', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
SharedSecretData copyWith(void Function(SharedSecretData) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as SharedSecretData))
|
|
||||||
as SharedSecretData;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData create() => SharedSecretData._();
|
|
||||||
@$core.override
|
|
||||||
SharedSecretData createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static SharedSecretData getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<SharedSecretData>(create);
|
|
||||||
static SharedSecretData? _defaultInstance;
|
|
||||||
|
|
||||||
/// No second factor was selected
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
RecoveryData get recoveryData => $_getN(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set recoveryData(RecoveryData value) => $_setField(1, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasRecoveryData() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearRecoveryData() => $_clearField(1);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
RecoveryData ensureRecoveryData() => $_ensure(0);
|
|
||||||
|
|
||||||
/// Server has
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
SharedSecretData_SecondFactorMail get secondFactorMail => $_getN(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
set secondFactorMail(SharedSecretData_SecondFactorMail value) =>
|
|
||||||
$_setField(2, value);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
$core.bool hasSecondFactorMail() => $_has(1);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
void clearSecondFactorMail() => $_clearField(2);
|
|
||||||
@$pb.TagNumber(2)
|
|
||||||
SharedSecretData_SecondFactorMail ensureSecondFactorMail() => $_ensure(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
SharedSecretData_SecondFactorPin get secondFactorPin => $_getN(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set secondFactorPin(SharedSecretData_SecondFactorPin value) =>
|
|
||||||
$_setField(3, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasSecondFactorPin() => $_has(2);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearSecondFactorPin() => $_clearField(3);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
SharedSecretData_SecondFactorPin ensureSecondFactorPin() => $_ensure(2);
|
|
||||||
|
|
||||||
/// The recovery data in case a second factor was used
|
|
||||||
/// The decryption key is loaded from the server either using the PIN or the MAIL
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.List<$core.int> get recoveryDataEncrypted => $_getN(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
set recoveryDataEncrypted($core.List<$core.int> value) =>
|
|
||||||
$_setBytes(3, value);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
$core.bool hasRecoveryDataEncrypted() => $_has(3);
|
|
||||||
@$pb.TagNumber(4)
|
|
||||||
void clearRecoveryDataEncrypted() => $_clearField(4);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The data which is recovered at the end.
|
|
||||||
/// The backup_master_key allows to recover the actual backup uploaded in the background to the server.
|
|
||||||
/// In case the backup is not available any more the user can use its user_id and his private_key to requister as a new user.
|
|
||||||
class RecoveryData extends $pb.GeneratedMessage {
|
|
||||||
factory RecoveryData({
|
|
||||||
$fixnum.Int64? userId,
|
|
||||||
$core.List<$core.int>? keyManager,
|
|
||||||
}) {
|
|
||||||
final result = create();
|
|
||||||
if (userId != null) result.userId = userId;
|
|
||||||
if (keyManager != null) result.keyManager = keyManager;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
RecoveryData._();
|
|
||||||
|
|
||||||
factory RecoveryData.fromBuffer($core.List<$core.int> data,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromBuffer(data, registry);
|
|
||||||
factory RecoveryData.fromJson($core.String json,
|
|
||||||
[$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) =>
|
|
||||||
create()..mergeFromJson(json, registry);
|
|
||||||
|
|
||||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(
|
|
||||||
_omitMessageNames ? '' : 'RecoveryData',
|
|
||||||
package: const $pb.PackageName(
|
|
||||||
_omitMessageNames ? '' : 'passwordless_recovery'),
|
|
||||||
createEmptyInstance: create)
|
|
||||||
..aInt64(1, _omitFieldNames ? '' : 'userId')
|
|
||||||
..a<$core.List<$core.int>>(
|
|
||||||
3, _omitFieldNames ? '' : 'keyManager', $pb.PbFieldType.OY)
|
|
||||||
..hasRequiredFields = false;
|
|
||||||
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryData clone() => deepCopy();
|
|
||||||
@$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')
|
|
||||||
RecoveryData copyWith(void Function(RecoveryData) updates) =>
|
|
||||||
super.copyWith((message) => updates(message as RecoveryData))
|
|
||||||
as RecoveryData;
|
|
||||||
|
|
||||||
@$core.override
|
|
||||||
$pb.BuilderInfo get info_ => _i;
|
|
||||||
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryData create() => RecoveryData._();
|
|
||||||
@$core.override
|
|
||||||
RecoveryData createEmptyInstance() => create();
|
|
||||||
@$core.pragma('dart2js:noInline')
|
|
||||||
static RecoveryData getDefault() => _defaultInstance ??=
|
|
||||||
$pb.GeneratedMessage.$_defaultFor<RecoveryData>(create);
|
|
||||||
static RecoveryData? _defaultInstance;
|
|
||||||
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$fixnum.Int64 get userId => $_getI64(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
set userId($fixnum.Int64 value) => $_setInt64(0, value);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
$core.bool hasUserId() => $_has(0);
|
|
||||||
@$pb.TagNumber(1)
|
|
||||||
void clearUserId() => $_clearField(1);
|
|
||||||
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.List<$core.int> get keyManager => $_getN(1);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
set keyManager($core.List<$core.int> value) => $_setBytes(1, value);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
$core.bool hasKeyManager() => $_has(1);
|
|
||||||
@$pb.TagNumber(3)
|
|
||||||
void clearKeyManager() => $_clearField(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
const $core.bool _omitFieldNames =
|
|
||||||
$core.bool.fromEnvironment('protobuf.omit_field_names');
|
|
||||||
const $core.bool _omitMessageNames =
|
|
||||||
$core.bool.fromEnvironment('protobuf.omit_message_names');
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
// This is a generated file - do not edit.
|
|
||||||
//
|
|
||||||
// Generated from types.proto.
|
|
||||||
|
|
||||||
// @dart = 3.3
|
|
||||||
|
|
||||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
|
||||||
// ignore_for_file: constant_identifier_names
|
|
||||||
// ignore_for_file: curly_braces_in_flow_control_structures
|
|
||||||
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
|
|
||||||
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
|
|
||||||
|
|
@ -1,195 +0,0 @@
|
||||||
// This is a generated file - do not edit.
|
|
||||||
//
|
|
||||||
// Generated from types.proto.
|
|
||||||
|
|
||||||
// @dart = 3.3
|
|
||||||
|
|
||||||
// ignore_for_file: annotate_overrides, camel_case_types, comment_references
|
|
||||||
// ignore_for_file: constant_identifier_names
|
|
||||||
// ignore_for_file: curly_braces_in_flow_control_structures
|
|
||||||
// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes
|
|
||||||
// ignore_for_file: non_constant_identifier_names, prefer_relative_imports
|
|
||||||
// ignore_for_file: unused_import
|
|
||||||
|
|
||||||
import 'dart:convert' as $convert;
|
|
||||||
import 'dart:core' as $core;
|
|
||||||
import 'dart:typed_data' as $typed_data;
|
|
||||||
|
|
||||||
@$core.Deprecated('Use recoveryRequestDescriptor instead')
|
|
||||||
const RecoveryRequest$json = {
|
|
||||||
'1': 'RecoveryRequest',
|
|
||||||
'2': [
|
|
||||||
{'1': 'temp_id', '3': 1, '4': 1, '5': 3, '10': 'tempId'},
|
|
||||||
{'1': 'public_key', '3': 2, '4': 1, '5': 12, '10': 'publicKey'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `RecoveryRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List recoveryRequestDescriptor = $convert.base64Decode(
|
|
||||||
'Cg9SZWNvdmVyeVJlcXVlc3QSFwoHdGVtcF9pZBgBIAEoA1IGdGVtcElkEh0KCnB1YmxpY19rZX'
|
|
||||||
'kYAiABKAxSCXB1YmxpY0tleQ==');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use encryptedEnvelopeDescriptor instead')
|
|
||||||
const EncryptedEnvelope$json = {
|
|
||||||
'1': 'EncryptedEnvelope',
|
|
||||||
'2': [
|
|
||||||
{'1': 'encrypted_data', '3': 1, '4': 1, '5': 12, '10': 'encryptedData'},
|
|
||||||
{'1': 'iv', '3': 2, '4': 1, '5': 12, '10': 'iv'},
|
|
||||||
{'1': 'mac', '3': 3, '4': 1, '5': 12, '10': 'mac'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `EncryptedEnvelope`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List encryptedEnvelopeDescriptor = $convert.base64Decode(
|
|
||||||
'ChFFbmNyeXB0ZWRFbnZlbG9wZRIlCg5lbmNyeXB0ZWRfZGF0YRgBIAEoDFINZW5jcnlwdGVkRG'
|
|
||||||
'F0YRIOCgJpdhgCIAEoDFICaXYSEAoDbWFjGAMgASgMUgNtYWM=');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use trustedFriendShareDescriptor instead')
|
|
||||||
const TrustedFriendShare$json = {
|
|
||||||
'1': 'TrustedFriendShare',
|
|
||||||
'2': [
|
|
||||||
{
|
|
||||||
'1': 'trusted_friend',
|
|
||||||
'3': 1,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.passwordless_recovery.TrustedFriendShare.User',
|
|
||||||
'10': 'trustedFriend'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'share_user',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.passwordless_recovery.TrustedFriendShare.User',
|
|
||||||
'10': 'shareUser'
|
|
||||||
},
|
|
||||||
{'1': 'threshold', '3': 3, '4': 1, '5': 5, '10': 'threshold'},
|
|
||||||
{
|
|
||||||
'1': 'shared_secret_data',
|
|
||||||
'3': 4,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'10': 'sharedSecretData'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'3': [TrustedFriendShare_User$json],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use trustedFriendShareDescriptor instead')
|
|
||||||
const TrustedFriendShare_User$json = {
|
|
||||||
'1': 'User',
|
|
||||||
'2': [
|
|
||||||
{'1': 'user_id', '3': 1, '4': 1, '5': 3, '10': 'userId'},
|
|
||||||
{'1': 'display_name', '3': 2, '4': 1, '5': 9, '10': 'displayName'},
|
|
||||||
{'1': 'avatar', '3': 3, '4': 1, '5': 12, '10': 'avatar'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `TrustedFriendShare`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List trustedFriendShareDescriptor = $convert.base64Decode(
|
|
||||||
'ChJUcnVzdGVkRnJpZW5kU2hhcmUSVQoOdHJ1c3RlZF9mcmllbmQYASABKAsyLi5wYXNzd29yZG'
|
|
||||||
'xlc3NfcmVjb3ZlcnkuVHJ1c3RlZEZyaWVuZFNoYXJlLlVzZXJSDXRydXN0ZWRGcmllbmQSTQoK'
|
|
||||||
'c2hhcmVfdXNlchgCIAEoCzIuLnBhc3N3b3JkbGVzc19yZWNvdmVyeS5UcnVzdGVkRnJpZW5kU2'
|
|
||||||
'hhcmUuVXNlclIJc2hhcmVVc2VyEhwKCXRocmVzaG9sZBgDIAEoBVIJdGhyZXNob2xkEiwKEnNo'
|
|
||||||
'YXJlZF9zZWNyZXRfZGF0YRgEIAEoDFIQc2hhcmVkU2VjcmV0RGF0YRpaCgRVc2VyEhcKB3VzZX'
|
|
||||||
'JfaWQYASABKANSBnVzZXJJZBIhCgxkaXNwbGF5X25hbWUYAiABKAlSC2Rpc3BsYXlOYW1lEhYK'
|
|
||||||
'BmF2YXRhchgDIAEoDFIGYXZhdGFy');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use sharedSecretDataDescriptor instead')
|
|
||||||
const SharedSecretData$json = {
|
|
||||||
'1': 'SharedSecretData',
|
|
||||||
'2': [
|
|
||||||
{
|
|
||||||
'1': 'recovery_data',
|
|
||||||
'3': 1,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.passwordless_recovery.RecoveryData',
|
|
||||||
'9': 0,
|
|
||||||
'10': 'recoveryData',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'second_factor_mail',
|
|
||||||
'3': 2,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.passwordless_recovery.SharedSecretData.SecondFactorMail',
|
|
||||||
'9': 1,
|
|
||||||
'10': 'secondFactorMail',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'second_factor_pin',
|
|
||||||
'3': 3,
|
|
||||||
'4': 1,
|
|
||||||
'5': 11,
|
|
||||||
'6': '.passwordless_recovery.SharedSecretData.SecondFactorPin',
|
|
||||||
'9': 2,
|
|
||||||
'10': 'secondFactorPin',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'1': 'recovery_data_encrypted',
|
|
||||||
'3': 4,
|
|
||||||
'4': 1,
|
|
||||||
'5': 12,
|
|
||||||
'9': 3,
|
|
||||||
'10': 'recoveryDataEncrypted',
|
|
||||||
'17': true
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'3': [
|
|
||||||
SharedSecretData_SecondFactorPin$json,
|
|
||||||
SharedSecretData_SecondFactorMail$json
|
|
||||||
],
|
|
||||||
'8': [
|
|
||||||
{'1': '_recovery_data'},
|
|
||||||
{'1': '_second_factor_mail'},
|
|
||||||
{'1': '_second_factor_pin'},
|
|
||||||
{'1': '_recovery_data_encrypted'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use sharedSecretDataDescriptor instead')
|
|
||||||
const SharedSecretData_SecondFactorPin$json = {
|
|
||||||
'1': 'SecondFactorPin',
|
|
||||||
'2': [
|
|
||||||
{'1': 'unlock_token', '3': 1, '4': 1, '5': 12, '10': 'unlockToken'},
|
|
||||||
{'1': 'pin_seed', '3': 2, '4': 1, '5': 12, '10': 'pinSeed'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
@$core.Deprecated('Use sharedSecretDataDescriptor instead')
|
|
||||||
const SharedSecretData_SecondFactorMail$json = {
|
|
||||||
'1': 'SecondFactorMail',
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `SharedSecretData`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List sharedSecretDataDescriptor = $convert.base64Decode(
|
|
||||||
'ChBTaGFyZWRTZWNyZXREYXRhEk0KDXJlY292ZXJ5X2RhdGEYASABKAsyIy5wYXNzd29yZGxlc3'
|
|
||||||
'NfcmVjb3ZlcnkuUmVjb3ZlcnlEYXRhSABSDHJlY292ZXJ5RGF0YYgBARJrChJzZWNvbmRfZmFj'
|
|
||||||
'dG9yX21haWwYAiABKAsyOC5wYXNzd29yZGxlc3NfcmVjb3ZlcnkuU2hhcmVkU2VjcmV0RGF0YS'
|
|
||||||
'5TZWNvbmRGYWN0b3JNYWlsSAFSEHNlY29uZEZhY3Rvck1haWyIAQESaAoRc2Vjb25kX2ZhY3Rv'
|
|
||||||
'cl9waW4YAyABKAsyNy5wYXNzd29yZGxlc3NfcmVjb3ZlcnkuU2hhcmVkU2VjcmV0RGF0YS5TZW'
|
|
||||||
'NvbmRGYWN0b3JQaW5IAlIPc2Vjb25kRmFjdG9yUGluiAEBEjsKF3JlY292ZXJ5X2RhdGFfZW5j'
|
|
||||||
'cnlwdGVkGAQgASgMSANSFXJlY292ZXJ5RGF0YUVuY3J5cHRlZIgBARpPCg9TZWNvbmRGYWN0b3'
|
|
||||||
'JQaW4SIQoMdW5sb2NrX3Rva2VuGAEgASgMUgt1bmxvY2tUb2tlbhIZCghwaW5fc2VlZBgCIAEo'
|
|
||||||
'DFIHcGluU2VlZBoSChBTZWNvbmRGYWN0b3JNYWlsQhAKDl9yZWNvdmVyeV9kYXRhQhUKE19zZW'
|
|
||||||
'NvbmRfZmFjdG9yX21haWxCFAoSX3NlY29uZF9mYWN0b3JfcGluQhoKGF9yZWNvdmVyeV9kYXRh'
|
|
||||||
'X2VuY3J5cHRlZA==');
|
|
||||||
|
|
||||||
@$core.Deprecated('Use recoveryDataDescriptor instead')
|
|
||||||
const RecoveryData$json = {
|
|
||||||
'1': 'RecoveryData',
|
|
||||||
'2': [
|
|
||||||
{'1': 'user_id', '3': 1, '4': 1, '5': 3, '10': 'userId'},
|
|
||||||
{'1': 'key_manager', '3': 3, '4': 1, '5': 12, '10': 'keyManager'},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Descriptor for `RecoveryData`. Decode as a `google.protobuf.DescriptorProto`.
|
|
||||||
final $typed_data.Uint8List recoveryDataDescriptor = $convert.base64Decode(
|
|
||||||
'CgxSZWNvdmVyeURhdGESFwoHdXNlcl9pZBgBIAEoA1IGdXNlcklkEh8KC2tleV9tYW5hZ2VyGA'
|
|
||||||
'MgASgMUgprZXlNYW5hZ2Vy');
|
|
||||||
|
|
@ -37,7 +37,6 @@ message EncryptedContent {
|
||||||
/// This can be added, so the receiver can check weather he is up to date with the current profile
|
/// This can be added, so the receiver can check weather he is up to date with the current profile
|
||||||
optional int64 sender_profile_counter = 4;
|
optional int64 sender_profile_counter = 4;
|
||||||
optional bytes sender_user_discovery_version = 21;
|
optional bytes sender_user_discovery_version = 21;
|
||||||
optional bool ask_for_friend_promotions = 25;
|
|
||||||
|
|
||||||
optional MessageUpdate message_update = 5;
|
optional MessageUpdate message_update = 5;
|
||||||
optional Media media = 6;
|
optional Media media = 6;
|
||||||
|
|
@ -58,15 +57,12 @@ message EncryptedContent {
|
||||||
optional UserDiscoveryRequest user_discovery_request = 22;
|
optional UserDiscoveryRequest user_discovery_request = 22;
|
||||||
optional UserDiscoveryUpdate user_discovery_update = 23;
|
optional UserDiscoveryUpdate user_discovery_update = 23;
|
||||||
optional KeyVerificationProof key_verification_proof = 24;
|
optional KeyVerificationProof key_verification_proof = 24;
|
||||||
optional PasswordLessRecovery passwordless_recovery = 26;
|
|
||||||
optional PasswordLessRecoveryHeartbeat passwordless_recovery_heartbeat = 27;
|
|
||||||
|
|
||||||
message ErrorMessages {
|
message ErrorMessages {
|
||||||
enum Type {
|
enum Type {
|
||||||
ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD = 0;
|
ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD = 0;
|
||||||
UNKNOWN_MESSAGE_TYPE = 2;
|
UNKNOWN_MESSAGE_TYPE = 2;
|
||||||
SESSION_OUT_OF_SYNC = 3;
|
SESSION_OUT_OF_SYNC = 3;
|
||||||
GROUP_NOT_FOUND_OR_NOT_A_MEMBER = 4;
|
|
||||||
}
|
}
|
||||||
Type type = 1;
|
Type type = 1;
|
||||||
string related_receipt_id = 2;
|
string related_receipt_id = 2;
|
||||||
|
|
@ -76,7 +72,6 @@ message EncryptedContent {
|
||||||
// key for the state stored on the server
|
// key for the state stored on the server
|
||||||
bytes state_key = 3;
|
bytes state_key = 3;
|
||||||
bytes group_public_key = 4;
|
bytes group_public_key = 4;
|
||||||
optional string group_name = 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message GroupJoin {
|
message GroupJoin {
|
||||||
|
|
@ -84,7 +79,9 @@ message EncryptedContent {
|
||||||
bytes group_public_key = 1;
|
bytes group_public_key = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ResendGroupPublicKey {}
|
message ResendGroupPublicKey {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
message GroupUpdate {
|
message GroupUpdate {
|
||||||
string group_action_type = 1; // GroupActionType.name
|
string group_action_type = 1; // GroupActionType.name
|
||||||
|
|
@ -217,14 +214,4 @@ message EncryptedContent {
|
||||||
bytes calculated_mac = 1;
|
bytes calculated_mac = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message PasswordLessRecovery {
|
|
||||||
optional bytes recoverySecretShare = 1;
|
|
||||||
bool delete = 2;
|
|
||||||
int64 threshold = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PasswordLessRecoveryHeartbeat {
|
|
||||||
bytes hash = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -13,8 +13,7 @@ import 'package:twonly/src/visual/views/contact/add_new_contact.view.dart';
|
||||||
import 'package:twonly/src/visual/views/contact/contact.view.dart';
|
import 'package:twonly/src/visual/views/contact/contact.view.dart';
|
||||||
import 'package:twonly/src/visual/views/groups/group.view.dart';
|
import 'package:twonly/src/visual/views/groups/group.view.dart';
|
||||||
import 'package:twonly/src/visual/views/groups/group_create_select_members.view.dart';
|
import 'package:twonly/src/visual/views/groups/group_create_select_members.view.dart';
|
||||||
import 'package:twonly/src/visual/views/onboarding/recover_password.view.dart';
|
import 'package:twonly/src/visual/views/onboarding/recover.view.dart';
|
||||||
import 'package:twonly/src/visual/views/onboarding/recover_passwordless.view.dart';
|
|
||||||
import 'package:twonly/src/visual/views/public_profile.view.dart';
|
import 'package:twonly/src/visual/views/public_profile.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/account.view.dart';
|
import 'package:twonly/src/visual/views/settings/account.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/appearance.view.dart';
|
import 'package:twonly/src/visual/views/settings/appearance.view.dart';
|
||||||
|
|
@ -27,7 +26,6 @@ import 'package:twonly/src/visual/views/settings/data_and_storage/import_from_ga
|
||||||
import 'package:twonly/src/visual/views/settings/data_and_storage/manage_storage.view.dart';
|
import 'package:twonly/src/visual/views/settings/data_and_storage/manage_storage.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/developer/automated_testing.view.dart';
|
import 'package:twonly/src/visual/views/settings/developer/automated_testing.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/developer/developer.view.dart';
|
import 'package:twonly/src/visual/views/settings/developer/developer.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/developer/informations.view.dart';
|
|
||||||
import 'package:twonly/src/visual/views/settings/developer/reduce_flames.view.dart';
|
import 'package:twonly/src/visual/views/settings/developer/reduce_flames.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/developer/retransmission_data.view.dart';
|
import 'package:twonly/src/visual/views/settings/developer/retransmission_data.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/help/changelog.view.dart';
|
import 'package:twonly/src/visual/views/settings/help/changelog.view.dart';
|
||||||
|
|
@ -40,6 +38,7 @@ import 'package:twonly/src/visual/views/settings/help/help.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/notification.view.dart';
|
import 'package:twonly/src/visual/views/settings/notification.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/privacy.view.dart';
|
import 'package:twonly/src/visual/views/settings/privacy.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/privacy/block_users.view.dart';
|
import 'package:twonly/src/visual/views/settings/privacy/block_users.view.dart';
|
||||||
|
import 'package:twonly/src/visual/views/settings/privacy/profile_selection.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/privacy/user_discovery.view.dart';
|
import 'package:twonly/src/visual/views/settings/privacy/user_discovery.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/profile/modify_avatar.view.dart';
|
import 'package:twonly/src/visual/views/settings/profile/modify_avatar.view.dart';
|
||||||
import 'package:twonly/src/visual/views/settings/profile/profile.view.dart';
|
import 'package:twonly/src/visual/views/settings/profile/profile.view.dart';
|
||||||
|
|
@ -58,13 +57,6 @@ final routerProvider = GoRouter(
|
||||||
path: Routes.home,
|
path: Routes.home,
|
||||||
builder: (context, state) => const AppMainWidget(initialPage: 1),
|
builder: (context, state) => const AppMainWidget(initialPage: 1),
|
||||||
),
|
),
|
||||||
GoRoute(
|
|
||||||
path: Routes.recoverPasswordless,
|
|
||||||
builder: (context, state) {
|
|
||||||
final token = state.extra as String?;
|
|
||||||
return RecoverPasswordless(initialEmailToken: token);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
|
|
||||||
// Chats
|
// Chats
|
||||||
GoRoute(
|
GoRoute(
|
||||||
|
|
@ -142,13 +134,7 @@ final routerProvider = GoRouter(
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: Routes.cameraQRScanner,
|
path: Routes.cameraQRScanner,
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
final extra = state.extra as Map<String, dynamic>?;
|
return const QrCodeScannerView();
|
||||||
final contact = extra?['contact'] as Contact?;
|
|
||||||
final openToVerify = extra?['openToVerify'] as bool? ?? false;
|
|
||||||
return QrCodeScannerView(
|
|
||||||
contact: contact,
|
|
||||||
openToVerify: openToVerify,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
@ -219,6 +205,10 @@ final routerProvider = GoRouter(
|
||||||
path: 'user_discovery',
|
path: 'user_discovery',
|
||||||
builder: (context, state) => const UserDiscoverySettingsView(),
|
builder: (context, state) => const UserDiscoverySettingsView(),
|
||||||
),
|
),
|
||||||
|
GoRoute(
|
||||||
|
path: 'profile_selection',
|
||||||
|
builder: (context, state) => const ProfileSelectionSettingsView(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
|
|
@ -249,9 +239,7 @@ final routerProvider = GoRouter(
|
||||||
routes: [
|
routes: [
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: 'verifybadge',
|
path: 'verifybadge',
|
||||||
builder: (context, state) => VerificationBadeFaqView(
|
builder: (context, state) => const VerificationBadeFaqView(),
|
||||||
contact: state.extra as Contact?,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -300,10 +288,6 @@ final routerProvider = GoRouter(
|
||||||
path: 'automated_testing',
|
path: 'automated_testing',
|
||||||
builder: (context, state) => const AutomatedTestingView(),
|
builder: (context, state) => const AutomatedTestingView(),
|
||||||
),
|
),
|
||||||
GoRoute(
|
|
||||||
path: 'informations',
|
|
||||||
builder: (context, state) => const DeveloperInformationsView(),
|
|
||||||
),
|
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: 'reduce_flames',
|
path: 'reduce_flames',
|
||||||
builder: (context, state) => const ReduceFlamesView(),
|
builder: (context, state) => const ReduceFlamesView(),
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,7 @@ import 'package:twonly/locator.dart';
|
||||||
import 'package:twonly/src/database/twonly.db.dart';
|
import 'package:twonly/src/database/twonly.db.dart';
|
||||||
import 'package:twonly/src/model/protobuf/api/websocket/client_to_server.pbserver.dart';
|
import 'package:twonly/src/model/protobuf/api/websocket/client_to_server.pbserver.dart';
|
||||||
import 'package:twonly/src/model/protobuf/api/websocket/error.pb.dart';
|
import 'package:twonly/src/model/protobuf/api/websocket/error.pb.dart';
|
||||||
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart'
|
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pb.dart' as server;
|
||||||
as server;
|
|
||||||
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pbserver.dart';
|
import 'package:twonly/src/model/protobuf/api/websocket/server_to_client.pbserver.dart';
|
||||||
import 'package:twonly/src/services/api/client2client/user_discovery.c2c.dart';
|
import 'package:twonly/src/services/api/client2client/user_discovery.c2c.dart';
|
||||||
import 'package:twonly/src/services/api/mediafiles/download.api.dart';
|
import 'package:twonly/src/services/api/mediafiles/download.api.dart';
|
||||||
|
|
@ -34,7 +33,6 @@ import 'package:twonly/src/services/flame.service.dart';
|
||||||
import 'package:twonly/src/services/group.service.dart';
|
import 'package:twonly/src/services/group.service.dart';
|
||||||
import 'package:twonly/src/services/notifications/fcm.notifications.dart';
|
import 'package:twonly/src/services/notifications/fcm.notifications.dart';
|
||||||
import 'package:twonly/src/services/notifications/pushkeys.notifications.dart';
|
import 'package:twonly/src/services/notifications/pushkeys.notifications.dart';
|
||||||
import 'package:twonly/src/services/passwordless_recovery.service.dart';
|
|
||||||
import 'package:twonly/src/services/signal/identity.signal.dart';
|
import 'package:twonly/src/services/signal/identity.signal.dart';
|
||||||
import 'package:twonly/src/services/signal/protocol_state.signal.dart';
|
import 'package:twonly/src/services/signal/protocol_state.signal.dart';
|
||||||
import 'package:twonly/src/services/signal/utils.signal.dart';
|
import 'package:twonly/src/services/signal/utils.signal.dart';
|
||||||
|
|
@ -67,15 +65,13 @@ class ApiService {
|
||||||
Stream<SubscriptionPlan> get onPlanUpdated => _planUpdateController.stream;
|
Stream<SubscriptionPlan> get onPlanUpdated => _planUpdateController.stream;
|
||||||
|
|
||||||
final _connectionStateController = StreamController<bool>.broadcast();
|
final _connectionStateController = StreamController<bool>.broadcast();
|
||||||
Stream<bool> get onConnectionStateUpdated =>
|
Stream<bool> get onConnectionStateUpdated => _connectionStateController.stream;
|
||||||
_connectionStateController.stream;
|
|
||||||
|
|
||||||
final _appOutdatedController = StreamController<void>.broadcast();
|
final _appOutdatedController = StreamController<void>.broadcast();
|
||||||
Stream<void> get onAppOutdated => _appOutdatedController.stream;
|
Stream<void> get onAppOutdated => _appOutdatedController.stream;
|
||||||
|
|
||||||
final _newDeviceRegisteredController = StreamController<void>.broadcast();
|
final _newDeviceRegisteredController = StreamController<void>.broadcast();
|
||||||
Stream<void> get onNewDeviceRegistered =>
|
Stream<void> get onNewDeviceRegistered => _newDeviceRegisteredController.stream;
|
||||||
_newDeviceRegisteredController.stream;
|
|
||||||
|
|
||||||
bool appIsOutdated = false;
|
bool appIsOutdated = false;
|
||||||
bool isAuthenticated = false;
|
bool isAuthenticated = false;
|
||||||
|
|
@ -84,8 +80,7 @@ class ApiService {
|
||||||
Timer? reconnectionTimer;
|
Timer? reconnectionTimer;
|
||||||
int _reconnectionDelay = 5;
|
int _reconnectionDelay = 5;
|
||||||
|
|
||||||
final HashMap<Int64, Completer<server.ServerToClient?>> _pendingRequests =
|
final HashMap<Int64, Completer<server.ServerToClient?>> _pendingRequests = HashMap();
|
||||||
HashMap();
|
|
||||||
IOWebSocketChannel? _channel;
|
IOWebSocketChannel? _channel;
|
||||||
// ignore: cancel_subscriptions
|
// ignore: cancel_subscriptions
|
||||||
StreamSubscription<List<ConnectivityResult>>? _connectivitySubscription;
|
StreamSubscription<List<ConnectivityResult>>? _connectivitySubscription;
|
||||||
|
|
@ -117,7 +112,7 @@ class ApiService {
|
||||||
|
|
||||||
// Function is called after the user is authenticated at the server
|
// Function is called after the user is authenticated at the server
|
||||||
Future<void> onAuthenticated() async {
|
Future<void> onAuthenticated() async {
|
||||||
await FcmNotificationService.initFCMAfterAuthenticated();
|
await initFCMAfterAuthenticated();
|
||||||
_connectionStateController.add(true);
|
_connectionStateController.add(true);
|
||||||
|
|
||||||
if (AppState.isInBackgroundTask) {
|
if (AppState.isInBackgroundTask) {
|
||||||
|
|
@ -140,7 +135,6 @@ class ApiService {
|
||||||
unawaited(fetchGroupStatesForUnjoinedGroups());
|
unawaited(fetchGroupStatesForUnjoinedGroups());
|
||||||
unawaited(fetchMissingGroupPublicKey());
|
unawaited(fetchMissingGroupPublicKey());
|
||||||
unawaited(checkForDeletedUsernames());
|
unawaited(checkForDeletedUsernames());
|
||||||
unawaited(PasswordlessRecoveryService.performHeartbeat());
|
|
||||||
|
|
||||||
unawaited(UserDiscoveryService.checkForNewAnnouncedUsers());
|
unawaited(UserDiscoveryService.checkForNewAnnouncedUsers());
|
||||||
|
|
||||||
|
|
@ -424,9 +418,7 @@ class ApiService {
|
||||||
}
|
}
|
||||||
if (res.error == ErrorCode.UserIdNotFound && contactId != null) {
|
if (res.error == ErrorCode.UserIdNotFound && contactId != null) {
|
||||||
Log.warn('Contact deleted their account $contactId.');
|
Log.warn('Contact deleted their account $contactId.');
|
||||||
final contact = await twonlyDB.contactsDao
|
final contact = await twonlyDB.contactsDao.getContactByUserId(contactId).getSingleOrNull();
|
||||||
.getContactByUserId(contactId)
|
|
||||||
.getSingleOrNull();
|
|
||||||
if (contact != null) {
|
if (contact != null) {
|
||||||
await twonlyDB.contactsDao.updateContact(
|
await twonlyDB.contactsDao.updateContact(
|
||||||
contactId,
|
contactId,
|
||||||
|
|
@ -491,8 +483,7 @@ class ApiService {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (result.isError) {
|
if (result.isError) {
|
||||||
if (result.error != ErrorCode.AuthTokenNotValid &&
|
if (result.error != ErrorCode.AuthTokenNotValid && result.error != ErrorCode.ForegroundSessionConnected) {
|
||||||
result.error != ErrorCode.ForegroundSessionConnected) {
|
|
||||||
Log.error(
|
Log.error(
|
||||||
'got error while authenticating to the server: ${result.error}',
|
'got error while authenticating to the server: ${result.error}',
|
||||||
);
|
);
|
||||||
|
|
@ -530,8 +521,7 @@ class ApiService {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (result.isError) {
|
if (result.isError) {
|
||||||
if (result.error != ErrorCode.AuthTokenNotValid &&
|
if (result.error != ErrorCode.AuthTokenNotValid && result.error != ErrorCode.ForegroundSessionConnected) {
|
||||||
result.error != ErrorCode.ForegroundSessionConnected) {
|
|
||||||
Log.error(
|
Log.error(
|
||||||
'got error while authenticating to the server: ${result.error}',
|
'got error while authenticating to the server: ${result.error}',
|
||||||
);
|
);
|
||||||
|
|
@ -563,8 +553,7 @@ class ApiService {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final handshake = Handshake()
|
final handshake = Handshake()..getAuthChallenge = Handshake_GetAuthChallenge();
|
||||||
..getAuthChallenge = Handshake_GetAuthChallenge();
|
|
||||||
final req = createClientToServerFromHandshake(handshake);
|
final req = createClientToServerFromHandshake(handshake);
|
||||||
|
|
||||||
final result = await sendRequestSync(req, authenticated: false);
|
final result = await sendRequestSync(req, authenticated: false);
|
||||||
|
|
@ -629,9 +618,7 @@ class ApiService {
|
||||||
|
|
||||||
final register = Handshake_Register()
|
final register = Handshake_Register()
|
||||||
..username = username
|
..username = username
|
||||||
..publicIdentityKey = (await signalStore.getIdentityKeyPair())
|
..publicIdentityKey = (await signalStore.getIdentityKeyPair()).getPublicKey().serialize()
|
||||||
.getPublicKey()
|
|
||||||
.serialize()
|
|
||||||
..registrationId = Int64(signalIdentity.registrationId)
|
..registrationId = Int64(signalIdentity.registrationId)
|
||||||
..signedPrekey = signedPreKey.getKeyPair().publicKey.serialize()
|
..signedPrekey = signedPreKey.getKeyPair().publicKey.serialize()
|
||||||
..signedPrekeySignature = signedPreKey.signature
|
..signedPrekeySignature = signedPreKey.signature
|
||||||
|
|
@ -686,11 +673,11 @@ class ApiService {
|
||||||
final req = createClientToServerFromHandshake(handshake);
|
final req = createClientToServerFromHandshake(handshake);
|
||||||
final result = await sendRequestSync(req, authenticated: false);
|
final result = await sendRequestSync(req, authenticated: false);
|
||||||
if (result.isError) {
|
if (result.isError) {
|
||||||
Log.error('could not request proof of work params', error: result);
|
Log.error('could not request proof of work params', result);
|
||||||
if (result.error == ErrorCode.RegistrationDisabled) {
|
if (result.error == ErrorCode.RegistrationDisabled) {
|
||||||
return (null, true);
|
return (null, true);
|
||||||
}
|
}
|
||||||
Log.error('could not request proof of work params', error: result);
|
Log.error('could not request proof of work params', result);
|
||||||
return (null, false);
|
return (null, false);
|
||||||
}
|
}
|
||||||
return (result.value.proofOfWork as Response_ProofOfWork, false);
|
return (result.value.proofOfWork as Response_ProofOfWork, false);
|
||||||
|
|
@ -760,85 +747,6 @@ class ApiService {
|
||||||
return sendRequestSync(req, contactId: userId.toInt());
|
return sendRequestSync(req, contactId: userId.toInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Result> registerPasswordLessRecovery(
|
|
||||||
List<int> encryptedServerKey,
|
|
||||||
List<int>? pinUnlockToken,
|
|
||||||
) async {
|
|
||||||
final req = createClientToServerFromApplicationData(
|
|
||||||
ApplicationData(
|
|
||||||
registerPasswordlessRecovery:
|
|
||||||
ApplicationData_RegisterPasswordLessRecovery(
|
|
||||||
encryptedServerKey: encryptedServerKey,
|
|
||||||
pinUnlockToken: pinUnlockToken,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return sendRequestSync(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Result> getServerKeyForPasswordlessRecovery({
|
|
||||||
required int userId,
|
|
||||||
List<int>? encryptedServerKeyNone,
|
|
||||||
List<int>? pinUnlockToken,
|
|
||||||
List<int>? pinProtectionKey,
|
|
||||||
String? email,
|
|
||||||
}) async {
|
|
||||||
final get = Handshake_GetServerKeyForPasswordLessRecovery()
|
|
||||||
..userId = Int64(userId);
|
|
||||||
if (encryptedServerKeyNone != null) {
|
|
||||||
get.encryptedServerKeyNone = encryptedServerKeyNone;
|
|
||||||
}
|
|
||||||
if (pinUnlockToken != null) {
|
|
||||||
get.pinUnlockToken = pinUnlockToken;
|
|
||||||
}
|
|
||||||
if (pinProtectionKey != null) {
|
|
||||||
get.pinProtectionKey = pinProtectionKey;
|
|
||||||
}
|
|
||||||
if (email != null) {
|
|
||||||
get.email = email;
|
|
||||||
}
|
|
||||||
|
|
||||||
final handshake = Handshake()..getServerKeyForPasswordlessRecovery = get;
|
|
||||||
final req = createClientToServerFromHandshake(handshake);
|
|
||||||
return sendRequestSync(req, authenticated: false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Future<Result> submitRecoveryShare({
|
|
||||||
required String notificationId,
|
|
||||||
required List<int> encryptedMessage,
|
|
||||||
}) async {
|
|
||||||
final req = createClientToServerFromApplicationData(
|
|
||||||
ApplicationData(
|
|
||||||
passwordlessNotification: ApplicationData_PasswordlessNotification(
|
|
||||||
notificationId: notificationId,
|
|
||||||
encryptedMessage: encryptedMessage,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
return sendRequestSync(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Result> registerPasswordlessNotification({
|
|
||||||
required String notificationId,
|
|
||||||
required List<int> downloadAuthToken,
|
|
||||||
required String langCode,
|
|
||||||
required String? googleFcm,
|
|
||||||
}) async {
|
|
||||||
final registerNotif = Handshake_RegisterPasswordlessNotification()
|
|
||||||
..notificationId = notificationId
|
|
||||||
..downloadAuthToken = downloadAuthToken
|
|
||||||
..langCode = langCode;
|
|
||||||
if (googleFcm != null) {
|
|
||||||
registerNotif.googleFcm = googleFcm;
|
|
||||||
}
|
|
||||||
|
|
||||||
final handshake = Handshake()
|
|
||||||
..registerPasswordlessNotification = registerNotif;
|
|
||||||
final req = createClientToServerFromHandshake(handshake);
|
|
||||||
return sendRequestSync(req, authenticated: false);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Result> addAdditionalUser(Int64 userId) async {
|
Future<Result> addAdditionalUser(Int64 userId) async {
|
||||||
final get = ApplicationData_AddAdditionalUser()..userId = userId;
|
final get = ApplicationData_AddAdditionalUser()..userId = userId;
|
||||||
final appData = ApplicationData()..addAdditionalUser = get;
|
final appData = ApplicationData()..addAdditionalUser = get;
|
||||||
|
|
@ -951,30 +859,4 @@ class ApiService {
|
||||||
final req = createClientToServerFromApplicationData(appData);
|
final req = createClientToServerFromApplicationData(appData);
|
||||||
return sendRequestSync(req, contactId: target);
|
return sendRequestSync(req, contactId: target);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Polls the server for new passwordless recovery notification messages.
|
|
||||||
/// [alreadyReceivedIds] prevents the server from sending duplicates.
|
|
||||||
Future<server.Response_PasswordlessNotificationMessages?> checkForPasswordlessNotification({
|
|
||||||
required String notificationId,
|
|
||||||
required List<int> downloadAuthToken,
|
|
||||||
List<Int64>? alreadyReceivedIds,
|
|
||||||
}) async {
|
|
||||||
final check = Handshake_CheckForPasswordlessNotification()
|
|
||||||
..notificationId = notificationId
|
|
||||||
..downloadAuthToken = downloadAuthToken;
|
|
||||||
if (alreadyReceivedIds != null && alreadyReceivedIds.isNotEmpty) {
|
|
||||||
check.alreadyReceivedMessageIds.addAll(alreadyReceivedIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
final handshake = Handshake()..checkForPasswordlessNotification = check;
|
|
||||||
final req = createClientToServerFromHandshake(handshake);
|
|
||||||
final res = await sendRequestSync(req, authenticated: false);
|
|
||||||
if (res.isSuccess) {
|
|
||||||
final ok = res.value as server.Response_Ok;
|
|
||||||
if (ok.hasPasswordlessNotificationMessages()) {
|
|
||||||
return ok.passwordlessNotificationMessages;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,8 @@ import 'package:clock/clock.dart' show clock;
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:twonly/locator.dart';
|
import 'package:twonly/locator.dart';
|
||||||
import 'package:twonly/src/database/twonly.db.dart';
|
import 'package:twonly/src/database/twonly.db.dart';
|
||||||
import 'package:twonly/src/model/protobuf/client/generated/data.pb.dart'
|
|
||||||
as pb_data;
|
|
||||||
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
|
import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
|
||||||
import 'package:twonly/src/services/api/utils.api.dart';
|
import 'package:twonly/src/services/api/utils.api.dart';
|
||||||
import 'package:twonly/src/services/key_verification.service.dart';
|
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
|
|
||||||
Future<void> handleAdditionalDataMessage(
|
Future<void> handleAdditionalDataMessage(
|
||||||
|
|
@ -31,25 +28,6 @@ Future<void> handleAdditionalDataMessage(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
final additionalData = pb_data.AdditionalMessageData.fromBuffer(
|
|
||||||
message.additionalMessageData,
|
|
||||||
);
|
|
||||||
if (additionalData.type == pb_data.AdditionalMessageData_Type.CONTACTS) {
|
|
||||||
for (final sharedContact in additionalData.contacts) {
|
|
||||||
await KeyVerificationService.verifySharedContact(
|
|
||||||
contactId: sharedContact.userId.toInt(),
|
|
||||||
sharedPublicIdentityKey: sharedContact.publicIdentityKey,
|
|
||||||
senderId: fromUserId,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
Log.error(
|
|
||||||
'Failed to parse additional message data or verify shared contacts: $e',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
final msg = await twonlyDB.messagesDao.insertMessage(
|
final msg = await twonlyDB.messagesDao.insertMessage(
|
||||||
MessagesCompanion(
|
MessagesCompanion(
|
||||||
messageId: Value(message.senderMessageId),
|
messageId: Value(message.senderMessageId),
|
||||||
|
|
@ -68,8 +46,6 @@ Future<void> handleAdditionalDataMessage(
|
||||||
fromTimestamp(message.timestamp),
|
fromTimestamp(message.timestamp),
|
||||||
);
|
);
|
||||||
if (msg != null) {
|
if (msg != null) {
|
||||||
Log.info(
|
Log.info('[$receiptId] Inserted a new text message with ID: ${msg.messageId}');
|
||||||
'[$receiptId] Inserted a new text message with ID: ${msg.messageId}',
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,16 @@
|
||||||
import 'package:clock/clock.dart';
|
import 'package:clock/clock.dart';
|
||||||
import 'package:drift/drift.dart' show Value;
|
import 'package:drift/drift.dart' show Value;
|
||||||
import 'package:fixnum/fixnum.dart' show Int64;
|
|
||||||
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'
|
|
||||||
show IdentityKeyPair;
|
|
||||||
import 'package:twonly/locator.dart';
|
import 'package:twonly/locator.dart';
|
||||||
import 'package:twonly/src/database/twonly.db.dart';
|
import 'package:twonly/src/database/twonly.db.dart';
|
||||||
import 'package:twonly/src/model/protobuf/client/generated/messages.pbserver.dart';
|
import 'package:twonly/src/model/protobuf/client/generated/messages.pbserver.dart';
|
||||||
import 'package:twonly/src/services/api/messages.api.dart'
|
|
||||||
show sendCipherText, tryToSendCompleteMessage;
|
|
||||||
import 'package:twonly/src/services/group.service.dart' show fetchGroupState;
|
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
|
|
||||||
Future<void> handleErrorMessage(
|
Future<void> handleErrorMessage(
|
||||||
int fromUserId,
|
int fromUserId,
|
||||||
EncryptedContent_ErrorMessages error,
|
EncryptedContent_ErrorMessages error,
|
||||||
String receiptId, {
|
String receiptId,
|
||||||
String? groupId,
|
) async {
|
||||||
}) async {
|
Log.error('[$receiptId] Got error from $fromUserId: $error');
|
||||||
Log.warn('[$receiptId] Got error from $fromUserId: $error');
|
|
||||||
|
|
||||||
switch (error.type) {
|
switch (error.type) {
|
||||||
case EncryptedContent_ErrorMessages_Type
|
case EncryptedContent_ErrorMessages_Type
|
||||||
|
|
@ -36,59 +29,6 @@ Future<void> handleErrorMessage(
|
||||||
);
|
);
|
||||||
case EncryptedContent_ErrorMessages_Type.SESSION_OUT_OF_SYNC:
|
case EncryptedContent_ErrorMessages_Type.SESSION_OUT_OF_SYNC:
|
||||||
break; // The other user initiated a new signal session, so ignore the error in this case, as the new session works...
|
break; // The other user initiated a new signal session, so ignore the error in this case, as the new session works...
|
||||||
case EncryptedContent_ErrorMessages_Type.GROUP_NOT_FOUND_OR_NOT_A_MEMBER:
|
|
||||||
if (groupId == null) {
|
|
||||||
Log.warn(
|
|
||||||
'[$receiptId] GROUP_NOT_FOUND_OR_NOT_A_MEMBER error received, but groupId is null.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final group = await twonlyDB.groupsDao.getGroup(groupId);
|
|
||||||
if (group == null) {
|
|
||||||
Log.warn(
|
|
||||||
'[$receiptId] GROUP_NOT_FOUND_OR_NOT_A_MEMBER error received, but group $groupId is not found in database.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Update group state from the server to ensure the user is still part of the group...
|
|
||||||
final updatedState = await fetchGroupState(group);
|
|
||||||
if (updatedState != null) {
|
|
||||||
final (_, state) = updatedState;
|
|
||||||
final isStillMember = state.memberIds.contains(Int64(fromUserId));
|
|
||||||
if (isStillMember) {
|
|
||||||
final keyPair = IdentityKeyPair.fromSerialized(
|
|
||||||
group.myGroupPrivateKey!,
|
|
||||||
);
|
|
||||||
await sendCipherText(
|
|
||||||
fromUserId,
|
|
||||||
EncryptedContent(
|
|
||||||
groupId: groupId,
|
|
||||||
groupCreate: EncryptedContent_GroupCreate(
|
|
||||||
stateKey: group.stateEncryptionKey,
|
|
||||||
groupPublicKey: keyPair.getPublicKey().serialize(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
final r = await twonlyDB.receiptsDao.getReceiptById(
|
|
||||||
error.relatedReceiptId,
|
|
||||||
);
|
|
||||||
if (r != null) {
|
|
||||||
await twonlyDB.receiptsDao.updateReceiptWidthUserId(
|
|
||||||
fromUserId,
|
|
||||||
error.relatedReceiptId,
|
|
||||||
ReceiptsCompanion(
|
|
||||||
markForRetry: Value(clock.now()),
|
|
||||||
retryCount: Value(r.retryCount + 1),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// then resend: error.relatedReceiptId
|
|
||||||
await tryToSendCompleteMessage(
|
|
||||||
receiptId: error.relatedReceiptId,
|
|
||||||
blocking: false,
|
|
||||||
);
|
|
||||||
} else {}
|
|
||||||
// ignore: no_default_cases
|
// ignore: no_default_cases
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,7 @@ Future<void> handleGroupCreate(
|
||||||
EncryptedContent_GroupCreate newGroup,
|
EncryptedContent_GroupCreate newGroup,
|
||||||
String receiptId,
|
String receiptId,
|
||||||
) async {
|
) async {
|
||||||
final user = await twonlyDB.contactsDao
|
final user = await twonlyDB.contactsDao.getContactByUserId(fromUserId).getSingleOrNull();
|
||||||
.getContactByUserId(fromUserId)
|
|
||||||
.getSingleOrNull();
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
// Only contacts can invite other contacts, so this can (via the UI) not happen.
|
// Only contacts can invite other contacts, so this can (via the UI) not happen.
|
||||||
Log.error(
|
Log.error(
|
||||||
|
|
@ -45,26 +43,11 @@ Future<void> handleGroupCreate(
|
||||||
stateVersionId: const Value(0),
|
stateVersionId: const Value(0),
|
||||||
stateEncryptionKey: Value(Uint8List.fromList(newGroup.stateKey)),
|
stateEncryptionKey: Value(Uint8List.fromList(newGroup.stateKey)),
|
||||||
myGroupPrivateKey: Value(myGroupKey.serialize()),
|
myGroupPrivateKey: Value(myGroupKey.serialize()),
|
||||||
groupName: Value(newGroup.hasGroupName() ? newGroup.groupName : ''),
|
groupName: const Value(''),
|
||||||
joinedGroup: const Value(false),
|
joinedGroup: const Value(false),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// In this case make a group state update and check if the fromUserId is still a admin. otherwise return with an log error message
|
|
||||||
final updatedState = await fetchGroupState(group);
|
|
||||||
if (updatedState == null) {
|
|
||||||
Log.error(
|
|
||||||
'[$receiptId] Received group invite/create for $groupId, but failed to fetch group state from server.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final (_, state) = updatedState;
|
|
||||||
if (!state.adminIds.any((id) => id.toInt() == fromUserId)) {
|
|
||||||
Log.error(
|
|
||||||
'[$receiptId] Received group invite/create for $groupId from $fromUserId, but they are not an admin of this group.',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// User was already in the group, so update leftGroup back to false
|
// User was already in the group, so update leftGroup back to false
|
||||||
await twonlyDB.groupsDao.updateGroup(
|
await twonlyDB.groupsDao.updateGroup(
|
||||||
groupId,
|
groupId,
|
||||||
|
|
@ -72,6 +55,7 @@ Future<void> handleGroupCreate(
|
||||||
stateVersionId: const Value(0),
|
stateVersionId: const Value(0),
|
||||||
stateEncryptionKey: Value(Uint8List.fromList(newGroup.stateKey)),
|
stateEncryptionKey: Value(Uint8List.fromList(newGroup.stateKey)),
|
||||||
myGroupPrivateKey: Value(myGroupKey.serialize()),
|
myGroupPrivateKey: Value(myGroupKey.serialize()),
|
||||||
|
groupName: const Value(''),
|
||||||
joinedGroup: const Value(false),
|
joinedGroup: const Value(false),
|
||||||
leftGroup: const Value(false),
|
leftGroup: const Value(false),
|
||||||
deletedContent: const Value(false),
|
deletedContent: const Value(false),
|
||||||
|
|
@ -95,8 +79,18 @@ Future<void> handleGroupCreate(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Load group members from the server as this is the single source of truth.
|
await twonlyDB.groupsDao.insertOrUpdateGroupMember(
|
||||||
// This can be done in the background, so the WebSocket message can be ACKed.
|
GroupMembersCompanion(
|
||||||
|
groupId: Value(groupId),
|
||||||
|
contactId: Value(fromUserId),
|
||||||
|
memberState: const Value(
|
||||||
|
MemberState.admin, // is the group creator, so must be admin...
|
||||||
|
),
|
||||||
|
groupPublicKey: Value(Uint8List.fromList(newGroup.groupPublicKey)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// can be done in the background -> websocket message can be ACK
|
||||||
unawaited(fetchGroupStatesForUnjoinedGroups());
|
unawaited(fetchGroupStatesForUnjoinedGroups());
|
||||||
|
|
||||||
await sendCipherTextToGroup(
|
await sendCipherTextToGroup(
|
||||||
|
|
@ -119,9 +113,7 @@ Future<void> handleGroupUpdate(
|
||||||
|
|
||||||
final actionType = groupActionTypeFromString(update.groupActionType);
|
final actionType = groupActionTypeFromString(update.groupActionType);
|
||||||
if (actionType == null) {
|
if (actionType == null) {
|
||||||
Log.error(
|
Log.error('[$receiptId] Group action ${update.groupActionType} is unknown ignoring.');
|
||||||
'[$receiptId] Group action ${update.groupActionType} is unknown ignoring.',
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import 'package:twonly/src/services/flame.service.dart';
|
||||||
import 'package:twonly/src/services/mediafiles/mediafile.service.dart';
|
import 'package:twonly/src/services/mediafiles/mediafile.service.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
|
|
||||||
Future<bool> handleMedia(
|
Future<void> handleMedia(
|
||||||
int fromUserId,
|
int fromUserId,
|
||||||
String groupId,
|
String groupId,
|
||||||
EncryptedContent_Media media,
|
EncryptedContent_Media media,
|
||||||
|
|
@ -36,7 +36,7 @@ Future<bool> handleMedia(
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'[$receiptId] Got reupload for a message that either does not exists (${message == null}) or senderId = ${message?.senderId}',
|
'[$receiptId] Got reupload for a message that either does not exists (${message == null}) or senderId = ${message?.senderId}',
|
||||||
);
|
);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// in case there was already a downloaded file delete it...
|
// in case there was already a downloaded file delete it...
|
||||||
|
|
@ -64,7 +64,7 @@ Future<bool> handleMedia(
|
||||||
unawaited(startDownloadMedia(mediaFile, false));
|
unawaited(startDownloadMedia(mediaFile, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return;
|
||||||
case EncryptedContent_Media_Type.IMAGE:
|
case EncryptedContent_Media_Type.IMAGE:
|
||||||
mediaType = MediaType.image;
|
mediaType = MediaType.image;
|
||||||
case EncryptedContent_Media_Type.VIDEO:
|
case EncryptedContent_Media_Type.VIDEO:
|
||||||
|
|
@ -85,13 +85,13 @@ Future<bool> handleMedia(
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'[$receiptId] $fromUserId tried to modify the message from ${messageTmp.senderId}.',
|
'[$receiptId] $fromUserId tried to modify the message from ${messageTmp.senderId}.',
|
||||||
);
|
);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
if (messageTmp.mediaId == null) {
|
if (messageTmp.mediaId == null) {
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'[$receiptId] This message already exit without a mediaId. Message is dropped.',
|
'[$receiptId] This message already exit without a mediaId. Message is dropped.',
|
||||||
);
|
);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
final mediaFile = await twonlyDB.mediaFilesDao.getMediaFileById(
|
final mediaFile = await twonlyDB.mediaFilesDao.getMediaFileById(
|
||||||
messageTmp.mediaId!,
|
messageTmp.mediaId!,
|
||||||
|
|
@ -100,7 +100,7 @@ Future<bool> handleMedia(
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'[$receiptId] This message and media file already exit and was not requested again. Dropping it.',
|
'[$receiptId] This message and media file already exit and was not requested again. Dropping it.',
|
||||||
);
|
);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mediaFile != null) {
|
if (mediaFile != null) {
|
||||||
|
|
@ -145,13 +145,9 @@ Future<bool> handleMedia(
|
||||||
|
|
||||||
if (mediaFile == null) {
|
if (mediaFile == null) {
|
||||||
Log.error('[$receiptId] Could not insert media file into database');
|
Log.error('[$receiptId] Could not insert media file into database');
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.info(
|
|
||||||
'[$receiptId] Inserting media message: messageId=${media.senderMessageId}, mediaId=${mediaFile!.mediaId}',
|
|
||||||
);
|
|
||||||
|
|
||||||
message = await twonlyDB.messagesDao.insertMessage(
|
message = await twonlyDB.messagesDao.insertMessage(
|
||||||
MessagesCompanion(
|
MessagesCompanion(
|
||||||
messageId: Value(media.senderMessageId),
|
messageId: Value(media.senderMessageId),
|
||||||
|
|
@ -190,7 +186,6 @@ Future<bool> handleMedia(
|
||||||
);
|
);
|
||||||
|
|
||||||
unawaited(startDownloadMedia(mediaFile!, false));
|
unawaited(startDownloadMedia(mediaFile!, false));
|
||||||
return true;
|
|
||||||
} else {
|
} else {
|
||||||
if (mediaFile == null && message == null) {
|
if (mediaFile == null && message == null) {
|
||||||
Log.error(
|
Log.error(
|
||||||
|
|
@ -205,7 +200,6 @@ Future<bool> handleMedia(
|
||||||
'[$receiptId] Could not insert new message as the message is empty.',
|
'[$receiptId] Could not insert new message as the message is empty.',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import 'package:twonly/src/model/protobuf/client/generated/messages.pb.dart';
|
||||||
import 'package:twonly/src/services/api/utils.api.dart';
|
import 'package:twonly/src/services/api/utils.api.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
|
|
||||||
Future<bool> handleTextMessage(
|
Future<void> handleTextMessage(
|
||||||
int fromUserId,
|
int fromUserId,
|
||||||
String groupId,
|
String groupId,
|
||||||
EncryptedContent_TextMessage textMessage,
|
EncryptedContent_TextMessage textMessage,
|
||||||
|
|
@ -26,7 +26,7 @@ Future<bool> handleTextMessage(
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'[$receiptId] $fromUserId tried to overwrite message from ${existing.senderId}. Dropping.',
|
'[$receiptId] $fromUserId tried to overwrite message from ${existing.senderId}. Dropping.',
|
||||||
);
|
);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final message = await twonlyDB.messagesDao.insertMessage(
|
final message = await twonlyDB.messagesDao.insertMessage(
|
||||||
|
|
@ -50,5 +50,4 @@ Future<bool> handleTextMessage(
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
Log.info('[$receiptId] Inserted a new text message with ID: ${message.messageId}');
|
Log.info('[$receiptId] Inserted a new text message with ID: ${message.messageId}');
|
||||||
}
|
}
|
||||||
return message != null;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -143,12 +143,8 @@ Future<void> handleDownloadStatusUpdate(TaskStatusUpdate update) async {
|
||||||
failed = false;
|
failed = false;
|
||||||
} else {
|
} else {
|
||||||
failed = true;
|
failed = true;
|
||||||
Log.warn(
|
|
||||||
'[$mediaId] Got invalid response status code: ${update.responseStatusCode}',
|
|
||||||
);
|
|
||||||
Log.error(
|
Log.error(
|
||||||
'Got invalid response status code: ${update.responseStatusCode}',
|
'Got invalid response status code: ${update.responseStatusCode}',
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -231,7 +227,7 @@ Future<void> startDownloadMedia(MediaFile media, bool force) async {
|
||||||
try {
|
try {
|
||||||
await downloadFileFast(media, apiUrl, mediaService.encryptedPath);
|
await downloadFileFast(media, apiUrl, mediaService.encryptedPath);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn('Fast download failed: $e');
|
Log.error('Fast download failed: $e');
|
||||||
await FileDownloader().enqueue(task);
|
await FileDownloader().enqueue(task);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
@ -255,12 +251,8 @@ Future<void> downloadFileFast(
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
if (response.statusCode == 404 || response.statusCode == 403) {
|
if (response.statusCode == 404 || response.statusCode == 403) {
|
||||||
Log.warn(
|
|
||||||
'Got ${response.statusCode} from server for media ID ${media.mediaId}. Requesting upload again',
|
|
||||||
);
|
|
||||||
Log.error(
|
Log.error(
|
||||||
'Got ${response.statusCode} from server for media ID.',
|
'Got ${response.statusCode} from server. Requesting upload again',
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
);
|
||||||
// Message was deleted from the server. Requesting it again from the sender to upload it again...
|
// Message was deleted from the server. Requesting it again from the sender to upload it again...
|
||||||
await requestMediaReupload(media.mediaId);
|
await requestMediaReupload(media.mediaId);
|
||||||
|
|
@ -272,13 +264,6 @@ Future<void> downloadFileFast(
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> requestMediaReupload(String mediaId) async {
|
Future<void> requestMediaReupload(String mediaId) async {
|
||||||
await twonlyDB.mediaFilesDao.updateMedia(
|
|
||||||
mediaId,
|
|
||||||
const MediaFilesCompanion(
|
|
||||||
downloadState: Value(DownloadState.reuploadRequested),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
final messages = await twonlyDB.messagesDao.getMessagesByMediaId(mediaId);
|
final messages = await twonlyDB.messagesDao.getMessagesByMediaId(mediaId);
|
||||||
|
|
||||||
for (final message in messages) {
|
for (final message in messages) {
|
||||||
|
|
@ -292,6 +277,12 @@ Future<void> requestMediaReupload(String mediaId) async {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
await twonlyDB.mediaFilesDao.updateMedia(
|
||||||
|
mediaId,
|
||||||
|
const MediaFilesCompanion(
|
||||||
|
downloadState: Value(DownloadState.reuploadRequested),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -302,7 +293,7 @@ Future<void> handleEncryptedFile(String mediaId) async {
|
||||||
action: () async {
|
action: () async {
|
||||||
final mediaService = await MediaFileService.fromMediaId(mediaId);
|
final mediaService = await MediaFileService.fromMediaId(mediaId);
|
||||||
if (mediaService == null) {
|
if (mediaService == null) {
|
||||||
Log.warn('[$mediaId] Media file not found in database.');
|
Log.error('Media file not found in database.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,12 +80,8 @@ Future<void> handleUploadStatusUpdate(TaskStatusUpdate update) async {
|
||||||
await markUploadAsSuccessful(media);
|
await markUploadAsSuccessful(media);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.warn(
|
|
||||||
'Got HTTP error ${update.responseStatusCode} for $mediaId',
|
|
||||||
);
|
|
||||||
Log.error(
|
Log.error(
|
||||||
'Got HTTP error ${update.responseStatusCode} for media.',
|
'Got HTTP error ${update.responseStatusCode} for $mediaId',
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -122,12 +118,8 @@ Future<void> handleUploadStatusUpdate(TaskStatusUpdate update) async {
|
||||||
|
|
||||||
if (update.status == TaskStatus.failed ||
|
if (update.status == TaskStatus.failed ||
|
||||||
update.status == TaskStatus.canceled) {
|
update.status == TaskStatus.canceled) {
|
||||||
Log.warn(
|
|
||||||
'Background upload failed for $mediaId with status ${update.status} and ${update.responseStatusCode}. ',
|
|
||||||
);
|
|
||||||
Log.error(
|
Log.error(
|
||||||
'Background upload failed with status ${update.status} and ${update.responseStatusCode}.',
|
'Background upload failed for $mediaId with status ${update.status} and ${update.responseStatusCode}. ',
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
);
|
||||||
final mediaService = MediaFileService(media);
|
final mediaService = MediaFileService(media);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -227,16 +227,9 @@ Future<void> finishStartedPreprocessing() async {
|
||||||
if (!service.originalPath.existsSync() &&
|
if (!service.originalPath.existsSync() &&
|
||||||
!service.uploadRequestPath.existsSync()) {
|
!service.uploadRequestPath.existsSync()) {
|
||||||
if (service.storedPath.existsSync()) {
|
if (service.storedPath.existsSync()) {
|
||||||
// media file was stored, we can recover tempPath from storedPath and upload it.
|
// media files was just stored..
|
||||||
try {
|
|
||||||
if (!service.tempPath.existsSync()) {
|
|
||||||
service.storedPath.copySync(service.tempPath.path);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
Log.error('Error recovering tempPath from storedPath: $e');
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (mediaFile.reuploadRequestedBy != null) {
|
if (mediaFile.reuploadRequestedBy != null) {
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'Reupload requested for ${mediaFile.mediaId} but files are missing. Cancelling reupload but keeping record.',
|
'Reupload requested for ${mediaFile.mediaId} but files are missing. Cancelling reupload but keeping record.',
|
||||||
|
|
@ -275,7 +268,6 @@ Future<void> finishStartedPreprocessing() async {
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
Log.info(
|
Log.info(
|
||||||
'Finishing started preprocessing of ${mediaFile.mediaId} in state ${mediaFile.uploadState}.',
|
'Finishing started preprocessing of ${mediaFile.mediaId} in state ${mediaFile.uploadState}.',
|
||||||
);
|
);
|
||||||
|
|
@ -439,45 +431,17 @@ Future<void> _startBackgroundMediaUploadInternal(
|
||||||
// Refresh the media file state inside the mutex
|
// Refresh the media file state inside the mutex
|
||||||
await mediaService.updateFromDB();
|
await mediaService.updateFromDB();
|
||||||
|
|
||||||
if (mediaService.mediaFile.uploadState == UploadState.uploading) {
|
|
||||||
await _checkAndRecoverMissingUploadRequest(mediaService);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mediaService.mediaFile.uploadState == UploadState.initialized ||
|
if (mediaService.mediaFile.uploadState == UploadState.initialized ||
|
||||||
mediaService.mediaFile.uploadState == UploadState.preprocessing) {
|
mediaService.mediaFile.uploadState == UploadState.preprocessing) {
|
||||||
Log.info(
|
Log.info(
|
||||||
'Handling media file ${mediaService.mediaFile.mediaId} in ${mediaService.mediaFile.uploadState}',
|
'Hanlding media file ${mediaService.mediaFile.mediaId} in ${mediaService.mediaFile.uploadState}',
|
||||||
);
|
);
|
||||||
|
|
||||||
await mediaService.setUploadState(UploadState.preprocessing);
|
await mediaService.setUploadState(UploadState.preprocessing);
|
||||||
|
|
||||||
if (!mediaService.tempPath.existsSync()) {
|
if (!mediaService.tempPath.existsSync()) {
|
||||||
if (mediaService.storedPath.existsSync()) {
|
|
||||||
try {
|
|
||||||
mediaService.storedPath.copySync(mediaService.tempPath.path);
|
|
||||||
} catch (e) {
|
|
||||||
Log.error('Error copying storedPath to tempPath: $e');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
await mediaService.compressMedia();
|
await mediaService.compressMedia();
|
||||||
}
|
|
||||||
if (!mediaService.tempPath.existsSync()) {
|
if (!mediaService.tempPath.existsSync()) {
|
||||||
final messages = await twonlyDB.messagesDao.getMessagesByMediaId(
|
|
||||||
mediaService.mediaFile.mediaId,
|
|
||||||
);
|
|
||||||
if (messages.isEmpty) {
|
|
||||||
Log.warn(
|
|
||||||
'Media files ${mediaService.mediaFile.mediaId} has no original, temp, or stored path. Removing it from DB as files are not existent.',
|
|
||||||
);
|
|
||||||
await twonlyDB.mediaFilesDao.deleteMediaFile(
|
|
||||||
mediaService.mediaFile.mediaId,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
Log.warn(
|
|
||||||
'Media files ${mediaService.mediaFile.mediaId} has no original, temp, or stored path, but messages still reference it. Marking as uploaded to stop retries.',
|
|
||||||
);
|
|
||||||
await mediaService.setUploadState(UploadState.uploaded);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -676,31 +640,7 @@ Future<void> _createUploadRequest(MediaFileService media) async {
|
||||||
await media.uploadRequestPath.writeAsBytes(uploadRequestBytes);
|
await media.uploadRequestPath.writeAsBytes(uploadRequestBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _checkAndRecoverMissingUploadRequest(
|
|
||||||
MediaFileService media, {
|
|
||||||
bool triggerBackgroundUpload = false,
|
|
||||||
}) async {
|
|
||||||
if (!media.uploadRequestPath.existsSync()) {
|
|
||||||
Log.warn(
|
|
||||||
'UploadRequestPath for media ${media.mediaFile.mediaId} does not exist. Reverting to preprocessing.',
|
|
||||||
);
|
|
||||||
await media.setUploadState(UploadState.preprocessing);
|
|
||||||
if (triggerBackgroundUpload) {
|
|
||||||
unawaited(startBackgroundMediaUpload(media));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _uploadUploadRequest(MediaFileService media) async {
|
Future<void> _uploadUploadRequest(MediaFileService media) async {
|
||||||
if (await _checkAndRecoverMissingUploadRequest(
|
|
||||||
media,
|
|
||||||
triggerBackgroundUpload: true,
|
|
||||||
)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final currentMedia = await twonlyDB.mediaFilesDao.getMediaFileById(
|
final currentMedia = await twonlyDB.mediaFilesDao.getMediaFileById(
|
||||||
media.mediaFile.mediaId,
|
media.mediaFile.mediaId,
|
||||||
);
|
);
|
||||||
|
|
@ -750,13 +690,6 @@ Future<void> uploadFileFastOrEnqueue(
|
||||||
UploadTask task,
|
UploadTask task,
|
||||||
MediaFileService media,
|
MediaFileService media,
|
||||||
) async {
|
) async {
|
||||||
if (await _checkAndRecoverMissingUploadRequest(
|
|
||||||
media,
|
|
||||||
triggerBackgroundUpload: true,
|
|
||||||
)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final requestMultipart = http.MultipartRequest(
|
final requestMultipart = http.MultipartRequest(
|
||||||
'POST',
|
'POST',
|
||||||
Uri.parse(task.url),
|
Uri.parse(task.url),
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ import 'package:twonly/src/model/protobuf/client/generated/push_notification.pb.
|
||||||
import 'package:twonly/src/services/notifications/pushkeys.notifications.dart';
|
import 'package:twonly/src/services/notifications/pushkeys.notifications.dart';
|
||||||
import 'package:twonly/src/services/signal/encryption.signal.dart';
|
import 'package:twonly/src/services/signal/encryption.signal.dart';
|
||||||
import 'package:twonly/src/services/signal/session.signal.dart';
|
import 'package:twonly/src/services/signal/session.signal.dart';
|
||||||
import 'package:twonly/src/services/user.service.dart' show UserService;
|
|
||||||
import 'package:twonly/src/services/user_discovery.service.dart';
|
import 'package:twonly/src/services/user_discovery.service.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
|
|
@ -101,18 +100,14 @@ Future<(Uint8List, Uint8List?)?> _tryToSendCompleteMessageInternal({
|
||||||
if (receiptId == null && receipt == null) return null;
|
if (receiptId == null && receipt == null) return null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final targetReceiptId = receipt?.receiptId ?? receiptId!;
|
if (receipt == null) {
|
||||||
final loadedReceipt = await twonlyDB.receiptsDao.getReceiptById(
|
// ignore: parameter_assignments
|
||||||
targetReceiptId,
|
receipt = await twonlyDB.receiptsDao.getReceiptById(receiptId!);
|
||||||
);
|
if (receipt == null) {
|
||||||
if (loadedReceipt == null) {
|
Log.warn('[$receiptId] Receipt not found.');
|
||||||
Log.info(
|
|
||||||
'[$targetReceiptId] Receipt not found (might have been processed or deleted).',
|
|
||||||
);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// ignore: parameter_assignments
|
}
|
||||||
receipt = loadedReceipt;
|
|
||||||
|
|
||||||
if (receipt.retryCount >= 2) {
|
if (receipt.retryCount >= 2) {
|
||||||
// After two retries, change the receiptId. This addresses a bug where the receiver received the message and marked it as received,
|
// After two retries, change the receiptId. This addresses a bug where the receiver received the message and marked it as received,
|
||||||
|
|
@ -142,7 +137,7 @@ Future<(Uint8List, Uint8List?)?> _tryToSendCompleteMessageInternal({
|
||||||
if (!onlyReturnEncryptedData &&
|
if (!onlyReturnEncryptedData &&
|
||||||
receipt.ackByServerAt != null &&
|
receipt.ackByServerAt != null &&
|
||||||
receipt.markForRetry == null) {
|
receipt.markForRetry == null) {
|
||||||
Log.info('Message already uploaded and mark for retry is not set.');
|
Log.error('Message already uploaded and mark for retry is not set!');
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -181,17 +176,7 @@ Future<(Uint8List, Uint8List?)?> _tryToSendCompleteMessageInternal({
|
||||||
Uint8List.fromList(message.encryptedContent),
|
Uint8List.fromList(message.encryptedContent),
|
||||||
);
|
);
|
||||||
if (cipherText == null) {
|
if (cipherText == null) {
|
||||||
Log.error(
|
Log.error('Could not encrypt the message. Aborting and trying again.');
|
||||||
'[${receipt.receiptId}] Could not encrypt the message for user ${receipt.contactId}. Aborting and trying again.',
|
|
||||||
);
|
|
||||||
if (receipt.messageId != null) {
|
|
||||||
await twonlyDB.messagesDao.handleMessageAckByServer(
|
|
||||||
receipt.contactId,
|
|
||||||
receipt.messageId!,
|
|
||||||
clock.now(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
await twonlyDB.receiptsDao.deleteReceipt(receipt.receiptId);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
message.encryptedContent = cipherText.serialize();
|
message.encryptedContent = cipherText.serialize();
|
||||||
|
|
@ -449,7 +434,7 @@ Future<(Uint8List, Uint8List?)?> sendCipherText(
|
||||||
final openReceipts = await twonlyDB.receiptsDao.getReceiptCountForContact(
|
final openReceipts = await twonlyDB.receiptsDao.getReceiptCountForContact(
|
||||||
contactId,
|
contactId,
|
||||||
);
|
);
|
||||||
if (openReceipts > 10) {
|
if (openReceipts > 6) {
|
||||||
// this prevents that these types of messages are send in case the receiver is offline
|
// this prevents that these types of messages are send in case the receiver is offline
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -458,19 +443,6 @@ Future<(Uint8List, Uint8List?)?> sendCipherText(
|
||||||
userService.currentUser.avatarCounter,
|
userService.currentUser.avatarCounter,
|
||||||
);
|
);
|
||||||
|
|
||||||
{
|
|
||||||
if (userService.currentUser.askForFriendPromotions) {
|
|
||||||
final contacts = await twonlyDB.contactsDao.getAllContacts();
|
|
||||||
final contactCount = contacts.where((c) => c.accepted).length;
|
|
||||||
if (contactCount > 5) {
|
|
||||||
await UserService.update((u) {
|
|
||||||
u.askForFriendPromotions = false;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
encryptedContent.askForFriendPromotions = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (userService.currentUser.isUserDiscoveryEnabled && messageId != null) {
|
if (userService.currentUser.isUserDiscoveryEnabled && messageId != null) {
|
||||||
final contact = await twonlyDB.contactsDao.getContactById(contactId);
|
final contact = await twonlyDB.contactsDao.getContactById(contactId);
|
||||||
if (UserDiscoveryService.isContactAllowed(contact)) {
|
if (UserDiscoveryService.isContactAllowed(contact)) {
|
||||||
|
|
@ -480,7 +452,6 @@ Future<(Uint8List, Uint8List?)?> sendCipherText(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
final response = pb.Message()
|
final response = pb.Message()
|
||||||
..type = pb.Message_Type.CIPHERTEXT
|
..type = pb.Message_Type.CIPHERTEXT
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import 'package:clock/clock.dart';
|
||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:hashlib/random.dart';
|
import 'package:hashlib/random.dart';
|
||||||
import 'package:mutex/mutex.dart';
|
import 'package:mutex/mutex.dart';
|
||||||
|
|
||||||
import 'package:twonly/globals.dart';
|
import 'package:twonly/globals.dart';
|
||||||
import 'package:twonly/locator.dart';
|
import 'package:twonly/locator.dart';
|
||||||
import 'package:twonly/src/database/daos/contacts.dao.dart';
|
import 'package:twonly/src/database/daos/contacts.dao.dart';
|
||||||
|
|
@ -32,8 +31,6 @@ import 'package:twonly/src/services/api/messages.api.dart';
|
||||||
import 'package:twonly/src/services/group.service.dart';
|
import 'package:twonly/src/services/group.service.dart';
|
||||||
import 'package:twonly/src/services/key_verification.service.dart';
|
import 'package:twonly/src/services/key_verification.service.dart';
|
||||||
import 'package:twonly/src/services/notifications/background.notifications.dart';
|
import 'package:twonly/src/services/notifications/background.notifications.dart';
|
||||||
import 'package:twonly/src/services/notifications/fcm.notifications.dart';
|
|
||||||
import 'package:twonly/src/services/passwordless_recovery.service.dart';
|
|
||||||
import 'package:twonly/src/services/signal/encryption.signal.dart';
|
import 'package:twonly/src/services/signal/encryption.signal.dart';
|
||||||
import 'package:twonly/src/services/signal/session.signal.dart';
|
import 'package:twonly/src/services/signal/session.signal.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
|
|
@ -56,13 +53,9 @@ Future<void> handleServerMessage(server.ServerToClient msg) async {
|
||||||
Log.info(
|
Log.info(
|
||||||
'Got ${msg.v0.newMessages.newMessages.length} messages from the server.',
|
'Got ${msg.v0.newMessages.newMessages.length} messages from the server.',
|
||||||
);
|
);
|
||||||
final brokenSessionsInCurrentBatch = <int>{};
|
|
||||||
for (final newMessage in msg.v0.newMessages.newMessages) {
|
for (final newMessage in msg.v0.newMessages.newMessages) {
|
||||||
try {
|
try {
|
||||||
await handleClient2ClientMessage(
|
await handleClient2ClientMessage(newMessage);
|
||||||
newMessage,
|
|
||||||
brokenSessionsInCurrentBatch: brokenSessionsInCurrentBatch,
|
|
||||||
);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.error(e);
|
Log.error(e);
|
||||||
}
|
}
|
||||||
|
|
@ -87,10 +80,7 @@ DateTime lastPushKeyRequest = clock.now().subtract(const Duration(hours: 1));
|
||||||
|
|
||||||
final Map<String, Mutex> _messageLocks = {};
|
final Map<String, Mutex> _messageLocks = {};
|
||||||
|
|
||||||
Future<void> handleClient2ClientMessage(
|
Future<void> handleClient2ClientMessage(NewMessage newMessage) async {
|
||||||
NewMessage newMessage, {
|
|
||||||
Set<int>? brokenSessionsInCurrentBatch,
|
|
||||||
}) async {
|
|
||||||
final body = Uint8List.fromList(newMessage.body);
|
final body = Uint8List.fromList(newMessage.body);
|
||||||
final message = Message.fromBuffer(body);
|
final message = Message.fromBuffer(body);
|
||||||
final receiptId = message.receiptId;
|
final receiptId = message.receiptId;
|
||||||
|
|
@ -104,11 +94,7 @@ Future<void> handleClient2ClientMessage(
|
||||||
}
|
}
|
||||||
await mutex.protect(() async {
|
await mutex.protect(() async {
|
||||||
try {
|
try {
|
||||||
await _handleClient2ClientMessage(
|
await _handleClient2ClientMessage(newMessage, message);
|
||||||
newMessage,
|
|
||||||
message,
|
|
||||||
brokenSessionsInCurrentBatch: brokenSessionsInCurrentBatch,
|
|
||||||
);
|
|
||||||
} finally {
|
} finally {
|
||||||
_messageLocks.remove(receiptId);
|
_messageLocks.remove(receiptId);
|
||||||
}
|
}
|
||||||
|
|
@ -117,27 +103,11 @@ Future<void> handleClient2ClientMessage(
|
||||||
|
|
||||||
Future<void> _handleClient2ClientMessage(
|
Future<void> _handleClient2ClientMessage(
|
||||||
NewMessage newMessage,
|
NewMessage newMessage,
|
||||||
Message message, {
|
Message message,
|
||||||
Set<int>? brokenSessionsInCurrentBatch,
|
) async {
|
||||||
}) async {
|
|
||||||
final fromUserId = newMessage.fromUserId.toInt();
|
final fromUserId = newMessage.fromUserId.toInt();
|
||||||
final receiptId = message.receiptId;
|
final receiptId = message.receiptId;
|
||||||
|
|
||||||
if (brokenSessionsInCurrentBatch?.contains(fromUserId) == true) {
|
|
||||||
// This happens when a session goes out of sync (e.g. wrong message order).
|
|
||||||
// We skip the remaining messages in the batch because each failed decryption
|
|
||||||
// attempt is extremely slow (~1.2s) and would otherwise freeze the app.
|
|
||||||
// By returning early, we skip gotReceipt() and error responses.
|
|
||||||
// The server still deletes the batch since we ACK the entire batch later.
|
|
||||||
// The sender keeps the message unacknowledged. Once they process our SESSION_OUT_OF_SYNC
|
|
||||||
// error and establish a new session, their retry logic will automatically re-encrypt
|
|
||||||
// and re-send these messages with the new keys.
|
|
||||||
Log.info(
|
|
||||||
'Skipping message from $fromUserId - session known broken in this batch',
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (await twonlyDB.receiptsDao.isDuplicated(receiptId)) {
|
if (await twonlyDB.receiptsDao.isDuplicated(receiptId)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -183,10 +153,7 @@ Future<void> _handleClient2ClientMessage(
|
||||||
Log.info(
|
Log.info(
|
||||||
'[$receiptId] Sending error message to the original sender with receiptId $newReceiptId.',
|
'[$receiptId] Sending error message to the original sender with receiptId $newReceiptId.',
|
||||||
);
|
);
|
||||||
await tryToSendCompleteMessage(
|
await tryToSendCompleteMessage(receiptId: newReceiptId, blocking: false);
|
||||||
receiptId: newReceiptId,
|
|
||||||
blocking: false,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case Message_Type.CIPHERTEXT:
|
case Message_Type.CIPHERTEXT:
|
||||||
|
|
@ -227,7 +194,6 @@ Future<void> _handleClient2ClientMessage(
|
||||||
encryptedContentRaw,
|
encryptedContentRaw,
|
||||||
message.type,
|
message.type,
|
||||||
receiptId,
|
receiptId,
|
||||||
brokenSessionsInCurrentBatch: brokenSessionsInCurrentBatch,
|
|
||||||
);
|
);
|
||||||
if (plainTextContent != null) {
|
if (plainTextContent != null) {
|
||||||
response = Message(
|
response = Message(
|
||||||
|
|
@ -240,8 +206,6 @@ Future<void> _handleClient2ClientMessage(
|
||||||
type: Message_Type.CIPHERTEXT,
|
type: Message_Type.CIPHERTEXT,
|
||||||
encryptedContent: encryptedContent.writeToBuffer(),
|
encryptedContent: encryptedContent.writeToBuffer(),
|
||||||
);
|
);
|
||||||
// Use Value.absent() for CIPHERTEXT messages so that insertReceipt generates a new UUID.
|
|
||||||
// This prevents receipt ID collisions and ensures the recipient's ACK is tracked correctly.
|
|
||||||
receiptIdDB = const Value.absent();
|
receiptIdDB = const Value.absent();
|
||||||
} else {
|
} else {
|
||||||
// Message was successful processed
|
// Message was successful processed
|
||||||
|
|
@ -250,9 +214,8 @@ Future<void> _handleClient2ClientMessage(
|
||||||
|
|
||||||
response ??= Message(type: Message_Type.SENDER_DELIVERY_RECEIPT);
|
response ??= Message(type: Message_Type.SENDER_DELIVERY_RECEIPT);
|
||||||
|
|
||||||
String? targetReceiptId;
|
|
||||||
try {
|
try {
|
||||||
final inserted = await twonlyDB.receiptsDao.insertReceipt(
|
await twonlyDB.receiptsDao.insertReceipt(
|
||||||
ReceiptsCompanion(
|
ReceiptsCompanion(
|
||||||
receiptId: receiptIdDB ?? Value(receiptId),
|
receiptId: receiptIdDB ?? Value(receiptId),
|
||||||
contactId: Value(fromUserId),
|
contactId: Value(fromUserId),
|
||||||
|
|
@ -260,18 +223,10 @@ Future<void> _handleClient2ClientMessage(
|
||||||
contactWillSendsReceipt: const Value(false),
|
contactWillSendsReceipt: const Value(false),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
// Use the inserted receipt's ID because for CIPHERTEXT messages we generate a new UUID
|
|
||||||
// (receiptIdDB is Value.absent()) to avoid ID collisions and properly track individual ACKs.
|
|
||||||
targetReceiptId = inserted?.receiptId;
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn('[$receiptId] Error inserting receipt: $e');
|
Log.warn('[$receiptId] Error inserting receipt: $e');
|
||||||
}
|
}
|
||||||
if (targetReceiptId != null) {
|
await tryToSendCompleteMessage(receiptId: receiptId, blocking: false);
|
||||||
await tryToSendCompleteMessage(
|
|
||||||
receiptId: targetReceiptId,
|
|
||||||
blocking: false,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case Message_Type.TEST_NOTIFICATION:
|
case Message_Type.TEST_NOTIFICATION:
|
||||||
break;
|
break;
|
||||||
|
|
@ -281,11 +236,7 @@ Future<void> _handleClient2ClientMessage(
|
||||||
await twonlyDB.receiptsDao.gotReceipt(receiptId);
|
await twonlyDB.receiptsDao.gotReceipt(receiptId);
|
||||||
Log.info('[$receiptId] Finished processing');
|
Log.info('[$receiptId] Finished processing');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn('[$receiptId] Error marking message as received: $e');
|
Log.error('[$receiptId] Error marking message as received: $e');
|
||||||
Log.error(
|
|
||||||
'Error marking message as received: $e',
|
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -293,15 +244,13 @@ Future<(EncryptedContent?, PlaintextContent?)> handleEncryptedMessageRaw(
|
||||||
int fromUserId,
|
int fromUserId,
|
||||||
Uint8List encryptedContentRaw,
|
Uint8List encryptedContentRaw,
|
||||||
Message_Type messageType,
|
Message_Type messageType,
|
||||||
String receiptId, {
|
String receiptId,
|
||||||
Set<int>? brokenSessionsInCurrentBatch,
|
) async {
|
||||||
}) async {
|
|
||||||
Log.info('[$receiptId] calling signalDecryptMessage');
|
Log.info('[$receiptId] calling signalDecryptMessage');
|
||||||
var (encryptedContent, decryptionErrorType) = await signalDecryptMessage(
|
var (encryptedContent, decryptionErrorType) = await signalDecryptMessage(
|
||||||
fromUserId,
|
fromUserId,
|
||||||
encryptedContentRaw,
|
encryptedContentRaw,
|
||||||
messageType.value,
|
messageType.value,
|
||||||
brokenSessionsInCurrentBatch: brokenSessionsInCurrentBatch,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
if (encryptedContent == null) {
|
if (encryptedContent == null) {
|
||||||
|
|
@ -318,7 +267,7 @@ Future<(EncryptedContent?, PlaintextContent?)> handleEncryptedMessageRaw(
|
||||||
|
|
||||||
Log.info('[$receiptId] Calling handleEncryptedMessage');
|
Log.info('[$receiptId] Calling handleEncryptedMessage');
|
||||||
|
|
||||||
final result = await handleEncryptedMessage(
|
final (a, b) = await handleEncryptedMessage(
|
||||||
fromUserId,
|
fromUserId,
|
||||||
encryptedContent,
|
encryptedContent,
|
||||||
messageType,
|
messageType,
|
||||||
|
|
@ -327,21 +276,15 @@ Future<(EncryptedContent?, PlaintextContent?)> handleEncryptedMessageRaw(
|
||||||
|
|
||||||
Log.info('[$receiptId] Finished handleEncryptedMessage');
|
Log.info('[$receiptId] Finished handleEncryptedMessage');
|
||||||
|
|
||||||
if (result.responseCipherText == null && result.responsePlaintext == null) {
|
if (Platform.isAndroid && a == null && b == null) {
|
||||||
unawaited(FcmNotificationService.updateLastServerMessageTimestamp());
|
// Message was handled without any error -> Show push notification to the user.
|
||||||
if (Platform.isAndroid && result.showPushNotification) {
|
await showPushNotificationFromServerMessages(fromUserId, encryptedContent);
|
||||||
// Message was handled without any error. Show push notification to the user for Android.
|
|
||||||
await showPushNotificationFromServerMessages(
|
|
||||||
fromUserId,
|
|
||||||
encryptedContent,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (result.responseCipherText, result.responsePlaintext);
|
return (a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<DecryptedMessageResult> handleEncryptedMessage(
|
Future<(EncryptedContent?, PlaintextContent?)> handleEncryptedMessage(
|
||||||
int fromUserId,
|
int fromUserId,
|
||||||
EncryptedContent content,
|
EncryptedContent content,
|
||||||
Message_Type messageType,
|
Message_Type messageType,
|
||||||
|
|
@ -366,28 +309,19 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasAskForFriendPromotions() && content.askForFriendPromotions) {
|
|
||||||
final contact = await twonlyDB.contactsDao.getContactById(fromUserId);
|
|
||||||
if (contact != null && contact.askForFriendPromotions == null) {
|
|
||||||
await twonlyDB.contactsDao.updateContact(
|
|
||||||
fromUserId,
|
|
||||||
const ContactsCompanion(askForFriendPromotions: Value(true)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (content.hasContactRequest()) {
|
if (content.hasContactRequest()) {
|
||||||
if (!await handleContactRequest(
|
if (!await handleContactRequest(
|
||||||
fromUserId,
|
fromUserId,
|
||||||
content.contactRequest,
|
content.contactRequest,
|
||||||
receiptId,
|
receiptId,
|
||||||
)) {
|
)) {
|
||||||
return DecryptedMessageResult(
|
return (
|
||||||
responsePlaintext: PlaintextContent()
|
null,
|
||||||
|
PlaintextContent()
|
||||||
..retryControlError = PlaintextContent_RetryErrorMessage(),
|
..retryControlError = PlaintextContent_RetryErrorMessage(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasErrorMessages()) {
|
if (content.hasErrorMessages()) {
|
||||||
|
|
@ -395,27 +329,8 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
fromUserId,
|
fromUserId,
|
||||||
content.errorMessages,
|
content.errorMessages,
|
||||||
receiptId,
|
receiptId,
|
||||||
groupId: content.hasGroupId() ? content.groupId : null,
|
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult(showPushNotification: false);
|
return (null, null);
|
||||||
}
|
|
||||||
|
|
||||||
if (content.hasPasswordlessRecovery()) {
|
|
||||||
await PasswordlessRecoveryService.handlePasswordlessRecovery(
|
|
||||||
fromUserId,
|
|
||||||
content.passwordlessRecovery,
|
|
||||||
receiptId,
|
|
||||||
);
|
|
||||||
return const DecryptedMessageResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (content.hasPasswordlessRecoveryHeartbeat()) {
|
|
||||||
await PasswordlessRecoveryService.handlePasswordlessRecoveryHeartbeat(
|
|
||||||
fromUserId,
|
|
||||||
content.passwordlessRecoveryHeartbeat,
|
|
||||||
receiptId,
|
|
||||||
);
|
|
||||||
return const DecryptedMessageResult();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasContactUpdate()) {
|
if (content.hasContactUpdate()) {
|
||||||
|
|
@ -425,7 +340,7 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
senderProfileCounter,
|
senderProfileCounter,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult(showPushNotification: false);
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasUserDiscoveryRequest()) {
|
if (content.hasUserDiscoveryRequest()) {
|
||||||
|
|
@ -434,7 +349,7 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.userDiscoveryRequest,
|
content.userDiscoveryRequest,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult(showPushNotification: false);
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasUserDiscoveryUpdate()) {
|
if (content.hasUserDiscoveryUpdate()) {
|
||||||
|
|
@ -443,12 +358,12 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.userDiscoveryUpdate,
|
content.userDiscoveryUpdate,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasPushKeys()) {
|
if (content.hasPushKeys()) {
|
||||||
await handlePushKey(fromUserId, content.pushKeys, receiptId);
|
await handlePushKey(fromUserId, content.pushKeys, receiptId);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasMessageUpdate()) {
|
if (content.hasMessageUpdate()) {
|
||||||
|
|
@ -457,7 +372,7 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.messageUpdate,
|
content.messageUpdate,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasKeyVerificationProof()) {
|
if (content.hasKeyVerificationProof()) {
|
||||||
|
|
@ -465,7 +380,7 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
fromUserId,
|
fromUserId,
|
||||||
content.keyVerificationProof.calculatedMac,
|
content.keyVerificationProof.calculatedMac,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasMediaUpdate()) {
|
if (content.hasMediaUpdate()) {
|
||||||
|
|
@ -474,19 +389,12 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.mediaUpdate,
|
content.mediaUpdate,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!content.hasGroupId()) {
|
if (!content.hasGroupId()) {
|
||||||
final type = _getEncryptedContentType(content);
|
Log.error('[$receiptId] Messages should have a groupId $fromUserId.');
|
||||||
Log.warn(
|
return (null, null);
|
||||||
'[$receiptId] Messages should have a groupId $fromUserId. Type: $type',
|
|
||||||
);
|
|
||||||
Log.error(
|
|
||||||
'Messages should have a groupId. Type: $type',
|
|
||||||
onlyIfSentryEnabled: true,
|
|
||||||
);
|
|
||||||
return const DecryptedMessageResult();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasGroupCreate()) {
|
if (content.hasGroupCreate()) {
|
||||||
|
|
@ -496,12 +404,11 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.groupCreate,
|
content.groupCreate,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Verify that the user is (still) in that group...
|
/// Verify that the user is (still) in that group...
|
||||||
if (!await twonlyDB.groupsDao.isContactInGroup(fromUserId, content.groupId)) {
|
if (!await twonlyDB.groupsDao.isContactInGroup(fromUserId, content.groupId)) {
|
||||||
// Check if this is a direct chat...
|
|
||||||
if (getUUIDforDirectChat(userService.currentUser.userId, fromUserId) ==
|
if (getUUIDforDirectChat(userService.currentUser.userId, fromUserId) ==
|
||||||
content.groupId) {
|
content.groupId) {
|
||||||
final contact = await twonlyDB.contactsDao
|
final contact = await twonlyDB.contactsDao
|
||||||
|
|
@ -512,17 +419,18 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
);
|
);
|
||||||
if (contact == null || !contact.accepted || contact.deletedByUser) {
|
if (contact == null || !contact.accepted || contact.deletedByUser) {
|
||||||
await handleNewContactRequest(fromUserId);
|
await handleNewContactRequest(fromUserId);
|
||||||
Log.warn(
|
Log.error(
|
||||||
'[$receiptId] User tries to send message to direct chat while the user does not exist!',
|
'[$receiptId] User tries to send message to direct chat while the user does not exist!',
|
||||||
);
|
);
|
||||||
return DecryptedMessageResult(
|
return (
|
||||||
responseCipherText: EncryptedContent(
|
EncryptedContent(
|
||||||
errorMessages: EncryptedContent_ErrorMessages(
|
errorMessages: EncryptedContent_ErrorMessages(
|
||||||
type: EncryptedContent_ErrorMessages_Type
|
type: EncryptedContent_ErrorMessages_Type
|
||||||
.ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD,
|
.ERROR_PROCESSING_MESSAGE_CREATED_ACCOUNT_REQUEST_INSTEAD,
|
||||||
relatedReceiptId: receiptId,
|
relatedReceiptId: receiptId,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
null,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Log.info(
|
Log.info(
|
||||||
|
|
@ -536,35 +444,27 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if (content.hasGroupJoin()) {
|
if (content.hasGroupJoin()) {
|
||||||
Log.warn(
|
Log.error(
|
||||||
'[$receiptId] Got group join message, but group does not exist yet, retry later. As probably the GroupCreate was not yet received.',
|
'[$receiptId] Got group join message, but group does not exist yet, retry later. As probably the GroupCreate was not yet received.',
|
||||||
);
|
);
|
||||||
// In case the group join was received before the GroupCreate the sender should send it later again.
|
// In case the group join was received before the GroupCreate the sender should send it later again.
|
||||||
return DecryptedMessageResult(
|
return (
|
||||||
responsePlaintext: PlaintextContent()
|
null,
|
||||||
|
PlaintextContent()
|
||||||
..retryControlError = PlaintextContent_RetryErrorMessage(),
|
..retryControlError = PlaintextContent_RetryErrorMessage(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.warn(
|
Log.error(
|
||||||
'[$receiptId] User $fromUserId tried to access group ${content.groupId}. Sending GROUP_NOT_FOUND_OR_NOT_A_MEMBER error.',
|
'[$receiptId] User $fromUserId tried to access group ${content.groupId}.',
|
||||||
);
|
|
||||||
return DecryptedMessageResult(
|
|
||||||
responseCipherText: EncryptedContent(
|
|
||||||
groupId: content.groupId,
|
|
||||||
errorMessages: EncryptedContent_ErrorMessages(
|
|
||||||
type: EncryptedContent_ErrorMessages_Type
|
|
||||||
.GROUP_NOT_FOUND_OR_NOT_A_MEMBER,
|
|
||||||
relatedReceiptId: receiptId,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
return (null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasFlameSync()) {
|
if (content.hasFlameSync()) {
|
||||||
await handleFlameSync(content.groupId, content.flameSync, receiptId);
|
await handleFlameSync(content.groupId, content.flameSync, receiptId);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasGroupUpdate()) {
|
if (content.hasGroupUpdate()) {
|
||||||
|
|
@ -574,7 +474,7 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.groupUpdate,
|
content.groupUpdate,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasGroupJoin()) {
|
if (content.hasGroupJoin()) {
|
||||||
|
|
@ -584,12 +484,13 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.groupJoin,
|
content.groupJoin,
|
||||||
receiptId,
|
receiptId,
|
||||||
)) {
|
)) {
|
||||||
return DecryptedMessageResult(
|
return (
|
||||||
responsePlaintext: PlaintextContent()
|
null,
|
||||||
|
PlaintextContent()
|
||||||
..retryControlError = PlaintextContent_RetryErrorMessage(),
|
..retryControlError = PlaintextContent_RetryErrorMessage(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasResendGroupPublicKey()) {
|
if (content.hasResendGroupPublicKey()) {
|
||||||
|
|
@ -599,7 +500,7 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.groupJoin,
|
content.groupJoin,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasAdditionalDataMessage()) {
|
if (content.hasAdditionalDataMessage()) {
|
||||||
|
|
@ -609,17 +510,17 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.additionalDataMessage,
|
content.additionalDataMessage,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasTextMessage()) {
|
if (content.hasTextMessage()) {
|
||||||
final isNewText = await handleTextMessage(
|
await handleTextMessage(
|
||||||
fromUserId,
|
fromUserId,
|
||||||
content.groupId,
|
content.groupId,
|
||||||
content.textMessage,
|
content.textMessage,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return DecryptedMessageResult(showPushNotification: isNewText);
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasReaction()) {
|
if (content.hasReaction()) {
|
||||||
|
|
@ -629,17 +530,17 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
content.reaction,
|
content.reaction,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasMedia()) {
|
if (content.hasMedia()) {
|
||||||
final isNewMedia = await handleMedia(
|
await handleMedia(
|
||||||
fromUserId,
|
fromUserId,
|
||||||
content.groupId,
|
content.groupId,
|
||||||
content.media,
|
content.media,
|
||||||
receiptId,
|
receiptId,
|
||||||
);
|
);
|
||||||
return DecryptedMessageResult(showPushNotification: isNewMedia);
|
return (null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content.hasTypingIndicator()) {
|
if (content.hasTypingIndicator()) {
|
||||||
|
|
@ -651,39 +552,5 @@ Future<DecryptedMessageResult> handleEncryptedMessage(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return const DecryptedMessageResult();
|
return (null, null);
|
||||||
}
|
|
||||||
|
|
||||||
String _getEncryptedContentType(EncryptedContent content) {
|
|
||||||
if (content.hasMessageUpdate()) return 'messageUpdate';
|
|
||||||
if (content.hasMedia()) return 'media';
|
|
||||||
if (content.hasMediaUpdate()) return 'mediaUpdate';
|
|
||||||
if (content.hasContactUpdate()) return 'contactUpdate';
|
|
||||||
if (content.hasContactRequest()) return 'contactRequest';
|
|
||||||
if (content.hasFlameSync()) return 'flameSync';
|
|
||||||
if (content.hasPushKeys()) return 'pushKeys';
|
|
||||||
if (content.hasReaction()) return 'reaction';
|
|
||||||
if (content.hasTextMessage()) return 'textMessage';
|
|
||||||
if (content.hasGroupCreate()) return 'groupCreate';
|
|
||||||
if (content.hasGroupJoin()) return 'groupJoin';
|
|
||||||
if (content.hasGroupUpdate()) return 'groupUpdate';
|
|
||||||
if (content.hasResendGroupPublicKey()) return 'resendGroupPublicKey';
|
|
||||||
if (content.hasErrorMessages()) return 'errorMessages';
|
|
||||||
if (content.hasAdditionalDataMessage()) return 'additionalDataMessage';
|
|
||||||
if (content.hasTypingIndicator()) return 'typingIndicator';
|
|
||||||
if (content.hasUserDiscoveryRequest()) return 'userDiscoveryRequest';
|
|
||||||
if (content.hasUserDiscoveryUpdate()) return 'userDiscoveryUpdate';
|
|
||||||
if (content.hasKeyVerificationProof()) return 'keyVerificationProof';
|
|
||||||
return 'unknown';
|
|
||||||
}
|
|
||||||
|
|
||||||
class DecryptedMessageResult {
|
|
||||||
const DecryptedMessageResult({
|
|
||||||
this.responseCipherText,
|
|
||||||
this.responsePlaintext,
|
|
||||||
this.showPushNotification = true,
|
|
||||||
});
|
|
||||||
final EncryptedContent? responseCipherText;
|
|
||||||
final PlaintextContent? responsePlaintext;
|
|
||||||
final bool showPushNotification;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -105,9 +105,8 @@ class BackupService {
|
||||||
))) {
|
))) {
|
||||||
final backupId = await RustBackupIdentity.getBackupId();
|
final backupId = await RustBackupIdentity.getBackupId();
|
||||||
if (backupId == null) {
|
if (backupId == null) {
|
||||||
Log.warn('No backup password was set by the user.');
|
Log.error('No backup password was set by the user.');
|
||||||
backup.identityState = LastBackupUploadState.failed;
|
backup.identityState = LastBackupUploadState.failed;
|
||||||
await UserService.update((u) => u.isBackupEnabled = false);
|
|
||||||
} else {
|
} else {
|
||||||
Log.info('Performing a identity backup.');
|
Log.info('Performing a identity backup.');
|
||||||
final encryptedBackup =
|
final encryptedBackup =
|
||||||
|
|
@ -163,7 +162,7 @@ class BackupService {
|
||||||
(backupDownloadToken, backupArchive) =
|
(backupDownloadToken, backupArchive) =
|
||||||
await RustBackupArchive.createBackupArchive();
|
await RustBackupArchive.createBackupArchive();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn('Creating archive backup failed: $e');
|
Log.error(e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log.info(
|
Log.info(
|
||||||
|
|
@ -325,26 +324,6 @@ class BackupService {
|
||||||
return _nextBackupStage();
|
return _nextBackupStage();
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<RecoveryError?> startPasswordlessBackupRecovery(
|
|
||||||
int userId,
|
|
||||||
String username,
|
|
||||||
Uint8List keyManagerBytes,
|
|
||||||
) async {
|
|
||||||
final state = BackupRecovery(
|
|
||||||
username: username,
|
|
||||||
password: '',
|
|
||||||
userId: userId,
|
|
||||||
)..state = BackupRecoveryState.archiveBackupStarted;
|
|
||||||
|
|
||||||
await deleteLocalUserData();
|
|
||||||
|
|
||||||
// Import KeyManager keys into secure storage & in-memory key manager
|
|
||||||
await RustKeyManager.importSerialized(serializedBytes: keyManagerBytes);
|
|
||||||
|
|
||||||
await KeyValueStore.put(KeyValueKeys.backupRecoveryState, state.toJson());
|
|
||||||
return _nextBackupStage();
|
|
||||||
}
|
|
||||||
|
|
||||||
static Future<(Uint8List?, RecoveryError?)> _downloadBackup(
|
static Future<(Uint8List?, RecoveryError?)> _downloadBackup(
|
||||||
String backupServerUrl,
|
String backupServerUrl,
|
||||||
) async {
|
) async {
|
||||||
|
|
@ -358,7 +337,7 @@ class BackupService {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn('Error fetching backup: $e');
|
Log.error('Error fetching backup: $e');
|
||||||
return (null, RecoveryError.noInternet);
|
return (null, RecoveryError.noInternet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -139,7 +139,6 @@ Future<bool> createNewGroup(String groupName, List<Contact> members) async {
|
||||||
groupCreate: EncryptedContent_GroupCreate(
|
groupCreate: EncryptedContent_GroupCreate(
|
||||||
stateKey: stateEncryptionKey,
|
stateKey: stateEncryptionKey,
|
||||||
groupPublicKey: myGroupKey.getPublicKey().serialize(),
|
groupPublicKey: myGroupKey.getPublicKey().serialize(),
|
||||||
groupName: group.groupName,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -771,7 +770,6 @@ Future<bool> addNewGroupMembers(
|
||||||
groupCreate: EncryptedContent_GroupCreate(
|
groupCreate: EncryptedContent_GroupCreate(
|
||||||
stateKey: group.stateEncryptionKey,
|
stateKey: group.stateEncryptionKey,
|
||||||
groupPublicKey: keyPair.getPublicKey().serialize(),
|
groupPublicKey: keyPair.getPublicKey().serialize(),
|
||||||
groupName: group.groupName,
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_sharing_intent/flutter_sharing_intent.dart';
|
import 'package:flutter_sharing_intent/flutter_sharing_intent.dart';
|
||||||
import 'package:flutter_sharing_intent/model/sharing_file.dart';
|
import 'package:flutter_sharing_intent/model/sharing_file.dart';
|
||||||
|
|
@ -13,8 +13,6 @@ import 'package:twonly/src/constants/routes.keys.dart';
|
||||||
import 'package:twonly/src/database/tables/contacts.table.dart';
|
import 'package:twonly/src/database/tables/contacts.table.dart';
|
||||||
import 'package:twonly/src/database/tables/mediafiles.table.dart';
|
import 'package:twonly/src/database/tables/mediafiles.table.dart';
|
||||||
import 'package:twonly/src/services/api/mediafiles/upload.api.dart';
|
import 'package:twonly/src/services/api/mediafiles/upload.api.dart';
|
||||||
import 'package:twonly/src/services/passwordless_recovery.service.dart'
|
|
||||||
show PasswordlessRecoveryService;
|
|
||||||
import 'package:twonly/src/services/signal/session.signal.dart';
|
import 'package:twonly/src/services/signal/session.signal.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
|
|
@ -32,12 +30,6 @@ Future<bool> handleIntentUrl(BuildContext context, Uri uri) async {
|
||||||
// Check if this is the QR code link which was
|
// Check if this is the QR code link which was
|
||||||
// therefore scanned with the system camera
|
// therefore scanned with the system camera
|
||||||
|
|
||||||
if (kDebugMode &&
|
|
||||||
uri.toString().startsWith(PasswordlessRecoveryService.linkPrefix)) {
|
|
||||||
await PasswordlessRecoveryService.handleRecoveryLink(uri.toString());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uri.toString().startsWith(QrCodeUtils.linkPrefix)) {
|
if (uri.toString().startsWith(QrCodeUtils.linkPrefix)) {
|
||||||
final result = await QrCodeUtils.handleQrCodeLink(uri.toString());
|
final result = await QrCodeUtils.handleQrCodeLink(uri.toString());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
import 'dart:async';
|
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
|
|
@ -14,7 +13,7 @@ import 'package:twonly/src/services/signal/identity.signal.dart';
|
||||||
import 'package:twonly/src/services/signal/session.signal.dart';
|
import 'package:twonly/src/services/signal/session.signal.dart';
|
||||||
import 'package:twonly/src/utils/log.dart';
|
import 'package:twonly/src/utils/log.dart';
|
||||||
import 'package:twonly/src/utils/misc.dart';
|
import 'package:twonly/src/utils/misc.dart';
|
||||||
import 'package:twonly/src/visual/components/verification_success_dialog.comp.dart';
|
import 'package:twonly/src/visual/components/snackbar.dart';
|
||||||
|
|
||||||
class KeyVerificationService {
|
class KeyVerificationService {
|
||||||
static Future<List<int>> getNewSecretVerificationToken() async {
|
static Future<List<int>> getNewSecretVerificationToken() async {
|
||||||
|
|
@ -78,14 +77,12 @@ class KeyVerificationService {
|
||||||
final contact = await twonlyDB.contactsDao.getContactById(fromUserId);
|
final contact = await twonlyDB.contactsDao.getContactById(fromUserId);
|
||||||
final context = rootNavigatorKey.currentContext;
|
final context = rootNavigatorKey.currentContext;
|
||||||
if (context != null && context.mounted && contact != null) {
|
if (context != null && context.mounted && contact != null) {
|
||||||
unawaited(
|
showSnackbar(
|
||||||
VerificationSuccessDialog.show(
|
|
||||||
context,
|
context,
|
||||||
contact,
|
context.lang.secretQrTokenVerifiedSnackbar(
|
||||||
message: context.lang.secretQrTokenVerifiedSnackbar(
|
|
||||||
getContactDisplayName(contact),
|
getContactDisplayName(contact),
|
||||||
),
|
),
|
||||||
),
|
level: SnackbarLevel.success,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
@ -94,29 +91,6 @@ class KeyVerificationService {
|
||||||
|
|
||||||
Log.error('No valid secret token could be found...');
|
Log.error('No valid secret token could be found...');
|
||||||
}
|
}
|
||||||
|
|
||||||
static Future<void> verifySharedContact({
|
|
||||||
required int contactId,
|
|
||||||
required List<int> sharedPublicIdentityKey,
|
|
||||||
required int senderId,
|
|
||||||
}) async {
|
|
||||||
final publicIdentityKey = await getPublicKeyFromContact(contactId);
|
|
||||||
if (publicIdentityKey == null) {
|
|
||||||
Log.info('No public key stored for contact $contactId');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (publicIdentityKey.equals(sharedPublicIdentityKey)) {
|
|
||||||
Log.info('Verified a user which was shared by a contact');
|
|
||||||
await twonlyDB.keyVerificationDao.addKeyVerification(
|
|
||||||
contactId,
|
|
||||||
VerificationType.contactSharedByVerified,
|
|
||||||
verifiedBy: senderId,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
Log.error('Public identity keys do not match for contact $contactId');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<int>> _createVerificationBytes(
|
Future<List<int>> _createVerificationBytes(
|
||||||
|
|
|
||||||
|
|
@ -33,18 +33,17 @@ Future<void> compressImage(
|
||||||
|
|
||||||
Log.info('Compressed images size in bytes: ${compressedBytes.length}');
|
Log.info('Compressed images size in bytes: ${compressedBytes.length}');
|
||||||
|
|
||||||
if (compressedBytes.length >= 2 * 1000 * 1000) {
|
if (compressedBytes.length >= 1 * 1000 * 1000) {
|
||||||
// if the media file is over 1MB compress it with 60%
|
// if the media file is over 1MB compress it with 60%
|
||||||
final tmpCompressedBytes = await FlutterImageCompress.compressWithFile(
|
final tmpCompressedBytes = await FlutterImageCompress.compressWithFile(
|
||||||
sourceFile.path,
|
sourceFile.path,
|
||||||
format: CompressFormat.webp,
|
format: CompressFormat.webp,
|
||||||
quality: 60,
|
quality: 60,
|
||||||
);
|
);
|
||||||
if (tmpCompressedBytes == null) {
|
if (tmpCompressedBytes != null) {
|
||||||
Log.error(
|
Log.error(
|
||||||
'Could not compress media file with 60%: $sourceFile. Sending original 90% compressed file.',
|
'Could not compress media file with 60%: $sourceFile. Sending original 90% compressed file.',
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
compressedBytes = tmpCompressedBytes;
|
compressedBytes = tmpCompressedBytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -107,11 +106,11 @@ Future<void> compressAndOverlayVideo(MediaFileService media) async {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn('during video compression: $e');
|
Log.error('during video compression: $e');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (compressedPath == null) {
|
if (compressedPath == null) {
|
||||||
Log.warn('Could not compress video using original video.');
|
Log.error('Could not compress video using original video.');
|
||||||
// as a fall back use the non compressed version
|
// as a fall back use the non compressed version
|
||||||
media.ffmpegOutputPath.copySync(media.tempPath.path);
|
media.ffmpegOutputPath.copySync(media.tempPath.path);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -213,12 +213,7 @@ class MediaFileService {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> createThumbnail() async {
|
Future<void> createThumbnail() async {
|
||||||
if (!storedPath.existsSync() || storedPath.lengthSync() == 0) {
|
if (!storedPath.existsSync()) {
|
||||||
if (storedPath.existsSync() && storedPath.lengthSync() == 0) {
|
|
||||||
try {
|
|
||||||
storedPath.deleteSync();
|
|
||||||
} catch (_) {}
|
|
||||||
}
|
|
||||||
if (mediaFile.stored &&
|
if (mediaFile.stored &&
|
||||||
mediaFile.createdAt.isBefore(
|
mediaFile.createdAt.isBefore(
|
||||||
clock.now().subtract(const Duration(days: 30)),
|
clock.now().subtract(const Duration(days: 30)),
|
||||||
|
|
@ -252,7 +247,7 @@ class MediaFileService {
|
||||||
|
|
||||||
Future<void> compressMedia() async {
|
Future<void> compressMedia() async {
|
||||||
if (!originalPath.existsSync()) {
|
if (!originalPath.existsSync()) {
|
||||||
Log.warn('Could not compress as original media does not exists.');
|
Log.error('Could not compress as original media does not exists.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -293,11 +288,8 @@ class MediaFileService {
|
||||||
|
|
||||||
bool get imagePreviewAvailable =>
|
bool get imagePreviewAvailable =>
|
||||||
mediaFile.hasThumbnail ||
|
mediaFile.hasThumbnail ||
|
||||||
(thumbnailPath.existsSync() && thumbnailPath.lengthSync() > 0) ||
|
thumbnailPath.existsSync() ||
|
||||||
mediaFile.type == MediaType.audio ||
|
storedPath.existsSync();
|
||||||
((mediaFile.type == MediaType.image || mediaFile.type == MediaType.gif) &&
|
|
||||||
storedPath.existsSync() &&
|
|
||||||
storedPath.lengthSync() > 0);
|
|
||||||
|
|
||||||
Future<void> storeMediaFile() async {
|
Future<void> storeMediaFile() async {
|
||||||
Log.info('Storing media file ${mediaFile.mediaId}');
|
Log.info('Storing media file ${mediaFile.mediaId}');
|
||||||
|
|
@ -315,21 +307,17 @@ class MediaFileService {
|
||||||
await tempPath.copy(storedPath.path);
|
await tempPath.copy(storedPath.path);
|
||||||
if (userService.currentUser.storeMediaFilesInGallery) {
|
if (userService.currentUser.storeMediaFilesInGallery) {
|
||||||
if (mediaFile.type == MediaType.video) {
|
if (mediaFile.type == MediaType.video) {
|
||||||
await saveVideoToGallery(
|
await saveVideoToGallery(storedPath.path);
|
||||||
storedPath.path,
|
|
||||||
name: mediaFile.mediaId,
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
await saveImageToGallery(
|
await saveImageToGallery(
|
||||||
storedPath.readAsBytesSync(),
|
storedPath.readAsBytesSync(),
|
||||||
createdAt: mediaFile.createdAt,
|
createdAt: mediaFile.createdAt,
|
||||||
name: mediaFile.mediaId,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log.warn(
|
Log.error(
|
||||||
'Could not store image locally as ${tempPath.path} does not exist.',
|
'Could not store image neither as ${tempPath.path} does not exists.',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
unawaited(createThumbnail());
|
unawaited(createThumbnail());
|
||||||
|
|
@ -451,7 +439,7 @@ class MediaFileService {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!storedPath.existsSync() || storedPath.lengthSync() == 0) {
|
if (!storedPath.existsSync()) {
|
||||||
await twonlyDB.mediaFilesDao.updateMedia(
|
await twonlyDB.mediaFilesDao.updateMedia(
|
||||||
mediaFile.mediaId,
|
mediaFile.mediaId,
|
||||||
const MediaFilesCompanion(hasCropAnalyzed: Value(true)),
|
const MediaFilesCompanion(hasCropAnalyzed: Value(true)),
|
||||||
|
|
@ -460,7 +448,7 @@ class MediaFileService {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final bytes = await storedPath.readAsBytes();
|
final bytes = storedPath.readAsBytesSync();
|
||||||
final result = await compute(_processImageCrop, bytes);
|
final result = await compute(_processImageCrop, bytes);
|
||||||
|
|
||||||
if (result.isCropped && result.pngBytes != null) {
|
if (result.isCropped && result.pngBytes != null) {
|
||||||
|
|
@ -472,18 +460,18 @@ class MediaFileService {
|
||||||
);
|
);
|
||||||
|
|
||||||
if (webpBytes.isNotEmpty) {
|
if (webpBytes.isNotEmpty) {
|
||||||
await storedPath.writeAsBytes(webpBytes);
|
storedPath.writeAsBytesSync(webpBytes);
|
||||||
} else {
|
} else {
|
||||||
Log.warn('WebP compression returned empty, falling back to PNG');
|
Log.warn('WebP compression returned empty, falling back to PNG');
|
||||||
await storedPath.writeAsBytes(result.pngBytes!);
|
storedPath.writeAsBytesSync(result.pngBytes!);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.error('Error compressing to WebP, falling back to PNG: $e');
|
Log.error('Error compressing to WebP, falling back to PNG: $e');
|
||||||
await storedPath.writeAsBytes(result.pngBytes!);
|
storedPath.writeAsBytesSync(result.pngBytes!);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thumbnailPath.existsSync()) {
|
if (thumbnailPath.existsSync()) {
|
||||||
await thumbnailPath.delete();
|
thumbnailPath.deleteSync();
|
||||||
}
|
}
|
||||||
await createThumbnail();
|
await createThumbnail();
|
||||||
final checksum = await sha256File(storedPath);
|
final checksum = await sha256File(storedPath);
|
||||||
|
|
@ -504,7 +492,7 @@ class MediaFileService {
|
||||||
);
|
);
|
||||||
await updateFromDB();
|
await updateFromDB();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.warn(
|
Log.error(
|
||||||
'Error auto-cropping transparent borders for mediaId ${mediaFile.mediaId}: $e',
|
'Error auto-cropping transparent borders for mediaId ${mediaFile.mediaId}: $e',
|
||||||
);
|
);
|
||||||
await twonlyDB.mediaFilesDao.updateMedia(
|
await twonlyDB.mediaFilesDao.updateMedia(
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
||||||
import 'package:image/image.dart' as img;
|
import 'package:image/image.dart' as img;
|
||||||
import 'package:pro_video_editor/pro_video_editor.dart';
|
import 'package:pro_video_editor/pro_video_editor.dart';
|
||||||
|
|
@ -12,27 +11,10 @@ Future<bool> createThumbnailsForVideo(
|
||||||
) async {
|
) async {
|
||||||
final stopwatch = Stopwatch()..start();
|
final stopwatch = Stopwatch()..start();
|
||||||
|
|
||||||
if (!sourceFile.existsSync() || sourceFile.lengthSync() == 0) {
|
|
||||||
Log.warn('Source video file does not exist or is empty.');
|
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
if (destinationFile.existsSync()) {
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
if (destinationFile.lengthSync() > 0) {
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
} catch (_) {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
final images = await ProVideoEditor.instance.getThumbnails(
|
final images = await ProVideoEditor.instance.getThumbnails(
|
||||||
ThumbnailConfigs(
|
ThumbnailConfigs(
|
||||||
video: EditorVideo.file(sourceFile),
|
video: EditorVideo.file(sourceFile),
|
||||||
|
|
@ -44,29 +26,19 @@ Future<bool> createThumbnailsForVideo(
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (images.isNotEmpty && images.first.isNotEmpty) {
|
if (images.isNotEmpty) {
|
||||||
stopwatch.stop();
|
stopwatch.stop();
|
||||||
await destinationFile.writeAsBytes(images.first);
|
destinationFile.writeAsBytesSync(images.first);
|
||||||
if (destinationFile.existsSync() && destinationFile.lengthSync() > 0) {
|
|
||||||
Log.info(
|
Log.info(
|
||||||
'It took ${stopwatch.elapsedMilliseconds}ms to create the video thumbnail.',
|
'It took ${stopwatch.elapsedMilliseconds}ms to create the video thumbnail.',
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
} else {
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
Log.error('Error creating video thumbnail: $e');
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.warn(
|
Log.warn(
|
||||||
'Thumbnail creation failed for the video.',
|
'Thumbnail creation failed for the video.',
|
||||||
);
|
);
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> createThumbnailsForImage(
|
Future<bool> createThumbnailsForImage(
|
||||||
|
|
@ -75,26 +47,6 @@ Future<bool> createThumbnailsForImage(
|
||||||
) async {
|
) async {
|
||||||
final stopwatch = Stopwatch()..start();
|
final stopwatch = Stopwatch()..start();
|
||||||
|
|
||||||
if (!sourceFile.existsSync() || sourceFile.lengthSync() == 0) {
|
|
||||||
Log.warn('Source image file does not exist or is empty.');
|
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
if (destinationFile.lengthSync() > 0) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
} catch (_) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await FlutterImageCompress.compressAndGetFile(
|
await FlutterImageCompress.compressAndGetFile(
|
||||||
sourceFile.absolute.path,
|
sourceFile.absolute.path,
|
||||||
|
|
@ -105,28 +57,12 @@ Future<bool> createThumbnailsForImage(
|
||||||
format: CompressFormat.webp,
|
format: CompressFormat.webp,
|
||||||
);
|
);
|
||||||
stopwatch.stop();
|
stopwatch.stop();
|
||||||
|
|
||||||
if (destinationFile.existsSync() && destinationFile.lengthSync() > 0) {
|
|
||||||
Log.info(
|
Log.info(
|
||||||
'It took ${stopwatch.elapsedMilliseconds}ms to create the image thumbnail.',
|
'It took ${stopwatch.elapsedMilliseconds}ms to create the image thumbnail.',
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
Log.warn('Compressed image thumbnail is empty or missing.');
|
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Log.error('Error creating image thumbnail: $e');
|
Log.error('Error creating image thumbnail: $e');
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -137,81 +73,40 @@ Future<bool> createThumbnailsForGif(
|
||||||
) async {
|
) async {
|
||||||
final stopwatch = Stopwatch()..start();
|
final stopwatch = Stopwatch()..start();
|
||||||
|
|
||||||
if (!sourceFile.existsSync() || sourceFile.lengthSync() == 0) {
|
|
||||||
Log.warn('Source GIF file does not exist or is empty.');
|
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
if (destinationFile.existsSync()) {
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
if (destinationFile.lengthSync() > 0) {
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
} catch (_) {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// For GIFs, we decode the first frame and save it as WebP
|
// For GIFs, we decode the first frame and save it as WebP
|
||||||
final bytes = await sourceFile.readAsBytes();
|
final bytes = sourceFile.readAsBytesSync();
|
||||||
final pngBytes = await compute(_processGifThumbnail, bytes);
|
final image = img.decodeGif(bytes);
|
||||||
if (pngBytes == null || pngBytes.isEmpty) {
|
if (image == null) {
|
||||||
Log.error('Could not decode GIF for thumbnail.');
|
Log.error('Could not decode GIF for thumbnail.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final webp = await FlutterImageCompress.compressWithList(
|
|
||||||
pngBytes,
|
|
||||||
format: CompressFormat.webp,
|
|
||||||
quality: 85,
|
|
||||||
);
|
|
||||||
if (webp.isEmpty) {
|
|
||||||
Log.error('GIF thumbnail compression returned empty.');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
await destinationFile.writeAsBytes(webp);
|
|
||||||
|
|
||||||
stopwatch.stop();
|
|
||||||
if (destinationFile.existsSync() && destinationFile.lengthSync() > 0) {
|
|
||||||
Log.info(
|
|
||||||
'It took ${stopwatch.elapsedMilliseconds}ms to create the GIF thumbnail.',
|
|
||||||
);
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
Log.error('Error creating GIF thumbnail: $e');
|
|
||||||
try {
|
|
||||||
if (destinationFile.existsSync()) {
|
|
||||||
destinationFile.deleteSync();
|
|
||||||
}
|
|
||||||
} catch (_) {}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint8List? _processGifThumbnail(Uint8List bytes) {
|
|
||||||
final image = img.decodeGif(bytes);
|
|
||||||
if (image == null) return null;
|
|
||||||
|
|
||||||
final thumbnail = img.copyResize(
|
final thumbnail = img.copyResize(
|
||||||
image,
|
image,
|
||||||
width: image.width > image.height ? 400 : null,
|
width: image.width > image.height ? 400 : null,
|
||||||
height: image.height >= image.width ? 400 : null,
|
height: image.height >= image.width ? 400 : null,
|
||||||
);
|
);
|
||||||
|
|
||||||
return img.encodePng(thumbnail);
|
final pngBytes = img.encodePng(thumbnail);
|
||||||
|
final webp = await FlutterImageCompress.compressWithList(
|
||||||
|
pngBytes,
|
||||||
|
format: CompressFormat.webp,
|
||||||
|
quality: 85,
|
||||||
|
);
|
||||||
|
destinationFile.writeAsBytesSync(webp);
|
||||||
|
|
||||||
|
stopwatch.stop();
|
||||||
|
Log.info(
|
||||||
|
'It took ${stopwatch.elapsedMilliseconds}ms to create the GIF thumbnail.',
|
||||||
|
);
|
||||||
|
return true;
|
||||||
|
} catch (e) {
|
||||||
|
Log.error('Error creating GIF thumbnail: $e');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue