From c8c1ba52b981066f7c152cf7e3445e78f60925d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rychli=C5=84ski=20Arkadiusz?= Date: Tue, 22 Nov 2022 17:14:04 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20Plik=20z=20has=C5=82ami=20musi=20by?= =?UTF-8?q?=C4=87=20szyfrowany.=20Polecenie=20szyfrowania?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- cfg/params.go | 9 +++++-- cmd/multisql/multisql.go | 55 +++++++++++++++++++++++++++++++++++++++- mgr/mgr.go | 18 +++++++------ pass/pass.go | 3 +-- 5 files changed, 73 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 513b10f..1cf8f96 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ /.vscode /output -/pgpass +/pgpass* #exec /multisql diff --git a/cfg/params.go b/cfg/params.go index 49e6b3a..6cf643b 100644 --- a/cfg/params.go +++ b/cfg/params.go @@ -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(¶ms.OutDir, "outdir", "", "Katalog (istniejący i z prawem do zapisu), do którego generowane są wyniki") flag.StringVar(¶ms.SqlDir, "sqldir", "scripts", "Katalog, w którym znajdują się skrypty do uruchomienia") flag.StringVar(¶ms.LogFile, "log", "", "Plik, do którego zostanie dopisany log programu") + flag.BoolVar(¶ms.AskPass, "P", false, "Pytaj o hasło. Jeśli nie podane wymaga się hasła w ") + flag.Usage = printUsage flag.Parse() } diff --git a/cmd/multisql/multisql.go b/cmd/multisql/multisql.go index 43526b7..efd2684 100644 --- a/cmd/multisql/multisql.go +++ b/cmd/multisql/multisql.go @@ -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") + } +} diff --git a/mgr/mgr.go b/mgr/mgr.go index c086512..94f4780 100644 --- a/mgr/mgr.go +++ b/mgr/mgr.go @@ -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 { diff --git a/pass/pass.go b/pass/pass.go index fa2325c..4e6749e 100644 --- a/pass/pass.go +++ b/pass/pass.go @@ -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 }