Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
110 lines
2.1 KiB
Go
110 lines
2.1 KiB
Go
package dal
|
|
|
|
import "sort"
|
|
|
|
type (
|
|
SensitivityLevel struct {
|
|
Handle string
|
|
ID uint64
|
|
Level int
|
|
}
|
|
SensitivityLevelSet []SensitivityLevel
|
|
|
|
sensitivityLevelIndex struct {
|
|
set SensitivityLevelSet
|
|
|
|
byHandle map[string]int
|
|
byID map[uint64]int
|
|
}
|
|
|
|
SensitivityLevelUsage struct {
|
|
connections []map[string]any
|
|
modules []map[string]any
|
|
fields []map[string]any
|
|
}
|
|
)
|
|
|
|
func SensitivityLevelIndex(levels ...SensitivityLevel) *sensitivityLevelIndex {
|
|
out := &sensitivityLevelIndex{
|
|
set: make(SensitivityLevelSet, len(levels)),
|
|
byHandle: make(map[string]int),
|
|
byID: make(map[uint64]int),
|
|
}
|
|
|
|
for i, l := range levels {
|
|
out.set[i] = l
|
|
out.byHandle[l.Handle] = i
|
|
out.byID[l.ID] = i
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
func (sli sensitivityLevelIndex) with(levels ...SensitivityLevel) *sensitivityLevelIndex {
|
|
slvls := append(sli.set, levels...)
|
|
sort.Sort(slvls)
|
|
|
|
return SensitivityLevelIndex(slvls...)
|
|
}
|
|
|
|
func (sli sensitivityLevelIndex) without(levels ...SensitivityLevel) *sensitivityLevelIndex {
|
|
nn := make(SensitivityLevelSet, 0, len(sli.set))
|
|
|
|
remIndex := SensitivityLevelIndex(levels...)
|
|
|
|
for _, existing := range sli.set {
|
|
if !remIndex.includes(existing.ID) {
|
|
nn = append(nn, existing)
|
|
}
|
|
}
|
|
|
|
sort.Sort(nn)
|
|
|
|
return SensitivityLevelIndex(nn...)
|
|
}
|
|
|
|
func (sli sensitivityLevelIndex) includes(l uint64) (ok bool) {
|
|
if l == 0 {
|
|
return true
|
|
}
|
|
|
|
if sli.byID == nil {
|
|
return false
|
|
}
|
|
|
|
_, ok = sli.byID[l]
|
|
return
|
|
}
|
|
|
|
func (sli sensitivityLevelIndex) isSubset(a, b uint64) (ok bool) {
|
|
// Edgecases
|
|
// If A is zero theneverything is possible
|
|
if a == 0 {
|
|
return true
|
|
}
|
|
// If B is zero, then A must also be zero
|
|
if b == 0 {
|
|
return a == 0
|
|
}
|
|
|
|
var lvlA, lvlB int
|
|
|
|
if lvlA, ok = sli.byID[a]; !ok {
|
|
return false
|
|
}
|
|
|
|
if lvlB, ok = sli.byID[b]; !ok {
|
|
return false
|
|
}
|
|
|
|
return lvlA <= lvlB
|
|
}
|
|
|
|
func (a SensitivityLevelSet) Len() int { return len(a) }
|
|
func (a SensitivityLevelSet) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
func (a SensitivityLevelSet) Less(i, j int) bool { return a[i].Level < a[j].Level }
|
|
|
|
func (u SensitivityLevelUsage) Empty() bool {
|
|
return len(u.connections)+len(u.fields)+len(u.modules) == 0
|
|
}
|