Files

115 lines
3.3 KiB
Go

// Package model contains the IPSW model for the database.
package model
import (
"errors"
"fmt"
"time"
"gorm.io/gorm"
)
var (
ErrNotFound = errors.New("not found")
ErrSymExists = errors.New("symbol exists")
)
// Platform represents supported Apple platforms
type Platform string
const (
PlatformIOS Platform = "iOS"
PlatformMacOS Platform = "macOS"
PlatformWatchOS Platform = "watchOS"
PlatformTvOS Platform = "tvOS"
PlatformVisionOS Platform = "visionOS"
)
// Ipsw is the model for an Ipsw file.
type Ipsw struct {
ID string `gorm:"primaryKey" json:"id"`
Name string `json:"name,omitempty"`
Version string `gorm:"index:idx_platform_version,priority:2" json:"version,omitempty"`
BuildID string `gorm:"column:buildid" json:"buildid,omitempty"`
Platform Platform `gorm:"type:varchar(20);index:idx_platform_version,priority:1" json:"platform,omitempty"`
Devices []*Device `gorm:"many2many:ipsw_devices;" json:"devices,omitempty"`
Kernels []*Kernelcache `gorm:"many2many:ipsw_kernels;" json:"kernels,omitempty"`
DSCs []*DyldSharedCache `gorm:"many2many:ipsw_dscs;" json:"dscs,omitempty"`
FileSystem []*Macho `gorm:"many2many:ipsw_files;" json:"file_system,omitempty"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
type Device struct {
Name string `gorm:"primaryKey" json:"name"`
}
// Kernelcache is the model for a kernelcache.
type Kernelcache struct {
UUID string `gorm:"primaryKey" json:"uuid"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"deleted_at"`
Version string `json:"version,omitempty"`
Kexts []*Macho `gorm:"many2many:kernelcache_kexts;" json:"kexts,omitempty"`
}
// DyldSharedCache is the model for a dyld_shared_cache.
type DyldSharedCache struct {
UUID string `gorm:"primaryKey" json:"uuid"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
SharedRegionStart uint64 `json:"shared_region_start,omitempty"`
Images []*Macho `gorm:"many2many:dsc_images;" json:"images,omitempty"`
}
type Path struct {
// swagger:ignore
ID uint `gorm:"primaryKey" json:"id"`
Path string `gorm:"uniqueIndex;not null" json:"path"`
}
type Macho struct {
UUID string `gorm:"primaryKey" json:"uuid"`
// swagger:ignore
PathID uint
Path Path `gorm:"foreignKey:PathID"`
TextStart uint64 `gorm:"type:bigint" json:"text_start,omitempty"`
TextEnd uint64 `gorm:"type:bigint" json:"text_end,omitempty"`
Symbols []*Symbol `gorm:"many2many:macho_syms;"`
}
func (m Macho) GetPath() string {
return m.Path.Path
}
type Name struct {
// swagger:ignore
ID uint `gorm:"primaryKey"`
Name string `gorm:"uniqueIndex" json:"name,omitempty"`
}
// swagger:model
type Symbol struct {
// swagger:ignore
ID uint `gorm:"primaryKey"`
// swagger:ignore
NameID uint
Name Name `gorm:"foreignKey:NameID"`
Start uint64 `gorm:"type:bigint" json:"start"`
End uint64 `gorm:"type:bigint" json:"end"`
}
func (s Symbol) GetName() string {
return s.Name.Name
}
func (s Symbol) String() string {
return fmt.Sprintf("%#x: %s", s.Start, s.Name.Name)
}