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 }