WIP captcha helper support
This commit is contained in:
parent
890417af5d
commit
75d601bdca
1 changed files with 103 additions and 6 deletions
|
@ -18,9 +18,11 @@ package send
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -30,7 +32,11 @@ import (
|
||||||
|
|
||||||
"gitlab.com/signald/signald-go/cmd/signaldctl/common"
|
"gitlab.com/signald/signald-go/cmd/signaldctl/common"
|
||||||
"gitlab.com/signald/signald-go/cmd/signaldctl/config"
|
"gitlab.com/signald/signald-go/cmd/signaldctl/config"
|
||||||
"gitlab.com/signald/signald-go/signald/client-protocol/v1"
|
v1 "gitlab.com/signald/signald-go/signald/client-protocol/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
CAPTCHA_HELPER = "signal-captcha-helper"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -39,6 +45,7 @@ var (
|
||||||
toGroup string
|
toGroup string
|
||||||
attachments []string
|
attachments []string
|
||||||
message string
|
message string
|
||||||
|
captchaHelper bool
|
||||||
|
|
||||||
SendMessageCmd = &cobra.Command{
|
SendMessageCmd = &cobra.Command{
|
||||||
Use: "send {group id | phone number} [message]",
|
Use: "send {group id | phone number} [message]",
|
||||||
|
@ -97,6 +104,48 @@ var (
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("error sending request to signald: ", err)
|
log.Fatal("error sending request to signald: ", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resends := []*v1.JsonAddress{}
|
||||||
|
|
||||||
|
for _, result := range resp.Results {
|
||||||
|
if result.ProofRequiredFailure != nil {
|
||||||
|
if captchaHelper {
|
||||||
|
err = runCaptchaHelper(result.ProofRequiredFailure.Token)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("error running captcha helper: ", err)
|
||||||
|
}
|
||||||
|
resends = append(resends, result.Address)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(resends) > 0 {
|
||||||
|
resendReq := v1.SendRequest{
|
||||||
|
Username: req.Username,
|
||||||
|
MessageBody: req.MessageBody,
|
||||||
|
Attachments: req.Attachments,
|
||||||
|
RecipientGroupID: req.RecipientGroupID,
|
||||||
|
Members: resends,
|
||||||
|
Timestamp: resp.Timestamp,
|
||||||
|
}
|
||||||
|
resendResponse, err := resendReq.Submit(common.Signald)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("error resending messages: ", err)
|
||||||
|
} else {
|
||||||
|
for i, originalResult := range resp.Results {
|
||||||
|
if originalResult.ProofRequiredFailure == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, result := range resendResponse.Results {
|
||||||
|
if result.Address.UUID == originalResult.Address.UUID {
|
||||||
|
resp.Results[i] = result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch common.OutputFormat {
|
switch common.OutputFormat {
|
||||||
case common.OutputFormatJSON:
|
case common.OutputFormatJSON:
|
||||||
err := json.NewEncoder(os.Stdout).Encode(resp)
|
err := json.NewEncoder(os.Stdout).Encode(resp)
|
||||||
|
@ -148,7 +197,55 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func runCaptchaHelper(challenge string) error {
|
||||||
|
if !captchaHelper {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := exec.LookPath(CAPTCHA_HELPER)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.Command(CAPTCHA_HELPER, "--challenge")
|
||||||
|
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
captchaToken := new(strings.Builder)
|
||||||
|
_, err = io.Copy(captchaToken, stdout)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cmd.Wait()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
req := v1.SubmitChallengeRequest{
|
||||||
|
Account: account,
|
||||||
|
CaptchaToken: captchaToken.String(),
|
||||||
|
Challenge: challenge,
|
||||||
|
}
|
||||||
|
|
||||||
|
err = req.Submit(common.Signald)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
SendMessageCmd.Flags().StringVarP(&account, "account", "a", "", "local account to use")
|
SendMessageCmd.Flags().StringVarP(&account, "account", "a", "", "local account to use")
|
||||||
|
SendMessageCmd.Flags().BoolVarP(&captchaHelper, "captcha-helper", "c", false, "Invoke signal-captcha-helper and process the response when a push challenge response appears. After completing the challenge, the message will be redelivered to the failed recipient")
|
||||||
SendMessageCmd.Flags().StringSliceVarP(&attachments, "attachment", "A", []string{}, "attach a file to your outbound message. may be specified multiple times.")
|
SendMessageCmd.Flags().StringSliceVarP(&attachments, "attachment", "A", []string{}, "attach a file to your outbound message. may be specified multiple times.")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue