From 082535dbbd1ff4f7874f90f63da163220070e4cf Mon Sep 17 00:00:00 2001 From: Victor Vrantchan Date: Thu, 5 May 2016 19:10:55 -0400 Subject: [PATCH] small push service --- .docker/docker-compose-dev.yml | 1 + .gitignore | 3 ++ checkin/encode_decode.go | 5 +++ checkin/push/push.go | 68 ++++++++++++++++++++++++++++++++++ checkin/service.go | 24 ++++++++++-- compose-pg.yml | 6 +++ glide.lock | 16 +++++++- main.go | 3 ++ 8 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 checkin/push/push.go diff --git a/.docker/docker-compose-dev.yml b/.docker/docker-compose-dev.yml index 81bb9383..f7ae942c 100644 --- a/.docker/docker-compose-dev.yml +++ b/.docker/docker-compose-dev.yml @@ -60,3 +60,4 @@ data: - /certs.d - /pkgrepo - /profiles + - /mdmkeys diff --git a/.gitignore b/.gitignore index 930ec2ea..a4a7b71d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ vendor/ .docker/data/root/ micromdm .k8/ +*.crt +*.key +*.p12 diff --git a/checkin/encode_decode.go b/checkin/encode_decode.go index a63c01eb..a24affd0 100644 --- a/checkin/encode_decode.go +++ b/checkin/encode_decode.go @@ -28,18 +28,23 @@ func decodeMDMCheckinRequest(r *http.Request) (interface{}, error) { func decodeMDMEnrollmentRequest(r *http.Request) (interface{}, error) { data, err := ioutil.ReadAll(r.Body) if err != nil { + log.Println(err) return nil, err } + fmt.Println(string(data)) p7, err := pkcs7.Parse(data) if err != nil { + log.Println(err) return nil, err } // TODO: We should verify but not currently possible. Apple // does no provide a cert for the CA. var request depEnrollmentRequest if err := plist.Unmarshal(p7.Content, &request); err != nil { + log.Println(err) return nil, err } + fmt.Println(request) return request, nil } diff --git a/checkin/push/push.go b/checkin/push/push.go new file mode 100644 index 00000000..fe5bc455 --- /dev/null +++ b/checkin/push/push.go @@ -0,0 +1,68 @@ +package mdmpush + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/RobotsAndPencils/buford/certificate" + "github.com/RobotsAndPencils/buford/payload" + "github.com/RobotsAndPencils/buford/push" + "github.com/go-kit/kit/log" +) + +// Pusher pushes things +type Pusher interface { + Push(magic, token string) +} + +//New returns a Pusher +func New(logger log.Logger, certPath, password string) Pusher { + filename := certPath + cert, key, err := certificate.Load(filename, password) + if err != nil { + fmt.Println(err) + logger.Log("err", err) + } + client, err := push.NewClient(certificate.TLS(cert, key)) + if err != nil { + fmt.Println(err) + logger.Log("err", err) + } + service := &push.Service{ + Client: client, + Host: push.Production, + } + + pusher := pushSvc{ + client: service, + logger: logger, + } + + return pusher +} + +type pushSvc struct { + client *push.Service + logger log.Logger +} + +func (svc pushSvc) Push(magic, token string) { + svc.logger.Log("action", "push", "magic", magic, "token", token) + enc := token + + p := payload.MDM{Token: magic} + json.NewEncoder(os.Stdout).Encode(p) + valid := push.IsDeviceTokenValid(enc) + if !valid { + svc.logger.Log("err", "Invalid Token") + return + } + id, err := svc.client.Push(enc, nil, p) + if err != nil { + svc.logger.Log("err", err) + return + } + svc.logger.Log("action", "push", "magic", magic, "token", token, "id", id) + fmt.Println("success") +} diff --git a/checkin/service.go b/checkin/service.go index 0ba0a9ee..763c7f27 100644 --- a/checkin/service.go +++ b/checkin/service.go @@ -14,6 +14,7 @@ import ( httptransport "github.com/go-kit/kit/transport/http" "github.com/gorilla/mux" "github.com/micromdm/mdm" + "github.com/micromdm/micromdm/checkin/push" "github.com/micromdm/micromdm/device" stdprometheus "github.com/prometheus/client_golang/prometheus" ) @@ -40,7 +41,9 @@ func NewCheckinService(options ...func(*config) error) MDMCheckinService { } } var svc MDMCheckinService - svc = mdmCheckinService{conf.db} + // p := mdmpush.New(conf.logger, conf.pushcert, conf.pushpass) + // svc = mdmCheckinServie{pushsvc: p, db: conf.db} + svc = mdmCheckinService{db: conf.db} if conf.logger != nil { svc = loggingMiddleware{conf.logger, svc} } @@ -74,13 +77,25 @@ func Datastore(db device.Datastore) func(*config) error { } } +//Push creates a push client +func Push(cert, password string) func(*config) error { + return func(c *config) error { + c.pushcert = cert + c.pushpass = password + return nil + } +} + type config struct { - logger log.Logger - db device.Datastore + pushcert string //path to cert + pushpass string //password for cert + logger log.Logger + db device.Datastore } type mdmCheckinService struct { - db device.Datastore + pushsvc mdmpush.Pusher + db device.Datastore } func (svc mdmCheckinService) Authenticate(cmd mdm.CheckinCommand) error { @@ -114,6 +129,7 @@ func (svc mdmCheckinService) TokenUpdate(cmd mdm.CheckinCommand) error { if err != nil { return err } + // svc.pushsvc.Push(cmd.PushMagic, token) return nil } diff --git a/compose-pg.yml b/compose-pg.yml index f802bcb8..37d09779 100644 --- a/compose-pg.yml +++ b/compose-pg.yml @@ -1,3 +1,9 @@ +redis: + image: redis + restart: always + ports: + - "6379:6379" + postgres: image: postgres restart: always diff --git a/glide.lock b/glide.lock index c76fdc3e..3e21d41c 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ hash: 8fe304e9385e4fbe963eba356a9784b3217ae75b65f50178322a7e1e41950e8d -updated: 2016-05-03T12:33:50.516339682-04:00 +updated: 2016-05-05T14:49:55.86880083-04:00 imports: - name: github.com/beorn7/perks version: 3ac7bf7a47d159a033b107610db8a1b6575507a4 @@ -69,11 +69,25 @@ imports: - model - name: github.com/prometheus/procfs version: abf152e5f3e97f2fafac028d2cc06c1feb87ffa5 +- name: github.com/RobotsAndPencils/buford + version: 2861f2a5612806afe88232539f5e4255d39ae544 + subpackages: + - certificate + - payload + - push + - payload/badge - name: github.com/satori/go.uuid version: f9ab0dce87d815821e221626b772e3475a0d2749 +- name: golang.org/x/crypto + version: 019870fc9d457ee8abd13a2e93e3f2a3b55b7119 + subpackages: + - pkcs12 + - pkcs12/internal/rc2 - name: golang.org/x/net version: b797637b7aeeed133049c7281bfa31dcc9ca42d6 subpackages: - context - context/ctxhttp + - http2 + - http2/hpack devImports: [] diff --git a/main.go b/main.go index 77dc388e..d1e6646b 100644 --- a/main.go +++ b/main.go @@ -38,6 +38,8 @@ func main() { flPGconn = flag.String("postgres", envString("MICROMDM_POSTGRES_CONN_URL", ""), "postgres connection url") flRedisconn = flag.String("redis", envString("MICROMDM_REDIS_CONN_URL", ""), "redis connection url") flVersion = flag.Bool("version", false, "print version information") + flPushCert = flag.String("push-cert", envString("MICROMDM_PUSH_CERT", ""), "path to push certificate") + flPushPass = flag.String("push-pass", envString("MICROMDM_PUSH_PASS", ""), "push certificate password") ) // set tls to true by default. let user set it to false @@ -104,6 +106,7 @@ func main() { checkinSvc := checkin.NewCheckinService( checkin.Datastore(deviceDB), checkin.Logger(logger), + checkin.Push(*flPushCert, *flPushPass), ) checkinHandler := checkin.ServiceHandler(ctx, checkinSvc)