Browse Source

【综合】接口调试和新增数据模型

tangchao 5 months ago
parent
commit
5c6d1950ec

+ 54 - 0
PDF Office/PDF Master/Class/Account/Model/AccountInfoModel.swift

@@ -0,0 +1,54 @@
+//
+//  AccountInfoModel.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/10/24.
+//
+
+import Cocoa
+
+class AccountInfoModel: NSObject {
+    // 用户Id
+    var member_id: String?
+    var member_code: String?
+    // 用户token
+    var token: String?
+    // 用户邮箱
+    var email: String?
+    var mobile: String?
+    var area_code: String?
+    // 用户账号
+    var account: String?
+    var notice_email: String?
+    var sources_brand_id: String?
+    var first_name: String?
+    var account_url: String?
+    var icart_url: String?
+    
+    var has_register_password: String?
+    
+    convenience init(dict: [String : Any]) {
+        self.init()
+        
+//        self.setValuesForKeys(dict)
+        self.member_id = dict["member_id"] as? String
+        self.member_code = dict["member_code"] as? String
+        self.token = dict["token"] as? String
+        self.email = dict["email"] as? String
+        self.mobile = dict["mobile"] as? String
+        self.area_code = dict["area_code"] as? String
+        
+        self.account = dict["account"] as? String
+        self.notice_email = dict["notice_email"] as? String
+        self.sources_brand_id = dict["sources_brand_id"] as? String
+        self.first_name = dict["first_name"] as? String
+        self.account_url = dict["account_url"] as? String
+        self.icart_url = dict["icart_url"] as? String
+        
+        self.has_register_password = dict["has_register_password"] as? String
+    }
+    
+    override func setValue(_ value: Any?, forUndefinedKey key: String) {
+        KMPrint("AccountInfoModel forUndefinedKey:" + key)
+    }
+}

+ 104 - 0
PDF Office/PDF Master/Class/Account/Model/AccountRightModel.swift

@@ -0,0 +1,104 @@
+//
+//  KMAccountRightModel.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/10/24.
+//
+
+import Cocoa
+
+class AccountRightInfoModel: NSObject {
+    // 权益产品名称
+    var name: String?
+    // 是否订阅:0=非订阅,1=订阅中,2=已取消订阅
+    var automatically_subscribe: Int = 0
+    // 失效时间戳 -1为永久有效
+    var failure_time: Int = 0
+    // 页面显示失效时间
+    var failure_time_text: String?
+    // 产品类型:1='1-Month Plan',2='1-Year Plan',3='Lifetime Plan'
+    var license_id: Int = 0
+    
+    // 权益状态:1=有效,2=无效
+    var status: Int = 0
+    // sku id
+    var sku_id: Int = 0
+    // 总设备数量
+    var total_num: Int = 0
+    // 剩余设备数量
+    var surplus_num: Int = 0
+    // 购买链接
+    var buy_url: String?
+    
+    convenience init(dict: [String : Any]) {
+        self.init()
+        
+        self.name = dict["name"] as? String
+        self.automatically_subscribe = dict["automatically_subscribe"] as? Int ?? 0
+        self.failure_time = dict["failure_time"] as? Int ?? 0
+        self.failure_time_text = dict["failure_time_text"] as? String
+        self.license_id = dict["license_id"] as? Int ?? 0
+        
+        self.status = dict["status"] as? Int ?? 0
+        self.sku_id = dict["sku_id"] as? Int ?? 0
+        self.total_num = dict["total_num"] as? Int ?? 0
+        self.surplus_num = dict["surplus_num"] as? Int ?? 0
+        self.buy_url = dict["buy_url"] as? String
+    }
+}
+
+class AccountRightModel: NSObject {
+    // 当前设备是否为Vip 0为否 1为是(如果用户只买了win的产品,mac端登录就为0)
+    var isVip: Int = 0
+    
+    // 有效权益记录
+    var rightsInterestsData: [AccountRightInfoModel] = []
+    
+    // 过期权益记录
+    var expiredBenefits: [AccountRightInfoModel] = []
+    
+    // 更多权益产品购买数据
+    var moreBenefits: [ProductListModel] = []
+    
+    convenience init(dict: [String : Any]) {
+        self.init()
+        
+        self.isVip = dict["isVip"] as? Int ?? 0
+        
+        if let array = dict["rightsInterestsData"] as? [Any] {
+            var datas: [AccountRightInfoModel] = []
+            for data in array {
+                guard let dict = data as? [String : Any] else {
+                    continue
+                }
+                let model = AccountRightInfoModel(dict: dict)
+                datas.append(model)
+            }
+            self.rightsInterestsData = datas
+        }
+        
+        if let array = dict["expiredBenefits"] as? [Any] {
+            var datas: [AccountRightInfoModel] = []
+            for data in array {
+                guard let dict = data as? [String : Any] else {
+                    continue
+                }
+                let model = AccountRightInfoModel(dict: dict)
+                datas.append(model)
+            }
+            self.expiredBenefits = datas
+        }
+        
+        if let array = dict["moreBenefits"] as? [Any] {
+            var datas: [ProductListModel] = []
+            for data in array {
+                guard let dict = data as? [String : Any] else {
+                    continue
+                }
+                let model = ProductListModel(dict: dict)
+                datas.append(model)
+            }
+            self.moreBenefits = datas
+        }
+    }
+}

+ 61 - 0
PDF Office/PDF Master/Class/Account/Model/ProductListModel.swift

