diff options
Diffstat (limited to 'components/proximity_auth/webui/proximity_auth_webui_handler.cc')
-rw-r--r-- | components/proximity_auth/webui/proximity_auth_webui_handler.cc | 141 |
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 |