GLEGram 12.5 — Initial public release

Based on Swiftgram 12.5 (Telegram iOS 12.5).
All GLEGram features ported and organized in GLEGram/ folder.

Features: Ghost Mode, Saved Deleted Messages, Content Protection Bypass,
Font Replacement, Fake Profile, Chat Export, Plugin System, and more.

See CHANGELOG_12.5.md for full details.
This commit is contained in:
Leeksov
2026-04-06 09:48:12 +03:00
commit 4647310322
39685 changed files with 11052678 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
#!/bin/zsh
# Продакшн-сборка GLEGram (IPA, release_arm64)
#
# Использование:
# ./scripts/buildprod.sh
# ./scripts/buildprod.sh --buildNumber 100002
# ./scripts/buildprod.sh --clean
#
# Требуется: build-system/ipa-build-configuration.json, build-system/real-codesigning
set -e
cd "$(dirname "$0")/.."
CACHE_DIR="${CACHE_DIR:-$HOME/telegram-bazel-cache}"
CONFIGURATION_PATH="build-system/ipa-build-configuration.json"
CODESIGNING_PATH="build-system/real-codesigning"
BUILD_NUMBER="${BUILD_NUMBER:-100005}"
CLEAN=0
while [ $# -gt 0 ]; do
case "$1" in
--buildNumber)
BUILD_NUMBER="$2"
shift 2
;;
--clean)
CLEAN=1
shift
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
if [ "$CLEAN" = 1 ]; then
echo "Cleaning build cache..."
[ -x "./build-input/bazel-8.4.2-darwin-arm64" ] && ./build-input/bazel-8.4.2-darwin-arm64 clean || bazel clean
fi
echo "Building GLEGram (release_arm64, buildNumber=$BUILD_NUMBER)..."
python3 build-system/Make/Make.py \
--cacheDir="$CACHE_DIR" \
build \
--configurationPath="$CONFIGURATION_PATH" \
--codesigningInformationPath="$CODESIGNING_PATH" \
--buildNumber="$BUILD_NUMBER" \
--target GLEGram \
--configuration=release_arm64
echo "Build complete."
+61
View File
@@ -0,0 +1,61 @@
#!/bin/zsh
# Сборка GLEGram для симулятора
#
# Использование:
# ./scripts/buildsim.sh # сборка для симулятора
# ./scripts/buildsim.sh --device # сборка для устройства
# ./scripts/buildsim.sh --clean # чистая сборка (если изменения не применяются)
# ./scripts/buildsim.sh --buildNumber 10004
# ./scripts/buildsim.sh --version 12.4
set -e
cd "$(dirname "$0")/.."
BAZEL="${BAZEL:-}"
[ -z "$BAZEL" ] && [ -x "./build-input/bazel-8.4.2-darwin-arm64" ] && BAZEL="./build-input/bazel-8.4.2-darwin-arm64"
BAZEL="${BAZEL:-bazel}"
BUILD_NUMBER="${BUILD_NUMBER:-10003}"
TELEGRAM_VERSION="${TELEGRAM_VERSION:-12.3}"
CPU="ios_sim_arm64"
CLEAN=0
while [ $# -gt 0 ]; do
case "$1" in
--device)
CPU="ios_arm64"
shift
;;
--clean)
CLEAN=1
shift
;;
--buildNumber)
BUILD_NUMBER="$2"
shift 2
;;
--version)
TELEGRAM_VERSION="$2"
shift 2
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
if [ "$CLEAN" = 1 ]; then
echo "Cleaning build cache..."
"$BAZEL" clean
fi
echo "Building GLEGram for simulator (cpu=$CPU, buildNumber=$BUILD_NUMBER, version=$TELEGRAM_VERSION)..."
"$BAZEL" build //Telegram:GLEGram \
--cpu="$CPU" \
--define=buildNumber="$BUILD_NUMBER" \
--define=telegramVersion="$TELEGRAM_VERSION" \
--//Telegram:disableProvisioningProfiles=True \
--verbose_failures
echo "Build complete."
+133
View File
@@ -0,0 +1,133 @@
#!/bin/zsh
# Конвертирует IPA в .xcarchive для загрузки через Xcode Organizer (Distribute App).
# Xcode Organizer показывает только archives — этот скрипт создаёт архив из IPA.
#
# Использование: ./scripts/ipa_to_xcarchive.sh [путь/к/GLEGram.ipa]
set -e
cd "$(dirname "$0")/.."
INPUT="${1:-}"
if [ -z "$INPUT" ]; then
# Ищем IPA в типичных местах
for p in "bazel-bin/Telegram/GLEGram.ipa" "bazel-bin/Telegram/GLEGram"*.ipa "build/artifacts/TestFlight/GLEGram.ipa" "$HOME/Downloads/GLEGram.ipa"; do
if [ -f "$p" ]; then
INPUT="$p"
break
fi
done
fi
if [ -z "$INPUT" ] || [ ! -f "$INPUT" ]; then
echo "Использование: $0 <путь/к/GLEGram.ipa>"
echo "IPA не найден. Укажите путь или соберите: ./scripts/build_testflight_distribution.sh"
exit 1
fi
WORK="/tmp/ipa_to_xcarchive_$$"
DIST_DIR="build/artifacts/TestFlight"
mkdir -p "$DIST_DIR"
echo "Создаю xcarchive из: $INPUT"
rm -rf "$WORK"
mkdir -p "$WORK"
# Распаковываем IPA
unzip -q "$INPUT" -d "$WORK/ipa"
APP_BUNDLE=$(ls -d "$WORK/ipa/Payload/"*.app 2>/dev/null | head -1)
if [ -z "$APP_BUNDLE" ] || [ ! -d "$APP_BUNDLE" ]; then
echo "Ошибка: не найден .app в IPA"
exit 1
fi
APP_NAME=$(basename "$APP_BUNDLE" .app)
ARCHIVE_DIR="$WORK/${APP_NAME}.xcarchive"
mkdir -p "$ARCHIVE_DIR/Products/Applications"
# Копируем .app в xcarchive
cp -R "$APP_BUNDLE" "$ARCHIVE_DIR/Products/Applications/"
# Читаем версию из Info.plist приложения
APP_PLIST="$ARCHIVE_DIR/Products/Applications/$APP_NAME.app/Info.plist"
VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$APP_PLIST" 2>/dev/null || echo "12.3")
BUILD=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$APP_PLIST" 2>/dev/null || echo "100001")
# Создаём Info.plist архива
cat > "$ARCHIVE_DIR/Info.plist" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ApplicationProperties</key>
<dict>
<key>ApplicationPath</key>
<string>Applications/$APP_NAME.app</string>
<key>CFBundleIdentifier</key>
<string>com.GLEProject.GLEGram</string>
<key>CFBundleShortVersionString</key>
<string>$VERSION</string>
<key>CFBundleVersion</key>
<string>$BUILD</string>
</dict>
<key>ArchiveVersion</key>
<integer>1</integer>
<key>CreationDate</key>
<date>$(date -u +%Y-%m-%dT%H:%M:%SZ)</date>
<key>Name</key>
<string>$APP_NAME</string>
<key>SchemeIdentifier</key>
<string>com.GLEProject.GLEGram</string>
</dict>
</plist>
EOF
# SwiftSupport — копируем libswift*.dylib из Xcode toolchain
XCODE_DEV=$(xcode-select -p 2>/dev/null)
SWIFT_SUPPORT_DIR="$ARCHIVE_DIR/SwiftSupport/iphoneos"
mkdir -p "$SWIFT_SUPPORT_DIR"
SWIFT_COUNT=0
for dylib in "$ARCHIVE_DIR/Products/Applications/$APP_NAME.app/Frameworks"/libswift*.dylib; do
[ -f "$dylib" ] || continue
DYLIB_NAME=$(basename "$dylib")
TOOLCHAIN_LIB=$(find "$XCODE_DEV/Toolchains" -path "*/iphoneos/$DYLIB_NAME" -not -path "*Simulator*" 2>/dev/null | head -1)
if [ -f "$TOOLCHAIN_LIB" ]; then
cp "$TOOLCHAIN_LIB" "$SWIFT_SUPPORT_DIR/"
SWIFT_COUNT=$((SWIFT_COUNT + 1))
echo "SwiftSupport: $DYLIB_NAME"
fi
done
if [ "$SWIFT_COUNT" -eq 0 ]; then
rm -rf "$ARCHIVE_DIR/SwiftSupport"
fi
# Копируем dSYMs если есть
DSYM_SRC="bazel-bin/Telegram"
if [ -d "$DSYM_SRC" ]; then
mkdir -p "$ARCHIVE_DIR/dSYMs"
for dsym in "$DSYM_SRC"/*.dSYM; do
[ -d "$dsym" ] && cp -R "$dsym" "$ARCHIVE_DIR/dSYMs/" && echo "dSYM: $(basename "$dsym")"
done
fi
# Копируем результат
ARCHIVE_DST="$DIST_DIR/${APP_NAME}_$(date +%Y%m%d_%H%M).xcarchive"
cp -R "$ARCHIVE_DIR" "$ARCHIVE_DST"
# Копируем в папку Xcode Archives — тогда архив появится в Organizer автоматически
XCODE_ARCHIVES="$HOME/Library/Developer/Xcode/Archives/$(date +%Y-%m-%d)"
mkdir -p "$XCODE_ARCHIVES"
XCODE_ARCHIVE_PATH="$XCODE_ARCHIVES/${APP_NAME}_$(date +%H%M).xcarchive"
cp -R "$ARCHIVE_DIR" "$XCODE_ARCHIVE_PATH"
echo "Скопировано в Xcode Archives: $XCODE_ARCHIVE_PATH"
rm -rf "$WORK"
echo ""
echo "=== Готово ==="
echo "Archive: $ARCHIVE_DST"
echo ""
echo "Для загрузки в TestFlight:"
echo " 1. Xcode → Window → Organizer (⌥⇧⌘O)"
echo " 2. Архив уже в папке Xcode — должен отображаться в списке"
echo " 3. Если нет: двойной клик по .xcarchive в Finder"
echo " 4. Выберите архив → Distribute App → App Store Connect"
echo ""
echo "Или Transporter (IPA напрямую): откройте Transporter → перетащите IPA"
+38
View File
@@ -0,0 +1,38 @@
from lldb_common import load_launch_info, load_bazel_info, run_command
import os
launch_info = load_launch_info()
bazel_info = load_bazel_info()
output_base = bazel_info["output_base"]
execution_root = bazel_info["execution_root"]
workspace_root = os.getcwd()
device_platform = launch_info["platform"]
device_udid = launch_info["udid"]
debug_pid = str(launch_info["pid"])
run_command(
f'platform settings -w "{execution_root}"',
)
run_command(
'settings append target.source-map "." "{}"'.format(workspace_root),
)
run_command(
'settings insert-before target.source-map 0 "./external/" '
f'"{output_base}/external/"',
)
run_command(
'settings set plugin.process.gdb-remote.packet-timeout 300',
)
if device_platform == "device":
run_command(f"device select {device_udid}")
else:
run_command(f"platform select {device_platform}")
run_command(f"platform connect {device_udid}")
if device_platform == "device":
run_command(f"device process attach --pid {debug_pid}")
else:
run_command(f"process attach --pid {debug_pid}")
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
source "scripts/lldb_build_common.sh"
run_bazel "build"
+32
View File
@@ -0,0 +1,32 @@
#!/bin/bash
# Stores common functionality for build and launch tasks.
set -e
export WORKSPACE_ROOT
WORKSPACE_ROOT=$(pwd)
BAZEL_CMD="./build-input/bazel-8.4.2-darwin-arm64"
export ADDITIONAL_FLAGS=()
TELEGRAM_VERSION=$(python3 -c "import json; print(json.load(open('${WORKSPACE_ROOT}/versions.json'))['app'])")
ADDITIONAL_FLAGS+=("--keep_going")
ADDITIONAL_FLAGS+=("--color=yes")
ADDITIONAL_FLAGS+=("--define=telegramVersion=${TELEGRAM_VERSION}")
ADDITIONAL_FLAGS+=("--define=buildNumber=100000")
if [ -n "${BAZEL_EXTRA_BUILD_FLAGS:-}" ]; then
ADDITIONAL_FLAGS+=("${BAZEL_EXTRA_BUILD_FLAGS[@]}")
fi
LAUNCH_ARGS_ARRAY=()
if [ -n "${BAZEL_LAUNCH_ARGS:-}" ]; then
read -ra LAUNCH_ARGS_ARRAY <<< "$BAZEL_LAUNCH_ARGS"
fi
function run_bazel() {
local command="$1"
${BAZEL_CMD} "${command}" "${BAZEL_LABEL_TO_RUN}" "${ADDITIONAL_FLAGS[@]}" ${LAUNCH_ARGS_ARRAY[@]:+-- "${LAUNCH_ARGS_ARRAY[@]}"}
}
+46
View File
@@ -0,0 +1,46 @@
"""Common utilities for LLDB scripts in the VSCode/Cursor debugging workflow."""
import json
import os
import pathlib
import sys
from typing import Any
import lldb
# These files are generated by the lldb_launch_and_debug.sh script.
LAUNCH_INFO_PATH = pathlib.Path(".bsp/skbsp_generated/lldb.json")
BAZEL_INFO_PATH = pathlib.Path(".bsp/skbsp_generated/bazel_info.json")
def _load_file(path: pathlib.Path) -> str:
if not path.exists():
print(f"File not found: {path}. Exiting.", file=sys.stderr, flush=True)
lldb.SBDebugger.Terminate()
os._exit(0)
return path.read_text()
def load_launch_info() -> dict[str, Any]:
return json.loads(_load_file(LAUNCH_INFO_PATH))
def load_bazel_info() -> dict[str, Any]:
return json.loads(_load_file(BAZEL_INFO_PATH))
def run_command(command: str) -> None:
print(f"(lldb) {command}", flush=True)
result = lldb.SBCommandReturnObject()
lldb.debugger.GetCommandInterpreter().HandleCommand(command, result)
if result.Succeeded():
output = result.GetOutput()
if output:
print(output, flush=True)
else:
output = result.GetError()
if output:
print(output, file=sys.stderr, flush=True)
msg = "Command failed. See above for any error messages."
raise RuntimeError(msg)
+11
View File
@@ -0,0 +1,11 @@
import os
import signal
from lldb_common import load_launch_info
launch_info = load_launch_info()
debug_pid = int(launch_info["pid"])
try:
os.kill(debug_pid, signal.SIGKILL)
except Exception:
pass
+47
View File
@@ -0,0 +1,47 @@
#!/bin/bash
source "scripts/lldb_build_common.sh"
echo "Starting launch task..."
function emit_launcher_error() {
echo "launcher_error in ${BASH_SOURCE[0]}: ${1}"
exit 1
}
SIMULATOR_INFO_FILE=${WORKSPACE_ROOT}/.bsp/skbsp_generated/simulator_info.txt
SIMULATOR_INFO=""
if [ -f "${SIMULATOR_INFO_FILE}" ]; then
SIMULATOR_INFO=$(cat "${SIMULATOR_INFO_FILE}")
echo "Will use simulator: ${SIMULATOR_INFO}"
else
emit_launcher_error "No simulator selected! You need to first run the 'Select Simulator for Apple Development' task before being able to run this script."
fi
LAUNCH_INFO_JSON=${WORKSPACE_ROOT}/.bsp/skbsp_generated/lldb.json
rm -f ${LAUNCH_INFO_JSON} || true
OUTPUT_BASE=$(${BAZEL_CMD} info output_base)
EXECUTION_ROOT=$(${BAZEL_CMD} info execution_root)
BAZEL_INFO_JSON=${WORKSPACE_ROOT}/.bsp/skbsp_generated/bazel_info.json
rm -f ${BAZEL_INFO_JSON} || true
mkdir -p ${WORKSPACE_ROOT}/.bsp/skbsp_generated
cat > ${BAZEL_INFO_JSON} <<EOF
{
"output_base": "${OUTPUT_BASE}",
"execution_root": "${EXECUTION_ROOT}"
}
EOF
ADDITIONAL_FLAGS+=("--remote_download_regex=.*\.indexstore/.*|.*\.(a|cfg|c|C|cc|cl|cpp|cu|cxx|c++|def|h|H|hh|hpp|hxx|h++|hmap|ilc|inc|inl|ipp|tcc|tlh|tli|tpp|m|modulemap|mm|pch|swift|swiftdoc|swiftmodule|swiftsourceinfo|yaml)$")
ADDITIONAL_FLAGS+=("--@build_bazel_rules_apple//apple/build_settings:ios_device=${SIMULATOR_INFO}")
RULES_XCODEPROJ_LLDBINIT_FILE=${HOME}/.lldbinit-rules_xcodeproj
if [ -f "${RULES_XCODEPROJ_LLDBINIT_FILE}" ]; then
echo "Removing rules_xcodeproj's lldbinit file..."
rm -f "${RULES_XCODEPROJ_LLDBINIT_FILE}" || true
fi
BAZEL_APPLE_PREFER_PERSISTENT_SIMS=1 \
BAZEL_APPLE_LAUNCH_INFO_PATH="${LAUNCH_INFO_JSON}" \
BAZEL_SIMCTL_LAUNCH_FLAGS="--wait-for-debugger --console-pty" \
run_bazel "run"