diff --git a/src/main.go b/src/main.go index 4d5fb4f..a002890 100644 --- a/src/main.go +++ b/src/main.go @@ -1,6 +1,7 @@ package main import ( + "bufio" "bytes" "encoding/base64" "encoding/json" @@ -126,7 +127,7 @@ func send(c *gin.Context, attachmentTmpDir string, signalCliConfig string, numbe cmd = append(cmd, attachmentTmpPaths...) } - _, err := runSignalCli(cmd) + _, err := runSignalCli(true, cmd) if err != nil { cleanupTmpFiles(attachmentTmpPaths) c.JSON(400, gin.H{"error": err.Error()}) @@ -138,7 +139,7 @@ func send(c *gin.Context, attachmentTmpDir string, signalCliConfig string, numbe func getGroups(number string, signalCliConfig string) ([]GroupEntry, error) { groupEntries := []GroupEntry{} - out, err := runSignalCli([]string{"--config", signalCliConfig, "-u", number, "listGroups", "-d"}) + out, err := runSignalCli(true, []string{"--config", signalCliConfig, "-u", number, "listGroups", "-d"}) if err != nil { return groupEntries, err } @@ -195,35 +196,47 @@ func getGroups(number string, signalCliConfig string) ([]GroupEntry, error) { return groupEntries, nil } -func runSignalCli(args []string) (string, error) { +func runSignalCli(wait bool, args []string) (string, error) { cmd := exec.Command("signal-cli", args...) - var errBuffer bytes.Buffer - var outBuffer bytes.Buffer - cmd.Stderr = &errBuffer - cmd.Stdout = &outBuffer + if wait { + var errBuffer bytes.Buffer + var outBuffer bytes.Buffer + cmd.Stderr = &errBuffer + cmd.Stdout = &outBuffer - err := cmd.Start() - if err != nil { - return "", err - } - - done := make(chan error, 1) - go func() { - done <- cmd.Wait() - }() - select { - case <-time.After(60 * time.Second): - err := cmd.Process.Kill() + err := cmd.Start() if err != nil { return "", err } - return "", errors.New("process killed as timeout reached") - case err := <-done: - if err != nil { - return "", errors.New(errBuffer.String()) + + done := make(chan error, 1) + + go func() { + done <- cmd.Wait() + }() + select { + case <-time.After(60 * time.Second): + err := cmd.Process.Kill() + if err != nil { + return "", err + } + return "", errors.New("process killed as timeout reached") + case err := <-done: + if err != nil { + return "", errors.New(errBuffer.String()) + } } + return outBuffer.String(), nil + } else { + stdout, err := cmd.StdoutPipe() + if err != nil { + log.Fatal(err) + } + cmd.Start() + buf := bufio.NewReader(stdout) // Notice that this is not in a loop + line, _, _ := buf.ReadLine() + return string(line), nil } - return outBuffer.String(), nil } func main() { @@ -244,6 +257,25 @@ func main() { c.JSON(200, about) }) + router.POST("/v1/link/:device_name", func(c *gin.Context) { + device_name := c.Param("device_name") + log.Info("Linking device") + if device_name == "" { + c.JSON(400, gin.H{"error": "Please provide a name for the device"}) + return + } + + command := []string{"--config", *signalCliConfig, "link", "-n", device_name} + + out, err := runSignalCli(false, command) + if err != nil { + c.JSON(400, gin.H{"error": err.Error()}) + return + } + + c.String(200, string(out)) + }) + router.POST("/v1/register/:number", func(c *gin.Context) { number := c.Param("number") @@ -277,7 +309,7 @@ func main() { command = append(command, "--voice") } - _, err := runSignalCli(command) + _, err := runSignalCli(true, command) if err != nil { c.JSON(400, gin.H{"error": err.Error()}) return @@ -299,7 +331,7 @@ func main() { return } - _, err := runSignalCli([]string{"--config", *signalCliConfig, "-u", number, "verify", token}) + _, err := runSignalCli(true, []string{"--config", *signalCliConfig, "-u", number, "verify", token}) if err != nil { c.JSON(400, gin.H{"error": err.Error()}) return @@ -384,7 +416,7 @@ func main() { number := c.Param("number") command := []string{"--config", *signalCliConfig, "-u", number, "receive", "-t", "1", "--json"} - out, err := runSignalCli(command) + out, err := runSignalCli(true, command) if err != nil { c.JSON(400, gin.H{"error": err.Error()}) return @@ -424,7 +456,7 @@ func main() { cmd := []string{"--config", *signalCliConfig, "-u", number, "updateGroup", "-n", req.Name, "-m"} cmd = append(cmd, req.Members...) - out, err := runSignalCli(cmd) + out, err := runSignalCli(true, cmd) if err != nil { c.JSON(400, gin.H{"error": err.Error()}) return @@ -461,7 +493,7 @@ func main() { return } - _, err = runSignalCli([]string{"--config", *signalCliConfig, "-u", number, "quitGroup", "-g", string(groupId)}) + _, err = runSignalCli(true, []string{"--config", *signalCliConfig, "-u", number, "quitGroup", "-g", string(groupId)}) if err != nil { c.JSON(400, gin.H{"error": err.Error()}) return