diff options
author | vabr <vabr@chromium.org> | 2015-11-19 09:42:48 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-19 17:43:32 +0000 |
commit | b0a8964d59e03ab82709c85dd4f201cd7d44d3ba (patch) | |
tree | df0a7076bce54b21b1de221001fc5cbef686c15a /ios/chrome/browser/passwords/js_credential_manager.mm | |
parent | c41ed1abe28b265bf0bd776876127ed999f7f772 (diff) | |
download | chromium_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.mm | 103 |
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 |