diff --git a/general/package/quirc-openipc/files/qrparse b/general/package/quirc-openipc/files/qrparse new file mode 100755 index 00000000..fdbb36a2 --- /dev/null +++ b/general/package/quirc-openipc/files/qrparse @@ -0,0 +1,113 @@ +#!/bin/sh + +################################################################################ +# +# THIS SCRIPT WILL PARSE AN ZXING FORMAT QR CODE PAYLOAD FOR WIFI CREDENTIALS +# +# INPUT MUST BE PASSED IN SINGLE QUOTES +# +# BARCODE CONTENTS CAN BE FOUND HERE +# https://github.com/zxing/zxing/wiki/Barcode-Contents#wi-fi-network-config-android-ios-11 +# +# THIS SCRIPT USES SIMILAR LOGIC TO: +# https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/WifiResultParser.java +# +# @author jayfan0 +# +# OPENIPC USAGE: qrparse $(qrscan -p /mnt/mmcblk0p1/qrcode2.jpg | head -n 1) +# OPENIPC FULL USAGE: curl -s -o /tmp/img.jpg http://127.0.0.1/image.jpg ; qrparse $(qrscan -p /tmp/img.jpg | head -n 1) +################################################################################ + +if [ "$1" = "help" ]; then + echo -e "\n================= QRPARSER usage =================\n" + echo -e "Parse the QR code scanned by qrscan and extract wifi credentials\n" + echo -e "INPUT MUST BE PASSED IN SINGLE QUOTES\n" + echo -e "USAGE EXAMPLES:\n" + echo -e 'Standalone:\t\t qrparse $(qrscan -p /mnt/mmcblk0p1/qrcode2.jpg | head -n 1)\n' + echo -e 'With camera sensor:\t curl -s -o /tmp/img.jpg http://127.0.0.1/image.jpg ; qrparse $(qrscan -p /tmp/img.jpg | head -n 1)\n' + exit +fi + +# scan='WIFI:S:thi$iSmdsywifi;H:false;T:WPA2;P:$e£cr3tt;PH2:MSCHAPv2;;' +scan=$1 + +if [[ ${scan:0:5} == "WIFI:" ]]; then + + trunc=$(echo $scan | sed 's/WIFI://') + + delims=${trunc//[^;]} + + count=${#delims} + + fields=$(( $count-1 )) + + for i in $(seq 1 $fields); + do + line=$(echo $trunc | cut -d ';' -f $i) + + for j in $(seq 1 2); + do + single=$(echo $line | cut -d ':' -f $j) + + case $single in + S) + SSID=$(echo $line | cut -d ':' -f $(( j + 1 ))) + [ -z $SSID ] && echo "SSID Empty. Aborting" && exit + echo "SSID = $SSID" + ;; + + P) + password=$(echo $line | cut -d ':' -f $(( j + 1 ))) + echo "Password = $password" + ;; + + T) + auth=$(echo $line | cut -d ':' -f $(( j + 1 ))) + [ -z $auth ] && auth = "nopass" + echo "Authentication type = $auth" + ;; + + H) + hidden=$(echo $line | cut -d ':' -f $(( j + 1 ))) +# echo "Hidden SSID = $hidden" + ;; + + E) + eap=$(echo $line | cut -d ':' -f $(( j + 1 ))) + echo "EAP method = $eap" + ;; + + A) + anon=$(echo $line | cut -d ':' -f $(( j + 1 ))) + echo "Anonymous identity = $anon" + ;; + + I) + identity=$(echo $line | cut -d ':' -f $(( j + 1 ))) + echo "Identity = $identity" + ;; + + PH2) + ph2=$(echo $line | cut -d ':' -f $(( j + 1 ))) + echo "PH2 = $ph2" + ;; + esac + done + done + + # Unfortunately, in the past, H: was not just used for boolean 'hidden', but 'phase 2 method'. + # To try to retain backwards compatibility, we set one or the other based on whether the string + #is 'true' or 'false': + if [ ! -z $hidden ]; then + # If PH2 was specified separately, or if the value is clearly boolean, interpret it as 'hidden' + if [ ! -z "$ph2" ] || [[ $(echo "$hidden" | tr '[:upper:]' '[:lower:]') = $(echo "true") ]] || [[ $(echo "$hidden" | tr '[:upper:]' '[:lower:]') = $(echo "false") ]]; then + hidden=$hidden + echo "Hidden = $hidden" + else + ph2=$hidden + echo "PH2 = $ph2" + fi + fi +else + echo "Invalid QR Code" +fi diff --git a/general/package/quirc-openipc/quirc-openipc.mk b/general/package/quirc-openipc/quirc-openipc.mk index 24144f34..86a3abd8 100644 --- a/general/package/quirc-openipc/quirc-openipc.mk +++ b/general/package/quirc-openipc/quirc-openipc.mk @@ -20,6 +20,8 @@ endef define QUIRC_OPENIPC_INSTALL_TARGET_CMDS $(INSTALL) -m 0755 -D $(@D)/qrscan $(TARGET_DIR)/usr/sbin + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/sbin + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/sbin $(QUIRC_OPENIPC_PKGDIR)files/qrparse endef $(eval $(generic-package))