/
remove.go
83 lines (68 loc) · 1.65 KB
/
remove.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package remove
import (
"context"
"github.com/gogo/protobuf/proto"
"github.com/pkg/errors"
"github.com/micromdm/micromdm/mdm"
"github.com/micromdm/micromdm/platform/remove/internal/removeproto"
)
type Device struct {
UDID string `json:"udid"`
}
func MarshalDevice(dev *Device) ([]byte, error) {
protodev := removeproto.Device{
Udid: dev.UDID,
}
return proto.Marshal(&protodev)
}
func UnmarshalDevice(data []byte, dev *Device) error {
var pb removeproto.Device
if err := proto.Unmarshal(data, &pb); err != nil {
return errors.Wrap(err, "remove: unmarshal proto to device")
}
dev.UDID = pb.GetUdid()
return nil
}
func RemoveMiddleware(store Store) mdm.Middleware {
return func(next mdm.Service) mdm.Service {
return &removeMiddleware{
store: store,
next: next,
}
}
}
type removeMiddleware struct {
store Store
next mdm.Service
}
func (mw removeMiddleware) Acknowledge(ctx context.Context, req mdm.AcknowledgeEvent) ([]byte, error) {
udid := req.Response.UDID
_, err := mw.store.DeviceByUDID(udid)
if err != nil {
if !isNotFound(err) {
return nil, errors.Wrapf(err, "remove: get device by udid %s", udid)
}
}
if err == nil {
return nil, checkoutErr{}
}
return mw.next.Acknowledge(ctx, req)
}
func (mw removeMiddleware) Checkin(ctx context.Context, req mdm.CheckinEvent) error {
return mw.next.Checkin(ctx, req)
}
type checkoutErr struct{}
func (checkoutErr) Error() string {
return "checkout forced by device block"
}
func (checkoutErr) Checkout() bool {
return true
}
func isNotFound(err error) bool {
type notFoundError interface {
error
NotFound() bool
}
_, ok := errors.Cause(err).(notFoundError)
return ok
}