Procházet zdrojové kódy

Merge pull request #2165 from nextcloud/MDM

Mdm
Marino Faggiana před 2 roky
rodič
revize
d6351fe499

+ 0 - 47
MDM/AppConfig/specfile.xml

@@ -1,47 +0,0 @@
-<managedAppConfiguration>
-	<version>1.0.0</version>
-	<bundleId>it.twsweb.Nextcloud</bundleId>
-	<dict>
-		<string keyName="serverUrl">
-			<defaultValue>
-				<value>https:&#x2F;&#x2F;cloud.nextcloud.com</value>
-			</defaultValue>
-		</string>
-		<string keyName="username">
-			<defaultValue>
-				<value>marino.faggiana</value>
-			</defaultValue>
-		</string>
-		<string keyName="password">
-			<defaultValue>
-				<value>password</value>
-			</defaultValue>
-		</string>
-	</dict>
-	<presentation defaultLocale="en-US">
-		<field keyName="serverUrl" type="input">
-			<label>
-				<language value="en-US">serverUrl</language>
-			</label>
-			<description>
-				<language value="en-US">Nextcloud server url</language>
-			</description>
-		</field>
-		<field keyName="username" type="input">
-			<label>
-				<language value="en-US">username</language>
-			</label>
-			<description>
-				<language value="en-US">User Name</language>
-			</description>
-		</field>
-		<field keyName="password" type="input">
-			<label>
-				<language value="en-US">password</language>
-			</label>
-			<description>
-				<language value="en-US">Password</language>
-			</description>
-		</field>
-	</presentation>
-</managedAppConfiguration>

+ 2 - 6
Nextcloud.xcodeproj/project.pbxproj

@@ -427,7 +427,6 @@
 		F7D68FCF28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */; };
 		F7D68FD028CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */; };
 		F7D96FCC246ED7E200536D73 /* NCNetworkingCheckRemoteUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7D96FCB246ED7E100536D73 /* NCNetworkingCheckRemoteUser.swift */; };
-		F7DBC37C23325E02001A85BA /* NCAppConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7DBC37B23325E01001A85BA /* NCAppConfigView.swift */; };
 		F7DFB7F0219C5B8000680748 /* NCCreateFormUploadAssets.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7DFB7EF219C5B8000680748 /* NCCreateFormUploadAssets.swift */; };
 		F7DFB7F4219C5CA800680748 /* NCCreateFormUploadScanDocument.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7DFB7F3219C5CA800680748 /* NCCreateFormUploadScanDocument.swift */; };
 		F7E0710128B13BB00001B882 /* DashboardData.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7E0710028B13BB00001B882 /* DashboardData.swift */; };
