From db852c7f6562aa4eccd247abb7c893afadcee815 Mon Sep 17 00:00:00 2001
From: Oliver Wiese <oliver.wiese@fu-berlin.de>
Date: Thu, 8 Apr 2021 11:48:40 +0200
Subject: [PATCH] Fix encryption state in compose view

---
 .../SwiftUI/Compose/ComposeModel.swift        | 11 +++++++---
 .../SwiftUI/Compose/RecipientFieldModel.swift | 12 ++++++++++-
 .../SwiftUI/Compose/RecipientsModel.swift     | 21 +++++++++++++++++--
 3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift b/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift
index 4a85b645..2de6237a 100644
--- a/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift
+++ b/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift
@@ -26,9 +26,7 @@ class ComposeModel: ObservableObject {
         }
         recipientsModel.parentComposeModel = self
     }
-    
-    // TODO: Add security state functionality
-    
+        
     /// Generates mail and sends it.
     func sendMail() {
         generateMail().send()
@@ -43,6 +41,13 @@ class ComposeModel: ObservableObject {
         for address in addresses {
             model.addNewAddress(address)
         }
+        let frc = PersistentDataProvider.dataProvider.generateFetchedAddresesWithKeyResultsController(addresses: addresses)
+        if let records = frc.fetchedObjects {
+            if encryptionOn && records.count != addresses.count {
+                encryptionOn = false
+            }
+        }
+        
     }
     
     /// Generates OutgoingMail with given email contents.
diff --git a/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift b/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift
index 2979c821..60215330 100644
--- a/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift
+++ b/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift
@@ -70,6 +70,9 @@ class RecipientFieldModel: ObservableObject {
     /// - Parameter _: AddressRecord that gets added to array of recipients.
     func selectContact(_ addressRecord: AddressRecord) {
         selectedContacts.append(addressRecord)
+        if !addressRecord.hasPublicKey {
+            self.parentRecipientModel?.parentComposeModel?.encryptionOn = false
+        }
         text = ""
         suggestions = []
         
@@ -85,8 +88,12 @@ class RecipientFieldModel: ObservableObject {
     ///
     /// - Parameter at: Index of contact to be removed from array of recipients.
     func deselectContact(at index: Int) {
-        selectedContacts.remove(at: index)
+        let addr = selectedContacts[index]
         
+        selectedContacts.remove(at: index)
+        if !addr.hasPublicKey {
+            parentRecipientModel?.checkEncryption()
+        }
         // TODO: See TODO in selectContact.
         parentRecipientModel?.parentComposeModel?.subject += ""
     }
@@ -120,6 +127,9 @@ class RecipientFieldModel: ObservableObject {
             
             if let addresses = frc.fetchedObjects, let addr = addresses.first {
                 self.selectedContacts.append(addr)
+                if !addr.hasPublicKey {
+                    self.parentRecipientModel?.parentComposeModel?.encryptionOn = false
+                }
             }
         }
     }
diff --git a/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift b/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift
index 1e2c5429..ea16a816 100644
--- a/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift
+++ b/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift
@@ -32,9 +32,7 @@ class RecipientsModel: ObservableObject {
     /// Used to show or hide Bcc field
     var isEditingCcOrBcc: Bool = false {
         didSet {
-            print("isEditingCcOrBcc: \(isEditingCcOrBcc)")
             updateShowBccField()
-            print("showBccField: \(showBccField)")
         }
     }
     
@@ -79,6 +77,25 @@ class RecipientsModel: ObservableObject {
             || !bccModel.selectedContacts.isEmpty
         ccModel.type = showBccField ? .cc : .ccBcc
     }
+    
+    func checkEncryption() {
+        for addr in toModel.selectedContacts {
+            if !addr.hasPublicKey {
+                return
+            }
+        }
+        for addr in ccModel.selectedContacts {
+            if !addr.hasPublicKey {
+                return
+            }
+        }
+        for addr in bccModel.selectedContacts {
+            if !addr.hasPublicKey {
+                return
+            }
+        }
+        parentComposeModel?.encryptionOn = true
+    }
 }
 
 /// Type of recipient field (to, cc, bcc).
-- 
GitLab