Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 1 | Previous versions are described at: |
Joshua Pawlicki | 32ec7d8 | 2020-07-29 21:42:06 | [diff] [blame] | 2 | * [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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 4 | * Version 1 of the protocol was never publicly deployed. |
| 5 | |
| 6 | [TOC] |
| 7 | |
| 8 | |
| 9 | ## Introduction |
| 10 | The Omaha protocol defines the interactions between a software updater (an |
| 11 | "Omaha Client") and a cloud update infrastructure. The cloud infrastructure |
| 12 | contains both an update control server (an "Omaha Server") and a collection of |
| 13 | plain HTTP servers or CDNs (collectively, the "Download Servers"). The protocol |
| 14 | is an application-layer protocol on top of HTTP. |
| 15 | |
| 16 | Omaha clients interact with the servers in a three-phase **session**. Each step |
| 17 | in 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 | |
| 29 | The update check is an HTTP POST with a JSON data body. The response has a JSON |
| 30 | data body. The integrity of the update check is protected by [CUP](cup.md), even |
| 31 | in the presence of compromised TLS. |
| 32 | |
| 33 | The downloads are HTTP GET requests. The client is free to use any HTTP |
| 34 | technology to fetch the downloads, for example using Range requests. |
| 35 | |
| 36 | The ping-back is an HTTP POST with a JSON data body. The response may contain a |
| 37 | JSON data body acknowledging the received data, but should be ignored by the |
| 38 | client unless CUP is in use on this request. |
| 39 | |
| 40 | |
| 41 | ## Concepts |
| 42 | |
| 43 | ### Session ID |
| 44 | All requests in a session are linked by a unique **session ID**. Session IDs are |
| 45 | random strings with at least 128 bits of entropy. There must be no relationship |
| 46 | between a previous session ID and the next session ID. In the update check and |
| 47 | ping-back requests the session id is transmitted in the POST body (details |
| 48 | below). In the download requests it is transmitted as an HTTP header (details |
| 49 | below). |
| 50 | |
| 51 | ### Request ID |
| 52 | Each update check has a unique **request ID**. Each ping-back has a different |
| 53 | unique request ID. Request IDs are random strings with at least 128 bits of |
| 54 | entropy. There must be no relationship between a previous request ID and the |
| 55 | next request ID. Request ID allows an Omaha server to deduplicate repeated |
| 56 | requests, which have been observed as part of client or proxy retry loops. |
| 57 | |
| 58 | ### Default Values |
| 59 | The request bodies of the update check and ping-back requests are JSON. Most |
| 60 | members have a default value defined by this protocol. Clients and servers may |
| 61 | omit serialization of any members the have default values. Therefore, if a |
| 62 | client or server does not send the member, the recipient must assume the default |
| 63 | value of that member. |
| 64 | |
| 65 | The default value of any list-valued member is the empty list. The default value |
| 66 | of any object-valued member is an empty object (which is equivalent to an object |
| 67 | of the appropriate type populated with its default members). |
| 68 | |
| 69 | Compatible clients and servers must be able to tolerate unexpected members. |
| 70 | |
| 71 | ### Version Numbers |
| 72 | Version numbers are strings of the form A.B.C.D, where A, B, C, and D are |
| 73 | base 10 integers between 0 and 2^32 - 1 (inclusive). Suffix elements may be |
| 74 | omitted if equal to 0; that is, "1.2" is equal to "1.2.0.0". |
| 75 | |
| 76 | Version numbers are ordered. Version A is greater than version B if and only if |
| 77 | there some element of version A is greater than the corresponding element of |
| 78 | version B, and all the preceding elements are equal. Two versions are equal if |
| 79 | any only if all their elements are equal. |
| 80 | |
| 81 | ### Application IDs |
| 82 | An application ID is a string that identifies an application, for example |
| 83 | "com.google.chrome". Application IDs are case-insensitive in the ASCII |
| 84 | characters. Application IDs should only contain printable, human-readable |
| 85 | characters. |
| 86 | |
| 87 | ### User Counting |
| 88 | The Omaha protocol is anonymous, but allows servers to compute the number of |
| 89 | unique active or update-checking devices. This is accomplished through |
| 90 | client-regulated counting. |
| 91 | |
Joshua Pawlicki | 052bfa05 | 2022-02-08 16:31:08 | [diff] [blame] | 92 | The idea of client-regulated counting is to inspect all update check requests |
| 93 | received over the last N days and discard all but the first request from each |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 94 | client. The number of remaining requests is equal to the number of unique |
| 95 | clients. |
| 96 | |
| 97 | Each response from the server contains a numeric date, representing the date (in |
| 98 | the server's choice of timezone) that the client's request was received. The |
| 99 | client stores this date, and sends it on the next request to the server. When |
Joshua Pawlicki | 052bfa05 | 2022-02-08 16:31:08 | [diff] [blame] | 100 | inspecting 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 |
| 102 | N-day window. Otherwise, this request is a "duplicate" and can be discarded. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 103 | |
| 104 | In certain environments (for example, frequently re-imaged VMs in internet |
| 105 | cafes), it is likely that the client may fail to update the date of the last |
| 106 | transaction. To avoid overcounting such clients, a technique called |
| 107 | ping-freshness is used. A ping-freshness value is a random string with at least |
| 108 | 128 bits of entropy that is written into the client's data store alongside the |
| 109 | server's date. This value is sent along with the date in the next request. If |
| 110 | the server receives multiple requests with the same ping-freshness, this is a |
| 111 | signal that a machine's state has been cloned or reset and that the dates in the |
| 112 | request are not trustworthy. A new ping-freshness value is written any time a |
| 113 | new date is written. |
| 114 | |
| 115 | In addition to counting the total population for each application, the Omaha |
| 116 | protocol counts the active user population for each application. When an |
| 117 | application is actively used, it signals this to the client, and the client will |
| 118 | transmit 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 |
| 120 | and therefore need separate ping-freshness values as well. |
| 121 | |
| 122 | The "last reported active" and "last checked" date may vary per managed |
| 123 | application, and the client must maintain separate dates (and separate |
| 124 | ping-freshness values) per application. |
| 125 | |
| 126 | ### Differential Updates |
| 127 | The Omaha protocol supports differential updates. A differential update achieves |
| 128 | better compression by relying on information (binaries) the client already has. |
| 129 | |
| 130 | A version number is usually insufficient to identify the binaries the client |
| 131 | already has, since they may vary by architecture, platform, or other variables |
| 132 | while retaining the same official version number. Therefore, the server sends a |
| 133 | more precise label with each update payload, which the client reports back in |
| 134 | subsequent update checks. This value is called a "differential fingerprint". |
| 135 | |
James Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 136 | The server should send a value determined by the hash of the binary (not, for |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 137 | example, 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 |
| 141 | The protocol is extensible via the addition of new object members. Clients must |
| 142 | tolerate the existence of members they do not handle. Unofficial or |
| 143 | application-specific additional members should be prefixed with an underscore to |
| 144 | avoid colliding with later additions to the protocol. |
| 145 | |
| 146 | Additions to the protocol that specify backward-compatible default values (often |
| 147 | with a semantic meaning of "unknown") do not need to increase the protocol |
| 148 | version. Removals of values with specified defaults from the protocol do not |
| 149 | need to increase the protocol version, since the default value can be assumed by |
Quinten Yearsley | 317532d | 2021-10-20 17:10:31 | [diff] [blame] | 150 | compatible endpoints. All other changes to the protocol may require a new version |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 151 | number. |
| 152 | |
| 153 | ### Timing & Backoff |
| 154 | Clients and servers are free to negotiate the rate at which the client conducts |
| 155 | update 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 | |
| 182 | In the case of update check failure, retries are generally permitted. The client |
| 183 | is free to attempt an immediate retry or a retry after a delay. |
| 184 | At scale, even a single retry may double load on the update server regardless of |
| 185 | any client delay (unless the client simply delays to its next normal periodic |
| 186 | update check. Clients must not retry if they successfully receive a |
| 187 | CUP-validated response from the server, regardless of the contents. Servers may |
| 188 | protect themselves in the case of overload by issuing an X-Retry-After HTTP |
| 189 | header, detailed [below](#headers-update-check-response). |
| 190 | |
| 191 | For download requets, clients should prefer to fall back to subsequent download |
| 192 | URLs rather than attempting retries on a particular URL. |
| 193 | |
| 194 | ### Safe JSON Prefixes |
| 195 | JSON responses from the server are prefixed with `)]}'\n`, where \n indicates a |
| 196 | new line character. This prevents them from being naively executed as a script |
| 197 | in the context of the update server's origin. |
| 198 | |
| 199 | |
| 200 | ## Update Checks |
| 201 | An update check is the first phase of an Omaha session. In an update check, the |
| 202 | client sends information about what applications it is managing and the server |
| 203 | responds with whether any updates are available for the applications. |
| 204 | |
| 205 | ### URL (Update Check Request) |
| 206 | Update check requests will bear a query parameter as defined by [CUP](cup.md). |
| 207 | |
| 208 | ### Headers (Update Check Request) |
| 209 | Clients should send the following headers with each request. Request headers are |
| 210 | not protected by CUP and therefore should be considered untrusted data. They are |
| 211 | advisory data replicated from the request body so that server-side DoS |
| 212 | prevention mechanisms can inexpensively reject traffic (i.e. without parsing the |
| 213 | request 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) |
| 225 | The request body of an update check contains a JSON object with the following |
| 226 | members: |
| 227 | * `request`: A `request` object. |
| 228 | |
| 229 | #### `request` Object (Update Check Request) |
| 230 | A request object has the following members: |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 231 | * `@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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 235 | * "android": Android. |
| 236 | * "cros": ChromeOS. |
| 237 | * "fuchsia": Fuchsia. |
| 238 | * "linux": Linux. |
| 239 | * "mac": macOS. |
Joshua Pawlicki | 6c31939 | 2024-08-07 21:54:59 | [diff] [blame] | 240 | * "openbsd": OpenBSD. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 241 | * "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 Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 246 | Default: "". The following value(s) are supported: |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 247 | * "crx3": The CRX file format, version 3. |
James Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 248 | * "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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 250 | * `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 Anderson | f26bfa2 | 2022-06-29 19:33:45 | [diff] [blame] | 281 | client (e.g. "stable", "beta", "dev", "canary", "extended"). Default: "". |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 282 | * `updaterversion`: The version of the client that is sending this request. |
| 283 | Default: "0". |
| 284 | |
| 285 | #### `hw` Objects (Update Check Request) |
| 286 | An `hw` object contains information about the capabilities of the client's |
| 287 | hardware. 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) |
| 303 | An `os` object contains information about the operating system that the client |
| 304 | is 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 Pawlicki | c6814be | 2023-04-18 21:22:41 | [diff] [blame] | 308 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 312 | * "dragonfly": DragonFly BSD. |
Joshua Pawlicki | c6814be | 2023-04-18 21:22:41 | [diff] [blame] | 313 | * "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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 324 | * `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. Ganesh | c937718f | 2022-10-26 23:11:11 | [diff] [blame] | 336 | * "x64": x64 |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 337 | |
| 338 | #### `app` Objects (Update Check Request) |
| 339 | Each managed application is represented by exactly one `app` object. It has the |
| 340 | following 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 Bao | bcce5f4 | 2022-10-27 20:17:37 | [diff] [blame] | 355 | * `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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 362 | * `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 Anderson | 6daa172 | 2024-03-18 15:55:41 | [diff] [blame] | 370 | * `fp`: The current [differential fingerprint](#differential-updates) of |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 371 | 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 Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 382 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 388 | * `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 Pawlicki | f14af82 | 2024-05-22 19:37:11 | [diff] [blame] | 392 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 398 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 407 | * `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) |
| 441 | A data object represents a request for arbitrary specific application-specific |
| 442 | data from the server. The server maintains a map of index values to data |
| 443 | contents, and can supply them if requested. This is used during installation to |
| 444 | transmit alternate branding or seeded configurations to the application. `data` |
| 445 | objects have the following members: |
Joshua Pawlicki | 1e1469e | 2022-04-26 17:01:41 | [diff] [blame] | 446 | * `name`: The type of data lookup to perform. The only known supported value |
| 447 | is "install". Default: "". |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 448 | * `index`: The key to look up on the server. Default: "". |
| 449 | |
| 450 | #### `disabled` Objects (Update Check Request) |
| 451 | A disabled object contains information about why an app is disabled. Multiple |
| 452 | causes 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) |
| 458 | An updatecheck object represents the actual intent to update. It has the |
| 459 | following members: |
Joshua Pawlicki | 7776a34 | 2021-08-05 23:04:19 | [diff] [blame] | 460 | * `rollback_allowed`: true if the client will accept a version downgrade. |
| 461 | Typically used in conjunction with a targetversionprefix. Default: false. |
Joshua Pawlicki | b1ee717 | 2022-05-26 19:14:57 | [diff] [blame] | 462 | * `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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 465 | * `targetversionprefix`: A component-wise prefix of a version number, or a |
Joshua Pawlicki | 7776a34 | 2021-08-05 23:04:19 | [diff] [blame] | 466 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 471 | * `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 Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 474 | client will attempt an update if one is instructed). Default: "false". |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 475 | |
| 476 | #### `updater` Objects (Update Check Request) |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 477 | An updater object represents the state of another sibling update program on |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 478 | the system. Clients report about other updaters present on the system to enable |
| 479 | redundancy and recoverability of sibling updaters. For example, Chrome is |
| 480 | normally updated by GoogleUpdate, but in cases where GoogleUpdate has been |
| 481 | disabled or is broken (according to the data transmitted here), the server can |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 482 | issue an action to Chrome to attempt recovery of GoogleUpdate. An updater |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 483 | object 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 Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 491 | 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 Anderson | 4ea9ab145 | 2024-09-04 18:04:01 | [diff] [blame] | 500 | * `lastupdatecheckerrorcat`: The numeric error category encountered on |
Joshua Pawlicki | 9d26a73 | 2024-08-29 18:26:09 | [diff] [blame] | 501 | the last update check. 0 for success. Default: "0". |
Noah Anderson | 4ea9ab145 | 2024-09-04 18:04:01 | [diff] [blame] | 502 | * `lastupdatecheckerrorcode`: The numeric error code encountered on the last |
Joshua Pawlicki | 9d26a73 | 2024-08-29 18:26:09 | [diff] [blame] | 503 | update check. 0 for success. Default: "0". |
Noah Anderson | 4ea9ab145 | 2024-09-04 18:04:01 | [diff] [blame] | 504 | * `lastupdatecheckextracode1`: The numeric extra code encountered on the |
Joshua Pawlicki | 9d26a73 | 2024-08-29 18:26:09 | [diff] [blame] | 505 | last update check. 0 for success. Default: "0". |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 506 | * `laststarted`: An estimated number of hours since the other updater |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 507 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 516 | * `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) |
| 530 | In addition to normal HTTP headers, this protocol defines the following update |
| 531 | check 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) |
| 542 | The response body of an update check begins with `)]}'\n`, where \n indicates a |
| 543 | newline character, followed by a JSON object with the following members: |
| 544 | * `response`: A `response` object. |
| 545 | |
| 546 | #### `response` Objects (Update Check Response) |
| 547 | A response object contains the server's response to a corresponding `request` |
| 548 | object 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. Ganesh | c937718f | 2022-10-26 23:11:11 | [diff] [blame] | 552 | * `systemrequirements`: A `systemrequirements` object. The server will not |
| 553 | send this element, but it may be present in offline installer manifests. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 554 | * `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) |
| 560 | A clock object contains information about the current datetime according to the |
| 561 | server'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. Ganesh | c937718f | 2022-10-26 23:11:11 | [diff] [blame] | 568 | #### `systemrequirements` Objects (Update Check Response) |
| 569 | A `systemrequirements` object contains information about the operating system |
| 570 | that 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. Ganesh | 8d1de21 | 2022-11-10 00:40:10 | [diff] [blame] | 574 | with, or "" if not applicable. |
| 575 | |
| 576 | `arch` can be a single entry, or multiple entries separated with `,`. |
S. Ganesh | c937718f | 2022-10-26 23:11:11 | [diff] [blame] | 577 | Entries prefixed with a `-` (negative entries) indicate non-compatible |
S. Ganesh | 8d1de21 | 2022-11-10 00:40:10 | [diff] [blame] | 578 | 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. Ganesh | c937718f | 2022-10-26 23:11:11 | [diff] [blame] | 592 | * `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. Ganesh | 7141d93 | 2022-11-11 03:46:54 | [diff] [blame] | 599 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 609 | #### `app` Objects (Update Check Response) |
| 610 | An app object represents a per-application acknowledgement of the request. If an |
| 611 | application appears in the request, it must have a corresponding acknowledgement |
| 612 | in 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) |
| 642 | Each data object in the response represents an answer to a data request from the |
| 643 | client. It has the following members: |
Joshua Pawlicki | 1e1469e | 2022-04-26 17:01:41 | [diff] [blame] | 644 | * `name`: The requested data name from `request.app.data.name`, echoed back |
| 645 | to the client. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 646 | * `index`: The requested data index from `request.app.data.index`, echoed |
Joshua Pawlicki | 1e1469e | 2022-04-26 17:01:41 | [diff] [blame] | 647 | back to the client, if valid. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 648 | * `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 Pawlicki | 1e1469e | 2022-04-26 17:01:41 | [diff] [blame] | 656 | * `#text`: The value of the requested data index. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 657 | |
| 658 | #### `updatecheck` Objects (Update Check Response) |
| 659 | An updatecheck response object contains whether or not there is an update |
| 660 | available for the application, and if so, the instructions to install it. It has |
| 661 | the 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 Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 688 | |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 689 | Additionally, 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) |
| 694 | A 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 706 | #### `packages` Objects (Update Check Response) |
| 707 | A packages object describes a set of downloadable files. The 3.1 protocol only |
| 708 | supports a subset of the 3.0 packages, but may be extended in the future to |
| 709 | implement more of the 3.0 protocol's package support. A packages object contains |
| 710 | the 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) |
| 715 | A package object describes a file that must be downloaded and installed as part |
| 716 | of the update. In this version of the protocol, all packages describe CRX files. |
| 717 | Packages can also come in differential update forms. Clients should attempt a |
| 718 | differential patch of package first, and fall back to a full package if the |
| 719 | differential patch fails to apply. A package object has the following members: |
Noah Anderson | 6daa172 | 2024-03-18 15:55:41 | [diff] [blame] | 720 | * `fp`: The [differential fingerprint](#differential-updates) of the |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 721 | 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) |
| 737 | A urls object describes an ordered collection of download URL prefixes. Each URL |
| 738 | in the collection is either a differential or full URL. When attempting a |
| 739 | download of a differential or full package, clients must attempt downloads from |
| 740 | each URL of the appropriate type in the specified order, falling back to the |
| 741 | next URL if a TCP or HTTP error is encountered. A 4xx or 5xx HTTP response |
| 742 | qualifies as an error that justifies a fallback. A successful download of a file |
| 743 | that fails to hash to the expected hash or has an unexpected size also |
| 744 | qualifies. Other network errors may also qualify. |
| 745 | * `url`: A list of `url` objects. |
| 746 | |
| 747 | #### `url` Objects (Update Check Response) |
| 748 | A 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) |
| 759 | An action represents a task that the update client must conduct after |
| 760 | application of the update (if an update is provided), or immediately (if no |
| 761 | update 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 | |
| 776 | Additional members may be present, depending on the action type. |
| 777 | |
| 778 | For `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 |
| 791 | Download requests occur when an application update is needed, as a result of a |
James Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 792 | `response.app.updatecheck.pipelines.operations.urls` member. Download requests |
| 793 | are HTTP GET requests and can use any HTTP implementation. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 794 | |
| 795 | ### Request Headers |
| 796 | In addition to the regular HTTP headers, this protocol defines the following |
| 797 | headers 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 |
| 805 | Ping-back requests are caused by any install, update, or action attempted during |
| 806 | an update session. Ping-backs share a similar structure to update check |
| 807 | requests. |
| 808 | |
| 809 | Ping-back requests are fire-and-forget: the client can discard the server's |
| 810 | response. Ping-back transactions need to be protected by CUP if and only if the |
| 811 | client handles the server's response. |
| 812 | |
| 813 | Ping-back requests can be **bundled** into a single HTTP transaction, or sent |
| 814 | immediately as the events triggering the ping-back occurs. Bundling ping-backs |
| 815 | reduces QPS to the server, but risks ping-back loss if the client crashes, |
| 816 | loses connectivity, or loses power before it transmits the bundle. |
| 817 | |
| 818 | ### Ping-Back Request Headers |
| 819 | Similarly to update-check requests, ping-back requests have additional headers |
| 820 | for 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 |
| 828 | The request body of an ping-back contains a JSON object with the following |
| 829 | members: |
| 830 | * `request`: A `request` object. |
| 831 | |
| 832 | #### `request` Objects (Ping-Back Request) |
| 833 | A 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) |
| 837 | A ping-back `app` object is identical to an update check `app` object, except |
| 838 | for the following differences. |
| 839 | |
| 840 | A ping-back `app` object cannot contain any of the following members: |
| 841 | * `data` |
James Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 842 | * `ping` |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 843 | * `updatecheck` |
| 844 | |
| 845 | A ping-back `app` additionally contains the following members: |
| 846 | * `event`: a list of `event` objects. |
| 847 | |
| 848 | #### `event` Objects (Ping-Back Request) |
| 849 | An event object represents a specific report about an operation the client |
| 850 | attmpted as part of this update session. All events have the following members: |
Joshua Pawlicki | 156727f3 | 2020-02-12 23:31:40 | [diff] [blame] | 851 | * `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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 854 | * 2: An install operation. |
| 855 | * 3: An update operation. |
| 856 | * 4: An uninstall operation. |
| 857 | * 14: A download operation. |
S. Ganesh | 35ba1b5 | 2024-03-19 22:34:53 | [diff] [blame] | 858 | * 41: An app command completion event. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 859 | * 42: An action operation. |
Joshua Pawlicki | 156727f3 | 2020-02-12 23:31:40 | [diff] [blame] | 860 | * `eventresult`: The outcome of the operation. Default: 0. Known values: |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 861 | * 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 Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 866 | * 0: No category. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 867 | * 1: Errors acquiring the download. |
| 868 | * 2: Errors during CRX unpacking. |
S. Ganesh | f83ca12 | 2024-06-14 21:37:57 | [diff] [blame] | 869 | * 3: Update client errors during installation. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 870 | * 4: Errors within the update service itself. |
| 871 | * 5: Error during update check. |
S. Ganesh | f83ca12 | 2024-06-14 21:37:57 | [diff] [blame] | 872 | * 7: Application installer errors during installation. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 873 | * `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 | |
| 882 | Depending on the event type, additional members may be present: |
| 883 | |
James Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 884 | For `eventtype == 2` events: |
Noah Anderson | 6daa172 | 2024-03-18 15:55:41 | [diff] [blame] | 885 | * `nextfp`: The [differential fingerprint](#differential-updates) that |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 886 | 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 Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 891 | For `eventtype == 3` events: |
| 892 | * All the members of `eventtype == 2` events. |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 893 | * `diffresult`: As `eventresult` but specifically for a differential update. A |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 894 | client that successfully applies a differential update should send the |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 895 | 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 Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 897 | indicate the outcome of the full update attempt. |
| 898 | * `differrorcat`: As `errorcat` but for differential updates. Similar to |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 899 | `diffresult`. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 900 | * `differrorcode`: As `errorcode` but for differential updates. Similar to |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 901 | `diffresult`. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 902 | * `diffextracode1`: As `extracode1` but for differential updates. Similar to |
Brian Manthos | 27b82584 | 2020-02-21 21:41:39 | [diff] [blame] | 903 | `diffresult`. |
Noah Anderson | 6daa172 | 2024-03-18 15:55:41 | [diff] [blame] | 904 | * `previousfp`: The [differential fingerprint](#differential-updates) |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 905 | 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 Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 910 | For `eventtype == 14` events: |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 911 | * `download_time_ms`: The time elapsed between the start of the download and |
Sorin Jianu | 0eeea4c8 | 2023-05-19 18:31:06 | [diff] [blame] | 912 | the end of the download, in milliseconds. -1 if unavailable. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 913 | Default: -1. |
Joshua Pawlicki | a01af131 | 2024-08-02 17:55:47 | [diff] [blame] | 914 | * `downloaded`: The number of bytes successfully received from the download |
| 915 | server. Default: 0. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 916 | * `downloader`: A string identifying the download algorithm / stack. Known |
| 917 | values: |
| 918 | * "" (empty string): Unknown downloader. |
Noah Rose Ledesma | 53fa3f9 | 2023-10-27 21:42:22 | [diff] [blame] | 919 | * "nsurlsession_background": MacOS background NSURLSession. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 920 | * "bits": Microsoft BITS. |
| 921 | * "direct": The Chromium network stack. |
Joshua Pawlicki | a01af131 | 2024-08-02 17:55:47 | [diff] [blame] | 922 | * `total`: The number of bytes expected to be downloaded. Default: 0. |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 923 | * `url`: The URL from which the download was attempted. |
| 924 | |
James Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 925 | For `eventtype == 41` events: |
S. Ganesh | 35ba1b5 | 2024-03-19 22:34:53 | [diff] [blame] | 926 | * `appcommandid`: The id of the app command for which the ping is being sent. |
| 927 | |
James Decker | 04ffe43 | 2024-08-27 19:28:29 | [diff] [blame] | 928 | For `eventtype == 42` events: |
Joshua Pawlicki | 3cb0b82 | 2020-01-16 17:42:41 | [diff] [blame] | 929 | * `actiontype`: The type of the action that caused this event. |
| 930 | |
| 931 | ### Ping-Back Response Body |
| 932 | Clients are free to ignore the ping-back response body. However, to allow future |
| 933 | extensions in the ping-back response, the protocol defines a basic ping-back |
| 934 | response body. Clients that do not ignore the ping-back response must protect |
| 935 | the ping request using CUP. |
| 936 | |
| 937 | The response body of an ping-back contains a JSON object with the following |
| 938 | members: |
| 939 | * `response`: A `response` object. |
| 940 | |
| 941 | #### `response` Objects (Ping-Back Response) |
| 942 | A 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) |
| 946 | A ping-back response `app` object is identical to an update check response `app` |
| 947 | object, except for the following differences. |
| 948 | |
| 949 | A ping-back `app` object cannot contain any of the following members: |
| 950 | * `action` |
| 951 | * `data` |
| 952 | * `updatecheck` |
| 953 | |
| 954 | A ping-back `app` additionally contains the following members: |
| 955 | * `event`: a list of `event` objects. |
| 956 | |
| 957 | #### `event` Objects (Ping-Back Response) |
| 958 | A ping-back response `event` object indicates the server's acknowledgement of |
| 959 | the 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 |
| 966 | The 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. |