@@ -1007,7 +1006,6 @@
 		F7D532A41F5D4461006568B1 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
 		F7D68FCB28CB9051009139F3 /* NCManageDatabase+DashboardWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NCManageDatabase+DashboardWidget.swift"; sourceTree = "<group>"; };
 		F7D96FCB246ED7E100536D73 /* NCNetworkingCheckRemoteUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCNetworkingCheckRemoteUser.swift; sourceTree = "<group>"; };
-		F7DBC37B23325E01001A85BA /* NCAppConfigView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NCAppConfigView.swift; sourceTree = "<group>"; };
 		F7DBD82B23E46A4700ECB7C6 /* MarkdownKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MarkdownKit.framework; path = Carthage/Build/iOS/MarkdownKit.framework; sourceTree = "<group>"; };
 		F7DE9AB01F482FA5008DFE10 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = "<group>"; };
 		F7DFB7EF219C5B8000680748 /* NCCreateFormUploadAssets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NCCreateFormUploadAssets.swift; sourceTree = "<group>"; };
@@ -1709,7 +1707,6 @@
 		F7BFFA621A24D7300044ED85 /* Login */ = {
 			isa = PBXGroup;
 			children = (
-				F7DBC37B23325E01001A85BA /* NCAppConfigView.swift */,
 				F702F2F025EE5CDA008F8E80 /* NCLogin.storyboard */,
 				F702F2F625EE5CEC008F8E80 /* NCLogin.swift */,
 				F738D48F2756740100CD1D38 /* NCLoginNavigationController.swift */,
@@ -2848,7 +2845,6 @@
 				F7F4F11227ECDC52008676F9 /* UIFont+Extension.swift in Sources */,
 				AF93471A27E2361E002537EE /* NCShareAdvancePermissionHeader.swift in Sources */,
 				F7F878AE1FB9E3B900599E4F /* NCEndToEndMetadata.swift in Sources */,
-				F7DBC37C23325E02001A85BA /* NCAppConfigView.swift in Sources */,
 				3781B9B023DB2B7E006B4B1D /* AppDelegate+Menu.swift in Sources */,
 				F73D5E47246DE09200DF6467 /* NCElementsJSON.swift in Sources */,
 				F710D1F52405770F00A6033D /* NCViewerPDF.swift in Sources */,
@@ -3325,7 +3321,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 7;
+				CURRENT_PROJECT_VERSION = 8;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -3387,7 +3383,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 7;
+				CURRENT_PROJECT_VERSION = 8;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;

+ 2 - 13
iOSClient/AppDelegate.swift

@@ -42,7 +42,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
     @objc var password: String = ""
 
     var deletePasswordSession: Bool = false
-    var activeAppConfigView: NCAppConfigView?
     var activeLogin: NCLogin?
     var activeLoginWeb: NCLoginWeb?
     var activeServerUrl: String = ""
@@ -476,18 +475,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
 
     @objc func openLogin(viewController: UIViewController?, selector: Int, openLoginWeb: Bool) {
 
-        // use appConfig [MDM]
-        if NCBrandOptions.shared.use_configuration {
-
-            if activeAppConfigView?.view.window == nil {
-                activeAppConfigView = UIStoryboard(name: "NCLogin", bundle: nil).instantiateViewController(withIdentifier: "NCAppConfigView") as? NCAppConfigView
-                showLoginViewController(activeAppConfigView, contextViewController: viewController)
-            }
-            return
-        }
-
-        // only for personalized LoginWeb [customer]
-        if NCBrandOptions.shared.use_login_web_personalized {
+        // [Customers] [AppConfig]
+        if NCBrandOptions.shared.use_login_web_personalized || NCBrandOptions.shared.use_AppConfig {
 
             if activeLoginWeb?.view.window == nil {
                 activeLoginWeb = UIStoryboard(name: "NCLogin", bundle: nil).instantiateViewController(withIdentifier: "NCLoginWeb") as? NCLoginWeb

+ 29 - 23
iOSClient/Brand/NCBrand.swift

@@ -23,20 +23,6 @@
 
 import UIKit
 
-// MARK: - Configuration
-
-@objc class NCBrandConfiguration: NSObject {
-    @objc static let shared: NCBrandConfiguration = {
-        let instance = NCBrandConfiguration()
-        return instance
-    }()
-
-    @objc public let configuration_bundleId: String = "it.twsweb.Nextcloud"
-    @objc public let configuration_serverUrl: String = "serverUrl"
-    @objc public let configuration_username: String = "username"
-    @objc public let configuration_password: String = "password"
-}
-
 // MARK: - Options
 
 @objc class NCBrandOptions: NSObject {
@@ -46,20 +32,19 @@ import UIKit
     }()
 
     @objc public var brand: String = "Nextcloud"
-    // @objc public var mailMe:                            String = "ios@nextcloud.com"                              // Deprecated
     @objc public var textCopyrightNextcloudiOS: String = "Nextcloud Liquid for iOS %@ © 2022"
     @objc public var textCopyrightNextcloudServer: String = "Nextcloud Server %@"
     @objc public var loginBaseUrl: String = "https://cloud.nextcloud.com"
     @objc public var pushNotificationServerProxy: String = "https://push-notifications.nextcloud.com"
     @objc public var linkLoginHost: String = "https://nextcloud.com/install"
     @objc public var linkloginPreferredProviders: String = "https://nextcloud.com/signup-ios"
-    @objc public var webLoginAutenticationProtocol: String = "nc://"                                            // example "abc://"
+    @objc public var webLoginAutenticationProtocol: String = "nc://"                                                // example "abc://"
     @objc public var privacy: String = "https://nextcloud.com/privacy"
     @objc public var sourceCode: String = "https://github.com/nextcloud/ios"
 
     // Personalized
-    @objc public var webCloseViewProtocolPersonalized: String = ""                                                 // example "abc://change/plan"      Don't touch me !!
-    @objc public var folderBrandAutoUpload: String = ""                                                 // example "_auto_upload_folder_"   Don't touch me !!
+    @objc public var webCloseViewProtocolPersonalized: String = ""                                                  // example "abc://change/plan"      Don't touch me !!
+    @objc public var folderBrandAutoUpload: String = ""                                                             // example "_auto_upload_folder_"   Don't touch me !!
 
     // Auto Upload default folder
     @objc public var folderDefaultAutoUpload: String = "Photos"
@@ -68,16 +53,17 @@ import UIKit
     @objc public var capabilitiesGroups: String = "group.it.twsweb.Crypto-Cloud"
 
     // User Agent
-    @objc public var userAgent: String = "Nextcloud-iOS"                                    // Don't touch me !!
+    @objc public var userAgent: String = "Nextcloud-iOS"                                                            // Don't touch me !!
 
-    // Options
+    // BRAND ONLY
     @objc public var use_login_web_personalized:        Bool = false                                                // Don't touch me !!
+    @objc public var use_AppConfig:                     Bool = false                                                // Don't touch me !!
+    
+    // Options
     @objc public var use_default_auto_upload:           Bool = false
     @objc public var use_themingColor:                  Bool = true
-    //@objc public var use_themingBackground:             Bool = true                                               // Deprecated
     @objc public var use_themingLogo:                   Bool = false
     @objc public var use_storeLocalAutoUploadAll:       Bool = false
-    @objc public var use_configuration:                 Bool = false                                                // Don't touch me !!
     @objc public var use_loginflowv2:                   Bool = false                                                // Don't touch me !!
 
     @objc public var disable_intro:                     Bool = false
@@ -87,7 +73,6 @@ import UIKit
     @objc public var disable_more_external_site:        Bool = false
     @objc public var disable_openin_file:               Bool = false                                                // Don't touch me !!
     @objc public var disable_crash_service:             Bool = false
-    @objc public var disable_request_account:           Bool = false
     @objc public var disable_log:                       Bool = false
 
     override init() {
@@ -95,6 +80,27 @@ import UIKit
         if folderBrandAutoUpload != "" {
             folderDefaultAutoUpload = folderBrandAutoUpload
         }
+        
+        // wrapper AppConfig
+        if let appconfig = UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed"), use_AppConfig {
+            
+            if let str = appconfig[NCGlobal.shared.configuration_brand] as? String {
+                brand = str
+            }
+            if let str = appconfig[NCGlobal.shared.configuration_disable_intro] as? String {
+                disable_intro = (str as NSString).boolValue
+            }
+            if let str = appconfig[NCGlobal.shared.configuration_disable_multiaccount] as? String {
+                disable_multiaccount = (str as NSString).boolValue
+            }
+            if let str = appconfig[NCGlobal.shared.configuration_disable_crash_service] as? String {
+                disable_crash_service = (str as NSString).boolValue
+            }
+            if let str = appconfig[NCGlobal.shared.configuration_disable_log] as? String {
+                disable_log = (str as NSString).boolValue
+            }
+        }
+        
     }
 }
 

+ 0 - 117
iOSClient/Login/NCAppConfigView.swift

@@ -1,117 +0,0 @@
-//
-//  NCAppConfigView.swift
-//  Nextcloud
-//
-//  Created by Marino Faggiana on 18/09/2019.
-//  Copyright © 2019 Marino Faggiana. All rights reserved.
-//
-//  Author Marino Faggiana <marino.faggiana@nextcloud.com>
-//
-//  This program is free software: you can redistribute it and/or modify
-//  it under the terms of the GNU General Public License as published by
-//  the Free Software Foundation, either version 3 of the License, or
-//  (at your option) any later version.
-//
-//  This program is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//  GNU General Public License for more details.
-//
-//  You should have received a copy of the GNU General Public License
-//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-//
-
-import UIKit
-import NextcloudKit
-
-class NCAppConfigView: UIViewController {
-
-    let appDelegate = UIApplication.shared.delegate as! AppDelegate
-
-    private var serverUrl: String?
-    private var username: String?
-    private var password: String?
-
-    @IBOutlet weak var logoImage: UIImageView!
-    @IBOutlet weak var titleLabel: UILabel!
-
-    // MARK: - View Life Cycle
-
-    override func viewDidLoad() {
-        super.viewDidLoad()
-
-        self.view.backgroundColor = NCBrandColor.shared.brandElement
-        titleLabel.textColor = NCBrandColor.shared.brandText
-
-        titleLabel.text = NSLocalizedString("_appconfig_view_title_", comment: "")
-
-        if let serverConfig = UserDefaults.standard.dictionary(forKey: NCBrandConfiguration.shared.configuration_bundleId) {
-            serverUrl = serverConfig[NCBrandConfiguration.shared.configuration_serverUrl] as? String
-            username = serverConfig[NCBrandConfiguration.shared.configuration_username] as? String
-            password = serverConfig[NCBrandConfiguration.shared.configuration_password] as? String
-        } else {
-            serverUrl = UserDefaults.standard.string(forKey: NCBrandConfiguration.shared.configuration_serverUrl)
-            username = UserDefaults.standard.string(forKey: NCBrandConfiguration.shared.configuration_username)
-            password = UserDefaults.standard.string(forKey: NCBrandConfiguration.shared.configuration_password)
-        }
-    }
-
-    override func viewDidAppear(_ animated: Bool) {
-        super.viewDidAppear(animated)
-
-        // Stop timer error network
-        appDelegate.timerErrorNetworking?.invalidate()
-
-        guard let serverUrl = self.serverUrl else {
-            let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "User Default, serverUrl not found")
-            NCContentPresenter.shared.showError(error: error)
-            return
-        }
-        guard let username = self.username else {
-            let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "User Default, username not found")
-            NCContentPresenter.shared.showError(error: error)
-            return
-        }
-        guard let password = self.password else {
-            let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "User Default, password not found")
-            NCContentPresenter.shared.showError(error: error)
-            return
-        }
-
-        NextcloudKit.shared.getAppPassword(serverUrl: serverUrl, username: username, password: password, userAgent: nil) { token, data, error in
-            DispatchQueue.main.async {
-                if error == .success && token != nil {
-                    let account: String = "\(username) \(serverUrl)"
-
-                    // NO account found, clear
-                    if NCManageDatabase.shared.getAccounts() == nil { NCUtility.shared.removeAllSettings() }
-
-                    // Add new account
-                    NCManageDatabase.shared.deleteAccount(account)
-                    NCManageDatabase.shared.addAccount(account, urlBase: serverUrl, user: username, password: token!)
-
-                    guard let tableAccount = NCManageDatabase.shared.setAccountActive(account) else {
-                        let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "setAccountActive error")
-                        NCContentPresenter.shared.showError(error: error)
-                        self.dismiss(animated: true, completion: nil)
-                        return
-                    }
-
-                    self.appDelegate.settingAccount(account, urlBase: serverUrl, user: username, userId: tableAccount.userId, password: token!)
-                    NotificationCenter.default.postOnMainThread(name: NCGlobal.shared.notificationCenterInitialize)
-
-                    self.dismiss(animated: true) {}
-                } else {
-                    NCContentPresenter.shared.showError(error: error)
-                }
-            }
-        }
-    }
-
-    override func viewDidDisappear(_ animated: Bool) {
-        super.viewDidDisappear(animated)
-
-        // Start timer error network
-        appDelegate.startTimerErrorNetworking()
-    }
-}