@@ -0,0 +1,61 @@
+//
+//  ProductListModel.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/10/24.
+//
+
+import Cocoa
+
+class ProductInfoModel: NSObject {
+    // sku id
+    var sku_id: Int = 0
+    // 产品名称
+    var name: String?
+    // 购买链接
+    var buy_url: String?
+    // 是否为热点产品 1为是 0为否
+    var is_hot: Int = 0
+    // 真实价格
+    var actual_price: Double = 0
+    // 虚拟价格
+    var virtual_price: Double = 0
+    // 可用设备数量
+    var devices_num: Int = 0
+    
+    convenience init(dict: [String : Any]) {
+        self.init()
+        
+        self.sku_id = dict["sku_id"] as? Int ?? 0
+        self.name = dict["name"] as? String
+        self.buy_url = dict["buy_url"] as? String
+        self.is_hot = dict["is_hot"] as? Int ?? 0
+        self.actual_price = dict["actual_price"] as? Double ?? 0
+        self.virtual_price = dict["virtual_price"] as? Double ?? 0
+        self.devices_num = dict["devices_num"] as? Int ?? 0
+    }
+}
+
+class ProductListModel: NSObject {
+    // 分类别称
+    var name: String?
+    // 分类产品数据
+    var list: [ProductInfoModel]?
+    
+    convenience init(dict: [String : Any]) {
+        self.init()
+        
+        self.name = dict["name"] as? String
+        let list = dict["list"] as? [Any]
+        
+        var datas: [ProductInfoModel] = []
+        for data in list ?? [] {
+            guard let dict = data as? [String : Any] else {
+                continue
+            }
+            let model = ProductInfoModel(dict: dict)
+            datas.append(model)
+        }
+        self.list = datas
+    }
+}

+ 24 - 276
PDF Office/PDF Master/Class/Account/Window/AccountCenterWindowController.swift

@@ -6,7 +6,6 @@
 //
 
 import Cocoa
