2 * Copyright 2018 Intel Corporation, Inc
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 "github.com/gorilla/mux"
24 smsbackend "sms/backend"
27 // handler stores two interface implementations that implement
28 // the backend functionality
30 secretBackend smsbackend.SecretBackend
31 loginBackend smsbackend.LoginBackend
34 // createSecretDomainHandler creates a secret domain with a name provided
35 func (h handler) createSecretDomainHandler(w http.ResponseWriter, r *http.Request) {
36 var d smsbackend.SecretDomain
38 err := json.NewDecoder(r.Body).Decode(&d)
40 http.Error(w, err.Error(), http.StatusBadRequest)
44 dom, err := h.secretBackend.CreateSecretDomain(d.Name)
46 http.Error(w, err.Error(), http.StatusInternalServerError)
50 err = json.NewEncoder(w).Encode(dom)
52 http.Error(w, err.Error(), http.StatusInternalServerError)
56 w.WriteHeader(http.StatusCreated)
59 // deleteSecretDomainHandler deletes a secret domain with the name provided
60 func (h handler) deleteSecretDomainHandler(w http.ResponseWriter, r *http.Request) {
62 domName := vars["domName"]
64 err := h.secretBackend.DeleteSecretDomain(domName)
66 http.Error(w, err.Error(), http.StatusInternalServerError)
70 w.WriteHeader(http.StatusNoContent)
73 // createSecretHandler handles creation of secrets on a given domain name
74 func (h handler) createSecretHandler(w http.ResponseWriter, r *http.Request) {
75 // Get domain name from URL
77 domName := vars["domName"]
79 // Get secrets to be stored from body
80 var b smsbackend.Secret
81 err := json.NewDecoder(r.Body).Decode(&b)
83 http.Error(w, err.Error(), http.StatusBadRequest)
87 err = h.secretBackend.CreateSecret(domName, b)
89 http.Error(w, err.Error(), http.StatusInternalServerError)
93 w.WriteHeader(http.StatusCreated)
96 // getSecretHandler handles reading a secret by given domain name and secret name
97 func (h handler) getSecretHandler(w http.ResponseWriter, r *http.Request) {
99 domName := vars["domName"]
100 secName := vars["secretName"]
102 sec, err := h.secretBackend.GetSecret(domName, secName)
104 http.Error(w, err.Error(), http.StatusInternalServerError)
108 err = json.NewEncoder(w).Encode(sec)
110 http.Error(w, err.Error(), http.StatusInternalServerError)
115 // listSecretHandler handles listing all secrets under a particular domain name
116 func (h handler) listSecretHandler(w http.ResponseWriter, r *http.Request) {
118 domName := vars["domName"]
120 sec, err := h.secretBackend.ListSecret(domName)
122 http.Error(w, err.Error(), http.StatusInternalServerError)
126 err = json.NewEncoder(w).Encode(sec)
128 http.Error(w, err.Error(), http.StatusInternalServerError)
133 // deleteSecretHandler handles deleting a secret by given domain name and secret name
134 func (h handler) deleteSecretHandler(w http.ResponseWriter, r *http.Request) {
136 domName := vars["domName"]
137 secName := vars["secretName"]
139 err := h.secretBackend.DeleteSecret(domName, secName)
141 http.Error(w, err.Error(), http.StatusInternalServerError)
146 // struct that tracks various status items for SMS and backend
147 type backendStatus struct {
148 Seal bool `json:"sealstatus"`
151 // statusHandler returns information related to SMS and SMS backend services
152 func (h handler) statusHandler(w http.ResponseWriter, r *http.Request) {
153 s, err := h.secretBackend.GetStatus()
155 http.Error(w, err.Error(), http.StatusInternalServerError)
159 status := backendStatus{Seal: s}
160 err = json.NewEncoder(w).Encode(status)
162 http.Error(w, err.Error(), http.StatusInternalServerError)
167 // loginHandler handles login via password and username
168 func (h handler) loginHandler(w http.ResponseWriter, r *http.Request) {
173 func (h handler) initSMSHandler(w http.ResponseWriter, r *http.Request) {
178 func (h handler) unsealHandler(w http.ResponseWriter, r *http.Request) {
182 // CreateRouter returns an http.Handler for the registered URLs
183 // Takes an interface implementation as input
184 func CreateRouter(b smsbackend.SecretBackend) http.Handler {
185 h := handler{secretBackend: b}
187 // Create a new mux to handle URL endpoints
188 router := mux.NewRouter()
190 router.HandleFunc("/v1/sms/login", h.loginHandler).Methods("POST")
192 // Initialization APIs which will be used by quorum client
193 // to unseal and to provide root token to sms service
194 router.HandleFunc("/v1/sms/status", h.statusHandler).Methods("GET")
195 router.HandleFunc("/v1/sms/unseal", h.unsealHandler).Methods("POST")
196 router.HandleFunc("/v1/sms/init", h.initSMSHandler).Methods("POST")
198 router.HandleFunc("/v1/sms/domain", h.createSecretDomainHandler).Methods("POST")
199 router.HandleFunc("/v1/sms/domain/{domName}", h.deleteSecretDomainHandler).Methods("DELETE")
201 router.HandleFunc("/v1/sms/domain/{domName}/secret", h.createSecretHandler).Methods("POST")
202 router.HandleFunc("/v1/sms/domain/{domName}/secret", h.listSecretHandler).Methods("GET")
203 router.HandleFunc("/v1/sms/domain/{domName}/secret/{secretName}", h.getSecretHandler).Methods("GET")
204 router.HandleFunc("/v1/sms/domain/{domName}/secret/{secretName}", h.deleteSecretHandler).Methods("DELETE")