fix:ASW-99 调整 xapk 校验

This commit is contained in:
zhangshuai
2024-10-15 16:06:27 +08:00
parent 59e01f71e5
commit 24d928d7ba
2 changed files with 49 additions and 24 deletions

View File

@@ -25,15 +25,10 @@ import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@Service
public class PackageServiceImpl extends ServiceImpl<PackageDao, PackageEntity> implements IPackageService {
@@ -98,27 +93,12 @@ public class PackageServiceImpl extends ServiceImpl<PackageDao, PackageEntity> i
entity.setVersion(apkInfo.getVersionName());
entity.setIdentifier(apkInfo.getPackageName());
} else {
ZipFile zipFile = new ZipFile(destination);
ZipEntry entry = zipFile.getEntry("manifest.json");
InputStream inputStream = zipFile.getInputStream(entry);
StringBuilder manifestJson = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
manifestJson.append(line).append("\n");
}
Map manifest = T.JSONUtil.toBean(manifestJson.toString(), Map.class);
ZipEntry packageFile = zipFile.getEntry(T.StrUtil.concat(true,T.MapUtil.getStr(manifest, "package_name"),".apk"));
File temp = T.FileUtil.file(Constants.TEMP_PATH, packageFile.getName());
FileUtil.writeBytes(zipFile.getInputStream(packageFile).readAllBytes(), temp);
ApkInfo apkInfo = apkUtil.parseApk(temp.getPath());
String versionName = apkInfo.getVersionName();
String packageName = apkInfo.getPackageName();
if (!T.BooleanUtil.and(versionName.equals(T.MapUtil.getStr(manifest, "version_name")), packageName.equals(T.MapUtil.getStr(manifest, "package_name")))){
ApkInfo apkInfo = apkUtil.parseXapk(destination.getPath());
if (T.ObjectUtil.isNull(apkInfo)) {
throw new ASWException(RCode.PACKAGE_FILE_TYPE_ERROR);
}
entity.setVersion(versionName);
entity.setIdentifier(packageName);
entity.setVersion(apkInfo.getSdkVersion());
entity.setIdentifier(apkInfo.getPackageName());
}
} catch (Exception e) {
log.error(e, "[savePackage] [save package error] [file: {}]", fileResource.getFilename());

View File

@@ -1,9 +1,14 @@
package net.geedge.asw.module.app.util;
import cn.hutool.core.io.FileUtil;
import cn.hutool.log.Log;
import net.geedge.asw.common.util.Constants;
import net.geedge.asw.common.util.T;
import java.io.*;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class ApkUtil {
@@ -60,6 +65,9 @@ public class ApkUtil {
while ((temp = bufferedReader.readLine()) != null) {
setApkInfoProperty(apkInfo, temp);
}
if (T.StrUtil.isBlank(apkInfo.getPackageName()) || T.StrUtil.isBlank(apkInfo.getVersionName())) {
return null;
}
return apkInfo;
} catch (IOException e) {
log.error(e, "[parseApk] [error] [path: {}]", apkPath);
@@ -73,6 +81,43 @@ public class ApkUtil {
}
}
public ApkInfo parseXapk(String xapkPath) {
InputStream inputStream = null;
BufferedReader reader = null;
File tempFile = null;
try {
ZipFile zipFile = new ZipFile(T.FileUtil.file(xapkPath));
ZipEntry entry = zipFile.getEntry("manifest.json");
inputStream = zipFile.getInputStream(entry);
StringBuilder manifestJson = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
manifestJson.append(line).append("\n");
}
Map manifest = T.JSONUtil.toBean(manifestJson.toString(), Map.class);
ZipEntry packageFile = zipFile.getEntry(T.StrUtil.concat(true, T.MapUtil.getStr(manifest, "package_name"), ".apk"));
tempFile = T.FileUtil.file(Constants.TEMP_PATH, packageFile.getName());
FileUtil.writeBytes(zipFile.getInputStream(packageFile).readAllBytes(), tempFile);
ApkInfo apkInfo = this.parseApk(tempFile.getPath());
if (apkInfo == null) {
return null;
}
if (!T.BooleanUtil.and(apkInfo.getVersionName().equals(T.MapUtil.getStr(manifest, "version_name")),
apkInfo.getPackageName().equals(T.MapUtil.getStr(manifest, "package_name")))) {
return null;
}
return apkInfo;
} catch (Exception e) {
log.error(e, "[parseXapk] [error] [path: {}]", xapkPath);
return null;
} finally {
T.FileUtil.del(tempFile);
T.IoUtil.close(inputStream);
T.IoUtil.close(reader);
}
}
private void setApkInfoProperty(ApkInfo apkInfo, String source) {
if (source.startsWith(APPLICATION)) {
String[] rs = source.split("( icon=')|'");