Chromium Code Reviews| Index: components/signin/core/browser/webdata/token_service_table.cc |
| diff --git a/components/signin/core/browser/webdata/token_service_table.cc b/components/signin/core/browser/webdata/token_service_table.cc |
| index d1ccb08da294425c9bd1aa0e34cd5f46088ef0bb..9333ba74cac8d5fc204dc5650b07b67aeb0e79a7 100644 |
| --- a/components/signin/core/browser/webdata/token_service_table.cc |
| +++ b/components/signin/core/browser/webdata/token_service_table.cc |
| @@ -8,6 +8,7 @@ |
| #include <string> |
| #include "base/logging.h" |
| +#include "base/metrics/user_metrics.h" |
| #include "components/os_crypt/os_crypt.h" |
| #include "components/webdata/common/web_database.h" |
| #include "sql/statement.h" |
| @@ -93,8 +94,12 @@ bool TokenServiceTable::GetAllTokens( |
| sql::Statement s(db_->GetUniqueStatement( |
| "SELECT service, encrypted_token FROM token_service")); |
| - if (!s.is_valid()) |
| + if (!s.is_valid()) { |
| + LOG(ERROR) << "Failed to load tokens (invalid SQL statement)."; |
| + base::RecordAction( |
| + base::UserMetricsAction("Signin_TokenTable_GetAllTokensInvalidSql")); |
|
Alexei Svitkine (slow)
2017/02/02 17:22:13
These don't look like actions initiated by a user.
msarda
2017/02/06 10:36:47
Done.
|
| return false; |
| + } |
| while (s.Step()) { |
| std::string encrypted_token; |
| @@ -104,10 +109,20 @@ bool TokenServiceTable::GetAllTokens( |
| bool entry_ok = !service.empty() && |
| s.ColumnBlobAsString(1, &encrypted_token); |
| if (entry_ok) { |
| - OSCrypt::DecryptString(encrypted_token, &decrypted_token); |
| - (*tokens)[service] = decrypted_token; |
| + if (OSCrypt::DecryptString(encrypted_token, &decrypted_token)) { |
| + (*tokens)[service] = decrypted_token; |
| + base::RecordAction( |
| + base::UserMetricsAction("Signin_TokenTable_LoadTokenSuccess")); |
| + } else { |
| + // Chrome relies on native APIs to encrypt and decrypt the tokens which |
| + // may fail (see http://crbug.com/686485). |
| + LOG(ERROR) << "Failed to decrypt token for service " << service; |
| + base::RecordAction( |
| + base::UserMetricsAction("Signin_TokenTable_DecryptFailed")); |
| + } |
| } else { |
| - NOTREACHED(); |
| + LOG(ERROR) << "Bad token entry for service " << service; |
| + base::RecordAction(base::UserMetricsAction("Signin_TokenTable_BadEntry")); |
| return false; |
| } |
| } |