summaryrefslogtreecommitdiffstats
path: root/ios/chrome/browser/passwords/credential_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'ios/chrome/browser/passwords/credential_manager.h')
-rw-r--r--ios/chrome/browser/passwords/credential_manager.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/ios/chrome/browser/passwords/credential_manager.h b/ios/chrome/browser/passwords/credential_manager.h
new file mode 100644
index 0000000..9a0efce
--- /dev/null
+++ b/ios/chrome/browser/passwords/credential_manager.h
@@ -0,0 +1,131 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_
+#define IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_
+
+#include <string>
+#include <vector>
+
+#import "base/mac/scoped_nsobject.h"
+#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/prefs/pref_member.h"
+#include "components/password_manager/core/browser/credential_manager_password_form_manager.h"
+#include "components/password_manager/core/browser/credential_manager_pending_request_task.h"
+#include "components/password_manager/core/browser/credential_manager_pending_require_user_mediation_task.h"
+#include "components/password_manager/core/browser/password_manager_client.h"
+#include "components/password_manager/core/browser/password_store.h"
+#include "ios/web/public/web_state/web_state_observer.h"
+
+@class JSCredentialManager;
+
+// Implements the app-side of the CredentialManagement JavaScript API.
+// Injects and listens to the injected JavaScript, owns and drives the user
+// interface, and integrates with the password manager. This is the iOS
+// equivalent of the upstream class CredentialManagerDispatcher. Note: Only
+// activates on iOS 8 and later.
+class CredentialManager
+ : public password_manager::CredentialManagerPasswordFormManagerDelegate,
+ public password_manager::CredentialManagerPendingRequestTaskDelegate,
+ public password_manager::
+ CredentialManagerPendingRequireUserMediationTaskDelegate,
+ public web::WebStateObserver {
+ public:
+ CredentialManager(web::WebState* web_state,
+ password_manager::PasswordManagerClient* client,
+ password_manager::PasswordManagerDriver* driver,
+ JSCredentialManager* js_manager);
+ ~CredentialManager() override;
+
+ // web::WebStateObserver:
+ void PageLoaded(
+ web::PageLoadCompletionStatus load_completion_status) override;
+ void CredentialsRequested(int request_id,
+ const GURL& source_url,
+ bool zero_click_only,
+ const std::vector<std::string>& federations,
+ bool is_user_initiated) override;
+ void SignedIn(int request_id,
+ const GURL& source_url,
+ const web::Credential& credential) override;
+ void SignedOut(int request_id, const GURL& source_url) override;
+ void WebStateDestroyed() override;
+
+ // password_manager::CredentialManagerPendingRequestTaskDelegate:
+ bool IsZeroClickAllowed() const override;
+ GURL GetOrigin() const override;
+ void SendCredential(
+ int id,
+ const password_manager::CredentialInfo& credential) override;
+ password_manager::PasswordManagerClient* client() const override;
+ autofill::PasswordForm GetSynthesizedFormForOrigin() const override;
+
+ // password_manager::CredentialManagerPendingRequireUserMediationTaskDelegate:
+ password_manager::PasswordStore* GetPasswordStore() override;
+ void DoneRequiringUserMediation() override;
+
+ // CredentialManagerPasswordFormManagerDelegate:
+ void OnProvisionalSaveComplete() override;
+
+ private:
+ // The errors that can cause a request to fail.
+ enum ErrorType {
+ // An existing request is outstanding.
+ ERROR_TYPE_PENDING_REQUEST = 0,
+
+ // The password store isn't available.
+ ERROR_TYPE_PASSWORD_STORE_UNAVAILABLE,
+
+ // The page origin is untrusted.
+ ERROR_TYPE_SECURITY_ERROR_UNTRUSTED_ORIGIN,
+ };
+
+ // Sends a message via |js_manager_| to resolve the JavaScript Promise
+ // associated with |request_id|. Invoked after a page-initiated credential
+ // event is acknowledged by the PasswordStore.
+ void ResolvePromise(int request_id);
+
+ // Sends a message via |js_manager_| to reject the JavaScript Promise
+ // associated with |request_id_| with the given |error_type|. Invoked after a
+ // page-initiated credential event, store, or retrieval fails.
+ void RejectPromise(int request_id, ErrorType error_type);
+
+ // Determines the currently loaded page's URL from the active WebState, but
+ // only if it is absolutely trusted. Does not hit the network, but still might
+ // be costly depending on the webview. Returns true if successful.
+ bool GetUrlWithAbsoluteTrust(GURL* page_url);
+
+ // The request to retrieve credentials from the PasswordStore.
+ scoped_ptr<password_manager::CredentialManagerPendingRequestTask>
+ pending_request_;
+
+ // The task to notify the password manager that the user was signed out.
+ scoped_ptr<password_manager::CredentialManagerPendingRequireUserMediationTask>
+ pending_require_user_mediation_;
+
+ // Saves credentials to the PasswordStore.
+ scoped_ptr<password_manager::CredentialManagerPasswordFormManager>
+ form_manager_;
+
+ // Injected JavaScript to provide the API to web pages.
+ base::scoped_nsobject<JSCredentialManager> js_manager_;
+
+ // Client to access Chrome-specific password manager functionality. Weak.
+ password_manager::PasswordManagerClient* client_;
+
+ // Driver to access embedder-specific password manager functionality. Weak.
+ password_manager::PasswordManagerDriver* driver_;
+
+ // Whether zero-click sign-in is enabled.
+ BooleanPrefMember zero_click_sign_in_enabled_;
+
+ // Weak pointer factory for asynchronously resolving requests.
+ base::WeakPtrFactory<CredentialManager> weak_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(CredentialManager);
+};
+
+#endif // IOS_CHROME_BROWSER_PASSWORDS_CREDENTIAL_MANAGER_H_