| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  | const { propOr } = require('lodash/fp'); | 
					
						
							| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  | const { policy: policyUtils } = require('@strapi/utils'); | 
					
						
							| 
									
										
										
										
											2022-01-03 06:25:18 -07:00
										 |  |  | const { PolicyError } = require('@strapi/utils').errors; | 
					
						
							| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  | const getPoliciesConfig = propOr([], 'policies'); | 
					
						
							| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  | const createPoliciesMiddleware = (resolverConfig, { strapi }) => { | 
					
						
							|  |  |  |   const resolverPolicies = getPoliciesConfig(resolverConfig); | 
					
						
							|  |  |  |   const policies = policyUtils.resolve(resolverPolicies); | 
					
						
							| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  |   return async (resolve, ...rest) => { | 
					
						
							| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  |     // Create a graphql policy context
 | 
					
						
							|  |  |  |     const context = createGraphQLPolicyContext(...rest); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Run policies & throw an error if one of them fails
 | 
					
						
							| 
									
										
										
										
											2021-11-05 12:19:49 +01:00
										 |  |  |     for (const { handler, config } of policies) { | 
					
						
							|  |  |  |       const result = await handler(context, config, { strapi }); | 
					
						
							| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-04 18:16:28 +02:00
										 |  |  |       if (![true, undefined].includes(result)) { | 
					
						
							| 
									
										
										
										
											2022-01-03 06:25:18 -07:00
										 |  |  |         throw new PolicyError(); | 
					
						
							| 
									
										
										
										
											2021-09-01 12:06:51 +02:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return resolve(...rest); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const createGraphQLPolicyContext = (parent, args, context, info) => { | 
					
						
							|  |  |  |   return policyUtils.createPolicyContext('graphql', { | 
					
						
							|  |  |  |     get parent() { | 
					
						
							|  |  |  |       return parent; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get args() { | 
					
						
							|  |  |  |       return args; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get context() { | 
					
						
							|  |  |  |       return context; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get info() { | 
					
						
							|  |  |  |       return info; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get state() { | 
					
						
							|  |  |  |       return this.context.state; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     get http() { | 
					
						
							|  |  |  |       return this.context.koaContext; | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |   createPoliciesMiddleware, | 
					
						
							|  |  |  | }; |