summaryrefslogtreecommitdiffstats
path: root/components/proximity_auth/webui/proximity_auth_webui_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'components/proximity_auth/webui/proximity_auth_webui_handler.cc')
-rw-r--r--components/proximity_auth/webui/proximity_auth_webui_handler.cc141
1 files changed, 138 insertions, 3 deletions
diff --git a/components/proximity_auth/webui/proximity_auth_webui_handler.cc b/components/proximity_auth/webui/proximity_auth_webui_handler.cc
index 4f51a9f..3e73c51 100644
--- a/components/proximity_auth/webui/proximity_auth_webui_handler.cc
+++ b/components/proximity_auth/webui/proximity_auth_webui_handler.cc
@@ -6,10 +6,14 @@
#include "base/bind.h"
#include "base/i18n/time_formatting.h"
+#include "base/prefs/pref_service.h"
+#include "base/time/default_clock.h"
#include "base/values.h"
#include "components/proximity_auth/cryptauth/base64url.h"
+#include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h"
#include "components/proximity_auth/cryptauth/proto/cryptauth_api.pb.h"
#include "components/proximity_auth/logging/logging.h"
+#include "components/proximity_auth/webui/cryptauth_enroller_factory_impl.h"
#include "components/proximity_auth/webui/proximity_auth_ui_delegate.h"
#include "content/public/browser/web_ui.h"
@@ -24,6 +28,13 @@ const char kLogMessageFileKey[] = "file";
const char kLogMessageLineKey[] = "line";
const char kLogMessageSeverityKey[] = "severity";
+// Keys in the JSON representation of a SyncState object for enrollment or
+// device sync.
+const char kSyncStateLastSuccessTime[] = "lastSuccessTime";
+const char kSyncStateNextRefreshTime[] = "nextRefreshTime";
+const char kSyncStateRecoveringFromFailure[] = "recoveringFromFailure";
+const char kSyncStateOperationInProgress[] = "operationInProgress";
+
// Converts |log_message| to a raw dictionary value used as a JSON argument to
// JavaScript functions.
scoped_ptr<base::DictionaryValue> LogMessageToDictionary(
@@ -88,12 +99,13 @@ scoped_ptr<base::DictionaryValue> IneligibleDeviceToDictionary(
ProximityAuthWebUIHandler::ProximityAuthWebUIHandler(
ProximityAuthUIDelegate* delegate)
: delegate_(delegate), weak_ptr_factory_(this) {
- LogBuffer::GetInstance()->AddObserver(this);
cryptauth_client_factory_ = delegate_->CreateCryptAuthClientFactory();
}
ProximityAuthWebUIHandler::~ProximityAuthWebUIHandler() {
LogBuffer::GetInstance()->RemoveObserver(this);
+ if (enrollment_manager_)
+ enrollment_manager_->RemoveObserver(this);
}
void ProximityAuthWebUIHandler::RegisterMessages() {
@@ -109,6 +121,18 @@ void ProximityAuthWebUIHandler::RegisterMessages() {
"findEligibleUnlockDevices",
base::Bind(&ProximityAuthWebUIHandler::FindEligibleUnlockDevices,
base::Unretained(this)));
+
+ web_ui()->RegisterMessageCallback(
+ "getEnrollmentState",
+ base::Bind(&ProximityAuthWebUIHandler::GetEnrollmentState,
+ base::Unretained(this)));
+
+ web_ui()->RegisterMessageCallback(
+ "forceEnrollment", base::Bind(&ProximityAuthWebUIHandler::ForceEnrollment,
+ base::Unretained(this)));
+
+ LogBuffer::GetInstance()->AddObserver(this);
+ InitEnrollmentManager();
}
void ProximityAuthWebUIHandler::OnLogMessageAdded(
@@ -123,12 +147,26 @@ void ProximityAuthWebUIHandler::OnLogBufferCleared() {
web_ui()->CallJavascriptFunction("LogBufferInterface.onLogBufferCleared");
}
+void ProximityAuthWebUIHandler::OnEnrollmentStarted() {
+ web_ui()->CallJavascriptFunction(
+ "SyncStateInterface.onEnrollmentStateChanged",
+ *GetEnrollmentStateDictionary());
+}
+
+void ProximityAuthWebUIHandler::OnEnrollmentFinished(bool success) {
+ scoped_ptr<base::DictionaryValue> enrollment_state =
+ GetEnrollmentStateDictionary();
+ PA_LOG(INFO) << "Enrollment attempt completed with success=" << success
+ << ":\n" << *enrollment_state;
+ web_ui()->CallJavascriptFunction(
+ "SyncStateInterface.onEnrollmentStateChanged", *enrollment_state);
+}
+
void ProximityAuthWebUIHandler::GetLogMessages(const base::ListValue* args) {
base::ListValue json_logs;
for (const auto& log : *LogBuffer::GetInstance()->logs()) {
json_logs.Append(LogMessageToDictionary(log).release());
}
-
web_ui()->CallJavascriptFunction("LogBufferInterface.onGotLogMessages",
json_logs);
}
@@ -141,7 +179,6 @@ void ProximityAuthWebUIHandler::ClearLogBuffer(const base::ListValue* args) {
void ProximityAuthWebUIHandler::FindEligibleUnlockDevices(
const base::ListValue* args) {
- PA_LOG(INFO) << "Finding eligible unlock devices...";
cryptauth_client_ = cryptauth_client_factory_->CreateInstance();
cryptauth::FindEligibleUnlockDevicesRequest request;
@@ -154,6 +191,74 @@ void ProximityAuthWebUIHandler::FindEligibleUnlockDevices(
weak_ptr_factory_.GetWeakPtr()));
}
+void ProximityAuthWebUIHandler::ForceEnrollment(const base::ListValue* args) {
+ if (enrollment_manager_) {
+ enrollment_manager_->ForceEnrollmentNow(
+ cryptauth::INVOCATION_REASON_MANUAL);
+ }
+}
+
+void ProximityAuthWebUIHandler::InitEnrollmentManager() {
+#if defined(OS_CHROMEOS)
+ // TODO(tengs): We initialize a CryptAuthEnrollmentManager here for
+ // development and testing purposes until it is ready to be moved into Chrome.
+ // The public/private key pair has been generated and serialized in a previous
+ // session.
+ std::string user_public_key;
+ Base64UrlDecode(
+ "CAESRgohAD1lP_wgQ8XqVVwz4aK_89SqdvAQG5L_NZH5zXxwg5UbEiEAZFMlgCZ9h8OlyE4"
+ "QYKY5oiOBu0FmLSKeTAXEq2jnVJI=",
+ &user_public_key);
+
+ std::string user_private_key;
+ Base64UrlDecode(
+ "MIIBeQIBADCCAQMGByqGSM49AgEwgfcCAQEwLAYHKoZIzj0BAQIhAP____8AAAABAAAAAAA"
+ "AAAAAAAAA________________MFsEIP____8AAAABAAAAAAAAAAAAAAAA______________"
+ "_8BCBaxjXYqjqT57PrvVV2mIa8ZR0GsMxTsPY7zjw-J9JgSwMVAMSdNgiG5wSTamZ44ROdJ"
+ "reBn36QBEEEaxfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpZP40Li_hp_m47n60p8"
+ "D54WK84zV2sxXs7LtkBoN79R9QIhAP____8AAAAA__________-85vqtpxeehPO5ysL8YyV"
+ "RAgEBBG0wawIBAQQgKZ4Dsm5xe4p5U2XPGxjrG376ZWWIa9E6r0y1BdjIntyhRANCAAQ9ZT"
+ "_8IEPF6lVcM-Giv_PUqnbwEBuS_zWR-c18cIOVG2RTJYAmfYfDpchOEGCmOaIjgbtBZi0in"
+ "kwFxKto51SS",
+ &user_private_key);
+
+ // This serialized DeviceInfo proto was previously captured from a real
+ // CryptAuth enrollment, and is replayed here for testing purposes.
+ std::string serialized_device_info;
+ Base64UrlDecode(
+ "IkoIARJGCiEAX_ZjLSq73EVcrarX-7l7No7nSP86GEC322ocSZKqUKwSIQDbEDu9KN7AgLM"
+ "v_lzZZNui9zSOgXCeDpLhS2tgrYVXijoEbGlua0IFZW4tVVNKSggBEkYKIQBf9mMtKrvcRV"
+ "ytqtf7uXs2judI_zoYQLfbahxJkqpQrBIhANsQO70o3sCAsy_-XNlk26L3NI6BcJ4OkuFLa"
+ "2CthVeKam9Nb3ppbGxhLzUuMCAoWDExOyBDck9TIHg4Nl82NCA3MTM0LjAuMCkgQXBwbGVX"
+ "ZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQ1LjAuMjQyMi4wIFN"
+ "hZmFyaS81MzcuMzZwLYoBAzEuMJABAZoBIG1rYWVtaWdob2xlYmNnY2hsa2JhbmttaWhrbm"
+ "9qZWFrsAHDPuoBHEJLZEluZWxFZk05VG1adGV3eTRGb19RV1Vicz2AAgKyBqIBQVBBOTFiS"
+ "FZDdlJJNGJFSXppMmFXOTBlZ044eHFBYkhWYnJwSVFuMTk3bWltd3RWWTZYN0JEcEI4Szg3"
+ "RjRubkJnejdLX1BQV2xkcUtDRVhiZkFiMGwyN1VaQXgtVjBWbEE4WlFwdkhETmpHVlh4RlV"
+ "WRDFNY1AzNTgtYTZ3eHRpVG5LQnpMTEVIT1F6Ujdpb0lUMzRtWWY1VmNhbmhPZDh3ugYgs9"
+ "7-c7qNUzzLeEqVCDXb_EaJ8wC3iie_Lpid44iuAh3CPo0CCugBCiMIARACGgi5wHHa82avM"
+ "ioQ7y8xhiUBs7Um73ZC1vQlzzIBABLAAeCqGnWF7RwtnmdfIQJoEqXoXrH1qLw4yqUAA1TW"
+ "M1qxTepJOdDHrh54eiejobW0SKpHqTlZIyiK3ObHAPdfzFum1l640RFdFGZTTTksZFqfD9O"
+ "dftoi0pMrApob4gXj8Pv2g22ArX55BiH56TkTIcDcEE3KKnA_2G0INT1y_clZvZfDw1n0WP"
+ "0Xdg1PLLCOb46WfDWUhHvUk3GzUce8xyxsjOkiZUNh8yvhFXaP2wJgVKVWInf0inuofo9Za"
+ "7p44hIgHgKJIr_4fuVs9Ojf0KcMzxoJTbFUGg58jglUAKFfJBLKPpMBeWEyOS5pQUdTNFZ1"
+ "bF9JVWY4YTJDSmJNbXFqaWpYUFYzaVV5dmJXSVRrR3d1bFRaVUs3RGVZczJtT0h5ZkQ1NWR"
+ "HRXEtdnJTdVc4VEZ2Z1haa2xhVEZTN0dqM2xCVUktSHd5Z0h6bHZHX2NGLWtzQmw0dXdveG"
+ "VPWE1hRlJ3WGJHVUU1Tm9sLS1mdkRIcGVZVnJR",
+ &serialized_device_info);
+ cryptauth::GcmDeviceInfo device_info;
+ device_info.ParseFromString(serialized_device_info);
+
+ enrollment_manager_.reset(new CryptAuthEnrollmentManager(
+ make_scoped_ptr(new base::DefaultClock()),
+ make_scoped_ptr(new CryptAuthEnrollerFactoryImpl(delegate_)),
+ user_public_key, user_private_key, device_info,
+ delegate_->GetPrefService()));
+ enrollment_manager_->AddObserver(this);
+ enrollment_manager_->Start();
+#endif
+}
+
void ProximityAuthWebUIHandler::OnCryptAuthClientError(
const std::string& error_message) {
PA_LOG(WARNING) << "CryptAuth request failed: " << error_message;
@@ -180,4 +285,34 @@ void ProximityAuthWebUIHandler::OnFoundEligibleUnlockDevices(
eligible_devices, ineligible_devices);
}
+void ProximityAuthWebUIHandler::GetEnrollmentState(
+ const base::ListValue* args) {
+ scoped_ptr<base::DictionaryValue> enrollment_state =
+ GetEnrollmentStateDictionary();
+ PA_LOG(INFO) << "Got Enrollment State: \n" << *enrollment_state;
+ web_ui()->CallJavascriptFunction("SyncStateInterface.onGotEnrollmentState",
+ *enrollment_state);
+}
+
+scoped_ptr<base::DictionaryValue>
+ProximityAuthWebUIHandler::GetEnrollmentStateDictionary() {
+ scoped_ptr<base::DictionaryValue> enrollment_state(
+ new base::DictionaryValue());
+
+ if (!enrollment_manager_)
+ return enrollment_state;
+
+ enrollment_state->SetDouble(
+ kSyncStateLastSuccessTime,
+ enrollment_manager_->GetLastEnrollmentTime().ToJsTime());
+ enrollment_state->SetDouble(
+ kSyncStateNextRefreshTime,
+ enrollment_manager_->GetTimeToNextAttempt().InMillisecondsF());
+ enrollment_state->SetBoolean(kSyncStateRecoveringFromFailure,
+ enrollment_manager_->IsRecoveringFromFailure());
+ enrollment_state->SetBoolean(kSyncStateOperationInProgress,
+ enrollment_manager_->IsEnrollmentInProgress());
+ return enrollment_state;
+}
+
} // namespace proximity_auth