From d553accc3eca008f2948d047aa85b31f9eb8cfda Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Tue, 20 Jul 2021 00:37:59 +0300 Subject: [PATCH] Tiny refactor --- contrib/paster | 21 ++++++---- contrib/paster-tls | 2 +- main.go | 95 +++++++++++++++++++--------------------------- 3 files changed, 53 insertions(+), 65 deletions(-) diff --git a/contrib/paster b/contrib/paster index 99c7365..64f8c79 100755 --- a/contrib/paster +++ b/contrib/paster @@ -1,8 +1,15 @@ #!/bin/sh -e -CMD=${CMD:-nc paster.example.com 2020} -tmp=`mktemp` -trap "rm -f $tmp" HUP PIPE INT QUIT TERM EXIT -cat > $tmp -size=`perl -e 'print -s $ARGV[0]' $tmp` -[ $# -eq 0 ] || ext="1:e${#1}:$1" -( printf "d${ext}1:v${size}:" ; cat $tmp ; printf "e" ) | $CMD +DST=${DST:-nc paster.example.com 2020} +if [ -s "$1" ]; then + src="$1" + bn="${1##*/}" + _ext="${bn##*.}" + [ "$bn" = "$_ext" ] || ext="1:e${#_ext}:$_ext" +else + src=`mktemp` + trap "rm -f $src" HUP PIPE INT QUIT TERM EXIT + cat > $src + [ $# -eq 0 ] || ext="1:e${#1}:$1" +fi +size=`perl -e 'print -s $ARGV[0]' $src` +( echo -n "d${ext}1:v${size}:" ; cat $src ; echo -n e ) | $DST diff --git a/contrib/paster-tls b/contrib/paster-tls index 17b50cb..e091bfd 100755 --- a/contrib/paster-tls +++ b/contrib/paster-tls @@ -1,2 +1,2 @@ #!/bin/sh -CMD="gnutls-cli --logfile=/dev/null -p 2021 paster.example.com" paster +DST="gnutls-cli --logfile=/dev/null -p 2021 paster.example.com" paster $@ diff --git a/main.go b/main.go index 9cb209a..855fb14 100644 --- a/main.go +++ b/main.go @@ -24,16 +24,19 @@ import ( "crypto/sha512" "encoding/base32" "encoding/hex" - "errors" "flag" "fmt" "io" - "log" "os" "strconv" "time" ) +func fatal(s string) { + fmt.Println(s) + os.Exit(1) +} + func main() { maxSecs := flag.Uint("max-secs", 60, "Maximal time of aliveness (0=disable)") maxSize := flag.Uint64("max-size", 1<<20, "Maximal upload size") @@ -42,8 +45,6 @@ func main() { flag.PrintDefaults() } flag.Parse() - log.SetFlags(0) - log.SetOutput(os.Stdout) if len(flag.Args()) == 0 { flag.Usage() os.Exit(1) @@ -51,131 +52,107 @@ func main() { if *maxSecs > 0 { go func() { time.Sleep(time.Duration(*maxSecs) * time.Second) - log.Fatalln(errors.New("max aliveness time is reached")) + fatal("max aliveness time is reached") }() } r := bufio.NewReader(os.Stdin) b, err := r.ReadByte() if err != nil { - log.Fatalln(err) + fatal(err.Error()) } if b != 'd' { - log.Fatalln(errors.New("bad bencode: no dictionary start")) + fatal("bad bencode: no dictionary start") } buf := make([]byte, 21) ext := ".txt" var size uint64 AnotherKey: if _, err = io.ReadFull(r, buf[:3]); err != nil { - log.Fatalln(err) + fatal(err.Error()) } switch s := string(buf[:3]); s { case "1:e": if _, err = io.ReadFull(r, buf[:2]); err != nil { - log.Fatalln(err) + fatal(err.Error()) + } + if buf[1] != ':' { + fatal(`bad bencode: invalid "e" format`) } - extLen := 0 - switch s = string(buf[:2]); s { - case "1:": - extLen = 1 - case "2:": - extLen = 2 - case "3:": - extLen = 3 - case "4:": - extLen = 4 - case "5:": - extLen = 5 - case "6:": - extLen = 6 - case "7:": - extLen = 7 - case "8:": - extLen = 8 - case "9:": - extLen = 9 - default: - log.Fatalln(errors.New("bad bencode: invalid \"e\" length")) + extLen, err := strconv.Atoi(string(buf[:1])) + if err != nil { + fatal(err.Error()) } if _, err = io.ReadFull(r, buf[:extLen]); err != nil { - log.Fatalln(err) + fatal(err.Error()) } ext = "." + string(buf[:extLen]) goto AnotherKey case "1:v": n, err := r.Read(buf) if err != nil { - log.Fatalln(err) + fatal(err.Error()) } i := bytes.IndexByte(buf[:n], ':') if i == -1 { - log.Fatalln(errors.New("bad bencode: invalid \"v\" length")) + fatal(`bad bencode: invalid "v" length`) } size, err = strconv.ParseUint(string(buf[:i]), 10, 64) if err != nil { - log.Fatalln(err) + fatal(err.Error()) } if size == 0 { - log.Fatalln(errors.New("empty paste")) + fatal("empty paste") } if size > *maxSize { - log.Fatalln(errors.New("too big")) + fatal("too big") } buf = buf[i+1 : n] default: - log.Fatalln(errors.New("bad bencode: invalid key")) + fatal("bad bencode: invalid key") } rnd := make([]byte, 12) if _, err = io.ReadFull(rand.Reader, rnd); err != nil { - log.Fatalln(err) + fatal(err.Error()) } fn := "." + base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(rnd) + ext fd, err := os.OpenFile(fn, os.O_RDWR|os.O_CREATE|os.O_EXCL, os.FileMode(0666)) if err != nil { - log.Fatalln(err) + fatal(err.Error()) } h := sha512.New() bfd := bufio.NewWriter(fd) mr := io.MultiReader(bytes.NewReader(buf), r) mw := io.MultiWriter(bfd, h) if _, err = io.CopyN(mw, mr, int64(size-1)); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } if _, err = mr.Read(buf[:1]); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } if _, err = mw.Write(buf[:1]); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } if (ext == ".txt" || ext == ".url") && buf[0] != '\n' { if err = bfd.WriteByte('\n'); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } } if _, err = mr.Read(buf[:1]); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } if buf[0] != 'e' { os.Remove(fn) - log.Fatalln(errors.New("bad bencode: no dictionary end")) + fatal("bad bencode: no dictionary end") } if err = bfd.Flush(); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } if err = fd.Close(); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } if err = os.Rename(fn, fn[1:]); err != nil { - os.Remove(fn) - log.Fatalln(err) + goto Failed } for _, u := range flag.Args() { fmt.Println(u + fn[1:]) @@ -188,4 +165,8 @@ AnotherKey: os.Getenv("TCPREMOTEPORT"), fn[1:], size, ) + return +Failed: + os.Remove(fn) + fatal(err.Error()) } -- 2.44.0