#!/bin/sh

. /lib/functions.sh
. /lib/functions/system.sh
. /usr/share/libubox/jshn.sh

include /lib/upgrade

VALID=1
FORCEABLE=1
ALLOW_BACKUP=1

# Mark image as invalid but still possible to install
notify_firmware_invalid() {
	VALID=0
}

# Mark image as broken (impossible to install)
notify_firmware_broken() {
	VALID=0
	FORCEABLE=0
}

# Mark image as incompatible with preserving a backup
notify_firmware_no_backup() {
	ALLOW_BACKUP=0
}

# Add result of validation test
notify_firmware_test_result() {
	local old_ns

	json_set_namespace validate_firmware_image old_ns
	json_add_boolean "$1" "$2"
	json_set_namespace $old_ns
}

err_to_bool() {
	[ "$1" -ne 0 ] && echo 0 || echo 1
}

fwtool_check_signature "$1" >&2
FWTOOL_SIGNATURE=$?
[ "$FWTOOL_SIGNATURE" -ne 0 ] && notify_firmware_invalid

fwtool_check_image "$1" >&2
FWTOOL_DEVICE_MATCH=$?
[ "$FWTOOL_DEVICE_MATCH" -ne 0 ] && notify_firmware_invalid

json_set_namespace validate_firmware_image old_ns
json_init
	json_add_object "tests"
		json_add_boolean fwtool_signature "$(err_to_bool $FWTOOL_SIGNATURE)"
		json_add_boolean fwtool_device_match "$(err_to_bool $FWTOOL_DEVICE_MATCH)"

		# Call platform_check_image() here so it can add its test
		# results and still mark image properly.
		json_set_namespace $old_ns
		platform_check_image "$1" >&2 || notify_firmware_invalid
		json_set_namespace validate_firmware_image old_ns
	json_close_object
	json_add_boolean valid "$VALID"
	json_add_boolean forceable "$FORCEABLE"
	json_add_boolean allow_backup "$ALLOW_BACKUP"
json_dump -i
json_set_namespace $old_ns