From 38b2322798097a291c0e518b6e170b9825b9fdd1 Mon Sep 17 00:00:00 2001 From: Vivek Shah Date: Thu, 21 Sep 2023 22:06:26 +0530 Subject: [PATCH] #54: Add api to retrieve file metadata with list of decrypted DEKs by set of UUIDs. --- cmd/api/main.go | 48 ++++++++++++++++++++++++++++--- pkg/api/decrypted_deks_by_uuid.go | 43 +++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 pkg/api/decrypted_deks_by_uuid.go diff --git a/cmd/api/main.go b/cmd/api/main.go index e9d4a17..2367c5d 100644 --- a/cmd/api/main.go +++ b/cmd/api/main.go @@ -8,6 +8,7 @@ import ( "net/http" "os" "path/filepath" + "strings" "time" "github.com/encloud-tech/encloud/pkg/api" @@ -288,6 +289,38 @@ func UploadHandler(w http.ResponseWriter, r *http.Request) { json.NewEncoder(w).Encode(response) } +func RetrieveDecryptedDEKsHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusCreated) + + r.ParseForm() + uuid := r.FormValue("uuid") + kek := r.FormValue("kek") + privkey := r.FormValue("privkey") + + uuids := strings.Split(uuid, ",") + + var response types.ListContentResponse + fileList, err := api.RetrieveDecryptedDEKsWithFileMetadataByUUID(uuids, kek, privkey) + if err != nil { + response = types.ListContentResponse{ + Status: "fail", + StatusCode: http.StatusInternalServerError, + Message: err.Error(), + Data: types.FileData{}, + } + } else { + response = types.ListContentResponse{ + Status: "success", + StatusCode: http.StatusCreated, + Message: "Content retrieved successfully.", + Data: fileList, + } + } + + json.NewEncoder(w).Encode(response) +} + func main() { router := mux.NewRouter() router.HandleFunc("/", home) @@ -298,13 +331,20 @@ func main() { router.HandleFunc("/retrieve", RetrieveHandler).Methods("POST") router.HandleFunc("/share", ShareHandler).Methods("POST") router.HandleFunc("/shared", SharedHandler).Methods("POST") + router.HandleFunc("/decrypted-deks", RetrieveDecryptedDEKsHandler).Methods("POST") + port := ":9000" srv := &http.Server{ Handler: router, - Addr: "127.0.0.1:9000", + Addr: port, // Good practice to enforce timeouts for servers you create! - WriteTimeout: 60 * time.Second, - ReadTimeout: 60 * time.Second, + WriteTimeout: 30 * time.Second, + ReadTimeout: 30 * time.Second, + } + + log.Printf("Listening on Port: %s", port) + err := srv.ListenAndServe() + if err != nil { + log.Fatalf("Failed to start server: %v", err) } - log.Fatal(srv.ListenAndServe()) } diff --git a/pkg/api/decrypted_deks_by_uuid.go b/pkg/api/decrypted_deks_by_uuid.go new file mode 100644 index 0000000..bd6c464 --- /dev/null +++ b/pkg/api/decrypted_deks_by_uuid.go @@ -0,0 +1,43 @@ +package api + +import ( + "github.com/encloud-tech/encloud/pkg/service" + "github.com/encloud-tech/encloud/pkg/types" + thirdparty "github.com/encloud-tech/encloud/third_party" +) + +func RetrieveDecryptedDEKsWithFileMetadataByUUID(uuid []string, kek string, privateKey string) (types.FileData, error) { + cfg, err := Fetch() + if err != nil { + return types.FileData{}, err + } + + dbService := service.NewDB(cfg) + var fileList types.FileData + + for _, link := range uuid { + fileMetaData := dbService.FetchByCid(thirdparty.DigestString(kek) + ":" + link) + + var decryptedDek []byte + if fileMetaData.KekType == "rsa" { + rsaKey, err := thirdparty.DecryptWithRSA(fileMetaData.Dek, thirdparty.GetIdRsaFromStr(privateKey)) + if err != nil { + return types.FileData{}, err + } + decryptedDek = rsaKey + } else if fileMetaData.KekType == "ecies" { + rsaKey, err := thirdparty.DecryptWithEcies(thirdparty.NewPrivateKeyFromHex(privateKey), fileMetaData.Dek) + if err != nil { + return types.FileData{}, err + } + decryptedDek = rsaKey + } else { + return types.FileData{}, err + } + + fileMetaData.Dek = decryptedDek + fileList = append(fileList, fileMetaData) + } + + return fileList, nil +}