Skip to content

Commit 7c9e9ce

Browse files
committed
extended groups POST/PUT request
* added possibility to change permissions with the groups PUT request * added possibility to change the send messages permission when creating a group with the POST request see #746
1 parent 3c2a8a2 commit 7c9e9ce

File tree

5 files changed

+138
-28
lines changed

5 files changed

+138
-28
lines changed

src/api/api.go

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ type UpdateContactRequest struct {
3939
}
4040

4141
type GroupPermissions struct {
42-
AddMembers string `json:"add_members" enums:"only-admins,every-member"`
43-
EditGroup string `json:"edit_group" enums:"only-admins,every-member"`
42+
AddMembers string `json:"add_members" enums:"only-admins,every-member"`
43+
EditGroup string `json:"edit_group" enums:"only-admins,every-member"`
44+
SendMessages string `json:"send_messages" enums:"only-admins,every-member"`
4445
}
4546

4647
type CreateGroupRequest struct {
@@ -53,11 +54,12 @@ type CreateGroupRequest struct {
5354
}
5455

5556
type UpdateGroupRequest struct {
56-
Base64Avatar *string `json:"base64_avatar"`
57-
Description *string `json:"description"`
58-
Name *string `json:"name"`
59-
ExpirationTime *int `json:"expiration_time"`
60-
GroupLinkState *string `json:"group_link" enums:"disabled,enabled,enabled-with-approval"`
57+
Base64Avatar *string `json:"base64_avatar"`
58+
Description *string `json:"description"`
59+
Name *string `json:"name"`
60+
ExpirationTime *int `json:"expiration_time"`
61+
GroupLinkState *string `json:"group_link" enums:"disabled,enabled,enabled-with-approval"`
62+
Permissions *GroupPermissions `json:"permissions"`
6163
}
6264

6365
type ChangeGroupMembersRequest struct {
@@ -696,6 +698,7 @@ func (a *Api) CreateGroup(c *gin.Context) {
696698

697699
editGroupPermission := client.DefaultGroupPermission
698700
addMembersPermission := client.DefaultGroupPermission
701+
sendMessagesPermission := client.DefaultGroupPermission
699702
groupLinkState := client.DefaultGroupLinkState
700703

701704
if req.Permissions.AddMembers != "" {
@@ -714,6 +717,15 @@ func (a *Api) CreateGroup(c *gin.Context) {
714717
editGroupPermission = editGroupPermission.FromString(req.Permissions.EditGroup)
715718
}
716719

720+
if req.Permissions.SendMessages != "" {
721+
if !utils.StringInSlice(req.Permissions.SendMessages, []string{"every-member", "only-admins"}) {
722+
c.JSON(400, Error{Msg: "Invalid send messages permissions provided - only 'every-member' and 'only-admins' allowed!"})
723+
return
724+
}
725+
726+
sendMessagesPermission = sendMessagesPermission.FromString(req.Permissions.SendMessages)
727+
}
728+
717729
if req.GroupLinkState != "" {
718730
if !utils.StringInSlice(req.GroupLinkState, []string{"enabled", "enabled-with-approval", "disabled"}) {
719731
c.JSON(400, Error{Msg: "Invalid group link provided - only 'enabled', 'enabled-with-approval' and 'disabled' allowed!"})
@@ -722,7 +734,8 @@ func (a *Api) CreateGroup(c *gin.Context) {
722734
groupLinkState = groupLinkState.FromString(req.GroupLinkState)
723735
}
724736

725-
groupId, err := a.signalClient.CreateGroup(number, req.Name, req.Members, req.Description, editGroupPermission, addMembersPermission, groupLinkState, req.ExpirationTime)
737+
groupId, err := a.signalClient.CreateGroup(number, req.Name, req.Members, req.Description, editGroupPermission, addMembersPermission,
738+
sendMessagesPermission, groupLinkState, req.ExpirationTime)
726739
if err != nil {
727740
c.JSON(400, Error{Msg: err.Error()})
728741
return
@@ -1548,7 +1561,39 @@ func (a *Api) UpdateGroup(c *gin.Context) {
15481561
groupLinkState = &gLinkStateVal
15491562
}
15501563

1551-
err = a.signalClient.UpdateGroup(number, internalGroupId, req.Base64Avatar, req.Description, req.Name, req.ExpirationTime, groupLinkState)
1564+
editGroupPermission := client.DefaultGroupPermission
1565+
addMembersPermission := client.DefaultGroupPermission
1566+
sendMessagesPermission := client.DefaultGroupPermission
1567+
1568+
if req.Permissions != nil {
1569+
if req.Permissions.AddMembers != "" {
1570+
if !utils.StringInSlice(req.Permissions.AddMembers, []string{"every-member", "only-admins"}) {
1571+
c.JSON(400, Error{Msg: "Invalid add members permission provided - only 'every-member' and 'only-admins' allowed!"})
1572+
return
1573+
}
1574+
addMembersPermission = addMembersPermission.FromString(req.Permissions.AddMembers)
1575+
}
1576+
1577+
if req.Permissions.EditGroup != "" {
1578+
if !utils.StringInSlice(req.Permissions.EditGroup, []string{"every-member", "only-admins"}) {
1579+
c.JSON(400, Error{Msg: "Invalid edit group permissions provided - only 'every-member' and 'only-admins' allowed!"})
1580+
return
1581+
}
1582+
editGroupPermission = editGroupPermission.FromString(req.Permissions.EditGroup)
1583+
}
1584+
1585+
if req.Permissions.SendMessages != "" {
1586+
if !utils.StringInSlice(req.Permissions.SendMessages, []string{"every-member", "only-admins"}) {
1587+
c.JSON(400, Error{Msg: "Invalid send messages permissions provided - only 'every-member' and 'only-admins' allowed!"})
1588+
return
1589+
}
1590+
1591+
sendMessagesPermission = sendMessagesPermission.FromString(req.Permissions.SendMessages)
1592+
}
1593+
}
1594+
1595+
err = a.signalClient.UpdateGroup(number, internalGroupId, req.Base64Avatar, req.Description, req.Name, req.ExpirationTime, groupLinkState,
1596+
editGroupPermission, addMembersPermission, sendMessagesPermission)
15521597
if err != nil {
15531598
c.JSON(400, Error{Msg: err.Error()})
15541599
return

src/client/client.go

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8-
log "github.com/sirupsen/logrus"
98
"io/ioutil"
109
"os"
1110
"path/filepath"
1211
"strconv"
1312
"strings"
1413

14+
log "github.com/sirupsen/logrus"
15+
1516
securejoin "github.com/cyphar/filepath-securejoin"
1617
"github.com/h2non/filetype"
1718

@@ -509,7 +510,7 @@ func (s *SignalClient) send(signalCliSendRequest ds.SignalCliSendRequest) (*Send
509510
PreviewTitle *string `json:"preview-title,omitempty"`
510511
PreviewImage *string `json:"preview-image,omitempty"`
511512
PreviewDescription *string `json:"preview-description,omitempty"`
512-
ViewOnce bool `json:"view-once,omitempty"`
513+
ViewOnce bool `json:"view-once,omitempty"`
513514
}
514515

515516
request := Request{Message: signalCliSendRequest.Message}
@@ -981,17 +982,19 @@ func (s *SignalClient) RemoveReceiveChannel(channelUuid string) {
981982
jsonRpc2Client.RemoveReceiveChannel(channelUuid)
982983
}
983984

984-
func (s *SignalClient) CreateGroup(number string, name string, members []string, description string, editGroupPermission GroupPermission, addMembersPermission GroupPermission, groupLinkState GroupLinkState, expirationTime *int) (string, error) {
985+
func (s *SignalClient) CreateGroup(number string, name string, members []string, description string, editGroupPermission GroupPermission, addMembersPermission GroupPermission,
986+
sendMessagesPermission GroupPermission, groupLinkState GroupLinkState, expirationTime *int) (string, error) {
985987
var internalGroupId string
986988
if s.signalCliMode == JsonRpc {
987989
type Request struct {
988-
Name string `json:"name"`
989-
Members []string `json:"members"`
990-
Link string `json:"link,omitempty"`
991-
Description string `json:"description,omitempty"`
992-
EditGroupPermissions string `json:"setPermissionEditDetails,omitempty"`
993-
AddMembersPermissions string `json:"setPermissionAddMember,omitempty"`
994-
Expiration int `json:"expiration,omitempty"`
990+
Name string `json:"name"`
991+
Members []string `json:"members"`
992+
Link string `json:"link,omitempty"`
993+
Description string `json:"description,omitempty"`
994+
EditGroupPermissions string `json:"setPermissionEditDetails,omitempty"`
995+
AddMembersPermissions string `json:"setPermissionAddMember,omitempty"`
996+
SendMessagesPermissions string `json:"setPermissionSendMessages,omitempty"`
997+
Expiration int `json:"expiration,omitempty"`
995998
}
996999
request := Request{Name: name, Members: prefixUsernameMembers(members)}
9971000

@@ -1011,6 +1014,10 @@ func (s *SignalClient) CreateGroup(number string, name string, members []string,
10111014
request.AddMembersPermissions = addMembersPermission.String()
10121015
}
10131016

1017+
if sendMessagesPermission != DefaultGroupPermission {
1018+
request.SendMessagesPermissions = sendMessagesPermission.String()
1019+
}
1020+
10141021
if expirationTime != nil {
10151022
request.Expiration = *expirationTime
10161023
}
@@ -1046,6 +1053,10 @@ func (s *SignalClient) CreateGroup(number string, name string, members []string,
10461053
cmd = append(cmd, []string{"--set-permission-edit-details", editGroupPermission.String()}...)
10471054
}
10481055

1056+
if sendMessagesPermission != DefaultGroupPermission {
1057+
cmd = append(cmd, []string{"--set-permission-send-messages", sendMessagesPermission.String()}...)
1058+
}
1059+
10491060
if groupLinkState != DefaultGroupLinkState {
10501061
cmd = append(cmd, []string{"--link", groupLinkState.String()}...)
10511062
}
@@ -1077,7 +1088,7 @@ func prefixUsernameMembers(members []string) []string {
10771088
for _, member := range members {
10781089
recipientType, err := getRecipientType(member)
10791090
if err == nil && recipientType == ds.Username {
1080-
res = append(res, "u:" + member)
1091+
res = append(res, "u:"+member)
10811092
} else {
10821093
res = append(res, member)
10831094
}
@@ -1767,8 +1778,8 @@ func (s *SignalClient) QuitGroup(number string, groupId string) error {
17671778
return err
17681779
}
17691780

1770-
func (s *SignalClient) UpdateGroup(number string, groupId string, base64Avatar *string, groupDescription *string,
1771-
groupName *string, expirationTime *int, groupLinkState *GroupLinkState) error {
1781+
func (s *SignalClient) UpdateGroup(number string, groupId string, base64Avatar *string, groupDescription *string, groupName *string, expirationTime *int,
1782+
groupLinkState *GroupLinkState, editGroupPermission GroupPermission, addMembersPermission GroupPermission, sendMessagesPermission GroupPermission) error {
17721783
var err error
17731784
var avatarTmpPath string = ""
17741785
if base64Avatar != nil {
@@ -1808,12 +1819,15 @@ func (s *SignalClient) UpdateGroup(number string, groupId string, base64Avatar *
18081819

18091820
if s.signalCliMode == JsonRpc {
18101821
type Request struct {
1811-
GroupId string `json:"groupId"`
1812-
Avatar string `json:"avatar,omitempty"`
1813-
Description *string `json:"description,omitempty"`
1814-
Name *string `json:"name,omitempty"`
1815-
Expiration int `json:"expiration,omitempty"`
1816-
Link string `json:"link,omitempty"`
1822+
GroupId string `json:"groupId"`
1823+
Avatar string `json:"avatar,omitempty"`
1824+
Description *string `json:"description,omitempty"`
1825+
Name *string `json:"name,omitempty"`
1826+
Expiration int `json:"expiration,omitempty"`
1827+
Link string `json:"link,omitempty"`
1828+
EditGroupPermissions string `json:"setPermissionEditDetails,omitempty"`
1829+
AddMembersPermissions string `json:"setPermissionAddMember,omitempty"`
1830+
SendMessagesPermissions string `json:"setPermissionSendMessages,omitempty"`
18171831
}
18181832
request := Request{GroupId: groupId}
18191833

@@ -1832,6 +1846,18 @@ func (s *SignalClient) UpdateGroup(number string, groupId string, base64Avatar *
18321846
request.Link = (*groupLinkState).String()
18331847
}
18341848

1849+
if editGroupPermission != DefaultGroupPermission {
1850+
request.EditGroupPermissions = editGroupPermission.String()
1851+
}
1852+
1853+
if addMembersPermission != DefaultGroupPermission {
1854+
request.AddMembersPermissions = addMembersPermission.String()
1855+
}
1856+
1857+
if sendMessagesPermission != DefaultGroupPermission {
1858+
request.SendMessagesPermissions = sendMessagesPermission.String()
1859+
}
1860+
18351861
jsonRpc2Client, err := s.getJsonRpc2Client()
18361862
if err != nil {
18371863
return err
@@ -1859,6 +1885,18 @@ func (s *SignalClient) UpdateGroup(number string, groupId string, base64Avatar *
18591885
cmd = append(cmd, []string{"--link", (*groupLinkState).String()}...)
18601886
}
18611887

1888+
if addMembersPermission != DefaultGroupPermission {
1889+
cmd = append(cmd, []string{"--set-permission-add-member", addMembersPermission.String()}...)
1890+
}
1891+
1892+
if editGroupPermission != DefaultGroupPermission {
1893+
cmd = append(cmd, []string{"--set-permission-edit-details", editGroupPermission.String()}...)
1894+
}
1895+
1896+
if sendMessagesPermission != DefaultGroupPermission {
1897+
cmd = append(cmd, []string{"--set-permission-send-messages", sendMessagesPermission.String()}...)
1898+
}
1899+
18621900
_, err = s.cliClient.Execute(true, cmd, "")
18631901
}
18641902

src/docs/docs.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2371,6 +2371,13 @@ const docTemplate = `{
23712371
"only-admins",
23722372
"every-member"
23732373
]
2374+
},
2375+
"send_messages": {
2376+
"type": "string",
2377+
"enum": [
2378+
"only-admins",
2379+
"every-member"
2380+
]
23742381
}
23752382
}
23762383
},
@@ -2704,6 +2711,9 @@ const docTemplate = `{
27042711
},
27052712
"name": {
27062713
"type": "string"
2714+
},
2715+
"permissions": {
2716+
"$ref": "#/definitions/api.GroupPermissions"
27072717
}
27082718
}
27092719
},

src/docs/swagger.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2368,6 +2368,13 @@
23682368
"only-admins",
23692369
"every-member"
23702370
]
2371+
},
2372+
"send_messages": {
2373+
"type": "string",
2374+
"enum": [
2375+
"only-admins",
2376+
"every-member"
2377+
]
23712378
}
23722379
}
23732380
},
@@ -2701,6 +2708,9 @@
27012708
},
27022709
"name": {
27032710
"type": "string"
2711+
},
2712+
"permissions": {
2713+
"$ref": "#/definitions/api.GroupPermissions"
27042714
}
27052715
}
27062716
},

src/docs/swagger.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ definitions:
7676
- only-admins
7777
- every-member
7878
type: string
79+
send_messages:
80+
enum:
81+
- only-admins
82+
- every-member
83+
type: string
7984
type: object
8085
api.LoggingConfiguration:
8186
properties:
@@ -297,6 +302,8 @@ definitions:
297302
type: string
298303
name:
299304
type: string
305+
permissions:
306+
$ref: '#/definitions/api.GroupPermissions'
300307
type: object
301308
api.UpdateProfileRequest:
302309
properties:

0 commit comments

Comments
 (0)