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
249 lines
6.0 KiB
2 years ago
|
package management
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"io/ioutil"
|
||
|
"log"
|
||
|
"os"
|
||
|
|
||
|
"time"
|
||
|
|
||
|
"github.com/asaskevich/govalidator"
|
||
2 years ago
|
"github.com/cr3a70r/shield/internal/domains"
|
||
2 years ago
|
)
|
||
|
|
||
|
var Settings T_Management
|
||
|
|
||
|
type T_Management struct {
|
||
2 years ago
|
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"`
|
||
|
}
|
||
|
|
||
2 years ago
|
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
|
|
||
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 {
|
||
2 years ago
|
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")
|
||
|
}
|
||
|
|
||
2 years ago
|
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)
|
||
|
}
|
||
2 years ago
|
|
||
|
//--- 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
|