* `nix-store --import' now also works in remote mode. The worker
always requires a signature on the archive. This is to ensure that unprivileged users cannot add Trojan horses to the Nix store.
This commit is contained in:
		
							parent
							
								
									0f5da8a83c
								
							
						
					
					
						commit
						bdadb98de8
					
				
					 4 changed files with 62 additions and 9 deletions
				
			
		|  | @ -187,12 +187,37 @@ struct TunnelSink : Sink | |||
|     virtual void operator () | ||||
|         (const unsigned char * data, unsigned int len) | ||||
|     { | ||||
|         writeInt(STDERR_DATA, to); | ||||
|         writeInt(STDERR_WRITE, to); | ||||
|         writeString(string((const char *) data, len), to); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| struct TunnelSource : Source | ||||
| { | ||||
|     Source & from; | ||||
|     TunnelSource(Source & from) : from(from) | ||||
|     { | ||||
|     } | ||||
|     virtual void operator () | ||||
|         (unsigned char * data, unsigned int len) | ||||
|     { | ||||
|         /* Careful: we're going to receive data from the client now,
 | ||||
|            so we have to disable the SIGPOLL handler. */ | ||||
|         setSigPollAction(false); | ||||
|         canSendStderr = false; | ||||
|          | ||||
|         writeInt(STDERR_READ, to); | ||||
|         writeInt(len, to); | ||||
|         string s = readString(from); | ||||
|         if (s.size() != len) throw Error("not enough data"); | ||||
|         memcpy(data, (const unsigned char *) s.c_str(), len); | ||||
| 
 | ||||
|         startWork(); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static void performOp(Source & from, Sink & to, unsigned int op) | ||||
| { | ||||
|     switch (op) { | ||||
|  | @ -289,6 +314,15 @@ static void performOp(Source & from, Sink & to, unsigned int op) | |||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     case wopImportPath: { | ||||
|         startWork(); | ||||
|         TunnelSource source(from); | ||||
|         Path path = store->importPath(true, source); | ||||
|         stopWork(); | ||||
|         writeString(path, to); | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     case wopBuildDerivations: { | ||||
|         PathSet drvs = readStorePaths(from); | ||||
|         startWork(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue