aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-03-27 19:02:22 +0200
committerEelco Dolstra <edolstra@gmail.com>2018-05-30 13:29:50 +0200
commit1672bcd230447f1ce0c3291950bdd9a662cee974 (patch)
tree801f04697c490bd0d01382c4d2ee522179a5b9a3
parentc1d445ececa4ea17bd5b5bff3d5fb3515be723cb (diff)
Move evaluator-specific settings out of libstore
-rw-r--r--src/libexpr/eval.cc13
-rw-r--r--src/libexpr/eval.hh22
-rw-r--r--src/libexpr/primops.cc16
-rw-r--r--src/libexpr/primops/fetchGit.cc2
-rw-r--r--src/libexpr/primops/fetchMercurial.cc2
-rw-r--r--src/libstore/globals.hh16
-rw-r--r--src/nix/upgrade-nix.cc2
7 files changed, 42 insertions, 31 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 7c8978000..a3f411a5f 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -310,14 +310,14 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
static_assert(sizeof(Env) == 16, "environment must be 16 bytes");
/* Initialise the Nix expression search path. */
- if (!settings.pureEval) {
+ if (!evalSettings.pureEval) {
Strings paths = parseNixPath(getEnv("NIX_PATH", ""));
for (auto & i : _searchPath) addToSearchPath(i);
for (auto & i : paths) addToSearchPath(i);
}
addToSearchPath("nix=" + canonPath(settings.nixDataDir + "/nix/corepkgs", true));
- if (settings.restrictEval || settings.pureEval) {
+ if (evalSettings.restrictEval || evalSettings.pureEval) {
allowedPaths = PathSet();
for (auto & i : searchPath) {
@@ -387,13 +387,13 @@ Path EvalState::checkSourcePath(const Path & path_)
void EvalState::checkURI(const std::string & uri)
{
- if (!settings.restrictEval) return;
+ if (!evalSettings.restrictEval) return;
/* 'uri' should be equal to a prefix, or in a subdirectory of a
prefix. Thus, the prefix https://github.co does not permit
access to https://github.com. Note: this allows 'http://' and
'https://' as prefixes for any http/https URI. */
- for (auto & prefix : settings.allowedUris.get())
+ for (auto & prefix : evalSettings.allowedUris.get())
if (uri == prefix ||
(uri.size() > prefix.size()
&& prefix.size() > 0
@@ -1898,4 +1898,9 @@ std::ostream & operator << (std::ostream & str, const ExternalValueBase & v) {
}
+EvalSettings evalSettings;
+
+static GlobalConfig::Register r1(&evalSettings);
+
+
}
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 3725e45da..146f21255 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -5,6 +5,7 @@
#include "nixexpr.hh"
#include "symbol-table.hh"
#include "hash.hh"
+#include "config.hh"
#include <map>
#include <unordered_map>
@@ -320,4 +321,25 @@ struct InvalidPathError : EvalError
#endif
};
+struct EvalSettings : Config
+{
+ Setting<bool> enableNativeCode{this, false, "allow-unsafe-native-code-during-evaluation",
+ "Whether builtin functions that allow executing native code should be enabled."};
+
+ Setting<bool> restrictEval{this, false, "restrict-eval",
+ "Whether to restrict file system access to paths in $NIX_PATH, "
+ "and network access to the URI prefixes listed in 'allowed-uris'."};
+
+ Setting<bool> pureEval{this, false, "pure-eval",
+ "Whether to restrict file system and network access to files specified by cryptographic hash."};
+
+ Setting<bool> enableImportFromDerivation{this, true, "allow-import-from-derivation",
+ "Whether the evaluator allows importing the result of a derivation."};
+
+ Setting<Strings> allowedUris{this, {}, "allowed-uris",
+ "Prefixes of URIs that builtin functions such as fetchurl and fetchGit are allowed to fetch."};
+};
+
+extern EvalSettings evalSettings;
+
}
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 9dab8ecb0..3a6c4035b 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -73,7 +73,7 @@ void EvalState::realiseContext(const PathSet & context)
if (drvs.empty()) return;
- if (!settings.enableImportFromDerivation)
+ if (!evalSettings.enableImportFromDerivation)
throw EvalError(format("attempted to realize '%1%' during evaluation but 'allow-import-from-derivation' is false") % *(drvs.begin()));
/* For performance, prefetch all substitute info. */
@@ -464,7 +464,7 @@ static void prim_tryEval(EvalState & state, const Pos & pos, Value * * args, Val
static void prim_getEnv(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
string name = state.forceStringNoCtx(*args[0], pos);
- mkString(v, settings.restrictEval || settings.pureEval ? "" : getEnv(name));
+ mkString(v, evalSettings.restrictEval || evalSettings.pureEval ? "" : getEnv(name));
}
@@ -1031,7 +1031,7 @@ static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Valu
static void addPath(EvalState & state, const Pos & pos, const string & name, const Path & path_,
Value * filterFun, bool recursive, const Hash & expectedHash, Value & v)
{
- const auto path = settings.pureEval && expectedHash ?
+ const auto path = evalSettings.pureEval && expectedHash ?
path_ :
state.checkSourcePath(path_);
PathFilter filter = filterFun ? ([&](const Path & path) {
@@ -2056,7 +2056,7 @@ void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
state.checkURI(url);
- if (settings.pureEval && !expectedHash)
+ if (evalSettings.pureEval && !expectedHash)
throw Error("in pure evaluation mode, '%s' requires a 'sha256' argument", who);
Path res = getDownloader()->downloadCached(state.store, url, unpack, name, expectedHash);
@@ -2124,12 +2124,12 @@ void EvalState::createBaseEnv()
addConstant(name, v);
};
- if (!settings.pureEval) {
+ if (!evalSettings.pureEval) {
mkInt(v, time(0));
addConstant("__currentTime", v);
}
- if (!settings.pureEval) {
+ if (!evalSettings.pureEval) {
mkString(v, settings.thisSystem);
addConstant("__currentSystem", v);
}
@@ -2154,7 +2154,7 @@ void EvalState::createBaseEnv()
mkApp(v, *vScopedImport, *v2);
forceValue(v);
addConstant("import", v);
- if (settings.enableNativeCode) {
+ if (evalSettings.enableNativeCode) {
addPrimOp("__importNative", 2, prim_importNative);
addPrimOp("__exec", 1, prim_exec);
}
@@ -2181,7 +2181,7 @@ void EvalState::createBaseEnv()
// Paths
addPrimOp("__toPath", 1, prim_toPath);
- if (settings.pureEval)
+ if (evalSettings.pureEval)
addPurityError("__storePath");
else
addPrimOp("__storePath", 1, prim_storePath);
diff --git a/src/libexpr/primops/fetchGit.cc b/src/libexpr/primops/fetchGit.cc
index 8bb74dad6..7aa98e0bf 100644
--- a/src/libexpr/primops/fetchGit.cc
+++ b/src/libexpr/primops/fetchGit.cc
@@ -28,7 +28,7 @@ GitInfo exportGit(ref<Store> store, const std::string & uri,
std::experimental::optional<std::string> ref, std::string rev,
const std::string & name)
{
- if (settings.pureEval && rev == "")
+ if (evalSettings.pureEval && rev == "")
throw Error("in pure evaluation mode, 'fetchGit' requires a Git revision");
if (!ref && rev == "" && hasPrefix(uri, "/") && pathExists(uri + "/.git")) {
diff --git a/src/libexpr/primops/fetchMercurial.cc b/src/libexpr/primops/fetchMercurial.cc
index a75c5fc2d..9d35f6d0d 100644
--- a/src/libexpr/primops/fetchMercurial.cc
+++ b/src/libexpr/primops/fetchMercurial.cc
@@ -27,7 +27,7 @@ std::regex commitHashRegex("^[0-9a-fA-F]{40}$");
HgInfo exportMercurial(ref<Store> store, const std::string & uri,
std::string rev, const std::string & name)
{
- if (settings.pureEval && rev == "")
+ if (evalSettings.pureEval && rev == "")
throw Error("in pure evaluation mode, 'fetchMercurial' requires a Mercurial revision");
if (rev == "" && hasPrefix(uri, "/") && pathExists(uri + "/.hg")) {
diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh
index 881032cf6..f589078db 100644
--- a/src/libstore/globals.hh
+++ b/src/libstore/globals.hh
@@ -193,9 +193,6 @@ public:
Setting<bool> showTrace{this, false, "show-trace",
"Whether to show a stack trace on evaluation errors."};
- Setting<bool> enableNativeCode{this, false, "allow-unsafe-native-code-during-evaluation",
- "Whether builtin functions that allow executing native code should be enabled."};
-
Setting<SandboxMode> sandboxMode{this, smDisabled, "sandbox",
"Whether to enable sandboxed builds. Can be \"true\", \"false\" or \"relaxed\".",
{"build-use-chroot", "build-use-sandbox"}};
@@ -208,13 +205,6 @@ public:
"Additional paths to make available inside the build sandbox.",
{"build-extra-chroot-dirs", "build-extra-sandbox-paths"}};
- Setting<bool> restrictEval{this, false, "restrict-eval",
- "Whether to restrict file system access to paths in $NIX_PATH, "
- "and network access to the URI prefixes listed in 'allowed-uris'."};
-
- Setting<bool> pureEval{this, false, "pure-eval",
- "Whether to restrict file system and network access to files specified by cryptographic hash."};
-
Setting<size_t> buildRepeat{this, 0, "repeat",
"The number of times to repeat a build in order to verify determinism.",
{"build-repeat"}};
@@ -319,9 +309,6 @@ public:
/* Path to the SSL CA file used */
Path caFile;
- Setting<bool> enableImportFromDerivation{this, true, "allow-import-from-derivation",
- "Whether the evaluator allows importing the result of a derivation."};
-
#if __linux__
Setting<bool> filterSyscalls{this, true, "filter-syscalls",
"Whether to prevent certain dangerous system calls, such as "
@@ -343,9 +330,6 @@ public:
Setting<uint64_t> maxFree{this, std::numeric_limits<uint64_t>::max(), "max-free",
"Stop deleting garbage when free disk space is above the specified amount."};
- Setting<Strings> allowedUris{this, {}, "allowed-uris",
- "Prefixes of URIs that builtin functions such as fetchurl and fetchGit are allowed to fetch."};
-
Setting<Paths> pluginFiles{this, {}, "plugin-files",
"Plugins to dynamically load at nix initialization time."};
};
diff --git a/src/nix/upgrade-nix.cc b/src/nix/upgrade-nix.cc
index 758bbbc68..21892c31a 100644
--- a/src/nix/upgrade-nix.cc
+++ b/src/nix/upgrade-nix.cc
@@ -46,7 +46,7 @@ struct CmdUpgradeNix : StoreCommand
void run(ref<Store> store) override
{
- settings.pureEval = true;
+ evalSettings.pureEval = true;
if (profileDir == "")
profileDir = getProfileDir(store);