service.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package trust
  2. import (
  3. "fmt"
  4. "time"
  5. log "github.com/Sirupsen/logrus"
  6. "github.com/docker/docker/engine"
  7. "github.com/docker/libtrust"
  8. )
  9. func (t *TrustStore) Install(eng *engine.Engine) error {
  10. for name, handler := range map[string]engine.Handler{
  11. "trust_key_check": t.CmdCheckKey,
  12. "trust_update_base": t.CmdUpdateBase,
  13. } {
  14. if err := eng.Register(name, handler); err != nil {
  15. return fmt.Errorf("Could not register %q: %v", name, err)
  16. }
  17. }
  18. return nil
  19. }
  20. func (t *TrustStore) CmdCheckKey(job *engine.Job) engine.Status {
  21. if n := len(job.Args); n != 1 {
  22. return job.Errorf("Usage: %s NAMESPACE", job.Name)
  23. }
  24. var (
  25. namespace = job.Args[0]
  26. keyBytes = job.Getenv("PublicKey")
  27. )
  28. if keyBytes == "" {
  29. return job.Errorf("Missing PublicKey")
  30. }
  31. pk, err := libtrust.UnmarshalPublicKeyJWK([]byte(keyBytes))
  32. if err != nil {
  33. return job.Errorf("Error unmarshalling public key: %s", err)
  34. }
  35. permission := uint16(job.GetenvInt("Permission"))
  36. if permission == 0 {
  37. permission = 0x03
  38. }
  39. t.RLock()
  40. defer t.RUnlock()
  41. if t.graph == nil {
  42. job.Stdout.Write([]byte("no graph"))
  43. return engine.StatusOK
  44. }
  45. // Check if any expired grants
  46. verified, err := t.graph.Verify(pk, namespace, permission)
  47. if err != nil {
  48. return job.Errorf("Error verifying key to namespace: %s", namespace)
  49. }
  50. if !verified {
  51. log.Debugf("Verification failed for %s using key %s", namespace, pk.KeyID())
  52. job.Stdout.Write([]byte("not verified"))
  53. } else if t.expiration.Before(time.Now()) {
  54. job.Stdout.Write([]byte("expired"))
  55. } else {
  56. job.Stdout.Write([]byte("verified"))
  57. }
  58. return engine.StatusOK
  59. }
  60. func (t *TrustStore) CmdUpdateBase(job *engine.Job) engine.Status {
  61. t.fetch()
  62. return engine.StatusOK
  63. }