1 /*
2  * Copyright (c) 2023 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 "device_settings_proxy.h"
17 
18 #include "edm_log.h"
19 #include "func_code.h"
20 
21 namespace OHOS {
22 namespace EDM {
23 std::shared_ptr<DeviceSettingsProxy> DeviceSettingsProxy::instance_ = nullptr;
24 std::mutex DeviceSettingsProxy::mutexLock_;
25 const std::u16string DESCRIPTOR = u"ohos.edm.IEnterpriseDeviceMgr";
26 
GetDeviceSettingsProxy()27 std::shared_ptr<DeviceSettingsProxy> DeviceSettingsProxy::GetDeviceSettingsProxy()
28 {
29     if (instance_ == nullptr) {
30         std::lock_guard<std::mutex> lock(mutexLock_);
31         if (instance_ == nullptr) {
32             std::shared_ptr<DeviceSettingsProxy> temp = std::make_shared<DeviceSettingsProxy>();
33             instance_ = temp;
34         }
35     }
36     return instance_;
37 }
38 
SetScreenOffTime(const AppExecFwk::ElementName & admin,int32_t value,const std::string & permissionTag)39 int32_t DeviceSettingsProxy::SetScreenOffTime(const AppExecFwk::ElementName &admin, int32_t value,
40     const std::string &permissionTag)
41 {
42     EDMLOGD("DeviceSettingsProxy::SetScreenOffTime");
43     MessageParcel data;
44     data.WriteInterfaceToken(DESCRIPTOR);
45     data.WriteInt32(WITHOUT_USERID);
46     data.WriteParcelable(&admin);
47     data.WriteString(permissionTag);
48     data.WriteInt32(value);
49     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET, EdmInterfaceCode::SCREEN_OFF_TIME);
50     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
51 }
52 
GetScreenOffTime(const AppExecFwk::ElementName & admin,int32_t & value,const std::string & permissionTag)53 int32_t DeviceSettingsProxy::GetScreenOffTime(const AppExecFwk::ElementName &admin, int32_t &value,
54     const std::string &permissionTag)
55 {
56     EDMLOGD("DeviceSettingsProxy::GetScreenOffTime");
57     auto proxy = EnterpriseDeviceMgrProxy::GetInstance();
58     MessageParcel data;
59     MessageParcel reply;
60     data.WriteInterfaceToken(DESCRIPTOR);
61     data.WriteInt32(WITHOUT_USERID);
62     data.WriteString(permissionTag);
63     data.WriteInt32(HAS_ADMIN);
64     data.WriteParcelable(&admin);
65     proxy->GetPolicy(EdmInterfaceCode::SCREEN_OFF_TIME, data, reply);
66     int32_t ret = ERR_INVALID_VALUE;
67     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
68     if (!blRes) {
69         EDMLOGE("EnterpriseDeviceMgrProxy:GetPolicy fail. %{public}d", ret);
70         return ret;
71     }
72     reply.ReadInt32(value);
73     return ERR_OK;
74 }
75 
InstallUserCertificate(const AppExecFwk::ElementName & admin,const std::vector<uint8_t> & certArray,std::string & alias,std::string & result,std::string & innerCodeMsg)76 int32_t DeviceSettingsProxy::InstallUserCertificate(const AppExecFwk::ElementName &admin,
77     const std::vector<uint8_t> &certArray, std::string &alias, std::string &result, std::string &innerCodeMsg)
78 {
79     EDMLOGD("DeviceSettingsProxy::InstallUserCertificate");
80     MessageParcel data;
81     MessageParcel reply;
82     std::uint32_t funcCode =
83         POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET, EdmInterfaceCode::INSTALL_CERTIFICATE);
84     data.WriteInterfaceToken(DESCRIPTOR);
85     data.WriteInt32(WITHOUT_USERID);
86     data.WriteParcelable(&admin);
87     data.WriteString(WITHOUT_PERMISSION_TAG);
88     data.WriteUInt8Vector(certArray);
89     data.WriteString(alias);
90     ErrCode ret = EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data, reply);
91     EDMLOGI("DeviceSettingsProxy::InstallUserCertificate : %{public}d.", ret);
92     if (ret == ERR_OK) {
93         result = reply.ReadString();
94     } else if (ret == EdmReturnErrCode::MANAGED_CERTIFICATE_FAILED) {
95         int32_t certRetCode = ERR_INVALID_VALUE;
96         reply.ReadInt32(certRetCode);
97         innerCodeMsg = std::to_string(certRetCode);
98     }
99     return ret;
100 }
101 
UninstallUserCertificate(const AppExecFwk::ElementName & admin,const std::string & alias,std::string & innerCodeMsg)102 int32_t DeviceSettingsProxy::UninstallUserCertificate(const AppExecFwk::ElementName &admin, const std::string &alias,
103     std::string &innerCodeMsg)
104 {
105     EDMLOGD("DeviceSettingsProxy::UninstallUserCertificate");
106     MessageParcel data;
107     MessageParcel reply;
108     std::uint32_t funcCode =
109         POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::REMOVE, EdmInterfaceCode::INSTALL_CERTIFICATE);
110     data.WriteInterfaceToken(DESCRIPTOR);
111     data.WriteInt32(WITHOUT_USERID);
112     data.WriteParcelable(&admin);
113     data.WriteString(WITHOUT_PERMISSION_TAG);
114     data.WriteString(alias);
115     ErrCode ret = EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data, reply);
116     if (ret == EdmReturnErrCode::MANAGED_CERTIFICATE_FAILED) {
117         int32_t certRetCode = ERR_INVALID_VALUE;
118         reply.ReadInt32(certRetCode);
119         innerCodeMsg = std::to_string(certRetCode);
120     }
121     return ret;
122 }
123 
SetPowerPolicy(const AppExecFwk::ElementName & admin,const PowerScene & powerScene,const PowerPolicy & powerPolicy)124 int32_t DeviceSettingsProxy::SetPowerPolicy(const AppExecFwk::ElementName &admin, const PowerScene &powerScene,
125     const PowerPolicy &powerPolicy)
126 {
127     EDMLOGD("DeviceSettingsProxy::SetPowerPolicy");
128     MessageParcel data;
129     MessageParcel reply;
130     std::uint32_t funcCode = POLICY_FUNC_CODE((std::uint32_t)FuncOperateType::SET, EdmInterfaceCode::POWER_POLICY);
131     data.WriteInterfaceToken(DESCRIPTOR);
132     data.WriteInt32(WITHOUT_USERID);
133     data.WriteParcelable(&admin);
134     data.WriteString(WITHOUT_PERMISSION_TAG);
135     data.WriteUint32(static_cast<uint32_t>(powerScene));
136     if (!powerPolicy.Marshalling(data)) {
137         EDMLOGE("DeviceSettingsProxy::SetPowerPolicy Marshalling proxy fail.");
138         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
139     }
140     return EnterpriseDeviceMgrProxy::GetInstance()->HandleDevicePolicy(funcCode, data);
141 }
142 
GetPowerPolicy(const AppExecFwk::ElementName & admin,const PowerScene & powerScene,PowerPolicy & powerPolicy)143 int32_t DeviceSettingsProxy::GetPowerPolicy(const AppExecFwk::ElementName &admin, const PowerScene &powerScene,
144     PowerPolicy &powerPolicy)
145 {
146     EDMLOGD("DeviceSettingsProxy::GetPowerPolicy");
147     MessageParcel data;
148     MessageParcel reply;
149     data.WriteInterfaceToken(DESCRIPTOR);
150     data.WriteInt32(WITHOUT_USERID);
151     data.WriteString(WITHOUT_PERMISSION_TAG);
152     data.WriteInt32(HAS_ADMIN);
153     data.WriteParcelable(&admin);
154     data.WriteUint32(static_cast<uint32_t>(powerScene));
155     EnterpriseDeviceMgrProxy::GetInstance()->GetPolicy(EdmInterfaceCode::POWER_POLICY, data, reply);
156     int32_t ret = ERR_INVALID_VALUE;
157     bool blRes = reply.ReadInt32(ret) && (ret == ERR_OK);
158     if (!blRes) {
159         EDMLOGE("DeviceSettingsProxy:getPowerPolicy fail. %{public}d", ret);
160         return ret;
161     }
162     if (!PowerPolicy::Unmarshalling(reply, powerPolicy)) {
163         EDMLOGE("DeviceSettingsProxy::getPowerPolicy Unmarshalling power policy fail.");
164         return EdmReturnErrCode::SYSTEM_ABNORMALLY;
165     }
166     return ERR_OK;
167 }
168 } // namespace EDM
169 } // namespace OHOS