]> Cypherpunks.ru repositories - nncp.git/blobdiff - src/cmd/nncp-pkt/main.go
nncp-pkt is able to parse .hdr
[nncp.git] / src / cmd / nncp-pkt / main.go
index 9d8ba2ce137fd312eeba09e710df5d7b2afbdea9..fbfc6dafac0b7bd5e3a34eca16a23970f0da7047 100644 (file)
@@ -29,7 +29,7 @@ import (
 
        xdr "github.com/davecgh/go-xdr/xdr2"
        "github.com/klauspost/compress/zstd"
-       "go.cypherpunks.ru/nncp/v6"
+       "go.cypherpunks.ru/nncp/v7"
 )
 
 func usage() {
@@ -40,6 +40,99 @@ func usage() {
        fmt.Fprintln(os.Stderr, "Packet is read from stdin.")
 }
 
+func doPlain(pkt nncp.Pkt, dump, decompress bool) {
+       if dump {
+               bufW := bufio.NewWriter(os.Stdout)
+               var r io.Reader
+               r = bufio.NewReader(os.Stdin)
+               if decompress {
+                       decompressor, err := zstd.NewReader(r)
+                       if err != nil {
+                               log.Fatalln(err)
+                       }
+                       r = decompressor
+               }
+               if _, err := io.Copy(bufW, r); err != nil {
+                       log.Fatalln(err)
+               }
+               if err := bufW.Flush(); err != nil {
+                       log.Fatalln(err)
+               }
+               return
+       }
+       payloadType := "unknown"
+       switch pkt.Type {
+       case nncp.PktTypeFile:
+               payloadType = "file"
+       case nncp.PktTypeFreq:
+               payloadType = "file request"
+       case nncp.PktTypeExec:
+               payloadType = "exec compressed"
+       case nncp.PktTypeExecFat:
+               payloadType = "exec uncompressed"
+       case nncp.PktTypeTrns:
+               payloadType = "transitional"
+       }
+       var path string
+       switch pkt.Type {
+       case nncp.PktTypeExec, nncp.PktTypeExecFat:
+               path = string(bytes.Replace(
+                       pkt.Path[:pkt.PathLen], []byte{0}, []byte(" "), -1,
+               ))
+       case nncp.PktTypeTrns:
+               path = nncp.Base32Codec.EncodeToString(pkt.Path[:pkt.PathLen])
+       default:
+               path = string(pkt.Path[:pkt.PathLen])
+       }
+       fmt.Printf(
+               "Packet type: plain\nPayload type: %s\nNiceness: %s (%d)\nPath: %s\n",
+               payloadType, nncp.NicenessFmt(pkt.Nice), pkt.Nice, path,
+       )
+       return
+}
+
+func doEncrypted(pktEnc nncp.PktEnc, dump bool, cfgPath string, beginning []byte) {
+       ctx, err := nncp.CtxFromCmdline(cfgPath, "", "", false, false, false, false)
+       if err != nil {
+               log.Fatalln("Error during initialization:", err)
+       }
+       if !dump {
+               senderS := "unknown"
+               recipientS := "unknown"
+               if n, ok := ctx.Neigh[*pktEnc.Sender]; ok {
+                       senderS = n.Name
+               }
+               if n, ok := ctx.Neigh[*pktEnc.Recipient]; ok {
+                       recipientS = n.Name
+               }
+               fmt.Printf(
+                       "Packet type: encrypted\nNiceness: %s (%d)\nSender: %s (%s)\nRecipient: %s (%s)\n",
+                       nncp.NicenessFmt(pktEnc.Nice), pktEnc.Nice,
+                       pktEnc.Sender, senderS,
+                       pktEnc.Recipient, recipientS,
+               )
+               return
+       }
+       if ctx.Self == nil {
+               log.Fatalln("Config lacks private keys")
+       }
+       bufW := bufio.NewWriter(os.Stdout)
+       if _, _, err = nncp.PktEncRead(
+               ctx.Self,
+               ctx.Neigh,
+               io.MultiReader(
+                       bytes.NewReader(beginning),
+                       bufio.NewReader(os.Stdin),
+               ),
+               bufW,
+       ); err != nil {
+               log.Fatalln(err)
+       }
+       if err = bufW.Flush(); err != nil {
+               log.Fatalln(err)
+       }
+}
+
 func main() {
        var (
                overheads  = flag.Bool("overheads", false, "Print packet overheads")
@@ -71,99 +164,41 @@ func main() {
                return
        }
 
-       var err error
        beginning := make([]byte, nncp.PktOverhead)
-       if _, err = io.ReadFull(os.Stdin, beginning); err != nil {
+       if _, err := io.ReadFull(os.Stdin, beginning[:nncp.PktEncOverhead]); err != nil {
                log.Fatalln("Not enough data to read")
        }
-       var pkt nncp.Pkt
-       _, err = xdr.Unmarshal(bytes.NewReader(beginning), &pkt)
-       if err == nil && pkt.Magic == nncp.MagicNNCPPv3 {
-               if *dump {
-                       bufW := bufio.NewWriter(os.Stdout)
-                       var r io.Reader
-                       r = bufio.NewReader(os.Stdin)
-                       if *decompress {
-                               decompressor, err := zstd.NewReader(r)
-                               if err != nil {
-                                       log.Fatalln(err)
-                               }
-                               r = decompressor
-                       }
-                       if _, err = io.Copy(bufW, r); err != nil {
-                               log.Fatalln(err)
-                       }
-                       if err = bufW.Flush(); err != nil {
-                               log.Fatalln(err)
-                       }
+       var pktEnc nncp.PktEnc
+       if _, err := xdr.Unmarshal(bytes.NewReader(beginning), &pktEnc); err == nil {
+               switch pktEnc.Magic {
+               case nncp.MagicNNCPEv1.B:
+                       log.Fatalln(nncp.MagicNNCPEv1.TooOld())
+               case nncp.MagicNNCPEv2.B:
+                       log.Fatalln(nncp.MagicNNCPEv2.TooOld())
+               case nncp.MagicNNCPEv3.B:
+                       log.Fatalln(nncp.MagicNNCPEv3.TooOld())
+               case nncp.MagicNNCPEv4.B:
+                       log.Fatalln(nncp.MagicNNCPEv4.TooOld())
+               case nncp.MagicNNCPEv5.B:
+                       doEncrypted(pktEnc, *dump, *cfgPath, beginning[:nncp.PktEncOverhead])
                        return
                }
-               payloadType := "unknown"
-               switch pkt.Type {
-               case nncp.PktTypeFile:
-                       payloadType = "file"
-               case nncp.PktTypeFreq:
-                       payloadType = "file request"
-               case nncp.PktTypeExec:
-                       payloadType = "exec"
-               case nncp.PktTypeExecFat:
-                       payloadType = "exec uncompressed"
-               case nncp.PktTypeTrns:
-                       payloadType = "transitional"
-               }
-               var path string
-               switch pkt.Type {
-               case nncp.PktTypeExec, nncp.PktTypeExecFat:
-                       path = string(bytes.Replace(
-                               pkt.Path[:pkt.PathLen],
-                               []byte{0},
-                               []byte(" "),
-                               -1,
-                       ))
-               case nncp.PktTypeTrns:
-                       path = nncp.Base32Codec.EncodeToString(pkt.Path[:pkt.PathLen])
-               default:
-                       path = string(pkt.Path[:pkt.PathLen])
-               }
-               fmt.Printf(
-                       "Packet type: plain\nPayload type: %s\nNiceness: %s (%d)\nPath: %s\n",
-                       payloadType, nncp.NicenessFmt(pkt.Nice), pkt.Nice, path,
-               )
-               return
        }
-       var pktEnc nncp.PktEnc
-       _, err = xdr.Unmarshal(bytes.NewReader(beginning), &pktEnc)
-       if err == nil && pktEnc.Magic == nncp.MagicNNCPEv4 {
-               if *dump {
-                       ctx, err := nncp.CtxFromCmdline(*cfgPath, "", "", false, false, false, false)
-                       if err != nil {
-                               log.Fatalln("Error during initialization:", err)
-                       }
-                       if ctx.Self == nil {
-                               log.Fatalln("Config lacks private keys")
-                       }
-                       bufW := bufio.NewWriter(os.Stdout)
-                       if _, _, err = nncp.PktEncRead(
-                               ctx.Self,
-                               ctx.Neigh,
-                               io.MultiReader(
-                                       bytes.NewReader(beginning),
-                                       bufio.NewReader(os.Stdin),
-                               ),
-                               bufW,
-                       ); err != nil {
-                               log.Fatalln(err)
-                       }
-                       if err = bufW.Flush(); err != nil {
-                               log.Fatalln(err)
-                       }
+
+       if _, err := io.ReadFull(os.Stdin, beginning[nncp.PktEncOverhead:]); err != nil {
+               log.Fatalln("Not enough data to read")
+       }
+       var pkt nncp.Pkt
+       if _, err := xdr.Unmarshal(bytes.NewReader(beginning), &pkt); err == nil {
+               switch pkt.Magic {
+               case nncp.MagicNNCPPv1.B:
+                       log.Fatalln(nncp.MagicNNCPPv1.TooOld())
+               case nncp.MagicNNCPPv2.B:
+                       log.Fatalln(nncp.MagicNNCPPv2.TooOld())
+               case nncp.MagicNNCPPv3.B:
+                       doPlain(pkt, *dump, *decompress)
                        return
                }
-               fmt.Printf(
-                       "Packet type: encrypted\nNiceness: %s (%d)\nSender: %s\nRecipient: %s\n",
-                       nncp.NicenessFmt(pktEnc.Nice), pktEnc.Nice, pktEnc.Sender, pktEnc.Recipient,
-               )
-               return
        }
        log.Fatalln("Unable to determine packet type")
 }