Spaces:
Running
on
T4
Running
on
T4
if [ "$TRUEPIC_DEBUG" = "2" ]; then | |
set -xeo pipefail | |
else | |
set -eo pipefail | |
fi | |
debug_echo() { | |
if [ -n "$TRUEPIC_DEBUG" ]; then | |
echo "$@" | |
fi | |
} | |
MEDIA_FILE=$(readlink -f "$1") | |
OUTPUT_FILE=$2 | |
TRUEPIC_CLI=/home/user/app/truepic | |
STEG_SCRIPTS=/home/user/app/scripts/ | |
filename=$(basename "${MEDIA_FILE}") | |
extension="${filename##*.}" | |
if [ "${extension}" = "jpg" ] || [ "${extension}" = "jpeg" ]; then | |
mime_type="image/jpeg" | |
else | |
if [ "${extension}" = "png" ]; then | |
mime_type="image/png" | |
else | |
echo "Unsupported file extension: ${extension}" | |
exit 1 | |
fi | |
fi | |
debug_echo -n "Checking for C2PA data in the media..." | |
set +e | |
verification_json=$(${TRUEPIC_CLI} verify $MEDIA_FILE 2>&1) | |
set -e | |
if jq -e . <<< "$verification_json" >/dev/null 2>&1; then | |
c2pa_manifest_found=true | |
debug_echo " embedded C2PA manifest found." | |
else | |
c2pa_manifest_found=false | |
debug_echo " no embedded C2PA manifest found." | |
fi | |
debug_echo | |
debug_echo -n "Uploading media to steg.ai..." | |
media_id=$(${STEG_SCRIPTS}/upload.sh ${MEDIA_FILE} $mime_type) | |
debug_echo " --> media_id=${media_id}" | |
debug_echo | |
debug_echo -n "Detecting a watermark..." | |
decode_response=$( | |
curl -s https://api.steg.ai/decode_image_async \ | |
-H "x-api-key: ${STEG_AI_API_KEY}" \ | |
--data-raw '{ "media_id": "'${media_id}'" }' | |
) | |
request_id=$(echo "$decode_response" | jq -r '.data.request_id') | |
if [ -z "$request_id" ] || [ "$request_id" = "null" ]; then | |
debug_echo | |
echo "No request_id" | |
exit 1; | |
fi | |
status_response="" | |
decode_status="" | |
while [ "$decode_status" != "Completed." ]; do | |
sleep 1 | |
debug_echo -n ".." | |
status_response=$( | |
curl -s https://api.steg.ai/media_status?request_id=${request_id} \ | |
-H "x-api-key: ${STEG_AI_API_KEY}" | |
) | |
decode_status=$(echo "${status_response}" | jq -r '.data.status') | |
done | |
original_id=$(echo "${status_response}" | jq -r '.data.media_data.custom' | jq -r '.original_id') | |
manifest_id=$(echo "${status_response}" | jq -r '.data.media_data.custom' | jq -r '.manifest_id') | |
watermark_signature=$(echo "${status_response}" | jq -r '.data.media_data.custom' | jq -r '.watermark_signature') | |
if [ -z "$manifest_id" ] || [ "$manifest_id" = "null" ]; then | |
debug_echo | |
debug_echo "No manifest_id" | |
else | |
debug_echo " --> media_id=${manifest_id}" | |
fi | |
debug_echo | |
debug_echo -n "Deleting uploaded media (${media_id}) from steg.ai... " | |
delete_result=$( | |
curl -s https://api.steg.ai/asset \ | |
-X DELETE \ | |
-H "x-api-key: ${STEG_AI_API_KEY}" \ | |
--data-raw '{ | |
"media_id" : "'${media_id}'" | |
}' | |
) | |
if [ -n "${TRUEPIC_DEBUG}" ]; then echo ${delete_result} | jq -r '.message'; fi | |
if [ -z "$manifest_id" ] || [ "$manifest_id" = "null" ]; then | |
echo "Contains C2PA manifest: ${c2pa_manifest_found}" | |
echo "Contains watermark: false" | |
echo "Original watermarked media: n/a" | |
exit 0 | |
fi | |
debug_echo | |
debug_echo -n "Downloading original watermarked media..." | |
original_info=$(curl -s https://api.steg.ai/asset?media_id=${original_id} -H "x-api-key: ${STEG_AI_API_KEY}") | |
original_url=$(echo ${original_info} | jq -r '.data[0].path') | |
downloaded_original=$(mktemp).${extension} | |
curl -s -o ${downloaded_original} ${original_url} | |
debug_echo " --> ${downloaded_original}" | |
debug_echo | |
debug_echo -n "Downloading new manifest..." | |
manifest_info=$(curl -s https://api.steg.ai/asset?media_id=${manifest_id} -H "x-api-key: ${STEG_AI_API_KEY}") | |
manifest_url=$(echo ${manifest_info} | jq -r '.data[0].path') | |
downloaded_manifest=$(mktemp).bin | |
curl -s -o ${downloaded_manifest} ${manifest_url} | |
debug_echo " --> ${downloaded_manifest}" | |
debug_echo | |
debug_echo -n "Inserting new manifest into media file..." | |
${TRUEPIC_CLI} manifest insert ${downloaded_manifest} ${downloaded_original} --output "${OUTPUT_FILE}" > /dev/null 2>&1 | |
debug_echo " --> ${OUTPUT_FILE}" | |
rm -f ${downloaded_original} | |
rm -f ${downloaded_manifest} | |
debug_echo | |
debug_echo "Checking the manifest." | |
verification_json=$(${TRUEPIC_CLI} verify "${OUTPUT_FILE}") | |
hash_status=$( | |
echo "${verification_json}" | \ | |
jq -r '.manifest_store[] | select(.is_active == true) | .assertions."c2pa.hash.data"[0].status' | |
) | |
if echo "${verification_json}" | jq -e '.manifest_store[0].assertions."c2pa.thumbnail.claim.jpeg"' >/dev/null; then | |
thumbnail_key="c2pa.thumbnail.claim.jpeg" | |
else | |
if echo "${verification_json}" | jq -e '.manifest_store[0].assertions."c2pa.thumbnail.claim.png"' >/dev/null; then | |
thumbnail_key="c2pa.thumbnail.claim.png" | |
else | |
echo "Couldn't find thumbnail assertion in the C2PA manifest." | |
exit 1 | |
fi | |
fi | |
thumbnail_hash=$( | |
echo "${verification_json}" | \ | |
jq -r '.manifest_store[0].assertions."'${thumbnail_key}'"[0].thumbnail_id' | |
) | |
timestamp=$( | |
echo "${verification_json}" | \ | |
jq -r '.manifest_store[0].trusted_timestamp.timestamp' | |
) | |
public_key=$( | |
echo "${verification_json}" | \ | |
jq -r '.manifest_store[0].certificate.cert_der' | \ | |
base64 -d | \ | |
openssl x509 -pubkey -noout | |
) | |
debug_echo -n "Checking watermark signature... ${thumbnail_hash}|${timestamp} ... ${watermark_signature} ..." | |
set +e | |
signature_verification=$( | |
openssl dgst -sha256 \ | |
-verify <(echo "${public_key}") \ | |
-signature <(echo "${watermark_signature}" | base64 -d) \ | |
<(echo "${thumbnail_hash}|${timestamp}") | |
) | |
set -e | |
if [ "${signature_verification}" != "Verified OK" ]; then | |
debug_echo " FAILED" | |
echo "Watermark signature verification failed" | |
exit 1 | |
fi | |
debug_echo " ${signature_verification}" | |
debug_echo -n "Checking image hash..." | |
if [ "$hash_status" = "VALID" ]; then | |
debug_echo " hashes match." | |
if [ -n "$TRUEPIC_DEBUG" ]; then echo "${verification_json}" | jq; fi | |
echo "Contains C2PA manifest: ${c2pa_manifest_found}" | |
echo "Contains watermark: true" | |
echo "Original watermarked media: ${OUTPUT_FILE}" | |
exit 0 | |
fi | |
debug_echo " hashes DON'T match!" | |
rm -f "${OUTPUT_FILE}" |