diff --git a/src/api/api.go b/src/api/api.go index 371e514..60b1dae 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -40,9 +40,17 @@ type GroupEntry struct { InviteLink string `json:"invite_link"` } +type GroupPermissions struct { + AddMembers string `json:"add_members" enums:"every-member,only-admins"` + EditGroup string `json:"edit_group" enums:"every-member,only-admins"` +} + type CreateGroupRequest struct { Name string `json:"name"` Members []string `json:"members"` + Description string `json:"description"` + Permissions GroupPermissions `json:"permissions"` + GroupLinkState string `json:"group_link" enums:"enabled,enabled-with-approval,disabled"` } type LoggingConfiguration struct { @@ -667,9 +675,40 @@ func (a *Api) CreateGroup(c *gin.Context) { return } + if req.Permissions.AddMembers != "" && !utils.StringInSlice(req.Permissions.AddMembers, []string{"every-member", "only-admins"}) { + c.JSON(400, gin.H{"error": "Invalid add members permission provided - only 'every-member' and 'only-admins' allowed!"}) + return + } + + if req.Permissions.EditGroup != "" && !utils.StringInSlice(req.Permissions.EditGroup, []string{"every-member", "only-admins"}) { + c.JSON(400, gin.H{"error": "Invalid edit group permissions provided - only 'every-member' and 'only-admins' allowed!"}) + return + } + + if req.GroupLinkState != "" && !utils.StringInSlice(req.GroupLinkState, []string{"enabled", "enabled-with-approval", "disabled"}) { + c.JSON(400, gin.H{"error": "Invalid group link provided - only 'enabled', 'enabled-with-approval' and 'disabled' allowed!" }) + return + } + cmd := []string{"--config", a.signalCliConfig, "-u", number, "updateGroup", "-n", req.Name, "-m"} cmd = append(cmd, req.Members...) + if req.Permissions.AddMembers != "" { + cmd = append(cmd, []string{"--set-permission-add-member", req.Permissions.AddMembers}...) + } + + if req.Permissions.EditGroup != "" { + cmd = append(cmd, []string{"--set-permission-edit-details", req.Permissions.EditGroup}...) + } + + if req.GroupLinkState != "" { + cmd = append(cmd, []string{"--link", req.GroupLinkState}...) + } + + if req.Description != "" { + cmd = append(cmd, []string{"--description", req.Description}...) + } + out, err := runSignalCli(true, cmd, "") if err != nil { if strings.Contains(err.Error(), signalCliV2GroupError) { diff --git a/src/docs/docs.go b/src/docs/docs.go index 079834f..dce44bf 100644 --- a/src/docs/docs.go +++ b/src/docs/docs.go @@ -944,6 +944,17 @@ var doc = `{ "api.CreateGroupRequest": { "type": "object", "properties": { + "description": { + "type": "string" + }, + "group_link": { + "type": "string", + "enum": [ + "enabled", + "enabled-with-approval", + "disabled" + ] + }, "members": { "type": "array", "items": { @@ -952,6 +963,10 @@ var doc = `{ }, "name": { "type": "string" + }, + "permissions": { + "type": "object", + "$ref": "#/definitions/api.GroupPermissions" } } }, @@ -1009,6 +1024,25 @@ var doc = `{ } } }, + "api.GroupPermissions": { + "type": "object", + "properties": { + "add_members": { + "type": "string", + "enum": [ + "every-member", + "only-admins" + ] + }, + "edit_group": { + "type": "string", + "enum": [ + "every-member", + "only-admins" + ] + } + } + }, "api.IdentityEntry": { "type": "object", "properties": { diff --git a/src/docs/swagger.json b/src/docs/swagger.json index 9401f6c..e6b0d62 100644 --- a/src/docs/swagger.json +++ b/src/docs/swagger.json @@ -929,6 +929,17 @@ "api.CreateGroupRequest": { "type": "object", "properties": { + "description": { + "type": "string" + }, + "group_link": { + "type": "string", + "enum": [ + "enabled", + "enabled-with-approval", + "disabled" + ] + }, "members": { "type": "array", "items": { @@ -937,6 +948,10 @@ }, "name": { "type": "string" + }, + "permissions": { + "type": "object", + "$ref": "#/definitions/api.GroupPermissions" } } }, @@ -994,6 +1009,25 @@ } } }, + "api.GroupPermissions": { + "type": "object", + "properties": { + "add_members": { + "type": "string", + "enum": [ + "every-member", + "only-admins" + ] + }, + "edit_group": { + "type": "string", + "enum": [ + "every-member", + "only-admins" + ] + } + } + }, "api.IdentityEntry": { "type": "object", "properties": { diff --git a/src/docs/swagger.yaml b/src/docs/swagger.yaml index e4b5610..794d9ab 100644 --- a/src/docs/swagger.yaml +++ b/src/docs/swagger.yaml @@ -17,12 +17,23 @@ definitions: type: object api.CreateGroupRequest: properties: + description: + type: string + group_link: + enum: + - enabled + - enabled-with-approval + - disabled + type: string members: items: type: string type: array name: type: string + permissions: + $ref: '#/definitions/api.GroupPermissions' + type: object type: object api.CreateGroupResponse: properties: @@ -59,6 +70,19 @@ definitions: type: string type: array type: object + api.GroupPermissions: + properties: + add_members: + enum: + - every-member + - only-admins + type: string + edit_group: + enum: + - every-member + - only-admins + type: string + type: object api.IdentityEntry: properties: added: diff --git a/src/utils/utils.go b/src/utils/utils.go index 9616c75..c534ee3 100644 --- a/src/utils/utils.go +++ b/src/utils/utils.go @@ -22,3 +22,12 @@ func GetIntEnv(key string, defaultVal int) (int, error) { } return defaultVal, nil } + +func StringInSlice(a string, list []string) bool { + for _, b := range list { + if b == a { + return true + } + } + return false +}