diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..b26e99a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -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 diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..6f99393 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,11 @@ +--- +name: Feature Request +about: You have a neat idea that should be implemented? +title: '' +labels: '' +assignees: '' + +--- + +### Feature Request + diff --git a/README.md b/README.md index 5112c2a..5c5e42e 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ At the moment, the following functionality is exposed via REST: - List/Serve/Delete attachments - Update profile +and [many more](https://bbernhard.github.io/signal-cli-rest-api/) + ## Examples Sample `docker-compose.yml`file: diff --git a/doc/EXAMPLES.md b/doc/EXAMPLES.md index 4c8668b..56bca12 100644 --- a/doc/EXAMPLES.md +++ b/doc/EXAMPLES.md @@ -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'` +- 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/` + - 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//verify/'` diff --git a/doc/HOMEASSISTANT.md b/doc/HOMEASSISTANT.md index d889e65..9d16e45 100644 --- a/doc/HOMEASSISTANT.md +++ b/doc/HOMEASSISTANT.md @@ -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'` +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/` + ## Sending messages to Signal Messenger groups 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) +## 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 In case you've problems with the `signal-cli-rest-api` container, have a look [here](TROUBLESHOOTING.md) diff --git a/doc/TROUBLESHOOTING.md b/doc/TROUBLESHOOTING.md index f4aef0c..17c4403 100644 --- a/doc/TROUBLESHOOTING.md +++ b/doc/TROUBLESHOOTING.md @@ -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) 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). diff --git a/src/api/api.go b/src/api/api.go index 4c9bc43..fbcc783 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -245,7 +245,7 @@ func send(c *gin.Context, attachmentTmpDir string, signalCliConfig string, numbe } cleanupTmpFiles(attachmentTmpPaths) - c.JSON(201, nil) + c.Writer.WriteHeader(201) } func parseWhitespaceDelimitedKeyValueStringList(in string, keys []string) []map[string]string { @@ -401,6 +401,7 @@ func (a *Api) About(c *gin.Context) { // @Success 201 // @Failure 400 {object} Error // @Param number path string true "Registered Phone Number" +// @Param data body RegisterNumberRequest false "Additional Settings" // @Router /v1/register/{number} [post] func (a *Api) RegisterNumber(c *gin.Context) { number := c.Param("number") @@ -441,7 +442,7 @@ func (a *Api) RegisterNumber(c *gin.Context) { c.JSON(400, gin.H{"error": err.Error()}) return } - c.JSON(201, nil) + c.Writer.WriteHeader(201) } // @Summary Verify a registered phone number. @@ -452,7 +453,7 @@ func (a *Api) RegisterNumber(c *gin.Context) { // @Success 201 {string} string "OK" // @Failure 400 {object} Error // @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" // @Router /v1/register/{number}/verify/{token} [post] 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()}) return } - c.JSON(201, nil) + c.Writer.WriteHeader(201) } // @Summary Send a signal message. @@ -1023,7 +1024,7 @@ func (a *Api) ListIdentities(c *gin.Context) { // @Param data body TrustIdentityRequest true "Input Data" // @Param number path string true "Registered Phone Number" // @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) { number := c.Param("number") diff --git a/src/docs/docs.go b/src/docs/docs.go index 49e3bab..811ea13 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -19,7 +19,6 @@ var doc = `{ "description": "{{.Description}}", "title": "{{.Title}}", "contact": {}, - "license": {}, "version": "{{.Version}}" }, "host": "{{.Host}}", @@ -561,7 +560,7 @@ var doc = `{ } } }, - "/v1/identities/{number}/{numberToTrust}": { + "/v1/identities/{number}/trust/{numberToTrust}": { "put": { "description": "Trust an identity.", "produces": [ @@ -743,10 +742,20 @@ var doc = `{ "name": "number", "in": "path", "required": true + }, + { + "description": "Additional Settings", + "name": "data", + "in": "body", + "schema": { + "$ref": "#/definitions/api.RegisterNumberRequest" + } } ], "responses": { - "201": {}, + "201": { + "description": "" + }, "400": { "description": "Bad Request", "schema": { @@ -781,7 +790,6 @@ var doc = `{ "description": "Additional Settings", "name": "data", "in": "body", - "required": true, "schema": { "$ref": "#/definitions/api.VerifyNumberSettings" } @@ -911,7 +919,6 @@ var doc = `{ "type": "object", "properties": { "logging": { - "type": "object", "$ref": "#/definitions/api.LoggingConfiguration" } } @@ -998,6 +1005,17 @@ var doc = `{ } } }, + "api.RegisterNumberRequest": { + "type": "object", + "properties": { + "captcha": { + "type": "string" + }, + "use_voice": { + "type": "boolean" + } + } + }, "api.SendMessageV1": { "type": "object", "properties": { diff --git a/src/docs/swagger.json b/src/docs/swagger.json index 293bf3e..321dc93 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -4,7 +4,6 @@ "description": "This is the Signal Cli REST API documentation.", "title": "Signal Cli REST API", "contact": {}, - "license": {}, "version": "1.0" }, "host": "127.0.0.1:8080", @@ -546,7 +545,7 @@ } } }, - "/v1/identities/{number}/{numberToTrust}": { + "/v1/identities/{number}/trust/{numberToTrust}": { "put": { "description": "Trust an identity.", "produces": [ @@ -728,10 +727,20 @@ "name": "number", "in": "path", "required": true + }, + { + "description": "Additional Settings", + "name": "data", + "in": "body", + "schema": { + "$ref": "#/definitions/api.RegisterNumberRequest" + } } ], "responses": { - "201": {}, + "201": { + "description": "" + }, "400": { "description": "Bad Request", "schema": { @@ -766,7 +775,6 @@ "description": "Additional Settings", "name": "data", "in": "body", - "required": true, "schema": { "$ref": "#/definitions/api.VerifyNumberSettings" } @@ -896,7 +904,6 @@ "type": "object", "properties": { "logging": { - "type": "object", "$ref": "#/definitions/api.LoggingConfiguration" } } @@ -983,6 +990,17 @@ } } }, + "api.RegisterNumberRequest": { + "type": "object", + "properties": { + "captcha": { + "type": "string" + }, + "use_voice": { + "type": "boolean" + } + } + }, "api.SendMessageV1": { "type": "object", "properties": { diff --git a/src/docs/swagger.yaml b/src/docs/swagger.yaml index 56f6de4..29b5897 100644 --- a/src/docs/swagger.yaml +++ b/src/docs/swagger.yaml @@ -13,7 +13,6 @@ definitions: properties: logging: $ref: '#/definitions/api.LoggingConfiguration' - type: object type: object api.CreateGroup: properties: @@ -68,6 +67,13 @@ definitions: Level: type: string type: object + api.RegisterNumberRequest: + properties: + captcha: + type: string + use_voice: + type: boolean + type: object api.SendMessageV1: properties: base64_attachment: @@ -119,7 +125,6 @@ host: 127.0.0.1:8080 info: contact: {} description: This is the Signal Cli REST API documentation. - license: {} title: Signal Cli REST API version: "1.0" paths: @@ -478,7 +483,7 @@ paths: summary: List Identities tags: - Identities - /v1/identities/{number}/{numberToTrust}: + /v1/identities/{number}/trust/{numberToTrust}: put: description: Trust an identity. parameters: @@ -596,10 +601,16 @@ paths: name: number required: true type: string + - description: Additional Settings + in: body + name: data + schema: + $ref: '#/definitions/api.RegisterNumberRequest' produces: - application/json responses: - "201": {} + "201": + description: "" "400": description: Bad Request schema: @@ -621,7 +632,6 @@ paths: - description: Additional Settings in: body name: data - required: true schema: $ref: '#/definitions/api.VerifyNumberSettings' - description: Verification Code diff --git a/src/go.mod b/src/go.mod index 6337774..458ab57 100644 --- a/src/go.mod +++ b/src/go.mod @@ -5,6 +5,8 @@ go 1.14 require ( github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 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/go-openapi/spec v0.19.8 // indirect github.com/go-openapi/swag v0.19.9 // indirect diff --git a/src/go.sum b/src/go.sum index d900900..1b66949 100644 --- a/src/go.sum +++ b/src/go.sum @@ -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 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= 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.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/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 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/reflect2 v0.0.0-20180701023420-4b7aa43c6742/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/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=