Forráskód Böngészése

【综合】激活、登出接口串接

tangchao 4 hónapja
szülő
commit
4c68765efd

+ 13 - 9
PDF Office/PDF Master/Class/Account/Controller/AccountProfileController.swift

@@ -221,9 +221,13 @@ class AccountProfileController: NSViewController {
                         if success == false {
                             return
                         }
-                        self?.view.window?.windowController?.km_quick_endSheet()
-                        KMDataManager.ud_set("", forKey: kAccountTokenKey)
-                        AccountManager.manager.isVip = false
+                        
+                        // 登出
+                        VerificationManager.default().unactivateDeviceWithcomplention { status, infoDict, err in
+                            self?.view.window?.windowController?.km_quick_endSheet()
+                            KMDataManager.ud_set("", forKey: kAccountTokenKey)
+                            AccountManager.manager.isVip = false
+                        }
                     }
                 } else {
 //                    self.gotoSignin()
@@ -315,9 +319,9 @@ class AccountProfileController: NSViewController {
     }
     
     func activateDevice() {
-        if IAPProductsManager.default().isAvailableAllFunction() {
-            return
-        }
+//        if IAPProductsManager.default().isAvailableAllFunction() {
+//            return
+//        }
         
         var licence: String?
         for model in self.model?.rightsInterestsData ?? [] {
@@ -328,9 +332,9 @@ class AccountProfileController: NSViewController {
         }
         
         if let data = licence {
-            VerificationManager.default().activateDevice(withInfo: ["cdkey" : data]) { status, info, err in
-                KMPrint("")
-            }
+//            VerificationManager.default().activateDevice(withInfo: ["cdkey" : data]) { status, info, err in
+//                KMPrint("")
+//            }
         }
     }
 }

+ 34 - 0
PDF Office/PDF Master/Class/Account/Tools/AccountTools.swift

@@ -0,0 +1,34 @@
+//
+//  AccountTools.swift
+//  PDF Reader Pro
+//
+//  Created by User-Tangchao on 2024/11/5.
+//
+
+import Cocoa
+
+class AccountTools: NSObject {
+
+    @available(macOS 10.15.0, iOS 13.0, *)
+    public class func canUseAdvance() async -> Bool {
+        return await withCheckedContinuation({ continuation in
+            self.canUseAdvance { success, err in
+                continuation.resume(returning: success)
+            }
+        })
+    }
+    
+    public class func canUseAdvance(callback: @escaping ((Bool, String?)->Void)) {
+        guard let token = KMDataManager.ud_string(forKey: kAccountTokenKey), token.isEmpty == false else {
+            return callback(false, nil)
+        }
+        let header = ["Token" : token]
+            
+        let uuid = GetHardwareUUID()
+        let params = ["device_code" : uuid]
+        // 绑定设备
+        KMHTTP.OEM_POST(urlString: kURLAPI_oemBind, parameter: params, headers: header) { success, dataModel, err in
+            callback(success, "")
+        }
+    }
+}

+ 20 - 16
PDF Office/PDF Master/Class/Account/Window/AccountCenterWindowController.swift

@@ -106,15 +106,17 @@ class AccountCenterWindowController: NSWindowController {
                 return
             }
             
-            let header = ["Token" : model.token ?? ""]
-            KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
-                if success == false {
-                    return
+            VerificationManager.default().activateDevice(withInfo: ["email" : model.email]) { status, infoDict, err in
+                let header = ["Token" : model.token ?? ""]
+                KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
+                    if success == false {
+                        return
+                    }
+                    let rmodel = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
+                    
+                    AccountManager.manager.isVip = rmodel.isVip == 1
+                    self.gotoCenter(model: rmodel, infoModel: model)
                 }
-                let rmodel = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
-                
-                AccountManager.manager.isVip = rmodel.isVip == 1
-                self.gotoCenter(model: rmodel, infoModel: model)
             }
         }
     }
@@ -145,15 +147,17 @@ class AccountCenterWindowController: NSWindowController {
                 return
             }
             
