mirror of
https://github.com/gocsaf/csaf.git
synced 2025-12-22 11:55:40 +01:00
Factored out transaction, renamed dir to files.
This commit is contained in:
parent
5a350f2044
commit
05475f5509
3 changed files with 142 additions and 131 deletions
|
|
@ -241,60 +241,62 @@ func (c *controller) upload(rw http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := c.doTransaction(t, func(folder string, pmd *csaf.ProviderMetadata) error {
|
if err := doTransaction(
|
||||||
|
c.cfg, t,
|
||||||
|
func(folder string, pmd *csaf.ProviderMetadata) error {
|
||||||
|
|
||||||
year := strconv.Itoa(ex.currentReleaseDate.Year())
|
year := strconv.Itoa(ex.currentReleaseDate.Year())
|
||||||
|
|
||||||
subDir := filepath.Join(folder, year)
|
subDir := filepath.Join(folder, year)
|
||||||
|
|
||||||
// Create folder if it does not exists.
|
// Create folder if it does not exists.
|
||||||
if _, err := os.Stat(subDir); err != nil {
|
if _, err := os.Stat(subDir); err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
if err := os.Mkdir(subDir, 0755); err != nil {
|
if err := os.Mkdir(subDir, 0755); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
fname := filepath.Join(subDir, newCSAF)
|
||||||
|
|
||||||
|
// Write the file itself.
|
||||||
|
if err := ioutil.WriteFile(fname, data, 0644); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fname := filepath.Join(subDir, newCSAF)
|
// Write SHA256 sum.
|
||||||
|
if err := writeHash(fname+".sha256", newCSAF, sha256.New(), data); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Write the file itself.
|
// Write SHA512 sum.
|
||||||
if err := ioutil.WriteFile(fname, data, 0644); err != nil {
|
if err := writeHash(fname+".sha512", newCSAF, sha512.New(), data); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write SHA256 sum.
|
// Write signature.
|
||||||
if err := writeHash(fname+".sha256", newCSAF, sha256.New(), data); err != nil {
|
if err := ioutil.WriteFile(fname+".asc", []byte(armored), 0644); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write SHA512 sum.
|
if err := updateIndices(
|
||||||
if err := writeHash(fname+".sha512", newCSAF, sha512.New(), data); err != nil {
|
folder, filepath.Join(year, newCSAF),
|
||||||
return err
|
ex.currentReleaseDate,
|
||||||
}
|
); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// Write signature.
|
// Take over publisher
|
||||||
if err := ioutil.WriteFile(fname+".asc", []byte(armored), 0644); err != nil {
|
// TODO: Check for conflicts.
|
||||||
return err
|
pmd.Publisher = ex.publisher
|
||||||
}
|
|
||||||
|
|
||||||
if err := updateIndices(
|
pmd.SetPGP(fingerprint, c.cfg.GetPGPURL(fingerprint))
|
||||||
folder, filepath.Join(year, newCSAF),
|
|
||||||
ex.currentReleaseDate,
|
|
||||||
); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Take over publisher
|
return nil
|
||||||
// TODO: Check for conflicts.
|
}); err != nil {
|
||||||
pmd.Publisher = ex.publisher
|
|
||||||
|
|
||||||
pmd.SetPGP(fingerprint, c.cfg.GetPGPURL(fingerprint))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}); err != nil {
|
|
||||||
c.failed(rw, "upload.html", err)
|
c.failed(rw, "upload.html", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -306,94 +308,3 @@ func (c *controller) upload(rw http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
c.render(rw, "upload.html", result)
|
c.render(rw, "upload.html", result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *controller) doTransaction(
|
|
||||||
t tlp,
|
|
||||||
fn func(string, *csaf.ProviderMetadata) error,
|
|
||||||
) error {
|
|
||||||
|
|
||||||
wellknown := filepath.Join(c.cfg.Web, ".well-known", "csaf")
|
|
||||||
|
|
||||||
metadata := filepath.Join(wellknown, "provider-metadata.json")
|
|
||||||
|
|
||||||
pmd, err := func() (*csaf.ProviderMetadata, error) {
|
|
||||||
f, err := os.Open(metadata)
|
|
||||||
if err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return csaf.NewProviderMetadata(
|
|
||||||
c.cfg.Domain + "/.wellknown/csaf/provider-metadata.json"), nil
|
|
||||||
}
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
return csaf.LoadProviderMetadata(f)
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
webTLP := filepath.Join(wellknown, string(t))
|
|
||||||
|
|
||||||
oldDir, err := filepath.EvalSymlinks(webTLP)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
folderTLP := filepath.Join(c.cfg.Folder, string(t))
|
|
||||||
|
|
||||||
newDir, err := mkUniqDir(folderTLP)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy old content into new.
|
|
||||||
if err := deepCopy(newDir, oldDir); err != nil {
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Work with new folder.
|
|
||||||
if err := fn(newDir, pmd); err != nil {
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write back provider metadata.
|
|
||||||
newMetaName, newMetaFile, err := mkUniqFile(metadata)
|
|
||||||
if err != nil {
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := pmd.Save(newMetaFile); err != nil {
|
|
||||||
newMetaFile.Close()
|
|
||||||
os.Remove(newMetaName)
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := newMetaFile.Close(); err != nil {
|
|
||||||
os.Remove(newMetaName)
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.Rename(newMetaName, metadata); err != nil {
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch directories.
|
|
||||||
symlink := filepath.Join(newDir, string(t))
|
|
||||||
if err := os.Symlink(newDir, symlink); err != nil {
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := os.Rename(symlink, webTLP); err != nil {
|
|
||||||
os.RemoveAll(newDir)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return os.RemoveAll(oldDir)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
100
cmd/csaf_provider/transaction.go
Normal file
100
cmd/csaf_provider/transaction.go
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/Intevation/csaf_trusted/csaf"
|
||||||
|
)
|
||||||
|
|
||||||
|
func doTransaction(
|
||||||
|
cfg *config,
|
||||||
|
t tlp,
|
||||||
|
fn func(string, *csaf.ProviderMetadata) error,
|
||||||
|
) error {
|
||||||
|
|
||||||
|
wellknown := filepath.Join(cfg.Web, ".well-known", "csaf")
|
||||||
|
|
||||||
|
metadata := filepath.Join(wellknown, "provider-metadata.json")
|
||||||
|
|
||||||
|
pmd, err := func() (*csaf.ProviderMetadata, error) {
|
||||||
|
f, err := os.Open(metadata)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return csaf.NewProviderMetadata(
|
||||||
|
cfg.Domain + "/.wellknown/csaf/provider-metadata.json"), nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
return csaf.LoadProviderMetadata(f)
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
webTLP := filepath.Join(wellknown, string(t))
|
||||||
|
|
||||||
|
oldDir, err := filepath.EvalSymlinks(webTLP)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
folderTLP := filepath.Join(cfg.Folder, string(t))
|
||||||
|
|
||||||
|
newDir, err := mkUniqDir(folderTLP)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy old content into new.
|
||||||
|
if err := deepCopy(newDir, oldDir); err != nil {
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Work with new folder.
|
||||||
|
if err := fn(newDir, pmd); err != nil {
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write back provider metadata.
|
||||||
|
newMetaName, newMetaFile, err := mkUniqFile(metadata)
|
||||||
|
if err != nil {
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := pmd.Save(newMetaFile); err != nil {
|
||||||
|
newMetaFile.Close()
|
||||||
|
os.Remove(newMetaName)
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := newMetaFile.Close(); err != nil {
|
||||||
|
os.Remove(newMetaName)
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.Rename(newMetaName, metadata); err != nil {
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Switch directories.
|
||||||
|
symlink := filepath.Join(newDir, string(t))
|
||||||
|
if err := os.Symlink(newDir, symlink); err != nil {
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := os.Rename(symlink, webTLP); err != nil {
|
||||||
|
os.RemoveAll(newDir)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return os.RemoveAll(oldDir)
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue