blob: 488be8acaf5662b78eb17036161c930fc6d16c71 [file] [log] [blame]
Amin Hassani7fca2862019-03-28 16:09:22 -07001//
2// Copyright (C) 2019 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17#ifndef UPDATE_ENGINE_OMAHA_REQUEST_BUILDER_XML_H_
18#define UPDATE_ENGINE_OMAHA_REQUEST_BUILDER_XML_H_
19
20#include <fcntl.h>
21#include <sys/stat.h>
22#include <sys/types.h>
23
24#include <map>
25#include <memory>
26#include <string>
27#include <vector>
28
29#include <gtest/gtest_prod.h> // for FRIEND_TEST
30
31#include <brillo/secure_blob.h>
32#include <curl/curl.h>
33
34#include "update_engine/common/action.h"
35#include "update_engine/common/http_fetcher.h"
36#include "update_engine/omaha_response.h"
37#include "update_engine/system_state.h"
38
Amin Hassani7fca2862019-03-28 16:09:22 -070039namespace chromeos_update_engine {
40
41extern const int kNeverPinged;
42
43// This struct encapsulates the Omaha event information. For a
44// complete list of defined event types and results, see
45// http://code.google.com/p/omaha/wiki/ServerProtocol#event
46struct OmahaEvent {
47 // The Type values correspond to EVENT_TYPE values of Omaha.
48 enum Type {
49 kTypeUnknown = 0,
50 kTypeDownloadComplete = 1,
51 kTypeInstallComplete = 2,
52 kTypeUpdateComplete = 3,
53 kTypeUpdateDownloadStarted = 13,
54 kTypeUpdateDownloadFinished = 14,
55 // Chromium OS reserved type sent after the first reboot following an update
56 // completed.
57 kTypeRebootedAfterUpdate = 54,
58 };
59
60 // The Result values correspond to EVENT_RESULT values of Omaha.
61 enum Result {
62 kResultError = 0,
63 kResultSuccess = 1,
64 kResultUpdateDeferred = 9, // When we ignore/defer updates due to policy.
65 };
66
67 OmahaEvent()
68 : type(kTypeUnknown),
69 result(kResultError),
70 error_code(ErrorCode::kError) {}
71 explicit OmahaEvent(Type in_type)
72 : type(in_type),
73 result(kResultSuccess),
74 error_code(ErrorCode::kSuccess) {}
75 OmahaEvent(Type in_type, Result in_result, ErrorCode in_error_code)
76 : type(in_type), result(in_result), error_code(in_error_code) {}
77
78 Type type;
79 Result result;
80 ErrorCode error_code;
81};
82
83struct OmahaAppData {
84 std::string id;
85 std::string version;
86 std::string product_components;
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -070087 bool skip_update;
Jae Hoon Kim37d15372020-01-08 18:11:26 -080088 bool is_dlc;
Amin Hassani7fca2862019-03-28 16:09:22 -070089};
90
91// Encodes XML entities in a given string. Input must be ASCII-7 valid. If
92// the input is invalid, the default value is used instead.
93std::string XmlEncodeWithDefault(const std::string& input,
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -070094 const std::string& default_value = "");
Amin Hassani7fca2862019-03-28 16:09:22 -070095
96// Escapes text so it can be included as character data and attribute
97// values. The |input| string must be valid ASCII-7, no UTF-8 supported.
98// Returns whether the |input| was valid and escaped properly in |output|.
99bool XmlEncode(const std::string& input, std::string* output);
100
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700101// Returns a boolean based on examining each character on whether it's a valid
102// component (meaning all characters are an alphanum excluding '-', '_', '.').
Amin Hassani7fca2862019-03-28 16:09:22 -0700103bool IsValidComponentID(const std::string& id);
104
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700105class OmahaRequestBuilder {
106 public:
107 OmahaRequestBuilder() = default;
108 virtual ~OmahaRequestBuilder() = default;
Amin Hassani7fca2862019-03-28 16:09:22 -0700109
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700110 virtual std::string GetRequest() const = 0;
Amin Hassani7fca2862019-03-28 16:09:22 -0700111
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700112 private:
113 DISALLOW_COPY_AND_ASSIGN(OmahaRequestBuilder);
114};
115
116class OmahaRequestBuilderXml : OmahaRequestBuilder {
117 public:
118 OmahaRequestBuilderXml(const OmahaEvent* event,
119 OmahaRequestParams* params,
120 bool ping_only,
121 bool include_ping,
122 int ping_active_days,
123 int ping_roll_call_days,
124 int install_date_in_days,
Jae Hoon Kimedb65502019-06-14 11:52:17 -0700125 PrefsInterface* prefs,
126 const std::string& session_id)
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700127 : event_(event),
128 params_(params),
129 ping_only_(ping_only),
130 include_ping_(include_ping),
131 ping_active_days_(ping_active_days),
132 ping_roll_call_days_(ping_roll_call_days),
133 install_date_in_days_(install_date_in_days),
Jae Hoon Kimedb65502019-06-14 11:52:17 -0700134 prefs_(prefs),
135 session_id_(session_id) {}
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700136
137 ~OmahaRequestBuilderXml() override = default;
138
139 // Returns an XML that corresponds to the entire Omaha request.
140 std::string GetRequest() const override;
141
142 private:
Jae Hoon Kim37d15372020-01-08 18:11:26 -0800143 FRIEND_TEST(OmahaRequestBuilderXmlTest, PlatformGetAppTest);
144 FRIEND_TEST(OmahaRequestBuilderXmlTest, DlcGetAppTest);
145
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700146 // Returns an XML that corresponds to the entire <os> node of the Omaha
147 // request based on the member variables.
148 std::string GetOs() const;
149
150 // Returns an XML that corresponds to all <app> nodes of the Omaha
151 // request based on the given parameters.
152 std::string GetApps() const;
153
154 // Returns an XML that corresponds to the single <app> node of the Omaha
155 // request based on the given parameters.
156 std::string GetApp(const OmahaAppData& app_data) const;
157
158 // Returns an XML that goes into the body of the <app> element of the Omaha
159 // request based on the given parameters.
160 // The skip_updatecheck argument if set to true will omit the emission of
161 // the updatecheck xml tag in the body of the <app> element.
162 std::string GetAppBody(bool skip_updatecheck) const;
163
164 // Returns the cohort* argument to include in the <app> tag for the passed
165 // |arg_name| and |prefs_key|, if any. The return value is suitable to
166 // concatenate to the list of arguments and includes a space at the end.
167 std::string GetCohortArg(const std::string arg_name,
Askar Aitzhan18fff842019-06-21 23:24:37 +0200168 const std::string prefs_key,
169 const std::string override_value = "") const;
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700170
171 // Returns an XML ping element if any of the elapsed days need to be
172 // sent, or an empty string otherwise.
173 std::string GetPing() const;
174
175 const OmahaEvent* event_;
176 OmahaRequestParams* params_;
177 bool ping_only_;
178 bool include_ping_;
179 int ping_active_days_;
180 int ping_roll_call_days_;
181 int install_date_in_days_;
182 PrefsInterface* prefs_;
Jae Hoon Kimedb65502019-06-14 11:52:17 -0700183 std::string session_id_;
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700184
185 DISALLOW_COPY_AND_ASSIGN(OmahaRequestBuilderXml);
186};
Amin Hassani7fca2862019-03-28 16:09:22 -0700187
188} // namespace chromeos_update_engine
189
190#endif // UPDATE_ENGINE_OMAHA_REQUEST_BUILDER_XML_H_