aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2018-12-08 09:34:00 -0800
committerChristine Dodrill <me@christine.website>2018-12-08 09:34:00 -0800
commitceec35812913a70f94029c7933428ab79ca34db0 (patch)
tree0fbb9368dd7c346ab4f3f9b19e6eac2ff53f01ac /internal
parent28e2d4e4ca734e6b5ffbc07d4f4631c02b003ea9 (diff)
downloadx-ceec35812913a70f94029c7933428ab79ca34db0.tar.xz
x-ceec35812913a70f94029c7933428ab79ca34db0.zip
rescue glue
Diffstat (limited to 'internal')
-rw-r--r--internal/gluaexpect/expect.go35
-rw-r--r--internal/gluasimplebox/sb.go100
2 files changed, 135 insertions, 0 deletions
diff --git a/internal/gluaexpect/expect.go b/internal/gluaexpect/expect.go
new file mode 100644
index 0000000..b7e57d4
--- /dev/null
+++ b/internal/gluaexpect/expect.go
@@ -0,0 +1,35 @@
+package gluaexpect
+
+import (
+ "github.com/ThomasRooney/gexpect"
+ luar "github.com/layeh/gopher-luar"
+ lua "github.com/yuin/gopher-lua"
+)
+
+func Preload(L *lua.LState) {
+ L.PreloadModule("expect", Loader)
+}
+
+// Loader is the module loader function.
+func Loader(L *lua.LState) int {
+ mod := L.SetFuncs(L.NewTable(), api)
+ L.Push(mod)
+ return 1
+}
+
+var api = map[string]lua.LGFunction{
+ "spawn": spawn,
+}
+
+func spawn(L *lua.LState) int {
+ cmd := L.CheckString(1)
+ child, err := gexpect.Spawn(cmd)
+ if err != nil {
+ L.Push(lua.LNil)
+ L.Push(lua.LString(err.Error()))
+ return 2
+ }
+
+ L.Push(luar.New(L, child))
+ return 1
+}
diff --git a/internal/gluasimplebox/sb.go b/internal/gluasimplebox/sb.go
new file mode 100644
index 0000000..cbb707e
--- /dev/null
+++ b/internal/gluasimplebox/sb.go
@@ -0,0 +1,100 @@
+package gluasimplebox
+
+import (
+ "crypto/rand"
+ "encoding/base64"
+ "encoding/hex"
+ "errors"
+
+ "github.com/brandur/simplebox"
+ luar "github.com/layeh/gopher-luar"
+ lua "github.com/yuin/gopher-lua"
+)
+
+func Preload(L *lua.LState) {
+ L.PreloadModule("simplebox", Loader)
+}
+
+// Loader is the module loader function.
+func Loader(L *lua.LState) int {
+ mod := L.SetFuncs(L.NewTable(), api)
+ L.Push(mod)
+ return 1
+}
+
+var api = map[string]lua.LGFunction{
+ "new": newSecretBox,
+ "genkey": genKey,
+}
+
+func newSecretBox(L *lua.LState) int {
+ key := L.CheckString(1)
+
+ k, err := parseKey(key)
+ if err != nil {
+ L.Push(lua.LNil)
+ L.Push(lua.LString(err.Error()))
+ return 2
+ }
+
+ sb := simplebox.NewFromSecretKey(k)
+
+ L.Push(luar.New(L, &box{sb: sb}))
+ return 1
+}
+
+func genKey(L *lua.LState) int {
+ key, err := generateKey()
+ if err != nil {
+ L.Push(lua.LNil)
+ L.Push(lua.LString(err.Error()))
+ return 2
+ }
+
+ L.Push(lua.LString(base64.URLEncoding.EncodeToString(key[:])))
+ return 1
+}
+
+func generateKey() (*[32]byte, error) {
+ var k [32]byte
+ _, err := rand.Read(k[:])
+ if err != nil {
+ return nil, err
+ }
+ return &k, nil
+}
+
+func parseKey(s string) (*[32]byte, error) {
+ k := &[32]byte{}
+ raw, err := base64.URLEncoding.DecodeString(s)
+ if err != nil {
+ return nil, err
+ }
+ if n := copy(k[:], raw); n < len(k) {
+ return nil, errors.New("not valid")
+ }
+ return k, nil
+}
+
+type box struct {
+ sb *simplebox.SimpleBox
+}
+
+func (b *box) Encrypt(data string) string {
+ result := b.sb.Encrypt([]byte(data))
+ return hex.EncodeToString(result)
+}
+
+func (b *box) Decrypt(data string) (string, error) {
+ d, err := hex.DecodeString(data)
+ if err != nil {
+ return "", err
+ }
+
+ plain, err := b.sb.Decrypt([]byte(d))
+ if err != nil {
+ return "", err
+ }
+
+ return string(plain), nil
+}