mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-22 07:57:39 +00:00
Inject module-installer.sh if new format is detected
This commit is contained in:
parent
b45db44ad9
commit
4859ee2da9
@ -68,6 +68,7 @@ public class Const {
|
|||||||
public static final String REPO_URL = "https://api.github.com/users/Magisk-Modules-Repo/repos?per_page=100&sort=pushed&page=%d";
|
public static final String REPO_URL = "https://api.github.com/users/Magisk-Modules-Repo/repos?per_page=100&sort=pushed&page=%d";
|
||||||
public static final String FILE_URL = "https://raw.githubusercontent.com/Magisk-Modules-Repo/%s/master/%s";
|
public static final String FILE_URL = "https://raw.githubusercontent.com/Magisk-Modules-Repo/%s/master/%s";
|
||||||
public static final String ZIP_URL = "https://github.com/Magisk-Modules-Repo/%s/archive/master.zip";
|
public static final String ZIP_URL = "https://github.com/Magisk-Modules-Repo/%s/archive/master.zip";
|
||||||
|
public static final String MODULE_INSTALLER = "https://raw.githubusercontent.com/topjohnwu/Magisk/master/scripts/module_installer.sh";
|
||||||
public static final String PAYPAL_URL = "https://www.paypal.me/topjohnwu";
|
public static final String PAYPAL_URL = "https://www.paypal.me/topjohnwu";
|
||||||
public static final String PATREON_URL = "https://www.patreon.com/topjohnwu";
|
public static final String PATREON_URL = "https://www.patreon.com/topjohnwu";
|
||||||
public static final String TWITTER_URL = "https://twitter.com/topjohnwu";
|
public static final String TWITTER_URL = "https://twitter.com/topjohnwu";
|
||||||
|
@ -63,7 +63,8 @@ public class DownloadModuleService extends Service {
|
|||||||
InputStream in = Networking.get(repo.getZipUrl())
|
InputStream in = Networking.get(repo.getZipUrl())
|
||||||
.setDownloadProgressListener(progress)
|
.setDownloadProgressListener(progress)
|
||||||
.execForInputStream().getResult();
|
.execForInputStream().getResult();
|
||||||
removeTopFolder(in, new BufferedOutputStream(new FileOutputStream(output)));
|
OutputStream out = new BufferedOutputStream(new FileOutputStream(output));
|
||||||
|
processZip(in, out, repo.isNewInstaller());
|
||||||
if (install) {
|
if (install) {
|
||||||
progress.dismiss();
|
progress.dismiss();
|
||||||
Intent intent = new Intent(this, ClassMap.get(FlashActivity.class));
|
Intent intent = new Intent(this, ClassMap.get(FlashActivity.class));
|
||||||
@ -80,17 +81,36 @@ public class DownloadModuleService extends Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeTopFolder(InputStream in, OutputStream out) throws IOException {
|
private void processZip(InputStream in, OutputStream out, boolean inject)
|
||||||
|
throws IOException {
|
||||||
try (ZipInputStream zin = new ZipInputStream(in);
|
try (ZipInputStream zin = new ZipInputStream(in);
|
||||||
ZipOutputStream zout = new ZipOutputStream(out)) {
|
ZipOutputStream zout = new ZipOutputStream(out)) {
|
||||||
ZipEntry entry;
|
|
||||||
|
if (inject) {
|
||||||
|
// Inject latest module-installer.sh as update-binary
|
||||||
|
zout.putNextEntry(new ZipEntry("META-INF/"));
|
||||||
|
zout.putNextEntry(new ZipEntry("META-INF/com/"));
|
||||||
|
zout.putNextEntry(new ZipEntry("META-INF/com/google/"));
|
||||||
|
zout.putNextEntry(new ZipEntry("META-INF/com/google/android/"));
|
||||||
|
zout.putNextEntry(new ZipEntry("META-INF/com/google/android/update-binary"));
|
||||||
|
try (InputStream update_bin = Networking.get(Const.Url.MODULE_INSTALLER)
|
||||||
|
.execForInputStream().getResult()) {
|
||||||
|
ShellUtils.pump(update_bin, zout);
|
||||||
|
}
|
||||||
|
zout.putNextEntry(new ZipEntry("META-INF/com/google/android/updater-script"));
|
||||||
|
zout.write("#MAGISK\n".getBytes("UTF-8"));
|
||||||
|
}
|
||||||
|
|
||||||
int off = -1;
|
int off = -1;
|
||||||
|
ZipEntry entry;
|
||||||
while ((entry = zin.getNextEntry()) != null) {
|
while ((entry = zin.getNextEntry()) != null) {
|
||||||
if (off < 0)
|
if (off < 0)
|
||||||
off = entry.getName().indexOf('/') + 1;
|
off = entry.getName().indexOf('/') + 1;
|
||||||
String path = entry.getName().substring(off);
|
String path = entry.getName().substring(off);
|
||||||
if (path.isEmpty())
|
if (path.isEmpty())
|
||||||
continue;
|
continue;
|
||||||
|
if (inject && path.startsWith("META-INF"))
|
||||||
|
continue;
|
||||||
zout.putNextEntry(new ZipEntry(path));
|
zout.putNextEntry(new ZipEntry(path));
|
||||||
if (!entry.isDirectory())
|
if (!entry.isDirectory())
|
||||||
ShellUtils.pump(zin, zout);
|
ShellUtils.pump(zin, zout);
|
||||||
|
@ -8,6 +8,8 @@ import android.os.Parcelable;
|
|||||||
import com.topjohnwu.magisk.Const;
|
import com.topjohnwu.magisk.Const;
|
||||||
import com.topjohnwu.magisk.utils.Logger;
|
import com.topjohnwu.magisk.utils.Logger;
|
||||||
import com.topjohnwu.magisk.utils.Utils;
|
import com.topjohnwu.magisk.utils.Utils;
|
||||||
|
import com.topjohnwu.net.Networking;
|
||||||
|
import com.topjohnwu.net.Request;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -82,11 +84,21 @@ public class Repo extends BaseModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getPropUrl() {
|
public String getPropUrl() {
|
||||||
return String.format(Const.Url.FILE_URL, getId(), "module.prop");
|
return getFileUrl("module.prop");
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDetailUrl() {
|
public String getDetailUrl() {
|
||||||
return String.format(Const.Url.FILE_URL, getId(), "README.md");
|
return getFileUrl("README.md");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFileUrl(String file) {
|
||||||
|
return String.format(Const.Url.FILE_URL, getId(), file);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isNewInstaller() {
|
||||||
|
try (Request req = Networking.get(getFileUrl("install.sh"))) {
|
||||||
|
return req.connect().isSuccess();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getLastUpdateString() {
|
public String getLastUpdateString() {
|
||||||
|
@ -8,6 +8,8 @@ import org.json.JSONObject;
|
|||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.Closeable;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.FilterInputStream;
|
import java.io.FilterInputStream;
|
||||||
@ -19,7 +21,7 @@ import java.io.Reader;
|
|||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
public class Request {
|
public class Request implements Closeable {
|
||||||
private HttpURLConnection conn;
|
private HttpURLConnection conn;
|
||||||
private Executor executor = null;
|
private Executor executor = null;
|
||||||
private DownloadProgressListener progress = null;
|
private DownloadProgressListener progress = null;
|
||||||
@ -42,6 +44,10 @@ public class Request {
|
|||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isSuccess() {
|
||||||
|
return code >= 200 && code <= 299;
|
||||||
|
}
|
||||||
|
|
||||||
public HttpURLConnection getConnection() {
|
public HttpURLConnection getConnection() {
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
@ -51,6 +57,11 @@ public class Request {
|
|||||||
conn = c;
|
conn = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
conn.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
public Request addHeaders(String key, String value) {
|
public Request addHeaders(String key, String value) {
|
||||||
conn.setRequestProperty(key, value);
|
conn.setRequestProperty(key, value);
|
||||||
return this;
|
return this;
|
||||||
@ -71,6 +82,16 @@ public class Request {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Result<Void> connect() {
|
||||||
|
try {
|
||||||
|
connect0();
|
||||||
|
} catch (IOException e) {
|
||||||
|
if (err != null)
|
||||||
|
err.onError(conn, e);
|
||||||
|
}
|
||||||
|
return new Result<>();
|
||||||
|
}
|
||||||
|
|
||||||
public Result<InputStream> execForInputStream() {
|
public Result<InputStream> execForInputStream() {
|
||||||
return exec(this::getInputStream);
|
return exec(this::getInputStream);
|
||||||
}
|
}
|
||||||
@ -83,6 +104,14 @@ public class Request {
|
|||||||
exec(() -> dlFile(out));
|
exec(() -> dlFile(out));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void getAsBytes(ResponseListener<byte[]> rs) {
|
||||||
|
submit(this::dlBytes, rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Result<byte[]> execForBytes() {
|
||||||
|
return exec(this::dlBytes);
|
||||||
|
}
|
||||||
|
|
||||||
public void getAsString(ResponseListener<String> rs) {
|
public void getAsString(ResponseListener<String> rs) {
|
||||||
submit(this::dlString, rs);
|
submit(this::dlString, rs);
|
||||||
}
|
}
|
||||||
@ -107,6 +136,11 @@ public class Request {
|
|||||||
return exec(this::dlJSONArray);
|
return exec(this::dlJSONArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void connect0() throws IOException {
|
||||||
|
conn.connect();
|
||||||
|
code = conn.getResponseCode();
|
||||||
|
}
|
||||||
|
|
||||||
private <T> Result<T> exec(Requestor<T> req) {
|
private <T> Result<T> exec(Requestor<T> req) {
|
||||||
Result<T> res = new Result<>();
|
Result<T> res = new Result<>();
|
||||||
try {
|
try {
|
||||||
@ -135,8 +169,7 @@ public class Request {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private BufferedInputStream getInputStream() throws IOException {
|
private BufferedInputStream getInputStream() throws IOException {
|
||||||
conn.connect();
|
connect0();
|
||||||
code = conn.getResponseCode();
|
|
||||||
InputStream in = conn.getInputStream();
|
InputStream in = conn.getInputStream();
|
||||||
if (progress != null) {
|
if (progress != null) {
|
||||||
in = new ProgressInputStream(in, conn.getContentLength(), progress) {
|
in = new ProgressInputStream(in, conn.getContentLength(), progress) {
|
||||||
@ -162,7 +195,7 @@ public class Request {
|
|||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
try (Reader reader = new InputStreamReader(getInputStream())) {
|
try (Reader reader = new InputStreamReader(getInputStream())) {
|
||||||
int len;
|
int len;
|
||||||
char buf[] = new char[4096];
|
char[] buf = new char[4096];
|
||||||
while ((len = reader.read(buf)) != -1) {
|
while ((len = reader.read(buf)) != -1) {
|
||||||
builder.append(buf, 0, len);
|
builder.append(buf, 0, len);
|
||||||
}
|
}
|
||||||
@ -182,11 +215,24 @@ public class Request {
|
|||||||
try (InputStream in = getInputStream();
|
try (InputStream in = getInputStream();
|
||||||
OutputStream out = new BufferedOutputStream(new FileOutputStream(f))) {
|
OutputStream out = new BufferedOutputStream(new FileOutputStream(f))) {
|
||||||
int len;
|
int len;
|
||||||
byte buf[] = new byte[4096];
|
byte[] buf = new byte[4096];
|
||||||
while ((len = in.read(buf)) != -1) {
|
while ((len = in.read(buf)) != -1) {
|
||||||
out.write(buf, 0, len);
|
out.write(buf, 0, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private byte[] dlBytes() throws IOException {
|
||||||
|
int len = conn.getContentLength();
|
||||||
|
len = len > 0 ? len : 32;
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream(len);
|
||||||
|
try (InputStream in = getInputStream()) {
|
||||||
|
byte[] buf = new byte[4096];
|
||||||
|
while ((len = in.read(buf)) != -1) {
|
||||||
|
out.write(buf, 0, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out.toByteArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user