utils.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package execdriver
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/docker/docker/utils"
  6. "github.com/docker/libcontainer/security/capabilities"
  7. )
  8. func TweakCapabilities(basics, adds, drops []string) ([]string, error) {
  9. var (
  10. newCaps []string
  11. allCaps = capabilities.GetAllCapabilities()
  12. )
  13. // look for invalid cap in the drop list
  14. for _, cap := range drops {
  15. if strings.ToLower(cap) == "all" {
  16. continue
  17. }
  18. if !utils.StringsContainsNoCase(allCaps, cap) {
  19. return nil, fmt.Errorf("Unknown capability drop: %q", cap)
  20. }
  21. }
  22. // handle --cap-add=all
  23. if utils.StringsContainsNoCase(adds, "all") {
  24. basics = capabilities.GetAllCapabilities()
  25. }
  26. if !utils.StringsContainsNoCase(drops, "all") {
  27. for _, cap := range basics {
  28. // skip `all` aready handled above
  29. if strings.ToLower(cap) == "all" {
  30. continue
  31. }
  32. // if we don't drop `all`, add back all the non-dropped caps
  33. if !utils.StringsContainsNoCase(drops, cap) {
  34. newCaps = append(newCaps, strings.ToUpper(cap))
  35. }
  36. }
  37. }
  38. for _, cap := range adds {
  39. // skip `all` aready handled above
  40. if strings.ToLower(cap) == "all" {
  41. continue
  42. }
  43. if !utils.StringsContainsNoCase(allCaps, cap) {
  44. return nil, fmt.Errorf("Unknown capability to add: %q", cap)
  45. }
  46. // add cap if not already in the list
  47. if !utils.StringsContainsNoCase(newCaps, cap) {
  48. newCaps = append(newCaps, strings.ToUpper(cap))
  49. }
  50. }
  51. return newCaps, nil
  52. }