mirror of
https://github.com/blacktop/ipsw.git
synced 2026-06-07 12:27:36 +00:00
56 lines
1.0 KiB
Go
56 lines
1.0 KiB
Go
package apps
|
|
|
|
import (
|
|
"archive/zip"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
|
|
"github.com/blacktop/go-plist"
|
|
)
|
|
|
|
var infoPlistName = regexp.MustCompile("Payload/[a-zA-Z0-9]+.app/Info.plist")
|
|
|
|
func AppBundleFromIPA(ipa string) (*AppBundle, error) {
|
|
ipaFile, err := zip.OpenReader(ipa)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer ipaFile.Close()
|
|
var infoPlistFile *zip.File
|
|
for _, f := range ipaFile.File {
|
|
if infoPlistName.MatchString(f.Name) {
|
|
infoPlistFile = f
|
|
break
|
|
}
|
|
}
|
|
r, err := infoPlistFile.Open()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer r.Close()
|
|
data, err := io.ReadAll(r)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
bundle := &AppBundle{}
|
|
if _, err := plist.Unmarshal(data, bundle); err != nil {
|
|
return nil, err
|
|
}
|
|
return bundle, err
|
|
}
|
|
|
|
func AppBundleFromAppBundle(appBundle string) (*AppBundle, error) {
|
|
f, err := os.Open(filepath.Join(appBundle, "Info.plist"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer f.Close()
|
|
bundle := &AppBundle{}
|
|
if err := plist.NewDecoder(f).Decode(bundle); err != nil {
|
|
return nil, err
|
|
}
|
|
return bundle, err
|
|
}
|