From 2011843736c21af712eed9e476c057e11fab906d Mon Sep 17 00:00:00 2001 From: inoshperera Date: Fri, 14 Sep 2018 22:19:49 +0530 Subject: [PATCH] Adding APK parcing and ipa parsing capability --- .../pom.xml | 11 +- .../mgt/core/exception/ParsingException.java | 57 +++++++ .../mgt/core/util/ArtifactsParser.java | 141 ++++++++++++++++++ .../impl/ApplicationManagementAPIImpl.java | 2 +- pom.xml | 14 ++ 5 files changed, 218 insertions(+), 7 deletions(-) create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ParsingException.java create mode 100644 components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml index 1bf7cca0c43..10f406d4cf3 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/pom.xml @@ -181,15 +181,14 @@ org.wso2.carbon org.wso2.carbon.core - - net.dongliu - apk-parser - 2.5.2 - + com.googlecode.plist dd-plist - 1.20 + + + net.dongliu + apk-parser commons-validator diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ParsingException.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ParsingException.java new file mode 100644 index 00000000000..85e806f7f1d --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/exception/ParsingException.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + * + */ + +package org.wso2.carbon.device.application.mgt.core.exception; + +public class ParsingException extends Exception { + + private static final long serialVersionUID = -8935642383846122660L; + private String errorMessage; + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public ParsingException(String msg, Exception nestedEx) { + super(msg, nestedEx); + setErrorMessage(msg); + } + + public ParsingException(String message, Throwable cause) { + super(message, cause); + setErrorMessage(message); + } + + public ParsingException(String msg) { + super(msg); + setErrorMessage(msg); + } + + public ParsingException() { + super(); + } + + public ParsingException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java new file mode 100644 index 00000000000..d619185ef9e --- /dev/null +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/util/ArtifactsParser.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + * + */ + +package org.wso2.carbon.device.application.mgt.core.util; + +import com.dd.plist.BinaryPropertyListParser; +import com.dd.plist.NSDictionary; +import com.dd.plist.PropertyListFormatException; +import com.dd.plist.PropertyListParser; +import net.dongliu.apk.parser.ApkFile; +import net.dongliu.apk.parser.bean.ApkMeta; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.commons.io.IOUtils; +import org.json.JSONObject; +import org.wso2.carbon.device.application.mgt.core.exception.ParsingException; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.UUID; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class ArtifactsParser { + + //ios CF Bundle keys + public static final String IPA_BUNDLE_VERSION_KEY = "CFBundleVersion"; + public static final String IPA_BUNDLE_NAME_KEY = "CFBundleName"; + public static final String IPA_BUNDLE_IDENTIFIER_KEY = "CFBundleIdentifier"; + + private static final Log log = LogFactory.getLog(ArtifactsParser.class); + + public static ApkMeta readAndroidManifestFile(InputStream inputStream) throws ParsingException { + File tempFile = null; + ApkMeta apkMeta; + try { + + tempFile = File.createTempFile("temp" + UUID.randomUUID(), ".apk"); + try (FileOutputStream out = new FileOutputStream(tempFile)) { + IOUtils.copy(inputStream, out); + } + + ApkFile apkFile = new ApkFile(tempFile); + apkMeta = apkFile.getApkMeta(); + } catch (IOException e) { + throw new ParsingException("Error while parsing the apk.", e); + } finally { + if (tempFile != null) { + tempFile.delete(); + } + } + return apkMeta; + } + + public static NSDictionary readiOSManifestFile(InputStream inputStream) throws ParsingException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + File tempFile = null; + NSDictionary rootDict; + ZipInputStream stream = null; + FileOutputStream out = null; + + try { + tempFile = File.createTempFile("temp" + UUID.randomUUID(), ".ipa"); + out = new FileOutputStream(tempFile); + IOUtils.copy(inputStream, out); + stream = new ZipInputStream(new FileInputStream(tempFile)); + + ZipEntry entry; + while ((entry = stream.getNextEntry()) != null) { + if (entry.getName().matches("^(Payload/)(.)+(.app/Info.plist)$")) { + InputStream is = stream; + + int nRead; + byte[] data = new byte[16384]; + + while ((nRead = is.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + + buffer.flush(); + break; + } + } + + try { + rootDict = (NSDictionary) BinaryPropertyListParser.parse(buffer.toByteArray()); + } catch (IllegalArgumentException e) { + log.debug("Uploaded file didn't have a Binary Plist"); + try { + rootDict = (NSDictionary) PropertyListParser.parse(buffer.toByteArray()); + } catch (Exception e1) { + throw new ParsingException("Error while parsing the non binary plist.", e1); + } + } + } catch (PropertyListFormatException e1) { + throw new ParsingException("Error while parsing the plist.", e1); + } catch (FileNotFoundException e) { + throw new ParsingException("Error while creating temporary file.", e); + } catch (IOException e) { + throw new ParsingException("Error while parsing the file.", e); + } finally { + if (tempFile != null) { + tempFile.delete(); + } + try { + if (out != null) { + out.close(); + } + if (stream != null) { + + stream.close(); + + } + } catch (IOException e) { + } + } + + return rootDict; + } +} diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementAPIImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementAPIImpl.java index 5609ba9c2ef..f36ef23f831 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementAPIImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/impl/ApplicationManagementAPIImpl.java @@ -54,7 +54,7 @@ import javax.ws.rs.core.Response; * Implementation of Application Management related APIs. */ @Produces({"application/json"}) -@Path("/publisher/applications") +@Path("/applications") public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { private static Log log = LogFactory.getLog(ApplicationManagementAPIImpl.class); diff --git a/pom.xml b/pom.xml index 05596b0688b..43e2268bf2d 100644 --- a/pom.xml +++ b/pom.xml @@ -1725,6 +1725,16 @@ test ${slf4j.nop.version} + + com.googlecode.plist + dd-plist + ${googlecode.plist.version} + + + net.dongliu + apk-parser + ${net.dongliu.version} + @@ -2165,6 +2175,10 @@ 1.4.0.wso2v1 1.7.25 + + 1.8 + 2.4.2 +