| 
									
										
										
										
											2020-06-18 11:41:12 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  | const _ = require('lodash'); | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  | const { createPolicy } = require('@strapi/utils').policy; | 
					
						
							| 
									
										
										
										
											2021-08-25 15:16:17 +02:00
										 |  |  | const { validateHasPermissionsInput } = require('../validation/policies/hasPermissions'); | 
					
						
							| 
									
										
										
										
											2020-06-18 11:41:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  | const inputModifiers = [ | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     check: _.isString, | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     transform: (action) => ({ action }), | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     check: _.isArray, | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     transform: (arr) => ({ action: arr[0], subject: arr[1] }), | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2020-07-02 19:39:18 +02:00
										 |  |  |     // Has to be after the isArray check since _.isObject also matches arrays
 | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  |     check: _.isObject, | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     transform: (perm) => perm, | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  | module.exports = createPolicy({ | 
					
						
							|  |  |  |   name: 'admin::hasPermissions', | 
					
						
							|  |  |  |   validator: validateHasPermissionsInput, | 
					
						
							|  |  |  |   handler(ctx, config) { | 
					
						
							| 
									
										
										
										
											2021-10-04 18:16:28 +02:00
										 |  |  |     const { actions } = config; | 
					
						
							| 
									
										
										
										
											2021-11-09 18:38:20 +01:00
										 |  |  |     const { userAbility: ability } = ctx.state; | 
					
						
							| 
									
										
										
										
											2021-08-24 13:59:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-08 23:33:39 +02:00
										 |  |  |     const permissions = actions.map((action) => | 
					
						
							|  |  |  |       inputModifiers.find((modifier) => modifier.check(action)).transform(action) | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2020-06-18 11:41:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  |     const isAuthorized = permissions.every(({ action, subject }) => ability.can(action, subject)); | 
					
						
							| 
									
										
										
										
											2020-06-18 11:41:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  |     return isAuthorized; | 
					
						
							| 
									
										
										
										
											2020-06-19 15:02:10 +02:00
										 |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  | }); |