blob: c390b9ef183059fdc5bbdbb79b7c8f662388d79e [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;
Amin Hassani7fca2862019-03-28 16:09:22 -070088};
89
90// Encodes XML entities in a given string. Input must be ASCII-7 valid. If
91// the input is invalid, the default value is used instead.
92std::string XmlEncodeWithDefault(const std::string& input,
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -070093 const std::string& default_value = "");
Amin Hassani7fca2862019-03-28 16:09:22 -070094
95// Escapes text so it can be included as character data and attribute
96// values. The |input| string must be valid ASCII-7, no UTF-8 supported.
97// Returns whether the |input| was valid and escaped properly in |output|.
98bool XmlEncode(const std::string& input, std::string* output);
99
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700100// Returns a boolean based on examining each character on whether it's a valid
101// component (meaning all characters are an alphanum excluding '-', '_', '.').
Amin Hassani7fca2862019-03-28 16:09:22 -0700102bool IsValidComponentID(const std::string& id);
103
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700104class OmahaRequestBuilder {
105 public:
106 OmahaRequestBuilder() = default;
107 virtual ~OmahaRequestBuilder() = default;
Amin Hassani7fca2862019-03-28 16:09:22 -0700108
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700109 virtual std::string GetRequest() const = 0;
Amin Hassani7fca2862019-03-28 16:09:22 -0700110
Jae Hoon Kimb7ee3872019-06-06 14:59:03 -0700111 private:
112 DISALLOW_COPY_AND_ASSIGN(OmahaRequestBuilder);
113};
114
115class OmahaRequestBuilderXml : OmahaRequestBuilder {
116 public:
117 OmahaRequestBuilderXml(const OmahaEvent* event,
118 OmahaRequestParams* params,
119 bool ping_only,
120 bool include_ping,
121 int ping_active_days,
122 int ping_roll_call_days,
123 int install_date_in_days,
124 PrefsInterface* prefs)
125 : event_(event),
126 params_(params),
127 ping_only_(ping_only),
128 include_ping_(include_ping),
129 ping_active_days_(ping_active_days),
130 ping_roll_call_days_(ping_roll_call_days),
131 install_date_in_days_(install_date_in_days),
132 prefs_(prefs) {}
133
134 ~OmahaRequestBuilderXml() override = default;
135
136 // Returns an XML that corresponds to the entire Omaha request.
137 std::string GetRequest() const override;
138
139 private:
140 // Returns an XML that corresponds to the entire <os> node of the Omaha
141 // request based on the member variables.
142 std::string GetOs() const;
143
144 // Returns an XML that corresponds to all <app> nodes of the Omaha
145 // request based on the given parameters.
146 std::string GetApps() const;
147
148 // Returns an XML that corresponds to the single <app> node of the Omaha
149 // request based on the given parameters.
150 std::string GetApp(const OmahaAppData& app_data) const;
151
152 // Returns an XML that goes into the body of the <app> element of the Omaha
153 // request based on the given parameters.
154 // The skip_updatecheck argument if set to true will omit the emission of
155 // the updatecheck xml tag in the body of the <app> element.
156 std::string GetAppBody(bool skip_updatecheck) const;
157
158 // Returns the cohort* argument to include in the <app> tag for the passed
159 // |arg_name| and |prefs_key|, if any. The return value is suitable to
160 // concatenate to the list of arguments and includes a space at the end.
161 std::string GetCohortArg(const std::string arg_name,
162 const std::string prefs_key) const;
163
164 // Returns an XML ping element if any of the elapsed days need to be
165 // sent, or an empty string otherwise.
166 std::string GetPing() const;
167
168 const OmahaEvent* event_;
169 OmahaRequestParams* params_;
170 bool ping_only_;
171 bool include_ping_;
172 int ping_active_days_;
173 int ping_roll_call_days_;
174 int install_date_in_days_;
175 PrefsInterface* prefs_;
176
177 DISALLOW_COPY_AND_ASSIGN(OmahaRequestBuilderXml);
178};
Amin Hassani7fca2862019-03-28 16:09:22 -0700179
180} // namespace chromeos_update_engine
181
182#endif // UPDATE_ENGINE_OMAHA_REQUEST_BUILDER_XML_H_