summaryrefslogtreecommitdiffstats
path: root/ios/chrome/browser/passwords/js_credential_manager.mm
diff options
context:
space:
mode:
authorvabr <vabr@chromium.org>2015-11-19 09:42:48 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-19 17:43:32 +0000
commitb0a8964d59e03ab82709c85dd4f201cd7d44d3ba (patch)
treedf0a7076bce54b21b1de221001fc5cbef686c15a /ios/chrome/browser/passwords/js_credential_manager.mm
parentc41ed1abe28b265bf0bd776876127ed999f7f772 (diff)
downloadchromium_src-b0a8964d59e03ab82709c85dd4f201cd7d44d3ba.zip
chromium_src-b0a8964d59e03ab82709c85dd4f201cd7d44d3ba.tar.gz
chromium_src-b0a8964d59e03ab82709c85dd4f201cd7d44d3ba.tar.bz2
Move JS-related password manager code upstream
Moves credential_manager.h credential_manager.mm js_credential_manager.h js_credential_manager.mm js_password_manager.h js_password_manager.mm resources/credential_manager.js resources/password_controller.js from the downstream to ios/chrome/browser/passwords. This is the upstream part of the internal CL 310987013. BUG=514241 Review URL: https://codereview.chromium.org/1456983002 Cr-Commit-Position: refs/heads/master@{#360617}
Diffstat (limited to 'ios/chrome/browser/passwords/js_credential_manager.mm')
-rw-r--r--ios/chrome/browser/passwords/js_credential_manager.mm103
1 files changed, 103 insertions, 0 deletions
diff --git a/ios/chrome/browser/passwords/js_credential_manager.mm b/ios/chrome/browser/passwords/js_credential_manager.mm
new file mode 100644
index 0000000..abdbd41d
--- /dev/null
+++ b/ios/chrome/browser/passwords/js_credential_manager.mm
@@ -0,0 +1,103 @@
+// 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.
+
+#import "ios/chrome/browser/passwords/js_credential_manager.h"
+
+#include "base/json/json_writer.h"
+#include "base/json/string_escape.h"
+#include "base/logging.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/values.h"
+#include "ios/web/public/web_state/js/credential_util.h"
+
+namespace {
+
+// Sanitizes |JSON| and wraps it in quotes so it can be injected safely in
+// JavaScript.
+NSString* JSONEscape(NSString* JSON) {
+ return base::SysUTF8ToNSString(
+ base::GetQuotedJSONString(base::SysNSStringToUTF8(JSON)));
+}
+
+} // namespace
+
+const char kCredentialsPendingRequestErrorType[] = "PendingRequestError";
+const char kCredentialsPendingRequestErrorMessage[] =
+ "There is already an outstanding request";
+const char kCredentialsSecurityErrorType[] = "SecurityError";
+const char kCredentialsPasswordStoreUnavailableErrorType[] =
+ "PasswordStoreUnavailableError";
+const char kCredentialsPasswordStoreUnavailableErrorMessage[] =
+ "The password store is unavailable";
+const char kCredentialsSecurityErrorMessageUntrustedOrigin[] =
+ "The origin is untrusted";
+
+@interface JSCredentialManager ()
+
+// Evaluates the JavaScript in |script|, which should evaluate to a JavaScript
+// boolean value. That value will be passed to |completionHandler|.
+- (void)evaluateScript:(NSString*)script
+ completionHandler:(void (^)(BOOL))completionHandler;
+
+@end
+
+@implementation JSCredentialManager
+
+- (void)resolvePromiseWithRequestID:(NSInteger)requestID
+ credential:(const web::Credential&)credential
+ completionHandler:(void (^)(BOOL))completionHandler {
+ base::DictionaryValue credentialData;
+ web::CredentialToDictionaryValue(credential, &credentialData);
+ std::string credentialDataJSON;
+ base::JSONWriter::Write(credentialData, &credentialDataJSON);
+ NSString* script = [NSString
+ stringWithFormat:@"__gCrWeb['credentialManager'].resolve(%ld, %@)",
+ static_cast<long>(requestID),
+ base::SysUTF8ToNSString(credentialDataJSON)];
+ [self evaluate:script
+ stringResultHandler:^(NSString* result, NSError* error) {
+ if (completionHandler)
+ completionHandler(!error && [result isEqualToString:@"true"]);
+ }];
+}
+
+- (void)resolvePromiseWithRequestID:(NSInteger)requestID
+ completionHandler:(void (^)(BOOL))completionHandler {
+ NSString* script =
+ [NSString stringWithFormat:@"__gCrWeb['credentialManager'].resolve(%ld)",
+ static_cast<long>(requestID)];
+ [self evaluateScript:script completionHandler:completionHandler];
+}
+
+- (void)rejectPromiseWithRequestID:(NSInteger)requestID
+ errorType:(NSString*)errorType
+ message:(NSString*)message
+ completionHandler:(void (^)(BOOL))completionHandler {
+ NSString* script = [NSString
+ stringWithFormat:@"__gCrWeb['credentialManager'].reject(%ld, %@, %@)",
+ static_cast<long>(requestID), JSONEscape(errorType),
+ JSONEscape(message)];
+ [self evaluateScript:script completionHandler:completionHandler];
+}
+
+- (void)evaluateScript:(NSString*)script
+ completionHandler:(void (^)(BOOL))completionHandler {
+ [self evaluate:script
+ stringResultHandler:^(NSString* result, NSError* error) {
+ if (completionHandler)
+ completionHandler(!error && [result isEqualToString:@"true"]);
+ }];
+}
+
+#pragma mark - Protected methods
+
+- (NSString*)scriptPath {
+ return @"credential_manager";
+}
+
+- (NSString*)presenceBeacon {
+ return @"__gCrWeb.credentialManager";
+}
+
+@end