Skip to content

Commit

Permalink
Support encrypted database keys (WIP)
Browse files Browse the repository at this point in the history
Fixes (hopefully) #48
  • Loading branch information
Tim van der Molen committed Jul 27, 2024
1 parent 67f4309 commit ee214bb
Show file tree
Hide file tree
Showing 9 changed files with 287 additions and 42 deletions.
21 changes: 16 additions & 5 deletions cmd_check_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,19 @@ import (
var cmdCheckDatabaseEntry = cmdEntry{
name: "check-database",
alias: "check",
usage: "[-d signal-directory]",
usage: "[-d signal-directory] [-p passfile]",
exec: cmdCheckDatabase,
}

func cmdCheckDatabase(args []string) cmdStatus {
getopt.ParseArgs("d:", args)

var dArg getopt.Arg
getopt.ParseArgs("d:p:", args)
var dArg, pArg getopt.Arg
for getopt.Next() {
switch opt := getopt.Option(); opt {
case 'd':
dArg = getopt.OptionArg()
case 'p':
pArg = getopt.OptionArg()
}
}

Expand All @@ -49,6 +50,11 @@ func cmdCheckDatabase(args []string) cmdStatus {
return cmdUsage
}

password, err := passwordFromFile(pArg)
if err != nil {
log.Fatal(err)
}

var signalDir string
if dArg.Set() {
signalDir = dArg.String()
Expand All @@ -73,7 +79,12 @@ func cmdCheckDatabase(args []string) cmdStatus {
log.Fatal(err)
}

ctx, err := signal.Open(signalDir)
var ctx *signal.Context
if password == nil {
ctx, err = signal.Open(signalDir)
} else {
ctx, err = signal.OpenWithPassword(signalDir, password)
}
if err != nil {
log.Fatal(err)
}
Expand Down
20 changes: 16 additions & 4 deletions cmd_export_attachments.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ type attMode struct {
var cmdExportAttachmentsEntry = cmdEntry{
name: "export-attachments",
alias: "att",
usage: "[-iLlMm] [-c conversation] [-d signal-directory] [-s interval] [directory]",
usage: "[-iLlMm] [-c conversation] [-d signal-directory] [-p passfile] [-s interval] [directory]",
exec: cmdExportAttachments,
}

Expand All @@ -70,8 +70,8 @@ func cmdExportAttachments(args []string) cmdStatus {
incremental: false,
}

getopt.ParseArgs("c:d:iLlMms:", args)
var dArg, sArg getopt.Arg
getopt.ParseArgs("c:d:iLlMmp:s:", args)
var dArg, pArg, sArg getopt.Arg
var selectors []string
for getopt.Next() {
switch getopt.Option() {
Expand All @@ -89,6 +89,8 @@ func cmdExportAttachments(args []string) cmdStatus {
mode.mtime = mtimeSent
case 'm':
mode.mtime = mtimeRecv
case 'p':
pArg = getopt.OptionArg()
case 's':
sArg = getopt.OptionArg()
}
Expand All @@ -112,6 +114,11 @@ func cmdExportAttachments(args []string) cmdStatus {
return cmdUsage
}

password, err := passwordFromFile(pArg)
if err != nil {
log.Fatal(err)
}

var signalDir string
if dArg.Set() {
signalDir = dArg.String()
Expand Down Expand Up @@ -159,7 +166,12 @@ func cmdExportAttachments(args []string) cmdStatus {
}
}

ctx, err := signal.Open(signalDir)
var ctx *signal.Context
if password == nil {
ctx, err = signal.Open(signalDir)
} else {
ctx, err = signal.OpenWithPassword(signalDir, password)
}
if err != nil {
log.Fatal(err)
}
Expand Down
20 changes: 16 additions & 4 deletions cmd_export_avatars.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,15 @@ import (
var cmdExportAvatarsEntry = cmdEntry{
name: "export-avatars",
alias: "avt",
usage: "[-Ll] [-c conversation] [-d signal-directory] [directory]",
usage: "[-Ll] [-c conversation] [-d signal-directory] [-p passfile] [directory]",
exec: cmdExportAvatars,
}

func cmdExportAvatars(args []string) cmdStatus {
mode := exportCopy

getopt.ParseArgs("c:d:Ll", args)
var dArg getopt.Arg
getopt.ParseArgs("c:d:Llp:", args)
var dArg, pArg getopt.Arg
var selectors []string
for getopt.Next() {
switch getopt.Option() {
Expand All @@ -50,6 +50,8 @@ func cmdExportAvatars(args []string) cmdStatus {
mode = exportLink
case 'l':
mode = exportSymlink
case 'p':
pArg = getopt.OptionArg()
}
}

Expand All @@ -71,6 +73,11 @@ func cmdExportAvatars(args []string) cmdStatus {
return cmdUsage
}

password, err := passwordFromFile(pArg)
if err != nil {
log.Fatal(err)
}

var signalDir string
if dArg.Set() {
signalDir = dArg.String()
Expand Down Expand Up @@ -99,7 +106,12 @@ func cmdExportAvatars(args []string) cmdStatus {
log.Fatal(err)
}

ctx, err := signal.Open(signalDir)
var ctx *signal.Context
if password == nil {
ctx, err = signal.Open(signalDir)
} else {
ctx, err = signal.OpenWithPassword(signalDir, password)
}
if err != nil {
log.Fatal(err)
}
Expand Down
21 changes: 16 additions & 5 deletions cmd_export_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,19 @@ import (
var cmdExportDatabaseEntry = cmdEntry{
name: "export-database",
alias: "db",
usage: "[-d signal-directory] file",
usage: "[-d signal-directory] [-p passfile] file",
exec: cmdExportDatabase,
}

func cmdExportDatabase(args []string) cmdStatus {
getopt.ParseArgs("d:", args)

var dArg getopt.Arg
getopt.ParseArgs("d:p:", args)
var dArg, pArg getopt.Arg
for getopt.Next() {
switch getopt.Option() {
case 'd':
dArg = getopt.OptionArg()
case 'p':
pArg = getopt.OptionArg()
}
}

Expand All @@ -51,6 +52,11 @@ func cmdExportDatabase(args []string) cmdStatus {
return cmdUsage
}

password, err := passwordFromFile(pArg)
if err != nil {
log.Fatal(err)
}

dbFile := args[0]

var signalDir string
Expand Down Expand Up @@ -90,7 +96,12 @@ func cmdExportDatabase(args []string) cmdStatus {
}
f.Close()

ctx, err := signal.Open(signalDir)
var ctx *signal.Context
if password == nil {
ctx, err = signal.Open(signalDir)
} else {
ctx, err = signal.OpenWithPassword(signalDir, password)
}
if err != nil {
log.Fatal(err)
}
Expand Down
20 changes: 16 additions & 4 deletions cmd_export_messages.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ type msgMode struct {
var cmdExportMessagesEntry = cmdEntry{
name: "export-messages",
alias: "msg",
usage: "[-i] [-c conversation] [-d signal-directory] [-f format] [-s interval] [directory]",
usage: "[-i] [-c conversation] [-d signal-directory] [-f format] [-p passfile] [-s interval] [directory]",
exec: cmdExportMessages,
}

Expand All @@ -53,8 +53,8 @@ func cmdExportMessages(args []string) cmdStatus {
incremental: false,
}

getopt.ParseArgs("c:d:f:is:", args)
var dArg, sArg getopt.Arg
getopt.ParseArgs("c:d:f:ip:s:", args)
var dArg, pArg, sArg getopt.Arg
var selectors []string
for getopt.Next() {
switch getopt.Option() {
Expand All @@ -75,6 +75,8 @@ func cmdExportMessages(args []string) cmdStatus {
}
case 'i':
mode.incremental = true
case 'p':
pArg = getopt.OptionArg()
case 's':
sArg = getopt.OptionArg()
}
Expand All @@ -98,6 +100,11 @@ func cmdExportMessages(args []string) cmdStatus {
return cmdUsage
}

password, err := passwordFromFile(pArg)
if err != nil {
log.Fatal(err)
}

var signalDir string
if dArg.Set() {
signalDir = dArg.String()
Expand Down Expand Up @@ -135,7 +142,12 @@ func cmdExportMessages(args []string) cmdStatus {
log.Fatal(err)
}

ctx, err := signal.Open(signalDir)
var ctx *signal.Context
if password == nil {
ctx, err = signal.Open(signalDir)
} else {
ctx, err = signal.OpenWithPassword(signalDir, password)
}
if err != nil {
log.Fatal(err)
}
Expand Down
21 changes: 16 additions & 5 deletions cmd_query_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,19 @@ import (
var cmdQueryDatabaseEntry = cmdEntry{
name: "query-database",
alias: "query",
usage: "[-d signal-directory] query",
usage: "[-d signal-directory] [-p passfile] query",
exec: cmdQueryDatabase,
}

func cmdQueryDatabase(args []string) cmdStatus {
getopt.ParseArgs("d:", args)

var dArg getopt.Arg
getopt.ParseArgs("d:p:", args)
var dArg, pArg getopt.Arg
for getopt.Next() {
switch opt := getopt.Option(); opt {
case 'd':
dArg = getopt.OptionArg()
case 'p':
pArg = getopt.OptionArg()
}
}

Expand All @@ -53,6 +54,11 @@ func cmdQueryDatabase(args []string) cmdStatus {

query := args[0]

password, err := passwordFromFile(pArg)
if err != nil {
log.Fatal(err)
}

var signalDir string
if dArg.Set() {
signalDir = dArg.String()
Expand All @@ -77,7 +83,12 @@ func cmdQueryDatabase(args []string) cmdStatus {
log.Fatal(err)
}

ctx, err := signal.Open(signalDir)
var ctx *signal.Context
if password == nil {
ctx, err = signal.Open(signalDir)
} else {
ctx, err = signal.OpenWithPassword(signalDir, password)
}
if err != nil {
log.Fatal(err)
}
Expand Down
22 changes: 22 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
package main

import (
"bufio"
"log"
"os"
"path/filepath"

"github.com/tbvdm/go-cli"
"github.com/tbvdm/go-openbsd"
"github.com/tbvdm/sigtop/getopt"
"github.com/tbvdm/sigtop/signal"
)

Expand Down Expand Up @@ -77,6 +79,26 @@ func command(name string) *cmdEntry {
return nil
}

func passwordFromFile(passfile getopt.Arg) ([]byte, error) {
if !passfile.Set() {
return nil, nil
}

f, err := os.Open(passfile.String())
if err != nil {
return nil, err
}
defer f.Close()

s := bufio.NewScanner(f)
if s.Scan() == false {
return []byte{}, s.Err()
}
pwd := append([]byte{}, s.Bytes()...)

return pwd, nil
}

func unveilSignalDir(dir string) error {
if err := openbsd.Unveil(dir, "r"); err != nil {
return err
Expand Down
Loading

0 comments on commit ee214bb

Please sign in to comment.