forked from community/device-mgt-core
Merge pull request #2 from inoshperera/application-mgt-new
Adding APK parsing and ipa parsing capabilityfeature/appm-store/pbac
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