feat: Plik z hasłami musi być szyfrowany. Polecenie szyfrowania
This commit is contained in:
parent
9ab0bcdb35
commit
c8c1ba52b9
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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user