Skip to content

Commit 9578989

Browse files
committed
Added access check for write and manage actions
1 parent 4625a30 commit 9578989

File tree

7 files changed

+93
-33
lines changed

7 files changed

+93
-33
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@
3232
- [x] Facebook
3333
- [x] Access Rights
3434
- [x] View
35-
- [ ] Edit / Create
35+
- [x] Edit / Create
3636
- [x] Background Agent (git sync, cache purge, etc.)
3737
- [x] Caching
3838
- [x] Create Entry
3939
- [x] Documentation
4040
- [x] Prerequisites
4141
- [x] Install
4242
- [ ] Authentication
43-
- [ ] Git
43+
- [x] Git
4444
- [x] Upgrade
4545
- [x] Edit Entry
4646
- [x] Git Management

controllers/admin.js

+24
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,21 @@ router.get('/', (req, res) => {
1212
});
1313

1414
router.get('/profile', (req, res) => {
15+
16+
if(res.locals.isGuest) {
17+
return res.render('error-forbidden');
18+
}
19+
1520
res.render('pages/admin/profile', { adminTab: 'profile' });
21+
1622
});
1723

1824
router.get('/stats', (req, res) => {
25+
26+
if(res.locals.isGuest) {
27+
return res.render('error-forbidden');
28+
}
29+
1930
Promise.all([
2031
db.Entry.count(),
2132
db.UplFile.count(),
@@ -28,14 +39,27 @@ router.get('/stats', (req, res) => {
2839
}).catch((err) => {
2940
throw err;
3041
});
42+
3143
});
3244

3345
router.get('/users', (req, res) => {
46+
47+
if(!res.locals.rights.manage) {
48+
return res.render('error-forbidden');
49+
}
50+
3451
res.render('pages/admin/users', { adminTab: 'users' });
52+
3553
});
3654

3755
router.get('/settings', (req, res) => {
56+
57+
if(!res.locals.rights.manage) {
58+
return res.render('error-forbidden');
59+
}
60+
3861
res.render('pages/admin/settings', { adminTab: 'settings' });
62+
3963
});
4064

4165
module.exports = router;

controllers/pages.js

+30-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ var _ = require('lodash');
1313
*/
1414
router.get('/edit/*', (req, res, next) => {
1515

16+
if(!res.locals.rights.write) {
17+
return res.render('error-forbidden');
18+
}
19+
1620
let safePath = entries.parsePath(_.replace(req.path, '/edit', ''));
1721

1822
entries.fetchOriginal(safePath, {
@@ -40,6 +44,13 @@ router.get('/edit/*', (req, res, next) => {
4044

4145
router.put('/edit/*', (req, res, next) => {
4246

47+
if(!res.locals.rights.write) {
48+
return res.json({
49+
ok: false,
50+
error: 'Forbidden'
51+
});
52+
}
53+
4354
let safePath = entries.parsePath(_.replace(req.path, '/edit', ''));
4455

4556
entries.update(safePath, req.body.markdown).then(() => {
@@ -61,6 +72,10 @@ router.put('/edit/*', (req, res, next) => {
6172

6273
router.get('/create/*', (req, res, next) => {
6374

75+
if(!res.locals.rights.write) {
76+
return res.render('error-forbidden');
77+
}
78+
6479
if(_.some(['create','edit','account','source','history','mk'], (e) => { return _.startsWith(req.path, '/create/' + e); })) {
6580
return res.render('error', {
6681
message: 'You cannot create a document with this name as it is reserved by the system.',
@@ -102,14 +117,21 @@ router.get('/create/*', (req, res, next) => {
102117

103118
router.put('/create/*', (req, res, next) => {
104119

120+
if(!res.locals.rights.write) {
121+
return res.json({
122+
ok: false,
123+
error: 'Forbidden'
124+
});
125+
}
126+
105127
let safePath = entries.parsePath(_.replace(req.path, '/create', ''));
106128

107129
entries.create(safePath, req.body.markdown).then(() => {
108130
return res.json({
109131
ok: true
110132
}) || true;
111133
}).catch((err) => {
112-
res.json({
134+
return res.json({
113135
ok: false,
114136
error: err.message
115137
});
@@ -192,6 +214,13 @@ router.get('/*', (req, res, next) => {
192214
*/
193215
router.put('/*', (req, res, next) => {
194216

217+
if(!res.locals.rights.write) {
218+
return res.json({
219+
ok: false,
220+
error: 'Forbidden'
221+
});
222+
}
223+
195224
let safePath = entries.parsePath(req.path);
196225

197226
if(_.isEmpty(req.body.move)) {

server.js

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ app.use(express.static(path.join(ROOTPATH, 'assets')));
8989

9090
var strategy = require(CORE_PATH + 'core-libs/auth')(passport, appconfig);
9191
global.rights = require(CORE_PATH + 'core-libs/rights');
92+
rights.init();
9293

9394
var sessionStore = new sessionMongoStore({
9495
mongooseConnection: db.connection,

views/pages/admin/_layout.pug

+9-8
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,15 @@ block content
4141
a(href='/admin/stats')
4242
i.icon-bar-graph-2
4343
span Stats
44-
li
45-
a(href='/admin/users')
46-
i.icon-users
47-
span Users
48-
li
49-
a(href='/admin/settings')
50-
i.icon-cog
51-
span Site Settings
44+
if rights.manage
45+
li
46+
a(href='/admin/users')
47+
i.icon-users
48+
span Users
49+
li
50+
a(href='/admin/settings')
51+
i.icon-cog
52+
span Site Settings
5253
li
5354
a(href='/logout')
5455
i.icon-delete2

views/pages/source.pug

+11-9
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,20 @@ block rootNavCenter
66
block rootNavRight
77
i.nav-item#notifload
88
span.nav-item
9-
a.button.is-outlined.btn-move-prompt.is-hidden
10-
i.icon-shuffle
11-
span Move
9+
if rights.write
10+
a.button.is-outlined.btn-move-prompt.is-hidden
11+
i.icon-shuffle
12+
span Move
1213
a.button.is-outlined(href='/' + pageData.meta.path)
1314
i.icon-loader
1415
span Normal View
15-
a.button.is-orange(href='/edit/' + pageData.meta.path)
16-
i.fa.fa-edit
17-
span Edit
18-
a.button.is-blue.btn-create-prompt
19-
i.fa.fa-plus
20-
span Create
16+
if rights.write
17+
a.button.is-orange(href='/edit/' + pageData.meta.path)
18+
i.fa.fa-edit
19+
span Edit
20+
a.button.is-blue.btn-create-prompt
21+
i.fa.fa-plus
22+
span Create
2123

2224
block content
2325

views/pages/view.pug

+16-13
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,20 @@ mixin tocMenu(ti)
1111
block rootNavRight
1212
i.nav-item#notifload
1313
.nav-item
14-
a.button.is-outlined.btn-move-prompt.is-hidden
15-
i.icon-shuffle
16-
span Move
14+
if rights.write
15+
a.button.is-outlined.btn-move-prompt.is-hidden
16+
i.icon-shuffle
17+
span Move
1718
a.button.is-outlined(href='/source/' + pageData.meta.path)
1819
i.icon-loader
1920
span Source
20-
a.button(href='/edit/' + pageData.meta.path)
21-
i.icon-document-text
22-
span Edit
23-
a.button.btn-create-prompt
24-
i.icon-plus
25-
span Create
21+
if rights.write
22+
a.button(href='/edit/' + pageData.meta.path)
23+
i.icon-document-text
24+
span Edit
25+
a.button.btn-create-prompt
26+
i.icon-plus
27+
span Create
2628

2729
block content
2830

@@ -46,10 +48,11 @@ block content
4648
a(href='/' + pageData.parent.path)
4749
i.icon-reply
4850
span= pageData.parent.title
49-
li
50-
a(href='/admin')
51-
i.icon-head
52-
span Account
51+
if !isGuest
52+
li
53+
a(href='/admin')
54+
i.icon-head
55+
span Account
5356
aside.stickyscroll(data-margin-top=40)
5457
.sidebar-label
5558
i.icon-th-list

0 commit comments

Comments
 (0)