diff --git a/build-tools/api_check_plugin/code_style_rule.json b/build-tools/api_check_plugin/code_style_rule.json index 981c5daeb396911086e11883b7106c70dfa49ef5..48a1ef5d0f644d711e80971b6d5a818293af131c 100644 --- a/build-tools/api_check_plugin/code_style_rule.json +++ b/build-tools/api_check_plugin/code_style_rule.json @@ -98,6 +98,325 @@ "kind", "name", "undocumented" - ] + ], + "permission":[ + "ANSWER_CALL", + "USE_BLUETOOTH", + "DISCOVER_BLUETOOTH", + "MANAGE_BLUETOOTH", + "INTERNET", + "MODIFY_AUDIO_SETTINGS", + "ACCESS_NOTIFICATION_POLICY", + "READ_CALENDAR", + "READ_CALL_LOG", + "READ_CELL_MESSAGES", + "READ_CONTACTS", + "GET_TELEPHONY_STATE", + "READ_MESSAGES", + "RECEIVE_MMS", + "RECEIVE_SMS", + "RECEIVE_WAP_MESSAGES", + "MICROPHONE", + "SEND_MESSAGES", + "WRITE_CALENDAR", + "WRITE_CALL_LOG", + "WRITE_CONTACTS", + "DISTRIBUTED_DATASYNC", + "DISTRIBUTED_SOFTBUS_CENTER", + "MANAGE_VOICEMAIL", + "REQUIRE_FORM", + "LOCATION_IN_BACKGROUND", + "LOCATION", + "APPROXIMATELY_LOCATION", + "MEDIA_LOCATION", + "GET_NETWORK_INFO", + "PLACE_CALL", + "CAMERA", + "SET_NETWORK_INFO", + "REMOVE_CACHE_FILES", + "READ_MEDIA", + "REBOOT", + "RUNNING_LOCK", + "WRITE_MEDIA", + "SET_TIME", + "SET_TIME_ZONE", + "DOWNLOAD_SESSION_MANAGER", + "COMMONEVENT_STICKY", + "SYSTEM_FLOAT_WINDOW", + "POWER_MANAGER", + "REFRESH_USER_ACTION", + "POWER_OPTIMIZATION", + "REBOOT_RECOVERY", + "MANAGE_LOCAL_ACCOUNTS", + "INTERACT_ACROSS_LOCAL_ACCOUNTS", + "VIBRATE", + "ACTIVITY_MOTION", + "READ_HEALTH_DATA", + "CONNECT_IME_ABILITY", + "CONNECT_SCREEN_SAVER_ABILITY", + "READ_SCREEN_SAVER", + "WRITE_SCREEN_SAVER", + "SET_WALLPAPER", + "GET_WALLPAPER", + "CHANGE_ABILITY_ENABLED_STATE", + "ACCESS_MISSIONS", + "CLEAN_BACKGROUND_PROCESSES", + "KEEP_BACKGROUND_RUNNING", + "UPDATE_CONFIGURATION", + "UPDATE_SYSTEM", + "FACTORY_RESET", + "GRANT_SENSITIVE_PERMISSIONS", + "REVOKE_SENSITIVE_PERMISSIONS", + "GET_SENSITIVE_PERMISSIONS", + "INTERACT_ACROSS_LOCAL_ACCOUNTS_EXTENSION", + "LISTEN_BUNDLE_CHANGE", + "GET_BUNDLE_INFO", + "ACCELEROMETER", + "GYROSCOPE", + "GET_BUNDLE_INFO_PRIVILEGED", + "INSTALL_BUNDLE", + "MANAGE_SHORTCUTS", + "radio.ACCESS_FM_AM", + "SET_TELEPHONY_STATE", + "START_ABILIIES_FROM_BACKGROUND", + "START_ABILITIES_FROM_BACKGROUND", + "BUNDLE_ACTIVE_INFO", + "START_INVISIBLE_ABILITY", + "sec.ACCESS_UDID", + "LAUNCH_DATA_PRIVACY_CENTER", + "MANAGE_MEDIA_RESOURCES", + "PUBLISH_AGENT_REMINDER", + "CONTROL_TASK_SYNC_ANIMATOR", + "INPUT_MONITORING", + "MANAGE_MISSIONS", + "NOTIFICATION_CONTROLLER", + "CONNECTIVITY_INTERNAL", + "SET_ABILITY_CONTROLLER", + "USE_USER_IDM", + "MANAGE_USER_IDM", + "ACCESS_BIOMETRIC", + "ACCESS_USER_AUTH_INTERNAL", + "ACCESS_PIN_AUTH", + "ACCESS_AUTH_RESPOOL", + "ENFORCE_USER_IDM", + "GET_RUNNING_INFO", + "CLEAN_APPLICATION_DATA", + "RUNNING_STATE_OBSERVER", + "CAPTURE_SCREEN", + "GET_WIFI_INFO", + "GET_WIFI_INFO_INTERNAL", + "SET_WIFI_INFO", + "GET_WIFI_PEERS_MAC", + "GET_WIFI_LOCAL_MAC", + "GET_WIFI_CONFIG", + "SET_WIFI_CONFIG", + "MANAGE_WIFI_CONNECTION", + "DUMP", + "MANAGE_WIFI_HOTSPOT", + "GET_ALL_APP_ACCOUNTS", + "MANAGE_SECURE_SETTINGS", + "READ_DFX_SYSEVENT", + "MANAGE_ENTERPRISE_DEVICE_ADMIN", + "EDM_MANAGE_DATETIME", + "NFC_TAG", + "NFC_CARD_EMULATION", + "PERMISSION_USED_STATS", + "NOTIFICATION_AGENT_CONTROLLER", + "MOUNT_UNMOUNT_MANAGER", + "MOUNT_FORMAT_MANAGER", + "STORAGE_MANAGER", + "BACKUP", + "FILE_ACCESS_MANAGER", + "GET_DEFAULT_APPLICATION", + "SET_DEFAULT_APPLICATION", + "ACCESS_IDS", + "MANAGE_DISPOSED_APP_STATUS", + "ACCESS_DLP_FILE", + "PROVISIONING_MESSAGE", + "ACCESS_SYSTEM_SETTINGS", + "READ_IMAGEVIDEO", + "READ_AUDIO", + "READ_DOCUMENT", + "WRITE_IMAGEVIDEO", + "WRITE_AUDIO", + "WRITE_DOCUMENT", + "ABILITY_BACKGROUND_COMMUNICATION" + ], + "syscap": [ + "SystemCapability.ArkUI.ArkUI.Full", + "SystemCapability.ArkUI.ArkUI.Lite", + "SystemCapability.ArkUI.ArkUI.Napi", + "SystemCapability.ArkUI.ArkUI.Libuv", + "SystemCapability.ArkUI.UiAppearance", + "SystemCapability.BundleManager.BundleFramework", + "SystemCapability.BundleManager.DistributedBundleFramework", + "SystemCapability.BundleManager.BundleTool", + "SystemCapability.BundleManager.Zlib", + "SystemCapability.BundleManager.PackingTool", + "SystemCapability.Graphic.Graphic2D.WebGL", + "SystemCapability.Graphic.Graphic2D.WebGL2", + "SystemCapability.WindowManager.WindowManager.Core", + "SystemCapability.WindowManager.WindowManager.MutiScreen", + "SystemCapability.Notification.CommonEvent", + "SystemCapability.Notification.Notification", + "SystemCapability.Notification.ReminderAgent", + "SystemCapability.Notification.Emitter", + "SystemCapability.Communication.IPC.Core", + "SystemCapability.Communication.SoftBus.Core", + "SystemCapability.Communication.NetManager.Core", + "SystemCapability.Communication.NetManager.Extension", + "SystemCapability.Communication.NetStack", + "SystemCapability.Communication.WiFi.Core", + "SystemCapability.Communication.WiFi.STA", + "SystemCapability.Communication.WiFi.AP.Core", + "SystemCapability.Communication.WiFi.AP.Extension", + "SystemCapability.Communication.WiFi.P2P", + "SystemCapability.Communication.Bluetooth.Core", + "SystemCapability.Communication.Bluetooth.Lite", + "SystemCapability.Communication.NFC.Core", + "SystemCapability.Communication.ConnectedTag", + "SystemCapability.Location.Location.Core", + "SystemCapability.Location.Location.Geocoder", + "SystemCapability.Location.Location.Geofence", + "SystemCapability.Location.Location.Gnss", + "SystemCapability.Location.Location.Lite", + "SystemCapability.MultimodalInput.Input.Core", + "SystemCapability.MultimodalInput.Input.InputDevice", + "SystemCapability.MultimodalInput.Input.RemoteInputDevice", + "SystemCapability.MultimodalInput.Input.InputMonitor", + "SystemCapability.MultimodalInput.Input.InputConsumer", + "SystemCapability.MultimodalInput.Input.InputSimulator", + "SystemCapability.MultimodalInput.Input.InputFilter", + "SystemCapability.PowerManager.BatteryManager.Extension", + "SystemCapability.PowerManager.BatteryStatistics", + "SystemCapability.PowerManager.DisplayPowerManager", + "SystemCapability.PowerManager.ThermalManager", + "SystemCapability.PowerManager.PowerManager.Core", + "SystemCapability.PowerManager.PowerManager.Lite", + "SystemCapability.PowerManager.BatteryManager.Core", + "SystemCapability.PowerManager.BatteryManager.Lite", + "SystemCapability.PowerManager.PowerManager.Extension", + "SystemCapability.Multimedia.Media.Core", + "SystemCapability.Multimedia.Media.AudioPlayer", + "SystemCapability.Multimedia.Media.AudioRecorder", + "SystemCapability.Multimedia.Media.VideoPlayer", + "SystemCapability.Multimedia.Media.VideoRecorder", + "SystemCapability.Multimedia.Media.CodecBase", + "SystemCapability.Multimedia.Media.AudioDecoder", + "SystemCapability.Multimedia.Media.AudioEncoder", + "SystemCapability.Multimedia.Media.VideoDecoder", + "SystemCapability.Multimedia.Media.VideoEncoder", + "SystemCapability.Multimedia.Media.Spliter", + "SystemCapability.Multimedia.Media.Muxer", + "SystemCapability.Multimedia.AVSession.Core", + "SystemCapability.Multimedia.AVSession.Manager", + "SystemCapability.Multimedia.Audio.Core", + "SystemCapability.Multimedia.Audio.Renderer", + "SystemCapability.Multimedia.Audio.Capturer", + "SystemCapability.Multimedia.Audio.Device", + "SystemCapability.Multimedia.Audio.Volume", + "SystemCapability.Multimedia.Audio.Communication", + "SystemCapability.Multimedia.Camera.Core", + "SystemCapability.Multimedia.Camera.DistributedCore", + "SystemCapability.Multimedia.Image.Core", + "SystemCapability.Multimedia.Image.ImageSource", + "SystemCapability.Multimedia.Image.ImagePacker", + "SystemCapability.Multimedia.Image.ImageReceiver", + "SystemCapability.Multimedia.MediaLibrary.Core", + "SystemCapability.Multimedia.MediaLibrary.SmartAlbum", + "SystemCapability.Multimedia.MediaLibrary.DistributedCore", + "SystemCapability.Telephony.CoreService", + "SystemCapability.Telephony.CallManager", + "SystemCapability.Telephony.CellularCall", + "SystemCapability.Telephony.CellularData", + "SystemCapability.Telephony.SmsMms", + "SystemCapability.Telephony.StateRegistry", + "SystemCapability.Global.I18n", + "SystemCapability.Global.ResourceManager", + "SystemCapability.Customization.ConfigPolicy", + "SystemCapability.Customization.EnterpriseDeviceManager", + "SystemCapability.BarrierFree.Accessibility.Core", + "SystemCapability.BarrierFree.Accessibility.Vision", + "SystemCapability.BarrierFree.Accessibility.Hearing", + "SystemCapability.BarrierFree.Accessibility.Interaction", + "SystemCapability.ResourceSchedule.WorkScheduler", + "SystemCapability.ResourceSchedule.BackgroundTaskManager.ContinuousTask", + "SystemCapability.ResourceSchedule.BackgroundTaskManager.TransientTask", + "SystemCapability.ResourceSchedule.UsageStatistics.App", + "SystemCapability.ResourceSchedule.UsageStatistics.AppGroup", + "SystemCapability.Utils.Lang", + "SystemCapability.HiviewDFX.HiLog", + "SystemCapability.HiviewDFX.HiLogLite", + "SystemCapability.HiviewDFX.HiTrace", + "SystemCapability.HiviewDFX.Hiview.FaultLogger", + "SystemCapability.HiviewDFX.HiviewLite", + "SystemCapability.HiviewDFX.HiChecker", + "SystemCapability.HiviewDFX.HiCollie", + "SystemCapability.HiviewDFX.HiDumper", + "SystemCapability.HiviewDFX.HiAppEvent", + "SystemCapability.HiviewDFX.HiSysEvent", + "SystemCapability.HiviewDFX.HiEventLite", + "SystemCapability.HiviewDFX.HiProfiler.HiDebug", + "SystemCapability.Update.UpdateService", + "SystemCapability.DistributedHardware.DeviceManager", + "SystemCapability.Security.DeviceAuth", + "SystemCapability.Security.DataTransitManager", + "SystemCapability.Security.DeviceSecurityLevel", + "SystemCapability.Security.Huks", + "SystemCapability.Security.AccessToken", + "SystemCapability.Security.Cipher", + "SystemCapability.Account.OsAccount", + "SystemCapability.Account.AppAccount", + "SystemCapability.UserIAM.UserAuth.Core", + "SystemCapability.UserIAM.UserAuth.PinAuth", + "SystemCapability.UserIAM.UserAuth.FaceAuth", + "SystemCapability.MiscServices.InputMethodFramework", + "SystemCapability.MiscServices.Pasteboard", + "SystemCapability.MiscServices.Time", + "SystemCapability.MiscServices.Wallpaper", + "SystemCapability.MiscServices.ScreenLock", + "SystemCapability.MiscServices.Upload", + "SystemCapability.MiscServices.Download", + "SystemCapability.FileManagement.StorageService.Backup", + "SystemCapability.FileManagement.StorageService.SpatialStatistics", + "SystemCapability.FileManagement.StorageService.Volume", + "SystemCapability.FileManagement.StorageService.Encryption", + "SystemCapability.FileManagement.File.FileIO", + "SystemCapability.FileManagement.File.Environment", + "SystemCapability.FileManagement.File.DistributedFile", + "SystemCapability.FileManagement.AppFileService", + "SystemCapability.FileManagement.UserFileService", + "SystemCapability.USB.USBManager", + "SystemCapability.Sensors.Sensor", + "SystemCapability.Sensors.MiscDevice", + "SystemCapability.Startup.SystemInfo", + "SystemCapability.DistributedDataManager.RelationalStore.Core", + "SystemCapability.DistributedDataManager.RelationalStore.Synchronize", + "SystemCapability.DistributedDataManager.RelationalStore.Lite", + "SystemCapability.DistributedDataManager.KVStore.Core", + "SystemCapability.DistributedDataManager.KVStore.Lite", + "SystemCapability.DistributedDataManager.KVStore.DistributedKVStore", + "SystemCapability.DistributedDataManager.DataObject.DistributedObject", + "SystemCapability.DistributedDataManager.Preferences.Core", + "SystemCapability.DistributedDataManager.DataShare.Core", + "SystemCapability.DistributedDataManager.DataShare.Consumer", + "SystemCapability.DistributedDataManager.DataShare.Provider", + "SystemCapability.Ability.AbilityBase", + "SystemCapability.Ability.AbilityRuntime.Core", + "SystemCapability.Ability.AbilityRuntime.FAModel", + "SystemCapability.Ability.AbilityRuntime.AbilityCore", + "SystemCapability.Ability.AbilityRuntime.Mission", + "SystemCapability.Ability.AbilityTools.AbilityAssistant", + "SystemCapability.Ability.Form", + "SystemCapability.Ability.DistributedAbilityManager", + "SystemCapability.Applications.ContactsData", + "SystemCapability.Applications.Contacts", + "SystemCapability.Applictaions.settings.Core", + "SystemCapability.Test.UiTest", + "SystemCapability.Web.Webview.Core", + "SystemCapability.Cloud.AAID", + "SystemCapability.Cloud.OAID", + "SystemCapability.Cloud.VAID" + ] } } \ No newline at end of file diff --git a/build-tools/api_check_plugin/src/api_check_plugin.js b/build-tools/api_check_plugin/src/api_check_plugin.js index ad641b03c69b5f7d5525425737f7e3e322fabdc5..fdd8a5311408497a7904979f02446b974f7b7ee4 100644 --- a/build-tools/api_check_plugin/src/api_check_plugin.js +++ b/build-tools/api_check_plugin/src/api_check_plugin.js @@ -20,6 +20,7 @@ const ts = require(path.resolve(__dirname, "../node_modules/typescript")); // const ts = require("typescript"); const { checkAPIDecorators } = require("./check_decorator"); const { checkSpelling } = require("./check_spelling"); +const { checkPermission } = require("./check_permission"); const { hasAPINote } = require("./utils"); let result = require("../check_result.json"); @@ -67,6 +68,8 @@ function checkAllNode(node, sourcefile, fileName) { checkAPIDecorators(node, sourcefile, fileName); // check apiNote spelling checkSpelling(node, sourcefile, fileName); + // check permission + checkPermission(node, sourcefile, fileName); } if (ts.isIdentifier(node)) { // check variable spelling diff --git a/build-tools/api_check_plugin/src/check_permission.js b/build-tools/api_check_plugin/src/check_permission.js new file mode 100644 index 0000000000000000000000000000000000000000..d87f6a37641f642d11d35f2085a9af9bfecf2f3f --- /dev/null +++ b/build-tools/api_check_plugin/src/check_permission.js @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const result = require("../check_result.json"); +const rules = require("../code_style_rule.json"); +const { getAPINote, error_type } = require('./utils'); + +function checkPermission(node, sourcefile, fileName) { + const permissionTagsPart = [...rules.decorators["permission"]]; + const permissionTags = [] + permissionTagsPart.forEach((item) => { + const tag = 'ohos.permission.' + item + permissionTags.push(tag) + }) + + const permissionRuleSet = new Set(permissionTags); + const apiNote = getAPINote(node); + const apiNoteArr = apiNote.split('*'); + let hasPermissionError = false; + let errorInfo = ""; + apiNoteArr.forEach(note => { + if (note.match(new RegExp('@permission'))) { + const permissionNote = note.replace('@permission', '').trim(); + if (/( or | and )/g.test(permissionNote)) { + const permissionArr = permissionNote.split(/( or | and )/) + permissionArr.forEach(item => { + if (!/( or | and )/g.test(item)) { + if (!permissionRuleSet.has(item)) { + hasPermissionError = true; + if (errorInfo !== "") { + errorInfo += `,${item}`; + } else { + errorInfo += item; + } + } + } + }) + } else { + if (!permissionRuleSet.has(permissionNote) && !/N\/A/.test(permissionNote)) { + hasPermissionError = true; + if (errorInfo !== "") { + errorInfo += `,${permissionNote}`; + } else { + errorInfo += permissionNote; + } + } + } + + } + }); + + if (hasPermissionError) { + const checkFailFileNameSet = new Set(result.apiFiles); + if (!checkFailFileNameSet.has(fileName)) { + result.apiFiles.push(fileName); + } + const posOfNode = sourcefile.getLineAndCharacterOfPosition(node.pos); + const errorMessage = `API check error of [${error_type.UNKNOW_PERMISSION}] in ${fileName} (line:` + + `${posOfNode.line + 1},col:${posOfNode.character + 1}): ${errorInfo}`; + + const scanResultSet = new Set(result.scanResult); + scanResultSet.add(errorMessage); + result.scanResult = [...scanResultSet]; + } +} +exports.checkPermission = checkPermission; \ No newline at end of file diff --git a/build-tools/api_check_plugin/src/utils.js b/build-tools/api_check_plugin/src/utils.js index 96a03ca44b4c561c6cf9a868e61b4b84586f02d1..8a5d2824bc9fa70502af24365708d1576aed348b 100644 --- a/build-tools/api_check_plugin/src/utils.js +++ b/build-tools/api_check_plugin/src/utils.js @@ -65,3 +65,11 @@ function overwriteIndexOf(item, array) { return indexArr; } exports.overwriteIndexOf = overwriteIndexOf; + +const error_type = { + UNKNOW_DECORATOR: 'unknow decorator', + MISSPELL_WORDS: 'misspell words', + NAMING_ERRORS: 'naming errors', + UNKNOW_PERMISSION: 'unknow permission', +} +exports.error_type = error_type; \ No newline at end of file