Return error from GetConfig function

This commit is contained in:
Kelvin Clement Mwinuka
2023-12-08 14:01:19 +08:00
parent c1a4957be2
commit 9e0291d98b
3 changed files with 56 additions and 11 deletions

View File

@@ -8,6 +8,7 @@ import (
"log"
"os"
"path"
"strings"
)
type Password struct {
@@ -16,7 +17,6 @@ type Password struct {
}
type UserPassword struct {
Enabled bool `json:"Enabled" yaml:"Enabled"`
Passwords []Password `json:"Passwords" yaml:"Passwords"`
}
@@ -45,10 +45,29 @@ type ACL struct {
Users []User
}
func GetPasswordType(password string) string {
if strings.Split(password, "")[0] == "#" {
return "SHA256"
}
return "plaintext"
}
func NewACL(config utils.Config) *ACL {
users := []User{}
// 1. Initialise default ACL user
defaultUser := User{
Username: "default",
Enabled: true,
Authentication: UserPassword{
Passwords: []Password{
{
PasswordType: "plaintext",
PasswordValue: config.Password,
},
},
},
}
// 2. Read and parse the ACL config file and set the
if config.AclConfig != "" {
@@ -78,7 +97,21 @@ func NewACL(config utils.Config) *ACL {
}
}
// 3. Validate the ACL Config that has been loaded from the file
// 3. If users parsed from file do not contain "default" user, add the one we initialised in step 1
hasDefault := false
for _, user := range users {
if user.Username == "default" {
hasDefault = true
break
}
}
if !hasDefault {
users = append([]User{defaultUser}, users...)
}
// 4. Validate the ACL Config that has been loaded from the file
return &ACL{
Users: users,

View File

@@ -50,7 +50,7 @@ type Server struct {
broadcastQueue *memberlist.TransmitLimitedQueue
numOfNodes int
cancelCh *chan (os.Signal)
cancelCh *chan os.Signal
ACL *ACL
}
@@ -388,7 +388,11 @@ func (server *Server) ShutDown(ctx context.Context) {
}
func main() {
config := utils.GetConfig()
config, err := utils.GetConfig()
if err != nil {
log.Fatal(err)
}
ctx := context.WithValue(context.Background(), utils.ContextServerID("ServerID"), config.ServerID)
@@ -401,7 +405,7 @@ func main() {
}
}
cancelCh := make(chan (os.Signal), 1)
cancelCh := make(chan os.Signal, 1)
signal.Notify(cancelCh, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
server := &Server{

View File

@@ -2,8 +2,8 @@ package utils
import (
"encoding/json"
"errors"
"flag"
"log"
"os"
"path"
@@ -30,7 +30,7 @@ type Config struct {
Password string `json:"password" yaml:"password"`
}
func GetConfig() Config {
func GetConfig() (Config, error) {
tls := flag.Bool("tls", false, "Start the server in TLS mode. Default is false")
key := flag.String("key", "", "The private key file path.")
cert := flag.String("cert", "", "The signed certificate file path.")
@@ -96,20 +96,28 @@ It is a plain text value by default but you can provide a SHA256 hash by adding
ext := path.Ext(f.Name())
if ext == ".json" {
json.NewDecoder(f).Decode(&conf)
err := json.NewDecoder(f).Decode(&conf)
if err != nil {
return Config{}, nil
}
}
if ext == ".yaml" || ext == ".yml" {
yaml.NewDecoder(f).Decode(&conf)
err := yaml.NewDecoder(f).Decode(&conf)
if err != nil {
return Config{}, err
}
}
}
}
// If requirePass is set to true, then password must be provided as well
var err error = nil
if conf.RequirePass && conf.Password == "" {
log.Fatal("password cannot be empty if requirePass is set to true.")
err = errors.New("password cannot be empty if requirePass is set to true")
}
return conf
return conf, err
}