diff --git a/.gitignore b/.gitignore index adf8f72..930096f 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,8 @@ # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore # # Binaries for programs and plugins -*.exe -*.exe~ +#*.exe +#*.exe~ *.dll *.so *.dylib diff --git a/OSEContainers Database Tool.docx b/OSEContainers Database Tool.docx new file mode 100644 index 0000000..67841fb Binary files /dev/null and b/OSEContainers Database Tool.docx differ diff --git a/README.md b/README.md index 5d9c834..3af62c6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,37 @@ # osec-db -OSE Containers database module \ No newline at end of file +OSE Containers database module 0.1.0b + +## Use: + +Zet naast de executable de demo database bestand uit ./demo_db en gebruik de AES sleutel in de TXT bestand + +## Commands: + +=== OSEcontainers DATABASE TOOL | HELP PAGINA === + +Commando's voor OSE_DB_TOOL & databasebeheer: + +add [container] [locatie] [waarde1,waarde2,...] + | Gebruik ADD voor het toevoegen van containers, locaties en hun waardes + +remove [container] [locatie] + | Gebruik REMOVE voor het verwijderen van locaties en hun waardes + +read all + | Gebruik READ ALL voor het zien van alle containers met hun locaties en waardes + +read [container] + | Gebruik READ [container] om alle locaties en waardes van een specifieke container te zien + +help : Print deze pagina +exit : Sluit de tool applicatie af + +================================================= +Notities: +Meerdere waarden op een locatie moeten met een comma (,) gescheiden worden zonder spaties. Deze tool geeft je de vrijheid alles aan te passen. Maar OSE is specifiek in de syntax houd daar rekening mee. +Database locaties en waardes zijn hoofdlettergevloelig, over het algemeen bewaren we alles in lowercase. Deze tool geeft je wel de vrijheid om upper/lower case te gebruiken. +================================================= +OSEContainers database tool (OSE_DB_TOOL) versie: 0.1.1 +OSEContainers database (ose_db_ver) versie: 0.1.0b +================================================= \ No newline at end of file diff --git a/bin/OSE_DB_TOOL.exe b/bin/OSE_DB_TOOL.exe new file mode 100644 index 0000000..160bbe8 Binary files /dev/null and b/bin/OSE_DB_TOOL.exe differ diff --git a/demo_db/demo_sleutel.txt b/demo_db/demo_sleutel.txt new file mode 100644 index 0000000..bdeffd7 --- /dev/null +++ b/demo_db/demo_sleutel.txt @@ -0,0 +1 @@ +F4A45EEDF7E5EEA1D22B5CA90698EC0D \ No newline at end of file diff --git a/demo_db/osecdatabase.db b/demo_db/osecdatabase.db new file mode 100644 index 0000000..bdc38b0 --- /dev/null +++ b/demo_db/osecdatabase.db @@ -0,0 +1 @@ +ebד0DqS+}ƿ3!뵷׊ѰhFkeoD*gBdѴ2' ,;)g;e%C \ No newline at end of file diff --git a/source/main.go b/source/main.go new file mode 100644 index 0000000..8e166d2 --- /dev/null +++ b/source/main.go @@ -0,0 +1,253 @@ +package main + +import ( + "bufio" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/json" + "fmt" + "io" + "os" + "strings" +) + +var key []byte + +func main() { + fmt.Println("OSEContainers ENCRYPTED DATABASE TOOL 0.1.0") + fmt.Println("") + reader := bufio.NewReader(os.Stdin) + fmt.Print("Voer sleutelcode in: ") + inputKey, _ := reader.ReadString('\n') + key = []byte(strings.TrimSpace(inputKey)) + + dbFile := "osecdatabase.db" + if _, err := os.Stat(dbFile); os.IsNotExist(err) { + createInitialDatabase(dbFile) + } + + for { + fmt.Println("") + fmt.Print("Voer commando in: (HELP voor hulp EXIT voor aflsuiten): ") + command, _ := reader.ReadString('\n') + command = strings.TrimSpace(command) + parts := strings.Split(command, " ") + + switch parts[0] { + case "add": + if len(parts) < 4 { + fmt.Println("Ongeldig commando. Gebruik: add [container] [locatie] [waarde1,waarde2,...]") + continue + } + addRecord(dbFile, parts[1], parts[2], parts[3]) + case "remove": + if len(parts) < 3 { + fmt.Println("Ongeldig commando. Gebruik: remove [container] [locatie]") + continue + } + removeRecord(dbFile, parts[1], parts[2]) + case "read": + if len(parts) < 2 { + fmt.Println("Ongeldig commando. Gebruik: read all or read [container]") + continue + } + if parts[1] == "all" { + readAllRecords(dbFile) + } else { + readBucketRecords(dbFile, parts[1]) + } + case "help": + printHelp() + case "exit": + os.Exit(0) + default: + fmt.Println("Ongeldige commando, type HELP voor hulp") + } + } +} + +func createInitialDatabase(filename string) { + data := make(map[string]map[string]string) + data["system"] = map[string]string{"ose_db_ver": "0.1.0"} + saveData(filename, data) +} + +func saveData(filename string, data map[string]map[string]string) { + // Create a backup file before saving changes + backupFilename := filename + ".bak" + err := copyFile(filename, backupFilename) + if err != nil { + fmt.Println("ERROR: Could not create backup file:", err) + return + } + + encryptedData, err := encryptData(data) + if err != nil { + fmt.Println("ERROR: Could not encrypt data:", err) + return + } + err = os.WriteFile(filename, encryptedData, 0644) + if err != nil { + fmt.Println("ERROR: Could not save data:", err) + // Restore the backup file if saving fails + _ = os.Rename(backupFilename, filename) + return + } + fmt.Println("Data saved successfully.") +} + +func copyFile(src, dst string) error { + sourceFile, err := os.Open(src) + if err != nil { + return err + } + defer sourceFile.Close() + + destinationFile, err := os.Create(dst) + if err != nil { + return err + } + defer destinationFile.Close() + + _, err = io.Copy(destinationFile, sourceFile) + if err != nil { + return err + } + return nil +} + +func loadData(filename string) (map[string]map[string]string, error) { + encryptedData, err := os.ReadFile(filename) + if err != nil { + return nil, err + } + data, err := decryptData(encryptedData) + if err != nil { + return nil, err + } + return data, nil +} + +func encryptData(data map[string]map[string]string) ([]byte, error) { + jsonData, err := json.Marshal(data) + if err != nil { + return nil, err + } + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + ciphertext := make([]byte, aes.BlockSize+len(jsonData)) + iv := ciphertext[:aes.BlockSize] + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + return nil, err + } + stream := cipher.NewCFBEncrypter(block, iv) + stream.XORKeyStream(ciphertext[aes.BlockSize:], jsonData) + return ciphertext, nil +} + +func decryptData(ciphertext []byte) (map[string]map[string]string, error) { + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + if len(ciphertext) < aes.BlockSize { + return nil, fmt.Errorf("ciphertext te kort") + } + iv := ciphertext[:aes.BlockSize] + ciphertext = ciphertext[aes.BlockSize:] + stream := cipher.NewCFBDecrypter(block, iv) + stream.XORKeyStream(ciphertext, ciphertext) + var data map[string]map[string]string + err = json.Unmarshal(ciphertext, &data) + if err != nil { + return nil, err + } + return data, nil +} + +func addRecord(filename, bucket, record, values string) { + data, err := loadData(filename) + if err != nil { + fmt.Println("ERROR: Kon data niet laden:", err, "| Heeft u de correcte sleutelcode?") + return + } + if _, ok := data[bucket]; !ok { + data[bucket] = make(map[string]string) + } + data[bucket][record] = values + saveData(filename, data) + fmt.Println("Gegevens aan container toegevoegd") +} + +func removeRecord(filename, bucket, record string) { + data, err := loadData(filename) + if err != nil { + fmt.Println("ERROR: Kon gegevens niet laden:", err, "| Heeft u de correcte sleutelcode?") + return + } + if _, ok := data[bucket]; ok { + delete(data[bucket], record) + saveData(filename, data) + fmt.Println("Gegevens van container verwijderd") + } else { + fmt.Println("Container niet gevonden") + } +} + +func readAllRecords(filename string) { + data, err := loadData(filename) + if err != nil { + fmt.Println("ERROR: Kon gegevens niet laden:", err, "| Heeft u de correcte sleutelcode?") + return + } + for bucket, records := range data { + fmt.Println("Container:", bucket) + for record, values := range records { + fmt.Printf(" Locatie: %s, Waardes: %s\n", record, values) + } + } +} + +func readBucketRecords(filename, bucket string) { + data, err := loadData(filename) + if err != nil { + fmt.Println("ERROR: Kon gegevens niet laden:", err, "| Heeft u de correcte sleutelcode?") + return + } + if records, ok := data[bucket]; ok { + fmt.Println("Container:", bucket) + for record, values := range records { + fmt.Printf(" Locatie: %s, Waardes: %s\n", record, values) + } + } else { + fmt.Println("Container niet gevonden") + } +} +func printHelp() { + fmt.Println("") + fmt.Println("=== OSEcontainers DATABASE TOOL | HELP PAGINA ===") + fmt.Println("") + fmt.Println("Commando's voor OSE_DB_TOOL & databasebeheer:") + fmt.Println("") + fmt.Println("add [container] [locatie] [waarde1,waarde2,...]") + fmt.Println("\t| Gebruik ADD voor het toevoegen van containers, locaties en hun waardes") + fmt.Println("") + fmt.Println("remove [container] [locatie]") + fmt.Println("\t| Gebruik REMOVE voor het verwijderen van locaties en hun waardes") + fmt.Println("") + fmt.Println("read all") + fmt.Println("\t| Gebruik read all voor het zien van alle containers met hun locaties en waardes") + fmt.Println("") + fmt.Println("read [container]") + fmt.Println("\t| Gebruik read [container] om alle locaties en waardes van een specifieke container te zien") + fmt.Println("") + fmt.Println("help : Print deze pagina | exit : Sluit de tool applicatie af") + fmt.Println("") + fmt.Println(" =============================== ") + fmt.Println("Notities:") + fmt.Println("Meerdere waarden op een locatie moeten met een comma (,) gescheiden worden zonder spaties. Deze tool geeft je de vrijheid alles aan te passen. Maar OSE is specifiek in de syntax houd daar rekening mee.") + fmt.Println("") +} \ No newline at end of file