blob: aab4f0cf4b1632bf25b704ebdcc1b8e00e7987f9 [file] [log] [blame] [view]
Joshua Pawlicki3cb0b822020-01-16 17:42:411Previous versions are described at:
Joshua Pawlicki32ec7d82020-07-29 21:42:062 * [Version 3](https://github.com/google/omaha/blob/master/doc/ServerProtocolV3.md)
3 * [Version 2](https://github.com/google/omaha/blob/master/doc/ServerProtocolV2.md)
Joshua Pawlicki3cb0b822020-01-16 17:42:414 * Version 1 of the protocol was never publicly deployed.
5
6[TOC]
7
8
9## Introduction
10The Omaha protocol defines the interactions between a software updater (an
11"Omaha Client") and a cloud update infrastructure. The cloud infrastructure
12contains both an update control server (an "Omaha Server") and a collection of
13plain HTTP servers or CDNs (collectively, the "Download Servers"). The protocol
14is an application-layer protocol on top of HTTP.
15
16Omaha clients interact with the servers in a three-phase **session**. Each step
17in the session involves at least one successful HTTP transaction.
18 1. **The Update Check**: The client transmits what applications it has
19 installed that may be eligible for update to the server. The server replies
20 with whether an update is available for each application. If no updates are
21 available, this is the end of the update session.
22 2. **The Download(s)**: The client downloads the updates from the download
23 servers. It then executes downloaded installers or its own code to apply
24 these updates.
25 3. **The Ping-Back(s)**: The client transmits data about its activities back
26 to the server, including whether the updates were successful, which
27 download URLs were used, and any error codes encountered.
28
29The update check is an HTTP POST with a JSON data body. The response has a JSON
30data body. The integrity of the update check is protected by [CUP](cup.md), even
31in the presence of compromised TLS.
32
33The downloads are HTTP GET requests. The client is free to use any HTTP
34technology to fetch the downloads, for example using Range requests.
35
36The ping-back is an HTTP POST with a JSON data body. The response may contain a
37JSON data body acknowledging the received data, but should be ignored by the
38client unless CUP is in use on this request.
39
40
41## Concepts
42
43### Session ID
44All requests in a session are linked by a unique **session ID**. Session IDs are
45random strings with at least 128 bits of entropy. There must be no relationship
46between a previous session ID and the next session ID. In the update check and
47ping-back requests the session id is transmitted in the POST body (details
48below). In the download requests it is transmitted as an HTTP header (details
49below).
50
51### Request ID
52Each update check has a unique **request ID**. Each ping-back has a different
53unique request ID. Request IDs are random strings with at least 128 bits of
54entropy. There must be no relationship between a previous request ID and the
55next request ID. Request ID allows an Omaha server to deduplicate repeated
56requests, which have been observed as part of client or proxy retry loops.
57
58### Default Values
59The request bodies of the update check and ping-back requests are JSON. Most
60members have a default value defined by this protocol. Clients and servers may
61omit serialization of any members the have default values. Therefore, if a
62client or server does not send the member, the recipient must assume the default
63value of that member.
64
65The default value of any list-valued member is the empty list. The default value
66of any object-valued member is an empty object (which is equivalent to an object
67of the appropriate type populated with its default members).
68
69Compatible clients and servers must be able to tolerate unexpected members.
70
71### Version Numbers
72Version numbers are strings of the form A.B.C.D, where A, B, C, and D are
73base 10 integers between 0 and 2^32 - 1 (inclusive). Suffix elements may be
74omitted if equal to 0; that is, "1.2" is equal to "1.2.0.0".
75
76Version numbers are ordered. Version A is greater than version B if and only if
77there some element of version A is greater than the corresponding element of
78version B, and all the preceding elements are equal. Two versions are equal if
79any only if all their elements are equal.
80
81### Application IDs
82An application ID is a string that identifies an application, for example
83"com.google.chrome". Application IDs are case-insensitive in the ASCII
84characters. Application IDs should only contain printable, human-readable
85characters.
86
87### User Counting
88The Omaha protocol is anonymous, but allows servers to compute the number of
89unique active or update-checking devices. This is accomplished through
90client-regulated counting.
91
Joshua Pawlicki052bfa052022-02-08 16:31:0892The idea of client-regulated counting is to inspect all update check requests
93received over the last N days and discard all but the first request from each
Joshua Pawlicki3cb0b822020-01-16 17:42:4194client. The number of remaining requests is equal to the number of unique
95clients.
96
97Each response from the server contains a numeric date, representing the date (in
98the server's choice of timezone) that the client's request was received. The
99client stores this date, and sends it on the next request to the server. When
Joshua Pawlicki052bfa052022-02-08 16:31:08100inspecting the next request, the server can determine whether the date is before
101(current date - N + 1). If so, this is the first request from the client in the
102N-day window. Otherwise, this request is a "duplicate" and can be discarded.
Joshua Pawlicki3cb0b822020-01-16 17:42:41103
104In certain environments (for example, frequently re-imaged VMs in internet
105cafes), it is likely that the client may fail to update the date of the last
106transaction. To avoid overcounting such clients, a technique called
107ping-freshness is used. A ping-freshness value is a random string with at least
108128 bits of entropy that is written into the client's data store alongside the
109server's date. This value is sent along with the date in the next request. If
110the server receives multiple requests with the same ping-freshness, this is a
111signal that a machine's state has been cloned or reset and that the dates in the
112request are not trustworthy. A new ping-freshness value is written any time a
113new date is written.
114
115In addition to counting the total population for each application, the Omaha
116protocol counts the active user population for each application. When an
117application is actively used, it signals this to the client, and the client will
118transmit the "last reported active" date to the server on the next update check
119(in addition to the "last checked" date). These dates are separately writeable
120and therefore need separate ping-freshness values as well.
121
122The "last reported active" and "last checked" date may vary per managed
123application, and the client must maintain separate dates (and separate
124ping-freshness values) per application.
125
126### Differential Updates
127The Omaha protocol supports differential updates. A differential update achieves
128better compression by relying on information (binaries) the client already has.
129
130A version number is usually insufficient to identify the binaries the client
131already has, since they may vary by architecture, platform, or other variables
132while retaining the same official version number. Therefore, the server sends a
133more precise label with each update payload, which the client reports back in
134subsequent update checks. This value is called a "differential fingerprint".
135
James Decker04ffe432024-08-27 19:28:29136The server should send a value determined by the hash of the binary (not, for
Joshua Pawlicki3cb0b822020-01-16 17:42:41137example, a unique ID). In practice, Google's servers always send "1.hash" where
138"hash" is the SHA256 hash of the update payload.
139
140### Extensions & Forward Compatibility
141The protocol is extensible via the addition of new object members. Clients must
142tolerate the existence of members they do not handle. Unofficial or
143application-specific additional members should be prefixed with an underscore to
144avoid colliding with later additions to the protocol.
145
146Additions to the protocol that specify backward-compatible default values (often
147with a semantic meaning of "unknown") do not need to increase the protocol
148version. Removals of values with specified defaults from the protocol do not
149need to increase the protocol version, since the default value can be assumed by
Quinten Yearsley317532d2021-10-20 17:10:31150compatible endpoints. All other changes to the protocol may require a new version
Joshua Pawlicki3cb0b822020-01-16 17:42:41151number.
152
153### Timing & Backoff
154Clients and servers are free to negotiate the rate at which the client conducts
155update sessions. However, the following best practices are recommended:
156 * If a client periodically checks according to a time-elapsed scheduled task,
157 (e.g. "check every 5 hours"), those checks should happen at an interval
158 that is coprime with a 24-hour day. This prevents a specific client from
159 being locked to a particular set of times at which it checks for an update.
160 * As much as possible while respecting a user or administrator's preferences,
161 clients should avoid check policies that rely on specific clock values
162 (e.g. "check at 5:00 AM"). Clocks throughout the world are roughly
163 synchronized and update schedules like this cause abrupt spikes in update
164 load on update infrastructure.
165 * If a client cannot conduct a check at the scheduled time (it is in an off
166 or standby power state or lacks network connectivity, the client should
167 check as soon as it recovers from that condition (subject to the below).
168 This allows clients who are only briefly connected to reliably update.
169 * A client doing periodic checks should implement a random chance to postpone
170 a periodic update by a fraction of that period. Client update schedules can
171 become synchronized by server-side or network outages, by image cloning, by
172 synchronized installations, or other effects. This behavior gradually
173 desynchronizes a cohort of clients that have become synchronized for any
174 reason. A 20% chance to delay by 0% to 20% of the period (chosen randomly)
175 is generally good enough.
176 * Clients should avoid checking at a predictable millisecond within the
177 second, a predictable second within the minute, or a predictable minute
178 within the hour. This both helps resist fingerprinting of the client and
179 smooths load on the server, which might otherwise have spikes of traffic at
180 precisely 1:00:00.000, 1:00:01.000, 1:01:00.000, etc.
181
182In the case of update check failure, retries are generally permitted. The client
183is free to attempt an immediate retry or a retry after a delay.
184At scale, even a single retry may double load on the update server regardless of
185any client delay (unless the client simply delays to its next normal periodic
186update check. Clients must not retry if they successfully receive a
187CUP-validated response from the server, regardless of the contents. Servers may
188protect themselves in the case of overload by issuing an X-Retry-After HTTP
189header, detailed [below](#headers-update-check-response).
190
191For download requets, clients should prefer to fall back to subsequent download
192URLs rather than attempting retries on a particular URL.
193
194### Safe JSON Prefixes
195JSON responses from the server are prefixed with `)]}'\n`, where \n indicates a
196new line character. This prevents them from being naively executed as a script
197in the context of the update server's origin.
198
199
200## Update Checks
201An update check is the first phase of an Omaha session. In an update check, the
202client sends information about what applications it is managing and the server
203responds with whether any updates are available for the applications.
204
205### URL (Update Check Request)
206Update check requests will bear a query parameter as defined by [CUP](cup.md).
207
208### Headers (Update Check Request)
209Clients should send the following headers with each request. Request headers are
210not protected by CUP and therefore should be considered untrusted data. They are
211advisory data replicated from the request body so that server-side DoS
212prevention mechanisms can inexpensively reject traffic (i.e. without parsing the
213request body).
214 * `X-Goog-Update-Interactivity`: Either "fg" or "bg". "fg" indicating a
215 user-initiated foreground update. "bg" indicates that the request is part
216 of a background update. If the server is under extremely high load, it may
217 use this to prioritize "fg" requests over "bg" requests.
218 * `X-Goog-Update-AppId`: A comma-separated list of application IDs included
219 in this request.
220 * `X-Goog-Update-Updater`: "name-version", where "name" is the name of the
221 updater as reported in `request.updater` and "version" is the version of
222 the updater as reported in `request.updaterversion`.
223
224### Body (Update Check Request)
225The request body of an update check contains a JSON object with the following
226members:
227 * `request`: A `request` object.
228
229#### `request` Object (Update Check Request)
230A request object has the following members:
Brian Manthos27b825842020-02-21 21:41:39231 * `@os`: A string identifying the operating system.
232 Added for backwards compatibility with Chrome Web store.
233 Recommend: new servers should use `os` member instead.
234 Default: "". Known values include:
Joshua Pawlicki3cb0b822020-01-16 17:42:41235 * "android": Android.
236 * "cros": ChromeOS.
237 * "fuchsia": Fuchsia.
238 * "linux": Linux.
239 * "mac": macOS.
Joshua Pawlicki6c319392024-08-07 21:54:59240 * "openbsd": OpenBSD.
Joshua Pawlicki3cb0b822020-01-16 17:42:41241 * "win": Windows.
242 * `@updater`: A string identifying the client software (e.g. "Omaha",
243 "Chrome", "Chrome Extension Updater"). Default: "".
244 * `acceptformat`: A string, formatted as a comma-separated list of strings
245 describing the formats of update payloads that this client accepts.
James Decker04ffe432024-08-27 19:28:29246 Default: "". The following value(s) are supported:
Joshua Pawlicki3cb0b822020-01-16 17:42:41247 * "crx3": The CRX file format, version 3.
James Decker04ffe432024-08-27 19:28:29248 * "puff": The [Puffin](https://chromium.googlesource.com/chromium/src.git/+/main/third_party/puffin/README.md)
249 *.puff file format representing a differential Puffin update.
Joshua Pawlicki3cb0b822020-01-16 17:42:41250 * `app`: A list of `app` objects.
251 * `dedup`: A string, must be "cr". This indicates to servers that the client
252 intends to use client-regulated counting algorithms rather than any sort of
253 unique identifier. Version 3.0 of the protocol also supported "uid".
254 * `dlpref`: Specifies the preferred download URL behavior. A comma-separated
255 list of values, in order of descending priority. Default: "". Legal values
256 include:
257 * "" (empty string): No preference.
258 * "cacheable": Proxy-cacheable download URLs are preferred.
259 * `domainjoined`: A boolean. True if the device is a managed enterprise
260 device that will respect enterprise group or cloud policies. False
261 otherwise.
262 * `hw`: A `hw` object (see below).
263 * `ismachine`: Whether this client is installed system-wide or only for a
264 single user. Default: -1. Legal values:
265 * -1: unknown
266 * 1: this client is installed in a cross-user context.
267 * 0: this client is installed only for the current user.
268 * `os`: An `os` object.
269 * `protocol`: The version of the Omaha protocol. Clients must transmit "3.1"
270 as the value when using this protocol.
271 * `requestid`: A randomly-generated string, unique to this request. Default:
272 "" (empty string).
273 * `sessionid`: A randomly-generated string, unique to this update session.
274 Default: "" (empty string).
275 * `testsource`: A string set in tests, developer requests, or automated
276 probers to distinguish this request from real user traffic. Any value
277 other than the empty string indicates that the request should not be
278 counted toward official metrics. Default: "" (empty string).
279 * `updater`: A list of `updater` objects.
280 * `updaterchannel`: If present, identifies the distribution channel of the
Noah Andersonf26bfa22022-06-29 19:33:45281 client (e.g. "stable", "beta", "dev", "canary", "extended"). Default: "".
Joshua Pawlicki3cb0b822020-01-16 17:42:41282 * `updaterversion`: The version of the client that is sending this request.
283 Default: "0".
284
285#### `hw` Objects (Update Check Request)
286An `hw` object contains information about the capabilities of the client's
287hardware. It has the following members:
288 * `sse`: "1" if the client's hardware supports the SSE instruction set. "0"
289 if the client's hardware does not. "-1" if unknown. Default: "-1".
290 * `sse2`: As `sse` but for the SSE2 instruction set extension.
291 * `sse3`: As `sse` but for the SSE3 instruction set extension.
292 * `sse41`: As `sse` but for the SSE4.1 instruction set extension.
293 * `sse42`: As `sse` but for the SSE4.2 instruction set extension.
294 * `ssse3`: As `sse` but for the SSSE3 instruction set extension.
295 * `avx`: As `sse` but for the AVX instruction set extension.
296 * `physmemory`: The physical memory the client has available to it, measured
297 in gibibytes, truncated down to the nearest gibibyte, or "-1" if unknown.
298 This value is intended to reflect the maximum theoretical storage capacity
299 of the client, not including any hard drive or paging to a hard drive or
300 peripheral. Default: "-1".
301
302#### `os` Objects (Update Check Request)
303An `os` object contains information about the operating system that the client
304is running within. It has the following members:
305 * `platform`: The operating system family that the client is running within
306 (e.g. "win", "mac", "linux", "ios", "android"), or "" if unknown. The
307 operating system family name should be transmitted in a canonical form.
Joshua Pawlickic6814be2023-04-18 21:22:41308 Formatting varies across implementations. Default: "". Known values:
309 * "android" or "Android": Android.
310 * "chromeos" or "ChromeOS" or "Chrome OS": Chrome OS.
311 * "chromiumos" or "ChromiumOS" or "Chromium OS": Chromium OS.
Joshua Pawlicki3cb0b822020-01-16 17:42:41312 * "dragonfly": DragonFly BSD.
Joshua Pawlickic6814be2023-04-18 21:22:41313 * "freebsd" or "FreeBSD": FreeBSD.
314 * "Fuchsia": Fuchsia.
315 * "ios" or "iOS": Apple iOS.
316 * "linux" or "Linux": Linux and its derivatives, except as mentioned
317 below.
318 * "mac" or "Mac OS X": Apple macOS and its derivatives.
319 * "openbsd" or "OpenBSD": OpenBSD.
320 * "Solaris": Solaris.
321 * "win" or "Windows": Microsoft Windows and its derivatives.
322 * "Unknown": Sent by some clients instead of "" when the platform is not
323 recognized.
Joshua Pawlicki3cb0b822020-01-16 17:42:41324 * `version`: The version number of the operating system, or "" if unknown.
325 Default: "".
326 * `sp`: The service pack level of the operating system, or "" if unknown or
327 not applicable. Default: "".
328 * On Windows, the service pack should be formatted as a Title Case
329 string (e.g. "Service Pack 2").
330 * `arch`: The architecture of the operating system, or "" if unknown.
331 Default: "". Known Values:
332 * "arm": ARM
333 * "arm64": 64-bit ARM
334 * "x86": x86
335 * "x86_64": x86-64
S. Ganeshc937718f2022-10-26 23:11:11336 * "x64": x64
Joshua Pawlicki3cb0b822020-01-16 17:42:41337
338#### `app` Objects (Update Check Request)
339Each managed application is represented by exactly one `app` object. It has the
340following members:
341 * `appid`: The [application id](#application-ids) that identifies the
342 application. Default: Undefined - Clients must transmit this attribute.
343 * `brand`: The brand code corresponding to the partner promotion that
344 triggered the installation of the application. Brand codes usually match
345 the [A-Z]{4} regex, but the protocol supports any string. Default: "".
346 * `cohort`: A machine-readable string identifying the release cohort
347 (channel) that the app belongs to. Limited to ASCII characters 32 to 126
348 (inclusive) and a maximum length of 1024 characters. Default: "".
349 * `cohorthint`: A value that expresses a client request to move to another
350 release cohort. The exact values may be application-specific and should be
351 set up ahead of time on the server. Default: "".
352 * `cohortname`: A human-readable string identifying the semantics behind the
353 current cohort. For example, this might be displayed to the user and
354 indicate the channel or experimental status. Default: "".
Xiaoling Baobcce5f42022-10-27 20:17:37355 * `release_channel`: The target channel that the app switches to. For
356 example an app can have stable, beta, dev, and canary channels. Note
357 switching to an older channel may have no effect until the older channel
358 catches up with the install. Ex: a machine on today's beta (107.0.5304.62)
359 that is switched to stable will stay on that version until 107 ships to
360 stable. Downgrade can be forced by the use of the `rollback_allowed` in
361 the `updatecheck` node.
Joshua Pawlicki3cb0b822020-01-16 17:42:41362 * `data`: A list of `data` objects.
363 * `disabled`: A list of `disabled` objects.
364 * `enabled`: Indicates whether the application is enabled on the client. As
365 an example, Chrome extensions can be put into a "disabled" state without
366 uninstallation. A value of "-1" indicates that the enabled status is
367 unknown, or that the concept of enabling/disabling does not exist. "0"
368 indicates that the application is disabled. "1" indicates that the app is
369 enabled. Default: "-1".
Noah Anderson6daa1722024-03-18 15:55:41370 * `fp`: The current [differential fingerprint](#differential-updates) of
Joshua Pawlicki3cb0b822020-01-16 17:42:41371 the application, or "" if unknown. Default: "".
372 * `iid`: Installation ID is an opaque token that identifies an installation
373 flow. The installation ID is a unique identifier embedded into a
374 metainstaller for the application. It can be used to correlate the first
375 update-check of an application with web actions and the application
376 download. To avoid creating a persistent unique identifier for this
377 installation, clients must clear the `iid` value after transmitting it
378 once. Default: "".
379 * `installdate`: The approximate date that the application installation took
380 place on, or "-2" if unknown or not applicable. Default: "-2". During the
381 installation request itself (the first communication to the server), the
James Decker04ffe432024-08-27 19:28:29382 client should use a special value of "-1". The
383 `response.daystart.elapsed_days` value for that request's response should
384 be stored to use in all subsequent requests. To mitigate privacy risk,
385 clients should fuzz the value to the week granularity by storing X - X % 7,
386 where X is the server-provided date. For offline installs, the client
387 should send -2. Default: -2.
Joshua Pawlicki3cb0b822020-01-16 17:42:41388 * `installedby`: A string describing the original cause of the installation.
389 The string should be drawn from a small set of constant values, to minimize
390 entropy and the ability for the client to be fingerprinted. Default: "".
391 * `installsource`: A string describing the immediate cause of this request.
Joshua Pawlickif14af822024-05-22 19:37:11392 Default: "". Known values include:
393 * "" (a normal background update),
394 * "ondemand" (a foreground, user-initiated update),
395 * "taggedmi" (a tagged metainstaller was run),
396 * "offline" (an offline installer was run),
397 * "policy" (an install was triggered by group policy),
Joshua Pawlicki3cb0b822020-01-16 17:42:41398 The string should be drawn from a small set of constant values, to minimize
399 entropy and the ability for the client to be fingerprinted.
400 * `ismachine`: "0" if the application is installed for the user specifically
401 (i.e. elevated privileges are not needed to update it). "1" if the
402 application is installed in a cross-user (system or privileged) context.
403 "-1" if unknown or not applicable. Default: "-1"
404 * `lang`: The language of the application installation, in BCP 47
405 representation, or "" if unknown or not applicable. Default: "".
406 * `ping`: A `ping` object.
Joshua Pawlicki3cb0b822020-01-16 17:42:41407 * `tag`: A string, representing arbitrary application-specific data that the
408 client wishes to disclose to the server. Clients should prefer to extend
409 this protocol with additional attributes rather than use this field, but in
410 some cases transmission of opaque or unparsable data is necessary (for
411 example, transmitting the tag of a tagged metainstaller). Default: "".
412 * `version`: The [version number](#version-numbers) of the current
413 installation of the application. A successful installation of an update
414 should change this version in future requests, even if the old version of
415 the application may still be running.
416 Default: "0".
417 * `updatecheck`: An `updatecheck` object. This member may be omitted if the
418 client will not honor an update response.
419
420#### `ping` Objects (Update Check Request)
421 * `ad`: The date that the previous active report took place on, or "-1" if
422 this is the first active report for the application. "-2" if the date of
423 the previous active report is unknown or the app has not been active since
424 the previous active report. Default: "-2". If not "-2", this request is an
425 active report. If "-2" but the application is known to have been active,
426 this request is an active report. In response to the previous active
427 report, the server responded with the date in the `response.clock.date`
428 member. See [User Counting](#user-counting).
429 * `rd`: The date that the previous roll call took place on, or "-1" if this
430 is the application's first roll call, or "-2" if the date of the previous
431 roll call is not known. Default: "-2". This request is a roll call,
432 regardless of the value of this member. In response to the previous roll
433 call, the server responded with the date in the `response.clock.date`
434 member. See [User Counting](#user-counting).
435 * `ping_freshness`: A random 128-bit number, written into the client's
436 storage alongside the next value of rd, and rotated whenever the client
437 stores a new value for rd. See [Ping Freshess](#ping-freshness). A value of
438 "" (empty string) indicates that no value was available. Default: "".
439
440#### `data` Objects (Update Check Request)
441A data object represents a request for arbitrary specific application-specific
442data from the server. The server maintains a map of index values to data
443contents, and can supply them if requested. This is used during installation to
444transmit alternate branding or seeded configurations to the application. `data`
445objects have the following members:
Joshua Pawlicki1e1469e2022-04-26 17:01:41446 * `name`: The type of data lookup to perform. The only known supported value
447 is "install". Default: "".
Joshua Pawlicki3cb0b822020-01-16 17:42:41448 * `index`: The key to look up on the server. Default: "".
449
450#### `disabled` Objects (Update Check Request)
451A disabled object contains information about why an app is disabled. Multiple
452causes for a disabled state may exist.
453 * `reason`: an numeric reason that the app is disabled. The meaning of these
454 values are client-specific (possibly app-specific), except for "0", which
455 indicates no reason. Default: "0".
456
457#### `updatecheck` Objects (Update Check Request)
458An updatecheck object represents the actual intent to update. It has the
459following members:
Joshua Pawlicki7776a342021-08-05 23:04:19460 * `rollback_allowed`: true if the client will accept a version downgrade.
461 Typically used in conjunction with a targetversionprefix. Default: false.
Joshua Pawlickib1ee7172022-05-26 19:14:57462 * `sameversionupdate`: true if the client is requesting that it be updated
463 to the version it currently has (usually as part of a repair or
464 overinstallation) instead of receiving no update. Default: false.
Joshua Pawlicki3cb0b822020-01-16 17:42:41465 * `targetversionprefix`: A component-wise prefix of a version number, or a
Joshua Pawlicki7776a342021-08-05 23:04:19466 complete version number. The server SHOULD NOT return an update
467 instruction to a version number that does not match the prefix or complete
468 version number. The prefix is interpreted a dotted-tuple that specifies
469 the exactly-matching elements; it is not a lexical prefix. (For example,
470 "1.2.3" matches "1.2.3.4" but not "1.2.34".) Default: "".
Joshua Pawlicki3cb0b822020-01-16 17:42:41471 * `updatedisabled`: An indication of whether the client will honor an update
472 response, if it receives one. Legal values are "true" (indicating that the
473 client will ignore any update instruction) and "false" (indicating that the
Brian Manthos27b825842020-02-21 21:41:39474 client will attempt an update if one is instructed). Default: "false".
Joshua Pawlicki3cb0b822020-01-16 17:42:41475
476#### `updater` Objects (Update Check Request)
Brian Manthos27b825842020-02-21 21:41:39477An updater object represents the state of another sibling update program on
Joshua Pawlicki3cb0b822020-01-16 17:42:41478the system. Clients report about other updaters present on the system to enable
479redundancy and recoverability of sibling updaters. For example, Chrome is
480normally updated by GoogleUpdate, but in cases where GoogleUpdate has been
481disabled or is broken (according to the data transmitted here), the server can
Brian Manthos27b825842020-02-21 21:41:39482issue an action to Chrome to attempt recovery of GoogleUpdate. An updater
Joshua Pawlicki3cb0b822020-01-16 17:42:41483object has the following members:
484 * `autoupdatecheckenabled`: 1 if the other updater is subject
485 to an enterprise policy that disables its update-checking functionality. 0
486 if not. -1 if unknown. Default: -1.
487 * `ismachine`: 1 if the updater has system or administrator
488 privileges, or if it is installed in a cross-user context. 0 if not. -1 if
489 unknown. Default: -1.
490 * `lastchecked`: An estimated number of hours since the other updater
Brian Manthos27b825842020-02-21 21:41:39491 successfully checked for an update. A value of -1 indicates the last check
492 time is unknown. Default: -1. Clients should limit the accuracy of this
493 value in order to prevent an observer from correlating this request to the
494 one last sent by the subject updater.
495 >Chrome only sends the following values:
496 >* -1: unknown
497 >* 0: [0, 336) hours ago (0 to < ~2 weeks)
498 >* 336: [336, 1344) hours ago (~2 weeks to ~2×28 days)
499 >* 1344: at least 1344 hours ago (~2×28 days or more)
Noah Anderson4ea9ab1452024-09-04 18:04:01500 * `lastupdatecheckerrorcat`: The numeric error category encountered on
Joshua Pawlicki9d26a732024-08-29 18:26:09501 the last update check. 0 for success. Default: "0".
Noah Anderson4ea9ab1452024-09-04 18:04:01502 * `lastupdatecheckerrorcode`: The numeric error code encountered on the last
Joshua Pawlicki9d26a732024-08-29 18:26:09503 update check. 0 for success. Default: "0".
Noah Anderson4ea9ab1452024-09-04 18:04:01504 * `lastupdatecheckextracode1`: The numeric extra code encountered on the
Joshua Pawlicki9d26a732024-08-29 18:26:09505 last update check. 0 for success. Default: "0".
Joshua Pawlicki3cb0b822020-01-16 17:42:41506 * `laststarted`: An estimated number of hours since the other updater
Brian Manthos27b825842020-02-21 21:41:39507 successfully ran (started and exited without crashing). A value of -1
508 indicates the last check time is unknown. Default: -1. Clients should
509 limit the accuracy of this value in order to prevent an observer from
510 correlating this request to the one last sent by the subject updater.
511 >Chrome only sends the following values:
512 >* -1: unknown
513 >* 0: [0, 336) hours ago (0 to < ~2 weeks)
514 >* 336: [336, 1344) hours ago (~2 weeks to ~2×28 days)
515 >* 1344: at least 1344 hours ago (~2×28 days or more)
Joshua Pawlicki3cb0b822020-01-16 17:42:41516 * `name`: The name of the other updater.
517 * `updatepolicy`: A numeric indicator of what kind of updater policy the
518 other updater has about updating this client. Default: -2. Known values:
519 * -2: unknown
520 * -1: no such policy exists
521 * 0: policy set to allow background and foreground updates.
522 * 1: policy set to allow background updates only.
523 * 2: policy set to allow foreground updates only.
524 * 3: policy set to disable updates.
525 * `version`: The current version number of the other updater. Default: "0".
526
527---
528
529### Headers (Update Check Response)
530In addition to normal HTTP headers, this protocol defines the following update
531check response headers:
532 * `X-Cup-Server-Proof`: Contains the CUP signature of the response.
533 * `X-Retry-After`: If present, a positive integer, representing a number of
534 seconds for which the client mut not contact the server again for
535 background updates, including but not limited to retries of this particular
536 request. Clients must respect this header even if paired with
537 non-successful HTTP response code. Servers should not send a value in
538 excess of 86400 (24 hours), and clients should treat values greater than
539 86400 as 86400. Clients may still send a ping-back for this update session.
540
541### Body (Update Check Response)
542The response body of an update check begins with `)]}'\n`, where \n indicates a
543newline character, followed by a JSON object with the following members:
544 * `response`: A `response` object.
545
546#### `response` Objects (Update Check Response)
547A response object contains the server's response to a corresponding `request`
548object in the update check request.
549 * `app`: A list of `app` objects. There is one object for each `app` in the
550 request body.
551 * `daystart`: A `daystart` object.
S. Ganeshc937718f2022-10-26 23:11:11552 * `systemrequirements`: A `systemrequirements` object. The server will not
553 send this element, but it may be present in offline installer manifests.
Joshua Pawlicki3cb0b822020-01-16 17:42:41554 * `protocol`: The version of the Omaha protocol. Servers responding with this
555 protocol must send a value of "3.1".
556 * `server`: A string identifying the server or server family for diagnostic
557 purposes. As examples, "production", "test". Default: "".
558
559#### `daystart` Objects (Update Check Response)
560A clock object contains information about the current datetime according to the
561server's locale. It has the following members:
562 * `elapsed_days`: An integer. The number of complete calendar days that have elapsed
563 since January 1st, 2007 in the server's locale, at the time the request was
564 received. The client should generally save this value for use in future
565 update checks (for examples, see `request.app.ping.rd` and
566 `request.app.installdate`).
567
S. Ganeshc937718f2022-10-26 23:11:11568#### `systemrequirements` Objects (Update Check Response)
569A `systemrequirements` object contains information about the operating system
570that the application requires to install. It has the following members:
571 * `platform`: The operating system family that the application requires
572 (e.g. "win", "mac", "linux", "ios", "android"), or "" if not applicable.
573 * `arch`: Expected host processor architecture that the app is compatible
S. Ganesh8d1de212022-11-10 00:40:10574 with, or "" if not applicable.
575
576 `arch` can be a single entry, or multiple entries separated with `,`.
S. Ganeshc937718f2022-10-26 23:11:11577 Entries prefixed with a `-` (negative entries) indicate non-compatible
S. Ganesh8d1de212022-11-10 00:40:10578 hosts. Non-prefixed entries indicate compatible guests.
579
580 An application is compatible with the current architecture if:
581 * `arch` is empty, or
582 * none of the negative entries within `arch` match the current host
583 architecture exactly, and there are no non-negative entries, or
584 * one of the non-negative entries within `arch` matches the current
585 architecture, or is compatible with the current architecture (i.e., it is
586 a compatible guest for the current host). The latter is determined by
587 `::IsWow64GuestMachineSupported()` on Windows.
588 * If `::IsWow64GuestMachineSupported()` is not available, returns `true`
589 if `arch` is x86.
590
591 Examples:
S. Ganeshc937718f2022-10-26 23:11:11592 * `arch` == "x86".
593 * `arch` == "x64".
594 * `arch` == "x86,x64,-arm64": installation will fail if the underlying host
595 is arm64.
596 * `min_os_version`: The minimum required version of the operating system, or
597 "" if not applicable.
598
S. Ganesh7141d932022-11-11 03:46:54599 The `min_os_version` is in the format `major.minor.build.patch` for
600 Windows. The `major`, `minor` and `build` are the values returned by the
601 `::GetVersionEx` API. The `patch` is the `UBR` value under the registry
602 path `HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion`.
603
604 The `build` and the `patch` components may be omitted if all that is needed
605 is a minimum `major.minor` version. For example, `6.0` will match all OS
606 versions that are at or above that version, regardless of `build` and
607 `patch` numbers.
608
Joshua Pawlicki3cb0b822020-01-16 17:42:41609#### `app` Objects (Update Check Response)
610An app object represents a per-application acknowledgement of the request. If an
611application appears in the request, it must have a corresponding acknowledgement
612in the response. It has the following members:
613 * `appid`: The [application ID](#application-ids) identifies the application.
614 Servers must always transmit this attribute.
615 * `cohort`: The new cohort value for the application. The client should
616 update the cohort of this application to the new value. Subject to the same
617 length and language limitations as `request.app.cohort`. Default: "" (empty
618 string).
619 * `cohorthint`: The new cohort hint value for the application. The client
620 should update the cohorthint of this application to this value. Subject to
621 the same length and language limitations as `request.app.cohorthint`.
622 Default: "" (empty string).
623 * `cohortname`: The new cohort name value for the application. The client
624 should update the cohortname of this application to this value. Subject to
625 the same length and language limitations as `request.app.cohortname`.
626 Default: "" (empty string).
627 * `data`: A list of `data` objects.
628 * `updatecheck`: An `updatecheck` object, if one was sent in the request.
629 * `status`: The state of the product on the server. Default: "ok". Known
630 values:
631 * "ok": The application is recognized.
632 * "restricted": The application is recognized, but due to policy
633 restrictions (such as export law compliance) the server must refuse to
634 give a meaningful response.
635 * "error-unknownApplication": The server is not aware of an application
636 with this ID.
637 * "error-invalidAppId": The server is not aware of this application with
638 this ID and furthermore the application ID was not in a format the
639 server expected.
640
641#### `data` Objects (Update Check Response)
642Each data object in the response represents an answer to a data request from the
643client. It has the following members:
Joshua Pawlicki1e1469e2022-04-26 17:01:41644 * `name`: The requested data name from `request.app.data.name`, echoed back
645 to the client.
Joshua Pawlicki3cb0b822020-01-16 17:42:41646 * `index`: The requested data index from `request.app.data.index`, echoed
Joshua Pawlicki1e1469e2022-04-26 17:01:41647 back to the client, if valid.
Joshua Pawlicki3cb0b822020-01-16 17:42:41648 * `status`: The outcome of the data lookup. Default: "ok". Known values:
649 * "ok": This tag contains the appropriate data response, even if such a
650 response is the empty string.
651 * "error-invalidargs": The data request could not be parsed or
652 understood.
653 * "error-nodata": The data request was understood, but the server does
654 not have a value for the requested entry. (This is distinct from having
655 a zero-length value.)
Joshua Pawlicki1e1469e2022-04-26 17:01:41656 * `#text`: The value of the requested data index.
Joshua Pawlicki3cb0b822020-01-16 17:42:41657
658#### `updatecheck` Objects (Update Check Response)
659An updatecheck response object contains whether or not there is an update
660available for the application, and if so, the instructions to install it. It has
661the following members:
662 * `action`: A list of `action` objects. Actions can be conducted by the
663 client independent of the outcome of the updatecheck. If coupled with an
664 update response, the actions should be performed after the update, in the
665 order they are listed. Default: [] (empty list).
666 * `info`: An optional string that provides a rationale for the status
667 response, for use in debugging. For example, "update disabled by client"
668 or "bandwidth limit exceeded". Default: "".
669 * `status`: Indicates the outcome of the updatecheck. Servers must always
670 send a value here. Known values:
671 * "ok": An update is available and should be applied.
672 * "noupdate": No update is available for this application at this time.
673 * "error-internal": The server encountered an unspecified internal error.
674 * "error-hash": The server attempted to serve an update, but could not
675 provide a valid hash for the download.
676 * "error-osnotsupported": The server recognized the application, but the
677 client does not meet the minimum system requirements to receive any
678 version of the application. In particular, it is running on an
679 incompatible operating system.
680 * "error-hwnotsupported": The server recognized the application, but the
681 client does not meet the minimum system requirements to receive any
682 version of the application. In particular, it is running on
683 incompatible hardware.
684 * "error-unsupportedprotocol": This application is incompatible with this
685 version of the protocol. (For example, it may require multi-package
686 support from the Omaha 3 protocol, or may require some feature added in
687 a later version of this protocol.)
Brian Manthos27b825842020-02-21 21:41:39688
Joshua Pawlicki3cb0b822020-01-16 17:42:41689Additionally, the following members are set if and only if `status == "ok"`:
690 * `manifest`: A `manifest` object.
691 * `urls`: A `urls` object.
692
693#### `manifest` Objects (Update Check Response)
694A manifest object contains details about how to fetch and apply an update.
695 * `arguments`: A string, indicating command-line arguments that should be
696 passed to the binary specified in `run`. Default: "".
697 * `packages`: A `packages` object.
698 * `run`: A path within the CRX archive to an executable to run as part of the
699 update. The executable is typically an application installer. If unsent or
700 the empty string, no particular update-delivered installer needs to be run.
701 Default: "" (empty string).
702 * `version`: The new version the client should report for the application,
703 after successfully applying this update. Compatible servers must send this
704 member.
705
Joshua Pawlicki3cb0b822020-01-16 17:42:41706#### `packages` Objects (Update Check Response)
707A packages object describes a set of downloadable files. The 3.1 protocol only
708supports a subset of the 3.0 packages, but may be extended in the future to
709implement more of the 3.0 protocol's package support. A packages object contains
710the following members:
711 * `package`: A list of `package` objects. Clients may ignore all but the
712 first element in this list if they only implement single-package support.
713
714#### `package` Objects (Update Check Response)
715A package object describes a file that must be downloaded and installed as part
716of the update. In this version of the protocol, all packages describe CRX files.
717Packages can also come in differential update forms. Clients should attempt a
718differential patch of package first, and fall back to a full package if the
719differential patch fails to apply. A package object has the following members:
Noah Anderson6daa1722024-03-18 15:55:41720 * `fp`: The [differential fingerprint](#differential-updates) of the
Joshua Pawlicki3cb0b822020-01-16 17:42:41721 new version of the package.
722 * `size`: The size of the file, in octets.
723 * `sizediff`: The size of the differential file, in octets, if one is
724 available.
725 * `hash_sha256`: The SHA-256 hash of the file, encoded as a lowercase base-16
726 string.
727 * `hashdiff_sha256`: The SHA-256 hash of the differential file, encoded as a
728 lowercase base-16 string.
729 * `name`: The basename of the file. The basename can be appended to each
730 `url.codebase` within this `manifest` object in order to compute a URL from
731 which the package can be fetched from.
732 * `namediff`: The basename of the differential file. The basename can be
733 appended to each `url.codebasediff` within this `manifest` object in order
734 to compute a URL from which the package can be fetched from.
735
736#### `urls` Objects (Update Check Response)
737A urls object describes an ordered collection of download URL prefixes. Each URL
738in the collection is either a differential or full URL. When attempting a
739download of a differential or full package, clients must attempt downloads from
740each URL of the appropriate type in the specified order, falling back to the
741next URL if a TCP or HTTP error is encountered. A 4xx or 5xx HTTP response
742qualifies as an error that justifies a fallback. A successful download of a file
743that fails to hash to the expected hash or has an unexpected size also
744qualifies. Other network errors may also qualify.
745 * `url`: A list of `url` objects.
746
747#### `url` Objects (Update Check Response)
748A url object describes a URL prefix. It has the following members:
749 * `codebase`: An absolute URL prefix. Presence of this member indicates a
750 full download URL. This member will be present if and only if
751 `codebasediff` is not present. To create a full URL, the value must be
752 concatenated with a `package.name` member.
753 * `codebasediff`: An absolute URL prefix. Presence of this member indicates a
754 differential download URL. This member will be present if and only if
755 `codebase` is not present. To create a full URL, the value must be
756 concatenated with a `package.namediff` member.
757
758#### `action` Objects (Update Check Response)
759An action represents a task that the update client must conduct after
760application of the update (if an update is provided), or immediately (if no
761update is provided). It has the following members:
762 * `type`: Indicates the type of action. Known values:
763 * "run": This action is an instruction to run one of the application's
764 executables. If the run action is served along with an update, and the
765 update fails, the run action should not be executed. If the run action
766 is served without an update, it should be executed unconditionally.
767 * "launchcmd": This action is an instruction to run the application's
768 registered launchcmd command. A launchcmd command is defined as part of
769 the protocol between an Omaha client and an application installer.
770 * "hideui": This action is an instruction to hide any UI associated with
771 the updater, and to exit silently without further user input. For
772 example, this can be used in conjunction with a launchcmd action to
773 instruct a metainstaller to launch the installing product and
774 immediately appear to exit.
775
776Additional members may be present, depending on the action type.
777
778For `type == "run"`:
779 * `run`: The path to the executable (relative to the root of the CRX archive
780 that the client was served in this update (if an update was served) or in
781 an update with the associated differential fingerprint (if this response
782 does not contain an update for this application). For other action types,
783 this member may not appear.
784 * `arguments`: The command line arguments to be passed to the executable,
785 formatted as a single string.
786
787---
788
789
790## Downloads
791Download requests occur when an application update is needed, as a result of a
James Decker04ffe432024-08-27 19:28:29792`response.app.updatecheck.pipelines.operations.urls` member. Download requests
793are HTTP GET requests and can use any HTTP implementation.
Joshua Pawlicki3cb0b822020-01-16 17:42:41794
795### Request Headers
796In addition to the regular HTTP headers, this protocol defines the following
797headers for the download request:
798 * `X-Goog-Update-SessionId`: The [session ID](#session-ids) of the update
799 session.
800
801---
802
803
804## Ping-Backs
805Ping-back requests are caused by any install, update, or action attempted during
806an update session. Ping-backs share a similar structure to update check
807requests.
808
809Ping-back requests are fire-and-forget: the client can discard the server's
810response. Ping-back transactions need to be protected by CUP if and only if the
811client handles the server's response.
812
813Ping-back requests can be **bundled** into a single HTTP transaction, or sent
814immediately as the events triggering the ping-back occurs. Bundling ping-backs
815reduces QPS to the server, but risks ping-back loss if the client crashes,
816loses connectivity, or loses power before it transmits the bundle.
817
818### Ping-Back Request Headers
819Similarly to update-check requests, ping-back requests have additional headers
820for the purpose of easier DoS rejection.
821 * `X-Goog-Update-AppId`: A comma-separated list of application IDs included
822 in this request.
823 * `X-Goog-Update-Updater`: "name-version", where "name" is the name of the
824 updater as reported in `request.updater` and "version" is the version of
825 the updater as reported in `request.updaterversion`.
826
827### Ping-Back Request Body
828The request body of an ping-back contains a JSON object with the following
829members:
830 * `request`: A `request` object.
831
832#### `request` Objects (Ping-Back Request)
833A ping-back `request` object contains all the same members as a update check
834`request` object. Differences occur in the `request.app` objects.
835
836#### `app` Objects (Ping-Back Request)
837A ping-back `app` object is identical to an update check `app` object, except
838for the following differences.
839
840A ping-back `app` object cannot contain any of the following members:
841 * `data`
James Decker04ffe432024-08-27 19:28:29842 * `ping`
Joshua Pawlicki3cb0b822020-01-16 17:42:41843 * `updatecheck`
844
845A ping-back `app` additionally contains the following members:
846 * `event`: a list of `event` objects.
847
848#### `event` Objects (Ping-Back Request)
849An event object represents a specific report about an operation the client
850attmpted as part of this update session. All events have the following members:
Joshua Pawlicki156727f32020-02-12 23:31:40851 * `eventtype`: The event type is a numeric value indicating the type of the
852 event. It must always be specified by the client. The following values are
853 known:
Joshua Pawlicki3cb0b822020-01-16 17:42:41854 * 2: An install operation.
855 * 3: An update operation.
856 * 4: An uninstall operation.
857 * 14: A download operation.
S. Ganesh35ba1b52024-03-19 22:34:53858 * 41: An app command completion event.
Joshua Pawlicki3cb0b822020-01-16 17:42:41859 * 42: An action operation.
Joshua Pawlicki156727f32020-02-12 23:31:40860 * `eventresult`: The outcome of the operation. Default: 0. Known values:
Joshua Pawlicki3cb0b822020-01-16 17:42:41861 * 0: error
862 * 1: success
863 * 4: cancelled
864 * `errorcat`: An error category, for use in distinguishing between different
865 classes of error codes. Default: 0. The following values are known:
James Decker04ffe432024-08-27 19:28:29866 * 0: No category.
Joshua Pawlicki3cb0b822020-01-16 17:42:41867 * 1: Errors acquiring the download.
868 * 2: Errors during CRX unpacking.
S. Ganeshf83ca122024-06-14 21:37:57869 * 3: Update client errors during installation.
Joshua Pawlicki3cb0b822020-01-16 17:42:41870 * 4: Errors within the update service itself.
871 * 5: Error during update check.
S. Ganeshf83ca122024-06-14 21:37:57872 * 7: Application installer errors during installation.
Joshua Pawlicki3cb0b822020-01-16 17:42:41873 * `errorcode`: The error code (if any) of the operation. Default: 0. The
874 meaning of an error code may depend on the error category. 0 always means
875 "no error" (success).
876 * Additional values may exist in
877 (update_client_errors.h)[https://cs.chromium.org/chromium/src/components/update_client/update_client_errors.h]
878 * `extracode1`: Additional numeric information about the operation's result.
879 The meaning of an extra code depends on the error category and error code.
880 Default: 0.
881
882Depending on the event type, additional members may be present:
883
James Decker04ffe432024-08-27 19:28:29884For `eventtype == 2` events:
Noah Anderson6daa1722024-03-18 15:55:41885 * `nextfp`: The [differential fingerprint](#differential-updates) that
Joshua Pawlicki3cb0b822020-01-16 17:42:41886 the client was attempting to update to, regardless of whether that update
887 was successful.
888 * `nextversion`: The application version that the client was attempting to
889 update to, regardless of whether the update was successful.
890
James Decker04ffe432024-08-27 19:28:29891For `eventtype == 3` events:
892 * All the members of `eventtype == 2` events.
Brian Manthos27b825842020-02-21 21:41:39893 * `diffresult`: As `eventresult` but specifically for a differential update. A
Joshua Pawlicki3cb0b822020-01-16 17:42:41894 client that successfully applies a differential update should send the
Brian Manthos27b825842020-02-21 21:41:39895 result both here and in `eventresult`. A client that attempts and fails a
896 differential update should send the result here, and use `eventresult` to
Joshua Pawlicki3cb0b822020-01-16 17:42:41897 indicate the outcome of the full update attempt.
898 * `differrorcat`: As `errorcat` but for differential updates. Similar to
Brian Manthos27b825842020-02-21 21:41:39899 `diffresult`.
Joshua Pawlicki3cb0b822020-01-16 17:42:41900 * `differrorcode`: As `errorcode` but for differential updates. Similar to
Brian Manthos27b825842020-02-21 21:41:39901 `diffresult`.
Joshua Pawlicki3cb0b822020-01-16 17:42:41902 * `diffextracode1`: As `extracode1` but for differential updates. Similar to
Brian Manthos27b825842020-02-21 21:41:39903 `diffresult`.
Noah Anderson6daa1722024-03-18 15:55:41904 * `previousfp`: The [differential fingerprint](#differential-updates)
Joshua Pawlicki3cb0b822020-01-16 17:42:41905 the client had prior to the update, regardless of whether that update
906 was successful.
907 * `previousversion`: The application version the client had prior to the
908 update, regardless of whether that update was successful.
909
James Decker04ffe432024-08-27 19:28:29910For `eventtype == 14` events:
Joshua Pawlicki3cb0b822020-01-16 17:42:41911 * `download_time_ms`: The time elapsed between the start of the download and
Sorin Jianu0eeea4c82023-05-19 18:31:06912 the end of the download, in milliseconds. -1 if unavailable.
Joshua Pawlicki3cb0b822020-01-16 17:42:41913 Default: -1.
Joshua Pawlickia01af1312024-08-02 17:55:47914 * `downloaded`: The number of bytes successfully received from the download
915 server. Default: 0.
Joshua Pawlicki3cb0b822020-01-16 17:42:41916 * `downloader`: A string identifying the download algorithm / stack. Known
917 values:
918 * "" (empty string): Unknown downloader.
Noah Rose Ledesma53fa3f92023-10-27 21:42:22919 * "nsurlsession_background": MacOS background NSURLSession.
Joshua Pawlicki3cb0b822020-01-16 17:42:41920 * "bits": Microsoft BITS.
921 * "direct": The Chromium network stack.
Joshua Pawlickia01af1312024-08-02 17:55:47922 * `total`: The number of bytes expected to be downloaded. Default: 0.
Joshua Pawlicki3cb0b822020-01-16 17:42:41923 * `url`: The URL from which the download was attempted.
924
James Decker04ffe432024-08-27 19:28:29925For `eventtype == 41` events:
S. Ganesh35ba1b52024-03-19 22:34:53926 * `appcommandid`: The id of the app command for which the ping is being sent.
927
James Decker04ffe432024-08-27 19:28:29928For `eventtype == 42` events:
Joshua Pawlicki3cb0b822020-01-16 17:42:41929 * `actiontype`: The type of the action that caused this event.
930
931### Ping-Back Response Body
932Clients are free to ignore the ping-back response body. However, to allow future
933extensions in the ping-back response, the protocol defines a basic ping-back
934response body. Clients that do not ignore the ping-back response must protect
935the ping request using CUP.
936
937The response body of an ping-back contains a JSON object with the following
938members:
939 * `response`: A `response` object.
940
941#### `response` Objects (Ping-Back Response)
942A ping-back `response` object contains all the same members as a update check
943`response` object. Differences occur in the `response.app` objects.
944
945#### `app` Objects (Ping-Back Response)
946A ping-back response `app` object is identical to an update check response `app`
947object, except for the following differences.
948
949A ping-back `app` object cannot contain any of the following members:
950 * `action`
951 * `data`
952 * `updatecheck`
953
954A ping-back `app` additionally contains the following members:
955 * `event`: a list of `event` objects.
956
957#### `event` Objects (Ping-Back Response)
958A ping-back response `event` object indicates the server's acknowledgement of
959the event. It has the following members:
960 * `status`: Indicates the result of parsing the action on the server side.
961 Known values:
962 * "ok": The server acknowledges successful receipt of this event ping.
963
964
965## Future Work
966The 3.1 protocol is expected to expand as the cross-platform updater in
967//src/chrome/updater continues to reach feature parity with Omaha 3.