Add ed25519 public key and enhance package installation error handling

- Embed ed25519 public key for signature verification when doing sync prcess with servidordomal.fun
- Improve error handling in AddToInstalledDB to rollback on failure
- Update InstallPackage function to accept io.Reader instead of *os.File
This commit is contained in:
2025-09-20 21:55:34 -03:00
parent b14bd1806a
commit 68b394523d
4 changed files with 166 additions and 15 deletions

View File

@@ -0,0 +1 @@
<EFBFBD>ر<EFBFBD><EFBFBD>ֿ[<5B><><EFBFBD><EFBFBD>2<1D><><EFBFBD>t<EFBFBD>c<EFBFBD>^F<>\2<><32><EFBFBD>q<EFBFBD><71>

View File

@@ -2,13 +2,17 @@ package main
import ( import (
"bufio" "bufio"
"bytes"
"crypto/ed25519"
"database/sql" "database/sql"
_ "embed"
"fmt" "fmt"
"log" "log"
"os" "os"
"packets/configs" "packets/configs"
"packets/internal/consts" "packets/internal/consts"
"packets/internal/utils" "packets/internal/utils"
packets "packets/pkg"
"path/filepath" "path/filepath"
"github.com/pelletier/go-toml/v2" "github.com/pelletier/go-toml/v2"
@@ -16,6 +20,9 @@ import (
_ "modernc.org/sqlite" _ "modernc.org/sqlite"
) )
//go:embed ed25519public_key.pem
var publicKey []byte
// init is doing some verifications // init is doing some verifications
func init() { func init() {
@@ -37,7 +44,10 @@ func init() {
if err != nil { if err != nil {
if os.IsNotExist(err) { if os.IsNotExist(err) {
fmt.Println("index.db does not exist, try to use \"packets sync\"") if len(os.Args) > 1 && os.Args[0] != "sync" {
} else {
fmt.Println("index.db does not exist, try to use \"packets sync\"")
}
} else { } else {
log.Fatal(err) log.Fatal(err)
} }
@@ -51,7 +61,7 @@ func init() {
log.Fatal(db) log.Fatal(db)
} }
defer db.Close() defer db.Close()
db.Exec("CREATE TABLE IF NOT EXISTS packages (query_name TEXT NOT NULL,name TEXT NOT NULL UNIQUE PRIMARY KEY, version TEXT NOT NULL, dependencies TEXT NOT NULL DEFAULT '', description TEXT NOT NULL, family TEXT NOT NULL, serial INTEGER NOT NULL UNIQUE, package_d TEXT NOT NULL, filename TEXT NOT NULL, os TEXT NOT NULL, arch TEXT NOT NULL, in_cache INTEGER NOT NULL DEFAULT 1, serial INTEGER NOT NULL, image_url TEXT NOT NULL)") db.Exec("CREATE TABLE IF NOT EXISTS packages (query_name TEXT NOT NULL,name TEXT NOT NULL UNIQUE PRIMARY KEY, version TEXT NOT NULL, dependencies TEXT NOT NULL DEFAULT '', description TEXT NOT NULL, family TEXT NOT NULL, package_d TEXT NOT NULL, filename TEXT NOT NULL, os TEXT NOT NULL, arch TEXT NOT NULL, in_cache INTEGER NOT NULL DEFAULT 1, serial INTEGER NOT NULL)")
} else { } else {
log.Fatal(err) log.Fatal(err)
} }
@@ -87,10 +97,19 @@ var syncCmd = &cobra.Command{
Args: cobra.MaximumNArgs(1), Args: cobra.MaximumNArgs(1),
Short: "Syncronizes with an remote index.db, and check if the data dir is changed", Short: "Syncronizes with an remote index.db, and check if the data dir is changed",
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if os.Getuid() != 0 {
fmt.Println("please, run as root") _, err := os.Stat(consts.IndexDB)
return if err != nil {
if !os.IsNotExist(err) {
log.Fatal("index.db does not exist, try to use \"packets sync\"")
}
} }
f, err := os.OpenFile(consts.IndexDB, os.O_WRONLY, 0)
if err != nil {
log.Fatalf("can't open [ %s ]. Are you running packets as root?\n", consts.IndexDB)
}
f.Close()
syncUrl := consts.DefaultSyncUrl syncUrl := consts.DefaultSyncUrl
if len(args) > 0 { if len(args) > 0 {
syncUrl = args[0] syncUrl = args[0]
@@ -100,12 +119,27 @@ var syncCmd = &cobra.Command{
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
databaseSig, err := utils.GetFileHTTP(syncUrl + ".sig")
if err != nil {
log.Fatal(err)
}
if syncUrl == consts.DefaultSyncUrl {
if !ed25519.Verify(publicKey, DBB, databaseSig) {
log.Printf("Signature verification failed for the **MAIN** respository [ %s ], the index.db file may be compromised, do wish to continue? (y/N)\n", syncUrl)
fmt.Print(">> ")
var a string
fmt.Scanf("%s", &a)
if a != "y" && a != "Y" {
log.Fatalf("aborting, try googling to know about [ %s ]\n", syncUrl)
}
}
}
if err := os.WriteFile(consts.IndexDB, DBB, 0774); err != nil { if err := os.WriteFile(consts.IndexDB, DBB, 0774); err != nil {
log.Fatal(err) log.Fatal(err)
} }
fmt.Println("Sucessifully sync!") fmt.Printf(":: Sucessifully syncronized index.db with [ %s ]\n", syncUrl)
os.Exit(0) os.Exit(0)
}, },
} }
@@ -121,6 +155,19 @@ var installCmd = &cobra.Command{
Short: "Install a package", Short: "Install a package",
Args: cobra.MinimumNArgs(1), Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
_, err := os.Stat(consts.IndexDB)
if err != nil {
if !os.IsNotExist(err) {
log.Fatal("index.db does not exist, try to use \"packets sync\"")
}
}
f, err := os.OpenFile(consts.IndexDB, os.O_WRONLY, 0)
if err != nil {
log.Fatalf("can't open [ %s ]. Are you running packets as root?\n", consts.IndexDB)
}
f.Close()
db, err := sql.Open("sqlite", consts.IndexDB) db, err := sql.Open("sqlite", consts.IndexDB)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@@ -137,13 +184,44 @@ var installCmd = &cobra.Command{
} }
} }
if exist { if exist {
fmt.Printf(":: Downloading (%s) \n", inputName)
p, err := packets.GetPackage(inputName)
if err != nil {
log.Fatal(err)
}
cfg, err := configs.GetConfigTOML()
if err != nil {
log.Fatal(err)
}
reader := bytes.NewReader(p.PackageF)
fmt.Printf(":: Installing (%s) \n", inputName)
packets.InstallPackage(reader)
if cfg.Config.StorePackages {
pkgPath, err := p.Write()
if err != nil {
log.Fatal(err)
}
err = p.AddToInstalledDB(1, pkgPath)
if err != nil {
log.Fatal(err)
}
} else {
err := p.AddToInstalledDB(0, "")
if err != nil {
log.Fatal(err)
}
}
continue
} }
rows, err := db.Query("SELECT name, version, descriptionFROM packages WHERE query_name = ?", inputName) rows, err := db.Query("SELECT name, version, description FROM packages WHERE query_name = ?", inputName)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
defer rows.Close() defer rows.Close()
@@ -163,8 +241,37 @@ var installCmd = &cobra.Command{
case 1: case 1:
fmt.Printf(":: Founded 1 package for %s \n", inputName) fmt.Printf(":: Founded 1 package for %s \n", inputName)
fmt.Printf("Downloading %s \n", pkgs[0].Name) fmt.Printf(":: Downloading %s \n", pkgs[0].Name)
goto install p, err := packets.GetPackage(inputName)
if err != nil {
log.Fatal(err)
}
cfg, err := configs.GetConfigTOML()
if err != nil {
log.Fatal(err)
}
reader := bytes.NewReader(p.PackageF)
fmt.Printf(":: Installing (%s) \n", pkgs[0].Name)
packets.InstallPackage(reader)
if cfg.Config.StorePackages {
pkgPath, err := p.Write()
if err != nil {
log.Fatal(err)
}
err = p.AddToInstalledDB(1, pkgPath)
if err != nil {
log.Fatal(err)
}
} else {
err := p.AddToInstalledDB(0, "")
if err != nil {
log.Fatal(err)
}
}
continue
default: default:
@@ -181,10 +288,38 @@ var installCmd = &cobra.Command{
goto optionagain goto optionagain
} }
return fmt.Printf(":: Downloading %s \n", pkgs[choice].Name)
} p, err := packets.GetPackage(pkgs[choice].Name)
if err != nil {
log.Fatal(err)
}
install: cfg, err := configs.GetConfigTOML()
if err != nil {
log.Fatal(err)
}
reader := bytes.NewReader(p.PackageF)
fmt.Printf(":: Installing (%s) \n", pkgs[choice].Name)
packets.InstallPackage(reader)
if cfg.Config.StorePackages {
pkgPath, err := p.Write()
if err != nil {
log.Fatal(err)
}
err = p.AddToInstalledDB(1, pkgPath)
if err != nil {
log.Fatal(err)
}
} else {
err := p.AddToInstalledDB(0, "")
if err != nil {
log.Fatal(err)
}
}
continue
}
} }
}, },

View File

@@ -204,6 +204,17 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error {
} }
defer db.Close() defer db.Close()
var success bool
defer func() {
if !success {
_, err := db.Exec("DELETE FROM packages WHERE name = ?", p.Manifest.Info.Name)
if err != nil {
log.Println("Failed to rollback package addition:", err)
}
}
}()
_, err = db.Exec(` _, err = db.Exec(`
INSERT INTO packages ( INSERT INTO packages (
query_name, name, version, dependencies, description, query_name, name, version, dependencies, description,
@@ -222,5 +233,9 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error {
p.Arch, p.Arch,
inCache, inCache,
) )
if err != nil {
return err
}
success = true
return err return err
} }

View File

@@ -1,4 +1,4 @@
package pkg package packets
import ( import (
"archive/tar" "archive/tar"
@@ -23,7 +23,7 @@ import (
) )
// Install exctract and fully install from a package file ( tar.zst ) // Install exctract and fully install from a package file ( tar.zst )
func InstallPackage(file *os.File) error { func InstallPackage(file io.Reader) error {
manifest, err := utils.ReadManifest(file) manifest, err := utils.ReadManifest(file)
if err != nil { if err != nil {