Browse Source

new loginweb

marinofaggiana 5 years ago
parent
commit
4bf40eeacd
3 changed files with 151 additions and 6 deletions
  1. 2 1
      iOSClient/Login/CCLogin.m
  2. 21 0
      iOSClient/Login/CCLogin.storyboard
  3. 128 5
      iOSClient/Login/NCLoginWeb.swift

+ 2 - 1
iOSClient/Login/CCLogin.m

@@ -194,8 +194,9 @@
                 NCLoginWeb *loginWeb = [[UIStoryboard storyboardWithName:@"CCLogin" bundle:nil] instantiateViewControllerWithIdentifier:@"NCLoginWeb"];
                 loginWeb.urlBase = self.baseUrl.text;
                 loginWeb.loginType = _loginType;
+                loginWeb.delegate = self;
+                
                 [self presentViewController:loginWeb animated:YES completion:nil];
-               
 #else
                 appDelegate.activeLoginWeb = [CCLoginWeb new];
                 appDelegate.activeLoginWeb.loginType = _loginType;

+ 21 - 0
iOSClient/Login/CCLogin.storyboard

@@ -198,9 +198,29 @@
                     <view key="view" contentMode="scaleToFill" id="UX5-cJ-bY6">
                         <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="cu2-5h-AYD">
+                                <rect key="frame" x="374" y="54" width="30" height="30"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="30" id="YkC-Vc-Xvs"/>
+                                    <constraint firstAttribute="width" constant="30" id="cFS-ia-6uF"/>
+                                </constraints>
+                                <state key="normal" image="exit"/>
+                                <connections>
+                                    <action selector="touchUpInsideButtonExit:" destination="yEb-Ky-35s" eventType="touchUpInside" id="Wx6-Nr-smX"/>
+                                </connections>
+                            </button>
+                        </subviews>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                        <constraints>
+                            <constraint firstItem="vqz-4v-cZu" firstAttribute="trailing" secondItem="cu2-5h-AYD" secondAttribute="trailing" constant="10" id="tMX-8y-Q7J"/>
+                            <constraint firstItem="cu2-5h-AYD" firstAttribute="top" secondItem="vqz-4v-cZu" secondAttribute="top" constant="10" id="w2J-N0-HHq"/>
+                        </constraints>
                         <viewLayoutGuide key="safeArea" id="vqz-4v-cZu"/>
                     </view>
+                    <connections>
+                        <outlet property="buttonExit" destination="cu2-5h-AYD" id="1Qq-gB-3g1"/>
+                    </connections>
                 </viewController>
                 <placeholder placeholderIdentifier="IBFirstResponder" id="pz9-Hz-nT9" userLabel="First Responder" sceneMemberID="firstResponder"/>
             </objects>
@@ -208,6 +228,7 @@
         </scene>
     </scenes>
     <resources>
+        <image name="exit" width="300" height="300"/>
         <image name="loginPassword" width="25" height="25"/>
         <image name="loginURL" width="25" height="25"/>
         <image name="loginUser" width="25" height="25"/>

+ 128 - 5
iOSClient/Login/NCLoginWeb.swift

