1 /*
2 * Copyright (c) 2022-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 "enterprise_admin_stub.h"
17
18 #include <accesstoken_kit.h>
19 #include <ipc_skeleton.h>
20
21 #include "edm_log.h"
22
23 namespace OHOS {
24 namespace EDM {
25
26 constexpr const int EDM_UID = 3057;
27
EnterpriseAdminStub()28 EnterpriseAdminStub::EnterpriseAdminStub()
29 {
30 AddCallFuncMap();
31 EDMLOGD("EnterpriseAdminStub()");
32 }
33
~EnterpriseAdminStub()34 EnterpriseAdminStub::~EnterpriseAdminStub()
35 {
36 EDMLOGD("~EnterpriseAdminStub()");
37 }
38
AddCallFuncMap()39 void EnterpriseAdminStub::AddCallFuncMap()
40 {
41 memberFuncMap_[COMMAND_ON_ADMIN_ENABLED] = &EnterpriseAdminStub::OnAdminEnabledInner;
42 memberFuncMap_[COMMAND_ON_ADMIN_DISABLED] = &EnterpriseAdminStub::OnAdminDisabledInner;
43 memberFuncMap_[COMMAND_ON_BUNDLE_ADDED] = &EnterpriseAdminStub::OnBundleAddedInner;
44 memberFuncMap_[COMMAND_ON_BUNDLE_REMOVED] = &EnterpriseAdminStub::OnBundleRemovedInner;
45 memberFuncMap_[COMMAND_ON_APP_START] = &EnterpriseAdminStub::OnAppStartInner;
46 memberFuncMap_[COMMAND_ON_APP_STOP] = &EnterpriseAdminStub::OnAppStopInner;
47 memberFuncMap_[COMMAND_ON_SYSTEM_UPDATE] = &EnterpriseAdminStub::OnSystemUpdateInner;
48 }
49
OnAdminEnabledInner(MessageParcel & data,MessageParcel & reply)50 void EnterpriseAdminStub::OnAdminEnabledInner(MessageParcel& data, MessageParcel& reply)
51 {
52 EDMLOGI("EnterpriseAdminStub::OnAdminEnabled");
53 OnAdminEnabled();
54 }
55
OnAdminDisabledInner(MessageParcel & data,MessageParcel & reply)56 void EnterpriseAdminStub::OnAdminDisabledInner(MessageParcel& data, MessageParcel& reply)
57 {
58 EDMLOGI("EnterpriseAdminStub::OnAdminDisabled");
59 OnAdminDisabled();
60 }
61
OnBundleAddedInner(MessageParcel & data,MessageParcel & reply)62 void EnterpriseAdminStub::OnBundleAddedInner(MessageParcel& data, MessageParcel& reply)
63 {
64 EDMLOGI("EnterpriseAdminStub::OnBundleAdded");
65 std::string bundleName = data.ReadString();
66 OnBundleAdded(bundleName);
67 }
68
OnBundleRemovedInner(MessageParcel & data,MessageParcel & reply)69 void EnterpriseAdminStub::OnBundleRemovedInner(MessageParcel& data, MessageParcel& reply)
70 {
71 EDMLOGI("EnterpriseAdminStub::OnBundleRemoved");
72 std::string bundleName = data.ReadString();
73 OnBundleRemoved(bundleName);
74 }
75
OnAppStartInner(MessageParcel & data,MessageParcel & reply)76 void EnterpriseAdminStub::OnAppStartInner(MessageParcel& data, MessageParcel& reply)
77 {
78 EDMLOGI("EnterpriseAdminStub::OnAppStart");
79 std::string bundleName = data.ReadString();
80 OnAppStart(bundleName);
81 }
82
OnAppStopInner(MessageParcel & data,MessageParcel & reply)83 void EnterpriseAdminStub::OnAppStopInner(MessageParcel& data, MessageParcel& reply)
84 {
85 EDMLOGI("EnterpriseAdminStub::OnAppStop");
86 std::string bundleName = data.ReadString();
87 OnAppStop(bundleName);
88 }
89
OnSystemUpdateInner(MessageParcel & data,MessageParcel & reply)90 void EnterpriseAdminStub::OnSystemUpdateInner(MessageParcel& data, MessageParcel& reply)
91 {
92 EDMLOGI("EnterpriseAdminStub::OnSystemUpdate");
93 UpdateInfo updateInfo;
94 updateInfo.version = data.ReadString();
95 updateInfo.firstReceivedTime = data.ReadInt64();
96 updateInfo.packageType = data.ReadString();
97 OnSystemUpdate(updateInfo);
98 }
99
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)100 int32_t EnterpriseAdminStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply,
101 MessageOption &option)
102 {
103 auto remoteDescriptor = data.ReadInterfaceToken();
104 EDMLOGI("EnterpriseAdminStub code %{public}u", code);
105 if (GetDescriptor() != remoteDescriptor) {
106 EDMLOGE("EnterpriseAdminStub::OnRemoteRequest failed, descriptor is not matched!");
107 return ERR_INVALID_STATE;
108 }
109
110 Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
111 Security::AccessToken::ATokenTypeEnum tokenType =
112 Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
113 if (tokenType != Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE) {
114 EDMLOGE("EnterpriseAdminStub::OnRemoteRequest failed, caller tokenType is not matched");
115 return ERR_INVALID_STATE;
116 }
117 int uid = GetCallingUid();
118 if (uid != EDM_UID) {
119 EDMLOGE("EnterpriseAdminStub::OnRemoteRequest failed, caller uid is not matched");
120 return ERR_INVALID_STATE;
121 }
122
123 auto func = memberFuncMap_.find(code);
124 if (func != memberFuncMap_.end()) {
125 auto memberFunc = func->second;
126 if (memberFunc != nullptr) {
127 (this->*memberFunc)(data, reply);
128 return ERR_NONE;
129 }
130 return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
131 }
132
133 return ERR_TRANSACTION_FAILED;
134 }
135 } // namespace EDM
136 } // namespace OHOS
137