File: password_specifics.proto

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (369 lines) | stat: -rw-r--r-- 15,668 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Sync protocol datatype extension for password data.

// If you change or add any fields in this file, update proto_visitors.h and
// potentially proto_enum_conversions.{h, cc}.

syntax = "proto2";

option java_multiple_files = true;
option java_package = "org.chromium.components.sync.protocol";

option optimize_for = LITE_RUNTIME;

package sync_pb;

import "components/sync/protocol/encryption.proto";

// These are the properties that get serialized into the `encrypted` field of
// PasswordSpecifics. They correspond to fields in
// password_manager::PasswordForm.
//
// Sync unique tag is calculated as
// EscapePath(origin) + "|" +
// EscapePath(username_element) + "|" +
// EscapePath(username_value) + "|" +
// EscapePath(password_element) + "|" +
// EscapePath(signon_realm)
// where '+' is the string concatenation operation. EscapePath escapes a partial
// or complete file/pathname. This includes non-printable, non-7bit, and
// (including space) the following characters ' "#%:<>?[\]^`{|}'. The space
// character is encoded as '%20'.

// A simple example of PasswordSpecificsData, as created by Chrome for a web
// form that the user submitted. E.g. federated credentials or credentials for
// Android apps may have different fields set.
// PasswordSpecificsData {
//   action: "https://example.com/",
//   avatar_url: "",
//   blacklisted: false,
//   date_created: 13305119271948046,
//   date_last_used: 13305119270102691,
//   date_password_modified_windows_epoch_micros: 13305119271949070,
//   display_name: "",
//   federation_url: "",
//   notes: {},
//   origin: "https://rsolomakhin.github.io/autofill/",
//   password_element: "password",
//   password_issues: {},
//   password_value: "pwd",
//   scheme: 0,
//   signon_realm: "https://rsolomakhin.github.io/",
//   times_used: 0,
//   type: 0,
//   username_element: "username",
//   username_value: "Superman"
// }

// All the strings are encoded with UTF-8. URLs are encoded in Punycode.
message PasswordIssues {
  message PasswordIssue {
    // Timestamp set by a client detecting the issue for the first time.
    // Number of microseconds since Windows epoch (1601).
    // This can be unset even if is_muted is set in a few cases in
    // storage (for a time mutes were written without setting this
    // field - fixed starting 2021-11-10).
    optional uint64 date_first_detection_windows_epoch_micros = 1;

    // Whether the issue was muted by user.
    optional bool is_muted = 2;

    // Whether the backend should notify the user about this issue.
    // Set to true if the user hasn't already seen a client notification for
    // this issue (e.g. a leak detection prompt in Chrome). The backend sending
    // notifications does not reset this field. All other sources can write this
    // in both `PasswordSpecificsData` and `PasswordSpecificsMetadata` and do
    // so.
    optional bool trigger_notification_from_backend_on_detection = 3;
  }
  optional PasswordIssue leaked_password_issue = 1;
  optional PasswordIssue reused_password_issue = 2;
  optional PasswordIssue weak_password_issue = 3;
  optional PasswordIssue phished_password_issue = 4;
}

