pull/7915/merge
Alvaro GJ 1 week ago committed by GitHub
commit 0a7d207fef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -58,6 +58,13 @@ export default {
restrictedForSystem: true, restrictedForSystem: true,
disabled: false disabled: false
}, },
{
permission: 'write:tags',
hint: 'Can add, edit and remove page tags, as specified in the Page Rules',
warning: false,
restrictedForSystem: true,
disabled: false
},
{ {
permission: 'manage:pages', permission: 'manage:pages',
hint: 'Can move existing pages as specified in the Page Rules', hint: 'Can move existing pages as specified in the Page Rules',

@ -215,6 +215,7 @@ export default {
roles: [ roles: [
{ text: 'Read Pages', value: 'read:pages', icon: 'mdi-file-eye-outline' }, { text: 'Read Pages', value: 'read:pages', icon: 'mdi-file-eye-outline' },
{ text: 'Create + Edit Pages', value: 'write:pages', icon: 'mdi-file-plus-outline' }, { text: 'Create + Edit Pages', value: 'write:pages', icon: 'mdi-file-plus-outline' },
{ text: 'Manage Tags', value: 'write:tags', icon: 'mdi-tag-text-outline' },
{ text: 'Rename / Move Pages', value: 'manage:pages', icon: 'mdi-file-document-edit-outline' }, { text: 'Rename / Move Pages', value: 'manage:pages', icon: 'mdi-file-document-edit-outline' },
{ text: 'Delete Pages', value: 'delete:pages', icon: 'mdi-file-remove-outline' }, { text: 'Delete Pages', value: 'delete:pages', icon: 'mdi-file-remove-outline' },
{ text: 'View Pages Source', value: 'read:source', icon: 'mdi-code-tags' }, { text: 'View Pages Source', value: 'read:source', icon: 'mdi-code-tags' },

@ -73,7 +73,7 @@
v-chip( v-chip(
v-for='tag of tags' v-for='tag of tags'
:key='`tag-` + tag' :key='`tag-` + tag'
close :close='hasTagsPermission'
label label
color='teal' color='teal'
text-color='teal lighten-5' text-color='teal lighten-5'
@ -84,6 +84,7 @@
outlined outlined
v-model='newTag' v-model='newTag'
:hint='$t(`editor:props.tagsHint`)' :hint='$t(`editor:props.tagsHint`)'
:disabled='!hasTagsPermission'
:items='newTagSuggestions' :items='newTagSuggestions'
:loading='$apollo.queries.newTagSuggestions.loading' :loading='$apollo.queries.newTagSuggestions.loading'
persistent-hint persistent-hint
@ -301,6 +302,7 @@ export default {
scriptCss: sync('page/scriptCss'), scriptCss: sync('page/scriptCss'),
hasScriptPermission: get('page/effectivePermissions@pages.script'), hasScriptPermission: get('page/effectivePermissions@pages.script'),
hasStylePermission: get('page/effectivePermissions@pages.style'), hasStylePermission: get('page/effectivePermissions@pages.style'),
hasTagsPermission: get('page/effectivePermissions@tags.write'),
pageSelectorMode () { pageSelectorMode () {
return (this.mode === 'create') ? 'create' : 'move' return (this.mode === 'create') ? 'create' : 'move'
} }
@ -314,6 +316,10 @@ export default {
} }
}, },
newTag (newValue, oldValue) { newTag (newValue, oldValue) {
if (!this.hasTagsPermission) {
this.newTag = null
return
}
const tagClean = _.trim(newValue || '').toLowerCase() const tagClean = _.trim(newValue || '').toLowerCase()
if (tagClean && tagClean.length > 0) { if (tagClean && tagClean.length > 0) {
if (!_.includes(this.tags, tagClean)) { if (!_.includes(this.tags, tagClean)) {
@ -345,6 +351,9 @@ export default {
}, },
methods: { methods: {
removeTag (tag) { removeTag (tag) {
if (!this.hasTagsPermission) {
return
}
this.tags = _.without(this.tags, tag) this.tags = _.without(this.tags, tag)
}, },
close() { close() {

@ -37,6 +37,9 @@ const state = {
script: false, script: false,
style: false style: false
}, },
tags: {
write: false
},
system: { system: {
manage: false manage: false
} }

@ -514,6 +514,9 @@ module.exports = {
script: WIKI.auth.checkAccess(req.user, ['write:scripts'], page), script: WIKI.auth.checkAccess(req.user, ['write:scripts'], page),
style: WIKI.auth.checkAccess(req.user, ['write:styles'], page) style: WIKI.auth.checkAccess(req.user, ['write:styles'], page)
}, },
tags: {
write: WIKI.auth.checkAccess(req.user, ['write:tags'], page)
},
system: { system: {
manage: WIKI.auth.checkAccess(req.user, ['manage:system'], page) manage: WIKI.auth.checkAccess(req.user, ['manage:system'], page)
} }

@ -193,6 +193,10 @@ module.exports = {
message: 'You are not authorized to restore this page version.', message: 'You are not authorized to restore this page version.',
code: 6011 code: 6011
}), }),
PageTagsUpdateForbidden: CustomError('PageTagsUpdateForbidden', {
message: 'You are not authorized to modify tags on this page.',
code: 6014
}),
PageUpdateForbidden: CustomError('PageUpdateForbidden', { PageUpdateForbidden: CustomError('PageUpdateForbidden', {
message: 'You are not authorized to update this page.', message: 'You are not authorized to update this page.',
code: 6009 code: 6009

@ -326,6 +326,13 @@ module.exports = class Page extends Model {
// -> Save Tags // -> Save Tags
if (opts.tags && opts.tags.length > 0) { if (opts.tags && opts.tags.length > 0) {
if (!WIKI.auth.checkAccess(opts.user, ['write:tags'], {
locale: opts.locale,
path: opts.path,
tags: []
})) {
throw new WIKI.Error.PageTagsUpdateForbidden()
}
await WIKI.models.tags.associateTags({ tags: opts.tags, page }) await WIKI.models.tags.associateTags({ tags: opts.tags, page })
} }
@ -387,6 +394,24 @@ module.exports = class Page extends Model {
throw new WIKI.Error.PageEmptyContent() throw new WIKI.Error.PageEmptyContent()
} }
// -> Check for tag updates
const currentTagModels = await ogPage.$relatedQuery('tags').select('tag')
const currentTags = currentTagModels.map(tag => tag.tag)
const requestedTags = Array.isArray(opts.tags) ? opts.tags : currentTags
const normalizeTags = tags => _.uniq(tags
.map(tag => _.trim(tag).toLowerCase())
.filter(tag => tag.length > 0))
.sort()
if (!WIKI.auth.checkAccess(opts.user, ['write:tags'], {
locale: ogPage.localeCode,
path: ogPage.path,
tags: currentTagModels
})) {
if (!_.isEqual(normalizeTags(currentTags), normalizeTags(requestedTags))) {
throw new WIKI.Error.PageTagsUpdateForbidden()
}
}
// -> Create version snapshot // -> Create version snapshot
await WIKI.models.pageHistory.addVersion({ await WIKI.models.pageHistory.addVersion({
...ogPage, ...ogPage,
@ -440,7 +465,7 @@ module.exports = class Page extends Model {
let page = await WIKI.models.pages.getPageFromDb(ogPage.id) let page = await WIKI.models.pages.getPageFromDb(ogPage.id)
// -> Save Tags // -> Save Tags
await WIKI.models.tags.associateTags({ tags: opts.tags, page }) await WIKI.models.tags.associateTags({ tags: requestedTags, page })
// -> Render page to HTML // -> Render page to HTML
await WIKI.models.pages.renderPage(page) await WIKI.models.pages.renderPage(page)

Loading…
Cancel
Save