• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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