diff --git a/.gitignore b/.gitignore index f1683ec..144e4e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .go /aerc +log diff --git a/cmd/aerc/main.go b/cmd/aerc/main.go index e33f158..cda4991 100644 --- a/cmd/aerc/main.go +++ b/cmd/aerc/main.go @@ -1,13 +1,30 @@ package main import ( + "fmt" + "io" + "io/ioutil" + "log" + "os" "time" + "github.com/mattn/go-isatty" + "git.sr.ht/~sircmpwn/aerc2/config" "git.sr.ht/~sircmpwn/aerc2/ui" ) func main() { + var logOut io.Writer + var logger *log.Logger + if !isatty.IsTerminal(os.Stdout.Fd()) { + logOut = os.Stdout + } else { + logOut = ioutil.Discard + } + logger = log.New(logOut, "", log.LstdFlags|log.Lshortfile) + logger.Println("Starting up aerc") + conf, err := config.LoadConfig(nil) if err != nil { panic(err) @@ -18,7 +35,11 @@ func main() { } defer _ui.Close() for _, account := range conf.Accounts { - tab, err := ui.NewAccountTab(&account) + logger.Printf("Initializing account %s\n", account.Name) + tab, err := ui.NewAccountTab(&account, log.New( + logOut, + fmt.Sprintf("[%s] ", account.Name), + log.LstdFlags|log.Lshortfile)) if err != nil { panic(err) } diff --git a/ui/account.go b/ui/account.go index 8353db3..59544d4 100644 --- a/ui/account.go +++ b/ui/account.go @@ -1,26 +1,29 @@ package ui import ( - "fmt" + "log" tb "github.com/nsf/termbox-go" + "github.com/davecgh/go-spew/spew" + "git.sr.ht/~sircmpwn/aerc2/config" "git.sr.ht/~sircmpwn/aerc2/worker" "git.sr.ht/~sircmpwn/aerc2/worker/types" ) type AccountTab struct { - Config *config.AccountConfig - Worker worker.Worker - Parent *UIState - + Config *config.AccountConfig + Worker worker.Worker + Parent *UIState + logger *log.Logger counter int - log []string } -func NewAccountTab(conf *config.AccountConfig) (*AccountTab, error) { - work, err := worker.NewWorker(conf.Source) +func NewAccountTab(conf *config.AccountConfig, + logger *log.Logger) (*AccountTab, error) { + + work, err := worker.NewWorker(conf.Source, logger) if err != nil { return nil, err } @@ -30,6 +33,7 @@ func NewAccountTab(conf *config.AccountConfig) (*AccountTab, error) { return &AccountTab{ Config: conf, Worker: work, + logger: logger, }, nil } @@ -49,9 +53,6 @@ func (acc *AccountTab) Render(at Geometry) { } TFill(at, cell) TPrintf(&at, cell, "%s %d\n", acc.Name(), acc.counter) - for _, str := range acc.log { - TPrintf(&at, cell, "%s\n", str) - } acc.counter++ if acc.counter%10000 == 0 { acc.counter = 0 @@ -64,5 +65,11 @@ func (acc *AccountTab) GetChannel() chan types.WorkerMessage { } func (acc *AccountTab) HandleMessage(msg types.WorkerMessage) { - acc.log = append(acc.log, fmt.Sprintf("<- %T", msg)) + switch msg.InResponseTo().(type) { + case types.Configure: + // Avoid printing passwords + acc.logger.Printf("<- %T\n", msg) + default: + acc.logger.Printf("<- %s", spew.Sdump(msg)) + } } diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 6971f8c..d3ef715 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -2,13 +2,16 @@ package imap import ( "fmt" + "log" "net/url" "strings" - "git.sr.ht/~sircmpwn/aerc2/worker/types" + "github.com/davecgh/go-spew/spew" "github.com/emersion/go-imap" - "github.com/emersion/go-imap/client" "github.com/emersion/go-imap-idle" + "github.com/emersion/go-imap/client" + + "git.sr.ht/~sircmpwn/aerc2/worker/types" ) var errUnsupported = fmt.Errorf("unsupported command") @@ -31,13 +34,15 @@ type IMAPWorker struct { client *imapClient updates chan client.Update + logger *log.Logger } -func NewIMAPWorker() *IMAPWorker { +func NewIMAPWorker(logger *log.Logger) *IMAPWorker { return &IMAPWorker{ messages: make(chan types.WorkerMessage, 50), actions: make(chan types.WorkerMessage, 50), updates: make(chan client.Update, 50), + logger: logger, } } @@ -126,11 +131,24 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { return nil } +// Logs an action but censors passwords +func (w *IMAPWorker) logAction(msg types.WorkerMessage) { + switch msg := msg.(type) { + case types.Configure: + src := msg.Config.Source + msg.Config.Source = "[obsfucated]" + w.logger.Printf("<= %s", spew.Sdump(msg)) + msg.Config.Source = src + default: + w.logger.Printf("<= %s", spew.Sdump(msg)) + } +} + func (w *IMAPWorker) Run() { for { select { case msg := <-w.actions: - fmt.Printf("<= %T\n", msg) + w.logAction(msg) if err := w.handleMessage(msg); err == errUnsupported { w.messages <- types.Unsupported{ Message: types.RespondTo(msg), @@ -146,7 +164,7 @@ func (w *IMAPWorker) Run() { } } case update := <-w.updates: - fmt.Printf("<= %T\n", update) + w.logger.Printf("[= %s", spew.Sdump(update)) } } } diff --git a/worker/worker.go b/worker/worker.go index c8ec622..b665884 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -5,6 +5,7 @@ import ( "git.sr.ht/~sircmpwn/aerc2/worker/types" "fmt" + "log" "net/url" ) @@ -15,7 +16,7 @@ type Worker interface { } // Guesses the appropriate worker type based on the given source string -func NewWorker(source string) (Worker, error) { +func NewWorker(source string, logger *log.Logger) (Worker, error) { u, err := url.Parse(source) if err != nil { return nil, err @@ -23,7 +24,7 @@ func NewWorker(source string) (Worker, error) { switch u.Scheme { case "imap": case "imaps": - return imap.NewIMAPWorker(), nil + return imap.NewIMAPWorker(logger), nil } return nil, fmt.Errorf("Unknown backend %s", u.Scheme) }