TF-2464 Save both EmailDelivery and EmailState in the keychain
Signed-off-by: dab246 <tdvu@linagora.com> (cherry picked from commit a37fe7ea8bcc38eb96df39f46128c9e1f7af046e)
This commit is contained in:
@@ -8,5 +8,5 @@ struct KeychainCredentials {
|
|||||||
protocol KeychainControllerDelegate: AnyObject {
|
protocol KeychainControllerDelegate: AnyObject {
|
||||||
func retrieveSharingSessionFromKeychain(accountId: String) -> KeychainSharingSession?
|
func retrieveSharingSessionFromKeychain(accountId: String) -> KeychainSharingSession?
|
||||||
func retrieveSharingSessions() -> [KeychainCredentials]
|
func retrieveSharingSessions() -> [KeychainCredentials]
|
||||||
func updateEmailStateToKeychain(accountId: String, newState: String)
|
func updateEmailDeliveryStateToKeychain(accountId: String, newEmailDeliveryState: String)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ class KeychainController: KeychainControllerDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateEmailStateToKeychain(accountId: String, newState: String) {
|
func updateEmailDeliveryStateToKeychain(accountId: String, newEmailDeliveryState: String) {
|
||||||
do {
|
do {
|
||||||
if let sharingSession = retrieveSharingSessionFromKeychain(accountId: accountId) {
|
if let sharingSession = retrieveSharingSessionFromKeychain(accountId: accountId) {
|
||||||
let newSharingSession = sharingSession.updateEmailState(newState: newState)
|
let newSharingSession = sharingSession.updateEmailDeliveryState(newEmailDeliveryState: newEmailDeliveryState)
|
||||||
try keychain.set(newSharingSession.toJson() ?? "", key: accountId)
|
try keychain.set(newSharingSession.toJson() ?? "", key: accountId)
|
||||||
}
|
}
|
||||||
} catch {}
|
} catch {}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ struct KeychainSharingSession: Codable {
|
|||||||
let authenticationType: AuthenticationType
|
let authenticationType: AuthenticationType
|
||||||
let apiUrl: String
|
let apiUrl: String
|
||||||
let emailState: String?
|
let emailState: String?
|
||||||
|
let emailDeliveryState: String?
|
||||||
let tokenOIDC: TokenOidc?
|
let tokenOIDC: TokenOidc?
|
||||||
let basicAuth: String?
|
let basicAuth: String?
|
||||||
let tokenEndpoint: String?
|
let tokenEndpoint: String?
|
||||||
@@ -13,13 +14,14 @@ struct KeychainSharingSession: Codable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension KeychainSharingSession {
|
extension KeychainSharingSession {
|
||||||
func updateEmailState(newState: String) -> KeychainSharingSession {
|
func updateEmailDeliveryState(newEmailDeliveryState: String) -> KeychainSharingSession {
|
||||||
return KeychainSharingSession(
|
return KeychainSharingSession(
|
||||||
accountId: self.accountId,
|
accountId: self.accountId,
|
||||||
userName: self.userName,
|
userName: self.userName,
|
||||||
authenticationType: self.authenticationType,
|
authenticationType: self.authenticationType,
|
||||||
apiUrl: self.apiUrl,
|
apiUrl: self.apiUrl,
|
||||||
emailState: newState,
|
emailState: emailState,
|
||||||
|
emailDeliveryState: newEmailDeliveryState,
|
||||||
tokenOIDC: self.tokenOIDC,
|
tokenOIDC: self.tokenOIDC,
|
||||||
basicAuth: self.basicAuth,
|
basicAuth: self.basicAuth,
|
||||||
tokenEndpoint: self.tokenEndpoint,
|
tokenEndpoint: self.tokenEndpoint,
|
||||||
@@ -34,6 +36,7 @@ extension KeychainSharingSession {
|
|||||||
authenticationType: self.authenticationType,
|
authenticationType: self.authenticationType,
|
||||||
apiUrl: self.apiUrl,
|
apiUrl: self.apiUrl,
|
||||||
emailState: self.emailState,
|
emailState: self.emailState,
|
||||||
|
emailDeliveryState: self.emailDeliveryState,
|
||||||
tokenOIDC: TokenOidc(
|
tokenOIDC: TokenOidc(
|
||||||
token: newTokenOidc.token,
|
token: newTokenOidc.token,
|
||||||
tokenId: newTokenOidc.tokenId,
|
tokenId: newTokenOidc.tokenId,
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class NotificationService: UNNotificationServiceExtension {
|
|||||||
|
|
||||||
guard let payloadData = request.content.userInfo as? [String: Any],
|
guard let payloadData = request.content.userInfo as? [String: Any],
|
||||||
!keychainController.retrieveSharingSessions().isEmpty else {
|
!keychainController.retrieveSharingSessions().isEmpty else {
|
||||||
self.modifiedContent?.body = NSLocalizedString(newEmailDefaultMessageKey, comment: "Localizable")
|
self.modifiedContent?.body = NSLocalizedString(newNotificationDefaultMessageKey, comment: "Localizable")
|
||||||
return self.notify()
|
return self.notify()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,24 +46,28 @@ class NotificationService: UNNotificationServiceExtension {
|
|||||||
let mapStateChanges: [String: [TypeName: String]] = PayloadParser.shared.parsingPayloadNotification(payloadData: payloadData)
|
let mapStateChanges: [String: [TypeName: String]] = PayloadParser.shared.parsingPayloadNotification(payloadData: payloadData)
|
||||||
|
|
||||||
if (mapStateChanges.isEmpty) {
|
if (mapStateChanges.isEmpty) {
|
||||||
self.modifiedContent?.body = NSLocalizedString(newEmailDefaultMessageKey, comment: "Localizable")
|
self.modifiedContent?.body = NSLocalizedString(newNotificationDefaultMessageKey, comment: "Localizable")
|
||||||
return self.notify()
|
return self.notify()
|
||||||
} else {
|
} else {
|
||||||
guard let currentAccountId = mapStateChanges.keys.first,
|
guard let currentAccountId = mapStateChanges.keys.first,
|
||||||
let keychainSharingSession = keychainController.retrieveSharingSessionFromKeychain(accountId: currentAccountId),
|
let keychainSharingSession = keychainController.retrieveSharingSessionFromKeychain(accountId: currentAccountId),
|
||||||
|
keychainSharingSession.tokenOIDC != nil || keychainSharingSession.basicAuth != nil,
|
||||||
let listStateOfAccount = mapStateChanges[currentAccountId],
|
let listStateOfAccount = mapStateChanges[currentAccountId],
|
||||||
let newEmailState = listStateOfAccount[TypeName.emailDelivery],
|
let newEmailDeliveryState = listStateOfAccount[TypeName.emailDelivery] else {
|
||||||
let oldEmailState = keychainSharingSession.emailState,
|
|
||||||
newEmailState != oldEmailState,
|
|
||||||
keychainSharingSession.tokenOIDC != nil || keychainSharingSession.basicAuth != nil else {
|
|
||||||
self.modifiedContent?.body = NSLocalizedString(newNotificationDefaultMessageKey, comment: "Localizable")
|
self.modifiedContent?.body = NSLocalizedString(newNotificationDefaultMessageKey, comment: "Localizable")
|
||||||
return self.notify()
|
return self.notify()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
guard let oldEmailDeliveryState = keychainSharingSession.emailDeliveryState ?? keychainSharingSession.emailState,
|
||||||
|
newEmailDeliveryState != oldEmailDeliveryState else {
|
||||||
|
self.modifiedContent?.body = NSLocalizedString(newEmailDefaultMessageKey, comment: "Localizable")
|
||||||
|
return self.notify()
|
||||||
|
}
|
||||||
|
|
||||||
JmapClient.shared.getNewEmails(
|
JmapClient.shared.getNewEmails(
|
||||||
apiUrl: keychainSharingSession.apiUrl,
|
apiUrl: keychainSharingSession.apiUrl,
|
||||||
accountId: keychainSharingSession.accountId,
|
accountId: keychainSharingSession.accountId,
|
||||||
sinceState: oldEmailState,
|
sinceState: oldEmailDeliveryState,
|
||||||
authenticationType: keychainSharingSession.authenticationType,
|
authenticationType: keychainSharingSession.authenticationType,
|
||||||
tokenOidc: keychainSharingSession.tokenOIDC,
|
tokenOidc: keychainSharingSession.tokenOIDC,
|
||||||
basicAuth: keychainSharingSession.basicAuth,
|
basicAuth: keychainSharingSession.basicAuth,
|
||||||
@@ -74,7 +78,10 @@ class NotificationService: UNNotificationServiceExtension {
|
|||||||
self.modifiedContent?.body = NSLocalizedString(self.newNotificationDefaultMessageKey, comment: "Localizable")
|
self.modifiedContent?.body = NSLocalizedString(self.newNotificationDefaultMessageKey, comment: "Localizable")
|
||||||
return self.notify()
|
return self.notify()
|
||||||
} else {
|
} else {
|
||||||
self.keychainController.updateEmailStateToKeychain(accountId: keychainSharingSession.accountId, newState: newEmailState)
|
self.keychainController.updateEmailDeliveryStateToKeychain(
|
||||||
|
accountId: keychainSharingSession.accountId,
|
||||||
|
newEmailDeliveryState: newEmailDeliveryState
|
||||||
|
)
|
||||||
|
|
||||||
if (emails.count > 1) {
|
if (emails.count > 1) {
|
||||||
for email in emails {
|
for email in emails {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class StateDataSourceImpl extends StateDataSource {
|
|||||||
if (PlatformInfo.isIOS && stateCache.type == StateType.email) {
|
if (PlatformInfo.isIOS && stateCache.type == StateType.email) {
|
||||||
final emailDeliveryStateKeychain = await _iosSharingManager.getEmailDeliveryStateFromKeychain(accountId);
|
final emailDeliveryStateKeychain = await _iosSharingManager.getEmailDeliveryStateFromKeychain(accountId);
|
||||||
if (emailDeliveryStateKeychain == null || emailDeliveryStateKeychain.isEmpty) {
|
if (emailDeliveryStateKeychain == null || emailDeliveryStateKeychain.isEmpty) {
|
||||||
await _iosSharingManager.updateEmailDeliveryStateInKeyChain(accountId, stateCache.state);
|
await _iosSharingManager.updateEmailStateInKeyChain(accountId, stateCache.state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Future.value(null);
|
return Future.value(null);
|
||||||
|
|||||||
+3
-2
@@ -3,13 +3,14 @@ import 'package:tmail_ui_user/features/push_notification/data/keychain/keychain_
|
|||||||
|
|
||||||
extension KeychainSharingSessionExtension on KeychainSharingSession {
|
extension KeychainSharingSessionExtension on KeychainSharingSession {
|
||||||
|
|
||||||
KeychainSharingSession updating({String? emailDeliveryState}) {
|
KeychainSharingSession updating({String? emailState, String? emailDeliveryState}) {
|
||||||
return KeychainSharingSession(
|
return KeychainSharingSession(
|
||||||
accountId: accountId,
|
accountId: accountId,
|
||||||
userName: userName,
|
userName: userName,
|
||||||
authenticationType: authenticationType,
|
authenticationType: authenticationType,
|
||||||
apiUrl: apiUrl,
|
apiUrl: apiUrl,
|
||||||
emailState: emailDeliveryState ?? emailDeliveryState,
|
emailState: emailState ?? emailState,
|
||||||
|
emailDeliveryState: emailDeliveryState ?? emailDeliveryState,
|
||||||
tokenOIDC: tokenOIDC,
|
tokenOIDC: tokenOIDC,
|
||||||
basicAuth: basicAuth,
|
basicAuth: basicAuth,
|
||||||
tokenEndpoint: tokenEndpoint,
|
tokenEndpoint: tokenEndpoint,
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class KeychainSharingSession with EquatableMixin {
|
|||||||
AuthenticationType authenticationType;
|
AuthenticationType authenticationType;
|
||||||
String apiUrl;
|
String apiUrl;
|
||||||
String? emailState;
|
String? emailState;
|
||||||
|
String? emailDeliveryState;
|
||||||
TokenOIDC? tokenOIDC;
|
TokenOIDC? tokenOIDC;
|
||||||
String? basicAuth;
|
String? basicAuth;
|
||||||
String? tokenEndpoint;
|
String? tokenEndpoint;
|
||||||
@@ -29,6 +30,7 @@ class KeychainSharingSession with EquatableMixin {
|
|||||||
required this.authenticationType,
|
required this.authenticationType,
|
||||||
required this.apiUrl,
|
required this.apiUrl,
|
||||||
this.emailState,
|
this.emailState,
|
||||||
|
this.emailDeliveryState,
|
||||||
this.tokenOIDC,
|
this.tokenOIDC,
|
||||||
this.basicAuth,
|
this.basicAuth,
|
||||||
this.tokenEndpoint,
|
this.tokenEndpoint,
|
||||||
@@ -46,6 +48,7 @@ class KeychainSharingSession with EquatableMixin {
|
|||||||
authenticationType,
|
authenticationType,
|
||||||
apiUrl,
|
apiUrl,
|
||||||
emailState,
|
emailState,
|
||||||
|
emailDeliveryState,
|
||||||
tokenOIDC,
|
tokenOIDC,
|
||||||
basicAuth,
|
basicAuth,
|
||||||
tokenEndpoint,
|
tokenEndpoint,
|
||||||
|
|||||||
@@ -333,10 +333,6 @@ class EmailChangeListener extends ChangeListener {
|
|||||||
if (_iosSharingManager == null) {
|
if (_iosSharingManager == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
await _iosSharingManager!.updateEmailDeliveryStateInKeyChain(accountId, emailDeliveryState);
|
||||||
final emailDeliveryStateKeychain = await _iosSharingManager!.getEmailDeliveryStateFromKeychain(accountId);
|
|
||||||
if (emailDeliveryStateKeychain == null || emailDeliveryStateKeychain.isEmpty) {
|
|
||||||
await _iosSharingManager!.updateEmailDeliveryStateInKeyChain(accountId, emailDeliveryState);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,11 +36,8 @@ class IOSSharingManager {
|
|||||||
|
|
||||||
Future<String?> getEmailDeliveryStateFromKeychain(AccountId accountId) async {
|
Future<String?> getEmailDeliveryStateFromKeychain(AccountId accountId) async {
|
||||||
try {
|
try {
|
||||||
if (await _keychainSharingManager.isSessionExist(accountId)) {
|
final keychainSharingStored = await getKeychainSharingSession(accountId);
|
||||||
final keychainSharingStored = await _keychainSharingManager.getSharingSession(accountId);
|
return keychainSharingStored?.emailDeliveryState;
|
||||||
return keychainSharingStored?.emailState;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError('IOSSharingManager::_getEmailDeliveryStateFromKeychain: Exception: $e');
|
logError('IOSSharingManager::_getEmailDeliveryStateFromKeychain: Exception: $e');
|
||||||
return null;
|
return null;
|
||||||
@@ -67,12 +64,18 @@ class IOSSharingManager {
|
|||||||
userName: personalAccount.userName!
|
userName: personalAccount.userName!
|
||||||
);
|
);
|
||||||
|
|
||||||
|
final emailState = await _getEmailState(
|
||||||
|
accountId: personalAccount.accountId!,
|
||||||
|
userName: personalAccount.userName!
|
||||||
|
);
|
||||||
|
|
||||||
final keychainSharingSession = KeychainSharingSession(
|
final keychainSharingSession = KeychainSharingSession(
|
||||||
accountId: personalAccount.accountId!,
|
accountId: personalAccount.accountId!,
|
||||||
userName: personalAccount.userName!,
|
userName: personalAccount.userName!,
|
||||||
authenticationType: personalAccount.authenticationType,
|
authenticationType: personalAccount.authenticationType,
|
||||||
apiUrl: personalAccount.apiUrl!,
|
apiUrl: personalAccount.apiUrl!,
|
||||||
emailState: emailDeliveryState,
|
emailState: emailState,
|
||||||
|
emailDeliveryState: emailDeliveryState,
|
||||||
tokenOIDC: authenticationInfo.value1,
|
tokenOIDC: authenticationInfo.value1,
|
||||||
basicAuth: authenticationInfo.value2
|
basicAuth: authenticationInfo.value2
|
||||||
);
|
);
|
||||||
@@ -123,15 +126,8 @@ class IOSSharingManager {
|
|||||||
required UserName userName
|
required UserName userName
|
||||||
}) async {
|
}) async {
|
||||||
try {
|
try {
|
||||||
String? emailDeliveryState = await getEmailDeliveryStateFromKeychain(accountId);
|
final emailDeliveryState = await getEmailDeliveryStateFromKeychain(accountId);
|
||||||
if (emailDeliveryState == null || emailDeliveryState.isEmpty) {
|
log('IOSSharingManager::_getEmailState:emailDeliveryState: $emailDeliveryState');
|
||||||
final emailState = await _stateCacheManager.getState(
|
|
||||||
accountId,
|
|
||||||
userName,
|
|
||||||
StateType.email
|
|
||||||
);
|
|
||||||
emailDeliveryState = emailState?.value;
|
|
||||||
}
|
|
||||||
return emailDeliveryState;
|
return emailDeliveryState;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError('IOSSharingManager::_getEmailDeliveryState:Exception: $e');
|
logError('IOSSharingManager::_getEmailDeliveryState:Exception: $e');
|
||||||
@@ -139,13 +135,41 @@ class IOSSharingManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<String?> _getEmailState({
|
||||||
|
required AccountId accountId,
|
||||||
|
required UserName userName
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final emailState = await _stateCacheManager.getState(
|
||||||
|
accountId,
|
||||||
|
userName,
|
||||||
|
StateType.email
|
||||||
|
);
|
||||||
|
log('IOSSharingManager::_getEmailState:emailState: $emailState');
|
||||||
|
return emailState?.value;
|
||||||
|
} catch (e) {
|
||||||
|
logError('IOSSharingManager::_getEmailState:Exception: $e');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future updateEmailDeliveryStateInKeyChain(AccountId accountId, String newEmailDeliveryState) async {
|
Future updateEmailDeliveryStateInKeyChain(AccountId accountId, String newEmailDeliveryState) async {
|
||||||
final keychainSharingSession = await getKeychainSharingSession(accountId);
|
final keychainSharingStored = await getKeychainSharingSession(accountId);
|
||||||
log('IOSSharingManager::updateEmailDeliveryStateInKeyChain:keychainSharingSession: $keychainSharingSession');
|
log('IOSSharingManager::updateEmailDeliveryStateInKeyChain:keychainSharingStored: $keychainSharingStored | newEmailDeliveryState: $newEmailDeliveryState');
|
||||||
if (keychainSharingSession == null) {
|
if (keychainSharingStored == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final newKeychain = keychainSharingSession.updating(emailDeliveryState: newEmailDeliveryState);
|
final newKeychain = keychainSharingStored.updating(emailDeliveryState: newEmailDeliveryState);
|
||||||
|
await _keychainSharingManager.save(newKeychain);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future updateEmailStateInKeyChain(AccountId accountId, String newEmailState) async {
|
||||||
|
final keychainSharingStored = await getKeychainSharingSession(accountId);
|
||||||
|
log('IOSSharingManager::updateEmailStateInKeyChain:keychainSharingStored: $keychainSharingStored | newEmailState: $newEmailState');
|
||||||
|
if (keychainSharingStored == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final newKeychain = keychainSharingStored.updating(emailState: newEmailState);
|
||||||
await _keychainSharingManager.save(newKeychain);
|
await _keychainSharingManager.save(newKeychain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user