forked from lix-project/lix
Move ValidPathInfo
defintions to path-info.cc
Originally there was no `path-info.*`, then there was `path-info.hh`, then there was `path-info.cc`, but only for new things. Moving this stuff over makes everything consistent.
This commit is contained in:
parent
fec527bba1
commit
a416476217
|
@ -3,6 +3,80 @@
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
std::string ValidPathInfo::fingerprint(const Store & store) const
|
||||||
|
{
|
||||||
|
if (narSize == 0)
|
||||||
|
throw Error("cannot calculate fingerprint of path '%s' because its size is not known",
|
||||||
|
store.printStorePath(path));
|
||||||
|
return
|
||||||
|
"1;" + store.printStorePath(path) + ";"
|
||||||
|
+ narHash.to_string(Base32, true) + ";"
|
||||||
|
+ std::to_string(narSize) + ";"
|
||||||
|
+ concatStringsSep(",", store.printStorePathSet(references));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ValidPathInfo::sign(const Store & store, const SecretKey & secretKey)
|
||||||
|
{
|
||||||
|
sigs.insert(secretKey.signDetached(fingerprint(store)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ValidPathInfo::isContentAddressed(const Store & store) const
|
||||||
|
{
|
||||||
|
if (! ca) return false;
|
||||||
|
|
||||||
|
auto caPath = std::visit(overloaded {
|
||||||
|
[&](const TextHash & th) {
|
||||||
|
return store.makeTextPath(path.name(), th.hash, references);
|
||||||
|
},
|
||||||
|
[&](const FixedOutputHash & fsh) {
|
||||||
|
auto refs = references;
|
||||||
|
bool hasSelfReference = false;
|
||||||
|
if (refs.count(path)) {
|
||||||
|
hasSelfReference = true;
|
||||||
|
refs.erase(path);
|
||||||
|
}
|
||||||
|
return store.makeFixedOutputPath(fsh.method, fsh.hash, path.name(), refs, hasSelfReference);
|
||||||
|
}
|
||||||
|
}, *ca);
|
||||||
|
|
||||||
|
bool res = caPath == path;
|
||||||
|
|
||||||
|
if (!res)
|
||||||
|
printError("warning: path '%s' claims to be content-addressed but isn't", store.printStorePath(path));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
size_t ValidPathInfo::checkSignatures(const Store & store, const PublicKeys & publicKeys) const
|
||||||
|
{
|
||||||
|
if (isContentAddressed(store)) return maxSigs;
|
||||||
|
|
||||||
|
size_t good = 0;
|
||||||
|
for (auto & sig : sigs)
|
||||||
|
if (checkSignature(store, publicKeys, sig))
|
||||||
|
good++;
|
||||||
|
return good;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ValidPathInfo::checkSignature(const Store & store, const PublicKeys & publicKeys, const std::string & sig) const
|
||||||
|
{
|
||||||
|
return verifyDetached(fingerprint(store), sig, publicKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Strings ValidPathInfo::shortRefs() const
|
||||||
|
{
|
||||||
|
Strings refs;
|
||||||
|
for (auto & r : references)
|
||||||
|
refs.push_back(std::string(r.to_string()));
|
||||||
|
return refs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ValidPathInfo ValidPathInfo::read(Source & source, const Store & store, unsigned int format)
|
ValidPathInfo ValidPathInfo::read(Source & source, const Store & store, unsigned int format)
|
||||||
{
|
{
|
||||||
return read(source, store, format, store.parseStorePath(readString(source)));
|
return read(source, store, format, store.parseStorePath(readString(source)));
|
||||||
|
@ -24,6 +98,7 @@ ValidPathInfo ValidPathInfo::read(Source & source, const Store & store, unsigned
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ValidPathInfo::write(
|
void ValidPathInfo::write(
|
||||||
Sink & sink,
|
Sink & sink,
|
||||||
const Store & store,
|
const Store & store,
|
||||||
|
|
|
@ -1210,79 +1210,6 @@ std::string showPaths(const PathSet & paths)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string ValidPathInfo::fingerprint(const Store & store) const
|
|
||||||
{
|
|
||||||
if (narSize == 0)
|
|
||||||
throw Error("cannot calculate fingerprint of path '%s' because its size is not known",
|
|
||||||
store.printStorePath(path));
|
|
||||||
return
|
|
||||||
"1;" + store.printStorePath(path) + ";"
|
|
||||||
+ narHash.to_string(Base32, true) + ";"
|
|
||||||
+ std::to_string(narSize) + ";"
|
|
||||||
+ concatStringsSep(",", store.printStorePathSet(references));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ValidPathInfo::sign(const Store & store, const SecretKey & secretKey)
|
|
||||||
{
|
|
||||||
sigs.insert(secretKey.signDetached(fingerprint(store)));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ValidPathInfo::isContentAddressed(const Store & store) const
|
|
||||||
{
|
|
||||||
if (! ca) return false;
|
|
||||||
|
|
||||||
auto caPath = std::visit(overloaded {
|
|
||||||
[&](const TextHash & th) {
|
|
||||||
return store.makeTextPath(path.name(), th.hash, references);
|
|
||||||
},
|
|
||||||
[&](const FixedOutputHash & fsh) {
|
|
||||||
auto refs = references;
|
|
||||||
bool hasSelfReference = false;
|
|
||||||
if (refs.count(path)) {
|
|
||||||
hasSelfReference = true;
|
|
||||||
refs.erase(path);
|
|
||||||
}
|
|
||||||
return store.makeFixedOutputPath(fsh.method, fsh.hash, path.name(), refs, hasSelfReference);
|
|
||||||
}
|
|
||||||
}, *ca);
|
|
||||||
|
|
||||||
bool res = caPath == path;
|
|
||||||
|
|
||||||
if (!res)
|
|
||||||
printError("warning: path '%s' claims to be content-addressed but isn't", store.printStorePath(path));
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
size_t ValidPathInfo::checkSignatures(const Store & store, const PublicKeys & publicKeys) const
|
|
||||||
{
|
|
||||||
if (isContentAddressed(store)) return maxSigs;
|
|
||||||
|
|
||||||
size_t good = 0;
|
|
||||||
for (auto & sig : sigs)
|
|
||||||
if (checkSignature(store, publicKeys, sig))
|
|
||||||
good++;
|
|
||||||
return good;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool ValidPathInfo::checkSignature(const Store & store, const PublicKeys & publicKeys, const std::string & sig) const
|
|
||||||
{
|
|
||||||
return verifyDetached(fingerprint(store), sig, publicKeys);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Strings ValidPathInfo::shortRefs() const
|
|
||||||
{
|
|
||||||
Strings refs;
|
|
||||||
for (auto & r : references)
|
|
||||||
refs.push_back(std::string(r.to_string()));
|
|
||||||
return refs;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Derivation Store::derivationFromPath(const StorePath & drvPath)
|
Derivation Store::derivationFromPath(const StorePath & drvPath)
|
||||||
{
|
{
|
||||||
ensurePath(drvPath);
|
ensurePath(drvPath);
|
||||||
|
|
Loading…
Reference in a new issue