databag/net/server/internal/api_admin.go

178 lines
4.8 KiB
Go
Raw Normal View History

2022-01-11 06:20:32 +00:00
/*
* DataBag
*
* DataBag provides storage for decentralized identity based self-hosting apps. It is intended to support sharing of personal data and hosting group conversations.
*
* API version: 0.0.1
* Contact: roland.osborne@gmail.com
2022-01-13 05:00:52 +00:00
* Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git)
2022-01-11 06:20:32 +00:00
*/
package databag
import (
2022-01-12 21:12:40 +00:00
"log"
"encoding/json"
2022-01-11 06:20:32 +00:00
"net/http"
2022-01-12 07:04:27 +00:00
"gorm.io/gorm"
2022-01-12 21:12:40 +00:00
"golang.org/x/crypto/bcrypt"
"databag/internal/store"
2022-01-11 06:20:32 +00:00
)
2022-01-13 07:04:43 +00:00
func adminLogin(r *http.Request) bool {
// check configured state
if !_configured || _adminUsername == "" || _adminPassword == nil {
return false;
}
// validate imput
username, password, ok := r.BasicAuth();
if !ok || username == "" || password == "" {
return false
}
// compare credentials
if username != _adminUsername || bcrypt.CompareHashAndPassword(_adminPassword, []byte(password)) != nil {
return false
}
return true;
}
2022-01-11 06:20:32 +00:00
func AddNodeAccount(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func GetNodeAccountImage(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func GetNodeAccounts(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func GetNodeClaimable(w http.ResponseWriter, r *http.Request) {
2022-01-12 07:04:27 +00:00
2022-01-13 18:06:19 +00:00
body, _ := json.Marshal(!_configured);
w.Write(body);
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
2022-01-11 06:20:32 +00:00
}
func GetNodeConfig(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
2022-01-13 05:00:52 +00:00
func ImportAccount(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
2022-01-11 06:20:32 +00:00
func RemoveNodeAccount(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func SetNodeAccount(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func SetNodeClaim(w http.ResponseWriter, r *http.Request) {
2022-01-12 21:12:40 +00:00
2022-01-13 07:04:43 +00:00
// confirm node hasn't been configured
2022-01-12 21:12:40 +00:00
if _configured {
w.WriteHeader(http.StatusUnauthorized)
return
}
// extract credentials
username, password, ok := r.BasicAuth();
2022-01-13 07:04:43 +00:00
if !ok || username == "" || password == "" {
log.Printf("SetNodeClaim - invalid credenitals");
2022-01-12 21:12:40 +00:00
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
}
return nil;
})
if(err != nil) {
log.Printf("SetNodeCalim - failed to store credentials");
w.WriteHeader(http.StatusInternalServerError)
return
}
// set global values
_adminUsername = username
_adminPassword = hashedPassword
2022-01-13 07:04:43 +00:00
_configured = true
2022-01-12 21:12:40 +00:00
2022-01-11 06:20:32 +00:00
w.WriteHeader(http.StatusOK)
}
func SetNodeConfig(w http.ResponseWriter, r *http.Request) {
2022-01-12 21:12:40 +00:00
2022-01-13 07:04:43 +00:00
// validate login
if !adminLogin(r) {
2022-01-12 21:12:40 +00:00
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
}
// set global values
_nodeDomain = config.Domain
_publicLimit = config.PublicLimit
_accountStorage = config.AccountStorage
2022-01-11 06:20:32 +00:00
w.WriteHeader(http.StatusOK)
}
2022-01-13 07:04:43 +00:00