@@ -32,8 +32,13 @@ import Foundation
 class NCLoginWeb: UIViewController {
     
     var webView: WKWebView?
+    let appDelegate = UIApplication.shared.delegate as! AppDelegate
+
     @objc var urlBase = ""
     @objc var loginType: Int = 0
+    @objc weak var delegate: CCLoginDelegateWeb?
+
+    @IBOutlet weak var buttonExit: UIButton!
 
     override func viewDidLoad() {
         super.viewDidLoad()
@@ -52,6 +57,12 @@ class NCLoginWeb: UIViewController {
             urlBase =  urlBase + k_flowEndpoint
         }
         
+        // button exit
+        buttonExit.layer.zPosition = .greatestFiniteMagnitude
+        if loginType == k_login_Add_Forced {
+            buttonExit.isHidden = true
+        }
+        
         loadWebPage(webView: webView!, url: URL(string: urlBase)!)
     }
     
@@ -66,10 +77,100 @@ class NCLoginWeb: UIViewController {
         
         webView.load(request)
     }
+    
+    @IBAction func touchUpInsideButtonExit(_ sender: UIButton) {
+        
+        self.dismiss(animated: true) {
+            self.delegate?.webDismiss?()
+        }
+    }
 }
 
 extension NCLoginWeb: WKNavigationDelegate {
     
+    public func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
+        
+        guard let url = webView.url else { return }
+        
+        let urlString: String = url.absoluteString.lowercased()
+        
+        if (urlString.hasPrefix(NCBrandOptions.sharedInstance.webLoginAutenticationProtocol) == true && urlString.contains("login") == true) {
+            
+            let keyValue = url.path.components(separatedBy: "&")
+            if (keyValue.count >= 3) {
+                
+                if (keyValue[0].contains("server:") && keyValue[1].contains("user:") && keyValue[2].contains("password:")) {
+                    
+                    var serverUrl : String = keyValue[0].replacingOccurrences(of: "/server:", with: "")
+                    
+                    // Login Flow NC 12
+                    if (NCBrandOptions.sharedInstance.use_login_web_personalized == false && serverUrl.hasPrefix("http://") == false && serverUrl.hasPrefix("https://") == false) {
+                        serverUrl = urlBase
+                    }
+                    
+                    if (serverUrl.last == "/") {
+                        serverUrl = String(serverUrl.dropLast())
+                    }
+                    
+                    let username : String = keyValue[1].replacingOccurrences(of: "user:", with: "").replacingOccurrences(of: "+", with: " ")
+                    let password : String = keyValue[2].replacingOccurrences(of: "password:", with: "")
+                    
+                    let account : String = "\(username) \(serverUrl)"
+                    
+                    // Login Flow
+                    if (loginType == k_login_Modify_Password && NCBrandOptions.sharedInstance.use_login_web_personalized == false) {
+                        
+                        // Verify if change the active account
+                        guard let activeAccount = NCManageDatabase.sharedInstance.getAccountActive() else {
+                            self.dismiss(animated: true, completion: nil)
+                            return
+                        }
+                        if (activeAccount.account != account) {
+                            self.dismiss(animated: true, completion: nil)
+                            return
+                        }
+                        
+                        // Change Password & setting active account
+                        CCUtility.setPassword(account, password: password)
+                        appDelegate.settingActiveAccount(account, activeUrl: serverUrl, activeUser: username, activeUserID: appDelegate.activeUserID, activePassword: password)
+                        
+                        self.dismiss(animated: true) {
+                            self.delegate?.loginSuccess(NSInteger(self.loginType))
+                            self.delegate?.webDismiss?()
+                        }
+                    }
+                    
+                    if (loginType == k_login_Add || loginType == k_login_Add_Forced) {
+                        
+                        // NO account found, clear
+                        if NCManageDatabase.sharedInstance.getAccounts() == nil {
+                            NCUtility.sharedInstance.removeAllSettings()
+                        }
+                        
+                        // STOP Intro
+                        CCUtility.setIntro(true)
+                        
+                        // Add new account
+                        NCManageDatabase.sharedInstance.deleteAccount(account)
+                        NCManageDatabase.sharedInstance.addAccount(account, url: serverUrl, user: username, password: password, loginFlow: true)
+                        
+                        guard let tableAccount = NCManageDatabase.sharedInstance.setAccountActive(account) else {
+                            self.dismiss(animated: true, completion: nil)
+                            return
+                        }
+                        
+                        appDelegate.settingActiveAccount(account, activeUrl: serverUrl, activeUser: username, activeUserID: tableAccount.userID, activePassword: password)
+                        
+                        self.dismiss(animated: true) {
+                            self.delegate?.loginSuccess(NSInteger(self.loginType))
+                            self.delegate?.webDismiss?()
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
     public func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
         if let serverTrust = challenge.protectionSpace.serverTrust {
             completionHandler(Foundation.URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust: serverTrust))
@@ -78,15 +179,37 @@ extension NCLoginWeb: WKNavigationDelegate {
         }
     }
     
-    public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
-        print("didStartProvisionalNavigation");
+    public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
+        guard let url = navigationAction.request.url else {
+            decisionHandler(.allow)
+            return
+        }
+        
+        if String(describing: url).hasPrefix(NCBrandOptions.sharedInstance.webLoginAutenticationProtocol) {
+            decisionHandler(.allow)
+            return
+        } else if navigationAction.request.httpMethod != "GET" || navigationAction.request.value(forHTTPHeaderField: "OCS-APIRequest") != nil {
+            decisionHandler(.allow)
+            return
+        }
+        
+        decisionHandler(.cancel)
+        
+        let language = NSLocale.preferredLanguages[0] as String
+        var request = URLRequest(url: url)
+        
+        request.setValue(CCUtility.getUserAgent(), forHTTPHeaderField: "User-Agent")
+        request.addValue("true", forHTTPHeaderField: "OCS-APIRequest")
+        request.addValue(language, forHTTPHeaderField: "Accept-Language")
+        
+        webView.load(request)
     }
     
-    public func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
-        print("didReceiveServerRedirectForProvisionalNavigation");
+    public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
+        print("didStartProvisionalNavigation");
     }
     
     public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
-        NCUtility.sharedInstance.stopActivityIndicator()
+        print("didFinishProvisionalNavigation");
     }
 }