From c9b0df752f48d923b7d0633597cc58a39d61766d Mon Sep 17 00:00:00 2001 From: Fabian Becker Date: Sat, 6 Sep 2014 20:16:14 +0000 Subject: [PATCH] Cleanup reserved words in generateSlug closes #1889 - Adds a new filter for slugs - Move slugs to config.slugs --- core/server/config/index.js | 7 ++++++ core/server/controllers/frontend.js | 2 +- core/server/models/base.js | 35 ++++++++++++++++------------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/core/server/config/index.js b/core/server/config/index.js index bd23e0f3c5..231b2426b1 100644 --- a/core/server/config/index.js +++ b/core/server/config/index.js @@ -132,6 +132,13 @@ ConfigManager.prototype.set = function (config) { theme: { // normalise the URL by removing any trailing slash url: this._config.url ? this._config.url.replace(/\/$/, '') : '' + }, + slugs: { + // Used by generateSlug to generate slugs for posts, tags, users, .. + // reserved slugs are reserved but can be extended/removed by apps + // protected slugs cannot be changed or removed + reserved: ['admin', 'app', 'apps', 'archive', 'archives', 'categories', 'category', 'dashboard', 'feed', 'ghost-admin', 'login', 'logout', 'page', 'pages', 'post', 'posts', 'public', 'register', 'setup', 'signin', 'signout', 'signup', 'tag', 'tags', 'user', 'users', 'wp-admin', 'wp-login'], + protected: ['ghost', 'rss'] } }); diff --git a/core/server/controllers/frontend.js b/core/server/controllers/frontend.js index b84242a93e..71d000995e 100644 --- a/core/server/controllers/frontend.js +++ b/core/server/controllers/frontend.js @@ -11,7 +11,7 @@ var moment = require('moment'), Promise = require('bluebird'), api = require('../api'), config = require('../config'), - filters = require('../../server/filters'), + filters = require('../filters'), template = require('../helpers/template'), errors = require('../errors'), cheerio = require('cheerio'), diff --git a/core/server/models/base.js b/core/server/models/base.js index b4cb9dc975..d8e77ea05f 100644 --- a/core/server/models/base.js +++ b/core/server/models/base.js @@ -5,17 +5,18 @@ // The models are internal to Ghost, only the API and some internal functions such as migration and import/export // accesses the models directly. All other parts of Ghost, including the blog frontend, admin UI, and apps are only // allowed to access data via the API. -var bookshelf = require('bookshelf'), - Promise = require('bluebird'), - moment = require('moment'), - _ = require('lodash'), - uuid = require('node-uuid'), +var _ = require('lodash'), + bookshelf = require('bookshelf'), config = require('../config'), - utils = require('../utils'), + errors = require('../errors'), + filters = require('../filters'), + moment = require('moment'), + Promise = require('bluebird'), sanitize = require('validator').sanitize, schema = require('../data/schema'), + utils = require('../utils'), + uuid = require('node-uuid'), validation = require('../data/validation'), - errors = require('../errors'), ghostBookshelf; @@ -353,15 +354,19 @@ ghostBookshelf.Model = ghostBookshelf.Model.extend({ slug = slug.charAt(slug.length - 1) === '-' ? slug.substr(0, slug.length - 1) : slug; // Check the filtered slug doesn't match any of the reserved keywords - slug = /^(ghost|ghost\-admin|admin|wp\-admin|wp\-login|dashboard|logout|login|setup|signin|signup|signout|register|archive|archives|category|categories|tag|tags|page|pages|post|posts|public|user|users|rss|feed|app|apps)$/g - .test(slug) ? slug + '-' + baseName : slug; + return filters.doFilter('slug.reservedSlugs', config.slugs.reserved).then(function (slugList) { + // Some keywords cannot be changed + slugList = _.union(slugList, config.slugs.protected); - // if slug is empty after trimming use the model name - if (!slug) { - slug = baseName; - } - // Test for duplicate slugs. - return checkIfSlugExists(slug); + return _.contains(slugList, slug) ? slug + '-' + baseName : slug; + }).then(function (slug) { + // if slug is empty after trimming use the model name + if (!slug) { + slug = baseName; + } + // Test for duplicate slugs. + return checkIfSlugExists(slug); + }); } });