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