feat: Plik z hasłami musi być szyfrowany. Polecenie szyfrowania

This commit is contained in:
Rychliński Arkadiusz 2022-11-22 17:14:04 +01:00
parent 9ab0bcdb35
commit c8c1ba52b9
5 changed files with 73 additions and 14 deletions

2
.gitignore vendored
View File

@ -1,6 +1,6 @@
/.vscode
/output
/pgpass
/pgpass*
#exec
/multisql

View File

@ -8,13 +8,16 @@ import (
"os"
)
const MULTISQLPASS = "MULTISQLPASS" // nazwa ziennej środowiskowej z hasłem
type Parameters struct {
Verbose bool
ConfigFile string
Passfile string
OutDir string
SqlDir string
LogFile string
LogFile string
Verbose bool
AskPass bool
}
var params Parameters
@ -26,6 +29,8 @@ func init() {
flag.StringVar(&params.OutDir, "outdir", "", "Katalog (istniejący i z prawem do zapisu), do którego generowane są wyniki")
flag.StringVar(&params.SqlDir, "sqldir", "scripts", "Katalog, w którym znajdują się skrypty do uruchomienia")
flag.StringVar(&params.LogFile, "log", "", "Plik, do którego zostanie dopisany log programu")
flag.BoolVar(&params.AskPass, "P", false, "Pytaj o hasło. Jeśli nie podane wymaga się hasła w ")
flag.Usage = printUsage
flag.Parse()
}

View File

@ -1,10 +1,13 @@
package main
import (
"flag"
"os"
"strings"
"baal.ar76.eu/x/pub/multisql/cfg"
"baal.ar76.eu/x/pub/multisql/mgr"
"baal.ar76.eu/x/pub/multisql/pass"
"log"
)
@ -13,6 +16,12 @@ func main() {
log.SetFlags(log.LstdFlags)
params := cfg.GetParams()
args := flag.Args()
if len (args) > 0 {
encryption(args, params)
return
}
if params.LogFile != "" {
fh, err := os.OpenFile(params.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o664)
if err != nil {
@ -44,7 +53,7 @@ func main() {
}
}
manager, err := mgr.Create(params.Verbose, params.OutDir, config)
manager, err := mgr.Create(params.Verbose, params.AskPass, params.OutDir, config)
if err != nil {
log.Fatalf("Nie można wystartować operacji: %v\n", err)
}
@ -56,3 +65,47 @@ func main() {
}
}
func encryption(args []string, params cfg.Parameters) {
password := pass.GetMasterPass(params.AskPass)
switch strings.ToLower(args[0]) {
case "encrypt":
if len(args) < 3 {
log.Fatal("encrypt wymaga dwu plików: cel-plik.zaszyfrowany źródło-plik.jawny")
return
}
plain, err := os.ReadFile(args[2])
if err != nil {
log.Fatalf("Błąd odczytu pliku: %v", err)
}
err = pass.EncryptFile(password, args[1], plain)
if err != nil {
log.Fatalf("Błąd szyfrowania pliku: %v", err)
}
case "decrypt":
if len(args) < 2 {
log.Fatal("decryp wymaga podania pliku zaszyfrowanego")
return
}
data, err := pass.DecryptFile(password, args[1])
if err !=nil {
log.Fatalf("Błąd deszyfrowania pliku: %v", err)
}
if len(args) > 2 {
err = os.WriteFile(args[2], data, 0o600)
if err != nil {
log.Fatalf("Błąd zapisu pliku: %v", err)
}
log.Printf("Zapisano odszyfrowane dane do pliku %s", args[2])
} else {
os.Stdout.Write(data)
}
default:
log.Println("W trybie komend wymagane jest podanie polecenie encrypt lub decrypt i nazw plików: zaszyfrowanego i jawnego");
log.Println("Np:")
log.Println("multisql encrypt hasła.zaszyfrowany hasła")
log.Println("multisql decrypt hasła.zaszyfrowany hasła")
}
}

View File

@ -14,18 +14,20 @@ import (
)
type Manager struct {
config cfg.Config
runDir string
config cfg.Config
runDir string
verbose bool
askPass bool
}
func Create(verbose bool, outdir string, config cfg.Config) (Manager, error) {
func Create(verbose bool, askPass bool, outdir string, config cfg.Config) (Manager, error) {
runDir := createRunDir(outdir)
manager := Manager{
config: config,
runDir: runDir,
config: config,
runDir: runDir,
verbose: verbose,
askPass: askPass,
}
return manager, nil
@ -70,10 +72,11 @@ func (self Manager) Run() error {
return err
}
var passdb *pass.PassDb
var passdb *pass.PassDb
if self.config.PassFile != "" {
passdb, err = pass.Load(self.config.PassFile, "TODO")
password := pass.GetMasterPass(self.askPass)
passdb, err = pass.Load(self.config.PassFile, password)
if err != nil {
return err
}
@ -115,7 +118,6 @@ func (self Manager) createDirPerCon(con cfg.Connection) (string, error) {
return dir, err
}
func (self Manager) Logger(group *sync.WaitGroup, stream <-chan psql.Result, con cfg.Connection) {
for event := range stream {
if event.Err != nil {

View File

@ -3,7 +3,6 @@ package pass
import (
"bytes"
"fmt"
"os"
)
type pgpassrow struct {
@ -21,7 +20,7 @@ type PassDb struct {
func Load(file string, master string) (*PassDb, error) {
data, err := os.ReadFile(file)
data, err := DecryptFile(master, file)
if err != nil {
return nil, err
}