pms-permission

wifi_enable_permisson_sequence

@startuml
participant WifiManager as wm
participant WifiServiceImpl as wms
participant ContextImpl as context
participant ActivityManagerService as ams
participant ActivityManager as am
participant PackageManagerService as pkms

==wifi setEnabled without permission CHANGE_WIFI_STATE==

wm->wms:setWifiEnabled
activate wms 
wms->wms: enforceChangePermission()
activate wms #ffff00
	wms->context:mContext.<b>enforceCallingOrSelfPermission</b>\n(CHANGE_WIFI_STATE,"WifiService")
	context->context:enforce(permission,\n<b>checkCallingOrSelfPermission(permission)</b>\n,true,Binder.getCallingUid(),message);
	activate context 
		context->context:checkCallingOrSelfPermission(permission)
		note right: do checkCallingOrSelfPermission first
		activate context #55FFFF
			context->context:checkPermission(permission,\n <b>Binder.getCallingPid(),Binder.getCallingUid()</b>)
			context->ams:IActivityManager.checkPermission(permission, pid, uid)
			ams->ams:checkComponentPermission(permission,\n pid, uid,owningUid=-1,exported=true)
			ams->am:checkComponentPermission
			ref over am
			if appId == Process.<b>ROOT_UID</b> || appId == Process.<b>SYSTEM_UID</b>:
				return PackageManager.PERMISSION_GRANTED; 
			if isIsolated(uid):
				return PERMISSION_DENIED
			other case as below
			end ref		
			am->pkms: AppGlobals.getPackageManager().<b>checkUidPermission(permission, uid)</b>
			pkms->pkms:Object obj = mSettings.getUserIdLPr\n(UserHandle.getAppId(uid));
			note left: get the SharedUserSetting/PackageSetting according to the uid
			alt find obj case
				ref over pkms 
				SettingBase settingBase = (SettingBase) obj
				permissionsState = settingBase.getPermissionsState()
				if (permissionsState.hasPermission(permName, userId)):
					return PERMISSION_GRANTED
				else //Special case:
					 ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
					 if permisson request is ACCESS_COARSE_LOCATION, return PERMISSION_GRANTED
					 if it have the permission of ACCESS_FINE_LOCATION
				end 	 
			else no obj case ,maybe system have assigned the permission to this uid
				ref over pkms 
				"like audioserver: is not a apk ==>no obj"
				look for this (uid permisson) in <b>mSystemPermissions</b>
				if system have assigned this permission to this uid:
					return PERMISSION_GRANTED
				end	
			else other case return PERMISSION_DENIED
			end
			pkms->context:return PERMISSION_GRANTED or PERMISSION_DENIED
		deactivate context	
		context->context: if return is not <b>PERMISSION_GRANTED</b>:\n  <font color=red><b>throw new SecurityException</font>
		note right: log like "SecurityException: WifiService: Neither user 10080 nor current process has android.permission.CHANGE_WIFI_STATE."
	context->wms:enforce return
	deactivate context 
	wms->wms: if permission check ok:\n continue to do next thing
deactivate wms
deactivate wms
@enduml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值