+ 2 - 42
iOSClient/Login/NCLogin.storyboard

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19162" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
     <device id="retina6_1" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19144"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -133,45 +133,5 @@
             </objects>
             <point key="canvasLocation" x="5421.739130434783" y="-1210.0446428571429"/>
         </scene>
-        <!--App Config View-->
-        <scene sceneID="BeF-ke-GzC">
-            <objects>
-                <viewController storyboardIdentifier="NCAppConfigView" id="Ak5-da-5qm" customClass="NCAppConfigView" customModule="Nextcloud" customModuleProvider="target" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="lrn-aT-NFz">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="logo" translatesAutoresizingMaskIntoConstraints="NO" id="uEr-qx-rv2">
-                                <rect key="frame" x="79" y="389" width="256" height="128"/>
-                            </imageView>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="898-PT-7ao">
-                                <rect key="frame" x="10" y="94" width="394" height="20.5"/>
-                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
-                                <nil key="textColor"/>
-                                <nil key="highlightedColor"/>
-                            </label>
-                        </subviews>
-                        <viewLayoutGuide key="safeArea" id="x9O-1Y-Id9"/>
-                        <color key="backgroundColor" red="0.0" green="0.50935935970000001" blue="0.78929150100000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                        <constraints>
-                            <constraint firstItem="x9O-1Y-Id9" firstAttribute="trailing" secondItem="898-PT-7ao" secondAttribute="trailing" constant="10" id="6MT-gN-3XS"/>
-                            <constraint firstItem="898-PT-7ao" firstAttribute="top" secondItem="x9O-1Y-Id9" secondAttribute="top" constant="50" id="Iks-eT-vBH"/>
-                            <constraint firstItem="898-PT-7ao" firstAttribute="leading" secondItem="x9O-1Y-Id9" secondAttribute="leading" constant="10" id="S9I-wm-Vx0"/>
-                            <constraint firstItem="uEr-qx-rv2" firstAttribute="centerX" secondItem="x9O-1Y-Id9" secondAttribute="centerX" id="aL5-QX-ULn"/>
-                            <constraint firstItem="uEr-qx-rv2" firstAttribute="centerY" secondItem="x9O-1Y-Id9" secondAttribute="centerY" id="rrc-Gc-BmU"/>
-                        </constraints>
-                    </view>
-                    <connections>
-                        <outlet property="logoImage" destination="uEr-qx-rv2" id="g4x-Pf-mpw"/>
-                        <outlet property="titleLabel" destination="898-PT-7ao" id="DjP-TA-Zqd"/>
-                    </connections>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="JhO-p5-bOq" userLabel="First Responder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="6386.9565217391309" y="-1214.0625"/>
-        </scene>
     </scenes>