-import CommonCrypto
 
 class AccountCenterWindowController: NSWindowController {
     @IBOutlet weak var contentBox: NSBox!
@@ -19,299 +18,48 @@ class AccountCenterWindowController: NSWindowController {
         self.inputC_ = AccountInputController()
         self.contentBox.contentView = self.inputC_?.view
         
-        self.signIn()
+//        self.signIn()
 //        self.loginIn()
 //        self.productDatas()
-//        self.rightDatas()
-    }
-    
-    func md5(_ input: String) -> String {
-        let messageData = input.data(using: .utf8)!
-        var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
-     
-        _ = digestData.withUnsafeMutableBytes { digestBytes -> UnsafeMutablePointer<UInt8>? in
-            messageData.withUnsafeBytes { messageBytes -> UnsafeMutablePointer<UInt8>? in
-                CC_MD5(messageBytes.baseAddress, CC_LONG(messageData.count), digestBytes.bindMemory(to: UInt8.self).baseAddress)
-            }
-        }
-     
-        return digestData.map { String(format: "%02x", $0) }.joined()
-    }
-    
-    func sha1(str: String) -> String {
-        let data = str.data(using: .utf8)
-        var digest = [uint8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
-        
-        let newData = NSData.init(data: data!)
-        CC_SHA1(newData.bytes, CC_LONG(data?.count ?? 0), &digest)
-        let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
-        for byte in digest {
-            output.appendFormat("%02x", byte)
-        }
-        return output as String
+        self.rightDatas()
     }
     
     func rightDatas() {
-        let timeStamp = String(format: "%.0f", Date().timeIntervalSince1970)
-        let randomStr = "100000000"
-        let secret = "puN3du01bFtumyu2L"
-        
-        let string = timeStamp + randomStr + secret
-        
-        let rsa = KMVerificationRSA()
-        var signature = ""
-        let encrypt = self.sha1(str: string)
-        signature = self.md5(encrypt).uppercased()
-        
-        var semaphore = DispatchSemaphore (value: 0)
-        
-        let urlString = "https://pdf-api-anyrecover.ifonelab.net/pdf/get_permissions"
-        let kk = urlString + "?" + "timeStamp=" + timeStamp + "&" + "randomStr=" + randomStr + "&" + "signature=" + signature
-        let url = URL(string: kk)
-        var request = URLRequest(url: url!,timeoutInterval: Double.infinity)
-        request.addValue("mac", forHTTPHeaderField: "Device-Type")
-        request.addValue("e40c906b88051199fb0ee99cdc5fe0251729682541", forHTTPHeaderField: "Token")
-        request.addValue("Apifox/1.0.0 (https://apifox.com)", forHTTPHeaderField: "User-Agent")
-        
-        request.httpMethod = "POST"
-        
-        let task = URLSession.shared.dataTask(with: request) { data, response, error in
-            guard let data = data else {
-                print(String(describing: error))
-                semaphore.signal()
-                return
-            }
-            print(String(data: data, encoding: .utf8)!)
-            semaphore.signal()
+        let header = ["Token" : "7130d162c7533b5a51daefdd4faf17ea1729747785"]
+        KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataDict, err in
+            let model = AccountRightModel(dict: dataDict ?? [:])
+            KMPrint("")
         }
-        
-        task.resume()
-        semaphore.wait()
     }
     
     func productDatas() {
-        let timeStamp = String(format: "%.0f", Date().timeIntervalSince1970)
-        let randomStr = "100000000"
-        let secret = "puN3du01bFtumyu2L"
-        
-        let string = timeStamp + randomStr + secret
-        
-        let rsa = KMVerificationRSA()
-        var signature = ""
-        let encrypt = self.sha1(str: string)
-        signature = self.md5(encrypt).uppercased()
-        
-        var semaphore = DispatchSemaphore (value: 0)
-        
-        let urlString = "https://pdf-api-anyrecover.ifonelab.net/pdf/get_product_data"
-        let kk = urlString + "?" + "timeStamp=" + timeStamp + "&" + "randomStr=" + randomStr + "&" + "signature=" + signature
-        let url = URL(string: kk)
-        var request = URLRequest(url: url!,timeoutInterval: Double.infinity)
-        request.addValue("mac", forHTTPHeaderField: "Device-Type")
-        request.addValue("e40c906b88051199fb0ee99cdc5fe0251729682541", forHTTPHeaderField: "Token")
-        request.addValue("Apifox/1.0.0 (https://apifox.com)", forHTTPHeaderField: "User-Agent")
-        
-        request.httpMethod = "POST"
-        
-        let task = URLSession.shared.dataTask(with: request) { data, response, error in
-            guard let data = data else {
-                print(String(describing: error))
-                semaphore.signal()
-                return
+        let header = ["Token" : "7130d162c7533b5a51daefdd4faf17ea1729747785"]
+        KMHTTP.OEM_POST(urlString: kURLAPI_oemGetProductData, parameter: nil, headers: header) { success, dataDict, err in
+            let array = dataDict?["list"] as? [Any]
+            var datas: [ProductListModel] = []
+            for data in array ?? [] {
+                guard let dict = data as? [String : Any] else {
+                    continue
+                }
+                let model = ProductListModel(dict: dict)
+                datas.append(model)
             }
-            print(String(data: data, encoding: .utf8)!)
-            semaphore.signal()
+            KMPrint("")
         }
-        
-        task.resume()
-        semaphore.wait()
     }
     
     func loginIn() {
-        let timeStamp = String(format: "%.0f", Date().timeIntervalSince1970)
-        let randomStr = "100000000"
-        let secret = "puN3du01bFtumyu2L"
-        
-        let string = timeStamp + randomStr + secret
-        
-        let rsa = KMVerificationRSA()
-        var signature = ""
-        let encrypt = self.sha1(str: string)
-        signature = self.md5(encrypt).uppercased()
-        
-        var semaphore = DispatchSemaphore (value: 0)
-        
-        let passwordMd5 = self.md5("123456")
-        let parameters = [
-            [
-                "key": "email",
-                "value": "aaaa1@qq.com",
-                "type": "text"
-            ],
-            [
-                "key": "password",
-                "value": "e10adc3949ba59abbe56e057f20f883e",
-                "type": "text"
-            ],
-            [
-                "key": "device_code",
-                "value": "weqwerwer23243435435wedsf",
-                "type": "text"
-            ]] as [[String : Any]]
-        
-        let boundary = "Boundary-\(UUID().uuidString)"
-        var body = ""
-        var error: Error? = nil
-        for param in parameters {
-            if param["disabled"] == nil {
-                let paramName = param["key"]!
-                body += "--\(boundary)\r\n"
-                body += "Content-Disposition:form-data; name=\"\(paramName)\""
-                if param["contentType"] != nil {
-                    body += "\r\nContent-Type: \(param["contentType"] as! String)"
-                }
-                let paramType = param["type"] as! String
-                if paramType == "text" {
-                    let paramValue = param["value"] as! String
-                    body += "\r\n\r\n\(paramValue)\r\n"
-                } else {
-                    let paramSrc = param["src"] as! String
-                    let fileData = try?NSData(contentsOfFile:paramSrc, options:[]) as? Data
-                    let fileContent = String(data: fileData!, encoding: .utf8)!
-                    body += "; filename=\"\(paramSrc)\"\r\n"
-                    + "Content-Type: \"content-type header\"\r\n\r\n\(fileContent)\r\n"
-                }
-            }
-        }
-        body += "--\(boundary)--\r\n";
-        let postData = body.data(using: .utf8)
-        
-        let urlString = "https://pdf-api-anyrecover.ifonelab.net/pdf/login"
-        let kk = urlString + "?" + "timeStamp=" + timeStamp + "&" + "randomStr=" + randomStr + "&" + "signature=" + signature
-        let url = URL(string: kk)
-        var request = URLRequest(url: url!,timeoutInterval: Double.infinity)
-        request.addValue("mac", forHTTPHeaderField: "Device-Type")
-        request.addValue("Apifox/1.0.0 (https://apifox.com)", forHTTPHeaderField: "User-Agent")
-        request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
-        
-        request.httpMethod = "POST"
-        request.httpBody = postData
-        
-        let task = URLSession.shared.dataTask(with: request) { data, response, error in
-            guard let data = data else {
-                print(String(describing: error))
-                semaphore.signal()
-                return
-            }
-            print(String(data: data, encoding: .utf8)!)
-            semaphore.signal()
+        let params = ["email" : "aaaa1@qq.com", "password" : "e10adc3949ba59abbe56e057f20f883e", "device_code" : "weqwerwer23243435435wedsf"]
+        KMHTTP.OEM_POST(urlString: kURLAPI_oemLogin, parameter: params, headers: nil) { success , dataDict, err in
+            let model = AccountInfoModel(dict: dataDict ?? [:])
+            KMPrint("")
         }
-        
-        task.resume()
-        semaphore.wait()
     }
     
     func signIn() {
-//        var timeStamp = Math.round(new Date().getTime() / 1000) + '';
-//        var randomStr = Math.round(Math.random() * 100000000) + '';
-//        var secret = 'puN3du01bFtumyu2L';
-        let timeStamp = String(format: "%.0f", Date().timeIntervalSince1970)
-        let randomStr = "100000000"
-        let secret = "puN3du01bFtumyu2L"
-//
-//        var signature = CryptoJS.MD5(CryptoJS.SHA1(timeStamp + randomStr + secret).toString()).toString().toUpperCase();
-        let string = timeStamp + randomStr + secret
-//        self.md5(string.uppercased())
-        let rsa = KMVerificationRSA()
-        var signature = ""
-//        if let data = rsa.loadPublicKey() {
-//            let encrypt = rsa.encrypt(plainText: string, publicKey: data)
-//            signature = self.md5(encrypt?.base64EncodedString() ?? "")
-//        }
-        let encrypt = self.sha1(str: string)
-        signature = self.md5(encrypt).uppercased()
-//
-//        pm.request.url.addQueryParams('timeStamp=' + timeStamp);
-//        pm.request.url.addQueryParams('randomStr=' + randomStr);
-//        pm.request.url.addQueryParams('signature=' + signature);
-        
-        var semaphore = DispatchSemaphore (value: 0)
-
-        let parameters = [
-           [
-              "key": "email",
-              "value": "aaaa1@qq.com",
-              "type": "text"
-           ],
-           [
-              "key": "password",
-              "value": "e10adc3949ba59abbe56e057f20f883e",
-              "type": "text"
-           ],
-           [
-              "key": "device_code",
-              "value": "weqwerwer23243435435wedsf",
-              "type": "text"
-           ]] as [[String : Any]]
-
-        let boundary = "Boundary-\(UUID().uuidString)"
-        var body = ""
-        var error: Error? = nil
-        for param in parameters {
-           if param["disabled"] == nil {
-              let paramName = param["key"]!
-              body += "--\(boundary)\r\n"
-              body += "Content-Disposition:form-data; name=\"\(paramName)\""
-              if param["contentType"] != nil {
-                 body += "\r\nContent-Type: \(param["contentType"] as! String)"
-              }
-              let paramType = param["type"] as! String
-              if paramType == "text" {
-                 let paramValue = param["value"] as! String
-                 body += "\r\n\r\n\(paramValue)\r\n"
-              } else {
-                 let paramSrc = param["src"] as! String
-                 let fileData = try?NSData(contentsOfFile:paramSrc, options:[]) as? Data
-                 let fileContent = String(data: fileData!, encoding: .utf8)!
-                 body += "; filename=\"\(paramSrc)\"\r\n"
-                   + "Content-Type: \"content-type header\"\r\n\r\n\(fileContent)\r\n"
-              }
-           }
-        }
-        body += "--\(boundary)--\r\n";
-        let postData = body.data(using: .utf8)
-
-        let urlString = "https://pdf-api-anyrecover.ifonelab.net/pdf/register"
-        let kk = urlString + "?" + "timeStamp=" + timeStamp + "&" + "randomStr=" + randomStr + "&" + "signature=" + signature
-        let url = URL(string: kk)
-        var request = URLRequest(url: url!,timeoutInterval: Double.infinity)
-        request.addValue("mac", forHTTPHeaderField: "Device-Type")
-//        request.addValue("Apifox/1.0.0 (https://apifox.com)", forHTTPHeaderField: "User-Agent")
-        request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
-//        request.addValue(timeStamp, forHTTPHeaderField: "timeStamp")
-//        request.addValue(randomStr, forHTTPHeaderField: "randomStr")
-//        request.addValue(signature, forHTTPHeaderField: "signature")
-        
-        
-        
-        request.httpMethod = "POST"
-        request.httpBody = postData
-
-//        let task = URLSession.shared.dataTask(with: request) { data, response, error in
-//           guard let data = data else {
-//              print(String(describing: error))
-//              semaphore.signal()
-//              return
-//           }
-//           print(String(data: data, encoding: .utf8)!)
-//           semaphore.signal()
-//        }
-
-//        task.resume()
-//        semaphore.wait()
-        let params = ["email" : "aaaa2@qq.com", "password" : "e10adc3949ba59abbe56e057f20f883e", "device_code" : "weqwerwer23243435435wedsf"]
-        let headers = ["Device-Type" : "mac", "Content-Type" : "multipart/form-data; boundary=\(boundary)"]
-        KMHTTP.POST(urlString: kk, parameter: params, headers: headers) { success , dataDict, err in
+        let params = ["email" : "aaaa5@qq.com", "password" : "e10adc3949ba59abbe56e057f20f883e", "device_code" : "weqwerwer23243435435wedsf"]
+        KMHTTP.OEM_POST(urlString: kURLAPI_oemRegister, parameter: params, headers: nil) { success , dataDict, err in
+            let model = AccountInfoModel(dict: dataDict ?? [:])
             KMPrint("")
         }
     }

+ 16 - 0
PDF Office/PDF Master/Class/Common/Category/Foundations/Dictionary+KMExtension.swift

@@ -0,0 +1,16 @@
+//
+//  Dictionary+KMExtension.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/10/24.
+//
+
+import Foundation
+
+extension Dictionary {
+    mutating func append(dict: Dictionary) {
+        dict.forEach { (key, value) in
+            self.updateValue(value, forKey: key)
+        }
+    }
+}

+ 66 - 0
PDF Office/PDF Master/Class/Common/Tools/HTTP/KMHTTP+OEM.swift

@@ -0,0 +1,66 @@
+//
+//  KMHTTP+OEM.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/10/24.
+//
+
+import Foundation
+import CommonCrypto
+
+// MARK: - OEM
+
+let kOEMBaseUrl = "https://pdf-api-anyrecover.ifonelab.net"
+
+let kURLAPI_oemRegister                 = "/pdf/register"
+let kURLAPI_oemLogin                    = "/pdf/login"
+let kURLAPI_oemGetProductData           = "/pdf/get_product_data"
+let kURLAPI_oemGetPermissions = "/pdf/get_permissions"
+
+extension KMHTTP {
+    public class func OEM_POST(urlString: String, parameter: [String : Any]?, headers: [String : String]?, callback:@escaping ((Bool, [String : Any]?, String?)->Void)) {
+        let timeStamp = String(format: "%.0f", Date().timeIntervalSince1970)
+        let randomStr = "100000000"
+        let secret = "puN3du01bFtumyu2L"
+        
+        let string = timeStamp + randomStr + secret
+        let encrypt = self.sha1(str: string)
+        var signature = self.md5(encrypt).uppercased()
+        
+        let theUrl = kOEMBaseUrl + urlString + "?" + "timeStamp=" + timeStamp + "&" + "randomStr=" + randomStr + "&" + "signature=" + signature
+        
+        let boundary = "Boundary-\(UUID().uuidString)"
+        var theHeaders = ["Device-Type" : "mac", "Content-Type" : "multipart/form-data; boundary=\(boundary)"]
+        for (key, value) in headers ?? [:] {
+            theHeaders.updateValue(value, forKey: key)
+        }
+        KMHTTP.POST(urlString: theUrl, parameter: parameter, headers: theHeaders, callback: callback)
+    }
+    
+    class func md5(_ input: String) -> String {
+        let messageData = input.data(using: .utf8)!
+        var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
+     
+        _ = digestData.withUnsafeMutableBytes { digestBytes -> UnsafeMutablePointer<UInt8>? in
+            messageData.withUnsafeBytes { messageBytes -> UnsafeMutablePointer<UInt8>? in
+                CC_MD5(messageBytes.baseAddress, CC_LONG(messageData.count), digestBytes.bindMemory(to: UInt8.self).baseAddress)
+            }
+        }
+     
+        return digestData.map { String(format: "%02x", $0) }.joined()
+    }
+    
+    class func sha1(str: String) -> String {
+        let data = str.data(using: .utf8)
+        var digest = [uint8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
+        
+        let newData = NSData.init(data: data!)
+        CC_SHA1(newData.bytes, CC_LONG(data?.count ?? 0), &digest)
+        let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
+        for byte in digest {
+            output.appendFormat("%02x", byte)
+        }
+        return output as String
+    }
+}
+

+ 1 - 48
PDF Office/PDF Master/Class/Common/Tools/KMHTTP.swift

@@ -96,7 +96,7 @@ class KMHTTP: NSObject {
         task.resume()
     }
     
-    public class func POST(urlString: String, parameter: [String : String]?, headers: [String : String]?, callback:@escaping ((Bool, [String : Any]?, String?)->Void)) {
+    public class func POST(urlString: String, parameter: [String : Any]?, headers: [String : String]?, callback:@escaping ((Bool, [String : Any]?, String?)->Void)) {
         let url: URL = URL(string: urlString)!
          
         let session = URLSession.shared
@@ -245,50 +245,3 @@ class KMHTTP: NSObject {
     }
 }
 
-// MARK: - OEM
-
-extension KMHTTP {
-    public class func OEM_POST(urlString: String, parameter: [String : Any]?, callback:@escaping ((Bool, [String : Any]?, String?)->Void)) {
-        let url: URL = URL(string: urlString)!
-         
-        let session = URLSession.shared
-        var request = URLRequest(url: url)
-        request.httpMethod = "POST"
-        request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
-        request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Accept")
-        
-        let boundary = "Boundary-\(UUID().uuidString)"
-        request.addValue("mac", forHTTPHeaderField: "Device-Type")
-        request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
-        
-        request.timeoutInterval = 60.0
-        
-        session.configuration.timeoutIntervalForRequest = 30.0
-        
-        if let data = parameter {
-            let body = try?JSONSerialization.data(withJSONObject: data, options: [])
-            request.httpBody = body
-        }
-        
-        let task: URLSessionDataTask = session.dataTask(with: request) { data , response, error in
-            DispatchQueue.main.async {
-                if let _ = error {
-                    callback(false, nil, error.debugDescription)
-                    return
-                }
-                guard let _data = data else {
-                    callback(false, nil, error.debugDescription)
-                    return
-                }
-                if let result = self.JsonDataParse(data: _data) {
-                    let resultMap = KMRequestResultModel(dict: result)
-                    callback(resultMap.isSuccess(), resultMap.data as? [String : Any], error.debugDescription)
-                    return
-                }
-
-                callback(false, nil, error.debugDescription)
-            }
-        }
-        task.resume()
-    }
-}

+ 64 - 8
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -7,9 +7,24 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		650FF67D2CC918220019FAE1 /* KMHTTP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650FF67C2CC918220019FAE1 /* KMHTTP.swift */; };
-		650FF67E2CC918220019FAE1 /* KMHTTP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650FF67C2CC918220019FAE1 /* KMHTTP.swift */; };
-		650FF67F2CC918220019FAE1 /* KMHTTP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 650FF67C2CC918220019FAE1 /* KMHTTP.swift */; };
+		651558ED2CC9F21900C0F0D9 /* KMHTTP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558EC2CC9F21900C0F0D9 /* KMHTTP.swift */; };
+		651558EE2CC9F21900C0F0D9 /* KMHTTP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558EC2CC9F21900C0F0D9 /* KMHTTP.swift */; };
+		651558EF2CC9F21900C0F0D9 /* KMHTTP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558EC2CC9F21900C0F0D9 /* KMHTTP.swift */; };
+		651558F12CC9F27E00C0F0D9 /* KMHTTP+OEM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F02CC9F27E00C0F0D9 /* KMHTTP+OEM.swift */; };
+		651558F22CC9F27E00C0F0D9 /* KMHTTP+OEM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F02CC9F27E00C0F0D9 /* KMHTTP+OEM.swift */; };
+		651558F32CC9F27E00C0F0D9 /* KMHTTP+OEM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F02CC9F27E00C0F0D9 /* KMHTTP+OEM.swift */; };
+		651558F52CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F42CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift */; };
+		651558F62CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F42CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift */; };
+		651558F72CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F42CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift */; };
+		651558FA2CC9FD1E00C0F0D9 /* AccountInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F92CC9FD1E00C0F0D9 /* AccountInfoModel.swift */; };
+		651558FB2CC9FD1E00C0F0D9 /* AccountInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F92CC9FD1E00C0F0D9 /* AccountInfoModel.swift */; };
+		651558FC2CC9FD1E00C0F0D9 /* AccountInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558F92CC9FD1E00C0F0D9 /* AccountInfoModel.swift */; };
+		651558FE2CCA14CF00C0F0D9 /* ProductListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558FD2CCA14CF00C0F0D9 /* ProductListModel.swift */; };
+		651558FF2CCA14CF00C0F0D9 /* ProductListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558FD2CCA14CF00C0F0D9 /* ProductListModel.swift */; };
+		651559002CCA14CF00C0F0D9 /* ProductListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651558FD2CCA14CF00C0F0D9 /* ProductListModel.swift */; };
+		651559022CCA20B100C0F0D9 /* AccountRightModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651559012CCA20B100C0F0D9 /* AccountRightModel.swift */; };
+		651559032CCA20B100C0F0D9 /* AccountRightModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651559012CCA20B100C0F0D9 /* AccountRightModel.swift */; };
+		651559042CCA20B100C0F0D9 /* AccountRightModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651559012CCA20B100C0F0D9 /* AccountRightModel.swift */; };
 		651A59822C8EA20F005A35FB /* KMPurchaseEmbeddedWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3A48C32C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.swift */; };
 		651A59832C8EA210005A35FB /* KMPurchaseEmbeddedWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F3A48C32C8017FA0047F565 /* KMPurchaseEmbeddedWindowController.swift */; };
 		652E953D2C6670CE0061FA40 /* KMFreehandAnnotationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */; };
