diff --git a/Dockerfile b/Dockerfile index 1eadc4e..78a8020 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -ARG SIGNAL_CLI_VERSION=0.14.0 +ARG SIGNAL_CLI_VERSION=0.14.1 ARG LIBSIGNAL_CLIENT_VERSION=0.87.4 -ARG SIGNAL_CLI_NATIVE_PACKAGE_VERSION=0.14.0+morph027+5 +ARG SIGNAL_CLI_NATIVE_PACKAGE_VERSION=0.14.1+morph027+2 ARG SWAG_VERSION=1.16.4 ARG GRAALVM_VERSION=25.0.2 diff --git a/src/api/api.go b/src/api/api.go index b36a5d9..a169480 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -1024,6 +1024,7 @@ func (a *Api) RemoveAdminsFromGroup(c *gin.Context) { // @Success 200 {object} []client.GroupEntry // @Failure 400 {object} Error // @Param number path string true "Registered Phone Number" +// @Param use_only_uuid_as_identifier query bool false "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members" // @Router /v1/groups/{number} [get] func (a *Api) GetGroups(c *gin.Context) { number, err := url.PathUnescape(c.Param("number")) @@ -1032,7 +1033,13 @@ func (a *Api) GetGroups(c *gin.Context) { return } - groups, err := a.signalClient.GetGroups(number) + useOnlyUuidAsIdentifier := c.DefaultQuery("use_only_uuid_as_identifier", "false") + if useOnlyUuidAsIdentifier != "true" && useOnlyUuidAsIdentifier != "false" { + c.JSON(400, Error{Msg: "Couldn't process request - use_only_uuid_as_identifier parameter needs to be either 'true' or 'false'"}) + return + } + + groups, err := a.signalClient.GetGroups(number, StringToBool(useOnlyUuidAsIdentifier)) if err != nil { c.JSON(400, Error{Msg: err.Error()}) return @@ -1050,6 +1057,7 @@ func (a *Api) GetGroups(c *gin.Context) { // @Failure 400 {object} Error // @Param number path string true "Registered Phone Number" // @Param groupid path string true "Group ID" +// @Param use_only_uuid_as_identifier query bool false "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members" // @Router /v1/groups/{number}/{groupid} [get] func (a *Api) GetGroup(c *gin.Context) { number, err := url.PathUnescape(c.Param("number")) @@ -1059,7 +1067,13 @@ func (a *Api) GetGroup(c *gin.Context) { } groupId := c.Param("groupid") - groupEntry, err := a.signalClient.GetGroup(number, groupId) + useOnlyUuidAsIdentifier := c.DefaultQuery("use_only_uuid_as_identifier", "false") + if useOnlyUuidAsIdentifier != "true" && useOnlyUuidAsIdentifier != "false" { + c.JSON(400, Error{Msg: "Couldn't process request - use_only_uuid_as_identifier parameter needs to be either 'true' or 'false'"}) + return + } + + groupEntry, err := a.signalClient.GetGroup(number, groupId, StringToBool(useOnlyUuidAsIdentifier)) if err != nil { c.JSON(400, Error{Msg: err.Error()}) return diff --git a/src/client/client.go b/src/client/client.go index fa3f937..b2db5dd 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -341,6 +341,18 @@ func getSignalCliModeString(signalCliMode SignalCliMode) string { return "unknown" } +func pickGroupMemberIdentifier(number string, uuid string, useOnlyUuidAsIdentifier bool) string { + if useOnlyUuidAsIdentifier { + return uuid + } + + if number != "" { + return number + } + + return uuid +} + func getRecipientType(s string) (ds.RecpType, error) { // check if the provided recipient is of type 'group' if strings.HasPrefix(s, groupPrefix) { // if the recipient starts with 'group.' it is either a group or a username that starts with 'group.' @@ -1181,7 +1193,7 @@ func (s *SignalClient) updateGroupMembers(number string, groupId string, members return nil } - group, err := s.GetGroup(number, groupId) + group, err := s.GetGroup(number, groupId, false) if err != nil { return err } @@ -1243,7 +1255,7 @@ func (s *SignalClient) updateGroupAdmins(number string, groupId string, admins [ return nil } - group, err := s.GetGroup(number, groupId) + group, err := s.GetGroup(number, groupId, false) if err != nil { return err } @@ -1300,7 +1312,7 @@ func (s *SignalClient) RemoveAdminsFromGroup(number string, groupId string, admi return s.updateGroupAdmins(number, groupId, admins, false) } -func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { +func (s *SignalClient) GetGroups(number string, useOnlyUuidAsIdentifier bool) ([]GroupEntry, error) { groupEntries := []GroupEntry{} var signalCliGroupEntries []SignalCliGroupEntry @@ -1341,40 +1353,28 @@ func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { members := []string{} for _, val := range signalCliGroupEntry.Members { - identifier := val.Number - if identifier == "" { - identifier = val.Uuid - } + identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) members = append(members, identifier) } groupEntry.Members = members pendingMembers := []string{} for _, val := range signalCliGroupEntry.PendingMembers { - identifier := val.Number - if identifier == "" { - identifier = val.Uuid - } + identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) pendingMembers = append(pendingMembers, identifier) } groupEntry.PendingInvites = pendingMembers requestingMembers := []string{} for _, val := range signalCliGroupEntry.RequestingMembers { - identifier := val.Number - if identifier == "" { - identifier = val.Uuid - } + identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) requestingMembers = append(requestingMembers, identifier) } groupEntry.PendingRequests = requestingMembers admins := []string{} for _, val := range signalCliGroupEntry.Admins { - identifier := val.Number - if identifier == "" { - identifier = val.Uuid - } + identifier := pickGroupMemberIdentifier(val.Number, val.Uuid, useOnlyUuidAsIdentifier) admins = append(admins, identifier) } groupEntry.Admins = admins @@ -1387,9 +1387,9 @@ func (s *SignalClient) GetGroups(number string) ([]GroupEntry, error) { return groupEntries, nil } -func (s *SignalClient) GetGroup(number string, groupId string) (*GroupEntry, error) { +func (s *SignalClient) GetGroup(number string, groupId string, useOnlyUuidAsIdentifier bool) (*GroupEntry, error) { groupEntry := GroupEntry{} - groups, err := s.GetGroups(number) + groups, err := s.GetGroups(number, useOnlyUuidAsIdentifier) if err != nil { return nil, err } diff --git a/src/client/jsonrpc2.go b/src/client/jsonrpc2.go index c9f3007..ef00633 100644 --- a/src/client/jsonrpc2.go +++ b/src/client/jsonrpc2.go @@ -233,13 +233,6 @@ func (r *JsonRpc2Client) ReceiveData(number string, receiveWebhookUrl string) { } log.Debug("json-rpc received data: ", str) - if receiveWebhookUrl != "" { - err = postMessageToWebhook(receiveWebhookUrl, []byte(str)) - if err != nil { - log.Error("Couldn't post data to webhook: ", err) - } - } - var resp1 JsonRpc2ReceivedMessage json.Unmarshal([]byte(str), &resp1) if resp1.Method == "receive" { @@ -254,6 +247,13 @@ func (r *JsonRpc2Client) ReceiveData(number string, receiveWebhookUrl string) { continue } r.receivedMessagesMutex.Unlock() + + if receiveWebhookUrl != "" { + err = postMessageToWebhook(receiveWebhookUrl, []byte(str)) + if err != nil { + log.Error("Couldn't post data to webhook: ", err) + } + } } var resp2 JsonRpc2MessageResponse diff --git a/src/docs/docs.go b/src/docs/docs.go index 8137eb7..23dbbb6 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -917,6 +917,12 @@ const docTemplate = `{ "name": "number", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", + "name": "use_only_uuid_as_identifier", + "in": "query" } ], "responses": { @@ -1010,6 +1016,12 @@ const docTemplate = `{ "name": "groupid", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", + "name": "use_only_uuid_as_identifier", + "in": "query" } ], "responses": { diff --git a/src/docs/swagger.json b/src/docs/swagger.json index 5337561..241a2e4 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -914,6 +914,12 @@ "name": "number", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", + "name": "use_only_uuid_as_identifier", + "in": "query" } ], "responses": { @@ -1007,6 +1013,12 @@ "name": "groupid", "in": "path", "required": true + }, + { + "type": "boolean", + "description": "Use UUIDs instead of phone numbers as identifier for (pending|requesting) members", + "name": "use_only_uuid_as_identifier", + "in": "query" } ], "responses": { diff --git a/src/docs/swagger.yaml b/src/docs/swagger.yaml index f1638c7..b2e2394 100644 --- a/src/docs/swagger.yaml +++ b/src/docs/swagger.yaml @@ -1163,6 +1163,11 @@ paths: name: number required: true type: string + - description: Use UUIDs instead of phone numbers as identifier for (pending|requesting) + members + in: query + name: use_only_uuid_as_identifier + type: boolean produces: - application/json responses: @@ -1254,6 +1259,11 @@ paths: name: groupid required: true type: string + - description: Use UUIDs instead of phone numbers as identifier for (pending|requesting) + members + in: query + name: use_only_uuid_as_identifier + type: boolean produces: - application/json responses: