github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbnm/hostmanifest/whitelist.go (about)

     1  package hostmanifest
     2  
     3  import (
     4  	"encoding/json"
     5  	"os"
     6  	"path/filepath"
     7  )
     8  
     9  // whitelistPath is used for installing the whitelist as a JSON into a given
    10  // path on disk.
    11  type whitelistPath struct {
    12  	// Root is the path of the machine-global NativeMessage whitelists.
    13  	Root string
    14  	// Home is the path of the NativeMessage whitelists for regular users.
    15  	Home string
    16  }
    17  
    18  func (w *whitelistPath) path(u User, appID string) string {
    19  	if u.IsAdmin() {
    20  		return filepath.Join(u.PrefixPath(), w.Root, appID+".json")
    21  	}
    22  	return filepath.Join(u.PrefixPath(), w.Home, appID+".json")
    23  }
    24  
    25  func (w *whitelistPath) Install(u User, app AppManifest) error {
    26  	jsonPath := w.path(u, app.ID())
    27  	parentDir := filepath.Dir(jsonPath)
    28  
    29  	// Make the path if it doesn't exist
    30  	if err := os.MkdirAll(parentDir, os.ModePerm); err != nil {
    31  		return wrapWriteErr(err, parentDir)
    32  	}
    33  
    34  	// Write the file
    35  	fp, err := os.OpenFile(jsonPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
    36  	if err != nil {
    37  		return wrapWriteErr(err, jsonPath)
    38  	}
    39  	defer fp.Close()
    40  
    41  	encoder := json.NewEncoder(fp)
    42  	encoder.SetIndent("", "    ")
    43  	if err := encoder.Encode(&app); err != nil {
    44  		return err
    45  	}
    46  
    47  	return fp.Sync()
    48  }
    49  
    50  func (w *whitelistPath) Uninstall(u User, app AppManifest) error {
    51  	jsonPath := w.path(u, app.ID())
    52  	if err := os.Remove(jsonPath); err != nil && !os.IsNotExist(err) {
    53  		// We don't care if it doesn't exist, but other errors should escalate
    54  		return err
    55  	}
    56  	return nil
    57  }