From ed95c332f3b9af176271978fc739d59c3e7d88c2 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 26 Jan 2021 22:47:29 +0500 Subject: [PATCH] Accept regular expressions from server --- .../Sources/ShareExtensionContext.swift | 65 +++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/submodules/TelegramUI/Sources/ShareExtensionContext.swift b/submodules/TelegramUI/Sources/ShareExtensionContext.swift index 84b47ebdfe..f21a6952ae 100644 --- a/submodules/TelegramUI/Sources/ShareExtensionContext.swift +++ b/submodules/TelegramUI/Sources/ShareExtensionContext.swift @@ -406,6 +406,25 @@ public class ShareRootControllerImpl { var otherEntries: [(SSZipEntry, String, ChatHistoryImport.MediaType)] = [] var mainFile: TempBoxFile? + let appConfiguration = context.currentAppConfiguration.with({ $0 }) + + /* + history_import_filters: { + "zip": { + "main_file_patterns": [ + "_chat\\.txt", + "KakaoTalkChats\\.txt", + "Talk_.*?\\.txt" + ] + }, + "txt": { + "patterns": [ + "^\\[LINE\\]" + ] + } + } + */ + if fileExtension.lowercased() == "zip" { let archivePath = url.path archivePathValue = archivePath @@ -415,12 +434,24 @@ public class ShareRootControllerImpl { return } - let mainFileNames: [NSRegularExpression] = [ - try! NSRegularExpression(pattern: "_chat\\.txt"), - try! NSRegularExpression(pattern: "KakaoTalkChats\\.txt"), - try! NSRegularExpression(pattern: "Talk_.*?\\.txt"), + var mainFileNameExpressions: [String] = [ + "_chat\\.txt", + "KakaoTalkChats\\.txt", + "Talk_.*?\\.txt", ] + if let data = appConfiguration.data, let dict = data["history_import_filters"] as? [String: Any] { + if let zip = dict["zip"] as? [String: Any] { + if let patterns = zip["main_file_patterns"] as? [String] { + mainFileNameExpressions = patterns + } + } + } + + let mainFileNames: [NSRegularExpression] = mainFileNameExpressions.compactMap { string -> NSRegularExpression? in + return try? NSRegularExpression(pattern: string) + } + var maybeMainFileName: String? mainFileLoop: for entry in entries { let entryFileName = entry.path.replacingOccurrences(of: "/", with: "_").replacingOccurrences(of: "..", with: "_") @@ -476,8 +507,32 @@ public class ShareRootControllerImpl { } } } else if fileExtension.lowercased() == "txt" { + var fileScanExpressions: [String] = [ + "^\\[LINE\\]", + ] + + if let data = appConfiguration.data, let dict = data["history_import_filters"] as? [String: Any] { + if let zip = dict["txt"] as? [String: Any] { + if let patterns = zip["patterns"] as? [String] { + fileScanExpressions = patterns + } + } + } + + let filePatterns: [NSRegularExpression] = fileScanExpressions.compactMap { string -> NSRegularExpression? in + return try? NSRegularExpression(pattern: string) + } + if let mainFileText = try? String(contentsOf: URL(fileURLWithPath: url.path)) { - if !mainFileText.hasPrefix("[LINE]") { + let fullRange = NSRange(mainFileText.startIndex ..< mainFileText.endIndex, in: mainFileText) + var foundMatch = false + for pattern in filePatterns { + if pattern.firstMatch(in: mainFileText, options: [], range: fullRange) != nil { + foundMatch = true + break + } + } + if !foundMatch { beginShare() return }