Merge branch 'master' into graalvm

This commit is contained in:
Bernhard B
2021-02-14 20:05:20 +01:00
12 changed files with 127 additions and 20 deletions

10
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@@ -0,0 +1,10 @@
---
name: Bug Report
about: Something doesn't work as expected.
title: ''
labels: ''
assignees: ''
---
Before creating an issue, please have a look at the Troubleshooting page: https://github.com/bbernhard/signal-cli-rest-api/blob/master/doc/TROUBLESHOOTING.md

View File

@@ -0,0 +1,11 @@
---
name: Feature Request
about: You have a neat idea that should be implemented?
title: ''
labels: ''
assignees: ''
---
### Feature Request
<!-- Fill in the relevant information below to help triage your issue. -->

View File

@@ -13,6 +13,8 @@ At the moment, the following functionality is exposed via REST:
- List/Serve/Delete attachments - List/Serve/Delete attachments
- Update profile - Update profile
and [many more](https://bbernhard.github.io/signal-cli-rest-api/)
## Examples ## Examples
Sample `docker-compose.yml`file: Sample `docker-compose.yml`file:

View File

@@ -17,6 +17,16 @@ 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'`
- Register a number (with captcha)
When you try to register a number, if you receive a response like `{"error":"Captcha required for verification (null)\n"}` then Signal is requiring a captcha. To register the number you must do the following:
1. Go to [https://signalcaptchas.org/registration/generate.html](https://signalcaptchas.org/registration/generate.html)
2. Open the developer console
3. Find the line that looks like this: `Prevented navigation to “signalcaptcha://{captcha value}” due to an unknown protocol.` Copy the captcha value
4. Use it to make the registration call like this:
`curl -X POST -H "Content-Type: application/json" -d '{"captcha":"{captcha value}"}' 'http://127.0.0.1:8080/v1/register/<number>`
- 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>'`

View File

@@ -57,6 +57,14 @@ 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'`
When you try to register a number, if you receive a response like `{"error":"Captcha required for verification (null)\n"}` then Signal is requiring a captcha. To register the number you must do the following:
1. Go to [https://signalcaptchas.org/registration/generate.html](https://signalcaptchas.org/registration/generate.html)
2. Open the developer console
3. Find the line that looks like this: `Prevented navigation to “signalcaptcha://{captcha value}” due to an unknown protocol.` Copy the captcha value
4. Use it to make the registration call like this:
`curl -X POST -H "Content-Type: application/json" -d '{"captcha":"{captcha value}"}' 'http://127.0.0.1:8080/v1/register/<number>`
## Sending messages to Signal Messenger groups ## Sending messages to Signal Messenger groups
The `signal-cli-rest-api` docker container is also capable of sending messages to a Signal Messenger group. The `signal-cli-rest-api` docker container is also capable of sending messages to a Signal Messenger group.
@@ -84,6 +92,10 @@ Next, use the following endpoint to obtain the group id:
The group id then needs to be added to the Signal Messenger's `recipients` list in the `configuration.yaml`. (see [here](https://www.home-assistant.io/integrations/signal_messenger/) for details) The group id then needs to be added to the Signal Messenger's `recipients` list in the `configuration.yaml`. (see [here](https://www.home-assistant.io/integrations/signal_messenger/) for details)
## API details
Details regarding API (in example for receiving messages through REST) can be found [here](https://bbernhard.github.io/signal-cli-rest-api/)
## Troubleshooting ## Troubleshooting
In case you've problems with the `signal-cli-rest-api` container, have a look [here](TROUBLESHOOTING.md) In case you've problems with the `signal-cli-rest-api` container, have a look [here](TROUBLESHOOTING.md)

View File

@@ -1,3 +1,11 @@
# The signal-cli-rest-api docker container won't start (signal_messenger_signal-cli-rest-api_1 exited with code 0) # The signal-cli-rest-api docker container won't start (signal_messenger_signal-cli-rest-api_1 exited with code 0)
If your docker container stops with `signal_messenger_signal-cli-rest-api_1 exited with code 0`, make sure that the host port isn't already occupied by another process (see [here](https://github.com/bbernhard/signal-cli-rest-api/issues/2)). If your docker container stops with `signal_messenger_signal-cli-rest-api_1 exited with code 0`, make sure that the host port isn't already occupied by another process (see [here](https://github.com/bbernhard/signal-cli-rest-api/issues/2)).
# Sending a message suceeds, but no message is sent
According to [this](https://github.com/AsamK/signal-cli/issues/202) signal-cli ticket here, the receive endpoint needs to be called regularily. So, if sending a message seems to work, but no message is sent, please try to call the [Receive API endpoint](https://bbernhard.github.io/signal-cli-rest-api/#/Messages/get_v1_receive__number_).
# Cannot send message to group - please first update your profile
If you get this message, it means that you first need to [update your profile](https://bbernhard.github.io/signal-cli-rest-api/#/Profiles/put_v1_profiles__number_) to set a name (and optionally an avatar).

View File

@@ -245,7 +245,7 @@ func send(c *gin.Context, attachmentTmpDir string, signalCliConfig string, numbe
} }
cleanupTmpFiles(attachmentTmpPaths) cleanupTmpFiles(attachmentTmpPaths)
c.JSON(201, nil) c.Writer.WriteHeader(201)
} }
func parseWhitespaceDelimitedKeyValueStringList(in string, keys []string) []map[string]string { func parseWhitespaceDelimitedKeyValueStringList(in string, keys []string) []map[string]string {
@@ -401,6 +401,7 @@ func (a *Api) About(c *gin.Context) {
// @Success 201 // @Success 201
// @Failure 400 {object} Error // @Failure 400 {object} Error
// @Param number path string true "Registered Phone Number" // @Param number path string true "Registered Phone Number"
// @Param data body RegisterNumberRequest false "Additional Settings"
// @Router /v1/register/{number} [post] // @Router /v1/register/{number} [post]
func (a *Api) RegisterNumber(c *gin.Context) { func (a *Api) RegisterNumber(c *gin.Context) {
number := c.Param("number") number := c.Param("number")
@@ -441,7 +442,7 @@ func (a *Api) RegisterNumber(c *gin.Context) {
c.JSON(400, gin.H{"error": err.Error()}) c.JSON(400, gin.H{"error": err.Error()})
return return
} }
c.JSON(201, nil) c.Writer.WriteHeader(201)
} }
// @Summary Verify a registered phone number. // @Summary Verify a registered phone number.
@@ -452,7 +453,7 @@ func (a *Api) RegisterNumber(c *gin.Context) {
// @Success 201 {string} string "OK" // @Success 201 {string} string "OK"
// @Failure 400 {object} Error // @Failure 400 {object} Error
// @Param number path string true "Registered Phone Number" // @Param number path string true "Registered Phone Number"
// @Param data body VerifyNumberSettings true "Additional Settings" // @Param data body VerifyNumberSettings false "Additional Settings"
// @Param token path string true "Verification Code" // @Param token path string true "Verification Code"
// @Router /v1/register/{number}/verify/{token} [post] // @Router /v1/register/{number}/verify/{token} [post]
func (a *Api) VerifyRegisteredNumber(c *gin.Context) { func (a *Api) VerifyRegisteredNumber(c *gin.Context) {
@@ -494,7 +495,7 @@ func (a *Api) VerifyRegisteredNumber(c *gin.Context) {
c.JSON(400, gin.H{"error": err.Error()}) c.JSON(400, gin.H{"error": err.Error()})
return return
} }
c.JSON(201, nil) c.Writer.WriteHeader(201)
} }
// @Summary Send a signal message. // @Summary Send a signal message.
@@ -1023,7 +1024,7 @@ func (a *Api) ListIdentities(c *gin.Context) {
// @Param data body TrustIdentityRequest true "Input Data" // @Param data body TrustIdentityRequest true "Input Data"
// @Param number path string true "Registered Phone Number" // @Param number path string true "Registered Phone Number"
// @Param numberToTrust path string true "Number To Trust" // @Param numberToTrust path string true "Number To Trust"
// @Router /v1/identities/{number}/{numberToTrust} [put] // @Router /v1/identities/{number}/trust/{numberToTrust} [put]
func (a *Api) TrustIdentity(c *gin.Context) { func (a *Api) TrustIdentity(c *gin.Context) {
number := c.Param("number") number := c.Param("number")

View File

@@ -19,7 +19,6 @@ var doc = `{
"description": "{{.Description}}", "description": "{{.Description}}",
"title": "{{.Title}}", "title": "{{.Title}}",
"contact": {}, "contact": {},
"license": {},
"version": "{{.Version}}" "version": "{{.Version}}"
}, },
"host": "{{.Host}}", "host": "{{.Host}}",
@@ -561,7 +560,7 @@ var doc = `{
} }
} }
}, },
"/v1/identities/{number}/{numberToTrust}": { "/v1/identities/{number}/trust/{numberToTrust}": {
"put": { "put": {
"description": "Trust an identity.", "description": "Trust an identity.",
"produces": [ "produces": [
@@ -743,10 +742,20 @@ var doc = `{
"name": "number", "name": "number",
"in": "path", "in": "path",
"required": true "required": true
},
{
"description": "Additional Settings",
"name": "data",
"in": "body",
"schema": {
"$ref": "#/definitions/api.RegisterNumberRequest"
}
} }
], ],
"responses": { "responses": {
"201": {}, "201": {
"description": ""
},
"400": { "400": {
"description": "Bad Request", "description": "Bad Request",
"schema": { "schema": {
@@ -781,7 +790,6 @@ var doc = `{
"description": "Additional Settings", "description": "Additional Settings",
"name": "data", "name": "data",
"in": "body", "in": "body",
"required": true,
"schema": { "schema": {
"$ref": "#/definitions/api.VerifyNumberSettings" "$ref": "#/definitions/api.VerifyNumberSettings"
} }
@@ -911,7 +919,6 @@ var doc = `{
"type": "object", "type": "object",
"properties": { "properties": {
"logging": { "logging": {
"type": "object",
"$ref": "#/definitions/api.LoggingConfiguration" "$ref": "#/definitions/api.LoggingConfiguration"
} }
} }
@@ -998,6 +1005,17 @@ var doc = `{
} }
} }
}, },
"api.RegisterNumberRequest": {
"type": "object",
"properties": {
"captcha": {
"type": "string"
},
"use_voice": {
"type": "boolean"
}
}
},
"api.SendMessageV1": { "api.SendMessageV1": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@@ -4,7 +4,6 @@
"description": "This is the Signal Cli REST API documentation.", "description": "This is the Signal Cli REST API documentation.",
"title": "Signal Cli REST API", "title": "Signal Cli REST API",
"contact": {}, "contact": {},
"license": {},
"version": "1.0" "version": "1.0"
}, },
"host": "127.0.0.1:8080", "host": "127.0.0.1:8080",
@@ -546,7 +545,7 @@
} }
} }
}, },
"/v1/identities/{number}/{numberToTrust}": { "/v1/identities/{number}/trust/{numberToTrust}": {
"put": { "put": {
"description": "Trust an identity.", "description": "Trust an identity.",
"produces": [ "produces": [
@@ -728,10 +727,20 @@
"name": "number", "name": "number",
"in": "path", "in": "path",
"required": true "required": true
},
{
"description": "Additional Settings",
"name": "data",
"in": "body",
"schema": {
"$ref": "#/definitions/api.RegisterNumberRequest"
}
} }
], ],
"responses": { "responses": {
"201": {}, "201": {
"description": ""
},
"400": { "400": {
"description": "Bad Request", "description": "Bad Request",
"schema": { "schema": {
@@ -766,7 +775,6 @@
"description": "Additional Settings", "description": "Additional Settings",
"name": "data", "name": "data",
"in": "body", "in": "body",
"required": true,
"schema": { "schema": {
"$ref": "#/definitions/api.VerifyNumberSettings" "$ref": "#/definitions/api.VerifyNumberSettings"
} }
@@ -896,7 +904,6 @@
"type": "object", "type": "object",
"properties": { "properties": {
"logging": { "logging": {
"type": "object",
"$ref": "#/definitions/api.LoggingConfiguration" "$ref": "#/definitions/api.LoggingConfiguration"
} }
} }
@@ -983,6 +990,17 @@
} }
} }
}, },
"api.RegisterNumberRequest": {
"type": "object",
"properties": {
"captcha": {
"type": "string"
},
"use_voice": {
"type": "boolean"
}
}
},
"api.SendMessageV1": { "api.SendMessageV1": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@@ -13,7 +13,6 @@ definitions:
properties: properties:
logging: logging:
$ref: '#/definitions/api.LoggingConfiguration' $ref: '#/definitions/api.LoggingConfiguration'
type: object
type: object type: object
api.CreateGroup: api.CreateGroup:
properties: properties:
@@ -68,6 +67,13 @@ definitions:
Level: Level:
type: string type: string
type: object type: object
api.RegisterNumberRequest:
properties:
captcha:
type: string
use_voice:
type: boolean
type: object
api.SendMessageV1: api.SendMessageV1:
properties: properties:
base64_attachment: base64_attachment:
@@ -119,7 +125,6 @@ host: 127.0.0.1:8080
info: info:
contact: {} contact: {}
description: This is the Signal Cli REST API documentation. description: This is the Signal Cli REST API documentation.
license: {}
title: Signal Cli REST API title: Signal Cli REST API
version: "1.0" version: "1.0"
paths: paths:
@@ -478,7 +483,7 @@ paths:
summary: List Identities summary: List Identities
tags: tags:
- Identities - Identities
/v1/identities/{number}/{numberToTrust}: /v1/identities/{number}/trust/{numberToTrust}:
put: put:
description: Trust an identity. description: Trust an identity.
parameters: parameters:
@@ -596,10 +601,16 @@ paths:
name: number name: number
required: true required: true
type: string type: string
- description: Additional Settings
in: body
name: data
schema:
$ref: '#/definitions/api.RegisterNumberRequest'
produces: produces:
- application/json - application/json
responses: responses:
"201": {} "201":
description: ""
"400": "400":
description: Bad Request description: Bad Request
schema: schema:
@@ -621,7 +632,6 @@ paths:
- description: Additional Settings - description: Additional Settings
in: body in: body
name: data name: data
required: true
schema: schema:
$ref: '#/definitions/api.VerifyNumberSettings' $ref: '#/definitions/api.VerifyNumberSettings'
- description: Verification Code - description: Verification Code

View File

@@ -5,6 +5,8 @@ go 1.14
require ( require (
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
github.com/cyphar/filepath-securejoin v0.2.2
github.com/gabriel-vasile/mimetype v1.1.2
github.com/gin-gonic/gin v1.6.3 github.com/gin-gonic/gin v1.6.3
github.com/go-openapi/spec v0.19.8 // indirect github.com/go-openapi/spec v0.19.8 // indirect
github.com/go-openapi/swag v0.19.9 // indirect github.com/go-openapi/swag v0.19.9 // indirect

View File

@@ -12,8 +12,12 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSY
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg=
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.1.2 h1:gaPnPcNor5aZSVCJVSGipcpbgMWiAAj9z182ocSGbHU=
github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w=
@@ -87,6 +91,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=