@@ -5656,7 +5671,12 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		650FF67C2CC918220019FAE1 /* KMHTTP.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMHTTP.swift; sourceTree = "<group>"; };
+		651558EC2CC9F21900C0F0D9 /* KMHTTP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMHTTP.swift; sourceTree = "<group>"; };
+		651558F02CC9F27E00C0F0D9 /* KMHTTP+OEM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KMHTTP+OEM.swift"; sourceTree = "<group>"; };
+		651558F42CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+KMExtension.swift"; sourceTree = "<group>"; };
+		651558F92CC9FD1E00C0F0D9 /* AccountInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountInfoModel.swift; sourceTree = "<group>"; };
+		651558FD2CCA14CF00C0F0D9 /* ProductListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProductListModel.swift; sourceTree = "<group>"; };
+		651559012CCA20B100C0F0D9 /* AccountRightModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountRightModel.swift; sourceTree = "<group>"; };
 		652E953C2C6670CE0061FA40 /* KMFreehandAnnotationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFreehandAnnotationController.swift; sourceTree = "<group>"; };
 		652E95412C6913C20061FA40 /* KMLineAndBorderItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLineAndBorderItemView.swift; sourceTree = "<group>"; };
 		652E95512C6914770061FA40 /* KMLineAndBorderItemView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMLineAndBorderItemView.xib; sourceTree = "<group>"; };
@@ -8017,6 +8037,25 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		651558EB2CC9F21900C0F0D9 /* HTTP */ = {
+			isa = PBXGroup;
+			children = (
+				651558EC2CC9F21900C0F0D9 /* KMHTTP.swift */,
+				651558F02CC9F27E00C0F0D9 /* KMHTTP+OEM.swift */,
+			);
+			path = HTTP;
+			sourceTree = "<group>";
+		};
+		651558F82CC9FCCC00C0F0D9 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				651558F92CC9FD1E00C0F0D9 /* AccountInfoModel.swift */,
+				651558FD2CCA14CF00C0F0D9 /* ProductListModel.swift */,
+				651559012CCA20B100C0F0D9 /* AccountRightModel.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
 		652E953A2C66707E0061FA40 /* Freehand */ = {
 			isa = PBXGroup;
 			children = (
@@ -8154,6 +8193,7 @@
 		65F8514F2CC7A1B000598295 /* Account */ = {
 			isa = PBXGroup;
 			children = (
+				651558F82CC9FCCC00C0F0D9 /* Model */,
 				65F851592CC7A93D00598295 /* Controller */,
 				65F851502CC7A1B000598295 /* Window */,
 			);
@@ -11722,11 +11762,11 @@
 		BB135C2829B6CD6700FD5965 /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				651558EB2CC9F21900C0F0D9 /* HTTP */,
 				BB135C2929B6CD9A00FD5965 /* KMTools.swift */,
 				BB3A81AF2AC2B82A006FC66C /* KMPageSizeTool.swift */,
 				BBBF687F2A3BF17F0058E14E /* KMFilePromiseProvider.swift */,
 				BBBE209A2B21E5F100509C4E /* KMAlertTool.swift */,
-				650FF67C2CC918220019FAE1 /* KMHTTP.swift */,
 			);
 			path = Tools;
 			sourceTree = "<group>";
@@ -14169,6 +14209,7 @@
 			isa = PBXGroup;
 			children = (
 				BBEDC2262B98205200970C54 /* Bundle+KMExtension.swift */,
+				651558F42CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift */,
 			);
 			path = Foundations;
 			sourceTree = "<group>";
@@ -16928,7 +16969,7 @@
 				AD7D5CB32B9070AF006562CD /* KMSyncDot.swift in Sources */,
 				BB2A98522B270B3300647AF3 /* KMBatchAddBackgroundOperation.swift in Sources */,
 				9F0CB4C4298625F400007028 /* NSColor+KMExtensions.swift in Sources */,
-				650FF67D2CC918220019FAE1 /* KMHTTP.swift in Sources */,
+				651558ED2CC9F21900C0F0D9 /* KMHTTP.swift in Sources */,
 				BBD1F78F296FE6A500343885 /* KMPageEditSplitWindowController.swift in Sources */,
 				9F1FE50529406E4700E952CA /* CTTabStripDragController.m in Sources */,
 				BBEB93EB2AD6C2AE00739573 /* KMPDFMergeFileNameTabelViewCell.swift in Sources */,
@@ -17008,6 +17049,7 @@
 				BBA5429C29F13A140041BAD0 /* KMMemorandumPattern.swift in Sources */,
 				BB276A582B038D1100AB5578 /* KMOCRPDFWindowController.swift in Sources */,
 				BB46CF4C2AFBB34900281EDF /* AutoSaveManager.swift in Sources */,
+				651559022CCA20B100C0F0D9 /* AccountRightModel.swift in Sources */,
 				65341C742C63CCFE00FE30F9 /* KMSearchReplaceWindowController.swift in Sources */,
 				89E4E7352964148E002DBA6F /* KMAnnotationPropertiesViewController.m in Sources */,
 				9F221ED729A9EC0900978A59 /* KMFillSignTextPanel.swift in Sources */,
@@ -17034,6 +17076,7 @@
 				AD68783329A60FA7005B5210 /* KMLoginView.swift in Sources */,
 				ADC63E3F2A49816900854E02 /* KMSubscribeSuccessView.swift in Sources */,
 				9F0CB531298656EA00007028 /* KMDesignToken+BorderWidthBottom.swift in Sources */,
+				651558F52CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift in Sources */,
 				BB8115FF2992682F0008F536 /* KMSecureLimitAlertView.swift in Sources */,
 				ADDEEA662AD3C4BE00EF675D /* KMPDFSignatureImageView.swift in Sources */,
 				BBB14A5B2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift in Sources */,
@@ -17520,6 +17563,7 @@
 				ADE86A8A2B02269400414DFA /* KMRemovePasswordWindowController.swift in Sources */,
 				89D2D2C129495D2100BFF5FE /* KMFormModel.swift in Sources */,
 				BBA19F3F29ADE40A001A285A /* KMCellEmptyView.m in Sources */,
+				651558FA2CC9FD1E00C0F0D9 /* AccountInfoModel.swift in Sources */,
 				BB7185412C2B0AAF00C1156B /* KMEditPDFToolbarItemView.swift in Sources */,
 				89316822296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */,
 				BB89723A294B3C840045787C /* KMWatermarkPropertyController.swift in Sources */,
@@ -17534,6 +17578,7 @@
 				BBB9B316299A5D6D004F3235 /* KMDropboxManager.m in Sources */,
 				9F1F82EE293609F60092C4B4 /* CPDFDocument+PageEditManager.swift in Sources */,
 				89D2D2E2294C452B00BFF5FE /* KMPDFThumbnailView.swift in Sources */,
+				651558FE2CCA14CF00C0F0D9 /* ProductListModel.swift in Sources */,
 				BB10FAE52AFE039E00F18D65 /* KMPDFEditPageRangeWindowController.swift in Sources */,
 				BB9599C32B31647B0062D346 /* KMRedactPropertiesWindowController.swift in Sources */,
 				ADD1B6B729420B2300C3FFF7 /* KMPrintChooseView.swift in Sources */,
@@ -17643,6 +17688,7 @@
 				BBC745F7296178BD0072C2ED /* KMCropTools.swift in Sources */,
 				AD9527DB2952EE700039D2BC /* KMPrintPage_C.swift in Sources */,
 				AD3AAD6D2B0DCC6800DE5FE7 /* KMCompareSaveWindow.swift in Sources */,
+				651558F12CC9F27E00C0F0D9 /* KMHTTP+OEM.swift in Sources */,
 				9F8539D22943121100DF644E /* KMSegmentedBox.swift in Sources */,
 				9F1FE4DB29406E4700E952CA /* NSURL+Utils.m in Sources */,
 				BB1CA5C6298E20820059E31C /* KMPreferenceAligementView.swift in Sources */,
@@ -17909,7 +17955,7 @@
 			files = (
 				BB6719FE2AD2CE1B003D44D5 /* CPDFSquareAnnotation+PDFListView.swift in Sources */,
 				BB2C84792BAE71E400AF6142 /* KMBotaTableView.swift in Sources */,
-				650FF67E2CC918220019FAE1 /* KMHTTP.swift in Sources */,
+				651558EE2CC9F21900C0F0D9 /* KMHTTP.swift in Sources */,
 				BB147018299DC0D100784A6A /* OIDGrantTypes.m in Sources */,
 				AD7D5CA62B8F35D1006562CD /* SKPDFSyncRecord.m in Sources */,
 				BB3D971B2B3060B5007094C8 /* KMPDFAnnotationRedactConfig.swift in Sources */,
@@ -18404,6 +18450,7 @@
 				9FBC489C2996500300CA39D7 /* KMDocumentController.swift in Sources */,
 				F37322F7292DF9410013862C /* CSelfSignAnnotation.m in Sources */,
 				9F1FE4D929406E4700E952CA /* NSString+Utils.m in Sources */,
+				651558F22CC9F27E00C0F0D9 /* KMHTTP+OEM.swift in Sources */,
 				BB77C8602BD506BE0065AFF2 /* CPDFAnnotation+KMExtension.swift in Sources */,
 				BB146FE2299DC0D100784A6A /* GTLRDriveQuery.m in Sources */,
 				AD5999432AD8DC2000412F8B /* KMDynamicStampViewController.swift in Sources */,
@@ -18514,6 +18561,7 @@
 				AD85D1AE2AF09C79000F4D28 /* KMHomeQuickToolsWindowCollectionViewItem.swift in Sources */,
 				BB3A669F2B0752A800575343 /* KMTocOutlineView.swift in Sources */,
 				BB6719F62AD2C949003D44D5 /* CPDFRedactAnnotation+PDFListView.swift in Sources */,
+				651558F62CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift in Sources */,
 				ADCFFC0329C004AD007D3657 /* KMBookMarkTableRowView.swift in Sources */,
 				AD055E892B882E7F0035F824 /* SKBookmark.m in Sources */,
 				ADDEEA872AD7805200EF675D /* KMGeneralButton.swift in Sources */,
@@ -18556,6 +18604,7 @@
 				BB9EA1582B1EEAAC00EAFD9B /* KMImageModel.swift in Sources */,
 				BBC348032955403D008D2CD1 /* KMWatermarkFilePropertyInfoController.swift in Sources */,
 				BB147027299DC0D100784A6A /* OIDTokenRequest.m in Sources */,
+				651558FB2CC9FD1E00C0F0D9 /* AccountInfoModel.swift in Sources */,
 				BBFE6E592930724B00142C01 /* KMMergePageModel.swift in Sources */,
 				AD055E822B88294F0035F824 /* SKBookmarkController.m in Sources */,
 				ADDF83452B391A5C00A81A4E /* DSignatureManager.swift in Sources */,
@@ -18676,6 +18725,7 @@
 				BB31981F2AC57ACA00107371 /* CPDFPage+PDFListView.swift in Sources */,
 				BBFEF71C2B3A784200C28AC0 /* KMSystemEditMenu.swift in Sources */,
 				AD3AAD5D2B0DA3D400DE5FE7 /* KMCompareTextViewItem.swift in Sources */,
+				651559032CCA20B100C0F0D9 /* AccountRightModel.swift in Sources */,
 				AD3AAD242B0B6F9E00DE5FE7 /* KMCompareContentView.swift in Sources */,
 				BB10FAE62AFE039E00F18D65 /* KMPDFEditPageRangeWindowController.swift in Sources */,
 				9F705F77291A3A84005199AD /* KMHistoryFileDeleteWindowController.swift in Sources */,
@@ -18726,6 +18776,7 @@
 				ADDF83392B391A5C00A81A4E /* CPDFSignatureAnnotation+PDFListView.m in Sources */,
 				BB8810AA2B4F7D7500AFA63E /* KMVerificationViewController.m in Sources */,
 				BB897221294AF9080045787C /* KMWatermarkAdjectiveTopBarView.swift in Sources */,
+				651558FF2CCA14CF00C0F0D9 /* ProductListModel.swift in Sources */,
 				9F72D2092994BDAF00DCACF1 /* KMNotificationVC.swift in Sources */,
 				BB1B0ACF2B4FC6E900889528 /* KMFunctionGuideMultiController.swift in Sources */,
 				BB4DD04C299B296500E80DF6 /* KMCloudPathControl.swift in Sources */,
@@ -19275,6 +19326,7 @@
 				F36AD77929642FE80015AD53 /* CPDFListView+UndoManager.m in Sources */,
 				BB234F092BA3D798008B3754 /* KMAIIconGuideView.swift in Sources */,
 				ADDF837F2B391A5D00A81A4E /* DSignatureDetailsViewController.swift in Sources */,
+				651558F32CC9F27E00C0F0D9 /* KMHTTP+OEM.swift in Sources */,
 				BBF98C362C0EE46200436CC7 /* KMToolbarCustomItemView.swift in Sources */,
 				BB853C8C2AF8BC7D009C20C1 /* KMBatchAddPasswordOperation.swift in Sources */,
 				BBB14A5D2978EBBE00936EDB /* KMRedactMutilPageFlagContentView.swift in Sources */,
@@ -19382,6 +19434,7 @@
 				BB031B862C47BB090099F7AD /* KMUserListItemView.swift in Sources */,
 				9FB220E12B10850400A5B208 /* KMAnnotationStampViewController.swift in Sources */,
 				ADBC375F29CC61E100D93208 /* KMReadModelView.swift in Sources */,
+				651558F72CC9F7C100C0F0D9 /* Dictionary+KMExtension.swift in Sources */,
 				AD867F8829D94F5100F00440 /* KMBOTAOutlineView.swift in Sources */,
 				ADFCEB772B4FC1660001EBAF /* KMAdsWebView.swift in Sources */,
 				BB146FEF299DC0D100784A6A /* GTLRBatchResult.m in Sources */,
@@ -19647,8 +19700,10 @@
 				AD7D5CCD2B95728C006562CD /* KMBookmarkOutlineTitleCellView.swift in Sources */,
 				ADAFD9F52AE68A7400F084BC /* KMCreatPDFView.swift in Sources */,
 				BB74DA792AC41182006EDFE7 /* NSFont+KMExtension.swift in Sources */,
+				651559042CCA20B100C0F0D9 /* AccountRightModel.swift in Sources */,
 				BB493F972B3E9805003E6175 /* KMBatchQuickActionManager.swift in Sources */,
 				BB49ECF3293F40F500C82CA2 /* KMConvertPageRangeSettingItemView.swift in Sources */,
+				651559002CCA14CF00C0F0D9 /* ProductListModel.swift in Sources */,
 				9F69DBB42B512614003D4C45 /* KMAnnotationTextWidgetOptionsViewController.swift in Sources */,
 				BBFEF7212B3A787900C28AC0 /* KMSystemAnnotationMenu.swift in Sources */,
 				9F1FE4F529406E4700E952CA /* FastResizeView.m in Sources */,
@@ -19706,6 +19761,7 @@
 				BB4EEF4E2976544F003A3537 /* KMRedactAligementView.swift in Sources */,
 				F37322E9292DF9410013862C /* CPDFAnnotationModel.m in Sources */,
 				BB99ACCC292DEE6E0048AFD9 /* KMMergeTitleBar.swift in Sources */,
+				651558FC2CC9FD1E00C0F0D9 /* AccountInfoModel.swift in Sources */,
 				BB146FF5299DC0D100784A6A /* OIDLoopbackHTTPServer.m in Sources */,
 				9FCFEC6E2AC3D96800EAD2CB /* CPDFListViewAnimatedBorderlessWindow.swift in Sources */,
 				BBD1F79E296FF7A600343885 /* KMPageEditSplitSettingModel.swift in Sources */,
@@ -20159,7 +20215,7 @@
 				9F1FE4C229406E4700E952CA /* NSWindow+CTThemed.m in Sources */,
 				AD5374A02C65E1E1002DE248 /* KMThumbnailCache.swift in Sources */,
 				BB147001299DC0D100784A6A /* OIDRedirectHTTPHandler.m in Sources */,
-				650FF67F2CC918220019FAE1 /* KMHTTP.swift in Sources */,
+				651558EF2CC9F21900C0F0D9 /* KMHTTP.swift in Sources */,
 				AD7D5C9D2B8F20FE006562CD /* synctex_parser.m in Sources */,
 				89E4E6EE2963D1B7002DBA6F /* KMColorPickerViewController.m in Sources */,
 				BBEC00A6295BD42D00A26C98 /* KMHeaderFooterPageInfoView.swift in Sources */,