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.

194 lines
4.3 KiB

2 years ago
package management
import (
"encoding/json"
"errors"
"fmt"
"io/ioutil"
"log"
"os"
"time"
"github.com/asaskevich/govalidator"
domains "github.com/cr3a70r/shield/Domains"
)
var Settings T_Management
type T_Management struct {
Users []T_User `json:"Users"`
Domains domains.T_Domains `json:"Names"`
Debug bool `json:"Debug"`
}
type T_User struct {
Email string `json:"Email"`
Password string `json:"Password"`
Cookie string `json:"Cookie"`
CreatedDate string `json:"CreatedDate"`
}
func (T_Management) SaveConfig() {
}
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, _ := range Settings.Users {
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")
}
domains.Names.AddByParams(name, realServer, realPort)
return true, nil
}
func (T_Management) RemoveDomain(name string) {
domains.Names.RemoveDomain(name)
}
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)
}