Skip to content

Commit 1315084

Browse files
committed
Implement message permission and shutup command.
1 parent 2b14531 commit 1315084

File tree

9 files changed

+85
-38
lines changed

9 files changed

+85
-38
lines changed

CHANGES

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ Galene 0.9 (unreleased)
1717
* Implemented a contextual menu that triggers on a double click on
1818
a chat entry.
1919
* Added a new command "/stopshare".
20+
* Added a new permission "message" and new commands "shutup" and
21+
"unshutup".
2022

2123
14 April 2024: Galene 0.8.2
2224

README

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ nobody will be able to join the group. The following fields are allowed:
162162

163163
- `users`: is a dictionary that maps user names to dictionaries with
164164
entries `password` and `permissions`; `permissions` should be one of
165-
`op`, `present` or `passive`;
165+
`op`, `present`, `message` or `observe`.
166166
- `wildcard-user` is a dictionaries with entries `password` and `permissions`
167167
that will be used for usernames with no matching entry in the `users`
168168
dictionary;

group/description.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ type Permissions struct {
2424
}
2525

2626
var permissionsMap = map[string][]string{
27-
"op": []string{"op", "present", "token"},
28-
"present": []string{"present"},
27+
"op": []string{"op", "present", "message", "token"},
28+
"present": []string{"present", "message"},
29+
"message": []string{"message"},
2930
"observe": []string{},
3031
"admin": []string{"admin"},
3132
}
@@ -528,7 +529,7 @@ func upgradeDescription(desc *Description) error {
528529
desc.Presenter = nil
529530
}
530531
if desc.Other != nil {
531-
upgradeUsers(desc.Other, "observe")
532+
upgradeUsers(desc.Other, "message")
532533
desc.Other = nil
533534
}
534535

group/description_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ var descJSON = `
6363
"users": {
6464
"jch": {"password": "topsecret", "permissions": "op"},
6565
"john": {"password": "secret", "permissions": "present"},
66-
"james": {"password": "secret2", "permissions": "observe"},
66+
"james": {"password": "secret2", "permissions": "message"},
6767
"peter": {"password": "secret4"}
6868
},
6969
"wildcard-user":
70-
{"permissions": "observe", "password": {"type":"wildcard"}}
70+
{"permissions": "message", "password": {"type":"wildcard"}}
7171
}`
7272

