#!/bin/sh

. /lib/functions.sh

### DPP platform script ###

dpp_dbg() {
	logger -t dpp $@
}

dpp_sub() {
	dpp_usage() {
		cat <<EOF
DPP platform script
EOF
	exit 1
	}

	# only 1 uri may be active
	#wpa_cli -i wl1 dpp_bootstrap_gen type=qrcode mac=44D43771B73F chan=81/1
	#wpa_cli -i wl1 dpp_bootstrap_get_uri 1
	dpp_gen_uri() {
		ifname=$1
		type=$2
		mac=$3
		chan=$4
		key=$5

		[ -z "$ifname" -o -z "$type" -o -z "$mac" -o -z "$chan" ] && return

		uri=$(wpa_cli -i $ifname dpp_bootstrap_get_uri 1)
		[ "$uri" == "FAIL" ] || {
			echo $uri
			return
		}

		cmd="wpa_cli -i $ifname dpp_bootstrap_gen type=$type mac=$mac chan=$chan"

		[ "$key" != "" ] && cmd="${cmd} key=$key"

		uri=$($cmd)
		[ "$uri" == "FAIL" ] && return

		uri=$(wpa_cli -i $ifname dpp_bootstrap_get_uri 1)
		[ "$uri" != "FAIL" ] && {
			echo $uri
			return
		}
	}

	dpp_del_uri_enrollee() {
		ifname=$1
		bi_id=$2

		[ -z "$ifname" ] && return

		wpa_cli -i $ifname dpp_bootstrap_remove $bi_id 2>&1 > /dev/null
	}

	dpp_del_uri_controller() {
		ifname=$1
		bi_id=$2

		[ -z "$ifname" ] && return

		wpa_cli -i $ifname dpp_bootstrap_remove $bi_id 2>&1 > /dev/null
	}

	dpp_set_bootstrap() {
		ifname=$1
		qr=$2
		encryption=$3
		ssid=$4
		pass=$5
		port=$6

		# seems its not possible to start from config
		hostapd_cli -i $ifname dpp_controller_start tcp_port=$port role=configurator

		[ -z "$ifname" -o -z "$qr" -o -z "$encryption" -o -z "$ssid" ] && return

		configurator=$(hostapd_cli -i $ifname dpp_configurator_get 1)
		[ "$configurator" == "FAIL" ] && {
			hostapd_cli -i $ifname dpp_configurator_add
		}

		bi_id=$(hostapd_cli -i $ifname dpp_qr_code $qr)
		[ "$bi_id" == "FAIL" ] && return

		echo $bi_id

		#hostapd_cli -i wl1 dpp_bootstrap_set 1 conf=map-sae ssid=74657374 pass=31323334353637383930 configurator=1
		hostapd_cli -i $ifname dpp_bootstrap_set $bi_id conf=map-${encryption} configurator=1 ssid=$ssid pass=$pass 2>&1 > /dev/null
	}

	dpp_csign_gen() {
		ifname=$1
		encryption=$2
		ssid=$3

		# seems its not possible to start from config
		hostapd_cli -i $ifname dpp_controller_start tcp_port=$port role=configurator

		[ -z "$ifname" -o -z "$encryption" -o -z "$ssid" ] && return

		configurator=$(hostapd_cli -i $ifname dpp_configurator_get 1)
		[ "$configurator" == "FAIL" ] && {
			hostapd_cli -i $ifname dpp_configurator_add
		}

		case "$encryption" in
			*"dpp"*)
				hostapd_cli -i $ifname dpp_configurator_sign conf=ap-dpp configurator=1 ssid=$ssid
			;;
		esac
	}

	dpp_chirp() {
		ifname=$1
		num=$2

		wpa_cli -i $ifname dpp_chirp own=1 $num 2>&1 > /dev/null
	}

	local func=$1
	shift

	case "$func" in
		gen_uri) dpp_dbg "gen_uri $@"; dpp_gen_uri $@;;
		del_uri_enrollee) dpp_dbg "del_uri_enrollee $@"; dpp_del_uri_enrollee $@;;
		del_uri_en_controller) dpp_dbg "del_uri_en_controller $@"; dpp_del_uri_en_controller $@;;
		set_bootstrap) dpp_dbg "set_bootstrap $@"; dpp_set_bootstrap $@;;
		csign_gen) dpp_dbg "csign_gen $@"; dpp_csign_gen $@;;
		chirp) dpp_dbg "chirp $@"; dpp_chirp $@;;
		--help|help) dpp_usage;;
		*) dpp_usage; exit 1;;
	esac
}
