blob: 219e773fe54ba46e9508c2fecd6b2b5ba4e82941 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package allowlist
import (
"bufio"
"io"
"log"
"strings"
)
// Allowlist is a generic allowlist for strings. Currently used to allow/disallow
// non-static packages from the /packages subdir
type Allowlist struct {
// Note to future maintainers:
// If you're going to do updates to this at runtime
// (i.e. after pkgfs startup when there's only one goroutine),
// you MUST mediate access to this map with a synchronization mechanism.
allowed map[string]struct{}
}
// LoadFrom takes a file in the form of an io.Reader and returns a built AllowList
func LoadFrom(f io.Reader) (*Allowlist, error) {
allowed := map[string]struct{}{}
reader := bufio.NewReader(f)
for {
l, err := reader.ReadString('\n')
l = strings.TrimSpace(l)
if err != nil {
if err == io.EOF {
if l == "" {
// We're done
break
} else {
// Keep going for one more record
}
} else {
log.Printf("pkgfs: couldn't parse allowlist file: %v", err)
return nil, err
}
}
if strings.HasPrefix(l, "#") || l == "" {
// This is a comment line in the allowlist
continue
}
allowed[l] = struct{}{}
}
return &Allowlist{allowed: allowed}, nil
}
// Contains returns whether an Allowlist contains a given string
func (a *Allowlist) Contains(entry string) bool {
_, found := a.allowed[entry]
return found
}