mirror of
https://github.com/NixOS/nix
synced 2025-07-07 01:51:47 +02:00
Apply makeNotAllowedError to empty repos
This commit is contained in:
parent
002faa3d1c
commit
fcddf4afe3
5 changed files with 21 additions and 16 deletions
|
@ -304,7 +304,7 @@ EvalState::EvalState(
|
||||||
|
|
||||||
/* Apply access control if needed. */
|
/* Apply access control if needed. */
|
||||||
if (settings.restrictEval || settings.pureEval)
|
if (settings.restrictEval || settings.pureEval)
|
||||||
accessor = AllowListSourceAccessor::create(accessor, {},
|
accessor = AllowListSourceAccessor::create(accessor, {}, {},
|
||||||
[&settings](const CanonPath & path) -> RestrictedPathError {
|
[&settings](const CanonPath & path) -> RestrictedPathError {
|
||||||
auto modeInformation = settings.pureEval
|
auto modeInformation = settings.pureEval
|
||||||
? "in pure evaluation mode (use '--impure' to override)"
|
? "in pure evaluation mode (use '--impure' to override)"
|
||||||
|
|
|
@ -58,18 +58,23 @@ void FilteringSourceAccessor::checkAccess(const CanonPath & path)
|
||||||
struct AllowListSourceAccessorImpl : AllowListSourceAccessor
|
struct AllowListSourceAccessorImpl : AllowListSourceAccessor
|
||||||
{
|
{
|
||||||
std::set<CanonPath> allowedPrefixes;
|
std::set<CanonPath> allowedPrefixes;
|
||||||
|
std::unordered_set<CanonPath> allowedPaths;
|
||||||
|
|
||||||
AllowListSourceAccessorImpl(
|
AllowListSourceAccessorImpl(
|
||||||
ref<SourceAccessor> next,
|
ref<SourceAccessor> next,
|
||||||
std::set<CanonPath> && allowedPrefixes,
|
std::set<CanonPath> && allowedPrefixes,
|
||||||
|
std::unordered_set<CanonPath> && allowedPaths,
|
||||||
MakeNotAllowedError && makeNotAllowedError)
|
MakeNotAllowedError && makeNotAllowedError)
|
||||||
: AllowListSourceAccessor(SourcePath(next), std::move(makeNotAllowedError))
|
: AllowListSourceAccessor(SourcePath(next), std::move(makeNotAllowedError))
|
||||||
, allowedPrefixes(std::move(allowedPrefixes))
|
, allowedPrefixes(std::move(allowedPrefixes))
|
||||||
|
, allowedPaths(std::move(allowedPaths))
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
bool isAllowed(const CanonPath & path) override
|
bool isAllowed(const CanonPath & path) override
|
||||||
{
|
{
|
||||||
return path.isAllowed(allowedPrefixes);
|
return
|
||||||
|
allowedPaths.contains(path)
|
||||||
|
|| path.isAllowed(allowedPrefixes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void allowPrefix(CanonPath prefix) override
|
void allowPrefix(CanonPath prefix) override
|
||||||
|
@ -81,9 +86,14 @@ struct AllowListSourceAccessorImpl : AllowListSourceAccessor
|
||||||
ref<AllowListSourceAccessor> AllowListSourceAccessor::create(
|
ref<AllowListSourceAccessor> AllowListSourceAccessor::create(
|
||||||
ref<SourceAccessor> next,
|
ref<SourceAccessor> next,
|
||||||
std::set<CanonPath> && allowedPrefixes,
|
std::set<CanonPath> && allowedPrefixes,
|
||||||
|
std::unordered_set<CanonPath> && allowedPaths,
|
||||||
MakeNotAllowedError && makeNotAllowedError)
|
MakeNotAllowedError && makeNotAllowedError)
|
||||||
{
|
{
|
||||||
return make_ref<AllowListSourceAccessorImpl>(next, std::move(allowedPrefixes), std::move(makeNotAllowedError));
|
return make_ref<AllowListSourceAccessorImpl>(
|
||||||
|
next,
|
||||||
|
std::move(allowedPrefixes),
|
||||||
|
std::move(allowedPaths),
|
||||||
|
std::move(makeNotAllowedError));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CachingFilteringSourceAccessor::isAllowed(const CanonPath & path)
|
bool CachingFilteringSourceAccessor::isAllowed(const CanonPath & path)
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include "source-path.hh"
|
#include "source-path.hh"
|
||||||
|
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,6 +72,7 @@ struct AllowListSourceAccessor : public FilteringSourceAccessor
|
||||||
static ref<AllowListSourceAccessor> create(
|
static ref<AllowListSourceAccessor> create(
|
||||||
ref<SourceAccessor> next,
|
ref<SourceAccessor> next,
|
||||||
std::set<CanonPath> && allowedPrefixes,
|
std::set<CanonPath> && allowedPrefixes,
|
||||||
|
std::unordered_set<CanonPath> && allowedPaths,
|
||||||
MakeNotAllowedError && makeNotAllowedError);
|
MakeNotAllowedError && makeNotAllowedError);
|
||||||
|
|
||||||
using FilteringSourceAccessor::FilteringSourceAccessor;
|
using FilteringSourceAccessor::FilteringSourceAccessor;
|
||||||
|
|
|
@ -1215,20 +1215,12 @@ ref<SourceAccessor> GitRepoImpl::getAccessor(
|
||||||
ref<SourceAccessor> GitRepoImpl::getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError makeNotAllowedError)
|
ref<SourceAccessor> GitRepoImpl::getAccessor(const WorkdirInfo & wd, bool exportIgnore, MakeNotAllowedError makeNotAllowedError)
|
||||||
{
|
{
|
||||||
auto self = ref<GitRepoImpl>(shared_from_this());
|
auto self = ref<GitRepoImpl>(shared_from_this());
|
||||||
/* In case of an empty workdir, return an empty in-memory tree. We
|
|
||||||
cannot use AllowListSourceAccessor because it would return an
|
|
||||||
error for the root (and we can't add the root to the allow-list
|
|
||||||
since that would allow access to all its children). */
|
|
||||||
ref<SourceAccessor> fileAccessor =
|
ref<SourceAccessor> fileAccessor =
|
||||||
wd.files.empty()
|
AllowListSourceAccessor::create(
|
||||||
? ({
|
|
||||||
auto empty = makeEmptySourceAccessor();
|
|
||||||
empty->setPathDisplay(path.string());
|
|
||||||
empty;
|
|
||||||
})
|
|
||||||
: AllowListSourceAccessor::create(
|
|
||||||
makeFSSourceAccessor(path),
|
makeFSSourceAccessor(path),
|
||||||
std::set<CanonPath> { wd.files },
|
std::set<CanonPath>{ wd.files },
|
||||||
|
// Always allow access to the root, but not its children.
|
||||||
|
std::unordered_set<CanonPath>{CanonPath::root},
|
||||||
std::move(makeNotAllowedError)).cast<SourceAccessor>();
|
std::move(makeNotAllowedError)).cast<SourceAccessor>();
|
||||||
if (exportIgnore)
|
if (exportIgnore)
|
||||||
fileAccessor = make_ref<GitExportIgnoreSourceAccessor>(self, fileAccessor, std::nullopt);
|
fileAccessor = make_ref<GitExportIgnoreSourceAccessor>(self, fileAccessor, std::nullopt);
|
||||||
|
|
|
@ -17,7 +17,7 @@ cat > "$repo/flake.nix" <<EOF
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
expectStderr 1 nix eval "$repo#x" | grepQuiet "error: path '$repo/flake.nix' does not exist"
|
expectStderr 1 nix eval "$repo#x" | grepQuiet "error: File 'flake.nix' in the repository \"$repo\" is not tracked by Git."
|
||||||
|
|
||||||
git -C "$repo" add flake.nix
|
git -C "$repo" add flake.nix
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue