feat: Plik z hasłami musi być szyfrowany. Polecenie szyfrowania
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
/.vscode
 | 
					/.vscode
 | 
				
			||||||
/output
 | 
					/output
 | 
				
			||||||
/pgpass
 | 
					/pgpass*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#exec
 | 
					#exec
 | 
				
			||||||
/multisql
 | 
					/multisql
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,13 +8,16 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const MULTISQLPASS = "MULTISQLPASS" // nazwa ziennej środowiskowej z hasłem
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Parameters struct {
 | 
					type Parameters struct {
 | 
				
			||||||
	Verbose    bool
 | 
					 | 
				
			||||||
	ConfigFile string
 | 
						ConfigFile string
 | 
				
			||||||
	Passfile   string
 | 
						Passfile   string
 | 
				
			||||||
	OutDir     string
 | 
						OutDir     string
 | 
				
			||||||
	SqlDir     string
 | 
						SqlDir     string
 | 
				
			||||||
	LogFile	   string
 | 
						LogFile    string
 | 
				
			||||||
 | 
						Verbose    bool
 | 
				
			||||||
 | 
						AskPass    bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var params Parameters
 | 
					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.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.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.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.Usage = printUsage
 | 
				
			||||||
	flag.Parse()
 | 
						flag.Parse()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,10 +1,13 @@
 | 
				
			|||||||
package main
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"flag"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"baal.ar76.eu/x/pub/multisql/cfg"
 | 
						"baal.ar76.eu/x/pub/multisql/cfg"
 | 
				
			||||||
	"baal.ar76.eu/x/pub/multisql/mgr"
 | 
						"baal.ar76.eu/x/pub/multisql/mgr"
 | 
				
			||||||
 | 
						"baal.ar76.eu/x/pub/multisql/pass"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -13,6 +16,12 @@ func main() {
 | 
				
			|||||||
	log.SetFlags(log.LstdFlags)
 | 
						log.SetFlags(log.LstdFlags)
 | 
				
			||||||
	params := cfg.GetParams()
 | 
						params := cfg.GetParams()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						args := flag.Args()
 | 
				
			||||||
 | 
						if len (args) > 0 {
 | 
				
			||||||
 | 
							encryption(args, params)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if params.LogFile != "" {
 | 
						if params.LogFile != "" {
 | 
				
			||||||
		fh, err := os.OpenFile(params.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o664)
 | 
							fh, err := os.OpenFile(params.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o664)
 | 
				
			||||||
		if err != nil {
 | 
							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 {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatalf("Nie można wystartować operacji: %v\n", err)
 | 
							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")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								mgr/mgr.go
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								mgr/mgr.go
									
									
									
									
									
								
							@@ -14,18 +14,20 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Manager struct {
 | 
					type Manager struct {
 | 
				
			||||||
	config cfg.Config
 | 
						config  cfg.Config
 | 
				
			||||||
	runDir string
 | 
						runDir  string
 | 
				
			||||||
	verbose bool
 | 
						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)
 | 
						runDir := createRunDir(outdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	manager := Manager{
 | 
						manager := Manager{
 | 
				
			||||||
		config: config,
 | 
							config:  config,
 | 
				
			||||||
		runDir: runDir,
 | 
							runDir:  runDir,
 | 
				
			||||||
		verbose: verbose,
 | 
							verbose: verbose,
 | 
				
			||||||
 | 
							askPass: askPass,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return manager, nil
 | 
						return manager, nil
 | 
				
			||||||
@@ -70,10 +72,11 @@ func (self Manager) Run() error {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var passdb  *pass.PassDb
 | 
						var passdb *pass.PassDb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if self.config.PassFile != "" {
 | 
						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 {
 | 
							if err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -115,7 +118,6 @@ func (self Manager) createDirPerCon(con cfg.Connection) (string, error) {
 | 
				
			|||||||
	return dir, err
 | 
						return dir, err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
func (self Manager) Logger(group *sync.WaitGroup, stream <-chan psql.Result, con cfg.Connection) {
 | 
					func (self Manager) Logger(group *sync.WaitGroup, stream <-chan psql.Result, con cfg.Connection) {
 | 
				
			||||||
	for event := range stream {
 | 
						for event := range stream {
 | 
				
			||||||
		if event.Err != nil {
 | 
							if event.Err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,6 @@ package pass
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"bytes"
 | 
						"bytes"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type pgpassrow struct {
 | 
					type pgpassrow struct {
 | 
				
			||||||
@@ -21,7 +20,7 @@ type PassDb struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func Load(file string, master string) (*PassDb, error) {
 | 
					func Load(file string, master string) (*PassDb, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data, err := os.ReadFile(file)
 | 
						data, err := DecryptFile(master, file)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user