Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/login/managed/supervised_user_authentication.h " | 5 #include "chrome/browser/chromeos/login/managed/supervised_user_authentication.h " |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/json/json_file_value_serializer.h" | 9 #include "base/json/json_file_value_serializer.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 std::string raw_result(out_bytes, out_bytes + sizeof(out_bytes)); | 95 std::string raw_result(out_bytes, out_bytes + sizeof(out_bytes)); |
| 96 | 96 |
| 97 std::string result; | 97 std::string result; |
| 98 base::Base64Encode(raw_result, &result); | 98 base::Base64Encode(raw_result, &result); |
| 99 return result; | 99 return result; |
| 100 } | 100 } |
| 101 | 101 |
| 102 base::DictionaryValue* LoadPasswordData(base::FilePath profile_dir) { | 102 base::DictionaryValue* LoadPasswordData(base::FilePath profile_dir) { |
| 103 JSONFileValueSerializer serializer(profile_dir.Append(kPasswordUpdateFile)); | 103 JSONFileValueSerializer serializer(profile_dir.Append(kPasswordUpdateFile)); |
| 104 std::string error_message; | 104 std::string error_message; |
| 105 int error_code; | 105 int error_code = JSONFileValueSerializer::JSON_NO_ERROR; |
| 106 scoped_ptr<base::Value> value( | 106 scoped_ptr<base::Value> value( |
| 107 serializer.Deserialize(&error_code, &error_message)); | 107 serializer.Deserialize(&error_code, &error_message)); |
| 108 if (JSONFileValueSerializer::JSON_NO_ERROR != error_code) { | 108 if (JSONFileValueSerializer::JSON_NO_ERROR != error_code) { |
| 109 LOG(ERROR) << "Could not deserialize password data, error = " << error_code | |
| 110 << " / " << error_message; | |
| 109 return NULL; | 111 return NULL; |
| 110 } | 112 } |
| 111 base::DictionaryValue* result; | 113 base::DictionaryValue* result; |
| 112 if (!value->GetAsDictionary(&result)) { | 114 if (!value->GetAsDictionary(&result)) { |
| 115 NOTREACHED(); | |
|
Bernhard Bauer
2014/04/02 14:05:28
In general, having a NOTREACHED() is an indication
Denis Kuznetsov (DE-MUC)
2014/04/02 14:48:51
Done.
| |
| 113 return NULL; | 116 return NULL; |
| 114 } | 117 } |
| 115 value.Pass(); | 118 // Ignore unused result warning. |
|
Nikita (slow)
2014/04/02 14:18:20
nit: Add empty line before, place comment into {}
Denis Kuznetsov (DE-MUC)
2014/04/02 14:48:51
Done.
| |
| 119 if (value.release()) { | |
|
Bernhard Bauer
2014/04/02 14:05:28
base/macros.h has ignore_result().
Denis Kuznetsov (DE-MUC)
2014/04/02 14:48:51
Done.
| |
| 120 } | |
| 116 return result; | 121 return result; |
| 117 } | 122 } |
| 118 | 123 |
| 119 void OnPasswordDataLoaded( | 124 void OnPasswordDataLoaded( |
| 120 const SupervisedUserAuthentication::PasswordDataCallback& success_callback, | 125 const SupervisedUserAuthentication::PasswordDataCallback& success_callback, |
| 121 const base::Closure& failure_callback, | 126 const base::Closure& failure_callback, |
| 122 base::DictionaryValue* value) { | 127 base::DictionaryValue* value) { |
| 123 if (!value) { | 128 if (!value) { |
| 124 failure_callback.Run(); | 129 failure_callback.Run(); |
| 125 return; | 130 return; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 206 password_data->SetStringWithoutPathExpansion(kSalt, salt); | 211 password_data->SetStringWithoutPathExpansion(kSalt, salt); |
| 207 int revision = kMinPasswordRevision; | 212 int revision = kMinPasswordRevision; |
| 208 password_data->SetIntegerWithoutPathExpansion(kPasswordRevision, revision); | 213 password_data->SetIntegerWithoutPathExpansion(kPasswordRevision, revision); |
| 209 std::string salted_password = | 214 std::string salted_password = |
| 210 BuildPasswordForHashWithSaltSchema(salt, password); | 215 BuildPasswordForHashWithSaltSchema(salt, password); |
| 211 std::string base64_signature_key = BuildRawHMACKey(); | 216 std::string base64_signature_key = BuildRawHMACKey(); |
| 212 std::string base64_signature = | 217 std::string base64_signature = |
| 213 BuildPasswordSignature(salted_password, revision, base64_signature_key); | 218 BuildPasswordSignature(salted_password, revision, base64_signature_key); |
| 214 password_data->SetStringWithoutPathExpansion(kEncryptedPassword, | 219 password_data->SetStringWithoutPathExpansion(kEncryptedPassword, |
| 215 salted_password); | 220 salted_password); |
| 221 password_data->SetStringWithoutPathExpansion(kPasswordSignature, | |
| 222 base64_signature); | |
| 216 | 223 |
| 217 extra_data->SetStringWithoutPathExpansion(kPasswordEncryptionKey, | 224 extra_data->SetStringWithoutPathExpansion(kPasswordEncryptionKey, |
| 218 BuildRawHMACKey()); | 225 BuildRawHMACKey()); |
| 219 extra_data->SetStringWithoutPathExpansion(kPasswordSignatureKey, | 226 extra_data->SetStringWithoutPathExpansion(kPasswordSignatureKey, |
| 220 base64_signature_key); | 227 base64_signature_key); |
| 221 return true; | 228 return true; |
| 222 } | 229 } |
| 223 NOTREACHED(); | 230 NOTREACHED(); |
| 224 return false; | 231 return false; |
| 225 } | 232 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 259 if (holder.GetIntegerWithoutPathExpansion(kSchemaVersion, | 266 if (holder.GetIntegerWithoutPathExpansion(kSchemaVersion, |
| 260 &schema_version_index)) { | 267 &schema_version_index)) { |
| 261 schema_version = static_cast<Schema>(schema_version_index); | 268 schema_version = static_cast<Schema>(schema_version_index); |
| 262 } | 269 } |
| 263 return schema_version; | 270 return schema_version; |
| 264 } | 271 } |
| 265 | 272 |
| 266 bool SupervisedUserAuthentication::NeedPasswordChange( | 273 bool SupervisedUserAuthentication::NeedPasswordChange( |
| 267 const std::string& user_id, | 274 const std::string& user_id, |
| 268 const base::DictionaryValue* password_data) { | 275 const base::DictionaryValue* password_data) { |
| 269 | |
| 270 base::DictionaryValue local; | 276 base::DictionaryValue local; |
| 271 owner_->GetPasswordInformation(user_id, &local); | 277 owner_->GetPasswordInformation(user_id, &local); |
| 272 int local_schema = SCHEMA_PLAIN; | 278 int local_schema = SCHEMA_PLAIN; |
| 273 int local_revision = kMinPasswordRevision; | 279 int local_revision = kMinPasswordRevision; |
| 274 int updated_schema = SCHEMA_PLAIN; | 280 int updated_schema = SCHEMA_PLAIN; |
| 275 int updated_revision = kMinPasswordRevision; | 281 int updated_revision = kMinPasswordRevision; |
| 276 local.GetIntegerWithoutPathExpansion(kSchemaVersion, &local_schema); | 282 local.GetIntegerWithoutPathExpansion(kSchemaVersion, &local_schema); |
| 277 local.GetIntegerWithoutPathExpansion(kPasswordRevision, &local_revision); | 283 local.GetIntegerWithoutPathExpansion(kPasswordRevision, &local_revision); |
| 278 password_data->GetIntegerWithoutPathExpansion(kSchemaVersion, | 284 password_data->GetIntegerWithoutPathExpansion(kSchemaVersion, |
| 279 &updated_schema); | 285 &updated_schema); |
| 280 password_data->GetIntegerWithoutPathExpansion(kPasswordRevision, | 286 password_data->GetIntegerWithoutPathExpansion(kPasswordRevision, |
| 281 &updated_revision); | 287 &updated_revision); |
| 288 LOG(ERROR) << "-----5"; | |
|
Bernhard Bauer
2014/04/02 14:05:28
Please remove.
Denis Kuznetsov (DE-MUC)
2014/04/02 14:48:51
Done.
| |
| 282 if (updated_schema > local_schema) | 289 if (updated_schema > local_schema) |
| 283 return true; | 290 return true; |
| 284 DCHECK_EQ(updated_schema, local_schema); | 291 DCHECK_EQ(updated_schema, local_schema); |
| 285 return updated_revision > local_revision; | 292 return updated_revision > local_revision; |
| 286 } | 293 } |
| 287 | 294 |
| 288 void SupervisedUserAuthentication::ScheduleSupervisedPasswordChange( | 295 void SupervisedUserAuthentication::ScheduleSupervisedPasswordChange( |
| 289 const std::string& supervised_user_id, | 296 const std::string& supervised_user_id, |
| 290 const base::DictionaryValue* password_data) { | 297 const base::DictionaryValue* password_data) { |
| 291 const User* user = UserManager::Get()->FindUser(supervised_user_id); | 298 const User* user = UserManager::Get()->FindUser(supervised_user_id); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 | 333 |
| 327 bool SupervisedUserAuthentication::HasIncompleteKey( | 334 bool SupervisedUserAuthentication::HasIncompleteKey( |
| 328 const std::string& user_id) { | 335 const std::string& user_id) { |
| 329 base::DictionaryValue holder; | 336 base::DictionaryValue holder; |
| 330 owner_->GetPasswordInformation(user_id, &holder); | 337 owner_->GetPasswordInformation(user_id, &holder); |
| 331 bool incomplete_key = false; | 338 bool incomplete_key = false; |
| 332 holder.GetBoolean(kHasIncompleteKey, &incomplete_key); | 339 holder.GetBoolean(kHasIncompleteKey, &incomplete_key); |
| 333 return incomplete_key; | 340 return incomplete_key; |
| 334 } | 341 } |
| 335 | 342 |
| 336 void SupervisedUserAuthentication::MarkKeyIncomplete( | 343 void SupervisedUserAuthentication::MarkKeyIncomplete(const std::string& user_id, |
| 337 const std::string& user_id) { | 344 bool incomplete) { |
| 338 base::DictionaryValue holder; | 345 base::DictionaryValue holder; |
| 339 owner_->GetPasswordInformation(user_id, &holder); | 346 owner_->GetPasswordInformation(user_id, &holder); |
| 340 holder.SetBoolean(kHasIncompleteKey, true); | 347 holder.SetBoolean(kHasIncompleteKey, incomplete); |
| 341 owner_->SetPasswordInformation(user_id, &holder); | 348 owner_->SetPasswordInformation(user_id, &holder); |
| 342 } | 349 } |
| 343 | 350 |
| 344 void SupervisedUserAuthentication::LoadPasswordUpdateData( | 351 void SupervisedUserAuthentication::LoadPasswordUpdateData( |
| 345 const std::string& user_id, | 352 const std::string& user_id, |
| 346 const PasswordDataCallback& success_callback, | 353 const PasswordDataCallback& success_callback, |
| 347 const base::Closure& failure_callback) { | 354 const base::Closure& failure_callback) { |
| 348 const User* user = UserManager::Get()->FindUser(user_id); | 355 const User* user = UserManager::Get()->FindUser(user_id); |
| 349 base::FilePath profile_path = | 356 base::FilePath profile_path = |
| 350 ProfileHelper::GetProfilePathByUserIdHash(user->username_hash()); | 357 ProfileHelper::GetProfilePathByUserIdHash(user->username_hash()); |
| 351 PostTaskAndReplyWithResult( | 358 PostTaskAndReplyWithResult( |
| 352 content::BrowserThread::GetBlockingPool(), | 359 content::BrowserThread::GetBlockingPool(), |
| 353 FROM_HERE, | 360 FROM_HERE, |
| 354 base::Bind(&LoadPasswordData, profile_path), | 361 base::Bind(&LoadPasswordData, profile_path), |
| 355 base::Bind(&OnPasswordDataLoaded, success_callback, failure_callback)); | 362 base::Bind(&OnPasswordDataLoaded, success_callback, failure_callback)); |
| 356 } | 363 } |
| 357 | 364 |
| 358 } // namespace chromeos | 365 } // namespace chromeos |
| OLD | NEW |