Skip to content

Commit 4404929

Browse files
committed
added API endpoints to set/remove a pin
see #660
1 parent 46bd47f commit 4404929

File tree

6 files changed

+295
-2
lines changed

6 files changed

+295
-2
lines changed

src/api/api.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ type AddStickerPackRequest struct {
202202
PackKey string `json:"pack_key" example:"19546e18eba0ff69dea78eb591465289d39e16f35e58389ae779d4f9455aff3a"`
203203
}
204204

205+
type SetPinRequest struct {
206+
Pin string `json:"pin"`
207+
}
208+
205209
type Api struct {
206210
signalClient *client.SignalClient
207211
wsMutex sync.Mutex
@@ -2166,3 +2170,68 @@ func (a *Api) ListContacts(c *gin.Context) {
21662170

21672171
c.JSON(200, contacts)
21682172
}
2173+
2174+
// @Summary Set Pin
2175+
// @Tags Accounts
2176+
// @Description Sets a new Signal Pin
2177+
// @Produce json
2178+
// @Success 201
2179+
// @Failure 400 {object} Error
2180+
// @Param number path string true "Registered Phone Number"
2181+
// @Router /v1/accounts/{number}/pin [get]
2182+
func (a *Api) SetPin(c *gin.Context) {
2183+
number, err := url.PathUnescape(c.Param("number"))
2184+
if err != nil {
2185+
c.JSON(400, Error{Msg: "Couldn't process request - malformed number"})
2186+
return
2187+
}
2188+
2189+
if number == "" {
2190+
c.JSON(400, Error{Msg: "Couldn't process request - number missing"})
2191+
return
2192+
}
2193+
2194+
var req SetPinRequest
2195+
err = c.BindJSON(&req)
2196+
if err != nil {
2197+
c.JSON(400, Error{Msg: "Couldn't process request - invalid request"})
2198+
return
2199+
}
2200+
2201+
err = a.signalClient.SetPin(number, req.Pin)
2202+
if err != nil {
2203+
c.JSON(400, Error{Msg: err.Error()})
2204+
return
2205+
}
2206+
2207+
c.Status(201)
2208+
}
2209+
2210+
// @Summary Remove Pin
2211+
// @Tags Accounts
2212+
// @Description Removes a Signal Pin
2213+
// @Produce json
2214+
// @Success 204
2215+
// @Failure 400 {object} Error
2216+
// @Param number path string true "Registered Phone Number"
2217+
// @Router /v1/accounts/{number}/pin [delete]
2218+
func (a *Api) RemovePin(c *gin.Context) {
2219+
number, err := url.PathUnescape(c.Param("number"))
2220+
if err != nil {
2221+
c.JSON(400, Error{Msg: "Couldn't process request - malformed number"})
2222+
return
2223+
}
2224+
2225+
if number == "" {
2226+
c.JSON(400, Error{Msg: "Couldn't process request - number missing"})
2227+
return
2228+
}
2229+
2230+
err = a.signalClient.RemovePin(number)
2231+
if err != nil {
2232+
c.JSON(400, Error{Msg: err.Error()})
2233+
return
2234+
}
2235+
2236+
c.Status(204)
2237+
}

src/client/client.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2239,3 +2239,49 @@ func (s *SignalClient) ListContacts(number string) ([]ListContactsResponse, erro
22392239

22402240
return resp, nil
22412241
}
2242+
2243+
func (s *SignalClient) SetPin(number string, registrationLockPin string) (error) {
2244+
if s.signalCliMode == JsonRpc {
2245+
type Request struct {
2246+
RegistrationLockPin string `json:"pin"`
2247+
}
2248+
req := Request{RegistrationLockPin: registrationLockPin}
2249+
jsonRpc2Client, err := s.getJsonRpc2Client()
2250+
if err != nil {
2251+
return err
2252+
}
2253+
_, err = jsonRpc2Client.getRaw("setPin", &number, req)
2254+
if err != nil {
2255+
return err
2256+
}
2257+
} else {
2258+
cmd := []string{"--config", s.signalCliConfig, "-o", "json", "-a", number, "setPin", registrationLockPin}
2259+
rawData, err := s.cliClient.Execute(true, cmd, "")
2260+
if err != nil {
2261+
return err
2262+
}
2263+
log.Info(string(rawData))
2264+
}
2265+
return nil
2266+
}
2267+
2268+
2269+
func (s *SignalClient) RemovePin(number string) (error) {
2270+
if s.signalCliMode == JsonRpc {
2271+
jsonRpc2Client, err := s.getJsonRpc2Client()
2272+
if err != nil {
2273+
return err
2274+
}
2275+
_, err = jsonRpc2Client.getRaw("removePin", &number, nil)
2276+
if err != nil {
2277+
return err
2278+
}
2279+
} else {
2280+
cmd := []string{"--config", s.signalCliConfig, "-o", "json", "-a", number, "removePin"}
2281+
_, err := s.cliClient.Execute(true, cmd, "")
2282+
if err != nil {
2283+
return err
2284+
}
2285+
}
2286+
return nil
2287+
}

src/docs/docs.go

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,68 @@ const docTemplate = `{
6464
}
6565
}
6666
},
67+
"/v1/accounts/{number}/pin": {
68+
"get": {
69+
"description": "Sets a new Signal Pin",
70+
"produces": [
71+
"application/json"
72+
],
73+
"tags": [
74+
"Accounts"
75+
],
76+
"summary": "Set Pin",
77+
"parameters": [
78+
{
79+
"type": "string",
80+
"description": "Registered Phone Number",
81+
"name": "number",
82+
"in": "path",
83+
"required": true
84+
}
85+
],
86+
"responses": {
87+
"201": {
88+
"description": "Created"
89+
},
90+
"400": {
91+
"description": "Bad Request",
92+
"schema": {
93+
"$ref": "#/definitions/api.Error"
94+
}
95+
}
96+
}
97+
},
98+
"delete": {
99+
"description": "Removes a Signal Pin",
100+
"produces": [
101+
"application/json"
102+
],
103+
"tags": [
104+
"Accounts"
105+
],
106+
"summary": "Remove Pin",
107+
"parameters": [
108+
{
109+
"type": "string",
110+
"description": "Registered Phone Number",
111+
"name": "number",
112+
"in": "path",
113+
"required": true
114+
}
115+
],
116+
"responses": {
117+
"204": {
118+
"description": "No Content"
119+
},
120+
"400": {
121+
"description": "Bad Request",
122+
"schema": {
123+
"$ref": "#/definitions/api.Error"
124+
}
125+
}
126+
}
127+
}
128+
},
67129
"/v1/accounts/{number}/rate-limit-challenge": {
68130
"post": {
69131
"description": "When running into rate limits, sometimes the limit can be lifted, by solving a CAPTCHA. To get the captcha token, go to https://signalcaptchas.org/challenge/generate.html For the staging environment, use: https://signalcaptchas.org/staging/registration/generate.html. The \"challenge_token\" is the token from the failed send attempt. The \"captcha\" is the captcha result, starting with signalcaptcha://",
@@ -1717,7 +1779,8 @@ const docTemplate = `{
17171779
"type": "string",
17181780
"description": "Registered Phone Number",
17191781
"name": "number",
1720-
"in": "path"
1782+
"in": "path",
1783+
"required": true
17211784
},
17221785
{
17231786
"type": "array",
@@ -2526,6 +2589,9 @@ const docTemplate = `{
25262589
"blocked": {
25272590
"type": "boolean"
25282591
},
2592+
"description": {
2593+
"type": "string"
2594+
},
25292595
"id": {
25302596
"type": "string"
25312597
},

src/docs/swagger.json

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,68 @@
6161
}
6262
}
6363
},
64+
"/v1/accounts/{number}/pin": {
65+
"get": {
66+
"description": "Sets a new Signal Pin",
67+
"produces": [
68+
"application/json"
69+
],
70+
"tags": [
71+
"Accounts"
72+
],
73+
"summary": "Set Pin",
74+
"parameters": [
75+
{
76+
"type": "string",
77+
"description": "Registered Phone Number",
78+
"name": "number",
79+
"in": "path",
80+
"required": true
81+
}
82+
],
83+
"responses": {
84+
"201": {
85+
"description": "Created"
86+
},
87+
"400": {
88+
"description": "Bad Request",
89+
"schema": {
90+
"$ref": "#/definitions/api.Error"
91+
}
92+
}
93+
}
94+
},
95+
"delete": {
96+
"description": "Removes a Signal Pin",
97+
"produces": [
98+
"application/json"
99+
],
100+
"tags": [
101+
"Accounts"
102+
],
103+
"summary": "Remove Pin",
104+
"parameters": [
105+
{
106+
"type": "string",
107+
"description": "Registered Phone Number",
108+
"name": "number",
109+
"in": "path",
110+
"required": true
111+
}
112+
],
113+
"responses": {
114+
"204": {
115+
"description": "No Content"
116+
},
117+
"400": {
118+
"description": "Bad Request",
119+
"schema": {
120+
"$ref": "#/definitions/api.Error"
121+
}
122+
}
123+
}
124+
}
125+
},
64126
"/v1/accounts/{number}/rate-limit-challenge": {
65127
"post": {
66128
"description": "When running into rate limits, sometimes the limit can be lifted, by solving a CAPTCHA. To get the captcha token, go to https://signalcaptchas.org/challenge/generate.html For the staging environment, use: https://signalcaptchas.org/staging/registration/generate.html. The \"challenge_token\" is the token from the failed send attempt. The \"captcha\" is the captcha result, starting with signalcaptcha://",
@@ -1714,7 +1776,8 @@
17141776
"type": "string",
17151777
"description": "Registered Phone Number",
17161778
"name": "number",
1717-
"in": "path"
1779+
"in": "path",
1780+
"required": true
17181781
},
17191782
{
17201783
"type": "array",
@@ -2523,6 +2586,9 @@
25232586
"blocked": {
25242587
"type": "boolean"
25252588
},
2589+
"description": {
2590+
"type": "string"
2591+
},
25262592
"id": {
25272593
"type": "string"
25282594
},

src/docs/swagger.yaml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ definitions:
312312
type: array
313313
blocked:
314314
type: boolean
315+
description:
316+
type: string
315317
id:
316318
type: string
317319
internal_id:
@@ -433,6 +435,47 @@ paths:
433435
summary: List all accounts
434436
tags:
435437
- Accounts
438+
/v1/accounts/{number}/pin:
439+
delete:
440+
description: Removes a Signal Pin
441+
parameters:
442+
- description: Registered Phone Number
443+
in: path
444+
name: number
445+
required: true
446+
type: string
447+
produces:
448+
- application/json
449+
responses:
450+
"204":
451+
description: No Content
452+
"400":
453+
description: Bad Request
454+
schema:
455+
$ref: '#/definitions/api.Error'
456+
summary: Remove Pin
457+
tags:
458+
- Accounts
459+
get:
460+
description: Sets a new Signal Pin
461+
parameters:
462+
- description: Registered Phone Number
463+
in: path
464+
name: number
465+
required: true
466+
type: string
467+
produces:
468+
- application/json
469+
responses:
470+
"201":
471+
description: Created
472+
"400":
473+
description: Bad Request
474+
schema:
475+
$ref: '#/definitions/api.Error'
476+
summary: Set Pin
477+
tags:
478+
- Accounts
436479
/v1/accounts/{number}/rate-limit-challenge:
437480
post:
438481
consumes:
@@ -1544,6 +1587,7 @@ paths:
15441587
- description: Registered Phone Number
15451588
in: path
15461589
name: number
1590+
required: true
15471591
type: string
15481592
- collectionFormat: multi
15491593
description: Numbers to check

src/main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ func main() {
223223
accounts.PUT(":number/settings", api.UpdateAccountSettings)
224224
accounts.POST(":number/username", api.SetUsername)
225225
accounts.DELETE(":number/username", api.RemoveUsername)
226+
accounts.POST(":number/pin", api.SetPin)
227+
accounts.DELETE(":number/pin", api.RemovePin)
226228
}
227229

228230
devices := v1.Group("devices")

0 commit comments

Comments
 (0)