Skip to content

Commit

Permalink
⚓ scalping google ota for pif
Browse files Browse the repository at this point in the history
- Added new scalping feature which is able to retreive the required info from Google OTA in order to build any of the chosen beta for pif.json
- Better sleep conditions for volkeys
- Fixes for boolval function
  • Loading branch information
0x11DFE committed Nov 1, 2024
1 parent a7fd86c commit a46c9a7
Show file tree
Hide file tree
Showing 3 changed files with 157 additions and 27 deletions.
92 changes: 89 additions & 3 deletions magisk_module_files/action.sh
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,96 @@ PlayIntegrityFix() {
build_json "$PIF_LIST" >"$CWD_PIF"
;;
*)
ui_print " - Non BETA module detected, Downloading PIF.json in order to pass integrity…"
ui_print " - Non BETA module detected"
ui_print " - Do you wan't to download the PIF.json from GitHub? (chiteroman/PlayIntegrityFix)"

# Download the PIF.json file
download_file "https://raw.githubusercontent.com/chiteroman/PlayIntegrityFix/main/module/pif.json" "$CWD_PIF"
# Ask whether to download PIF.json from chiteroman's GitHub or build one yourself
volume_key_event_setval "DOWNLOAD_PIF_GITHUB" true false "DOWNLOAD_PIF_GITHUB"

# Either download the PIF.json from chiteroman's GitHub or build one yourself
if boolval "$DOWNLOAD_PIF_GITHUB"; then
download_file "https://raw.githubusercontent.com/chiteroman/PlayIntegrityFix/main/module/pif.json" "$CWD_PIF"
else
# Download Generic System Image (GSI) HTML
ui_print " - Scalping Google's latest Pixel Beta Release…"

# Download Generic System Image (GSI) HTML
download_file https://developer.android.com/topic/generic-system-image/releases DL_GSI_HTML

# Extract release date from the text closest to the "(Beta)" string and convert to YYYY-MM-DD format
RELEASE_DATE="$(date -D '%B %e, %Y' -d "$(grep -m1 -o 'Date:.*' DL_GSI_HTML | cut -d\ -f2-4)" '+%Y-%m-%d')"

# Extract the release version from the link closest to the "(Beta)" string
RELEASE_VERSION="$(awk '/\(Beta\)/ {flag=1} /versions/ && flag {print; flag=0}' DL_GSI_HTML | grep -o '/versions/[0-9]*' | sed 's/\/versions\///')"

# Extract the build ID from the text closest to the "(Beta)" string
ID="$(awk '/\(Beta\)/ {flag=1} /Build:/ && flag {print; flag=0}' DL_GSI_HTML | grep -o 'Build: [A-Z0-9.]*' | sed 's/Build: //')"

# Extract the incremental value (based on the ID)
INCREMENTAL="$(grep -o "$ID-[0-9]*-" DL_GSI_HTML | sed "s/$ID-//g" | sed 's/-//g' | head -n1)"

# Download the OTA Image Download page
download_file "https://developer.android.com/about/versions/$RELEASE_VERSION/download-ota" DL_OTA_HTML

# Build lists of supported models and products from the OTA Image Download page
MODEL_LIST="$(grep -A1 'tr id=' DL_OTA_HTML | grep '<td>' | sed -e 's/<[^>]*>//g' | sed 's/^[ \t]*//g' | tr -d '\r' | paste -sd, -)"
PRODUCT_LIST="$(grep -o 'ota/[^-]*' DL_OTA_HTML | sed 's/ota\///g' | paste -sd, -)"

# Create the custom list using awk for better handling of the comma-separated values
# model (product)
DEVICE_LIST="$(printf "%s\n%s" "$MODEL_LIST" "$PRODUCT_LIST" | awk -F, '
NR==1 {
split($0, models, ",")
n = NF
}
NR==2 {
split($0, products, ",")
for (i=1; i<=n; i++) {
if (models[i] != "" && products[i] != "") {
if (i > 1) printf "\n"
printf "%s (%s)", models[i], products[i]
}
}
}')"

# Show a list of device with proper format
ui_print " - Supported Devices:"
for i in $(seq 1 "$(echo "$DEVICE_LIST" | wc -l)"); do
echo " - $(echo "$DEVICE_LIST" | sed -n "${i}p")"
done

# Use volume key events to select a device by product name
volume_key_event_setoption "PRODUCT" "$(echo "$PRODUCT_LIST" | tr ',' ' ')" "SELECTED_PRODUCT"

# Get the device MODEL name from PRODUCT name, using DEVICE_LIST
SELECTED_MODEL=$(echo "$DEVICE_LIST" | grep "($SELECTED_PRODUCT)" | sed 's/ *(.*)//')

# Display the selected device
ui_print " - Selected: $SELECTED_MODEL ($SELECTED_PRODUCT)"

# Remove the beta (_*) from PRODUCT name
SELECTED_PRODUCT_NAME=${SELECTED_PRODUCT%_*}

# Build security patch from OTA release date
SECURITY_PATCH_DATE="${RELEASE_DATE%-*}"-05

# List of properties to include in the PIF.json file
PIF_LIST="MODEL MANUFACTURER DEVICE_INITIAL_SDK_INT FINGERPRINT SECURITY_PATCH"

