Use new SHA1/MD5 hashes from CurseForge API

This commit is contained in:
comp500 2022-02-14 18:21:22 +00:00
parent 9585272311
commit 55ce2fb581
2 changed files with 46 additions and 10 deletions

View File

@ -179,16 +179,16 @@ func createModFile(modInfo modInfo, fileInfo modFileInfo, index *core.Index) err
return err return err
} }
hash, hashFormat := fileInfo.getBestHash()
modMeta := core.Mod{ modMeta := core.Mod{
Name: modInfo.Name, Name: modInfo.Name,
FileName: fileInfo.FileName, FileName: fileInfo.FileName,
Side: core.UniversalSide, Side: core.UniversalSide,
Download: core.ModDownload{ Download: core.ModDownload{
URL: u, URL: u,
// TODO: murmur2 hashing may be unstable in curse api, calculate the hash manually? HashFormat: hashFormat,
// TODO: check if the hash is invalid (e.g. 0) Hash: hash,
HashFormat: "murmur2",
Hash: strconv.Itoa(fileInfo.Fingerprint),
}, },
Update: updateMap, Update: updateMap,
} }
@ -421,12 +421,11 @@ func (u cfUpdater) DoUpdate(mods []*core.Mod, cachedState []interface{}) error {
v.FileName = fileInfoData.FileName v.FileName = fileInfoData.FileName
v.Name = modState.Name v.Name = modState.Name
hash, hashFormat := fileInfoData.getBestHash()
v.Download = core.ModDownload{ v.Download = core.ModDownload{
URL: u, URL: u,
// TODO: murmur2 hashing may be unstable in curse api, calculate the hash manually? HashFormat: hashFormat,
// TODO: check if the hash is invalid (e.g. 0) Hash: hash,
HashFormat: "murmur2",
Hash: strconv.Itoa(fileInfoData.Fingerprint),
} }
v.Update["curseforge"]["project-id"] = modState.ID v.Update["curseforge"]["project-id"] = modState.ID

View File

@ -124,6 +124,12 @@ const (
modloaderTypeFabric modloaderTypeFabric
) )
//noinspection GoUnusedConst
const (
hashAlgoSHA1 int = iota + 1
hashAlgoMD5
)
// modInfo is a subset of the deserialised JSON response from the Curse API for mods (addons) // modInfo is a subset of the deserialised JSON response from the Curse API for mods (addons)
type modInfo struct { type modInfo struct {
Name string `json:"name"` Name string `json:"name"`
@ -244,6 +250,37 @@ type modFileInfo struct {
ModID int `json:"addonId"` ModID int `json:"addonId"`
Type int `json:"type"` Type int `json:"type"`
} `json:"dependencies"` } `json:"dependencies"`
Hashes []struct {
Value string `json:"value"`
Algorithm int `json:"algorithm"`
} `json:"hashes"`
}
func (i modFileInfo) getBestHash() (hash string, hashFormat string) {
// TODO: check if the hash is invalid (e.g. 0)
hash = strconv.Itoa(i.Fingerprint)
hashFormat = "murmur2"
hashPreferred := 0
// Prefer SHA1, then MD5 if found:
if i.Hashes != nil {
for _, v := range i.Hashes {
if v.Algorithm == hashAlgoMD5 && hashPreferred < 1 {
hashPreferred = 1
hash = v.Value
hashFormat = "md5"
} else if v.Algorithm == hashAlgoSHA1 && hashPreferred < 2 {
hashPreferred = 2
hash = v.Value
hashFormat = "sha1"
}
}
}
return
} }
func getFileInfo(modID int, fileID int) (modFileInfo, error) { func getFileInfo(modID int, fileID int) (modFileInfo, error) {