7373
func TestDescriptionJSON(t *testing.T) {
@@ -139,6 +139,10 @@ func TestUpgradeDescription(t *testing.T) {
139139
}
140140

141141
for k, v1 := range d1.Users {
142+
if k == "peter" {
143+
// not representable in the old format
144+
continue
145+
}
142146
v2 := d2.Users[k]
143147
if !reflect.DeepEqual(v1.Password, v2.Password) ||
144148
!permissionsEqual(

group/group_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -114,19 +114,19 @@ type credPerm struct {
114114
var goodClients = []credPerm{
115115
{
116116
ClientCredentials{Username: &jch, Password: "topsecret"},
117-
[]string{"op", "present", "token"},
117+
[]string{"op", "present", "message", "token"},
118118
},
119119
{
120120
ClientCredentials{Username: &john, Password: "secret"},
121-
[]string{"present"},
121+
[]string{"present", "message"},
122122
},
123123
{
124124
ClientCredentials{Username: &james, Password: "secret2"},
125-
[]string{},
125+
[]string{"message"},
126126
},
127127
{
128128
ClientCredentials{Username: &paul, Password: "secret3"},
129-
[]string{},
129+
[]string{"message"},
130130
},
131131
{
132132
ClientCredentials{Username: &peter, Password: "secret4"},
@@ -189,29 +189,29 @@ func TestExtraPermissions(t *testing.T) {
189189
}
190190
}
191191

192-
doit("jch", []string{"op", "token", "present"})
193-
doit("john", []string{"present"})
192+
doit("jch", []string{"op", "token", "present", "message"})
193+
doit("john", []string{"present", "message"})
194194
doit("james", []string{})
195195

196196
d.AllowRecording = true
197197
d.UnrestrictedTokens = false
198198

199-
doit("jch", []string{"op", "record", "token", "present"})
200-
doit("john", []string{"present"})
199+
doit("jch", []string{"op", "record", "token", "present", "message"})
200+
doit("john", []string{"present", "message"})
201201
doit("james", []string{})
202202

203203
d.AllowRecording = false
204204
d.UnrestrictedTokens = true
205205

206-
doit("jch", []string{"op", "token", "present"})
207-
doit("john", []string{"token", "present"})
206+
doit("jch", []string{"op", "token", "present", "message"})
207+
doit("john", []string{"token", "present", "message"})
208208
doit("james", []string{})
209209

210210
d.AllowRecording = true
211211
d.UnrestrictedTokens = true
212212

213-
doit("jch", []string{"op", "record", "token", "present"})
214-
doit("john", []string{"token", "present"})
213+
doit("jch", []string{"op", "record", "token", "present", "message"})
214+
doit("john", []string{"token", "present", "message"})
215215
doit("james", []string{})
216216
}
217217

rtpconn/webclient.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1349,6 +1349,10 @@ func setPermissions(g *group.Group, id string, perm string) error {
13491349
c.permissions = addnew("present", c.permissions)
13501350
case "unpresent":
13511351
c.permissions = remove("present", c.permissions)
1352+
case "shutup":
1353+
c.permissions = remove("message", c.permissions)
1354+
case "unshutup":
1355+
c.permissions = addnew("message", c.permissions)
13521356
default:
13531357
return group.UserError("unknown permission")
13541358
}
@@ -1570,6 +1574,10 @@ func handleClientMessage(c *webClient, m clientMessage) error {
15701574
return c.error(group.UserError("join a group first"))
15711575
}
15721576

1577+
if !member("message", c.permissions) {
1578+
return c.error(group.UserError("not authorised"))
1579+
}
1580+
15731581
now := time.Now()
15741582

15751583
if m.Type == "chat" {
@@ -1855,7 +1863,7 @@ func handleClientMessage(c *webClient, m clientMessage) error {
18551863
return c.error(group.UserError("join a group first"))
18561864
}
18571865
switch m.Kind {
1858-
case "op", "unop", "present", "unpresent":
1866+
case "op", "unop", "present", "unpresent", "shutup", "unshutup":
18591867
if !member("op", c.permissions) {
18601868
return c.error(group.UserError("not authorised"))
18611869
}

static/galene.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3288,10 +3288,13 @@ function makeToken(template) {
32883288
v["not-before"] = template["not-before"];
32893289
if('permissions' in template)
32903290
v.permissions = template.permissions;
3291-
else if(serverConnection.permissions.indexOf('present') >= 0)
3292-
v.permissions = ['present'];
3293-
else
3291+
else {
32943292
v.permissions = [];
3293+
if(serverConnection.permissions.indexOf('present') >= 0)
3294+
v.permissions.push('present');
3295+
if(serverConnection.permissions.indexOf('message') >= 0)
3296+
v.permissions.push('message');
3297+
}
32953298
serverConnection.groupAction('maketoken', v);
32963299
}
32973300

@@ -3520,6 +3523,20 @@ commands.unpresent = {
35203523
f: userCommand,
35213524
};
35223525

3526+
commands.shutup = {
3527+
parameters: 'user',
3528+
description: 'revoke the right to send chat messages',
3529+
predicate: operatorPredicate,
3530+
f: userCommand,
3531+
};
3532+
3533+
commands.unshutup = {
3534+
parameters: 'user',
3535+
description: 'give the right to send chat messages',
3536+
predicate: operatorPredicate,
3537+
f: userCommand,
3538+
};
3539+
35233540
commands.mute = {
35243541
parameters: 'user',
35253542
description: 'mute a remote user',

token/stateful.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,15 @@ func (token *Stateful) Check(host, group string, username *string) (string, []st
106106
return user, token.Permissions, nil
107107
}
108108

109+
func member(v string, l []string) bool {
110+
for _, w := range l {
111+
if v == w {
112+
return true
113+
}
114+
}
115+
return false
116+
}
117+
109118
// load updates the state from the corresponding file.
110119
// called locked
111120
func (state *state) load() (string, error) {
@@ -155,6 +164,12 @@ func (state *state) load() (string, error) {
155164
state.fileSize = 0
156165
return "", err
157166
}
167+
// the "message" permission was introduced in Galene 0.9,
168+
// so add it to tokens read from disk. We can remove this
169+
// hack in late 2024.
170+
if !member("message", t.Permissions) {
171+
t.Permissions = append(t.Permissions, "message")
172+
}
158173
ts[t.Token] = &t
159174
}
160175
state.tokens = ts

token/stateful_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,27 +48,27 @@ func TestStatefulCheck(t *testing.T) {
4848
Token: "token",
4949
Group: "group",
5050
Username: &user,
51-
Permissions: []string{"present"},
51+
Permissions: []string{"present", "message"},
5252
Expires: &future,
5353
}
5454
token2 := &Stateful{
5555
Token: "token",
5656
Group: "group",
57-
Permissions: []string{"present"},
57+
Permissions: []string{"present", "message"},
5858
Expires: &future,
5959
}
6060
token3 := &Stateful{
6161
Token: "token",
6262
Group: "group",
6363
Username: &user,
64-
Permissions: []string{"present"},
64+
Permissions: []string{"present", "message"},
6565
Expires: &past,
6666
}
6767
token4 := &Stateful{
6868
Token: "token",
6969
Group: "group",
7070
Username: &user,
71-
Permissions: []string{"present"},
71+
Permissions: []string{"present", "message"},
7272
Expires: &future,
7373
NotBefore: &nearFuture,
7474
}
@@ -85,27 +85,27 @@ func TestStatefulCheck(t *testing.T) {
8585
group: "group",
8686
username: &user,
8787
expUsername: user,
88-
expPermissions: []string{"present"},
88+
expPermissions: []string{"present", "message"},
8989
},
9090
{
9191
token: token1,
9292
group: "group",
9393
username: &user2,
9494
expUsername: user,
95-
expPermissions: []string{"present"},
95+
expPermissions: []string{"present", "message"},
9696
},
9797
{
9898
token: token1,
9999
group: "group",
100100
expUsername: user,
101-
expPermissions: []string{"present"},
101+
expPermissions: []string{"present", "message"},
102102
},
103103
{
104104
token: token2,
105105
group: "group",
106106
username: &user,
107107
expUsername: "",
108-
expPermissions: []string{"present"},
108+
expPermissions: []string{"present", "message"},
109109
},
110110
}
111111

@@ -232,22 +232,22 @@ func TestTokenStorage(t *testing.T) {
232232
Token: "tok1",
233233
Group: "test",
234234
Username: &user1,
235-
Permissions: []string{"present"},
235+
Permissions: []string{"present", "message"},
236236
Expires: &future,
237237
},
238238
&Stateful{
239239
Token: "tok2",
240240
Group: "test",
241241
Username: &user2,
242-
Permissions: []string{"present", "record"},
242+
Permissions: []string{"present", "record", "message"},
243243
Expires: &nearFuture,
244244
NotBefore: &past,
245245
},
246246
&Stateful{
247247
Token: "tok3",
248248
Group: "test",
249249
Username: &user3,
250-
Permissions: []string{"present"},
250+
Permissions: []string{"present", "message"},
251251
Expires: &nearFuture,
252252
},
253253
}
@@ -327,35 +327,35 @@ func TestExpire(t *testing.T) {
327327
Token: "tok1",
328328
Group: "test",
329329
Username: &user,
330-
Permissions: []string{"present"},
330+
Permissions: []string{"present", "message"},
331331
Expires: &now,
332332
},
333333
&Stateful{
334334
Token: "tok2",
335335
Group: "test",
336336
Username: &user,
337-
Permissions: []string{"present"},
337+
Permissions: []string{"present", "message"},
338338
Expires: &future,
339339
},
340340
&Stateful{
341341
Token: "tok3",
342342
Group: "test",
343343
Username: &user,
344-
Permissions: []string{"present"},
344+
Permissions: []string{"present", "message"},
345345
Expires: &now,
346346
},
347347
&Stateful{
348348
Token: "tok4",
349349
Group: "test",
350350
Username: &user,
351-
Permissions: []string{"present"},
351+
Permissions: []string{"present", "message"},
352352
Expires: &past,
353353
},
354354
&Stateful{
355355
Token: "tok5",
356356
Group: "test",
357357
Username: &user,
358-
Permissions: []string{"present"},
358+
Permissions: []string{"present", "message"},
359359
Expires: &longPast,
360360
},
361361
}

0 commit comments

Comments
 (0)