forked from micromdm/micromdm
/
upload_app.go
133 lines (114 loc) · 3.38 KB
/
upload_app.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package appstore
import (
"bytes"
"context"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"github.com/go-kit/kit/endpoint"
"github.com/pkg/errors"
"github.com/micromdm/micromdm/pkg/httputil"
)
func (svc *AppService) UploadApp(ctx context.Context, manifestName string, manifest io.Reader, pkgName string, pkg io.Reader) error {
if manifestName != "" {
if err := svc.store.SaveFile(manifestName, manifest); err != nil {
return err
}
}
if pkgName != "" {
if err := svc.store.SaveFile(pkgName, pkg); err != nil {
return err
}
}
return nil
}
type appUploadRequest struct {
ManifestName string
ManifestFile io.Reader
PKGFilename string
PKGFile io.Reader
}
type appUploadResponse struct {
Err error `json:"err,omitempty"`
}
func (r appUploadResponse) Failed() error { return r.Err }
func decodeAppUploadRequest(ctx context.Context, r *http.Request) (interface{}, error) {
defer r.Body.Close()
appManifestFilename := r.FormValue("app_manifest_filename")
manifestFile, _, err := r.FormFile("app_manifest_filedata")
if err != nil && err != http.ErrMissingFile {
return nil, errors.Wrap(err, "manifest file")
}
pkgFilename := r.FormValue("pkg_name")
pkgFile, _, err := r.FormFile("pkg_filedata")
if err != nil && err != http.ErrMissingFile {
return nil, err
}
return appUploadRequest{
ManifestName: appManifestFilename,
ManifestFile: manifestFile,
PKGFilename: pkgFilename,
PKGFile: pkgFile,
}, nil
}
func encodeUploadAppRequest(_ context.Context, r *http.Request, request interface{}) error {
req := request.(appUploadRequest)
body := new(bytes.Buffer)
writer := multipart.NewWriter(body)
if req.ManifestName != "" {
partManifest, err := writer.CreateFormFile("app_manifest_filedata", req.ManifestName)
if err != nil {
return err
}
_, err = io.Copy(partManifest, req.ManifestFile)
if err != nil {
return errors.Wrap(err, "copying appmanifest file to multipart writer")
}
writer.WriteField("app_manifest_filename", req.ManifestName)
}
if req.PKGFilename != "" {
partPkg, err := writer.CreateFormFile("pkg_filedata", req.PKGFilename)
if err != nil {
return err
}
_, err = io.Copy(partPkg, req.PKGFile)
if err != nil {
return errors.Wrap(err, "copying pkg file to multipart writer")
}
writer.WriteField("pkg_name", req.PKGFilename)
}
if err := writer.Close(); err != nil {
return errors.Wrap(err, "closing multipart writer")
}
r.Header.Set("Content-Type", writer.FormDataContentType())
r.Body = ioutil.NopCloser(body)
return nil
}
func decodeUploadAppResponse(_ context.Context, r *http.Response) (interface{}, error) {
var resp appUploadResponse
err := httputil.DecodeJSONResponse(r, &resp)
return resp, err
}
func MakeUploadAppEndpiont(svc Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(appUploadRequest)
err = svc.UploadApp(ctx, req.ManifestName, req.ManifestFile, req.PKGFilename, req.PKGFile)
return &appUploadResponse{
Err: err,
}, nil
}
}
func (e Endpoints) UploadApp(ctx context.Context, manifestName string, manifest io.Reader, pkgName string, pkg io.Reader) error {
request := appUploadRequest{
ManifestName: manifestName,
ManifestFile: manifest,
PKGFilename: pkgName,
PKGFile: pkg,
}
resp, err := e.AppUploadEndpoint(ctx, request)
if err != nil {
return err
}
return resp.(appUploadResponse).Err
}