diff --git a/net/server/internal/adminLogin.go b/net/server/internal/adminLogin.go new file mode 100644 index 00000000..3b0b8a8d --- /dev/null +++ b/net/server/internal/adminLogin.go @@ -0,0 +1,34 @@ +package databag + +import ( + "net/http" + "golang.org/x/crypto/bcrypt" +) + +func adminLogin(r *http.Request) bool { + + // extract request auth + username, password, ok := r.BasicAuth(); + if !ok || username == "" || password == "" { + return false + } + + // nothing to do if not configured + if !getBoolConfigValue(CONFIG_CONFIGURED, false) { + return false; + } + + // compare username + if getStrConfigValue(CONFIG_USERNAME, "") != username { + return false + } + + // compare password + p := getBinConfigValue(CONFIG_PASSWORD, nil); + if bcrypt.CompareHashAndPassword(p, []byte(password)) != nil { + return false + } + + return true; +} + diff --git a/net/server/internal/api_admin.go b/net/server/internal/api_admin.go index 37277ba1..6f929e67 100644 --- a/net/server/internal/api_admin.go +++ b/net/server/internal/api_admin.go @@ -10,41 +10,9 @@ package databag import ( - "log" - "encoding/json" "net/http" - "gorm.io/gorm" - "golang.org/x/crypto/bcrypt" - "databag/internal/store" ) -func adminLogin(r *http.Request) bool { - - // extract request auth - username, password, ok := r.BasicAuth(); - if !ok || username == "" || password == "" { - return false - } - - // nothing to do if not configured - if !getBoolConfigValue(CONFIG_CONFIGURED, false) { - return false; - } - - // compare username - if getStrConfigValue(CONFIG_USERNAME, "") != username { - return false - } - - // compare password - p := getBinConfigValue(CONFIG_PASSWORD, nil); - if bcrypt.CompareHashAndPassword(p, []byte(password)) != nil { - return false - } - - return true; -} - func GetNodeAccountImage(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) @@ -55,42 +23,6 @@ func GetNodeAccounts(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } -func GetNodeClaimable(w http.ResponseWriter, r *http.Request) { - - c := getBoolConfigValue(CONFIG_CONFIGURED, false); - body, err := json.Marshal(!c); - if err != nil { - log.Println("GetNodeClaimable - failed to marshal response"); - } - w.Write(body); - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) -} - -func GetNodeConfig(w http.ResponseWriter, r *http.Request) { - - // validate login - if !adminLogin(r) { - log.Printf("SetNodeConfig - invalid admin credentials"); - w.WriteHeader(http.StatusUnauthorized); - return - } - - // get node config fields - var config NodeConfig; - config.Domain = getStrConfigValue(CONFIG_DOMAIN, ""); - config.PublicLimit = getNumConfigValue(CONFIG_PUBLICLIMIT, 0); - config.AccountStorage = getNumConfigValue(CONFIG_STORAGE, 0); - - body, err := json.Marshal(config); - if err != nil { - log.Println("GetNodeConfig - failed to marshal response"); - } - w.Write(body); - w.Header().Set("Content-Type", "application/json; charset=UTF-8") - w.WriteHeader(http.StatusOK) -} - func ImportAccount(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) @@ -106,89 +38,3 @@ func SetNodeAccount(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } -func SetNodeClaim(w http.ResponseWriter, r *http.Request) { - - // confirm node hasn't been configured - if getBoolConfigValue(CONFIG_CONFIGURED, false) { - w.WriteHeader(http.StatusUnauthorized) - return - } - - // extract credentials - username, password, ok := r.BasicAuth(); - if !ok || username == "" || password == "" { - log.Printf("SetNodeClaim - invalid credenitals"); - w.WriteHeader(http.StatusBadRequest) - return - } - hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) - if err != nil { - log.Printf("SetNodeClaim - failed to hash password"); - w.WriteHeader(http.StatusInternalServerError) - return - } - - // store credentials - err = store.DB.Transaction(func(tx *gorm.DB) error { - if res := tx.Create(&store.Config{ConfigId: CONFIG_USERNAME, StrValue: username}).Error; res != nil { - return res - } - if res := tx.Create(&store.Config{ConfigId: CONFIG_PASSWORD, BinValue: hashedPassword}).Error; res != nil { - return res - } - if res := tx.Create(&store.Config{ConfigId: CONFIG_CONFIGURED, BoolValue: true}).Error; res != nil { - return res - } - return nil; - }) - if(err != nil) { - log.Printf("SetNodeCalim - failed to store credentials"); - w.WriteHeader(http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusOK) -} - -func SetNodeConfig(w http.ResponseWriter, r *http.Request) { - - // validate login - if !adminLogin(r) { - log.Printf("SetNodeConfig - invalid admin credentials"); - w.WriteHeader(http.StatusUnauthorized); - return - } - - // parse node config - r.Body = http.MaxBytesReader(w, r.Body, CONFIG_BODYLIMIT) - dec := json.NewDecoder(r.Body) - dec.DisallowUnknownFields() - var config NodeConfig; - res := dec.Decode(&config); - if res != nil { - w.WriteHeader(http.StatusBadRequest) - return - } - - // store credentials - err := store.DB.Transaction(func(tx *gorm.DB) error { - if res := tx.Create(&store.Config{ConfigId: CONFIG_DOMAIN, StrValue: config.Domain}).Error; res != nil { - return res - } - if res := tx.Create(&store.Config{ConfigId: CONFIG_PUBLICLIMIT, NumValue: config.PublicLimit}).Error; res != nil { - return res - } - if res := tx.Create(&store.Config{ConfigId: CONFIG_STORAGE, NumValue: config.AccountStorage}).Error; res != nil { - return res - } - return nil; - }) - if(err != nil) { - log.Printf("SetNodeConfig - failed to store config"); - w.WriteHeader(http.StatusInternalServerError) - return - } - - w.WriteHeader(http.StatusOK) -} - diff --git a/net/server/internal/getNodeClaimable.endpoint.go b/net/server/internal/getNodeClaimable.endpoint.go new file mode 100644 index 00000000..6c6762ce --- /dev/null +++ b/net/server/internal/getNodeClaimable.endpoint.go @@ -0,0 +1,20 @@ +package databag + +import ( + "log" + "encoding/json" + "net/http" +) + +func GetNodeClaimable(w http.ResponseWriter, r *http.Request) { + + c := getBoolConfigValue(CONFIG_CONFIGURED, false); + body, err := json.Marshal(!c); + if err != nil { + log.Println("GetNodeClaimable - failed to marshal response"); + } + w.Write(body); + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) +} + diff --git a/net/server/internal/getNodeConfig.endpoint.go b/net/server/internal/getNodeConfig.endpoint.go new file mode 100644 index 00000000..5f5803dd --- /dev/null +++ b/net/server/internal/getNodeConfig.endpoint.go @@ -0,0 +1,32 @@ +package databag + +import ( + "log" + "encoding/json" + "net/http" +) + +func GetNodeConfig(w http.ResponseWriter, r *http.Request) { + + // validate login + if !adminLogin(r) { + log.Printf("SetNodeConfig - invalid admin credentials"); + w.WriteHeader(http.StatusUnauthorized); + return + } + + // get node config fields + var config NodeConfig; + config.Domain = getStrConfigValue(CONFIG_DOMAIN, ""); + config.PublicLimit = getNumConfigValue(CONFIG_PUBLICLIMIT, 0); + config.AccountStorage = getNumConfigValue(CONFIG_STORAGE, 0); + + body, err := json.Marshal(config); + if err != nil { + log.Println("GetNodeConfig - failed to marshal response"); + } + w.Write(body); + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusOK) +} + diff --git a/net/server/internal/setNodeClaim.endpoint.go b/net/server/internal/setNodeClaim.endpoint.go new file mode 100644 index 00000000..93d6323b --- /dev/null +++ b/net/server/internal/setNodeClaim.endpoint.go @@ -0,0 +1,54 @@ +package databag + +import ( + "log" + "net/http" + "gorm.io/gorm" + "databag/internal/store" + "golang.org/x/crypto/bcrypt" +) + +func SetNodeClaim(w http.ResponseWriter, r *http.Request) { + + // confirm node hasn't been configured + if getBoolConfigValue(CONFIG_CONFIGURED, false) { + w.WriteHeader(http.StatusUnauthorized) + return + } + + // extract credentials + username, password, ok := r.BasicAuth(); + if !ok || username == "" || password == "" { + log.Printf("SetNodeClaim - invalid credenitals"); + w.WriteHeader(http.StatusBadRequest) + return + } + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + log.Printf("SetNodeClaim - failed to hash password"); + w.WriteHeader(http.StatusInternalServerError) + return + } + + // store credentials + err = store.DB.Transaction(func(tx *gorm.DB) error { + if res := tx.Create(&store.Config{ConfigId: CONFIG_USERNAME, StrValue: username}).Error; res != nil { + return res + } + if res := tx.Create(&store.Config{ConfigId: CONFIG_PASSWORD, BinValue: hashedPassword}).Error; res != nil { + return res + } + if res := tx.Create(&store.Config{ConfigId: CONFIG_CONFIGURED, BoolValue: true}).Error; res != nil { + return res + } + return nil; + }) + if(err != nil) { + log.Printf("SetNodeCalim - failed to store credentials"); + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) +} + diff --git a/net/server/internal/setNodeConfig.endpoint.go b/net/server/internal/setNodeConfig.endpoint.go new file mode 100644 index 00000000..2c5b03dd --- /dev/null +++ b/net/server/internal/setNodeConfig.endpoint.go @@ -0,0 +1,52 @@ +package databag + +import ( + "log" + "encoding/json" + "net/http" + "gorm.io/gorm" + "databag/internal/store" +) + +func SetNodeConfig(w http.ResponseWriter, r *http.Request) { + + // validate login + if !adminLogin(r) { + log.Printf("SetNodeConfig - invalid admin credentials"); + w.WriteHeader(http.StatusUnauthorized); + return + } + + // parse node config + r.Body = http.MaxBytesReader(w, r.Body, CONFIG_BODYLIMIT) + dec := json.NewDecoder(r.Body) + dec.DisallowUnknownFields() + var config NodeConfig; + res := dec.Decode(&config); + if res != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + + // store credentials + err := store.DB.Transaction(func(tx *gorm.DB) error { + if res := tx.Create(&store.Config{ConfigId: CONFIG_DOMAIN, StrValue: config.Domain}).Error; res != nil { + return res + } + if res := tx.Create(&store.Config{ConfigId: CONFIG_PUBLICLIMIT, NumValue: config.PublicLimit}).Error; res != nil { + return res + } + if res := tx.Create(&store.Config{ConfigId: CONFIG_STORAGE, NumValue: config.AccountStorage}).Error; res != nil { + return res + } + return nil; + }) + if(err != nil) { + log.Printf("SetNodeConfig - failed to store config"); + w.WriteHeader(http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) +} +