X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fcmd%2Fnncp-xfer%2Fmain.go;h=a1ef5fa5d51c438179b33450f7876352d62d5242;hb=2cad23b498bbb9fc1e929b4900b40e520017c614;hp=ae47ec6a842687e9cfb20d733d77a27427acdb56;hpb=fd1ff00305ba34a32a98f5ef0ad24e3dc8dfde1a;p=nncp.git diff --git a/src/cmd/nncp-xfer/main.go b/src/cmd/nncp-xfer/main.go index ae47ec6..a1ef5fa 100644 --- a/src/cmd/nncp-xfer/main.go +++ b/src/cmd/nncp-xfer/main.go @@ -1,6 +1,6 @@ /* NNCP -- Node to Node copy, utilities for store-and-forward data exchange -Copyright (C) 2016-2021 Sergey Matveev +Copyright (C) 2016-2022 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,7 +29,7 @@ import ( "path/filepath" "github.com/dustin/go-humanize" - "go.cypherpunks.ru/nncp/v6" + "go.cypherpunks.ru/nncp/v8" ) func usage() { @@ -141,7 +141,7 @@ func main() { goto Tx } fis, err = dir.Readdir(0) - dir.Close() // #nosec G104 + dir.Close() if err != nil { ctx.LogE("xfer-self-read", les, err, func(les nncp.LEs) string { return logMsg(les) + ": reading" @@ -185,7 +185,7 @@ func main() { continue } fisInt, err := dir.Readdir(0) - dir.Close() // #nosec G104 + dir.Close() if err != nil { ctx.LogE("xfer-rx-read", les, err, func(les nncp.LEs) string { return logMsg(les) + ": reading" @@ -218,18 +218,39 @@ func main() { continue } pktEnc, pktEncRaw, err := ctx.HdrRead(fd) - if err != nil || pktEnc.Magic != nncp.MagicNNCPEv4 { - ctx.LogD("xfer-rx-not-packet", les, func(les nncp.LEs) string { - return logMsg(les) + ": is not a packet" - }) - fd.Close() // #nosec G104 + if err == nil { + switch pktEnc.Magic { + case nncp.MagicNNCPEv1.B: + err = nncp.MagicNNCPEv1.TooOld() + case nncp.MagicNNCPEv2.B: + err = nncp.MagicNNCPEv2.TooOld() + case nncp.MagicNNCPEv3.B: + err = nncp.MagicNNCPEv3.TooOld() + case nncp.MagicNNCPEv4.B: + err = nncp.MagicNNCPEv4.TooOld() + case nncp.MagicNNCPEv5.B: + err = nncp.MagicNNCPEv5.TooOld() + case nncp.MagicNNCPEv6.B: + default: + err = errors.New("is not an encrypted packet") + } + } + if err != nil { + ctx.LogD( + "xfer-rx-not-packet", + append(les, nncp.LE{K: "Err", V: err}), + func(les nncp.LEs) string { + return logMsg(les) + ": not valid packet: " + err.Error() + }, + ) + fd.Close() continue } if pktEnc.Nice > nice { ctx.LogD("xfer-rx-too-nice", les, func(les nncp.LEs) string { return logMsg(les) + ": too nice" }) - fd.Close() // #nosec G104 + fd.Close() continue } les = append(les, nncp.LE{K: "Size", V: fiInt.Size()}) @@ -242,10 +263,10 @@ func main() { } if !ctx.IsEnoughSpace(fiInt.Size()) { ctx.LogE("xfer-rx", les, errors.New("is not enough space"), logMsg) - fd.Close() // #nosec G104 + fd.Close() continue } - if _, err = fd.Seek(0, 0); err != nil { + if _, err = fd.Seek(0, io.SeekStart); err != nil { log.Fatalln(err) } tmp, err := ctx.NewTmpFileWHash() @@ -260,10 +281,10 @@ func main() { } if err != nil { ctx.LogE("xfer-rx", les, err, logMsg) - w.CloseWithError(err) // #nosec G104 + w.CloseWithError(err) } }() - if _, err = nncp.CopyProgressed( + _, err = nncp.CopyProgressed( tmp.W, r, "Rx", append( les, @@ -271,13 +292,24 @@ func main() { nncp.LE{K: "FullSize", V: fiInt.Size()}, ), ctx.ShowPrgrs, - ); err != nil { + ) + fd.Close() + if err != nil { + ctx.LogE("xfer-rx", les, err, logMsg) + tmp.Cancel() + isBad = true + continue + } + if err = tmp.W.Flush(); err != nil { ctx.LogE("xfer-rx", les, err, logMsg) + tmp.Cancel() isBad = true + continue } - fd.Close() // #nosec G104 - if isBad { + if tmp.Checksum() != fiInt.Name() { + ctx.LogE("xfer-rx", les, errors.New("checksum mismatch"), logMsg) tmp.Cancel() + isBad = true continue } if err = tmp.Commit(filepath.Join( @@ -404,7 +436,9 @@ Tx: }) continue } - if _, err = os.Stat(filepath.Join(dstPath, pktName+nncp.SeenSuffix)); err == nil || !os.IsNotExist(err) { + if _, err = os.Stat(filepath.Join( + dstPath, nncp.SeenDir, pktName, + )); err == nil || !os.IsNotExist(err) { ctx.LogD("xfer-tx-seen", les, func(les nncp.LEs) string { return logMsg(les) + ": already seen" }) @@ -427,7 +461,7 @@ Tx: ctx.LogE("xfer-tx-open", les, err, func(les nncp.LEs) string { return logMsg(les) + ": opening" }) - tmp.Close() // #nosec G104 + tmp.Close() isBad = true continue } @@ -437,30 +471,32 @@ Tx: append(les, nncp.LE{K: "FullSize", V: job.Size}), ctx.ShowPrgrs, ) - fd.Close() // #nosec G104 + fd.Close() if err != nil { ctx.LogE("xfer-tx-copy", les, err, func(les nncp.LEs) string { return logMsg(les) + ": copying" }) - tmp.Close() // #nosec G104 + tmp.Close() isBad = true continue } if err = bufW.Flush(); err != nil { - tmp.Close() // #nosec G104 + tmp.Close() ctx.LogE("xfer-tx-flush", les, err, func(les nncp.LEs) string { return logMsg(les) + ": flushing" }) isBad = true continue } - if err = tmp.Sync(); err != nil { - tmp.Close() // #nosec G104 - ctx.LogE("xfer-tx-sync", les, err, func(les nncp.LEs) string { - return logMsg(les) + ": syncing" - }) - isBad = true - continue + if !nncp.NoSync { + if err = tmp.Sync(); err != nil { + tmp.Close() + ctx.LogE("xfer-tx-sync", les, err, func(les nncp.LEs) string { + return logMsg(les) + ": syncing" + }) + isBad = true + continue + } } if err = tmp.Close(); err != nil { ctx.LogE("xfer-tx-close", les, err, func(les nncp.LEs) string { @@ -481,7 +517,7 @@ Tx: isBad = true continue } - os.Remove(filepath.Join(dstPath, pktName+".part")) // #nosec G104 + os.Remove(filepath.Join(dstPath, pktName+".part")) les = les[:len(les)-1] ctx.LogI( "xfer-tx", @@ -499,7 +535,7 @@ Tx: }) isBad = true } else if ctx.HdrUsage { - os.Remove(job.Path + nncp.HdrSuffix) + os.Remove(nncp.JobPath2Hdr(job.Path)) } } }