diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/controllers/api/plugins.ts | 32 | ||||
-rw-r--r-- | server/models/server/plugin.ts | 15 | ||||
-rw-r--r-- | server/tests/api/check-params/plugins.ts | 10 | ||||
-rw-r--r-- | server/tests/api/server/plugins.ts | 19 |
4 files changed, 58 insertions, 18 deletions
diff --git a/server/controllers/api/plugins.ts b/server/controllers/api/plugins.ts index 86384ee27..6b7562fd3 100644 --- a/server/controllers/api/plugins.ts +++ b/server/controllers/api/plugins.ts | |||
@@ -26,6 +26,7 @@ import { logger } from '../../helpers/logger' | |||
26 | import { listAvailablePluginsFromIndex } from '../../lib/plugins/plugin-index' | 26 | import { listAvailablePluginsFromIndex } from '../../lib/plugins/plugin-index' |
27 | import { PeertubePluginIndexList } from '../../../shared/models/plugins/peertube-plugin-index-list.model' | 27 | import { PeertubePluginIndexList } from '../../../shared/models/plugins/peertube-plugin-index-list.model' |
28 | import { RegisteredServerSettings } from '../../../shared/models/plugins/register-server-setting.model' | 28 | import { RegisteredServerSettings } from '../../../shared/models/plugins/register-server-setting.model' |
29 | import { PublicServerSetting } from '../../../shared/models/plugins/public-server.setting' | ||
29 | 30 | ||
30 | const pluginRouter = express.Router() | 31 | const pluginRouter = express.Router() |
31 | 32 | ||
@@ -51,18 +52,16 @@ pluginRouter.get('/', | |||
51 | asyncMiddleware(listPlugins) | 52 | asyncMiddleware(listPlugins) |
52 | ) | 53 | ) |
53 | 54 | ||
54 | pluginRouter.get('/:npmName', | 55 | pluginRouter.get('/:npmName/registered-settings', |
55 | authenticate, | 56 | authenticate, |
56 | ensureUserHasRight(UserRight.MANAGE_PLUGINS), | 57 | ensureUserHasRight(UserRight.MANAGE_PLUGINS), |
57 | asyncMiddleware(existingPluginValidator), | 58 | asyncMiddleware(existingPluginValidator), |
58 | getPlugin | 59 | getPluginRegisteredSettings |
59 | ) | 60 | ) |
60 | 61 | ||
61 | pluginRouter.get('/:npmName/registered-settings', | 62 | pluginRouter.get('/:npmName/public-settings', |
62 | authenticate, | ||
63 | ensureUserHasRight(UserRight.MANAGE_PLUGINS), | ||
64 | asyncMiddleware(existingPluginValidator), | 63 | asyncMiddleware(existingPluginValidator), |
65 | getPluginRegisteredSettings | 64 | getPublicPluginSettings |
66 | ) | 65 | ) |
67 | 66 | ||
68 | pluginRouter.put('/:npmName/settings', | 67 | pluginRouter.put('/:npmName/settings', |
@@ -73,6 +72,13 @@ pluginRouter.put('/:npmName/settings', | |||
73 | asyncMiddleware(updatePluginSettings) | 72 | asyncMiddleware(updatePluginSettings) |
74 | ) | 73 | ) |
75 | 74 | ||
75 | pluginRouter.get('/:npmName', | ||
76 | authenticate, | ||
77 | ensureUserHasRight(UserRight.MANAGE_PLUGINS), | ||
78 | asyncMiddleware(existingPluginValidator), | ||
79 | getPlugin | ||
80 | ) | ||
81 | |||
76 | pluginRouter.post('/install', | 82 | pluginRouter.post('/install', |
77 | authenticate, | 83 | authenticate, |
78 | ensureUserHasRight(UserRight.MANAGE_PLUGINS), | 84 | ensureUserHasRight(UserRight.MANAGE_PLUGINS), |
@@ -161,10 +167,20 @@ async function uninstallPlugin (req: express.Request, res: express.Response) { | |||
161 | return res.sendStatus(204) | 167 | return res.sendStatus(204) |
162 | } | 168 | } |
163 | 169 | ||
170 | function getPublicPluginSettings (req: express.Request, res: express.Response) { | ||
171 | const plugin = res.locals.plugin | ||
172 | const registeredSettings = PluginManager.Instance.getRegisteredSettings(req.params.npmName) | ||
173 | const publicSettings = plugin.getPublicSettings(registeredSettings) | ||
174 | |||
175 | const json: PublicServerSetting = { publicSettings } | ||
176 | |||
177 | return res.json(json) | ||
178 | } | ||
179 | |||
164 | function getPluginRegisteredSettings (req: express.Request, res: express.Response) { | 180 | function getPluginRegisteredSettings (req: express.Request, res: express.Response) { |
165 | const settings = PluginManager.Instance.getRegisteredSettings(req.params.npmName) | 181 | const registeredSettings = PluginManager.Instance.getRegisteredSettings(req.params.npmName) |
166 | 182 | ||
167 | const json: RegisteredServerSettings = { settings } | 183 | const json: RegisteredServerSettings = { registeredSettings } |
168 | 184 | ||
169 | return res.json(json) | 185 | return res.json(json) |
170 | } | 186 | } |
diff --git a/server/models/server/plugin.ts b/server/models/server/plugin.ts index f39b97ef0..a15f9a7e2 100644 --- a/server/models/server/plugin.ts +++ b/server/models/server/plugin.ts | |||
@@ -10,7 +10,7 @@ import { | |||
10 | import { PluginType } from '../../../shared/models/plugins/plugin.type' | 10 | import { PluginType } from '../../../shared/models/plugins/plugin.type' |
11 | import { PeerTubePlugin } from '../../../shared/models/plugins/peertube-plugin.model' | 11 | import { PeerTubePlugin } from '../../../shared/models/plugins/peertube-plugin.model' |
12 | import { FindAndCountOptions, json } from 'sequelize' | 12 | import { FindAndCountOptions, json } from 'sequelize' |
13 | import { PeerTubePluginIndex } from '../../../shared/models/plugins/peertube-plugin-index.model' | 13 | import { RegisterServerSettingOptions } from '../../../shared/models/plugins/register-server-setting.model' |
14 | 14 | ||
15 | @DefaultScope(() => ({ | 15 | @DefaultScope(() => ({ |
16 | attributes: { | 16 | attributes: { |
@@ -238,6 +238,19 @@ export class PluginModel extends Model<PluginModel> { | |||
238 | return 'peertube-plugin-' + name | 238 | return 'peertube-plugin-' + name |
239 | } | 239 | } |
240 | 240 | ||
241 | getPublicSettings (registeredSettings: RegisterServerSettingOptions[]) { | ||
242 | const result: { [ name: string ]: string } = {} | ||
243 | const settings = this.settings || {} | ||
244 | |||
245 | for (const r of registeredSettings) { | ||
246 | if (r.private !== false) continue | ||
247 | |||
248 | result[r.name] = settings[r.name] || r.default || null | ||
249 | } | ||
250 | |||
251 | return result | ||
252 | } | ||
253 | |||
241 | toFormattedJSON (): PeerTubePlugin { | 254 | toFormattedJSON (): PeerTubePlugin { |
242 | return { | 255 | return { |
243 | name: this.name, | 256 | name: this.name, |
diff --git a/server/tests/api/check-params/plugins.ts b/server/tests/api/check-params/plugins.ts index 83ce6f451..9553bce17 100644 --- a/server/tests/api/check-params/plugins.ts +++ b/server/tests/api/check-params/plugins.ts | |||
@@ -281,7 +281,7 @@ describe('Test server plugins API validators', function () { | |||
281 | }) | 281 | }) |
282 | }) | 282 | }) |
283 | 283 | ||
284 | describe('When getting a plugin or the registered settings', function () { | 284 | describe('When getting a plugin or the registered settings or public settings', function () { |
285 | const path = '/api/v1/plugins/' | 285 | const path = '/api/v1/plugins/' |
286 | 286 | ||
287 | it('Should fail with an invalid token', async function () { | 287 | it('Should fail with an invalid token', async function () { |
@@ -307,7 +307,7 @@ describe('Test server plugins API validators', function () { | |||
307 | }) | 307 | }) |
308 | 308 | ||
309 | it('Should fail with an invalid npm name', async function () { | 309 | it('Should fail with an invalid npm name', async function () { |
310 | for (const suffix of [ 'toto', 'toto/registered-settings' ]) { | 310 | for (const suffix of [ 'toto', 'toto/registered-settings', 'toto/public-settings' ]) { |
311 | await makeGetRequest({ | 311 | await makeGetRequest({ |
312 | url: server.url, | 312 | url: server.url, |
313 | path: path + suffix, | 313 | path: path + suffix, |
@@ -316,7 +316,7 @@ describe('Test server plugins API validators', function () { | |||
316 | }) | 316 | }) |
317 | } | 317 | } |
318 | 318 | ||
319 | for (const suffix of [ 'peertube-plugin-TOTO', 'peertube-plugin-TOTO/registered-settings' ]) { | 319 | for (const suffix of [ 'peertube-plugin-TOTO', 'peertube-plugin-TOTO/registered-settings', 'peertube-plugin-TOTO/public-settings' ]) { |
320 | await makeGetRequest({ | 320 | await makeGetRequest({ |
321 | url: server.url, | 321 | url: server.url, |
322 | path: path + suffix, | 322 | path: path + suffix, |
@@ -327,7 +327,7 @@ describe('Test server plugins API validators', function () { | |||
327 | }) | 327 | }) |
328 | 328 | ||
329 | it('Should fail with an unknown plugin', async function () { | 329 | it('Should fail with an unknown plugin', async function () { |
330 | for (const suffix of [ 'peertube-plugin-toto', 'peertube-plugin-toto/registered-settings' ]) { | 330 | for (const suffix of [ 'peertube-plugin-toto', 'peertube-plugin-toto/registered-settings', 'peertube-plugin-toto/public-settings' ]) { |
331 | await makeGetRequest({ | 331 | await makeGetRequest({ |
332 | url: server.url, | 332 | url: server.url, |
333 | path: path + suffix, | 333 | path: path + suffix, |
@@ -338,7 +338,7 @@ describe('Test server plugins API validators', function () { | |||
338 | }) | 338 | }) |
339 | 339 | ||
340 | it('Should succeed with the correct parameters', async function () { | 340 | it('Should succeed with the correct parameters', async function () { |
341 | for (const suffix of [ npmPlugin, `${npmPlugin}/registered-settings` ]) { | 341 | for (const suffix of [ npmPlugin, `${npmPlugin}/registered-settings`, `${npmPlugin}/public-settings` ]) { |
342 | await makeGetRequest({ | 342 | await makeGetRequest({ |
343 | url: server.url, | 343 | url: server.url, |
344 | path: path + suffix, | 344 | path: path + suffix, |
diff --git a/server/tests/api/server/plugins.ts b/server/tests/api/server/plugins.ts index f8b2d78c9..b8a8a2fee 100644 --- a/server/tests/api/server/plugins.ts +++ b/server/tests/api/server/plugins.ts | |||
@@ -18,7 +18,7 @@ import { | |||
18 | setPluginVersion, uninstallPlugin, | 18 | setPluginVersion, uninstallPlugin, |
19 | updateCustomSubConfig, updateMyUser, updatePluginPackageJSON, updatePlugin, | 19 | updateCustomSubConfig, updateMyUser, updatePluginPackageJSON, updatePlugin, |
20 | updatePluginSettings, | 20 | updatePluginSettings, |
21 | wait | 21 | wait, getPublicSettings |
22 | } from '../../../../shared/extra-utils' | 22 | } from '../../../../shared/extra-utils' |
23 | import { PluginType } from '../../../../shared/models/plugins/plugin.type' | 23 | import { PluginType } from '../../../../shared/models/plugins/plugin.type' |
24 | import { PeerTubePluginIndex } from '../../../../shared/models/plugins/peertube-plugin-index.model' | 24 | import { PeerTubePluginIndex } from '../../../../shared/models/plugins/peertube-plugin-index.model' |
@@ -27,6 +27,7 @@ import { PeerTubePlugin } from '../../../../shared/models/plugins/peertube-plugi | |||
27 | import { User } from '../../../../shared/models/users' | 27 | import { User } from '../../../../shared/models/users' |
28 | import { PluginPackageJson } from '../../../../shared/models/plugins/plugin-package-json.model' | 28 | import { PluginPackageJson } from '../../../../shared/models/plugins/plugin-package-json.model' |
29 | import { RegisteredServerSettings } from '../../../../shared/models/plugins/register-server-setting.model' | 29 | import { RegisteredServerSettings } from '../../../../shared/models/plugins/register-server-setting.model' |
30 | import { PublicServerSetting } from '../../../../shared/models/plugins/public-server.setting' | ||
30 | 31 | ||
31 | const expect = chai.expect | 32 | const expect = chai.expect |
32 | 33 | ||
@@ -217,14 +218,24 @@ describe('Test plugins', function () { | |||
217 | npmName: 'peertube-plugin-hello-world' | 218 | npmName: 'peertube-plugin-hello-world' |
218 | }) | 219 | }) |
219 | 220 | ||
220 | const settings = (res.body as RegisteredServerSettings).settings | 221 | const registeredSettings = (res.body as RegisteredServerSettings).registeredSettings |
221 | 222 | ||
222 | expect(settings).to.have.length.at.least(1) | 223 | expect(registeredSettings).to.have.length.at.least(1) |
223 | 224 | ||
224 | const adminNameSettings = settings.find(s => s.name === 'admin-name') | 225 | const adminNameSettings = registeredSettings.find(s => s.name === 'admin-name') |
225 | expect(adminNameSettings).to.not.be.undefined | 226 | expect(adminNameSettings).to.not.be.undefined |
226 | }) | 227 | }) |
227 | 228 | ||
229 | it('Should get public settings', async function () { | ||
230 | const res = await getPublicSettings({ url: server.url, npmName: 'peertube-plugin-hello-world' }) | ||
231 | |||
232 | const publicSettings = (res.body as PublicServerSetting).publicSettings | ||
233 | |||
234 | expect(Object.keys(publicSettings)).to.have.lengthOf(1) | ||
235 | expect(Object.keys(publicSettings)).to.deep.equal([ 'user-name' ]) | ||
236 | expect(publicSettings['user-name']).to.be.null | ||
237 | }) | ||
238 | |||
228 | it('Should update the settings', async function () { | 239 | it('Should update the settings', async function () { |
229 | const settings = { | 240 | const settings = { |
230 | 'admin-name': 'Cid' | 241 | 'admin-name': 'Cid' |