-            let header = ["Token" : model.token ?? ""]
-            KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
-                if success == false {
-                    return
+            VerificationManager.default().activateDevice(withInfo: ["email" : model.email]) { status, infoDict, err in
+                let header = ["Token" : model.token ?? ""]
+                KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
+                    if success == false {
+                        return
+                    }
+                    let rmodel = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
+                    
+                    AccountManager.manager.isVip = rmodel.isVip == 1
+                    self.gotoCenter(model: rmodel, infoModel: model)
                 }
-                let rmodel = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
-                
-                AccountManager.manager.isVip = rmodel.isVip == 1
-                self.gotoCenter(model: rmodel, infoModel: model)
             }
         }
     }

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

@@ -17,6 +17,7 @@ let kURLAPI_oemLogin                    = "/pdf/login"
 let kURLAPI_oemGetProductData           = "/pdf/get_product_data"
 let kURLAPI_oemGetPermissions           = "/pdf/get_permissions"
 let kURLAPI_oemLogout                   = "/pdf/logout"
+let kURLAPI_oemBind                   = "/pdf/bind"
 
 extension KMHTTP {
     public class func OEM_POST(urlString: String, parameter: [String : Any]?, headers: [String : String]?, callback:@escaping ((Bool, KMRequestResultModel?, String?)->Void)) {

+ 4 - 1
PDF Office/PDF Master/Class/Purchase/DMG/Verification/KMVerificationMessageViewController.m

@@ -93,7 +93,7 @@ NSPopoverDelegate>
     self.button.layer.masksToBounds = YES;
     self.button.layer.cornerRadius = 4.0;
     self.button.font = [NSFont SFProTextSemiboldFont:11];
-    self.button.layer.backgroundColor = [NSColor colorWithDeviceRed:121.0/255.0 green:196.0/255.0 blue:66.0/255.0 alpha:1.0].CGColor;
+//    self.button.layer.backgroundColor = [NSColor colorWithDeviceRed:121.0/255.0 green:196.0/255.0 blue:66.0/255.0 alpha:1.0].CGColor;
     [self.button setAlignment:NSTextAlignmentCenter];
     
     self.secondTrialBtn.wantsLayer = YES;
@@ -346,6 +346,9 @@ NSPopoverDelegate>
     self.aiContendView.hidden = YES;
     
     totalWidth += 8;
+    self.button.hidden = false;
+    self.bgImg.hidden = false;
+//    self.bgImg.layer.backgroundColor = [NSColor colorWithRed:112/255.0 green:100/255.0 blue:255/255.0 alpha:1.0].CGColor;
     if (self.button.hidden == NO) {
         CGFloat buttonWidth = CGRectGetMaxX(self.button.frame);
         NSRect btnRect = [self.button.attributedTitle boundingRectWithSize:CGSizeMake(MAXFLOAT, CGRectGetHeight(self.button.frame)) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading];

+ 19 - 9
PDF Office/PDF Master/Class/Purchase/DMG/Verification/VerificationManager/KMVerificationRSA.swift

@@ -14,15 +14,25 @@ import Foundation
 @objc class KMVerificationRSA: NSObject {
 
     @objc func active(uniquesn: String, cdkey: String, model: String, os: String, language: String, appversion: String) -> String?  {
-
-        let dictionary: [String: Any] = ["subscription": ["app_code":"com.imyfone.pdf",
-                                                          "cdkey":cdkey],
-                                         "device": ["unique_sn":uniquesn,
-                                                    "os":os,
-                                                    "platform":"DMG",
-                                                    "time_zone":"UTC",
-                                                    "language":language,
-                                                    "app_version":appversion]]
+        var dictionary: [String: Any] = [:]
+        if cdkey.isEmpty {
+            dictionary = ["subscription": ["app_code":"com.imyfone.pdf"],
+                                             "device": ["unique_sn":uniquesn,
+                                                        "os":os,
+                                                        "platform":"DMG",
+                                                        "time_zone":"UTC",
+                                                        "language":language,
+                                                        "app_version":appversion]]
+        } else {
+            dictionary = ["subscription": ["app_code":"com.imyfone.pdf",
+                                                              "email":cdkey],
+                                             "device": ["unique_sn":uniquesn,
+                                                        "os":os,
+                                                        "platform":"DMG",
+                                                        "time_zone":"UTC",
+                                                        "language":language,
+                                                        "app_version":appversion]]
+        }
 
         if let jsonData = try? JSONSerialization.data(withJSONObject: dictionary, options:[]),
            let jsonString = String(data: jsonData, encoding: .utf8) {

+ 4 - 0
PDF Office/PDF Master/Class/Purchase/DMG/Verification/VerificationManager/VerificationManager.h

@@ -109,6 +109,10 @@ typedef void(^ActivityComplention)(ActivityStatus status, NSDictionary *info, NS
  */
 - (void)verificationWithComplention:(ActivityComplention)complention;
 
+/** 登出
+ */
+- (void)unactivateDeviceWithcomplention:(ActivityComplention)complention;
+
 /** 提交试用
  @param  days    申请试用天数,由App端指定,Server端会限定最大试用天数
  @param  email   option, 申请人Email信息

+ 171 - 22
PDF Office/PDF Master/Class/Purchase/DMG/Verification/VerificationManager/VerificationManager.m

@@ -205,26 +205,26 @@ static VerificationManager *__verificationManager = nil;
 #pragma mark - Interface
 - (void)activateDeviceWithInfo:(NSDictionary*)info
                    complention:(ActivityComplention)complention {
-    if (![info[@"cdkey"] length]) {
-        //激活码为空
-        NSError *error = [NSError errorWithDomain:@""
-                                             code:ActivityErrorTypeCDKeyEmpty
-                                         userInfo:nil];
-        if (complention)
-            complention(NO, nil, error);
-        
-        return;
-    }
-    if (![self isValidLicenseCode:info[@"cdkey"]]) {
-        //激活码格式不正确
-        NSError *error = [NSError errorWithDomain:@"激活失败"
-                                             code:ActivityErrorTypeFormatError
-                                         userInfo:nil];
-        if (complention)
-            complention(NO, @{@"errors":@"FormatError"}, error);
-        
-        return;
-    }
+//    if (![info[@"cdkey"] length]) {
+//        //激活码为空
+//        NSError *error = [NSError errorWithDomain:@""
+//                                             code:ActivityErrorTypeCDKeyEmpty
+//                                         userInfo:nil];
+//        if (complention)
+//            complention(NO, nil, error);
+//
+//        return;
+//    }
+//    if (![self isValidLicenseCode:info[@"cdkey"]]) {
+//        //激活码格式不正确
+//        NSError *error = [NSError errorWithDomain:@"激活失败"
+//                                             code:ActivityErrorTypeFormatError
+//                                         userInfo:nil];
+//        if (complention)
+//            complention(NO, @{@"errors":@"FormatError"}, error);
+//
+//        return;
+//    }
     
     __block ActivityComplention tComplention = complention;
     __block VerificationManager *weak_self = self;
@@ -240,7 +240,7 @@ static VerificationManager *__verificationManager = nil;
               @"subscription":@{
                       @"app_code":[self bundleIdentify]?:@"",
                       @"email":info[@"email"]?:@"",
-                      @"cdkey":info[@"cdkey"]?:@"",
+//                      @"cdkey":info[@"cdkey"]?:@"",
                       },
               //设备信息
               @"device":@{
@@ -265,7 +265,7 @@ static VerificationManager *__verificationManager = nil;
 //    }
     
     NSString *verifyString = [self.rsa activeWithUniquesn:uuid 
-                                                    cdkey:info[@"cdkey"]?:@""
+                                                    cdkey:info[@"email"]?:@""
                                                     model:GetProductName()?:@""
                                                        os:GetSystemVersion()?:@""
                                                  language:[[NSLocale currentLocale] localeIdentifier]?:@""
@@ -622,6 +622,155 @@ static VerificationManager *__verificationManager = nil;
     [request startAsynchronous];
 }
 
+- (void)unactivateDeviceWithcomplention:(ActivityComplention)complention {
+    __block ActivityComplention tComplention = complention;
+    __block VerificationManager *weak_self = self;
+
+    //Process Params
+    NSString *app_version = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"] description];
+    if (!app_version.length)
+        app_version = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"] description];
+    NSDictionary *params =
+    @{
+      @"data":@{
+              //激活信息
+              @"subscription":@{
+                      @"app_code":[self bundleIdentify]?:@"",
+                      },
+              //设备信息
+              @"device":@{
+                      @"unique_sn":[self udid]?:@"",
+                      @"model":GetProductName()?:@"",
+                      @"os":GetSystemVersion()?:@"",
+                      @"time_zone":[[NSTimeZone localTimeZone] localizedName:NSTimeZoneNameStyleShortDaylightSaving locale:[NSLocale currentLocale]]?:@"",
+                      @"language":[[NSLocale currentLocale] localeIdentifier]?:@"",
+                      @"app_version":app_version?:@"",
+                      @"platform":@"DMG"
+                      }
+              }
+      };
+    
+    
+    if (!self.rsa) {
+        self.rsa = [[KMVerificationRSA alloc] init];
+    }
+    NSString *uuid = [self udid]?:@"";
+//    if (uuid.length > @"8D397BE0-F478-5269-A8F1".length) {
+//        uuid = [uuid substringToIndex:@"8D397BE0-F478-5269-A8F1".length];
+//    }
+    
+    NSString *verifyString = [self.rsa activeWithUniquesn:uuid
+                                                    cdkey:@""
+                                                    model:GetProductName()?:@""
+                                                       os:GetSystemVersion()?:@""
+                                                 language:[[NSLocale currentLocale] localeIdentifier]?:@""
+                                               appversion:app_version?:@""];
+
+    if (verifyString.length == 0) {
+        return;
+    }
+    params = @{@"verifyParam":verifyString};
+    
+    NSMutableData *postData = [VerificationManager mutableDataWithDic:params];
+    
+    //Send Request
+    NSString *urlString = [kVerificationPDFullServer stringByAppendingString:@"/oem/cancel"];
+    
+    
+    NSURL *url = [NSURL URLWithString:urlString];
+    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
+    
+    request.requestMethod = @"POST";
+    [request setPostBody:postData];
+    NSString *postLength = [NSString stringWithFormat:@"%ld", (unsigned long)[postData length]];
+    NSMutableDictionary *requestHeaders = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+                                           postLength, @"Content-Length", nil];
+    request.defaultResponseEncoding = NSUTF8StringEncoding;
+    //    [request setAuthenticationScheme:@"https"];//设置验证方式
+//    [request setValidatesSecureCertificate:NO];//设置验证证书
+    
+    [request setRequestHeaders:requestHeaders];
+    [request addRequestHeader:@"Content-Type" value:@"application/json"];
+    [request addRequestHeader:@"Accept" value:@"application/vnd.api+json;version=1"];
+    
+    __block void(^processRequest)(void) = ^{
+        dispatch_async(dispatch_get_main_queue(), ^{
+            NSDictionary *info = [[request.responseString objectFromJSONString] filterNullObject];
+            
+            NSError *error = request.error;
+            if ([info valueForKey:@"msg"]) {
+                NSString *detailKey = [info valueForKey:@"msg"];
+                if ([detailKey isEqualToString:@"exceed_max_device_num"]) {
+                    error = [NSError errorWithDomain:@"激活失败"
+                                                code:ActivityErrorTypeOutNumber
+                                            userInfo:info];
+                }else if ([detailKey isEqualToString:@"invalid_activate_info"]) {
+                    error = [NSError errorWithDomain:@"激活失败"
+                                                code:ActivityErrorTypeInvalidInfo
+                                            userInfo:info];
+                }else if ([detailKey isEqualToString:@"invalid_license_key"]) {
+                    error = [NSError errorWithDomain:@"激活失败"
+                                                code:ActivityErrorTypeCDKeyNotExist
+                                            userInfo:info];
+                }else if ([detailKey isEqualToString:@"license_not_match_product"]) {
+                    error = [NSError errorWithDomain:@"激活失败"
+                                                code:ActivityErrorTypeNotMatchProduct
+                                            userInfo:info];
+                }else if ([detailKey isEqualToString:@"license_expired"]) {
+                    error = [NSError errorWithDomain:@"激活失败"
+                                                code:ActivityErrorTypeCDKeyExpire
+                                            userInfo:info];
+                }else if ([detailKey isEqualToString:@" Activated success!"]) {
+                    error = nil;
+                }else {
+                    error = [NSError errorWithDomain:@"激活失败"
+                                                code:ActivityErrorTypeUnknow
+                                            userInfo:info];
+                }
+            } else {
+                if(error) {
+                    error = [NSError errorWithDomain:error.domain code:ActivityErrorTypeNetworkDisable userInfo:error.userInfo];
+                } else {
+                    error = [NSError errorWithDomain:@"激活失败"
+                                                code:ActivityErrorTypeUnknow
+                                            userInfo:@{}];
+                }
+            }
+            
+            if (!error) {
+                NSMutableDictionary *dic = [weak_self.detailInfo?:@{} mutableCopy];
+                
+                for (NSString *key in info[@"data"]) {
+                    [dic setValue:info[@"data"][key] forKey:key];
+                }
+                
+                weak_self.detailInfo = dic;
+                
+                NSString *notificationName = (NSString *)kDeviceActivateStatusChangeNotification;
+                [[NSNotificationCenter defaultCenter] postNotificationName:notificationName
+                                                                    object:self
+                                                                  userInfo:info];
+                
+//                [self verificationWithComplention:^(ActivityStatus status, NSDictionary *info, NSError *error) {
+                [weak_self verificationWithComplention:^(ActivityStatus status, NSDictionary *info, NSError *error) {
+                                    
+                }];
+            }
+            [weak_self restartTimer];
+            
+            
+            if (tComplention)
+                tComplention(weak_self.status, info, error);
+        });
+    };
+    [request setFailedBlock:^{
+        processRequest();
+    }];
+    [request setCompletionBlock:^{
+        processRequest();
+    }];
+    [request startAsynchronous];
+}
 
 - (void)getCodeWithEmail:(NSString*)email
              complention:(ActivityComplention)complention {

+ 0 - 1
PDF Office/PDF Master/Class/Tools/Search/Window/KMSearchReplaceWindowController.swift

@@ -411,7 +411,6 @@ class KMSearchReplaceWindowController: NSWindowController {
     func switchType(_ type: KMSearchReplaceType, animate: Bool = false) {
         if type == .replace {
             if IAPProductsManager.default().isAvailableAllFunction() == false {
-//                KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
                 let winC = KMPurchaseCompareWindowController.sharedInstance()
                 winC?.showWindow(nil)
                 guard let win = winC?.window else {

+ 16 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -225,6 +225,9 @@
 		65FABB352C9AFB1F00AA92E5 /* KMSectionCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 65FABB342C9AFB1F00AA92E5 /* KMSectionCellView.xib */; };
 		65FABB362C9AFB1F00AA92E5 /* KMSectionCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 65FABB342C9AFB1F00AA92E5 /* KMSectionCellView.xib */; };
 		65FABB372C9AFB1F00AA92E5 /* KMSectionCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 65FABB342C9AFB1F00AA92E5 /* KMSectionCellView.xib */; };
+		65FB302E2CDA18C700FEF224 /* AccountTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FB302D2CDA18C700FEF224 /* AccountTools.swift */; };
+		65FB302F2CDA18C700FEF224 /* AccountTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FB302D2CDA18C700FEF224 /* AccountTools.swift */; };
+		65FB30302CDA18C700FEF224 /* AccountTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65FB302D2CDA18C700FEF224 /* AccountTools.swift */; };
 		89316822296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */; };
 		89316823296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */; };
 		89316824296D73CC0073EA59 /* KMSignatureAnnotationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */; };
