forked from community/device-mgt-core
Merge pull request #2 from inoshperera/application-mgt-new
Adding APK parsing and ipa parsing capability4.x.x
commit
05d5ab2e9a
@ -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;
|
||||
}
|
||||
}
|
Loading…
Reference in new issue