48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
with import ./strings.nix;
 | 
						|
 | 
						|
/* Helpers for creating lisp S-exprs for the Apple sandbox
 | 
						|
 | 
						|
lib.sandbox.allowFileRead [ "/usr/bin/file" ];
 | 
						|
  # => "(allow file-read* (literal \"/usr/bin/file\"))";
 | 
						|
 | 
						|
lib.sandbox.allowFileRead {
 | 
						|
  literal = [ "/usr/bin/file" ];
 | 
						|
  subpath = [ "/usr/lib/system" ];
 | 
						|
}
 | 
						|
  # => "(allow file-read* (literal \"/usr/bin/file\") (subpath \"/usr/lib/system\"))"
 | 
						|
*/
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
sexp = tokens: "(" + builtins.concatStringsSep " " tokens + ")";
 | 
						|
generateFileList = files:
 | 
						|
  if builtins.isList files
 | 
						|
    then concatMapStringsSep " " (x: sexp [ "literal" ''"${x}"'' ]) files
 | 
						|
    else if builtins.isString files
 | 
						|
      then generateFileList [ files ]
 | 
						|
      else concatStringsSep " " (
 | 
						|
        (map (x: sexp [ "literal" ''"${x}"'' ]) (files.literal or [])) ++
 | 
						|
        (map (x: sexp [ "subpath" ''"${x}"'' ]) (files.subpath or []))
 | 
						|
      );
 | 
						|
applyToFiles = f: act: files: f "${act} ${generateFileList files}";
 | 
						|
genActions = actionName: let
 | 
						|
  action = feature: sexp [ actionName feature ];
 | 
						|
  self = {
 | 
						|
    "${actionName}" = action;
 | 
						|
    "${actionName}File" = applyToFiles action "file*";
 | 
						|
    "${actionName}FileRead" = applyToFiles action "file-read*";
 | 
						|
    "${actionName}FileReadMetadata" = applyToFiles action "file-read-metadata";
 | 
						|
    "${actionName}DirectoryList" = self."${actionName}FileReadMetadata";
 | 
						|
    "${actionName}FileWrite" = applyToFiles action "file-write*";
 | 
						|
    "${actionName}FileWriteMetadata" = applyToFiles action "file-write-metadata";
 | 
						|
  };
 | 
						|
  in self;
 | 
						|
 | 
						|
in
 | 
						|
 | 
						|
genActions "allow" // genActions "deny" // {
 | 
						|
  importProfile = derivation: ''
 | 
						|
    (import "${derivation}")
 | 
						|
  '';
 | 
						|
}
 |