Change URI for linking device

Change the logic from having a POST which will create a unique id and return it
then have to create a QR code out of it, to a direct GET end point which will
return the QR code directly.
This commit is contained in:
Danijel Fischer
2020-06-23 14:09:56 +02:00
parent b06dd9afb4
commit 458974dd7c
2 changed files with 74 additions and 91 deletions

View File

@@ -2,13 +2,11 @@
This project creates a small dockerized REST API around [signal-cli](https://github.com/AsamK/signal-cli). This project creates a small dockerized REST API around [signal-cli](https://github.com/AsamK/signal-cli).
At the moment, the following functionality is exposed via REST: At the moment, the following functionality is exposed via REST:
* Register a number - Register a number
* Verify the number using the code received via SMS - Verify the number using the code received via SMS
* Send message (+ attachment) to multiple recipients - Send message (+ attachment) to multiple recipients
## Examples ## Examples
@@ -29,115 +27,104 @@ services:
Sample REST API calls: Sample REST API calls:
* Register a number (with SMS verification) - Register a number (with SMS verification)
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/<number>'``` `curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/<number>'`
e.g: e.g:
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/+431212131491291'``` `curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/+431212131491291'`
* Register a number (with voice verification) - Register a number (with voice verification)
```curl -X POST -H "Content-Type: application/json" --data '{"use_voice": true}' 'http://127.0.0.1:8080/v1/register/<number>'``` `curl -X POST -H "Content-Type: application/json" --data '{"use_voice": true}' 'http://127.0.0.1:8080/v1/register/<number>'`
e.g: e.g:
```curl -X POST -H "Content-Type: application/json" --data '{"use_voice": true}' 'http://127.0.0.1:8080/v1/register/+431212131491291'``` `curl -X POST -H "Content-Type: application/json" --data '{"use_voice": true}' 'http://127.0.0.1:8080/v1/register/+431212131491291'`
* Verify the number using the code received via SMS/voice - Verify the number using the code received via SMS/voice
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/<number>/verify/<verification code>'``` `curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/<number>/verify/<verification code>'`
e.g: e.g:
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/+431212131491291/verify/123-456'``` `curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/register/+431212131491291/verify/123-456'`
* Send a message to multiple recipients - Send a message to multiple recipients
```curl -X POST -H "Content-Type: application/json" -d '{"message": "<message>", "number": "<number>", "recipients": ["<recipient1>", "<recipient2>"]}' 'http://127.0.0.1:8080/v2/send'``` `curl -X POST -H "Content-Type: application/json" -d '{"message": "<message>", "number": "<number>", "recipients": ["<recipient1>", "<recipient2>"]}' 'http://127.0.0.1:8080/v2/send'`
e.g: e.g:
```curl -X POST -H "Content-Type: application/json" -d '{"message": "Hello World!", "number": "+431212131491291", "recipients": ["+4354546464654", "+4912812812121"]}' 'http://127.0.0.1:8080/v2/send'``` `curl -X POST -H "Content-Type: application/json" -d '{"message": "Hello World!", "number": "+431212131491291", "recipients": ["+4354546464654", "+4912812812121"]}' 'http://127.0.0.1:8080/v2/send'`
* Send a message (+ base64 encoded attachment) to multiple recipients - Send a message (+ base64 encoded attachment) to multiple recipients
```curl -X POST -H "Content-Type: application/json" -d '{"message": "<message>", "base64_attachments": ["<base64 encoded attachment>"], "number": "<number>", "recipients": ["<recipient1>", "<recipient2>"]}' 'http://127.0.0.1:8080/v2/send'``` `curl -X POST -H "Content-Type: application/json" -d '{"message": "<message>", "base64_attachments": ["<base64 encoded attachment>"], "number": "<number>", "recipients": ["<recipient1>", "<recipient2>"]}' 'http://127.0.0.1:8080/v2/send'`
* Send a message to a group - Send a message to a group
The group id can be obtained via the "List groups" REST call. The group id can be obtained via the "List groups" REST call.
```curl -X POST -H "Content-Type: application/json" -d '{"message": "<message>", "number": "<number>", "recipients": ["<group id>"]}' 'http://127.0.0.1:8080/v2/send'``` `curl -X POST -H "Content-Type: application/json" -d '{"message": "<message>", "number": "<number>", "recipients": ["<group id>"]}' 'http://127.0.0.1:8080/v2/send'`
e.g: e.g:
```curl -X POST -H "Content-Type: application/json" -d '{"message": "Hello World!", "number": "+431212131491291", "recipients": ["group.ckRzaEd4VmRzNnJaASAEsasa", "+4912812812121"]}' 'http://127.0.0.1:8080/v2/send'``` `curl -X POST -H "Content-Type: application/json" -d '{"message": "Hello World!", "number": "+431212131491291", "recipients": ["group.ckRzaEd4VmRzNnJaASAEsasa", "+4912812812121"]}' 'http://127.0.0.1:8080/v2/send'`
* Receive messages - Receive messages
Fetch all new messages in the inbox of the specified number. Fetch all new messages in the inbox of the specified number.
```curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/receive/<number>'``` `curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/receive/<number>'`
e.g: e.g:
```curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/receive/+431212131491291'``` `curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/receive/+431212131491291'`
* Create a new group - Create a new group
Create a new group with the specified name and members. Create a new group with the specified name and members.
```curl -X POST -H "Content-Type: application/json" -d '{"name": "<group name>", "members": ["<member1>", "<member2>"]}' 'http://127.0.0.1:8080/v1/groups/<number>'``` `curl -X POST -H "Content-Type: application/json" -d '{"name": "<group name>", "members": ["<member1>", "<member2>"]}' 'http://127.0.0.1:8080/v1/groups/<number>'`
e.g: e.g:
```curl -X POST -H "Content-Type: application/json" -d '{"name": "my group", "members": ["+4354546464654", "+4912812812121"]}' 'http://127.0.0.1:8080/v1/groups/+431212131491291'``` `curl -X POST -H "Content-Type: application/json" -d '{"name": "my group", "members": ["+4354546464654", "+4912812812121"]}' 'http://127.0.0.1:8080/v1/groups/+431212131491291'`
* List groups - List groups
```curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/<number>'``` `curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/<number>'`
e.g: e.g:
```curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/+431212131491291'``` `curl -X GET -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/+431212131491291'`
* Delete a group - Delete a group
Delete the group with the given group id. The group id can be obtained via the "List groups" REST call. Delete the group with the given group id. The group id can be obtained via the "List groups" REST call.
```curl -X DELETE -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/<number>/<group id>'``` `curl -X DELETE -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/<number>/<group id>'`
e.g: e.g:
```curl -X DELETE -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/+431212131491291/ckRzaEd4VmRzNnJaASAEsasa'``` `curl -X DELETE -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/groups/+431212131491291/ckRzaEd4VmRzNnJaASAEsasa'`
- Link a device
* Link a device `curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/qrcodelink?<device name>'`
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/link/<name>'```
e.g: e.g:
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/link/HomeAssistant'``` `curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/qrcodelink?HomeAssistant'`
This provides a tsdevice link which have to be converted to a QR-Code. For this the endpoint /v1/qrcode/<tsdevice_link> ca be used.
* Get QR Code
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/qrcode/<tsdevice_link>'```
e.g:
```curl -X POST -H "Content-Type: application/json" 'http://127.0.0.1:8080/v1/qrcode/tsdevice:?uuid=ZiVIV..'```
This provides a QR-Code image. In case of an error a JSON object will be returned. This provides a QR-Code image. In case of an error a JSON object will be returned.
Due to security reason of Signal, the provided QR-Code will change with each request.
The following REST API endpoints are **deprecated and no longer maintained!** The following REST API endpoints are **deprecated and no longer maintained!**
```/v1/send``` `/v1/send`
In case you need more functionality, please **file a ticket** or **create a PR** In case you need more functionality, please **file a ticket** or **create a PR**

View File

@@ -257,23 +257,6 @@ func main() {
c.JSON(200, about) c.JSON(200, about)
}) })
router.POST("/v1/link/:device_name", func(c *gin.Context) {
deviceName := c.Param("device_name")
if deviceName == "" {
c.JSON(400, gin.H{"error": "Please provide a name for the device"})
return
}
command := []string{"--config", *signalCliConfig, "link", "-n", deviceName}
out, err := runSignalCli(false, command)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{"uri": string(out)})
})
router.POST("/v1/register/:number", func(c *gin.Context) { router.POST("/v1/register/:number", func(c *gin.Context) {
number := c.Param("number") number := c.Param("number")
@@ -498,10 +481,23 @@ func main() {
} }
}) })
router.GET("/v1/qrcode/:tsdevice_link", func(c *gin.Context) { router.GET("/v1/qrcodelink", func(c *gin.Context) {
deviceLink := c.Param("tsdevice_link") deviceName := c.Query("device_name")
q, err := qrcode.New(deviceLink, qrcode.Medium) if deviceName == "" {
c.JSON(400, gin.H{"error": "Please provide a name for the device"})
return
}
command := []string{"--config", *signalCliConfig, "link", "-n", deviceName}
tsdeviceLink, err := runSignalCli(false, command)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
q, err := qrcode.New(string(tsdeviceLink), qrcode.Medium)
if err != nil { if err != nil {
c.JSON(400, gin.H{"error": err.Error()}) c.JSON(400, gin.H{"error": err.Error()})
} }