1
0
mirror of https://github.com/vwxyzjn/portwarden synced 2026-01-05 16:43:13 +00:00
Files
portwarden/web/controllers/controller.go
2018-11-15 19:12:12 -05:00

105 lines
2.1 KiB
Go

package controllers
import (
"bytes"
"errors"
"fmt"
"os"
"os/exec"
"time"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
"github.com/vwxyzjn/portwarden"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func EncryptBackupController(c *gin.Context) {
conn, _ := upgrader.Upgrade(c.Writer, c.Request, nil) // error ignored for sake of simplicity
go func() {
for {
// Read message from browser
msgType, msg, err := conn.ReadMessage()
if err != nil {
return
}
// Print the message to the console
fmt.Printf("%s read:\n %d, %s", conn.RemoteAddr(), msgType, msg)
}
}()
_, err := BWGetSessionKey(conn)
if err != nil {
panic(err)
}
}
func DecryptBackupController(c *websocket.Conn, msg []byte) {
// return portwarden.DecryptBackup(fileName, passphrase)
}
func BWGetSessionKey(c *websocket.Conn) (string, error) {
sessionKey, err := BWUnlockVaultToGetSessionKey(c)
if err != nil {
if err.Error() == portwarden.BWErrNotLoggedIn {
sessionKey, err = BWLoginGetSessionKey(c)
if err != nil {
return "", err
}
} else {
return "", err
}
}
return sessionKey, err
}
func BWUnlockVaultToGetSessionKey(c *websocket.Conn) (string, error) {
cmd := exec.Command("bw", "unlock")
var stdout bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
if err := cmd.Start(); err != nil {
fmt.Println("An error occured: ", err)
}
cmd.Wait()
sessionKey, err := portwarden.ExtractSessionKey(stdout.String())
if err != nil {
return "", errors.New(string(stdout.Bytes()))
}
return sessionKey, nil
}
func BWLoginGetSessionKey(c *websocket.Conn) (string, error) {
cmd := exec.Command("bw", "login")
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
cmd.Stdin = os.Stdin
if err := cmd.Start(); err != nil {
return "", err
}
go func() {
time.Sleep(time.Millisecond * 500)
if err := c.WriteMessage(1, stderr.Bytes()); err != nil {
}
}()
cmd.Wait()
sessionKey, err := portwarden.ExtractSessionKey(stdout.String())
if err != nil {
return "", errors.New(string(stdout.Bytes()))
}
return sessionKey, nil
}