From df7447ebc4864872e964ff4163266f2775367612 Mon Sep 17 00:00:00 2001 From: z30034863 Date: Thu, 19 Sep 2024 21:48:47 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1=E3=80=81har/hsp=E6=94=AF=E6=8C=81abilitie?= =?UTF-8?q?s=202=E3=80=81=E7=B3=BB=E7=BB=9F=E7=BA=A7hsp=E5=92=8C=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E9=97=B4hsp=E8=8B=A5=E5=8C=85=E5=90=ABabilities,?= =?UTF-8?q?=E6=89=93=E5=8C=85=E6=97=B6=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: z30034863 --- adapter/ohos/BundleException.java | 9 ++++++- adapter/ohos/CompressVerify.java | 45 +++++++++++++++++++++++++++++++ adapter/ohos/ModuleJsonUtil.java | 21 ++++++++++++--- modulecheck/module.json | 1 + 4 files changed, 71 insertions(+), 5 deletions(-) diff --git a/adapter/ohos/BundleException.java b/adapter/ohos/BundleException.java index ea391185..3cd89087 100644 --- a/adapter/ohos/BundleException.java +++ b/adapter/ohos/BundleException.java @@ -15,11 +15,13 @@ package ohos; +import java.util.function.Supplier; + /** * bundle tool exception class. * */ -class BundleException extends Exception { +class BundleException extends Exception implements Supplier { private static final long serialVersionUID = 1813070042705457755L; /** @@ -34,4 +36,9 @@ class BundleException extends Exception { public BundleException(String message) { super(message); } + + @Override + public BundleException get() { + return null; + } } \ No newline at end of file diff --git a/adapter/ohos/CompressVerify.java b/adapter/ohos/CompressVerify.java index b00d7a24..3fe5cd86 100644 --- a/adapter/ohos/CompressVerify.java +++ b/adapter/ohos/CompressVerify.java @@ -27,6 +27,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -908,6 +909,11 @@ public class CompressVerify { return false; } + if((isInterApplicationHsp(utility) || isSystemHsp(utility)) && hspHasAbilities(utility)) { + LOG.error("System-level/inter-application hsp has abilities"); + return false; + } + if (!utility.getJarPath().isEmpty() && !compatibleProcess(utility, utility.getJarPath(), utility.getFormattedJarPathList(), JAR_SUFFIX)) { LOG.error("CompressVerify::isArgsValidInHspMode jar-path is invalid."); @@ -1105,4 +1111,43 @@ public class CompressVerify { return false; } } + + private static boolean isInterApplicationHsp(Utility utility) { + try { + Optional optional = FileUtils.getFileContent(utility.getJsonPath()); + String jsonString = optional.orElseThrow(new BundleException("utility jsonPath is null")); + boolean result = ModuleJsonUtil.parseStageBundleType(jsonString).equals(BUNDLE_TYPE_SHARE); + if(result) { + LOG.info("isInterApplicationHsp(*) -> bundle type is shared"); + } + return result; + } catch (BundleException e) { + LOG.error("isInterApplicationHsp(*) -> exception: " + e.getMessage()); + return false; + } + } + + private static boolean isSystemHsp(Utility utility) { + try { + Optional optional = FileUtils.getFileContent(utility.getJsonPath()); + String jsonString = optional.orElseThrow(new BundleException("utility jsonPath is null")); + boolean result = ModuleJsonUtil.parseStageBundleType(jsonString).equals(BUNDLE_TYPE_APP_SERVICE); + if(result) { + LOG.info("isInterApplicationHsp(*) -> bundle type is appService"); + } + return result; + } catch (BundleException e) { + LOG.error("isSystemHsp(*) exception: " + e.getMessage()); + return false; + } + } + + private static boolean hspHasAbilities(Utility utility) { + try { + return ModuleJsonUtil.checkHspHasAbilities(utility); + } catch (BundleException e) { + LOG.error("hspHasAbilities(*) exception: " + e.getMessage()); + return false; + } + } } diff --git a/adapter/ohos/ModuleJsonUtil.java b/adapter/ohos/ModuleJsonUtil.java index 4da3af02..b1ef70a2 100644 --- a/adapter/ohos/ModuleJsonUtil.java +++ b/adapter/ohos/ModuleJsonUtil.java @@ -21,10 +21,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.HashMap; -import java.util.Map; +import java.util.*; class ModuleJsonUtil { private static final String APP = "app"; @@ -1814,6 +1811,22 @@ class ModuleJsonUtil { return true; } + /** + * check whether hsp module has abilities or extensionAbilities. + * + * @param utility pack info. + * @return Returns true if jsonString is valid. + */ + public static boolean checkHspHasAbilities(Utility utility) throws BundleException { + Optional optional = FileUtils.getFileContent(utility.getJsonPath()); + String jsonString = optional.orElseThrow(new BundleException("checkHspHasAbilities(*) -> jsonPath is null")); + boolean result = parseModuleType(jsonString).equals(ModuleJsonUtil.SHARED) && !parseAbilityNames(jsonString).isEmpty(); + if(result) { + LOG.info("checkHspHasAbilities(*) -> hsp module has abilities or extensionAbilities"); + } + return result; + } + /** * check module atomic installation free is valid * diff --git a/modulecheck/module.json b/modulecheck/module.json index f32af71f..fa911a32 100644 --- a/modulecheck/module.json +++ b/modulecheck/module.json @@ -34,6 +34,7 @@ "deviceTypes", "pages", "metadata", + "abilities", "requestPermissions", "dependencies", "libIsolation", -- Gitee From 3f62f054da9d2c1b8c9f6c95f23c704e0369126a Mon Sep 17 00:00:00 2001 From: z30034863 Date: Fri, 20 Sep 2024 15:29:04 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=95=B4=E6=94=B9review=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: z30034863 --- adapter/ohos/BundleException.java | 2 +- adapter/ohos/CompressVerify.java | 30 +++++++++++++++--------------- adapter/ohos/ModuleJsonUtil.java | 22 +++++----------------- 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/adapter/ohos/BundleException.java b/adapter/ohos/BundleException.java index 3cd89087..0fb9507f 100644 --- a/adapter/ohos/BundleException.java +++ b/adapter/ohos/BundleException.java @@ -39,6 +39,6 @@ class BundleException extends Exception implements Supplier { @Override public BundleException get() { - return null; + return new BundleException(); } } \ No newline at end of file diff --git a/adapter/ohos/CompressVerify.java b/adapter/ohos/CompressVerify.java index 3fe5cd86..26271d58 100644 --- a/adapter/ohos/CompressVerify.java +++ b/adapter/ohos/CompressVerify.java @@ -909,7 +909,7 @@ public class CompressVerify { return false; } - if((isInterApplicationHsp(utility) || isSystemHsp(utility)) && hspHasAbilities(utility)) { + if((isBundleTypeShared(utility) || isBundleTypeAppService(utility)) && hspHasAbilities(utility)) { LOG.error("System-level/inter-application hsp has abilities"); return false; } @@ -1112,41 +1112,41 @@ public class CompressVerify { } } - private static boolean isInterApplicationHsp(Utility utility) { + private static boolean isBundleTypeShared(Utility utility) { try { Optional optional = FileUtils.getFileContent(utility.getJsonPath()); - String jsonString = optional.orElseThrow(new BundleException("utility jsonPath is null")); + String jsonString = optional.orElseThrow(new BundleException("jsonPath content is empty")); boolean result = ModuleJsonUtil.parseStageBundleType(jsonString).equals(BUNDLE_TYPE_SHARE); - if(result) { - LOG.info("isInterApplicationHsp(*) -> bundle type is shared"); - } + LOG.info("CompressVerify::isBundleTypeShared result = " + result); return result; } catch (BundleException e) { - LOG.error("isInterApplicationHsp(*) -> exception: " + e.getMessage()); + LOG.error("CompressVerify::isBundleTypeShared exception: " + e.getMessage()); return false; } } - private static boolean isSystemHsp(Utility utility) { + private static boolean isBundleTypeAppService(Utility utility) { try { Optional optional = FileUtils.getFileContent(utility.getJsonPath()); - String jsonString = optional.orElseThrow(new BundleException("utility jsonPath is null")); + String jsonString = optional.orElseThrow(new BundleException("jsonPath content is empty")); boolean result = ModuleJsonUtil.parseStageBundleType(jsonString).equals(BUNDLE_TYPE_APP_SERVICE); - if(result) { - LOG.info("isInterApplicationHsp(*) -> bundle type is appService"); - } + LOG.info("CompressVerify::isBundleTypeAppService result = " + result); return result; } catch (BundleException e) { - LOG.error("isSystemHsp(*) exception: " + e.getMessage()); + LOG.error("CompressVerify::isBundleTypeAppService exception: " + e.getMessage()); return false; } } private static boolean hspHasAbilities(Utility utility) { try { - return ModuleJsonUtil.checkHspHasAbilities(utility); + Optional optional = FileUtils.getFileContent(utility.getJsonPath()); + String jsonString = optional.orElseThrow(new BundleException("jsonPath content is empty")); + boolean result = ModuleJsonUtil.parseModuleType(jsonString).equals(BUNDLE_TYPE_SHARE) && !ModuleJsonUtil.parseAbilityNames(jsonString).isEmpty(); + LOG.info("CompressVerify::hspHasAbilities result = " + result); + return result; } catch (BundleException e) { - LOG.error("hspHasAbilities(*) exception: " + e.getMessage()); + LOG.error("CompressVerify::hspHasAbilities exception: " + e.getMessage()); return false; } } diff --git a/adapter/ohos/ModuleJsonUtil.java b/adapter/ohos/ModuleJsonUtil.java index b1ef70a2..c687c23f 100644 --- a/adapter/ohos/ModuleJsonUtil.java +++ b/adapter/ohos/ModuleJsonUtil.java @@ -21,7 +21,11 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONException; import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; class ModuleJsonUtil { private static final String APP = "app"; @@ -1811,22 +1815,6 @@ class ModuleJsonUtil { return true; } - /** - * check whether hsp module has abilities or extensionAbilities. - * - * @param utility pack info. - * @return Returns true if jsonString is valid. - */ - public static boolean checkHspHasAbilities(Utility utility) throws BundleException { - Optional optional = FileUtils.getFileContent(utility.getJsonPath()); - String jsonString = optional.orElseThrow(new BundleException("checkHspHasAbilities(*) -> jsonPath is null")); - boolean result = parseModuleType(jsonString).equals(ModuleJsonUtil.SHARED) && !parseAbilityNames(jsonString).isEmpty(); - if(result) { - LOG.info("checkHspHasAbilities(*) -> hsp module has abilities or extensionAbilities"); - } - return result; - } - /** * check module atomic installation free is valid * -- Gitee From aca2179d43769481b6a324602b353e509fcfe991 Mon Sep 17 00:00:00 2001 From: z30034863 Date: Fri, 20 Sep 2024 15:30:47 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=95=B4=E6=94=B9review=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: z30034863 --- adapter/ohos/ModuleJsonUtil.java | 1 - 1 file changed, 1 deletion(-) diff --git a/adapter/ohos/ModuleJsonUtil.java b/adapter/ohos/ModuleJsonUtil.java index c687c23f..c54fe0e0 100644 --- a/adapter/ohos/ModuleJsonUtil.java +++ b/adapter/ohos/ModuleJsonUtil.java @@ -25,7 +25,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Optional; class ModuleJsonUtil { private static final String APP = "app"; -- Gitee From 48006f44f1203911d939f6c36be080519cb8d363 Mon Sep 17 00:00:00 2001 From: z30034863 Date: Fri, 20 Sep 2024 20:22:47 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E2=80=9Chsp=E4=B8=8D=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=85=A5=E5=8F=A3ability=EF=BC=8C=E6=89=93=E5=8C=85=E6=97=B6?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=88=B0=E6=8A=A5=E9=94=99=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: z30034863 --- adapter/ohos/CompressVerify.java | 36 ++++++++++++++++++++++++++++---- adapter/ohos/JsonUtil.java | 4 ++-- adapter/ohos/ModuleJsonUtil.java | 29 ++++++++++++++++++++++++- modulecheck/module.json | 1 - 4 files changed, 62 insertions(+), 8 deletions(-) diff --git a/adapter/ohos/CompressVerify.java b/adapter/ohos/CompressVerify.java index 26271d58..d9c87adf 100644 --- a/adapter/ohos/CompressVerify.java +++ b/adapter/ohos/CompressVerify.java @@ -24,10 +24,7 @@ import java.io.InputStreamReader; import java.io.IOException; import java.io.Reader; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Optional; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -68,6 +65,8 @@ public class CompressVerify { private static final String BUNDLE_TYPE_SHARE = "shared"; private static final String BUNDLE_TYPE_APP = "app"; private static final String BUNDLE_TYPE_APP_SERVICE = "appService"; + private static final String ACTION_SYSTEM_HOME = "action.system.home"; + private static final String ENTITY_SYSTEM_HOME = "entity.system.home"; private static final String BUNDLE_NAME_PATTERN = "([a-zA-Z]|[a-zA-Z]+(_*[0-9a-zA-Z])+)(\\.[0-9a-zA-Z]|\\.[0-9a-zA-Z]+(_*[0-9a-zA-Z])+){2,}"; private static final int BUNDLE_NAME_LEN_MIN = 7; @@ -914,6 +913,11 @@ public class CompressVerify { return false; } + if(hasHomeAbilities(utility)) { + LOG.error("hsp has home ability"); + return false; + } + if (!utility.getJarPath().isEmpty() && !compatibleProcess(utility, utility.getJarPath(), utility.getFormattedJarPathList(), JAR_SUFFIX)) { LOG.error("CompressVerify::isArgsValidInHspMode jar-path is invalid."); @@ -1150,4 +1154,28 @@ public class CompressVerify { return false; } } + + private static boolean hasHomeAbilities(Utility utility) { + try { + boolean result = false; + Optional optional = FileUtils.getFileContent(utility.getJsonPath()); + String jsonString = optional.orElseThrow(new BundleException("jsonPath content is empty")); + Map> skillsMap = ModuleJsonUtil.parseAbilitySkillsMap(jsonString); + for (Map.Entry> entry : skillsMap.entrySet()) { + String key = entry.getKey(); + List value = entry.getValue(); + for(String str : value) { + if (str.contains(ACTION_SYSTEM_HOME) && str.contains(ENTITY_SYSTEM_HOME)) { + result = true; + break; + } + } + } + LOG.info("CompressVerify::hasHomeAbilities result = " + result); + return result; + } catch (BundleException e) { + LOG.error("CompressVerify::hasHomeAbilities exception: " + e.getMessage()); + return false; + } + } } diff --git a/adapter/ohos/JsonUtil.java b/adapter/ohos/JsonUtil.java index 1944f815..a45d3e6d 100644 --- a/adapter/ohos/JsonUtil.java +++ b/adapter/ohos/JsonUtil.java @@ -2030,7 +2030,7 @@ public class JsonUtil { */ private static String getJsonString(JSONObject jsonObject, String key) { String value = ""; - if (jsonObject != null && jsonObject.containsKey(key)) { + if (jsonObject != null && jsonObject.containsKey(key) && jsonObject.get(key) != null) { value = jsonObject.get(key).toString(); } return value; @@ -2046,7 +2046,7 @@ public class JsonUtil { */ private static String getJsonString(JSONObject jsonObject, String key, String defaultValue) { String value = defaultValue; - if (jsonObject != null && jsonObject.containsKey(key)) { + if (jsonObject != null && jsonObject.containsKey(key) && jsonObject.get(key) != null) { value = jsonObject.get(key).toString(); } return value; diff --git a/adapter/ohos/ModuleJsonUtil.java b/adapter/ohos/ModuleJsonUtil.java index c54fe0e0..e1a57346 100644 --- a/adapter/ohos/ModuleJsonUtil.java +++ b/adapter/ohos/ModuleJsonUtil.java @@ -44,6 +44,7 @@ class ModuleJsonUtil { private static final String VERSION = "version"; private static final String CODE = "code"; private static final String NAME = "name"; + private static final String SKILLS = "skills"; private static final String MODULE = "module"; private static final String MODULES = "modules"; private static final String MODULE_NAME = "moduleName"; @@ -1138,6 +1139,32 @@ class ModuleJsonUtil { return extensionAbilityNames; } + /** + * get ability skills map from json file. + * + * @param jsonString is the json String of module.json + * @return skills map + */ + public static Map> parseAbilitySkillsMap(String jsonString) + throws BundleException { + Map> skillsMap = new HashMap<>(); + JSONObject moduleObj = getModuleObj(jsonString); + if (moduleObj.containsKey(ABILITIES)) { + JSONArray abilityObjs = moduleObj.getJSONArray(ABILITIES); + for (int i = 0; i < abilityObjs.size(); ++i) { + JSONObject abilityObj = abilityObjs.getJSONObject(i); + String abilityName = getJsonString(abilityObj, NAME); + if (abilityObj.containsKey(SKILLS)) { + JSONArray typeArray = abilityObj.getJSONArray(SKILLS); + skillsMap.put(abilityName, typeArray.toJavaList(String.class)); + } else { + skillsMap.put(abilityName, new ArrayList<>()); + } + } + } + return skillsMap; + } + /** * parse stage module type. * @@ -1872,7 +1899,7 @@ class ModuleJsonUtil { */ private static String getJsonString(JSONObject jsonObject, String key) { String value = ""; - if (jsonObject != null && jsonObject.containsKey(key)) { + if (jsonObject != null && jsonObject.containsKey(key) && jsonObject.get(key) != null) { value = jsonObject.get(key).toString(); } return value; diff --git a/modulecheck/module.json b/modulecheck/module.json index fa911a32..f32af71f 100644 --- a/modulecheck/module.json +++ b/modulecheck/module.json @@ -34,7 +34,6 @@ "deviceTypes", "pages", "metadata", - "abilities", "requestPermissions", "dependencies", "libIsolation", -- Gitee From 21e6d9c584a3d752a60377a881fca4f61126fe29 Mon Sep 17 00:00:00 2001 From: z30034863 Date: Fri, 20 Sep 2024 20:26:47 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9review=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: z30034863 --- adapter/ohos/CompressVerify.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/adapter/ohos/CompressVerify.java b/adapter/ohos/CompressVerify.java index d9c87adf..664d8485 100644 --- a/adapter/ohos/CompressVerify.java +++ b/adapter/ohos/CompressVerify.java @@ -24,9 +24,13 @@ import java.io.InputStreamReader; import java.io.IOException; import java.io.Reader; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.ArrayList; +import java.util.Locale; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.List; +import java.util.Optional; /** * compress comment,command parser. -- Gitee