You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
6.0 KiB

2 years ago
package management
import (
"encoding/json"
"errors"
"io/ioutil"
"log"
"os"
"time"
"github.com/asaskevich/govalidator"
"github.com/cr3a70r/shield/internal/domains"
2 years ago
)
var Settings T_Management
type T_Management struct {
Users []T_User `json:"Users"`
Domains []domains.T_Domain `json:"Names"`
Backends []domains.T_Backend `json:"Backedns"`
Hosts []string `json:"Hosts"`
Debug bool `json:"Debug"`
2 years ago
}
type T_User struct {
Email string `json:"Email"`
Password string `json:"Password"`
Cookie string `json:"Cookie"`
CreatedDate string `json:"CreatedDate"`
}
func (T_Management) SaveConfig() error {
configFile, err := os.OpenFile("config.json", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
if err == nil {
configByte, err := json.MarshalIndent(Settings, "", " ")
2 years ago
if err != nil {
log.Fatal("management.SaveConfig: could not Marshall Settings: ", err)
return errors.New("management.SaveConfig: could not Marshall Settings: " + err.Error())
}
_, err = configFile.Write(configByte)
if err != nil {
log.Fatal("management.SaveConfig: could not Write Settings: ", err)
return errors.New("management.SaveConfig: could not Write Settings: " + err.Error())
}
} else {
log.Fatal("management.SaveConfig: could not create new config.json file: ", err)
return errors.New("management.SaveConfig: could not create new config.json file: " + err.Error())
}
defer configFile.Close()
return nil
2 years ago
}
func (T_Management) LoadConfig() {
}
func (T_Management) ReloadConfig() {
}
func (T_Management) Initialize() {
configExists, err := os.Open("config.json")
if err != nil {
log.Println("management.initialize: new deployment: building config")
Settings.DefaultSuperAdmin()
configNew, err := os.OpenFile("config.json", os.O_CREATE|os.O_WRONLY, 0644)
if err == nil {
configByte, err := json.MarshalIndent(Settings, "", " ")
if err != nil {
log.Fatal("management.initialize: could not Marshall Settings: ", err)
}
configNew.Write(configByte)
} else {
log.Fatal("management.initialize: could not create new config.json file: ", err)
}
defer configNew.Close()
} else {
configByte, err := ioutil.ReadAll(configExists)
if err != nil {
log.Fatal("management.initialize: could not read config: ", err)
}
json.Unmarshal(configByte, &Settings)
defer configExists.Close()
}
}
// Needs to be checked if a user already exist
func (T_Management) AddUserByTUser(user T_User) error {
if !govalidator.IsEmail(user.Email) {
return errors.New("email is not an email")
}
if user.Email == "" {
return errors.New("email cannot be empty")
}
if user.Password == "" {
return errors.New("password cannot be empty")
}
currentTime := time.Now()
user.CreatedDate = currentTime.Format("2006-January-02")
Settings.Users = append(Settings.Users, user)
return nil
}
func (T_Management) AddUserByParams(email string, passwd string) error {
var temp T_User
temp.Email = email
temp.Password = passwd
err := Settings.AddUserByTUser(temp)
return err
}
func (T_Management) RemoveUserByEmail(email string) error {
found := false
for index, u := range Settings.Users {
if u.Email == email {
temp := append(Settings.Users[:index], Settings.Users[index+1])
Settings.Users = temp
found = true
return nil
}
}
if !found {
return errors.New("did not find a user:" + email)
}
return nil
}
func (T_Management) CheckPassword(email string, passwd string) (bool, error) {
found := false
for _, u := range Settings.Users {
if u.Email == email && u.Password == passwd {
return true, nil
}
}
if !found {
return false, errors.New("no combination with:" + email + " :" + passwd)
}
return false, nil
}
func (T_Management) SaveCookie(email string, cookie string) error {
for index, u := range Settings.Users {
2 years ago
if u.Email == email {
Settings.Users[index].Cookie = cookie
return nil
}
}
return nil
}
func (T_Management) OnboardDomain(name string, realServer string, realPort string) (bool, error) {
if !govalidator.IsDNSName(name) {
return false, errors.New("given name is not a DNS name")
}
if !govalidator.IsDNSName(realServer) && !govalidator.IsIP(realServer) {
return false, errors.New("given realServer is not a valid DNS name or IP Address")
}
if !govalidator.IsPort(realPort) {
return false, errors.New("given realPort is not a valid Port number")
}
Settings.AddDomainByParams(name, realServer, realPort)
2 years ago
return true, nil
}
func (T_Management) UserFindByEmail(email string) (T_User, error) {
found := false
var temp T_User
for _, u := range Settings.Users {
if u.Email == email {
return u, nil
}
}
if !found {
return temp, errors.New("no combination with:" + email)
}
return temp, nil
}
func (T_Management) AllUsers() []T_User {
return Settings.Users
}
func (T_Management) DefaultSuperAdmin() {
Settings.Debug = false
Settings.AddUserByParams("defadm@daydev.org", "siconmas")
}
func (T_Management) ToString() string {
managementString, err := json.Marshal(Settings)
if err != nil {
log.Println("management.ToString: " + err.Error())
}
return string(managementString)
}
//--- Domains
func (T_Management) AddDomainByDomain(domain domains.T_Domain) {
domain.Status = domains.Onboarding
Settings.Domains = append(Settings.Domains, domain)
}
func (T_Management) AddDomainByParams(name string, realServer string, realPort string) {
var temp domains.T_Domain
temp.DomainName = name
temp.RealServer = realServer
temp.RealPort = realPort
temp.Status = domains.Onboarding
Settings.AddDomainByDomain(temp)
}
func (T_Management) RemoveDomain(name string) {
for index, v := range Settings.Domains {
if v.DomainName == name {
temp := append(Settings.Domains[:index], Settings.Domains[index+1])
Settings.Domains = temp
}
}
}
func (T_Management) FindDomainByName(name string) domains.T_Domain {
var temp domains.T_Domain
for index, v := range Settings.Domains {
if v.DomainName == name {
temp = Settings.Domains[index]
}
}
return temp
}
//--- END Domains