aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--go-src/dataValidations.go55
-rw-r--r--go-src/errorMessages.go11
-rw-r--r--go-src/folderPaths/folderPaths.go49
-rw-r--r--go-src/main.go7
-rw-r--r--go-src/main/main.go11
-rw-r--r--go-src/user.go43
-rw-r--r--go-src/windows.go (renamed from go-src/windows/windows.go)44
-rw-r--r--go-src/windows/dataValidations.go55
-rw-r--r--go-src/windows/errorMessages.go10
9 files changed, 196 insertions, 89 deletions
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/windows.go b/go-src/windows.go
index ff091ed..983d450 100644
--- a/go-src/windows/windows.go
+++ b/go-src/windows.go
@@ -1,4 +1,4 @@
-package windows
+package ctfc
import (
"fmt"
@@ -18,15 +18,15 @@ func StartupWindow(...string) {
command := strings.ToLower(ui.GetInput())
if command == "l" {
- defer LoginWindow()
+ defer loginWindow()
} else if command == "r" {
- defer RegisterWindow()
+ defer registerWindow()
} else {
- defer ShowError(invalidCommand, StartupWindow)
+ defer showError(invalidCommand, StartupWindow)
}
}
-func LoginWindow(values ...string) {
+func loginWindow(values ...string) {
clearScreen()
fmt.Println(ui.NormalBox(true, "Login"))
@@ -42,13 +42,15 @@ func LoginWindow(values ...string) {
val := ui.GetInput()
if len(values) == 0 {
- defer LoginWindow(val)
+ defer loginWindow(val)
+ } else if logInUser(values[0], val) {
+ defer chatsWindow()
} else {
- defer fmt.Println(values[0], val)
+ defer showError(invalidCredentials, loginWindow, values...)
}
}
-func RegisterWindow(values ...string) {
+func registerWindow(values ...string) {
clearScreen()
fmt.Println(ui.NormalBox(true, "Register"))
@@ -58,14 +60,14 @@ func RegisterWindow(values ...string) {
switch len(values) {
case 0:
- validationF, fieldName, specification = StringValidUsername, "Username", "[A-z, 0-9, *, ., _, -; at least 1 letter]"
+ 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]"
+ 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]"
+ validationF, fieldName, specification = stringValidName, "Name", "[2-60 characters]"
}
fmt.Print(ui.InputField(fieldName + " " + specification))
@@ -74,19 +76,27 @@ func RegisterWindow(values ...string) {
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)
+ // 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...)
+ 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) {
+func showError(message string, callback func(...string), callbackData ...string) {
clearScreen()
fmt.Println(ui.ErrorBox(message))
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 + "!"
-}