-    <resources>
-        <image name="logo" width="256" height="128"/>
-    </resources>
 </document>

+ 70 - 57
iOSClient/Login/NCLoginWeb.swift

@@ -33,29 +33,42 @@ class NCLoginWeb: UIViewController {
     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     var titleView: String = ""
 
-    @objc var urlBase = ""
-
-    @objc var loginFlowV2Available = false
-    @objc var loginFlowV2Token = ""
-    @objc var loginFlowV2Endpoint = ""
-    @objc var loginFlowV2Login = ""
+    var urlBase = ""
+    
+    var configServerUrl: String?
+    var configUsername: String?
+    var configPassword: String?
+    var configAppPassword: String?
+
+    var loginFlowV2Available = false
+    var loginFlowV2Token = ""
+    var loginFlowV2Endpoint = ""
+    var loginFlowV2Login = ""
 
     // MARK: - View Life Cycle
 
     override func viewDidLoad() {
         super.viewDidLoad()
 
-        let accountCount = NCManageDatabase.shared.getAccounts()?.count ?? 0
-        // TITLE
-        titleView = urlBase
-        if let host = URL(string: urlBase)?.host {
-            if let account = NCManageDatabase.shared.getActiveAccount(), CCUtility.getPassword(account.account).isEmpty {
-                titleView = NSLocalizedString("_user_", comment: "") + " " + account.userId + " " + NSLocalizedString("_in_", comment: "") + " " + host
+        // load AppConfig
+        if let serverConfig = UserDefaults.standard.dictionary(forKey: "com.apple.configuration.managed"), NCBrandOptions.shared.use_AppConfig {
+            if let serverUrl = serverConfig[NCGlobal.shared.configuration_serverUrl] as? String {
+                self.configServerUrl = serverUrl
+            }
+            if let username = serverConfig[NCGlobal.shared.configuration_username] as? String, !username.isEmpty, username.lowercased() != "username" {
+                self.configUsername = username
+            }
+            if let password = serverConfig[NCGlobal.shared.configuration_password] as? String, !password.isEmpty, password.lowercased() != "password" {
+                self.configPassword = password
+            }
+            if let apppassword = serverConfig[NCGlobal.shared.configuration_apppassword] as? String, !apppassword.isEmpty, apppassword.lowercased() != "apppassword" {
+                self.configAppPassword = apppassword
             }
         }
-        self.title = titleView
-
-        if NCBrandOptions.shared.use_login_web_personalized  && accountCount > 0 {
+        
+        let accountCount = NCManageDatabase.shared.getAccounts()?.count ?? 0
+        
+        if (NCBrandOptions.shared.use_login_web_personalized || NCBrandOptions.shared.use_AppConfig) && accountCount > 0 {
             navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .stop, target: self, action: #selector(self.closeView(sender:)))
         }
 
@@ -76,6 +89,26 @@ class NCLoginWeb: UIViewController {
         webView!.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
         webView!.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
 
+        activityIndicator = UIActivityIndicatorView(style: .medium)
+        activityIndicator.center = self.view.center
+        activityIndicator.startAnimating()
+        
+        self.view.addSubview(activityIndicator)
+        
+        // AppConfig
+        if let serverUrl = configServerUrl {
+            if let username = self.configUsername, let password = configAppPassword {
+                activityIndicator.stopAnimating()
+                createAccount(server: serverUrl, username: username, password: password)
+                return
+            } else if let username = self.configUsername, let password = configPassword {
+                getAppPassword(serverUrl: serverUrl, username: username, password: password)
+                return
+            } else {
+                urlBase = serverUrl
+            }
+        }
+        
         // ADD end point for Web Flow
         if urlBase != NCBrandOptions.shared.linkloginPreferredProviders {
             if loginFlowV2Available {
@@ -85,17 +118,21 @@ class NCLoginWeb: UIViewController {
             }
         }
 
-        activityIndicator = UIActivityIndicatorView(style: .gray)
-        activityIndicator.center = self.view.center
-        activityIndicator.startAnimating()
-        self.view.addSubview(activityIndicator)
-
         if let url = URL(string: urlBase) {
             loadWebPage(webView: webView!, url: url)
         } else {
             let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_login_url_error_")
             NCContentPresenter.shared.showError(error: error, priority: .max)
         }
+
+        // TITLE
+        if let host = URL(string: urlBase)?.host {
+            titleView = host
+            if let account = NCManageDatabase.shared.getActiveAccount(), CCUtility.getPassword(account.account).isEmpty {
+                titleView = NSLocalizedString("_user_", comment: "") + " " + account.userId + " " + NSLocalizedString("_in_", comment: "") + " " + host
+            }
+        }
+        self.title = titleView
     }
 
     override func viewDidAppear(_ animated: Bool) {
@@ -146,6 +183,19 @@ class NCLoginWeb: UIViewController {
 
         webView.load(request)
     }
+    
+    func getAppPassword(serverUrl: String, username: String, password: String) {
+        
+        NextcloudKit.shared.getAppPassword(serverUrl: serverUrl, username: username, password: password) { token, data, error in
+            self.activityIndicator.stopAnimating()
+            if error == .success, let password = token {
+                self.createAccount(server: serverUrl, username: username, password: password)
+            } else {
+                NCContentPresenter.shared.showError(error: error)
+                self.dismiss(animated: true, completion: nil)
+            }
+        }
+    }
 
     @objc func closeView(sender: UIBarButtonItem) {
         self.dismiss(animated: true, completion: nil)
@@ -198,10 +248,6 @@ extension NCLoginWeb: WKNavigationDelegate {
         }
     }
 
-    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
-
-    }
-
     func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
 
         var errorMessage = error.localizedDescription
@@ -227,40 +273,7 @@ extension NCLoginWeb: WKNavigationDelegate {
     }
 
     func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
-
         decisionHandler(.allow)
-
-        /* TEST NOT GOOD DON'T WORKS
-        
-         if let data = navigationAction.request.httpBody {
-             let str = String(decoding: data, as: UTF8.self)
-             print(str)
-         }
-         
-         guard let url = navigationAction.request.url else {
-            decisionHandler(.allow)
-            return
-        }
-        
-        if String(describing: url).hasPrefix(NCBrandOptions.shared.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)
-        */
     }
 
     func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {

+ 14 - 0
iOSClient/NCGlobal.swift

@@ -399,4 +399,18 @@ class NCGlobal: NSObject {
     let widgetActionScanDocument                                = URL(string: "nextcloud://open-action?action=add-scan-document")!
     let widgetActionTextDocument                                = URL(string: "nextcloud://open-action?action=create-text-document")!
     let widgetActionVoiceMemo                                   = URL(string: "nextcloud://open-action?action=create-voice-memo")!
+    
+    // APPCONFIG
+    //
+    let configuration_brand                                     = "brand"
+
+    let configuration_serverUrl                                 = "serverUrl"
+    let configuration_username                                  = "username"
+    let configuration_password                                  = "password"
+    let configuration_apppassword                               = "apppassword"
+    
+    let configuration_disable_intro                             = "disableintro"
+    let configuration_disable_multiaccount                      = "disablemultiaccount"
+    let configuration_disable_crash_service                     = "disablecrashservice"
+    let configuration_disable_log                               = "disablelog"
 }