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:
10
core.go
10
core.go
@@ -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()
|
||||
}
|
||||
|
||||
34
web/controllers/backup_controller.go
Normal file
34
web/controllers/backup_controller.go
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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
15
web/models/backup.go
Normal 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"`
|
||||
}
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user