@@ -23,7 +23,9 @@ type Server struct {
2323 store * store.Store
2424}
2525
26- func NewServer (store * store.Store ) (server * Server , err error ) {
26+ // NewServer set up HTTP API server instance
27+ // If authorization is passed, requires privileged operation callers to present Authorization header with this content.
28+ func NewServer (store * store.Store , authorization string ) (server * Server , err error ) {
2729 r := mux .NewRouter ()
2830
2931 server = & Server {
@@ -64,6 +66,11 @@ func NewServer(store *store.Store) (server *Server, err error) {
6466
6567 // GET /api/manifests
6668 r .HandleFunc ("/api/manifests" , func (w http.ResponseWriter , r * http.Request ) {
69+ if authorization != r .Header .Get ("Authorization" ) {
70+ http .Error (w , "Forbidden" , http .StatusForbidden )
71+ return
72+ }
73+
6774 var b []byte
6875 if strings .Contains (r .Header .Get ("Accept" ), "application/json" ) {
6976 w .Header ().Set ("Content-Type" , "applications/json" )
@@ -78,6 +85,11 @@ func NewServer(store *store.Store) (server *Server, err error) {
7885
7986 // GET /api/manifests/{id}
8087 r .HandleFunc ("/api/manifests/{id}" , func (w http.ResponseWriter , r * http.Request ) {
88+ if authorization != r .Header .Get ("Authorization" ) {
89+ http .Error (w , "Forbidden" , http .StatusForbidden )
90+ return
91+ }
92+
8193 vars := mux .Vars (r )
8294 m := store .Find (vars ["id" ])
8395 if m == nil {
@@ -98,6 +110,11 @@ func NewServer(store *store.Store) (server *Server, err error) {
98110
99111 // PUT /api/manifests/{id}
100112 r .HandleFunc ("/api/manifests/{id}" , func (w http.ResponseWriter , r * http.Request ) {
113+ if authorization != r .Header .Get ("Authorization" ) {
114+ http .Error (w , "Forbidden" , http .StatusForbidden )
115+ return
116+ }
117+
101118 buf , _ := ioutil .ReadAll (r .Body )
102119 var m manifest.Manifest
103120 if r .Header .Get ("Content-Type" ) == "application/json" {
@@ -119,6 +136,11 @@ func NewServer(store *store.Store) (server *Server, err error) {
119136
120137 // DELETE /api/manifests/{id}
121138 r .HandleFunc ("/api/manifests/{id}" , func (w http.ResponseWriter , r * http.Request ) {
139+ if authorization != r .Header .Get ("Authorization" ) {
140+ http .Error (w , "Forbidden" , http .StatusForbidden )
141+ return
142+ }
143+
122144 vars := mux .Vars (r )
123145 store .ForgetManifest (vars ["id" ])
124146
@@ -129,6 +151,10 @@ func NewServer(store *store.Store) (server *Server, err error) {
129151 r .HandleFunc ("/api/self/suspend-boot" , func (w http.ResponseWriter , r * http.Request ) {
130152 var ip net.IP
131153 if queryFirst (r , "spoof" ) != "" {
154+ if authorization != r .Header .Get ("Authorization" ) {
155+ http .Error (w , "Forbidden" , http .StatusForbidden )
156+ return
157+ }
132158 ip = net .ParseIP (queryFirst (r , "spoof" ))
133159 } else {
134160 host , _ , _ := net .SplitHostPort (r .RemoteAddr )
@@ -149,6 +175,10 @@ func NewServer(store *store.Store) (server *Server, err error) {
149175 r .HandleFunc ("/api/self/unsuspend-boot" , func (w http.ResponseWriter , r * http.Request ) {
150176 var ip net.IP
151177 if queryFirst (r , "spoof" ) != "" {
178+ if authorization != r .Header .Get ("Authorization" ) {
179+ http .Error (w , "Forbidden" , http .StatusForbidden )
180+ return
181+ }
152182 ip = net .ParseIP (queryFirst (r , "spoof" ))
153183 } else {
154184 host , _ , _ := net .SplitHostPort (r .RemoteAddr )
@@ -169,6 +199,10 @@ func NewServer(store *store.Store) (server *Server, err error) {
169199 r .HandleFunc ("/api/self/manifest" , func (w http.ResponseWriter , r * http.Request ) {
170200 var ip net.IP
171201 if queryFirst (r , "spoof" ) != "" {
202+ if authorization != r .Header .Get ("Authorization" ) {
203+ http .Error (w , "Forbidden" , http .StatusForbidden )
204+ return
205+ }
172206 ip = net .ParseIP (queryFirst (r , "spoof" ))
173207 } else {
174208 host , _ , _ := net .SplitHostPort (r .RemoteAddr )
@@ -199,6 +233,10 @@ func (server *Server) Serve(l net.Listener) error {
199233 return server .httpServer .Serve (l )
200234}
201235
236+ func (server * Server ) ServeTLS (l net.Listener , certFile string , keyFile string ) error {
237+ return server .httpServer .ServeTLS (l , certFile , keyFile )
238+ }
239+
202240func queryFirst (r * http.Request , k string ) string {
203241 keys , ok := r .URL .Query ()[k ]
204242 if ! ok || len (keys [0 ]) < 1 {
0 commit comments