From acdb157282ac4705d8ec3ffab75b6bba2cc08550 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 5 Jul 2021 16:47:10 +0300 Subject: Changed file structure and implemented rester file creation and login check --- go-src/dataValidations.go | 55 +++++++++++++++++ go-src/errorMessages.go | 11 ++++ go-src/folderPaths/folderPaths.go | 49 +++++++++++++++ go-src/main.go | 7 --- go-src/main/main.go | 11 ++++ go-src/user.go | 43 ++++++++++++++ go-src/windows.go | 121 ++++++++++++++++++++++++++++++++++++++ go-src/windows/dataValidations.go | 55 ----------------- go-src/windows/errorMessages.go | 10 ---- go-src/windows/windows.go | 111 ---------------------------------- 10 files changed, 290 insertions(+), 183 deletions(-) create mode 100644 go-src/dataValidations.go create mode 100644 go-src/errorMessages.go create mode 100644 go-src/folderPaths/folderPaths.go delete mode 100644 go-src/main.go create mode 100644 go-src/main/main.go create mode 100644 go-src/user.go create mode 100644 go-src/windows.go delete mode 100644 go-src/windows/dataValidations.go delete mode 100644 go-src/windows/errorMessages.go delete mode 100644 go-src/windows/windows.go diff --git a/go-src/dataValidations.go b/go-src/dataValidations.go new file mode 100644 index 0000000..b391eb3 --- /dev/null +++ b/go-src/dataValidations.go @@ -0,0 +1,55 @@ +package ctfc + +import ( + "regexp" +) + +var SpecialCharacters = []rune{'!', '@', '#', '$', '%', '^', '&', '*'} + +// Inclusive minimum and maximum +func stringValidLength(min int, max int, value string) bool { + return len(value) >= min && len(value) <= max +} + +func stringValidCharacters(value string, letters bool, numbers bool, special ...rune) bool { + expr := "^[" + if letters { + expr += "A-z" + } + if numbers { + expr += "0-9" + } + for _, v := range special { + expr += string(v) + } + expr += "]+$" + + return regexp.MustCompile(expr).MatchString(value) +} + +func stringValidRuneAmount(value string, runeStart rune, runeEnd rune, minAmount int) bool { + var sum int + for _, v := range value { + if v >= runeStart && v <= runeEnd { + sum++ + } + } + return sum >= minAmount +} + +func stringValidUsername(value string) bool { + return stringValidLength(2, 40, value) && + stringValidCharacters(value, true, true, '.', '*', '_', '-') && + (stringValidRuneAmount(value, 'A', 'Z', 1) || stringValidRuneAmount(value, 'a', 'z', 1)) +} + +func stringValidPassword(value string) bool { + return stringValidLength(5, 40, value) && + stringValidCharacters(value, true, true, SpecialCharacters...) && + stringValidRuneAmount(value, '0', '9', 1) +} + +func stringValidName(value string) bool { + return stringValidLength(2, 60, value) && + stringValidCharacters(value, true, false, ' ', '\'', '-') +} diff --git a/go-src/errorMessages.go b/go-src/errorMessages.go new file mode 100644 index 0000000..0caf128 --- /dev/null +++ b/go-src/errorMessages.go @@ -0,0 +1,11 @@ +package ctfc + +const ( + invalidArgument = "Invalid argument!" + invalidCommand = "Invalid command!" + invalidCredentials = "Invalid credentials!" +) + +func invalidValueFor(typeName string) string { + return "Invalid value for " + typeName + "!" +} diff --git a/go-src/folderPaths/folderPaths.go b/go-src/folderPaths/folderPaths.go new file mode 100644 index 0000000..67bb92b --- /dev/null +++ b/go-src/folderPaths/folderPaths.go @@ -0,0 +1,49 @@ +package folderPaths + +import ( + "os" + "runtime" +) + +func InitFolders() { + dirs := []string{rootFolder(), buildPath(rootFolder(), "Chats"), buildPath(rootFolder(), "DirectMessages"), buildPath(rootFolder(), "Users")} + for _, v := range dirs { + if _, err := os.Stat(v); os.IsNotExist(err) { + os.Mkdir(v, 0775) + } + } +} + +func FileAtChatsFolder(fileName string) string { + return buildPath(rootFolder(), "Chats", fileName+".txt") +} + +func FileAtDirectMessagesFolder(fileName string) string { + return buildPath(rootFolder(), "DirectMessages", fileName+".txt") +} + +func FileAtUsersFolder(fileName string) string { + return buildPath(rootFolder(), "Users", fileName+".txt") +} + +func rootFolder() string { + if runtime.GOOS == "windows" { + return "C:\\Users\\username\\AppData\\Roaming\\ctfc" + } + home, _ := os.UserHomeDir() + return home + "/Desktop/ctfc" +} + +func buildPath(folders ...string) (path string) { + sep := "/" + if runtime.GOOS == "windows" { + sep = "\\" + } + for i, v := range folders { + path += v + if i < len(folders)-1 { + path += sep + } + } + return +} diff --git a/go-src/main.go b/go-src/main.go deleted file mode 100644 index 5cb2c57..0000000 --- a/go-src/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "gitlab.com/Syndamia/ctfc/go-src/windows" - -func main() { - windows.StartupWindow() -} diff --git a/go-src/main/main.go b/go-src/main/main.go new file mode 100644 index 0000000..d1161dc --- /dev/null +++ b/go-src/main/main.go @@ -0,0 +1,11 @@ +package main + +import ( + ctfc "gitlab.com/Syndamia/ctfc/go-src" + "gitlab.com/Syndamia/ctfc/go-src/folderPaths" +) + +func main() { + folderPaths.InitFolders() + ctfc.StartupWindow() +} diff --git a/go-src/user.go b/go-src/user.go new file mode 100644 index 0000000..259c044 --- /dev/null +++ b/go-src/user.go @@ -0,0 +1,43 @@ +package ctfc + +import ( + "bytes" + "os" + + "gitlab.com/Syndamia/ctfc/go-src/folderPaths" +) + +var loggedInUser User + +type User struct { + Username string + Name string +} + +func createUser(data []string) { + // TODO: Password hashing + f, _ := os.Create(folderPaths.FileAtUsersFolder(data[0])) + f.WriteString(data[0] + "\n" + data[1] + "\n" + data[2]) + f.Close() +} + +func logInUser(username string, password string) bool { + if validatePassword(username, password) { + loggedInUser = getUser(username) + return true + } + return false +} + +func getUser(username string) User { + f, _ := os.ReadFile(folderPaths.FileAtUsersFolder(username)) + values := bytes.Split(f, []byte("\n")) + return User{string(values[0]), string(values[2])} +} + +func validatePassword(username string, password string) bool { + // TODO: Implement hashing + f, _ := os.ReadFile(folderPaths.FileAtUsersFolder(username)) + passHash := bytes.Split(f, []byte("\n"))[0] + return string(passHash) == password +} diff --git a/go-src/windows.go b/go-src/windows.go new file mode 100644 index 0000000..983d450 --- /dev/null +++ b/go-src/windows.go @@ -0,0 +1,121 @@ +package ctfc + +import ( + "fmt" + "os" + "os/exec" + "runtime" + "strings" + + "gitlab.com/Syndamia/ctfc/go-src/ui" +) + +func StartupWindow(...string) { + clearScreen() + + fmt.Println(ui.NormalBox(true, "Login", "Register")) + fmt.Print(ui.InputField("[L/R]")) + command := strings.ToLower(ui.GetInput()) + + if command == "l" { + defer loginWindow() + } else if command == "r" { + defer registerWindow() + } else { + defer showError(invalidCommand, StartupWindow) + } +} + +func loginWindow(values ...string) { + clearScreen() + + fmt.Println(ui.NormalBox(true, "Login")) + + switch len(values) { + case 0: + fmt.Print(ui.InputField("Username")) + case 1: + fmt.Println(ui.InputFieldFilled("Username", values[0])) + fmt.Print(ui.InputField("Password")) + } + + val := ui.GetInput() + + if len(values) == 0 { + defer loginWindow(val) + } else if logInUser(values[0], val) { + defer chatsWindow() + } else { + defer showError(invalidCredentials, loginWindow, values...) + } +} + +func registerWindow(values ...string) { + clearScreen() + + fmt.Println(ui.NormalBox(true, "Register")) + + var validationF func(string) bool + var fieldName, specification string + + switch len(values) { + case 0: + validationF, fieldName, specification = stringValidUsername, "Username", "[A-z, 0-9, *, ., _, -; at least 1 letter]" + case 1: + fmt.Println(ui.InputFieldFilled("Username", values[0])) + validationF, fieldName, specification = stringValidPassword, "Password", "[5-40 characters; at least 1 number]" + case 2: + fmt.Println(ui.InputFieldFilled("Username", values[0])) + fmt.Println(ui.InputFieldFilled("Password", values[1])) + validationF, fieldName, specification = stringValidName, "Name", "[2-60 characters]" + } + + fmt.Print(ui.InputField(fieldName + " " + specification)) + val := ui.GetInput() + + if validationF(val) { + values = append(values, val) + + // When user has entered all required values + if len(values) == 3 { + createUser(values) + logInUser(values[0], values[1]) + defer chatsWindow() + } else { // When there are still values to be given + defer registerWindow(values...) + } + } else { + defer showError(invalidValueFor(fieldName), registerWindow, values...) + } +} + +func chatsWindow(...string) { + fmt.Println("Works!") + fmt.Println(loggedInUser) +} + +var clearNext = true + +func showError(message string, callback func(...string), callbackData ...string) { + clearScreen() + + fmt.Println(ui.ErrorBox(message)) + clearNext = false + + defer callback(callbackData...) +} + +func clearScreen() { + if !clearNext { + clearNext = true + return + } + + if runtime.GOOS == "windows" { + cmd := exec.Command("cmd", "/c", "cls") + cmd.Stdout = os.Stdout + cmd.Run() + } else { + fmt.Println("\033[2J") + } +} diff --git a/go-src/windows/dataValidations.go b/go-src/windows/dataValidations.go deleted file mode 100644 index 3df61c1..0000000 --- a/go-src/windows/dataValidations.go +++ /dev/null @@ -1,55 +0,0 @@ -package windows - -import ( - "regexp" -) - -var SpecialCharacters = []rune{'!', '@', '#', '$', '%', '^', '&', '*'} - -// Inclusive minimum and maximum -func StringValidLength(min int, max int, value string) bool { - return len(value) >= min && len(value) <= max -} - -func StringValidCharacters(value string, letters bool, numbers bool, special ...rune) bool { - expr := "^[" - if letters { - expr += "A-z" - } - if numbers { - expr += "0-9" - } - for _, v := range special { - expr += string(v) - } - expr += "]+$" - - return regexp.MustCompile(expr).MatchString(value) -} - -func StringValidRuneAmount(value string, runeStart rune, runeEnd rune, minAmount int) bool { - var sum int - for _, v := range value { - if v >= runeStart && v <= runeEnd { - sum++ - } - } - return sum >= minAmount -} - -func StringValidUsername(value string) bool { - return StringValidLength(2, 40, value) && - StringValidCharacters(value, true, true, '.', '*', '_', '-') && - (StringValidRuneAmount(value, 'A', 'Z', 1) || StringValidRuneAmount(value, 'a', 'z', 1)) -} - -func StringValidPassword(value string) bool { - return StringValidLength(5, 40, value) && - StringValidCharacters(value, true, true, SpecialCharacters...) && - StringValidRuneAmount(value, '0', '9', 1) -} - -func StringValidName(value string) bool { - return StringValidLength(2, 60, value) && - StringValidCharacters(value, true, false, ' ', '\'', '-') -} diff --git a/go-src/windows/errorMessages.go b/go-src/windows/errorMessages.go deleted file mode 100644 index cd18fc7..0000000 --- a/go-src/windows/errorMessages.go +++ /dev/null @@ -1,10 +0,0 @@ -package windows - -const ( - invalidArgument = "Invalid argument!" - invalidCommand = "Invalid command!" -) - -func invalidValueFor(typeName string) string { - return "Invalid value for " + typeName + "!" -} diff --git a/go-src/windows/windows.go b/go-src/windows/windows.go deleted file mode 100644 index ff091ed..0000000 --- a/go-src/windows/windows.go +++ /dev/null @@ -1,111 +0,0 @@ -package windows - -import ( - "fmt" - "os" - "os/exec" - "runtime" - "strings" - - "gitlab.com/Syndamia/ctfc/go-src/ui" -) - -func StartupWindow(...string) { - clearScreen() - - fmt.Println(ui.NormalBox(true, "Login", "Register")) - fmt.Print(ui.InputField("[L/R]")) - command := strings.ToLower(ui.GetInput()) - - if command == "l" { - defer LoginWindow() - } else if command == "r" { - defer RegisterWindow() - } else { - defer ShowError(invalidCommand, StartupWindow) - } -} - -func LoginWindow(values ...string) { - clearScreen() - - fmt.Println(ui.NormalBox(true, "Login")) - - switch len(values) { - case 0: - fmt.Print(ui.InputField("Username")) - case 1: - fmt.Println(ui.InputFieldFilled("Username", values[0])) - fmt.Print(ui.InputField("Password")) - } - - val := ui.GetInput() - - if len(values) == 0 { - defer LoginWindow(val) - } else { - defer fmt.Println(values[0], val) - } -} - -func RegisterWindow(values ...string) { - clearScreen() - - fmt.Println(ui.NormalBox(true, "Register")) - - var validationF func(string) bool - var fieldName, specification string - - switch len(values) { - case 0: - validationF, fieldName, specification = StringValidUsername, "Username", "[A-z, 0-9, *, ., _, -; at least 1 letter]" - case 1: - fmt.Println(ui.InputFieldFilled("Username", values[0])) - validationF, fieldName, specification = StringValidPassword, "Password", "[5-40 characters; at least 1 number]" - case 2: - fmt.Println(ui.InputFieldFilled("Username", values[0])) - fmt.Println(ui.InputFieldFilled("Password", values[1])) - validationF, fieldName, specification = StringValidName, "Name", "[2-60 characters]" - } - - fmt.Print(ui.InputField(fieldName + " " + specification)) - val := ui.GetInput() - - if validationF(val) { - values = append(values, val) - - if len(values) != 3 { - defer RegisterWindow(values...) - } else { // When user has entered all required values - defer fmt.Println(values) - } - } else { - defer ShowError(invalidValueFor(fieldName), RegisterWindow, values...) - } -} - -var clearNext = true - -func ShowError(message string, callback func(...string), callbackData ...string) { - clearScreen() - - fmt.Println(ui.ErrorBox(message)) - clearNext = false - - defer callback(callbackData...) -} - -func clearScreen() { - if !clearNext { - clearNext = true - return - } - - if runtime.GOOS == "windows" { - cmd := exec.Command("cmd", "/c", "cls") - cmd.Stdout = os.Stdout - cmd.Run() - } else { - fmt.Println("\033[2J") - } -} -- cgit v1.2.3