1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "update_policy_utils.h"
17
18 #include <fcntl.h>
19 #include <unistd.h>
20
21 #include "securec.h"
22
23 #include "edm_constants.h"
24 #include "edm_log.h"
25
26 namespace OHOS {
27 namespace EDM {
28
29 constexpr uint32_t MAX_PACKAGES_SIZE = 10;
ProcessUpdatePolicyType(int32_t type,UpdatePolicyType & updatePolicyType)30 bool UpdatePolicyUtils::ProcessUpdatePolicyType(int32_t type, UpdatePolicyType &updatePolicyType)
31 {
32 if (type >= static_cast<int32_t>(UpdatePolicyType::DEFAULT) &&
33 type <= static_cast<int32_t>(UpdatePolicyType::POSTPONE)) {
34 updatePolicyType = static_cast<UpdatePolicyType>(type);
35 return true;
36 }
37 return false;
38 }
39
ProcessPackageType(int32_t type,PackageType & packageType)40 void UpdatePolicyUtils::ProcessPackageType(int32_t type, PackageType &packageType)
41 {
42 packageType = PackageType::UNKNOWN;
43 if (type == static_cast<int32_t>(PackageType::FIRMWARE)) {
44 packageType = static_cast<PackageType>(type);
45 }
46 }
47
ProcessUpgradeStatus(int32_t status,UpgradeStatus & upgradeStatus)48 void UpdatePolicyUtils::ProcessUpgradeStatus(int32_t status, UpgradeStatus &upgradeStatus)
49 {
50 upgradeStatus = UpgradeStatus::UPGRADE_SUCCESS;
51 if (status >= static_cast<int32_t>(UpgradeStatus::NO_UPGRADE_PACKAGE) &&
52 status <= static_cast<int32_t>(UpgradeStatus::UPGRADE_SUCCESS)) {
53 upgradeStatus = static_cast<UpgradeStatus>(status);
54 }
55 }
56
ProcessOtaPolicyType(int32_t type,OtaPolicyType & otaPolicyType)57 void UpdatePolicyUtils::ProcessOtaPolicyType(int32_t type, OtaPolicyType &otaPolicyType)
58 {
59 if (type >= static_cast<int32_t>(OtaPolicyType::DEFAULT) &&
60 type <= static_cast<int32_t>(OtaPolicyType::DISABLE_OTA)) {
61 otaPolicyType = static_cast<OtaPolicyType>(type);
62 } else {
63 otaPolicyType = OtaPolicyType::DEFAULT;
64 }
65 }
66
WriteUpdatePolicy(MessageParcel & data,const UpdatePolicy & updatePolicy)67 void UpdatePolicyUtils::WriteUpdatePolicy(MessageParcel &data, const UpdatePolicy &updatePolicy)
68 {
69 data.WriteInt32(static_cast<int32_t>(updatePolicy.type));
70 data.WriteString(updatePolicy.version);
71 data.WriteInt64(updatePolicy.installTime.latestUpdateTime);
72 data.WriteInt64(updatePolicy.installTime.delayUpdateTime);
73 data.WriteInt64(updatePolicy.installTime.installWindowStart);
74 data.WriteInt64(updatePolicy.installTime.installWindowEnd);
75 data.WriteInt32(static_cast<int32_t>(updatePolicy.otaPolicyType));
76 }
77
ReadUpdatePolicy(MessageParcel & data,UpdatePolicy & updatePolicy)78 void UpdatePolicyUtils::ReadUpdatePolicy(MessageParcel &data, UpdatePolicy &updatePolicy)
79 {
80 UpdatePolicyUtils::ProcessUpdatePolicyType(data.ReadInt32(), updatePolicy.type);
81 data.ReadString(updatePolicy.version);
82 data.ReadInt64(updatePolicy.installTime.latestUpdateTime);
83 data.ReadInt64(updatePolicy.installTime.delayUpdateTime);
84 data.ReadInt64(updatePolicy.installTime.installWindowStart);
85 data.ReadInt64(updatePolicy.installTime.installWindowEnd);
86 UpdatePolicyUtils::ProcessOtaPolicyType(data.ReadInt32(), updatePolicy.otaPolicyType);
87 }
88
WriteUpgradePackageInfo(MessageParcel & data,UpgradePackageInfo & packageInfo)89 void UpdatePolicyUtils::WriteUpgradePackageInfo(MessageParcel &data, UpgradePackageInfo &packageInfo)
90 {
91 data.WriteString(packageInfo.version);
92 data.WriteUint32(packageInfo.packages.size());
93 for (auto package : packageInfo.packages) {
94 data.WriteInt32(static_cast<int32_t>(package.type));
95 data.WriteString(package.path);
96 data.WriteFileDescriptor(package.fd);
97 }
98 data.WriteString(packageInfo.description.notify.installTips);
99 data.WriteString(packageInfo.description.notify.installTipsDetail);
100 data.WriteUint32(packageInfo.authInfoSize);
101 if (packageInfo.authInfoSize >= EdmConstants::AUTH_INFO_MAX_SIZE) {
102 EDMLOGE("UpdatePolicyUtils::WriteUpgradePackageInfo auth info too long.");
103 return;
104 }
105 data.WriteCString(packageInfo.authInfo);
106 errno_t err = memset_s(packageInfo.authInfo, sizeof(packageInfo.authInfo), 0, sizeof(packageInfo.authInfo));
107 if (err != EOK) {
108 EDMLOGE("UpdatePolicyUtils::WriteUpgradePackageInfo memset_s failed: %{public}d.", err);
109 }
110 }
111
ReadUpgradePackageInfo(MessageParcel & data,UpgradePackageInfo & packageInfo)112 void UpdatePolicyUtils::ReadUpgradePackageInfo(MessageParcel &data, UpgradePackageInfo &packageInfo)
113 {
114 data.ReadString(packageInfo.version);
115 size_t size = data.ReadUint32();
116 if (size > MAX_PACKAGES_SIZE) {
117 return;
118 }
119 for (size_t i = 0; i < size; i++) {
120 Package package;
121 ProcessPackageType(data.ReadInt32(), package.type);
122 data.ReadString(package.path);
123 package.fd = data.ReadFileDescriptor();
124 packageInfo.packages.push_back(package);
125 }
126 data.ReadString(packageInfo.description.notify.installTips);
127 data.ReadString(packageInfo.description.notify.installTipsDetail);
128 data.ReadUint32(packageInfo.authInfoSize);
129 if (packageInfo.authInfoSize >= EdmConstants::AUTH_INFO_MAX_SIZE) {
130 EDMLOGE("UpdatePolicyUtils::ReadUpgradePackageInfo auth info too long.");
131 return;
132 }
133 errno_t err = memcpy_s(packageInfo.authInfo, sizeof(packageInfo.authInfo), data.ReadCString(),
134 packageInfo.authInfoSize);
135 if (err != EOK) {
136 EDMLOGE("UpdatePolicyUtils::ReadUpgradePackageInfo memset_s failed: %{public}d.", err);
137 }
138 }
139
WriteUpgradeResult(MessageParcel & data,const UpgradeResult & result)140 void UpdatePolicyUtils::WriteUpgradeResult(MessageParcel &data, const UpgradeResult &result)
141 {
142 data.WriteString(result.version);
143 data.WriteInt32(static_cast<int32_t>(result.status));
144 data.WriteInt32(result.errorCode);
145 data.WriteString(result.errorMessage);
146 }
147
ReadUpgradeResult(MessageParcel & data,UpgradeResult & result)148 void UpdatePolicyUtils::ReadUpgradeResult(MessageParcel &data, UpgradeResult &result)
149 {
150 data.ReadString(result.version);
151 ProcessUpgradeStatus(data.ReadInt32(), result.status);
152 data.ReadInt32(result.errorCode);
153 data.ReadString(result.errorMessage);
154 }
155
ClosePackagesFileHandle(std::vector<Package> & packages)156 void UpdatePolicyUtils::ClosePackagesFileHandle(std::vector<Package> &packages)
157 {
158 for (auto &package : packages) {
159 if (package.fd >= 0 && fcntl(package.fd, F_GETFL) != -1) {
160 if (close(package.fd) != 0) {
161 EDMLOGW("ClosePackagesFileHandle failed");
162 }
163 package.fd = -1;
164 }
165 }
166 }
167 } // namespace EDM
168 } // namespace OHOS