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/password_manager/password_syncable_service.h" | 5 #include "chrome/browser/password_manager/password_syncable_service.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #include "chrome/browser/password_manager/password_store.h" | 9 #include "chrome/browser/password_manager/password_store.h" |
10 #include "components/autofill/core/common/password_form.h" | 10 #include "components/autofill/core/common/password_form.h" |
11 #include "net/base/escape.h" | 11 #include "net/base/escape.h" |
12 #include "sync/api/sync_error_factory.h" | 12 #include "sync/api/sync_error_factory.h" |
13 | 13 |
14 namespace { | |
15 | |
16 // Converts the |PasswordSpecifics| obtained from sync to an | |
17 // object of type |PasswordForm|. | |
18 void ExtractPasswordFromSpecifics( | |
19 const sync_pb::PasswordSpecificsData& password, | |
20 autofill::PasswordForm* new_password) { | |
21 new_password->scheme = | |
22 static_cast<autofill::PasswordForm::Scheme>(password.scheme()); | |
23 new_password->signon_realm = password.signon_realm(); | |
24 new_password->origin = GURL(password.origin()); | |
25 new_password->action = GURL(password.action()); | |
26 new_password->username_element = | |
27 UTF8ToUTF16(password.username_element()); | |
28 new_password->password_element = | |
29 UTF8ToUTF16(password.password_element()); | |
30 new_password->username_value = | |
31 UTF8ToUTF16(password.username_value()); | |
32 new_password->password_value = | |
33 UTF8ToUTF16(password.password_value()); | |
34 new_password->ssl_valid = password.ssl_valid(); | |
35 new_password->preferred = password.preferred(); | |
36 new_password->date_created = | |
37 base::Time::FromInternalValue(password.date_created()); | |
38 new_password->blacklisted_by_user = | |
39 password.blacklisted(); | |
40 } | |
41 | |
42 // Merges the sync password (obtained from the password specifics) and | |
43 // local password and stores the output in the |new_password_form| pointer. | |
44 bool MergeLocalAndSyncPasswords( | |
45 const sync_pb::PasswordSpecificsData& password_specifics, | |
46 const autofill::PasswordForm& password_form, | |
47 autofill::PasswordForm* new_password_form) { | |
48 if (password_specifics.scheme() == password_form.scheme && | |
49 password_form.signon_realm == password_specifics.signon_realm() && | |
50 password_form.origin.spec() == password_specifics.origin() && | |
51 password_form.action.spec() == password_specifics.action() && | |
52 UTF16ToUTF8(password_form.username_element) == | |
53 password_specifics.username_element() && | |
54 UTF16ToUTF8(password_form.password_element) == | |
55 password_specifics.password_element() && | |
56 UTF16ToUTF8(password_form.username_value) == | |
57 password_specifics.username_value() && | |
58 UTF16ToUTF8(password_form.password_value) == | |
59 password_specifics.password_value() && | |
60 password_specifics.ssl_valid() == password_form.ssl_valid && | |
61 password_specifics.preferred() == password_form.preferred && | |
62 password_specifics.date_created() == | |
63 password_form.date_created.ToInternalValue() && | |
64 password_specifics.blacklisted() == | |
65 password_form.blacklisted_by_user) { | |
66 return false; | |
67 } | |
68 | |
69 // If the passwords differ, take the one that was created more recently. | |
70 if (base::Time::FromInternalValue(password_specifics.date_created()) <= | |
71 password_form.date_created) { | |
72 *new_password_form = password_form; | |
73 } else { | |
74 ExtractPasswordFromSpecifics(password_specifics, new_password_form); | |
75 } | |
76 | |
77 return true; | |
78 } | |
79 | |
80 } // namespace | |
81 | |
82 PasswordSyncableService::PasswordSyncableService( | 14 PasswordSyncableService::PasswordSyncableService( |
83 scoped_refptr<PasswordStore> password_store) | 15 scoped_refptr<PasswordStore> password_store) |
84 : password_store_(password_store) { | 16 : password_store_(password_store) { |
85 } | 17 } |
86 | 18 |
87 PasswordSyncableService::~PasswordSyncableService() {} | 19 PasswordSyncableService::~PasswordSyncableService() {} |
88 | 20 |
89 syncer::SyncMergeResult | 21 syncer::SyncMergeResult |
90 PasswordSyncableService::MergeDataAndStartSyncing( | 22 PasswordSyncableService::MergeDataAndStartSyncing( |
91 syncer::ModelType type, | 23 syncer::ModelType type, |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 // static | 131 // static |
200 std::string PasswordSyncableService::MakeTag( | 132 std::string PasswordSyncableService::MakeTag( |
201 const sync_pb::PasswordSpecificsData& password) { | 133 const sync_pb::PasswordSpecificsData& password) { |
202 return MakeTag(password.origin(), | 134 return MakeTag(password.origin(), |
203 password.username_element(), | 135 password.username_element(), |
204 password.username_value(), | 136 password.username_value(), |
205 password.password_element(), | 137 password.password_element(), |
206 password.signon_realm()); | 138 password.signon_realm()); |
207 } | 139 } |
208 | 140 |
OLD | NEW |