鸿蒙OpenHarmony分布式调度详解|dmslite_permission.c
·
📌往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)
①📖 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
②📖嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
③📖 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
④📖 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
⑤📖 记录一场鸿蒙开发岗位面试经历~
⑥📖 持续更新中……
前言
本部分分析的代码位于foundation\distributedschedule\dmsfwk_lite\source\dmslite_permission.c。这个文件中的函数用于在任务调度过程中进行权限检查。其中CheckRemotePermission()执行主要的权限检查工作,GetBmsInterface()仅针对FOUNDATION用户,用于调出获取需要检查的包信息。
代码分析
获取bms接口
/**
* 函数功能:该函数仅用于FOUNDATION用户,调用SAMGR获取Feature,从而获取包信息
* 函数参数:
* bmsInterface:传入的BmsServerProxy结构体对象
* 函数返回值:
* 成功返回true,失败返回false
*/
static bool GetBmsInterface(struct BmsServerProxy **bmsInterface)
{
IUnknown *iUnknown = SAMGR_GetInstance()->GetFeatureApi(BMS_SERVICE, BMS_FEATURE); // 使用SAMGR调用FeatureApi获取iUnknown对象
if (iUnknown == NULL) {
HILOGE("[GetFeatureApi failed]");
return false;
}
int32_t errCode = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **) bmsInterface);
if (errCode != EC_SUCCESS) {
HILOGE("[QueryInterface failed]");
return false;
}
return true;
}
检查远程是否有与本地FAs交互的权限
/**
* 函数功能:检查远程是否有与本地FAs交互的权限
* 函数参数:
* permissionCheckInfo:检查远程权限所需的解析信息
* 返回值:
* 成功返回0,否则返回非零值
* 说明:
* 1.判断所检查的信息是否为空
* 2.初始化包信息
* 3.获取调用者的uid
* 4.根据uid获取相应的包信息
* 5.构造签名字符串,并进行签名比对
*/
int32_t CheckRemotePermission(const PermissionCheckInfo *permissionCheckInfo)
{
if (permissionCheckInfo == NULL) { // 检查参数的有效性
return DMS_EC_FAILURE;
}
BundleInfo bundleInfo; // 初始化一个包信息结构体对象,并为其填充为0
if (memset_s(&bundleInfo, sizeof(BundleInfo), 0x00, sizeof(BundleInfo)) != EOK) {
HILOGE("[bundleInfo memset failed]");
return DMS_EC_FAILURE;
}
int32_t errCode;
#ifndef APP_PLATFORM_WATCHGT
uid_t callerUid = getuid(); // 获取当前用户id
if (callerUid == FOUNDATION_UID) { // 如果为FOUNDATION用户,则是进程内模式,属于进程间调用,否则属于跨进程调用
/* inner-process mode */
struct BmsServerProxy *bmsInterface = NULL; // 从BmsServerProxy对象中获取包信息
if (!GetBmsInterface(&bmsInterface)) {
HILOGE("[GetBmsInterface query null]");
return DMS_EC_GET_BMS_FAILURE;
}
errCode = bmsInterface->GetBundleInfo(permissionCheckInfo->calleeBundleName,
GET_BUNDLE_WITHOUT_ABILITIES, &bundleInfo);
} else if (callerUid == SHELL_UID) { // 进程间模式,属于跨进程调用
/* inter-process mode (mainly called in xts testsuit process started by shell) */
errCode = GetBundleInfo(permissionCheckInfo->calleeBundleName,
GET_BUNDLE_WITHOUT_ABILITIES, &bundleInfo);
} else {
errCode = EC_FAILURE;
}
#else
errCode = GetBundleInfo(permissionCheckInfo->calleeBundleName,
GET_BUNDLE_WITHOUT_ABILITIES, &bundleInfo);
#endif
if (errCode != EC_SUCCESS) { // 如果errCode不为0,获取包信息失败
HILOGE("[GetBundleInfo errCode = %d]", errCode);
return DMS_EC_GET_BUNDLEINFO_FAILURE;
}
/* appId: bundleName + "_" + signature */
// 签名格式为:bundleName + "_" + signature + 包名长度 + 1
const char *calleeSignature = bundleInfo.appId + strlen(permissionCheckInfo->calleeBundleName)
+ DELIMITER_LENGTH;
if ((permissionCheckInfo->callerSignature == NULL) || (calleeSignature == NULL)) { // 如果签名为空,返回失败错误码
HILOGE("[Signature is null]");
return DMS_EC_FAILURE;
}
if (strcmp(permissionCheckInfo->callerSignature, calleeSignature) != 0) { // 如果签名不一致,则权限检查不通过
HILOGE("[Signature unmatched]");
return DMS_EC_CHECK_PERMISSION_FAILURE;
}
return DMS_EC_SUCCESS;
}
更多推荐
所有评论(0)