diff --git a/src/api/api.go b/src/api/api.go index 1bbdf57..ac154bc 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -53,6 +53,10 @@ type RegisterNumberRequest struct { Captcha string `json:"captcha"` } +type UnregisterNumberRequest struct { + DeleteAccount bool `json:"delete_account" example:"false"` +} + type VerifyNumberSettings struct { Pin string `json:"pin"` } @@ -177,6 +181,41 @@ func (a *Api) RegisterNumber(c *gin.Context) { c.Writer.WriteHeader(201) } +// @Summary Unregister a phone number. +// @Tags Devices +// @Description Disables push support for this device. **WARNING:** If *delete_account* is set to *true*, the account will be deleted from the Signal Server. This cannot be undone without loss. +// @Accept json +// @Produce json +// @Success 204 +// @Failure 400 {object} Error +// @Param number path string true "Registered Phone Number" +// @Param data body UnregisterNumberRequest false "Additional Settings" +// @Router /v1/unregister/{number} [post] +func (a *Api) UnregisterNumber(c *gin.Context) { + number := c.Param("number") + + deleteAccount := false + buf := new(bytes.Buffer) + buf.ReadFrom(c.Request.Body) + if buf.String() != "" { + var req UnregisterNumberRequest + err := json.Unmarshal(buf.Bytes(), &req) + if err != nil { + log.Error("Couldn't unregister number: ", err.Error()) + c.JSON(400, Error{Msg: "Couldn't process request - invalid request."}) + return + } + deleteAccount = req.DeleteAccount + } + + err := a.signalClient.UnregisterNumber(number, deleteAccount) + if err != nil { + c.JSON(400, gin.H{"error": err.Error()}) + return + } + c.Writer.WriteHeader(204) +} + // @Summary Verify a registered phone number. // @Tags Devices // @Description Verify a registered phone number with the signal network. diff --git a/src/client/client.go b/src/client/client.go index 9ea1996..45a8f0f 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -492,6 +492,20 @@ func (s *SignalClient) RegisterNumber(number string, useVoice bool, captcha stri return err } +func (s *SignalClient) UnregisterNumber(number string, deleteAccount bool) error { + if s.signalCliMode == JsonRpc { + return errors.New("This functionality is only available in normal/native mode!") + } + + command := []string{"--config", s.signalCliConfig, "-a", number, "unregister"} + if deleteAccount { + command = append(command, "--delete-account") + } + + _, err := runSignalCli(true, command, "", s.signalCliMode) + return err +} + func (s *SignalClient) VerifyRegisteredNumber(number string, token string, pin string) error { if s.signalCliMode == JsonRpc { return errors.New(endpointNotSupportedInJsonRpcMode) diff --git a/src/main.go b/src/main.go index 31b1303..45d1a81 100644 --- a/src/main.go +++ b/src/main.go @@ -152,6 +152,11 @@ func main() { register.POST(":number/verify/:token", api.VerifyRegisteredNumber) } + unregister := v1.Group("unregister") + { + unregister.POST(":number", api.UnregisterNumber) + } + sendV1 := v1.Group("/send") { sendV1.POST("", api.Send)