@@ -5823,6 +5826,7 @@
 		65F8515B2CC7A95B00598295 /* AccountInputController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AccountInputController.xib; sourceTree = "<group>"; };
 		65FABB302C9AFB0C00AA92E5 /* KMSectionCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSectionCellView.swift; sourceTree = "<group>"; };
 		65FABB342C9AFB1F00AA92E5 /* KMSectionCellView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSectionCellView.xib; sourceTree = "<group>"; };
+		65FB302D2CDA18C700FEF224 /* AccountTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTools.swift; sourceTree = "<group>"; };
 		8931681F296D73CC0073EA59 /* KMSignatureAnnotationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KMSignatureAnnotationViewController.h; sourceTree = "<group>"; };
 		89316820296D73CC0073EA59 /* KMSignatureAnnotationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KMSignatureAnnotationViewController.m; sourceTree = "<group>"; };
 		89316821296D73CC0073EA59 /* KMSignatureAnnotationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMSignatureAnnotationViewController.xib; sourceTree = "<group>"; };
@@ -8331,6 +8335,7 @@
 		65F8514F2CC7A1B000598295 /* Account */ = {
 			isa = PBXGroup;
 			children = (
+				65FB302C2CDA18B800FEF224 /* Tools */,
 				65AD80CA2CD4909600E78374 /* Manager */,
 				6582F9EE2CCF3168001D6D1E /* View */,
 				651558F82CC9FCCC00C0F0D9 /* Model */,
@@ -8374,6 +8379,14 @@
 			path = Controller;
 			sourceTree = "<group>";
 		};
+		65FB302C2CDA18B800FEF224 /* Tools */ = {
+			isa = PBXGroup;
+			children = (
+				65FB302D2CDA18C700FEF224 /* AccountTools.swift */,
+			);
+			path = Tools;
+			sourceTree = "<group>";
+		};
 		8931681E296D73C10073EA59 /* Signature */ = {
 			isa = PBXGroup;
 			children = (
@@ -17772,6 +17785,7 @@
 				BB89723A294B3C840045787C /* KMWatermarkPropertyController.swift in Sources */,
 				BBB14A6329792D6900936EDB /* KMRedactPageRangeContentView.swift in Sources */,
 				AD88109629A78ADC00178CA1 /* KMVerificationCodeView.swift in Sources */,
+				65FB302E2CDA18C700FEF224 /* AccountTools.swift in Sources */,
 				BB6B436B2A04935000E02B54 /* KMPDFThumbViewBaseController.swift in Sources */,
 				ADE3C1F929A5C42300793B13 /* KMLightMemberUserInfo.swift in Sources */,
 				BB88E43B294023CB002B3655 /* KMDocumentModel.swift in Sources */,
@@ -18198,6 +18212,7 @@
 				9FBA0EFF29015A82001117AF /* KMFastToolCollectionViewItem.swift in Sources */,
 				BB003036298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */,
 				ADDF838A2B391A5D00A81A4E /* DSignatureFileListCellView.swift in Sources */,
+				65FB302F2CDA18C700FEF224 /* AccountTools.swift in Sources */,
 				AD1FE83F2BD7C98300AA4A9B /* KMPageRangeRecordTool.m in Sources */,
 				BB66472C2C06DD9C00924EE0 /* KMToolbarConfigTBItemView.swift in Sources */,
 				BB8810BF2B4F872500AFA63E /* KMVerificationWindowController.m in Sources */,
@@ -19544,6 +19559,7 @@
 				BBEFD01A2AF9BD24003FABD8 /* KMDataVersionManager.swift in Sources */,
 				BBF38A64294F53FD0086D025 /* KMWatermarkFileView.swift in Sources */,
 				BBD8EE982B8EC86A00EB05FE /* AutoSavePopController.m in Sources */,
+				65FB30302CDA18C700FEF224 /* AccountTools.swift in Sources */,
 				899700F828F4051B009AF911 /* KMAnnotationViewController.swift in Sources */,
 				BBDA8A6F2A31F9A6006A2C4E /* KMDesignStepperView.swift in Sources */,
 				BBAFC83E2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */,