about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2016-11-09T17·45+0100
committerEelco Dolstra <edolstra@gmail.com>2016-11-09T17·45+0100
commit21c55ab3b54fc2db30ca53c572d24b38331f508c (patch)
tree9c70dbbdeb47dca6eb723f85631b000298abc09b
parenta83b10f84c403d0a38439ce0dd2ce8963cc58af7 (diff)
Implement backwards-compatible RemoteStore::addToStore()
The SSHStore PR adds this functionality to the daemon, but we have to
handle the case where the Nix daemon is 1.11.

Also, don't require signatures for trusted users. This restores 1.11
behaviour.

Fixes https://github.com/NixOS/hydra/issues/398.
-rw-r--r--release.nix3
-rw-r--r--src/libstore/remote-store.cc23
-rw-r--r--src/nix-daemon/nix-daemon.cc2
3 files changed, 25 insertions, 3 deletions
diff --git a/release.nix b/release.nix
index d236cdae9bf0..6b16bc718a31 100644
--- a/release.nix
+++ b/release.nix
@@ -25,7 +25,7 @@ let
 
         buildInputs =
           [ curl bison flex perl libxml2 libxslt bzip2 xz
-            pkgconfig sqlite libsodium
+            pkgconfig sqlite libsodium boehmgc
             docbook5 docbook5_xsl
             autoconf-archive
           ] ++ lib.optional (!lib.inNixShell) git;
@@ -34,6 +34,7 @@ let
           --with-dbi=${perlPackages.DBI}/${perl.libPrefix}
           --with-dbd-sqlite=${perlPackages.DBDSQLite}/${perl.libPrefix}
           --with-www-curl=${perlPackages.WWWCurl}/${perl.libPrefix}
+          --enable-gc
         '';
 
         postUnpack = ''
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 7a041c6e0ad5..a4bf7b587083 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -335,7 +335,28 @@ Path RemoteStore::queryPathFromHashPart(const string & hashPart)
 void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
     bool repair, bool dontCheckSigs, std::shared_ptr<FSAccessor> accessor)
 {
-    throw Error("RemoteStore::addToStore() not implemented");
+    auto conn(connections->get());
+    conn->to << wopImportPaths;
+
+    StringSink sink;
+    sink << 1 // == path follows
+        ;
+    assert(nar->size() % 8 == 0);
+    sink((unsigned char *) nar->data(), nar->size());
+    sink
+        << exportMagic
+        << info.path
+        << info.references
+        << info.deriver
+        << 0 // == no legacy signature
+        << 0 // == no path follows
+        ;
+
+    StringSource source(*sink.s);
+    conn->processStderr(0, &source);
+
+    auto importedPaths = readStorePaths<PathSet>(*this, conn->from);
+    assert(importedPaths.size() <= 1);
 }
 
 
diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc
index 41c847dad131..0e4bcb525a37 100644
--- a/src/nix-daemon/nix-daemon.cc
+++ b/src/nix-daemon/nix-daemon.cc
@@ -324,7 +324,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
     case wopImportPaths: {
         startWork();
         TunnelSource source(from);
-        Paths paths = store->importPaths(source, 0);
+        Paths paths = store->importPaths(source, 0, trusted);
         stopWork();
         to << paths;
         break;