Skip to content

Commit 3c2a8a2

Browse files
authored
Merge pull request #740 from Era-Dorta/remote-delete
Add message deletion endpoint
2 parents cfc652d + de2cb04 commit 3c2a8a2

File tree

6 files changed

+305
-0
lines changed

6 files changed

+305
-0
lines changed

src/api/api.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ type SendMessageResponse struct {
163163
Timestamp string `json:"timestamp"`
164164
}
165165

166+
type RemoteDeleteResponse struct {
167+
Timestamp string `json:"timestamp"`
168+
}
169+
166170
type TrustModeRequest struct {
167171
TrustMode string `json:"trust_mode"`
168172
}
@@ -209,6 +213,11 @@ type SetPinRequest struct {
209213
Pin string `json:"pin"`
210214
}
211215

216+
type RemoteDeleteRequest struct {
217+
Recipient string `json:"recipient"`
218+
Timestamp int64 `json:"timestamp"`
219+
}
220+
212221
type Api struct {
213222
signalClient *client.SignalClient
214223
wsMutex sync.Mutex
@@ -2322,3 +2331,40 @@ func (a *Api) RemovePin(c *gin.Context) {
23222331

23232332
c.Status(204)
23242333
}
2334+
2335+
// @Summary Delete a signal message.
2336+
// @Tags Messages
2337+
// @Description Delete a signal message
2338+
// @Accept json
2339+
// @Produce json
2340+
// @Success 201 {object} RemoteDeleteResponse
2341+
// @Failure 400 {object} Error
2342+
// @Param number path string true "Registered Phone Number"
2343+
// @Param data body RemoteDeleteRequest true "Type"
2344+
// @Router /v1/remote-delete/{number} [delete]
2345+
func (a *Api) RemoteDelete(c *gin.Context) {
2346+
var req RemoteDeleteRequest
2347+
err := c.BindJSON(&req)
2348+
if err != nil {
2349+
c.JSON(400, Error{Msg: "Couldn't process request - invalid request"})
2350+
return
2351+
}
2352+
2353+
number, err := url.PathUnescape(c.Param("number"))
2354+
if err != nil {
2355+
c.JSON(400, Error{Msg: "Couldn't process request - malformed number"})
2356+
return
2357+
}
2358+
if number == "" {
2359+
c.JSON(400, Error{Msg: "Couldn't process request - number missing"})
2360+
return
2361+
}
2362+
2363+
timestamp, err := a.signalClient.RemoteDelete(number, req.Recipient, req.Timestamp)
2364+
2365+
if err != nil {
2366+
c.JSON(400, Error{Msg: err.Error()})
2367+
return
2368+
}
2369+
c.JSON(201, RemoteDeleteResponse{Timestamp: strconv.FormatInt(timestamp.Timestamp, 10)})
2370+
}

src/client/client.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ type SendResponse struct {
163163
Timestamp int64 `json:"timestamp"`
164164
}
165165

166+
type RemoteDeleteResponse struct {
167+
Timestamp int64 `json:"timestamp"`
168+
}
169+
166170
type About struct {
167171
SupportedApiVersions []string `json:"versions"`
168172
BuildNr int `json:"build"`
@@ -2530,3 +2534,78 @@ func (s *SignalClient) RemovePin(number string) error {
25302534
}
25312535
return nil
25322536
}
2537+
2538+
func (s *SignalClient) RemoteDelete(number string, recipient string, timestamp int64) (RemoteDeleteResponse, error) {
2539+
// see https://github.com/AsamK/signal-cli/blob/master/man/signal-cli.1.adoc#remotedelete
2540+
var err error
2541+
var resp RemoteDeleteResponse
2542+
var rawData string
2543+
2544+
recp := recipient
2545+
isGroup := false
2546+
2547+
recipientType, err := getRecipientType(recipient)
2548+
if err != nil {
2549+
return resp, err
2550+
}
2551+
2552+
if recipientType == ds.Group {
2553+
isGroup = true
2554+
recp, err = ConvertGroupIdToInternalGroupId(recipient)
2555+
if err != nil {
2556+
return resp, errors.New("Invalid group id")
2557+
}
2558+
} else if recipientType != ds.Number && recipientType != ds.Username {
2559+
return resp, errors.New("Invalid recipient type")
2560+
}
2561+
2562+
if s.signalCliMode == JsonRpc {
2563+
type Request struct {
2564+
Recipient string `json:"recipient,omitempty"`
2565+
GroupId string `json:"group-id,omitempty"`
2566+
Timestamp int64 `json:"target-timestamp"`
2567+
}
2568+
request := Request{}
2569+
if !isGroup {
2570+
request.Recipient = recp
2571+
} else {
2572+
request.GroupId = recp
2573+
}
2574+
request.Timestamp = timestamp
2575+
2576+
jsonRpc2Client, err := s.getJsonRpc2Client()
2577+
if err != nil {
2578+
return resp, err
2579+
}
2580+
rawData, err = jsonRpc2Client.getRaw("remoteDelete", &number, request)
2581+
if err != nil {
2582+
return resp, err
2583+
}
2584+
2585+
err = json.Unmarshal([]byte(rawData), &resp)
2586+
if err != nil {
2587+
return resp, errors.New("Couldn't process request - invalid signal-cli response")
2588+
}
2589+
2590+
return resp, err
2591+
} else {
2592+
cmd := []string{
2593+
"--config", s.signalCliConfig,
2594+
"-a", number,
2595+
"remoteDelete",
2596+
}
2597+
if !isGroup {
2598+
cmd = append(cmd, recp)
2599+
} else {
2600+
cmd = append(cmd, []string{"-g", recp}...)
2601+
}
2602+
cmd = append(cmd, []string{"-t", strconv.FormatInt(timestamp, 10)}...)
2603+
rawData, err = s.cliClient.Execute(true, cmd, "")
2604+
if err != nil {
2605+
return resp, err
2606+
}
2607+
2608+
resp.Timestamp, err = strconv.ParseInt(strings.TrimSuffix(rawData, "\n"), 10, 64)
2609+
return resp, err
2610+
}
2611+
}

src/docs/docs.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1854,6 +1854,53 @@ const docTemplate = `{
18541854
}
18551855
}
18561856
},
1857+
"/v1/remote-delete/{number}": {
1858+
"delete": {
1859+
"description": "Delete a signal message",
1860+
"consumes": [
1861+
"application/json"
1862+
],
1863+
"produces": [
1864+
"application/json"
1865+
],
1866+
"tags": [
1867+
"Messages"
1868+
],
1869+
"summary": "Delete a signal message.",
1870+
"parameters": [
1871+
{
1872+
"type": "string",
1873+
"description": "Registered Phone Number",
1874+
"name": "number",
1875+
"in": "path",
1876+
"required": true
1877+
},
1878+
{
1879+
"description": "Type",
1880+
"name": "data",
1881+
"in": "body",
1882+
"required": true,
1883+
"schema": {
1884+
"$ref": "#/definitions/api.RemoteDeleteRequest"
1885+
}
1886+
}
1887+
],
1888+
"responses": {
1889+
"201": {
1890+
"description": "Created",
1891+
"schema": {
1892+
"$ref": "#/definitions/api.RemoteDeleteResponse"
1893+
}
1894+
},
1895+
"400": {
1896+
"description": "Bad Request",
1897+
"schema": {
1898+
"$ref": "#/definitions/api.Error"
1899+
}
1900+
}
1901+
}
1902+
}
1903+
},
18571904
"/v1/search/{number}": {
18581905
"get": {
18591906
"description": "Check if one or more phone numbers are registered with the Signal Service.",
@@ -2394,6 +2441,25 @@ const docTemplate = `{
23942441
}
23952442
}
23962443
},
2444+
"api.RemoteDeleteRequest": {
2445+
"type": "object",
2446+
"properties": {
2447+
"recipient": {
2448+
"type": "string"
2449+
},
2450+
"timestamp": {
2451+
"type": "integer"
2452+
}
2453+
}
2454+
},
2455+
"api.RemoteDeleteResponse": {
2456+
"type": "object",
2457+
"properties": {
2458+
"timestamp": {
2459+
"type": "string"
2460+
}
2461+
}
2462+
},
23972463
"api.SearchResponse": {
23982464
"type": "object",
23992465
"properties": {

src/docs/swagger.json

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,53 @@
18511851
}
18521852
}
18531853
},
1854+
"/v1/remote-delete/{number}": {
1855+
"delete": {
1856+
"description": "Delete a signal message",
1857+
"consumes": [
1858+
"application/json"
1859+
],
1860+
"produces": [
1861+
"application/json"
1862+
],
1863+
"tags": [
1864+
"Messages"
1865+
],
1866+
"summary": "Delete a signal message.",
1867+
"parameters": [
1868+
{
1869+
"type": "string",
1870+
"description": "Registered Phone Number",
1871+
"name": "number",
1872+
"in": "path",
1873+
"required": true
1874+
},
1875+
{
1876+
"description": "Type",
1877+
"name": "data",
1878+
"in": "body",
1879+
"required": true,
1880+
"schema": {
1881+
"$ref": "#/definitions/api.RemoteDeleteRequest"
1882+
}
1883+
}
1884+
],
1885+
"responses": {
1886+
"201": {
1887+
"description": "Created",
1888+
"schema": {
1889+
"$ref": "#/definitions/api.RemoteDeleteResponse"
1890+
}
1891+
},
1892+
"400": {
1893+
"description": "Bad Request",
1894+
"schema": {
1895+
"$ref": "#/definitions/api.Error"
1896+
}
1897+
}
1898+
}
1899+
}
1900+
},
18541901
"/v1/search/{number}": {
18551902
"get": {
18561903
"description": "Check if one or more phone numbers are registered with the Signal Service.",
@@ -2391,6 +2438,25 @@
23912438
}
23922439
}
23932440
},
2441+
"api.RemoteDeleteRequest": {
2442+
"type": "object",
2443+
"properties": {
2444+
"recipient": {
2445+
"type": "string"
2446+
},
2447+
"timestamp": {
2448+
"type": "integer"
2449+
}
2450+
}
2451+
},
2452+
"api.RemoteDeleteResponse": {
2453+
"type": "object",
2454+
"properties": {
2455+
"timestamp": {
2456+
"type": "string"
2457+
}
2458+
}
2459+
},
23942460
"api.SearchResponse": {
23952461
"type": "object",
23962462
"properties": {

src/docs/swagger.yaml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ definitions:
121121
use_voice:
122122
type: boolean
123123
type: object
124+
api.RemoteDeleteRequest:
125+
properties:
126+
recipient:
127+
type: string
128+
timestamp:
129+
type: integer
130+
type: object
131+
api.RemoteDeleteResponse:
132+
properties:
133+
timestamp:
134+
type: string
135+
type: object
124136
api.SearchResponse:
125137
properties:
126138
number:
@@ -1706,6 +1718,37 @@ paths:
17061718
summary: Verify a registered phone number.
17071719
tags:
17081720
- Devices
1721+
/v1/remote-delete/{number}:
1722+
delete:
1723+
consumes:
1724+
- application/json
1725+
description: Delete a signal message
1726+
parameters:
1727+
- description: Registered Phone Number
1728+
in: path
1729+
name: number
1730+
required: true
1731+
type: string
1732+
- description: Type
1733+
in: body
1734+
name: data
1735+
required: true
1736+
schema:
1737+
$ref: '#/definitions/api.RemoteDeleteRequest'
1738+
produces:
1739+
- application/json
1740+
responses:
1741+
"201":
1742+
description: Created
1743+
schema:
1744+
$ref: '#/definitions/api.RemoteDeleteResponse'
1745+
"400":
1746+
description: Bad Request
1747+
schema:
1748+
$ref: '#/definitions/api.Error'
1749+
summary: Delete a signal message.
1750+
tags:
1751+
- Messages
17091752
/v1/search/{number}:
17101753
get:
17111754
consumes:

src/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,11 @@ func main() {
279279
typingIndicator.DELETE(":number", api.SendStopTyping)
280280
}
281281

282+
remoteDelete := v1.Group("remote-delete")
283+
{
284+
remoteDelete.DELETE(":number", api.RemoteDelete)
285+
}
286+
282287
reactions := v1.Group("/reactions")
283288
{
284289
reactions.POST(":number", api.SendReaction)

0 commit comments

Comments
 (0)