message PasswordSpecificsData {
    // The different types of the saved credential.
  enum Scheme {
    // SCHEME_HTML, the credential represents either a parsed HTML form, or an
    // android credential or a password saved through Credential Management API
    // (https://w3c.github.io/webappsec/specs/credentialmanagement/).
    SCHEME_HTML = 0;
    // SCHEME_BASIC, basic access http authentication.
    SCHEME_BASIC = 1;
    // SCHEME_DIGEST, digest access authentication.
    SCHEME_DIGEST = 2;
    // SCHEME_OTHER, another proxy access authentication.
    SCHEME_OTHER = 3;
    // USERNAME_ONLY, partial credentials saved on Android that contain only
    // username and miss the password.
    USERNAME_ONLY = 4;
  }
  // See the enum above.
  optional int32 scheme = 1;

  // Signon realm stores information on where the saved password was stored, and
  // where it's supposed to be filled again.
  //
  // It can take various formats depending on the exact circumstances where it
  // was recorded. Note that the format is *not* guaranteed to be a valid URL or
  // URI:
  //
  //  * For parsed web forms and normal passwords saved through Credential
  //  Manager
  //    API: <http-scheme>://<url-host>[:<url-port>]/
  //
  //    where
  //      <http-scheme> is one of "http" or "https"
  //      <url-host> is the host for which the password was stored
  //      <url-port> is the option port on the host
  //    The signon realm is a valid URL in this case with an empty path.
  //    Examples:
  //      http://www.example.com/
  //      https://127.0.0.1/
  //      http://www.google.com:8080/
  //      http://192.168.1.254/
  //      https://accounts.google.com/
  //
  //  * For Android apps saved through Autofill with Google:
  //      android://<hash-of-cert>@<package-name>/
  //    where
  //      <hash-of-cert> is the base64 encoded SHA512 of the app's public
  //      certificate <package-name> is the app's package name
  //    Examples:
  //      android://kCyQDzpaoAX2gs-1zdGPKNAeICb8LzRFOxa4NCq0jO8c8d_NFS_q-Y35bU3Nq3GmFV2lLurmNvIZa6YPYZwmWg==@com.pinterest/
  //      android://mNUCvTnoWBkzIhSSkVj-uzAdK42YagmCmyUtPoC6JPmYAN3wKpmTdIRsdJtz6pzNBye8XL7nBbEcx-y9CJeo9A==@com.twitter.android.lite/
  //
  //  * For federated credentials:
  //      federation://<origin_host>/<federation_host>
  //    where
  //      <origin_host> is the host for which the login information was stored
  //      <federation_host> is the host of the federation provider that was
  //        used to sign in
  //    Examples:
  //      federation://www.example.com/accounts.google.com
  //      federation://uk.trustpilot.com/www.facebook.com
  //
  //  * For proxy auth:
  //      <proxy-host>[:<proxy_port>]/<auth-realm>
  //    where
  //      <proxy-host> is the host of the proxy for which the password was
  //      stored
  //      <proxy-port> is the port of the proxy
  //      <auth-realm> is a string provided by the proxy during authentication.
  //      It can contain spaces.
  //    Examples:
  //      proxy2.eq.edu.au:80/MISldap
  //      proxy.det.nsw.edu.au:8080/NSW Department of Education
  //      10.47.2.250:3128/Squid Proxy Server CPUT
  //      default.go2https.com:443/(******Get password from vpnso.com/account/
  //      *****)
  //
  //  * For HTTP basic auth:
  //      <http-scheme>://<url-host>[:<url-port>]/<auth-realm>
  //    where
  //      <http-scheme> is one of "http" or "https"
  //      <url-host> is the host for which the password was stored
  //      <url-port> is the option port on the host
  //      <auth-realm> is a string provided by the host during authentication.
  //      It can contain spaces.
  //    Examples:
  //      http://192.168.1.1/Broadband Router
  //      http://192.168.0.1/TP-LINK Wireless N Router WR841N
  //      http://192.168.1.1/index.htm
  //      https://www.edge.asic.gov.au/ASIC eBusiness
  optional string signon_realm = 2;

  // For parsed web forms and Credential Management API:
  //     url-scheme://url-host[:url-port]/path
  // For Android: "android://<hash of cert>@<package name>/"
  // For proxy/HTTP auth: url-scheme://url-host[:url-port]/path
  optional string origin = 3;

  // Only for web-parsed forms - the action target of the form:
  //     url-scheme://url-host[:url-port]/path
  optional string action = 4;

  // Only for web-parsed forms - the name of the element containing username.
  optional string username_element = 5;

  // For all: the username.
  // For blacklisted forms: <empty>.
  optional string username_value = 6;

  // Only for web-parsed forms - the name of the element containing password.
  optional string password_element = 7;

  // For all: the password.
  // For federated logins and blacklisted forms: <empty>
  optional string password_value = 8;

  // Deprecated: http://crbug.com/413020
  // True if the credential was saved for a HTTPS session with a valid SSL cert.
  // Ignored for Android apps.
  optional bool ssl_valid = 9 [deprecated = true];

  // True for the last credential used for logging in on a given site.
  // Deprecated in M81.
  optional bool preferred = 10 [deprecated = true];

  // Time when the credential was created. Amount of microseconds since 1601.
  optional int64 date_created = 11;

  // True, if user chose permanently not to save the credentials for the form.
  optional bool blacklisted = 12;

  // kFormSubmission(0), user manually filled the username and the password
  // in the form.
  // kGenerated(1), the credential was auto generated.
  // kApi(2), the credential was generated from Credential Management API.
  // kManuallyAdded(3), user manually created the password credential
  // via Settings.
  // kImported(4), the credential was imported using the import flow.
  // kReceivedViaSharing(5), the credential has been received via the password
  // sharing feature.
  optional int32 type = 13;

  // Number of times this login was used for logging in using an HTML form.
  // Chrome uses this field to distinguish log-in and sign-up forms.
  optional int32 times_used = 14;

  // A human readable name of the account holder. Set by CredentialManager API
  // and Android.
  optional string display_name = 15;

  // A URL of the avatar for the credential. Set by CredentialManager API and
  // Android.
  optional string avatar_url = 16;

  // A URL of the IdP used to verify the credential. Set by Credential Manager
  // API and Android.
  optional string federation_url = 17;

  // Time when the credential was last used. This covers *successful* logins to
  // the website, and explicit updates to the password. It does *not* cover if
  // the password just gets filled but not actually submitted, or if the login
  // failed (see `date_last_filled_windows_epoch_micros` for that).
  // Note that password consumers other than Chrome (e.g. Google Play Services)
  // might not update this at all.
  // Amount of microseconds since 1601, aka Windows epoch.
  optional int64 date_last_used = 18;

  // Set if an issue was detected that puts this password at risk. All the
  // clients are expected to clear the field when the password value is updated.
  // 'reused' part can be additionally reset when the analysis on the entire
  // password store is completed.
  optional PasswordIssues password_issues = 19;

  // Time when the `password_value` was last modified. For new credentials it
  // should be set to `date_created`. For subsequent updates the timestamp is
  // changed if and only if the new password value was saved.
  // Number of microseconds since Windows epoch (1601).
  optional int64 date_password_modified_windows_epoch_micros = 20;

  message Notes {
    message Note {
      // The display name must be unique within the scope of a password.
      optional string unique_display_name = 1;
      // The user-defined value of the note.
      optional string value = 2;
      // The creation time of the note. Number of microseconds since 1601.
      optional int64 date_created_windows_epoch_micros = 3;
      // Whether the value of the note is not displayed in plain text by
      // default.
      optional bool hide_by_default = 4;
    }
    repeated Note note = 1;
  }
  reserved 21;
  // Set of extra notes that the user attached to the password. The presence of
  // this field, even with an empty Notes message, becomes the authoritative
  // value for notes and would disregard whatever `encrypted_notes_backup`
  // contains.
  optional Notes notes = 22;

  // For credentials that have been shared by another user, this field captures
  // the sender email. It's empty for credentials that weren't received via
  // password sharing feature.
  optional string sender_email = 23;

  // Similar to `sender_email` but for the sender name.
  optional string sender_name = 24;

  // The timestamp when the password was received via sharing feature from
  // another user.
  optional int64 date_received_windows_epoch_micros = 25;

  // Whether the user has been already notified that they received this password
  // from another user via the password sharing feature. This is synced to avoid
  // showing the notification on multiple devices.
  optional bool sharing_notification_displayed = 26;

  // Similar to `sender_email` but for the url of the sender profile image.
  optional string sender_profile_image_url = 27;

  // Similar to `date_last_used` but covers when the password was last *filled*
  // into a form (through autofill or other UI surfaces).
  optional int64 date_last_filled_windows_epoch_micros = 28;
}

