mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-02-17 12:56:48 +01:00
Huami: Improve large firmware zip file handling
This commit is contained in:
parent
3c882467cc
commit
9b2775458c
@ -246,6 +246,7 @@ public class FwAppInstallerActivity extends AbstractGBActivity implements Instal
|
||||
for (DeviceCoordinator coordinator : getAllCoordinatorsConnectedFirst()) {
|
||||
InstallHandler handler = coordinator.findInstallHandler(uri, this);
|
||||
if (handler != null) {
|
||||
LOG.info("Found install handler {} from {}", handler.getClass(), coordinator.getClass());
|
||||
return handler;
|
||||
}
|
||||
}
|
||||
|
@ -29,6 +29,11 @@ public class AmazfitGTS3FWHelper extends HuamiFWHelper {
|
||||
super(uri, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getMaxExpectedFileSize() {
|
||||
return 1024 * 1024 * 128; // 128.0MB
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void determineFirmwareInfo(final byte[] wholeFirmwareBytes) {
|
||||
firmwareInfo = new AmazfitGTS3FirmwareInfo(wholeFirmwareBytes);
|
||||
|
@ -29,6 +29,11 @@ public class MiBand7FWHelper extends HuamiFWHelper {
|
||||
super(uri, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getMaxExpectedFileSize() {
|
||||
return 1024 * 1024 * 32; // 32.0MB
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void determineFirmwareInfo(final byte[] wholeFirmwareBytes) {
|
||||
firmwareInfo = new MiBand7FirmwareInfo(wholeFirmwareBytes);
|
||||
|
@ -53,8 +53,12 @@ public abstract class AbstractMiBandFWHelper {
|
||||
throw new IOException("Firmware has a filename that looks like a Pebble app/firmware.");
|
||||
}
|
||||
|
||||
if (uriHelper.getFileSize() > getMaxExpectedFileSize()) {
|
||||
throw new IOException("Firmware size is larger than the maximum expected file size of " + getMaxExpectedFileSize());
|
||||
}
|
||||
|
||||
try (InputStream in = new BufferedInputStream(uriHelper.openInputStream())) {
|
||||
this.fw = FileUtils.readAll(in, 1024 * 1024 * 32); // 32.0 MB
|
||||
this.fw = FileUtils.readAll(in, getMaxExpectedFileSize());
|
||||
determineFirmwareInfo(fw);
|
||||
} catch (IOException ex) {
|
||||
throw ex; // pass through
|
||||
@ -112,6 +116,13 @@ public abstract class AbstractMiBandFWHelper {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* The maximum expected file size, in bytes. Files larger than this are assumed to be invalid.
|
||||
*/
|
||||
public long getMaxExpectedFileSize() {
|
||||
return 1024 * 1024 * 16; // 16.0MB
|
||||
}
|
||||
|
||||
protected abstract int[] getWhitelistedFirmwareVersions();
|
||||
|
||||
public abstract boolean isFirmwareGenerallyCompatibleWith(GBDevice device);
|
||||
|
@ -41,16 +41,20 @@ public abstract class Huami2021FirmwareInfo extends AbstractHuamiFirmwareInfo {
|
||||
0x50, 0x4B, 0x03, 0x04
|
||||
};
|
||||
|
||||
public static final byte[] FW_HEADER = new byte[]{
|
||||
0x51, 0x71
|
||||
};
|
||||
|
||||
public Huami2021FirmwareInfo(final byte[] bytes) {
|
||||
super(bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* The device name, to search on firmware.bin in order to determine compatibility.
|
||||
*/
|
||||
public abstract String deviceName();
|
||||
|
||||
/**
|
||||
* The expected firmware header bytes, to search on firmware.bin in order to determine compatibility.
|
||||
*/
|
||||
public abstract byte[] getExpectedFirmwareHeader();
|
||||
|
||||
@Override
|
||||
protected HuamiFirmwareType determineFirmwareType(final byte[] bytes) {
|
||||
if (ArrayUtils.equals(bytes, UIHHContainer.UIHH_HEADER, 0)) {
|
||||
@ -137,8 +141,8 @@ public abstract class Huami2021FirmwareInfo extends AbstractHuamiFirmwareInfo {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ArrayUtils.equals(firmwareBin, FW_HEADER, 0)) {
|
||||
LOG.warn("Unexpected firmware header: {}", GB.hexdump(Arrays.copyOfRange(firmwareBin, 0, FW_HEADER.length + 1)));
|
||||
if (!ArrayUtils.equals(firmwareBin, getExpectedFirmwareHeader(), 0)) {
|
||||
LOG.warn("Unexpected firmware header: {}", GB.hexdump(Arrays.copyOfRange(firmwareBin, 0, getExpectedFirmwareHeader().length + 3)));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -43,6 +43,11 @@ public class AmazfitGTS3FirmwareInfo extends Huami2021FirmwareInfo {
|
||||
return HuamiConst.AMAZFIT_GTS3_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getExpectedFirmwareHeader() {
|
||||
return new byte[]{0x00, 0x00, 0x50}; // Probably bogus, only checked against 2 firmware files
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGenerallyCompatibleWith(final GBDevice device) {
|
||||
return isHeaderValid() && device.getType() == DeviceType.AMAZFITGTS3;
|
||||
|
@ -44,6 +44,11 @@ public class MiBand7FirmwareInfo extends Huami2021FirmwareInfo {
|
||||
return HuamiConst.XIAOMI_SMART_BAND7_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getExpectedFirmwareHeader() {
|
||||
return new byte[]{0x51, 0x71};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGenerallyCompatibleWith(final GBDevice device) {
|
||||
return isHeaderValid() && device.getType() == DeviceType.MIBAND7;
|
||||
|
Loading…
x
Reference in New Issue
Block a user