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.
22 "github.com/gorilla/mux"
25 smsbackend "sms/backend"
28 // handler stores two interface implementations that implement
29 // the backend functionality
31 secretBackend smsbackend.SecretBackend
32 loginBackend smsbackend.LoginBackend
35 // createSecretDomainHandler creates a secret domain with a name provided
36 func (h handler) createSecretDomainHandler(w http.ResponseWriter, r *http.Request) {
37 var d smsbackend.SecretDomain
39 err := json.NewDecoder(r.Body).Decode(&d)
41 http.Error(w, err.Error(), 400)
45 dom, err := h.secretBackend.CreateSecretDomain(d.Name)
47 http.Error(w, err.Error(), 500)
51 err = json.NewEncoder(w).Encode(dom)
53 http.Error(w, err.Error(), 400)
58 // getSecretDomainHandler returns list of secret domains
59 func (h handler) getSecretDomainHandler(w http.ResponseWriter, r *http.Request) {
61 domName := vars["domName"]
63 fmt.Fprintf(w, "Got req %s", domName)
64 //h.secretBackend.GetSecretDomain(domName)
65 //encode data into json and return
68 // deleteSecretDomainHandler deletes a secret domain with the name provided
69 func (h handler) deleteSecretDomainHandler(w http.ResponseWriter, r *http.Request) {
71 domName := vars["domName"]
73 h.secretBackend.DeleteSecretDomain(domName)
76 // createSecretHandler handles creation of secrets on a given domain name
77 func (h handler) createSecretHandler(w http.ResponseWriter, r *http.Request) {
78 // Get domain name from URL
80 domName := vars["domName"]
82 // Get secrets to be stored from body
83 var b smsbackend.Secret
84 err := json.NewDecoder(r.Body).Decode(&b)
86 http.Error(w, err.Error(), 400)
90 err = h.secretBackend.CreateSecret(domName, b)
92 http.Error(w, err.Error(), 500)
96 w.WriteHeader(http.StatusCreated)
99 // getSecretHandler handles reading a secret by given domain name and secret name
100 func (h handler) getSecretHandler(w http.ResponseWriter, r *http.Request) {
102 domName := vars["domName"]
103 secName := vars["secretName"]
105 sec, err := h.secretBackend.GetSecret(domName, secName)
107 http.Error(w, err.Error(), 500)
111 err = json.NewEncoder(w).Encode(sec)
113 http.Error(w, err.Error(), 400)
118 // deleteSecretHandler handles deleting a secret by given domain name and secret name
119 func (h handler) deleteSecretHandler(w http.ResponseWriter, r *http.Request) {
121 domName := vars["domName"]
122 secName := vars["secretName"]
124 err := h.secretBackend.DeleteSecret(domName, secName)
126 http.Error(w, err.Error(), http.StatusInternalServerError)
131 // struct that tracks various status items for SMS and backend
132 type backendStatus struct {
133 Seal bool `json:"sealstatus"`
136 // statusHandler returns information related to SMS and SMS backend services
137 func (h handler) statusHandler(w http.ResponseWriter, r *http.Request) {
138 s, err := h.secretBackend.GetStatus()
140 http.Error(w, err.Error(), 500)
144 status := backendStatus{Seal: s}
145 err = json.NewEncoder(w).Encode(status)
147 http.Error(w, err.Error(), 500)
152 // loginHandler handles login via password and username
153 func (h handler) loginHandler(w http.ResponseWriter, r *http.Request) {
158 func (h handler) initSMSHandler(w http.ResponseWriter, r *http.Request) {
163 func (h handler) unsealHandler(w http.ResponseWriter, r *http.Request) {
167 // CreateRouter returns an http.Handler for the registered URLs
168 // Takes an interface implementation as input
169 func CreateRouter(b smsbackend.SecretBackend) http.Handler {
170 h := handler{secretBackend: b}
172 // Create a new mux to handle URL endpoints
173 router := mux.NewRouter()
175 router.HandleFunc("/v1/sms/login", h.loginHandler).Methods("POST")
177 // Initialization APIs which will be used by quorum client
178 // to unseal and to provide root token to sms service
179 router.HandleFunc("/v1/sms/status", h.statusHandler).Methods("GET")
180 router.HandleFunc("/v1/sms/unseal", h.unsealHandler).Methods("POST")
181 router.HandleFunc("/v1/sms/init", h.initSMSHandler).Methods("POST")
183 router.HandleFunc("/v1/sms/domain", h.createSecretDomainHandler).Methods("POST")
184 router.HandleFunc("/v1/sms/domain/{domName}", h.getSecretDomainHandler).Methods("GET")
185 router.HandleFunc("/v1/sms/domain/{domName}", h.deleteSecretDomainHandler).Methods("DELETE")
187 router.HandleFunc("/v1/sms/domain/{domName}/secret", h.createSecretHandler).Methods("POST")
188 router.HandleFunc("/v1/sms/domain/{domName}/secret/{secretName}", h.getSecretHandler).Methods("GET")
189 router.HandleFunc("/v1/sms/domain/{domName}/secret/{secretName}", h.deleteSecretHandler).Methods("DELETE")