-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdecoder.go
More file actions
73 lines (68 loc) · 1.74 KB
/
decoder.go
File metadata and controls
73 lines (68 loc) · 1.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main
import (
"bufio"
"bytes"
"encoding/base64"
"flag"
"fmt"
"io"
"log"
"os"
)
func NewDoubleDecoder() *doubleDecoder {
return new(doubleDecoder)
}
func (d *doubleDecoder) Start() error {
fileName := flag.String("file", "", "Filename to open")
minLength := flag.Int("minLength", 6, "The minimum length of a potential base64 string to decode")
asciiOnly := flag.Bool("asciiOnly", true, "Only return ASII printable characters?")
buffSize := flag.Int("buffSize", 128*1024*1024, "Size of buffer to use in bytes")
flag.Parse()
if *fileName == "" {
log.Printf("Please specify a file to open with -file")
flag.Usage()
os.Exit(1)
}
d.cfg = &config{
fileName: *fileName,
minLength: *minLength,
asciiOnly: *asciiOnly,
buffSize: *buffSize,
}
f, err := os.Open(d.cfg.fileName)
if err != nil {
return err
}
d.Scan(bufio.NewReader(f))
return nil
}
func (d *doubleDecoder) Scan(r io.Reader) error {
var outerBuff, innerBuff []byte
outerScanner := bufio.NewScanner(r)
outerScanner.Buffer(outerBuff, d.cfg.buffSize)
outerScanner.Split(bufio.ScanWords)
for outerScanner.Scan() {
innerScanner := bufio.NewScanner(bytes.NewReader(outerScanner.Bytes()))
innerScanner.Buffer(innerBuff, d.cfg.buffSize)
innerScanner.Split(splitFunc)
for innerScanner.Scan() {
if innerScanner.Text() != empty && len(innerScanner.Text()) >= d.cfg.minLength {
d.decodeString(innerScanner.Text())
}
}
}
return nil
}
func (d *doubleDecoder) decodeString(s string) error {
inner, err := base64.StdEncoding.DecodeString(s)
if err == nil {
if len(inner) > d.cfg.minLength {
if isASCII(string(inner)) && d.cfg.asciiOnly {
log.Printf(decodingStr, s)
fmt.Println(string(inner))
d.Scan(bytes.NewReader(inner))
}
}
}
return err
}