Skip to content

Commit fdbfb71

Browse files
authored
Add allowAnonymousViews option (#1152)
Add allowAnonymousViews option
2 parents df2c0e2 + c7a15ec commit fdbfb71

File tree

7 files changed

+113
-13
lines changed

7 files changed

+113
-13
lines changed

app.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ app.locals.serverURL = config.serverURL
180180
app.locals.sourceURL = config.sourceURL
181181
app.locals.allowAnonymous = config.allowAnonymous
182182
app.locals.allowAnonymousEdits = config.allowAnonymousEdits
183+
app.locals.permission = config.permission
183184
app.locals.allowPDFExport = config.allowPDFExport
184185
app.locals.authProviders = {
185186
facebook: config.isFacebookEnable,

lib/config/default.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ module.exports = {
3131
useCDN: true,
3232
allowAnonymous: true,
3333
allowAnonymousEdits: false,
34+
allowAnonymousViews: true,
3435
allowFreeURL: false,
3536
forbiddenNoteIDs: ['robots.txt', 'favicon.ico', 'api'],
3637
defaultPermission: 'editable',

lib/config/environment.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ module.exports = {
2727
useCDN: toBooleanConfig(process.env.CMD_USECDN),
2828
allowAnonymous: toBooleanConfig(process.env.CMD_ALLOW_ANONYMOUS),
2929
allowAnonymousEdits: toBooleanConfig(process.env.CMD_ALLOW_ANONYMOUS_EDITS),
30+
allowAnonymousViews: toBooleanConfig(process.env.CMD_ALLOW_ANONYMOUS_VIEWS),
3031
allowFreeURL: toBooleanConfig(process.env.CMD_ALLOW_FREEURL),
3132
forbiddenNoteIDs: toArrayConfig(process.env.CMD_FORBIDDEN_NOTE_IDS),
3233
defaultPermission: process.env.CMD_DEFAULT_PERMISSION,

lib/config/index.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,17 @@ if (config.ldap.tlsca) {
6868

6969
// Permission
7070
config.permission = Permission
71-
if (!config.allowAnonymous && !config.allowAnonymousEdits) {
71+
let defaultPermission = config.permission.editable
72+
if (!config.allowAnonymous && !config.allowAnonymousViews) {
73+
delete config.permission.freely
74+
delete config.permission.editable
75+
delete config.permission.locked
76+
defaultPermission = config.permission.limited
77+
} else if (!config.allowAnonymous && !config.allowAnonymousEdits) {
7278
delete config.permission.freely
7379
}
7480
if (!(config.defaultPermission in config.permission)) {
75-
config.defaultPermission = config.permission.editable
81+
config.defaultPermission = defaultPermission
7682
}
7783

7884
// cache result, cannot change config in runtime!!!

lib/realtimeClientConnection.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,19 @@ class RealtimeClientConnection {
5757
return config.allowAnonymous || config.allowAnonymousEdits
5858
}
5959

60+
getAvailablePermissions () {
61+
// TODO: move this method to config module
62+
const availablePermission = Object.assign({}, config.permission)
63+
if (!config.allowAnonymous && !config.allowAnonymousViews) {
64+
delete availablePermission.freely
65+
delete availablePermission.editable
66+
delete availablePermission.locked
67+
} else if (!config.allowAnonymous && !config.allowAnonymousEdits) {
68+
delete availablePermission.freely
69+
}
70+
return availablePermission
71+
}
72+
6073
getCurrentUser () {
6174
if (!this.socket.id) return
6275
return this.realtime.getUserFromUserPool(this.socket.id)
@@ -211,7 +224,7 @@ class RealtimeClientConnection {
211224
const note = this.getCurrentNote()
212225
// Only owner can change permission
213226
if (!this.isNoteOwner()) return
214-
if (!this.isAnonymousEnable() && permission === 'freely') return
227+
if (!(permission in this.getAvailablePermissions())) return
215228

216229
this.changeNotePermission(permission)
217230
.then(() => {

public/views/codimd/body.ejs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
<a id="permissionLabel" class="ui-permission-label text-uppercase" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
1616
</a>
1717
<ul class="dropdown-menu" aria-labelledby="permissionLabel">
18-
<li class="ui-permission-freely"<% if(!allowAnonymous && !allowAnonymousEdits) { %> style="display: none;"<% } %>><a><i class="fa fa-leaf fa-fw"></i> Freely - Anyone can edit</a></li>
19-
<li class="ui-permission-editable"><a><i class="fa fa-shield fa-fw"></i> Editable - Signed-in people can edit</a></li>
20-
<li class="ui-permission-limited"><a><i class="fa fa-id-card fa-fw"></i> Limited - Signed-in people can edit (forbid guests)</a></li>
21-
<li class="ui-permission-locked"><a><i class="fa fa-lock fa-fw"></i> Locked - Only owner can edit</a></li>
22-
<li class="ui-permission-protected"><a><i class="fa fa-umbrella fa-fw"></i> Protected - Only owner can edit (forbid guests)</a></li>
23-
<li class="ui-permission-private"><a><i class="fa fa-hand-stop-o fa-fw"></i> Private - Only owner can view &amp; edit</a></li>
18+
<li class="ui-permission-freely"<% if(!('freely' in permission)) { %> style="display: none;"<% } %>><a><i class="fa fa-leaf fa-fw"></i> Freely - Anyone can edit</a></li>
19+
<li class="ui-permission-editable"<% if(!('editable' in permission)) { %> style="display: none;"<% } %>><a><i class="fa fa-shield fa-fw"></i> Editable - Signed-in people can edit</a></li>
20+
<li class="ui-permission-limited"<% if(!('limited' in permission)) { %> style="display: none;"<% } %>><a><i class="fa fa-id-card fa-fw"></i> Limited - Signed-in people can edit (forbid guests)</a></li>
21+
<li class="ui-permission-locked"<% if(!('locked' in permission)) { %> style="display: none;"<% } %>><a><i class="fa fa-lock fa-fw"></i> Locked - Only owner can edit</a></li>
22+
<li class="ui-permission-protected"<% if(!('protected' in permission)) { %> style="display: none;"<% } %>><a><i class="fa fa-umbrella fa-fw"></i> Protected - Only owner can edit (forbid guests)</a></li>
23+
<li class="ui-permission-private"<% if(!('private' in permission)) { %> style="display: none;"<% } %>><a><i class="fa fa-hand-stop-o fa-fw"></i> Private - Only owner can view &amp; edit</a></li>
2424
<li class="divider"></li>
2525
<li class="ui-delete-note"><a><i class="fa fa-trash-o fa-fw"></i> Delete this note</a></li>
2626
</ul>

test/realtime/socket-events.test.js

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,15 @@ describe('realtime#socket event', function () {
5656
})
5757
configMock = {
5858
fullversion: '1.5.0',
59-
minimumCompatibleVersion: '1.0.0'
59+
minimumCompatibleVersion: '1.0.0',
60+
permission: {
61+
freely: 'freely',
62+
editable: 'editable',
63+
limited: 'limited',
64+
locked: 'locked',
65+
protected: 'protected',
66+
private: 'private'
67+
}
6068
}
6169
mock('../../lib/logger', {
6270
error: () => {
@@ -522,9 +530,10 @@ describe('realtime#socket event', function () {
522530
}, 5)
523531
})
524532

525-
it('should change permission to freely when config allowAnonymous and allowAnonymousEdits are true', function (done) {
533+
it('should change permission to freely when config allowAnonymous, allowAnonymousEdits and allowAnonymousViews are true', function (done) {
526534
configMock.allowAnonymous = true
527535
configMock.allowAnonymousEdits = true
536+
configMock.allowAnonymousViews = true
528537
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
529538

530539
permissionFunc('freely')
@@ -539,9 +548,10 @@ describe('realtime#socket event', function () {
539548
}, 5)
540549
})
541550

542-
it('should not change permission to freely when config allowAnonymous and allowAnonymousEdits are false', function (done) {
551+
it('should not change permission to freely when config allowAnonymous, allowAnonymousEdits and allowAnonymousViews are false', function (done) {
543552
configMock.allowAnonymous = false
544553
configMock.allowAnonymousEdits = false
554+
configMock.allowAnonymousViews = false
545555
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
546556

547557
permissionFunc('freely')
@@ -556,6 +566,7 @@ describe('realtime#socket event', function () {
556566
it('should change permission to freely when config allowAnonymous is true', function (done) {
557567
configMock.allowAnonymous = true
558568
configMock.allowAnonymousEdits = false
569+
configMock.allowAnonymousViews = false
559570
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
560571

561572
permissionFunc('freely')
@@ -570,13 +581,80 @@ describe('realtime#socket event', function () {
570581
}, 5)
571582
})
572583

573-
it('should change permission to freely when config allowAnonymousEdits is true', function (done) {
584+
it('should not change permission to freely when config allowAnonymousEdits is true', function (done) {
574585
configMock.allowAnonymous = false
575586
configMock.allowAnonymousEdits = true
587+
configMock.allowAnonymousViews = false
576588
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
577589

578590
permissionFunc('freely')
579591

592+
setTimeout(() => {
593+
assert(modelsMock.Note.update.called === false)
594+
assert(checkViewPermissionSpy.called === false)
595+
done()
596+
}, 5)
597+
})
598+
599+
it('should not change permission to freely when config allowAnonymousViews is true', function (done) {
600+
configMock.allowAnonymous = false
601+
configMock.allowAnonymousEdits = false
602+
configMock.allowAnonymousViews = true
603+
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
604+
605+
permissionFunc('freely')
606+
607+
setTimeout(() => {
608+
assert(modelsMock.Note.update.called === false)
609+
assert(checkViewPermissionSpy.called === false)
610+
done()
611+
}, 5)
612+
})
613+
614+
it('should change permission to editable when config allowAnonymousViews is true', function (done) {
615+
configMock.allowAnonymous = false
616+
configMock.allowAnonymousEdits = false
617+
configMock.allowAnonymousViews = true
618+
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
619+
620+
permissionFunc('editable')
621+
622+
setTimeout(() => {
623+
assert(checkViewPermissionSpy.callCount === 2)
624+
assert(otherClient.emit.called === false)
625+
assert(otherClient.disconnect.called === false)
626+
assert(clientSocket.emit.called === false)
627+
assert(clientSocket.disconnect.called === false)
628+
done()
629+
}, 5)
630+
})
631+
632+
it('should change permission to freely when config allowAnonymousEdits and allowAnonymousViews are false true', function (done) {
633+
configMock.allowAnonymous = false
634+
configMock.allowAnonymousEdits = true
635+
configMock.allowAnonymousViews = true
636+
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
637+
638+
permissionFunc('freely')
639+
640+
setTimeout(() => {
641+
assert(checkViewPermissionSpy.callCount === 2)
642+
assert(otherClient.emit.called === false)
643+
assert(otherClient.disconnect.called === false)
644+
assert(clientSocket.emit.called === false)
645+
assert(clientSocket.disconnect.called === false)
646+
done()
647+
}, 5)
648+
})
649+
650+
it('should change permission to editable when config allowAnonymousEdits and allowAnonymousViews are false true', function (done) {
651+
configMock.allowAnonymous = false
652+
configMock.allowAnonymousEdits = true
653+
configMock.allowAnonymousViews = true
654+
realtime.notes[noteId].socks = [clientSocket, undefined, otherClient]
655+
656+
permissionFunc('editable')
657+
580658
setTimeout(() => {
581659
assert(checkViewPermissionSpy.callCount === 2)
582660
assert(otherClient.emit.called === false)

0 commit comments

Comments
 (0)