# Build properties
MODEL="$SELECTED_MODEL"
MANUFACTURER="Google"
DEVICE_INITIAL_SDK_INT=$(grep_prop "ro.product.first_api_level" "$SYSPROP_CONTENT")
[ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(grep_prop "ro.product.build.version.sdk" "$SYSPROP_CONTENT")
FINGERPRINT="google/$SELECTED_PRODUCT/$SELECTED_PRODUCT_NAME:$RELEASE_VERSION/$ID/$INCREMENTAL:user/release-keys"
SECURITY_PATCH="$SECURITY_PATCH_DATE"

# Build the JSON object
build_json "$PIF_LIST" >"$CWD_PIF"

# Clean the downloaded files
rm -f DL_*_HTML
fi
;;
esac

Expand Down
2 changes: 1 addition & 1 deletion magisk_module_files/service.sh
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ EOF
echo "$function_map" | while IFS=: read -r safe_var prop_type comparison; do
eval "local safe_val=\$SAFE_$safe_var"

if boolval "$safe_val"; then
if ! boolval "$safe_val"; then
ui_print " - Safe Mode was manually disabled for \"SAFE_$safe_var\" !"
else
case "$prop_type" in
Expand Down
90 changes: 67 additions & 23 deletions magisk_module_files/util_functions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,25 +42,39 @@ grep_prop() {
# Usage: boolval "value" || echo $?
boolval() {
case "$(printf "%s" "${1:-}" | tr '[:upper:]' '[:lower:]')" in
1 | true | on | enabled) return 1 ;; # Truely
0 | false | off | disabled) return 0 ;; # Falsely
1 | true | on | enabled) return 0 ;; # Truely
0 | false | off | disabled) return 1 ;; # Falsely
*) return 0 ;; # Everything else
esac
}

# Function which checks if either it should download a file using curl or wget, then download the file
# Function to download a file using curl or wget with retry mechanism
download_file() {
url="$1"
file="$2"
retries=5

# Check whether curl or wget is available, then download the file
if command -v curl >/dev/null 2>&1; then
curl -sL -o "$file" "$url"
elif command -v wget >/dev/null 2>&1; then
wget -qO "$file" "$url"
else
abort " ! curl or wget not found, unable to download file"
fi
# Try download with either curl or wget
while [ $retries -gt 0 ]; do
if command -v curl >/dev/null 2>&1; then
if curl -sL --connect-timeout 10 -o "$file" "$url"; then
return 0
fi
elif command -v wget >/dev/null 2>&1; then
if wget -qO "$file" "$url" --timeout=10; then
return 0
fi
else
abort " ! curl or wget not found, unable to download file"
fi

retries=$((retries - 1))
[ $retries -gt 0 ] && sleep 5
done

# If we get here, all attempts failed
rm -f "$file"
abort " ! Download failed after $retries attempts"
}

# Function to handle volume key events and set variables.
Expand All @@ -75,7 +89,7 @@ volume_key_event_setval() {
echo " * [ VOL- ] = [ NO ] *"
echo " * [ POWR ] = [ CANCEL ] *"
echo " *********************************"
echo " * Chose your selection for \"$option_name\" !"
echo " * Choose your value for \"$option_name\" !"
echo " *********************************"

while :; do
Expand All @@ -94,6 +108,9 @@ volume_key_event_setval() {
elif echo "$keys" | grep -q 'POWER'; then
abort "Power key detected! Canceling…"
fi

# Wait some time before checking again
sleep 0.3
done
}

Expand All @@ -103,18 +120,27 @@ volume_key_event_setoption() {
options_list=$2 # Space-separated list of options
result_var=$3

# Shift to remove the first three arguments (option_name, options_list, result_var)
shift 1

echo " *********************************"
echo " * [ VOL+ ] = [ CONFIRM ] *"
echo " * [ VOL- ] = [ NEXT OPTION ] *"
echo " * [ POWR ] = [ CANCEL ] *"
echo " *********************************"
echo " * Choose your selection for \"$option_name\" !"
echo " * Choose your value for \"$option_name\" !"
echo " *********************************"

# Sanitize the options list
options_list=$(echo "$options_list" | tr -s ' ') # Ensure no extra spaces
set -- $options_list # This sets the options as positional parameters ($1, $2, ..., $N)
total_options=$# # Number of options
# Sanitize the options list (ensure no extra spaces)
options_list=$(echo "$options_list" | tr -s ' ')

# Store the original positional parameters in a temporary variable
original_options="$*"

# Set the options as positional parameters ($1, $2, ..., $N)
set -- $(echo "$options_list")

total_options=$# # Number of options

# If only one option is available, automatically select it
if [ "$total_options" -eq 1 ]; then
Expand All @@ -123,15 +149,21 @@ volume_key_event_setoption() {
fi

# Display the options once
for i in $(seq 1 $total_options); do
eval "option=\$$i" # Get the i-th positional parameter
ui_print " - [$i] $option"
done
# i=1
# while [ $# -gt 0 ]; do
# option="$1"
# ui_print " - [$i] $option"
# shift
# i=$((i + 1))
# done

selected_option=1

# Restore the original positional parameters
set -- $original_options

# Display the initially selected option
current_option=$(eval echo "\$$selected_option")
eval "current_option=\$${selected_option}"
ui_print " > $current_option"

# Loop to capture key events and update selection
Expand All @@ -150,10 +182,22 @@ volume_key_event_setoption() {
if [ "$selected_option" -gt "$total_options" ]; then
selected_option=1 # Wrap around to the first option
fi
current_option=$(eval echo "\$$selected_option")

# Use shift to get the selected option
set -- $original_options # Reset positional parameters
i=1
while [ $i -lt $selected_option ]; do
shift
i=$((i + 1))
done
current_option="$1"

ui_print " > $current_option"
elif echo "$keys" | grep -q 'POWER'; then
abort "Power key detected, Cancelling…"
fi

# Wait some time before checking again
sleep 0.3
done
}

0 comments on commit a46c9a7

Please sign in to comment.