Skip to content

Commit

Permalink
Implement new update data format
Browse files Browse the repository at this point in the history
  • Loading branch information
Mishiranu committed Nov 21, 2020
1 parent 94950c7 commit 2614c7e
Show file tree
Hide file tree
Showing 14 changed files with 752 additions and 370 deletions.
4 changes: 2 additions & 2 deletions src/chan/content/ChanLocator.java
Expand Up @@ -513,9 +513,9 @@ public final Uri buildQueryWithSchemeHost(boolean useHttps, String host, String
return builder.build();
}

public final Uri setScheme(Uri uri) {
public final Uri setSchemeIfEmpty(Uri uri, String fallback) {
if (uri != null && StringUtils.isEmpty(uri.getScheme())) {
return uri.buildUpon().scheme(getPreferredScheme()).build();
return uri.buildUpon().scheme(fallback != null ? fallback : getPreferredScheme()).build();
}
return uri;
}
Expand Down
94 changes: 52 additions & 42 deletions src/chan/content/ChanManager.java
Expand Up @@ -66,6 +66,7 @@ public class ChanManager {

private static final String FEATURE_CHAN_EXTENSION = "chan.extension";
private static final String META_CHAN_EXTENSION_NAME = "chan.extension.name";
private static final String META_CHAN_EXTENSION_TITLE = "chan.extension.title";
private static final String META_CHAN_EXTENSION_VERSION = "chan.extension.version";
private static final String META_CHAN_EXTENSION_ICON = "chan.extension.icon";
private static final String META_CHAN_EXTENSION_SOURCE = "chan.extension.source";
Expand All @@ -76,6 +77,7 @@ public class ChanManager {

private static final String FEATURE_LIB_EXTENSION = "lib.extension";
private static final String META_LIB_EXTENSION_NAME = "lib.extension.name";
private static final String META_LIB_EXTENSION_TITLE = "lib.extension.title";
private static final String META_LIB_EXTENSION_SOURCE = "lib.extension.source";

@SuppressWarnings("deprecation")
Expand Down Expand Up @@ -137,14 +139,15 @@ public enum Type {CHAN, LIBRARY}
public enum TrustState {UNTRUSTED, TRUSTED, DISCARDED}

public final Type type;
public final String extensionName;
public final String name;
public final String title;
public final TrustState trustState;
public final String packageName;
public final String versionName;
public final long versionCode;
private final ApplicationInfo applicationInfo;
public final Fingerprints fingerprints;
public final int version;
public final int apiVersion;
public final boolean supported;
public final int iconResId;
public final Uri updateUri;
Expand All @@ -158,19 +161,20 @@ public String getNativeLibraryDir() {
return applicationInfo.nativeLibraryDir;
}

private ExtensionItem(Type type, String extensionName, TrustState trustState,
private ExtensionItem(Type type, String name, String title, TrustState trustState,
String packageName, String versionName, long versionCode, ApplicationInfo applicationInfo,
Fingerprints fingerprints, int version, boolean supported, int iconResId, Uri updateUri,
Fingerprints fingerprints, int apiVersion, boolean supported, int iconResId, Uri updateUri,
String classConfiguration, String classPerformer, String classLocator, String classMarkup) {
this.type = type;
this.extensionName = extensionName;
this.name = name;
this.title = title;
this.trustState = trustState;
this.packageName = packageName;
this.versionName = versionName;
this.versionCode = versionCode;
this.applicationInfo = applicationInfo;
this.fingerprints = fingerprints;
this.version = version;
this.apiVersion = apiVersion;
this.supported = supported;
this.iconResId = iconResId;
this.updateUri = updateUri;
Expand All @@ -181,19 +185,21 @@ private ExtensionItem(Type type, String extensionName, TrustState trustState,
this.classMarkup = classMarkup;
}

public ExtensionItem(String chanName, String packageName,
public ExtensionItem(String name, String title, String packageName,
String versionName, long versionCode, ApplicationInfo applicationInfo,
Fingerprints fingerprints, int version, boolean supported, int iconResId, Uri updateUri,
Fingerprints fingerprints, int apiVersion, boolean supported, int iconResId, Uri updateUri,
String classConfiguration, String classPerformer, String classLocator, String classMarkup) {
this(Type.CHAN, chanName, TrustState.UNTRUSTED, packageName, versionName, versionCode, applicationInfo,
fingerprints, version, supported, iconResId, updateUri,
this(Type.CHAN, name, title, TrustState.UNTRUSTED,
packageName, versionName, versionCode, applicationInfo,
fingerprints, apiVersion, supported, iconResId, updateUri,
classConfiguration, classPerformer, classLocator, classMarkup);
}

public ExtensionItem(String libName, String packageName,
public ExtensionItem(String name, String title, String packageName,
String versionName, long versionCode, ApplicationInfo applicationInfo,
Fingerprints fingerprints, Uri updateUri) {
this(Type.LIBRARY, libName, TrustState.UNTRUSTED, packageName, versionName, versionCode, applicationInfo,
this(Type.LIBRARY, name, title, TrustState.UNTRUSTED,
packageName, versionName, versionCode, applicationInfo,
fingerprints, 0, true, 0, updateUri, null, null, null, null);
}

Expand All @@ -202,9 +208,9 @@ public ExtensionItem changeTrustState(boolean trusted) {
throw new IllegalStateException();
}
TrustState trustState = trusted ? TrustState.TRUSTED : TrustState.DISCARDED;
return new ExtensionItem(type, extensionName, trustState,
return new ExtensionItem(type, name, title, trustState,
packageName, versionName, versionCode, applicationInfo,
fingerprints, version, supported, iconResId, updateUri,
fingerprints, apiVersion, supported, iconResId, updateUri,
classConfiguration, classPerformer, classLocator, classMarkup);
}
}
Expand Down Expand Up @@ -236,7 +242,7 @@ private static String extendClassName(String className, String packageName) {
private static Map<String, Extension> extensionsMap(List<Extension> extensions) {
LinkedHashMap<String, Extension> map = new LinkedHashMap<>();
for (Extension extension : extensions) {
map.put(extension.item.extensionName, extension);
map.put(extension.item.name, extension);
}
return Collections.unmodifiableMap(map);
}
Expand Down Expand Up @@ -275,7 +281,7 @@ private ChanManager() {
applicationFingerprints, usedExtensionNames, Collections.emptyMap());
if (extension != null) {
extensions.add(extension);
usedExtensionNames.add(extension.item.extensionName);
usedExtensionNames.add(extension.item.name);
}
}
}
Expand Down Expand Up @@ -320,7 +326,7 @@ private void registerReceiver() {
applicationFingerprints, Collections.emptySet(), extensions);
if (newExtension != null) {
boolean newTrusted = newExtension.item.trustState == ExtensionItem.TrustState.TRUSTED;
Extension oldExtension = extensions.get(newExtension.item.extensionName);
Extension oldExtension = extensions.get(newExtension.item.name);
if (oldExtension == null) {
updateExtensions(newExtension, null, true);
for (Callback callback : observable) {
Expand Down Expand Up @@ -356,7 +362,7 @@ private void registerReceiver() {
if (packageName.equals(extension.item.packageName)) {
if (extension.item.type == ExtensionItem.Type.CHAN) {
if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
updateExtensions(null, extension.item.extensionName,
updateExtensions(null, extension.item.name,
extension.item.trustState == ExtensionItem.TrustState.TRUSTED);
if (extension.chan != null) {
for (Callback callback : observable) {
Expand Down Expand Up @@ -384,7 +390,7 @@ private void updateExtensions(Extension newExtension, String deleteExtensionName
}
LinkedHashMap<String, Extension> extensions = new LinkedHashMap<>(this.extensions);
if (newExtension != null) {
extensions.put(newExtension.item.extensionName, newExtension);
extensions.put(newExtension.item.name, newExtension);
}
if (deleteExtensionName != null) {
extensions.remove(deleteExtensionName);
Expand All @@ -393,7 +399,7 @@ private void updateExtensions(Extension newExtension, String deleteExtensionName
for (String chanName : orderedChanNames) {
Extension extension = extensions.get(chanName);
if (extension != null) {
ordered.put(extension.item.extensionName, extension);
ordered.put(extension.item.name, extension);
}
}
extensions.keySet().removeAll(orderedChanNames);
Expand All @@ -415,7 +421,7 @@ private void updateExtensions(Extension newExtension, String deleteExtensionName
archiveChanNames = new ArrayList<>();
archiveMap.put(chanName, archiveChanNames);
}
archiveChanNames.add(extension.item.extensionName);
archiveChanNames.add(extension.item.name);
}
}
}
Expand Down Expand Up @@ -472,30 +478,35 @@ private static Extension loadExtension(PackageInfo packageInfo,
}
long versionCode = PackageInfoCompat.getLongVersionCode(packageInfo);
Bundle data = applicationInfo.metaData;
String extensionName = data.getString(chanExtension ? META_CHAN_EXTENSION_NAME
String name = data.getString(chanExtension ? META_CHAN_EXTENSION_NAME
: libExtension ? META_LIB_EXTENSION_NAME : null);
if (extensionName == null || !VALID_EXTENSION_NAME.matcher(extensionName).matches() ||
(chanExtension ? RESERVED_CHAN_NAMES : RESERVED_EXTENSION_NAMES).contains(extensionName)) {
Log.persistent().write("Invalid extension name: " + extensionName);
if (name == null || !VALID_EXTENSION_NAME.matcher(name).matches() ||
(chanExtension ? RESERVED_CHAN_NAMES : RESERVED_EXTENSION_NAMES).contains(name)) {
Log.persistent().write("Invalid extension name: " + name);
return null;
}
boolean nameConflict;
if (usedExtensionNames.contains(extensionName)) {
if (usedExtensionNames.contains(name)) {
nameConflict = true;
} else {
Extension extension = extensions.get(extensionName);
Extension extension = extensions.get(name);
nameConflict = extension != null && !extension.item.packageName.equals(packageInfo.packageName);
}
if (nameConflict) {
Log.persistent().write("Extension name conflict: " + extensionName + " already exists");
Log.persistent().write("Extension name conflict: " + name + " already exists");
return null;
}
String title = data.getString(chanExtension ? META_CHAN_EXTENSION_TITLE
: libExtension ? META_LIB_EXTENSION_TITLE : null);
if (title == null) {
title = name;
}
Fingerprints fingerprints = extractFingerprints(packageInfo);
ExtensionItem extensionItem;
if (chanExtension) {
int invalidVersion = Integer.MIN_VALUE;
int version = data.getInt(META_CHAN_EXTENSION_VERSION, invalidVersion);
if (version == invalidVersion) {
int apiVersion = data.getInt(META_CHAN_EXTENSION_VERSION, invalidVersion);
if (apiVersion == invalidVersion) {
Log.persistent().write("Invalid extension version");
return null;
}
Expand All @@ -515,17 +526,16 @@ private static Extension loadExtension(PackageInfo packageInfo,
classPerformer = extendClassName(classPerformer, packageInfo.packageName);
classLocator = extendClassName(classLocator, packageInfo.packageName);
classMarkup = extendClassName(classMarkup, packageInfo.packageName);
boolean supported = version >= MIN_VERSION && version <= MAX_VERSION;
extensionItem = new ExtensionItem(extensionName, packageInfo.packageName,
boolean supported = apiVersion >= MIN_VERSION && apiVersion <= MAX_VERSION;
extensionItem = new ExtensionItem(name, title, packageInfo.packageName,
packageInfo.versionName, versionCode, applicationInfo,
fingerprints, version, supported, iconResId, updateUri,
fingerprints, apiVersion, supported, iconResId, updateUri,
classConfiguration, classPerformer, classLocator, classMarkup);
} else if (libExtension) {
String source = data.getString(META_LIB_EXTENSION_SOURCE);
Uri updateUri = source != null ? Uri.parse(source) : null;
extensionItem = new ExtensionItem(extensionName, packageInfo.packageName,
packageInfo.versionName, versionCode, applicationInfo,
fingerprints, updateUri);
extensionItem = new ExtensionItem(name, title, packageInfo.packageName,
packageInfo.versionName, versionCode, applicationInfo, fingerprints, updateUri);
} else {
throw new RuntimeException();
}
Expand All @@ -544,7 +554,7 @@ private static Extension loadExtension(PackageInfo packageInfo,

private static Chan loadChan(ExtensionItem chanItem, PackageManager packageManager) {
if (chanItem.supported) {
String chanName = chanItem.extensionName;
String chanName = chanItem.name;
try {
String nativeLibraryDir = chanItem.applicationInfo.nativeLibraryDir;
if (nativeLibraryDir != null && !new File(nativeLibraryDir).exists()) {
Expand Down Expand Up @@ -574,8 +584,8 @@ private static Chan loadChan(ExtensionItem chanItem, PackageManager packageManag
return null;
}

private void loadLibrary(ExtensionItem libItem) {
switch (libItem.extensionName) {
private void loadLibrary(ExtensionItem libraryItem) {
switch (libraryItem.name) {
case EXTENSION_NAME_LIB_WEBM: {
if (Preferences.isUseVideoPlayer()) {
VideoPlayer.loadLibraries(MainApplication.getInstance());
Expand Down Expand Up @@ -730,8 +740,8 @@ public ExtensionItem getFirstUntrustedExtension() {
return null;
}

public ExtensionItem getLibExtension(String libName) {
Extension extension = extensions.get(libName);
public ExtensionItem getLibraryExtension(String libraryName) {
Extension extension = extensions.get(libraryName);
return extension != null && extension.item.type == ExtensionItem.Type.LIBRARY ? extension.item : null;
}

Expand Down Expand Up @@ -784,7 +794,7 @@ String getChanNameByHost(String host) {
if (host != null) {
for (Extension extension : extensions.values()) {
if (extension.chan != null && extension.chan.locator.isChanHost(host)) {
return extension.item.extensionName;
return extension.item.name;
}
}
}
Expand Down
7 changes: 5 additions & 2 deletions src/com/mishiranu/dashchan/content/UpdaterActivity.java
Expand Up @@ -180,11 +180,13 @@ public static class Request {
public final String extensionName;
public final String versionName;
public final Uri uri;
public final byte[] sha256sum;

public Request(String extensionName, String versionName, Uri uri) {
public Request(String extensionName, String versionName, Uri uri, byte[] sha256sum) {
this.extensionName = extensionName;
this.versionName = versionName;
this.uri = uri;
this.sha256sum = sha256sum;
}
}

Expand All @@ -193,7 +195,8 @@ public static void startUpdater(List<Request> requests) {
ArrayList<DownloadService.DownloadItem> downloadItems = new ArrayList<>();
for (Request request : requests) {
String name = request.extensionName + "-" + request.versionName + ".apk";
DownloadService.DownloadItem downloadItem = new DownloadService.DownloadItem(null, request.uri, name);
DownloadService.DownloadItem downloadItem = new DownloadService.DownloadItem(null,
request.uri, name, request.sha256sum);
if (ChanManager.EXTENSION_NAME_CLIENT.equals(request.extensionName)) {
clientDownloadItem = downloadItem;
} else {
Expand Down

0 comments on commit 2614c7e

Please sign in to comment.