Adding APK parcing and ipa parsing capability

feature/appm-store/pbac
inoshperera 6 years ago
parent 222225121c
commit 2011843736

@ -181,15 +181,14 @@
<groupId>org.wso2.carbon</groupId> <groupId>org.wso2.carbon</groupId>
<artifactId>org.wso2.carbon.core</artifactId> <artifactId>org.wso2.carbon.core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>net.dongliu</groupId>
<artifactId>apk-parser</artifactId>
<version>2.5.2</version>
</dependency>
<dependency> <dependency>
<groupId>com.googlecode.plist</groupId> <groupId>com.googlecode.plist</groupId>
<artifactId>dd-plist</artifactId> <artifactId>dd-plist</artifactId>
<version>1.20</version> </dependency>
<dependency>
<groupId>net.dongliu</groupId>
<artifactId>apk-parser</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-validator</groupId> <groupId>commons-validator</groupId>

@ -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);
}
}

@ -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;
}
}

@ -54,7 +54,7 @@ import javax.ws.rs.core.Response;
* Implementation of Application Management related APIs. * Implementation of Application Management related APIs.
*/ */
@Produces({"application/json"}) @Produces({"application/json"})
@Path("/publisher/applications") @Path("/applications")
public class ApplicationManagementAPIImpl implements ApplicationManagementAPI { public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
private static Log log = LogFactory.getLog(ApplicationManagementAPIImpl.class); private static Log log = LogFactory.getLog(ApplicationManagementAPIImpl.class);

@ -1725,6 +1725,16 @@
<scope>test</scope> <scope>test</scope>
<version>${slf4j.nop.version}</version> <version>${slf4j.nop.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.googlecode.plist</groupId>
<artifactId>dd-plist</artifactId>
<version>${googlecode.plist.version}</version>
</dependency>
<dependency>
<groupId>net.dongliu</groupId>
<artifactId>apk-parser</artifactId>
<version>${net.dongliu.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
@ -2165,6 +2175,10 @@
<commons.dbcp.version>1.4.0.wso2v1</commons.dbcp.version> <commons.dbcp.version>1.4.0.wso2v1</commons.dbcp.version>
<slf4j.nop.version>1.7.25</slf4j.nop.version> <slf4j.nop.version>1.7.25</slf4j.nop.version>
<!-- app management related versions -->
<googlecode.plist.version>1.8</googlecode.plist.version>
<net.dongliu.version>2.4.2</net.dongliu.version>
</properties> </properties>
</project> </project>

Loading…
Cancel
Save