1
0
mirror of https://github.com/vwxyzjn/portwarden synced 2026-01-03 07:33:13 +00:00

API-1 # Use POST request to backup portwarden files

This commit is contained in:
Costa Huang
2018-11-16 17:31:06 -05:00
parent 1f91de1dae
commit 368f2c7ef7
5 changed files with 56 additions and 109 deletions

10
core.go
View File

@@ -51,6 +51,7 @@ type LoginCredentials struct {
}
func CreateBackupFile(fileName, passphrase, sessionKey string, sleepMilliseconds int) error {
defer BWLogout()
if !strings.HasSuffix(fileName, ".portwarden") {
fileName += ".portwarden"
}
@@ -191,9 +192,10 @@ func BWLoginGetSessionKey(lc *LoginCredentials) (string, error) {
return "", err
}
sessionKey := stdout.String()
cmd = exec.Command("bw", "logout")
if err := cmd.Run(); err != nil {
return "", err
}
return sessionKey, nil
}
func BWLogout() error {
cmd := exec.Command("bw", "logout")
return cmd.Run()
}

View File

@@ -0,0 +1,34 @@
package controllers
import (
"fmt"
"net/http"
"github.com/davecgh/go-spew/spew"
"github.com/gin-gonic/gin"
"github.com/vwxyzjn/portwarden"
"github.com/vwxyzjn/portwarden/web/models"
)
func EncryptBackupController(c *gin.Context) {
var bi models.BackupInfo
if err := c.ShouldBindJSON(&bi); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
spew.Dump(&bi.BitwardenLoginCredentials)
sessionKey, err := portwarden.BWLoginGetSessionKey(&bi.BitwardenLoginCredentials)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
fmt.Println(sessionKey)
err = portwarden.CreateBackupFile(bi.FileNamePrefix, bi.Passphrase, sessionKey, models.BackupDefaultSleepMilliseconds)
if err != nil {
panic(err)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
}

View File

@@ -1,104 +0,0 @@
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
}

15
web/models/backup.go Normal file
View File

@@ -0,0 +1,15 @@
package models
import (
"github.com/vwxyzjn/portwarden"
)
const (
BackupDefaultSleepMilliseconds = 300
)
type BackupInfo struct {
FileNamePrefix string `json:"filename_prefix"`
Passphrase string `json:"passphrase"`
BitwardenLoginCredentials portwarden.LoginCredentials `json:"bitwarden_login_credentials"`
}

View File

@@ -14,7 +14,7 @@ func main() {
http.ServeFile(c.Writer, c.Request, "index.html")
})
r.GET("/ws", controllers.EncryptBackupController)
r.POST("/encrypt", controllers.EncryptBackupController)
r.Run(":5000")
}