From e77c34e693f5c642a9e9d6091ea00a0744f0df9f Mon Sep 17 00:00:00 2001
From: cpilaszewicz <khutbvdw>
Date: Wed, 11 Mar 2020 11:02:42 +0100
Subject: [PATCH] Make readJson() method synchronous as the
 MCOMailProvidersManager is a shared object and has problem if called from
 multiple threads

---
 enzevalos_iphone/MailSession.swift | 31 +++++++++++++++++-------------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/enzevalos_iphone/MailSession.swift b/enzevalos_iphone/MailSession.swift
index 4069cdf8..e56b7097 100644
--- a/enzevalos_iphone/MailSession.swift
+++ b/enzevalos_iphone/MailSession.swift
@@ -67,7 +67,7 @@ class MailServer: Comparable {
     var loggerCalled = false
     var works = false
     var sendCallback = false
-    
+        
     var isTLS: Bool {
         get{
             return connectionType == MCOConnectionType.TLS
@@ -502,6 +502,9 @@ class MailSession {
     static let AUTHTYPE = [MCOAuthType.saslPlain, MCOAuthType.saslLogin, MCOAuthType.SASLNTLM, MCOAuthType.saslKerberosV4, MCOAuthType.SASLCRAMMD5, MCOAuthType.SASLDIGESTMD5, MCOAuthType.SASLGSSAPI, MCOAuthType.SASLSRP, MCOAuthType.init(rawValue: 0)]
     static let CONNTECTIONTYPE = [MCOConnectionType.TLS, MCOConnectionType.startTLS] // We do not test for plain connections!
     
+    static let dispatchQueue: DispatchQueue = DispatchQueue(label: "MailSessionQueue")
+
+    
     var defaultIMAPSession: MCOIMAPSession? {
         get {
             if let server = try? MailServer(userValues: sessionType, callback: callback) {
@@ -643,7 +646,7 @@ class MailSession {
         let (_, server) = MailSession.splitAddr(userAddr: self.mailAddr)
         if let domain = server {
             if self.sessionType == SessionType.IMAP {
-                createServers(domain: domain, prefixes: MailSession.IMAPPREFIX, ports: [UInt32(111)])
+                createServers(domain: domain, prefixes: MailSession.IMAPPREFIX, ports: MailSession.IMAPPORT)
             }
             else {
                 createServers(domain: domain, prefixes: MailSession.SMTPPREFIX, ports: MailSession.SMTPPORT)
@@ -722,20 +725,22 @@ class MailSession {
     }
     
     private func readJson() -> [MCONetService] {
-        var servers: [MCONetService] = []
-        let manager = MCOMailProvidersManager.shared()
-        if let path = Bundle.main.path(forResource: "providers", ofType: "json") {
-            manager.registerProviders(withFilename: path)
-            if let provider = manager.provider(forEmail: mailAddr){
-                if sessionType == SessionType.IMAP {
-                    servers = provider.imapServices()
-                }
-                else {
-                    servers = provider.smtpServices()
+        MailSession.dispatchQueue.sync {
+            var servers: [MCONetService] = []
+            let manager = MCOMailProvidersManager.shared()
+            if let path = Bundle.main.path(forResource: "providers", ofType: "json") {
+                manager.registerProviders(withFilename: path)
+                if let provider = manager.provider(forEmail: mailAddr){
+                    if sessionType == SessionType.IMAP {
+                        servers = provider.imapServices()
+                    }
+                    else {
+                        servers = provider.smtpServices()
+                    }
                 }
             }
+            return servers
         }
-        return servers
     }
     
     var hasJsonFile: Bool {
-- 
GitLab