- ChatBubble: useActionSheet replaces custom Modal (native iOS popup, Android bottom sheet) - DM mode (isDM prop): hides like-count, shows Insta-style heart badge under bubble when liked - Group chat unchanged - Cleanup: remove unused Modal/Platform imports, sheet styles, actionsOpen state - deploy.sh: auto-detect ANDROID_HOME + auto-create local.properties for local Gradle - NEXT_RELEASE.md: DM reactions release note - Includes other staged work across binder-mac, marketing, ops/mdm, ios/
96 lines
3.0 KiB
Go
96 lines
3.0 KiB
Go
// Embedded template files für MobileBackup2 SendFiles.
|
|
//
|
|
// Diese Templates folgen Apple's Backup-Format-Schema. Sie wurden via
|
|
// Reverse-Engineering aus TechLockdown's Supervise-Tool als Format-
|
|
// Referenz extrahiert — die hier embedded Inhalte sind ReBreak's eigene
|
|
// Implementierung des gleichen Apple-public-Schemas.
|
|
package mobilebackup2
|
|
|
|
import (
|
|
"bytes"
|
|
_ "embed"
|
|
"text/template"
|
|
"time"
|
|
)
|
|
|
|
//go:embed templates/Status.plist.tmpl
|
|
var statusTmpl []byte
|
|
|
|
//go:embed templates/Manifest.plist.tmpl
|
|
var manifestTmpl []byte
|
|
|
|
//go:embed templates/Info.plist.tmpl
|
|
var infoTmpl []byte
|
|
|
|
//go:embed templates/TL_Manifest.db
|
|
var tlManifestDB []byte
|
|
|
|
//go:embed templates/TL_Status.plist
|
|
var tlStatusPlist []byte
|
|
|
|
//go:embed templates/TL_Manifest.plist
|
|
var tlManifestPlist []byte
|
|
|
|
// TLManifestDB returnt TL's exakte extracted Manifest.db (36864 bytes, 9 pages).
|
|
// Wird für Diagnostik-Tests genutzt: wenn iPhone mit unserer generated Manifest.db
|
|
// bail't aber mit TL's verbatim Restore-Mode triggert → Manifest.db-Generation
|
|
// ist die Wall. Erstmaliger Use: 2026-05-28 nach 2 failed MBFile-Patch-rev's.
|
|
func TLManifestDB() []byte {
|
|
return tlManifestDB
|
|
}
|
|
|
|
// TLStatusPlist returnt TL's extrahierte Status.plist (verbatim).
|
|
func TLStatusPlist() []byte {
|
|
return tlStatusPlist
|
|
}
|
|
|
|
// TLManifestPlist returnt TL's extrahierte Manifest.plist (verbatim).
|
|
func TLManifestPlist() []byte {
|
|
return tlManifestPlist
|
|
}
|
|
|
|
// TemplateVars sind die runtime-substituierten Werte.
|
|
type TemplateVars struct {
|
|
BackupUUID string // randomly generated UUID for this backup-session
|
|
BackupGUID string // randomly generated GUID for Info.plist
|
|
Date string // RFC3339 datetime (e.g. "2026-05-26T08:00:00Z")
|
|
BuildVersion string // from device.GetValue("BuildVersion")
|
|
ProductType string // e.g. "iPhone18,4"
|
|
ProductVersion string // e.g. "26.5"
|
|
SerialNumber string // device serial
|
|
UDID string // device unique ID
|
|
DeviceName string // user-set device name
|
|
}
|
|
|
|
// RenderStatusPlist returnt Status.plist mit aktuellen Vars als bytes.
|
|
func RenderStatusPlist(vars TemplateVars) ([]byte, error) {
|
|
return renderTemplate("Status.plist", string(statusTmpl), vars)
|
|
}
|
|
|
|
// RenderManifestPlist returnt Manifest.plist mit aktuellen Vars als bytes.
|
|
func RenderManifestPlist(vars TemplateVars) ([]byte, error) {
|
|
return renderTemplate("Manifest.plist", string(manifestTmpl), vars)
|
|
}
|
|
|
|
// RenderInfoPlist returnt Info.plist mit aktuellen Vars als bytes.
|
|
func RenderInfoPlist(vars TemplateVars) ([]byte, error) {
|
|
return renderTemplate("Info.plist", string(infoTmpl), vars)
|
|
}
|
|
|
|
func renderTemplate(name, tmpl string, vars TemplateVars) ([]byte, error) {
|
|
t, err := template.New(name).Parse(tmpl)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var buf bytes.Buffer
|
|
if err := t.Execute(&buf, vars); err != nil {
|
|
return nil, err
|
|
}
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
// FormatBackupDate — Apple verlangt UTC ohne sub-second precision.
|
|
func FormatBackupDate(t time.Time) string {
|
|
return t.UTC().Format("2006-01-02T15:04:05Z")
|
|
}
|