github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/signer/core/auditlog.go (about) 1 2 package core 3 4 import ( 5 "context" 6 7 "encoding/json" 8 9 "github.com/quickchainproject/quickchain/accounts" 10 "github.com/quickchainproject/quickchain/common" 11 "github.com/quickchainproject/quickchain/common/hexutil" 12 "github.com/quickchainproject/quickchain/internal/qctapi" 13 "github.com/quickchainproject/quickchain/log" 14 ) 15 16 type AuditLogger struct { 17 log log.Logger 18 api ExternalAPI 19 } 20 21 func (l *AuditLogger) List(ctx context.Context) (Accounts, error) { 22 l.log.Info("List", "type", "request", "metadata", MetadataFromContext(ctx).String()) 23 res, e := l.api.List(ctx) 24 25 l.log.Info("List", "type", "response", "data", res.String()) 26 27 return res, e 28 } 29 30 func (l *AuditLogger) New(ctx context.Context) (accounts.Account, error) { 31 return l.api.New(ctx) 32 } 33 34 func (l *AuditLogger) SignTransaction(ctx context.Context, args SendTxArgs, methodSelector *string) (*qctapi.SignTransactionResult, error) { 35 sel := "<nil>" 36 if methodSelector != nil { 37 sel = *methodSelector 38 } 39 l.log.Info("SignTransaction", "type", "request", "metadata", MetadataFromContext(ctx).String(), 40 "tx", args.String(), 41 "methodSelector", sel) 42 43 res, e := l.api.SignTransaction(ctx, args, methodSelector) 44 if res != nil { 45 l.log.Info("SignTransaction", "type", "response", "data", common.Bytes2Hex(res.Raw), "error", e) 46 } else { 47 l.log.Info("SignTransaction", "type", "response", "data", res, "error", e) 48 } 49 return res, e 50 } 51 52 func (l *AuditLogger) Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) { 53 l.log.Info("Sign", "type", "request", "metadata", MetadataFromContext(ctx).String(), 54 "addr", addr.String(), "data", common.Bytes2Hex(data)) 55 b, e := l.api.Sign(ctx, addr, data) 56 l.log.Info("Sign", "type", "response", "data", common.Bytes2Hex(b), "error", e) 57 return b, e 58 } 59 60 func (l *AuditLogger) EcRecover(ctx context.Context, data, sig hexutil.Bytes) (common.Address, error) { 61 l.log.Info("EcRecover", "type", "request", "metadata", MetadataFromContext(ctx).String(), 62 "data", common.Bytes2Hex(data)) 63 a, e := l.api.EcRecover(ctx, data, sig) 64 l.log.Info("EcRecover", "type", "response", "addr", a.String(), "error", e) 65 return a, e 66 } 67 68 func (l *AuditLogger) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { 69 l.log.Info("Export", "type", "request", "metadata", MetadataFromContext(ctx).String(), 70 "addr", addr.Hex()) 71 j, e := l.api.Export(ctx, addr) 72 // In this case, we don't actually log the json-response, which may be extra sensitive 73 l.log.Info("Export", "type", "response", "json response size", len(j), "error", e) 74 return j, e 75 } 76 77 func (l *AuditLogger) Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) { 78 // Don't actually log the json contents 79 l.log.Info("Import", "type", "request", "metadata", MetadataFromContext(ctx).String(), 80 "keyJSON size", len(keyJSON)) 81 a, e := l.api.Import(ctx, keyJSON) 82 l.log.Info("Import", "type", "response", "addr", a.String(), "error", e) 83 return a, e 84 } 85 86 func NewAuditLogger(path string, api ExternalAPI) (*AuditLogger, error) { 87 l := log.New("api", "signer") 88 handler, err := log.FileHandler(path, log.LogfmtFormat()) 89 if err != nil { 90 return nil, err 91 } 92 l.SetHandler(handler) 93 l.Info("Configured", "audit log", path) 94 return &AuditLogger{l, api}, nil 95 }