Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Unified Diff: components/signin/core/browser/webdata/token_service_table.cc

Issue 2672603003: Avoid loading an empty token when decrypt failed (Closed)
Patch Set: Histograms Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..f8f2be502006e53691113bdf4daac568d2fd6851 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/histogram_macros.h"
#include "components/os_crypt/os_crypt.h"
#include "components/webdata/common/web_database.h"
#include "sql/statement.h"
@@ -21,6 +22,14 @@ WebDatabaseTable::TypeKey GetKey() {
return reinterpret_cast<void*>(&table_key);
}
+// Entries in the |Signin.TokenTable.ReadTokenFromDB| histogram.
+enum ReadOneTokenEnum {
+ READ_ONE_TOKEN_SUCCESS,
+ READ_ONE_TOKEN_DB_SUCCESS_DECRYPT_FAILED,
+ READ_ONE_TOKEN_DB_FAILED_BAD_ENTRY,
+ READ_ONE_TOKEN_MAX_VALUE
+};
+
} // namespace
TokenServiceTable* TokenServiceTable::FromWebDatabase(WebDatabase* db) {
@@ -93,8 +102,13 @@ bool TokenServiceTable::GetAllTokens(
sql::Statement s(db_->GetUniqueStatement(
"SELECT service, encrypted_token FROM token_service"));
- if (!s.is_valid())
+ UMA_HISTOGRAM_BOOLEAN("Signin.TokenTable.GetAllTokensSqlStatement",
+ s.is_valid());
+
+ if (!s.is_valid()) {
+ LOG(ERROR) << "Failed to load tokens (invalid SQL statement).";
return false;
+ }
while (s.Step()) {
std::string encrypted_token;
@@ -104,10 +118,24 @@ 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;
+ UMA_HISTOGRAM_ENUMERATION("Signin.TokenTable.ReadTokenFromDB",
+ READ_ONE_TOKEN_SUCCESS,
+ READ_ONE_TOKEN_MAX_VALUE);
+ } 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;
+ UMA_HISTOGRAM_ENUMERATION("Signin.TokenTable.ReadTokenFromDB",
+ READ_ONE_TOKEN_DB_SUCCESS_DECRYPT_FAILED,
+ READ_ONE_TOKEN_MAX_VALUE);
+ }
} else {
- NOTREACHED();
+ LOG(ERROR) << "Bad token entry for service " << service;
+ UMA_HISTOGRAM_ENUMERATION("Signin.TokenTable.ReadTokenFromDB",
+ READ_ONE_TOKEN_DB_FAILED_BAD_ENTRY,
+ READ_ONE_TOKEN_MAX_VALUE);
Alexei Svitkine (slow) 2017/02/06 15:35:51 Please refactor the code so that this macro only a
msarda 2017/02/06 16:59:27 Done.
return false;
}
}

Powered by Google App Engine
This is Rietveld 408576698