// Contains the password specifics metadata which simplifies its lookup.
message PasswordSpecificsMetadata {
  // The signon realm for the credential. For more details, see the
  // `signon_realm` field in PasswordSpecificsData.
  optional string url = 1;

  // True, if user chose permanently not to save the credentials for the form.
  // Introduced in M82. Copy from PasswordSpecificsData.blacklisted.
  optional bool blacklisted = 2;

  // Copy from PasswordSpecificsData.date_last_used.
  // Introduced in M112.
  optional int64 date_last_used_windows_epoch_micros = 3;

  // Copy from PasswordSpecificsData.password_issues. Introduced in M114.
  optional PasswordIssues password_issues = 4;

  // Copy from PasswordSpecificsData.type. Introduced in M119.
  optional int32 type = 13;
}

// Properties of password sync objects.
message PasswordSpecifics {
  // The actual password data. Contains an encrypted PasswordSpecificsData
  // message.
  optional EncryptedData encrypted = 1;
  // An unsynced field for use internally on the client. This field should
  // never be set in any network-based communications because it contains
  // unencrypted material.
  optional PasswordSpecificsData client_only_encrypted_data = 2;
  // Password related metadata, which is sent to the server side. The field
  // should never be set for full encryption users. If encryption is enabled,
  // this field must be cleared.
  optional PasswordSpecificsMetadata unencrypted_metadata = 3;
  reserved 4;
  // An encrypted backup of the notes field inside the PasswordSpecificsData.
  // The Sync server preserves the contents of this field across commits from
  // legacy clients that don't set this field. It is the responsibility of Sync
  // clients to populate the contents of PasswordSpecificsData notes fields
  // using the contents of this field. This should be deprecated together with
  // the logic for preserving it on the server when clients without support for
  // the `notes` field are no longer allowed by the server (below support
  // version horizon).
  //
  // Encryption key considerations:
  // a) For commits, the client must use the same key for both encrypted blobs.
  // b) For handling getupdates, the two keys may NOT necessarily match the
  //    encryption key used, as in theory the new blob could be "behind" if key
  //    rotation took place. As of today, it is safe to assume that if
  //    `encrypted` is decryptable by a client, then `encrypted_notes_backup`
  //    must be decryptable too (i.e. the Nigori keybag should include older
  //    versions of the key). But not the other way round.
  //
  // If both `encrypted_notes_backup` and the `notes` in `encrypted` are
  // populated, the one in notes is considered the authoritative value.
  optional EncryptedData encrypted_notes_backup = 5;
}