2025-02-21 13:20:08 +01:00
#!/usr/bin/env bash
2024-09-02 09:57:45 -07:00
2025-02-22 13:07:29 -08:00
ERROR_FOUND = 0
2024-09-02 09:57:45 -07:00
REQUIRED_PATTERNS = (
2025-02-22 13:07:29 -08:00
" ^Filetype: Flipper NFC device $"
" ^Version: 4 $"
" ^Device type: SLIX $"
" ^UID:( [A-F0-9]{2}){8} $"
" ^DSFID: 00 $"
" ^AFI: 00 $"
" ^IC Reference: 03 $"
" ^Lock DSFID: false $"
" ^Lock AFI: false $"
" ^Block Count: 8 $"
" ^Block Size: 04 $"
" ^Data Content:( [A-F0-9]{2}){32} $"
" ^Security Status: 00 00 00 00 00 00 00 00 $"
" ^Capabilities: Default $"
" ^Password Privacy: 7F FD 6E 5B $"
" ^Password Destroy: 0F 0F 0F 0F $"
" ^Password EAS: 00 00 00 00 $"
" ^Privacy Mode: false $"
" ^Lock EAS: false $"
2024-09-02 09:57:45 -07:00
)
2025-02-21 13:20:08 +01:00
FORBIDDEN_PATTERNS = (
2025-02-22 13:07:29 -08:00
# This showed up in Unleashed firmware, see https://github.com/nortakales/flipper-zero-tonies/pull/82
2025-02-21 13:20:08 +01:00
"Subtype: ([0-9]){2}"
)
2024-09-02 09:57:45 -07:00
2025-02-26 16:56:43 -08:00
FILE_AND_DIR_ALLOWED_CHARACTERS = "A-Za-z0-9().,!%&+ -" ;
2025-10-09 10:46:14 -07:00
# Not the most elegant regex, but ensure files are at least 2 directories deep
FILE_AND_DIR_REGEX = " ^\.\/(English|German|French)\/[ $FILE_AND_DIR_ALLOWED_CHARACTERS /]+\/[ $FILE_AND_DIR_ALLOWED_CHARACTERS ]+\.nfc $"
2025-02-26 16:56:43 -08:00
2025-02-22 13:07:29 -08:00
# Use process substitution so that ERROR_FOUND is updated in the main shell.
2025-02-21 13:20:08 +01:00
while read -r filename; do
content = $( cat " $filename " )
2024-09-02 09:57:45 -07:00
2025-02-26 16:56:43 -08:00
if ! echo " $filename " | awk " / $FILE_AND_DIR_REGEX / { found=1 } END { exit !found } " ; then
echo " $filename "
2025-10-09 10:46:14 -07:00
echo " Filename has invalid characters, missing .nfc extension, or is not at least 2 directories deep (e.g. English/Paw Patrol/). Allowed characters are $FILE_AND_DIR_ALLOWED_CHARACTERS "
2025-02-26 16:56:43 -08:00
ERROR_FOUND = 1
fi
2025-02-21 13:20:08 +01:00
for pattern in " ${ REQUIRED_PATTERNS [@] } " ; do
if ! echo " $content " | awk " / $pattern / { found=1 } END { exit !found } " ; then
echo " $filename "
2025-02-22 13:07:29 -08:00
echo " Missing pattern: $pattern "
ERROR_FOUND = 1
fi
done
for pattern in " ${ FORBIDDEN_PATTERNS [@] } " ; do
if echo " $content " | awk " / $pattern / { found=1 } END { exit !found } " ; then
echo " $filename "
echo " Forbidden pattern found: $pattern "
ERROR_FOUND = 1
2024-09-02 09:57:45 -07:00
fi
2025-02-21 13:20:08 +01:00
done
2025-03-31 17:17:30 -07:00
# It turns out that there is at least one valid Tonies with `00 00 00 00` in the data
# so now we can just check for one more `00` block than that one and hope it still catches
# partially read Tonies
if echo " $content " | awk '/Data Content:( [A-F0-9]{2})* 00 00 00 00 00( [A-F0-9]{2})*/ { found=1 } END { exit !found }' ; then
2025-02-21 13:20:08 +01:00
echo " $filename "
echo " Full data not read"
2025-02-22 13:07:29 -08:00
ERROR_FOUND = 1
2025-02-21 13:20:08 +01:00
fi
2024-09-02 09:57:45 -07:00
2025-02-22 13:07:29 -08:00
# Not necessarily going to cause issues, but keep line endings the same for consistency
2025-02-21 13:20:08 +01:00
if echo " $content " | awk '/\r/ { found=1 } END { exit !found }' ; then
echo " $filename "
echo " Has carriage return characters"
2025-02-22 13:07:29 -08:00
ERROR_FOUND = 1
2025-02-21 13:20:08 +01:00
fi
2025-10-09 10:34:31 -07:00
done < <( find . -type f \
-not -path './scripts/*' \
-not -path './.github/*' \
-not -path './.git/*' \
-not -path './.gitignore' \
-not -path './README.md' \
-not -path './*/README.md' )
2025-02-19 16:39:09 -08:00
2025-02-22 13:07:29 -08:00
exit $ERROR_FOUND