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
3 // found in the LICENSE file.
5 #ifndef COMPONENTS_AUTOFILL_CORE_COMMON_PASSWORD_FORM_H__
6 #define COMPONENTS_AUTOFILL_CORE_COMMON_PASSWORD_FORM_H__
12 #include "base/time/time.h"
13 #include "components/autofill/core/common/form_data.h"
18 // The PasswordForm struct encapsulates information about a login form,
19 // which can be an HTML form or a dialog with username/password text fields.
21 // The Web Data database stores saved username/passwords and associated form
22 // metdata using a PasswordForm struct, typically one that was created from
23 // a parsed HTMLFormElement or LoginDialog, but the saved entries could have
24 // also been created by imported data from another browser.
26 // The PasswordManager implements a fuzzy-matching algorithm to compare saved
27 // PasswordForm entries against PasswordForms that were created from a parsed
28 // HTML or dialog form. As one might expect, the more data contained in one
29 // of the saved PasswordForms, the better the job the PasswordManager can do
30 // in matching it against the actual form it was saved on, and autofill
31 // accurately. But it is not always possible, especially when importing from
32 // other browsers with different data models, to copy over all the information
33 // about a particular "saved password entry" to our PasswordForm
36 // The field descriptions in the struct specification below are intended to
37 // describe which fields are not strictly required when adding a saved password
38 // entry to the database and how they can affect the matching process.
41 // Enum to differentiate between HTML form based authentication, and dialogs
42 // using basic or digest schemes. Default is SCHEME_HTML. Only PasswordForms
43 // of the same Scheme will be matched/autofilled against each other.
49 SCHEME_LAST
= SCHEME_OTHER
52 // The "Realm" for the sign-on (scheme, host, port for SCHEME_HTML, and
53 // contains the HTTP realm for dialog-based forms).
54 // The signon_realm is effectively the primary key used for retrieving
55 // data from the database, so it must not be empty.
56 std::string signon_realm
;
58 // The original "Realm" for the sign-on (scheme, host, port for SCHEME_HTML,
59 // and contains the HTTP realm for dialog-based forms). This realm is only set
60 // when two PasswordForms are matched when trying to find a login/pass pair
61 // for a site. It is only set to a non-empty value during a match of the
62 // original stored login/pass and the current observed form if all these
63 // statements are true:
64 // 1) The full signon_realm is not the same.
65 // 2) The registry controlled domain is the same. For example; example.com,
66 // m.example.com, foo.login.example.com and www.example.com would all resolve
67 // to example.com since .com is the public suffix.
68 // 3) The scheme is the same.
69 // 4) The port is the same.
70 // For example, if there exists a stored password for http://www.example.com
71 // (where .com is the public suffix) and the observed form is
72 // http://m.example.com, |original_signon_realm| must be set to
73 // http://www.example.com.
74 std::string original_signon_realm
;
76 // The URL (minus query parameters) containing the form. This is the primary
77 // data used by the PasswordManager to decide (in longest matching prefix
78 // fashion) whether or not a given PasswordForm result from the database is a
79 // good fit for a particular form on a page, so it must not be empty.
82 // The action target of the form. This is the primary data used by the
83 // PasswordManager for form autofill; that is, the action of the saved
84 // credentials must match the action of the form on the page to be autofilled.
85 // If this is empty / not available, it will result in a "restricted"
86 // IE-like autofill policy, where we wait for the user to type in his
87 // username before autofilling the password. In these cases, after successful
88 // login the action URL will automatically be assigned by the
91 // When parsing an HTML form, this must always be set.
94 // The name of the submit button used. Optional; only used in scoring
95 // of PasswordForm results from the database to make matches as tight as
98 // When parsing an HTML form, this must always be set.
99 base::string16 submit_element
;
101 // The name of the username input element. Optional (improves scoring).
103 // When parsing an HTML form, this must always be set.
104 base::string16 username_element
;
106 // The username. Optional.
108 // When parsing an HTML form, this is typically empty unless the site
109 // has implemented some form of autofill.
110 base::string16 username_value
;
112 // This member is populated in cases where we there are multiple input
113 // elements that could possibly be the username. Used when our heuristics for
114 // determining the username are incorrect. Optional.
116 // When parsing an HTML form, this is typically empty.
117 std::vector
<base::string16
> other_possible_usernames
;
119 // The name of the password input element, Optional (improves scoring).
121 // When parsing an HTML form, this must always be set.
122 base::string16 password_element
;
124 // The password. Required.
126 // When parsing an HTML form, this is typically empty.
127 base::string16 password_value
;
129 // False if autocomplete is set to "off" for the password input element;
131 bool password_autocomplete_set
;
133 // If the form was a change password form, the name of the
134 // 'old password' input element. Optional.
135 base::string16 old_password_element
;
137 // The old password. Optional.
138 base::string16 old_password_value
;
140 // Whether or not this login was saved under an HTTPS session with a valid
141 // SSL cert. We will never match or autofill a PasswordForm where
142 // ssl_valid == true with a PasswordForm where ssl_valid == false. This means
143 // passwords saved under HTTPS will never get autofilled onto an HTTP page.
144 // When importing, this should be set to true if the page URL is HTTPS, thus
145 // giving it "the benefit of the doubt" that the SSL cert was valid when it
146 // was saved. Default to false.
149 // True if this PasswordForm represents the last username/password login the
150 // user selected to log in to the site. If there is only one saved entry for
151 // the site, this will always be true, but when there are multiple entries
152 // the PasswordManager ensures that only one of them has a preferred bit set
153 // to true. Default to false.
155 // When parsing an HTML form, this is not used.
158 // When the login was saved (by chrome).
160 // When parsing an HTML form, this is not used.
161 base::Time date_created
;
163 // When the login was downloaded from the sync server. For local passwords is
166 // When parsing an HTML form, this is not used.
167 base::Time date_synced
;
169 // Tracks if the user opted to never remember passwords for this form. Default
172 // When parsing an HTML form, this is not used.
173 bool blacklisted_by_user
;
175 // Enum to differentiate between manually filled forms and forms with auto
176 // generated passwords.
180 TYPE_LAST
= TYPE_GENERATED
183 // The form type. Not used yet. Please see http://crbug.com/152422
186 // The number of times that this username/password has been used to
187 // authenticate the user.
189 // When parsing an HTML form, this is not used.
192 // True if additional system level authentication should be used
193 // (if available) before using this password for autofill.
196 bool use_additional_authentication
;
198 // Autofill representation of this form. Used to communicate with the
199 // Autofill servers if necessary. Currently this is only used to help
200 // determine forms where we can trigger password generation.
202 // When parsing an HTML form, this is normally set.
205 // Returns true if this match was found using public suffix matching.
206 bool IsPublicSuffixMatch() const;
208 // Equality operators for testing.
209 bool operator==(const PasswordForm
& form
) const;
210 bool operator!=(const PasswordForm
& form
) const;
216 // Map username to PasswordForm* for convenience. See password_form_manager.h.
217 typedef std::map
<base::string16
, PasswordForm
*> PasswordFormMap
;
220 std::ostream
& operator<<(std::ostream
& os
,
221 const autofill::PasswordForm
& form
);
223 } // namespace autofill
225 #endif // COMPONENTS_AUTOFILL_CORE_COMMON_PASSWORD_FORM_H__