mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-31 15:53:33 +00:00 
			
		
		
		
	v2.1.0 (#293)
* Fix wrapping when too many hosts are shown (#207) * Update npm packages, fixes CVE-2019-10757 * Revert some breaking packages * Major overhaul - Docker buildx support in CI - Cypress API Testing in CI - Restructured folder layout (insert clean face meme) - Added Swagger documentation and validate API against that (to be completed) - Use common base image for all supported archs, which includes updated nginx with ipv6 support - Updated certbot and changes required for it - Large amount of Hosts names will wrap in UI - Updated packages for frontend - Version bump 2.1.0 * Updated documentation * Fix JWT expire time going crazy. Now set to 1day * Backend JS formatting rules * Remove v1 importer, I doubt anyone is using v1 anymore * Added backend formatting rules and enforce them in Jenkins builds * Fix CI, doesn't need a tty * Thanks bcrypt. Why can't you just be normal. * Cleanup after syntax check Co-authored-by: Marcelo Castagna <margaale@users.noreply.github.com>
This commit is contained in:
		
							
								
								
									
										314
									
								
								backend/lib/access.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								backend/lib/access.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,314 @@ | ||||
| /** | ||||
|  * Some Notes: This is a friggin complicated piece of code. | ||||
|  * | ||||
|  * "scope" in this file means "where did this token come from and what is using it", so 99% of the time | ||||
|  * the "scope" is going to be "user" because it would be a user token. This is not to be confused with | ||||
|  * the "role" which could be "user" or "admin". The scope in fact, could be "worker" or anything else. | ||||
|  * | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| const _              = require('lodash'); | ||||
| const logger         = require('../logger').access; | ||||
| const validator      = require('ajv'); | ||||
| const error          = require('./error'); | ||||
| const userModel      = require('../models/user'); | ||||
| const proxyHostModel = require('../models/proxy_host'); | ||||
| const TokenModel     = require('../models/token'); | ||||
| const roleSchema     = require('./access/roles.json'); | ||||
| const permsSchema    = require('./access/permissions.json'); | ||||
|  | ||||
| module.exports = function (token_string) { | ||||
| 	let Token                 = new TokenModel(); | ||||
| 	let token_data            = null; | ||||
| 	let initialised           = false; | ||||
| 	let object_cache          = {}; | ||||
| 	let allow_internal_access = false; | ||||
| 	let user_roles            = []; | ||||
| 	let permissions           = {}; | ||||
|  | ||||
| 	/** | ||||
| 	 * Loads the Token object from the token string | ||||
| 	 * | ||||
| 	 * @returns {Promise} | ||||
| 	 */ | ||||
| 	this.init = () => { | ||||
| 		return new Promise((resolve, reject) => { | ||||
| 			if (initialised) { | ||||
| 				resolve(); | ||||
| 			} else if (!token_string) { | ||||
| 				reject(new error.PermissionError('Permission Denied')); | ||||
| 			} else { | ||||
| 				resolve(Token.load(token_string) | ||||
| 					.then((data) => { | ||||
| 						token_data = data; | ||||
|  | ||||
| 						// At this point we need to load the user from the DB and make sure they: | ||||
| 						// - exist (and not soft deleted) | ||||
| 						// - still have the appropriate scopes for this token | ||||
| 						// This is only required when the User ID is supplied or if the token scope has `user` | ||||
|  | ||||
| 						if (token_data.attrs.id || (typeof token_data.scope !== 'undefined' && _.indexOf(token_data.scope, 'user') !== -1)) { | ||||
| 							// Has token user id or token user scope | ||||
| 							return userModel | ||||
| 								.query() | ||||
| 								.where('id', token_data.attrs.id) | ||||
| 								.andWhere('is_deleted', 0) | ||||
| 								.andWhere('is_disabled', 0) | ||||
| 								.allowEager('[permissions]') | ||||
| 								.eager('[permissions]') | ||||
| 								.first() | ||||
| 								.then((user) => { | ||||
| 									if (user) { | ||||
| 										// make sure user has all scopes of the token | ||||
| 										// The `user` role is not added against the user row, so we have to just add it here to get past this check. | ||||
| 										user.roles.push('user'); | ||||
|  | ||||
| 										let is_ok = true; | ||||
| 										_.forEach(token_data.scope, (scope_item) => { | ||||
| 											if (_.indexOf(user.roles, scope_item) === -1) { | ||||
| 												is_ok = false; | ||||
| 											} | ||||
| 										}); | ||||
|  | ||||
| 										if (!is_ok) { | ||||
| 											throw new error.AuthError('Invalid token scope for User'); | ||||
| 										} else { | ||||
| 											initialised = true; | ||||
| 											user_roles  = user.roles; | ||||
| 											permissions = user.permissions; | ||||
| 										} | ||||
|  | ||||
| 									} else { | ||||
| 										throw new error.AuthError('User cannot be loaded for Token'); | ||||
| 									} | ||||
| 								}); | ||||
| 						} else { | ||||
| 							initialised = true; | ||||
| 						} | ||||
| 					})); | ||||
| 			} | ||||
| 		}); | ||||
| 	}; | ||||
|  | ||||
| 	/** | ||||
| 	 * Fetches the object ids from the database, only once per object type, for this token. | ||||
| 	 * This only applies to USER token scopes, as all other tokens are not really bound | ||||
| 	 * by object scopes | ||||
| 	 * | ||||
| 	 * @param   {String} object_type | ||||
| 	 * @returns {Promise} | ||||
| 	 */ | ||||
| 	this.loadObjects = (object_type) => { | ||||
| 		return new Promise((resolve, reject) => { | ||||
| 			if (Token.hasScope('user')) { | ||||
| 				if (typeof token_data.attrs.id === 'undefined' || !token_data.attrs.id) { | ||||
| 					reject(new error.AuthError('User Token supplied without a User ID')); | ||||
| 				} else { | ||||
| 					let token_user_id = token_data.attrs.id ? token_data.attrs.id : 0; | ||||
| 					let query; | ||||
|  | ||||
| 					if (typeof object_cache[object_type] === 'undefined') { | ||||
| 						switch (object_type) { | ||||
|  | ||||
| 						// USERS - should only return yourself | ||||
| 						case 'users': | ||||
| 							resolve(token_user_id ? [token_user_id] : []); | ||||
| 							break; | ||||
|  | ||||
| 							// Proxy Hosts | ||||
| 						case 'proxy_hosts': | ||||
| 							query = proxyHostModel | ||||
| 								.query() | ||||
| 								.select('id') | ||||
| 								.andWhere('is_deleted', 0); | ||||
|  | ||||
| 							if (permissions.visibility === 'user') { | ||||
| 								query.andWhere('owner_user_id', token_user_id); | ||||
| 							} | ||||
|  | ||||
| 							resolve(query | ||||
| 								.then((rows) => { | ||||
| 									let result = []; | ||||
| 									_.forEach(rows, (rule_row) => { | ||||
| 										result.push(rule_row.id); | ||||
| 									}); | ||||
|  | ||||
| 									// enum should not have less than 1 item | ||||
| 									if (!result.length) { | ||||
| 										result.push(0); | ||||
| 									} | ||||
|  | ||||
| 									return result; | ||||
| 								}) | ||||
| 							); | ||||
| 							break; | ||||
|  | ||||
| 							// DEFAULT: null | ||||
| 						default: | ||||
| 							resolve(null); | ||||
| 							break; | ||||
| 						} | ||||
| 					} else { | ||||
| 						resolve(object_cache[object_type]); | ||||
| 					} | ||||
| 				} | ||||
| 			} else { | ||||
| 				resolve(null); | ||||
| 			} | ||||
| 		}) | ||||
| 			.then((objects) => { | ||||
| 				object_cache[object_type] = objects; | ||||
| 				return objects; | ||||
| 			}); | ||||
| 	}; | ||||
|  | ||||
| 	/** | ||||
| 	 * Creates a schema object on the fly with the IDs and other values required to be checked against the permissionSchema | ||||
| 	 * | ||||
| 	 * @param   {String} permission_label | ||||
| 	 * @returns {Object} | ||||
| 	 */ | ||||
| 	this.getObjectSchema = (permission_label) => { | ||||
| 		let base_object_type = permission_label.split(':').shift(); | ||||
|  | ||||
| 		let schema = { | ||||
| 			$id:                  'objects', | ||||
| 			$schema:              'http://json-schema.org/draft-07/schema#', | ||||
| 			description:          'Actor Properties', | ||||
| 			type:                 'object', | ||||
| 			additionalProperties: false, | ||||
| 			properties:           { | ||||
| 				user_id: { | ||||
| 					anyOf: [ | ||||
| 						{ | ||||
| 							type: 'number', | ||||
| 							enum: [Token.get('attrs').id] | ||||
| 						} | ||||
| 					] | ||||
| 				}, | ||||
| 				scope: { | ||||
| 					type:    'string', | ||||
| 					pattern: '^' + Token.get('scope') + '$' | ||||
| 				} | ||||
| 			} | ||||
| 		}; | ||||
|  | ||||
| 		return this.loadObjects(base_object_type) | ||||
| 			.then((object_result) => { | ||||
| 				if (typeof object_result === 'object' && object_result !== null) { | ||||
| 					schema.properties[base_object_type] = { | ||||
| 						type:    'number', | ||||
| 						enum:    object_result, | ||||
| 						minimum: 1 | ||||
| 					}; | ||||
| 				} else { | ||||
| 					schema.properties[base_object_type] = { | ||||
| 						type:    'number', | ||||
| 						minimum: 1 | ||||
| 					}; | ||||
| 				} | ||||
|  | ||||
| 				return schema; | ||||
| 			}); | ||||
| 	}; | ||||
|  | ||||
| 	return { | ||||
|  | ||||
| 		token: Token, | ||||
|  | ||||
| 		/** | ||||
| 		 * | ||||
| 		 * @param   {Boolean}  [allow_internal] | ||||
| 		 * @returns {Promise} | ||||
| 		 */ | ||||
| 		load: (allow_internal) => { | ||||
| 			return new Promise(function (resolve/*, reject*/) { | ||||
| 				if (token_string) { | ||||
| 					resolve(Token.load(token_string)); | ||||
| 				} else { | ||||
| 					allow_internal_access = allow_internal; | ||||
| 					resolve(allow_internal_access || null); | ||||
| 				} | ||||
| 			}); | ||||
| 		}, | ||||
|  | ||||
| 		reloadObjects: this.loadObjects, | ||||
|  | ||||
| 		/** | ||||
| 		 * | ||||
| 		 * @param {String}  permission | ||||
| 		 * @param {*}       [data] | ||||
| 		 * @returns {Promise} | ||||
| 		 */ | ||||
| 		can: (permission, data) => { | ||||
| 			if (allow_internal_access === true) { | ||||
| 				return Promise.resolve(true); | ||||
| 				//return true; | ||||
| 			} else { | ||||
| 				return this.init() | ||||
| 					.then(() => { | ||||
| 						// Initialised, token decoded ok | ||||
| 						return this.getObjectSchema(permission) | ||||
| 							.then((objectSchema) => { | ||||
| 								let data_schema = { | ||||
| 									[permission]: { | ||||
| 										data:                         data, | ||||
| 										scope:                        Token.get('scope'), | ||||
| 										roles:                        user_roles, | ||||
| 										permission_visibility:        permissions.visibility, | ||||
| 										permission_proxy_hosts:       permissions.proxy_hosts, | ||||
| 										permission_redirection_hosts: permissions.redirection_hosts, | ||||
| 										permission_dead_hosts:        permissions.dead_hosts, | ||||
| 										permission_streams:           permissions.streams, | ||||
| 										permission_access_lists:      permissions.access_lists, | ||||
| 										permission_certificates:      permissions.certificates | ||||
| 									} | ||||
| 								}; | ||||
|  | ||||
| 								let permissionSchema = { | ||||
| 									$schema:              'http://json-schema.org/draft-07/schema#', | ||||
| 									$async:               true, | ||||
| 									$id:                  'permissions', | ||||
| 									additionalProperties: false, | ||||
| 									properties:           {} | ||||
| 								}; | ||||
|  | ||||
| 								permissionSchema.properties[permission] = require('./access/' + permission.replace(/:/gim, '-') + '.json'); | ||||
|  | ||||
| 								// logger.info('objectSchema', JSON.stringify(objectSchema, null, 2)); | ||||
| 								// logger.info('permissionSchema', JSON.stringify(permissionSchema, null, 2)); | ||||
| 								// logger.info('data_schema', JSON.stringify(data_schema, null, 2)); | ||||
|  | ||||
| 								let ajv = validator({ | ||||
| 									verbose:      true, | ||||
| 									allErrors:    true, | ||||
| 									format:       'full', | ||||
| 									missingRefs:  'fail', | ||||
| 									breakOnError: true, | ||||
| 									coerceTypes:  true, | ||||
| 									schemas:      [ | ||||
| 										roleSchema, | ||||
| 										permsSchema, | ||||
| 										objectSchema, | ||||
| 										permissionSchema | ||||
| 									] | ||||
| 								}); | ||||
|  | ||||
| 								return ajv.validate('permissions', data_schema) | ||||
| 									.then(() => { | ||||
| 										return data_schema[permission]; | ||||
| 									}); | ||||
| 							}); | ||||
| 					}) | ||||
| 					.catch((err) => { | ||||
| 						err.permission      = permission; | ||||
| 						err.permission_data = data; | ||||
| 						logger.error(permission, data, err.message); | ||||
|  | ||||
| 						throw new error.PermissionError('Permission Denied', err); | ||||
| 					}); | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										23
									
								
								backend/lib/access/access_lists-create.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/access_lists-create.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_access_lists", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_access_lists": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/access_lists-delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/access_lists-delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_access_lists", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_access_lists": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/access_lists-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/access_lists-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_access_lists", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_access_lists": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/access_lists-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/access_lists-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_access_lists", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_access_lists": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/access_lists-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/access_lists-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_access_lists", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_access_lists": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/auditlog-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/auditlog-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/certificates-create.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/certificates-create.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_certificates", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_certificates": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/certificates-delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/certificates-delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_certificates", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_certificates": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/certificates-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/certificates-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_certificates", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_certificates": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/certificates-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/certificates-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_certificates", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_certificates": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/certificates-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/certificates-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_certificates", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_certificates": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/dead_hosts-create.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/dead_hosts-create.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_dead_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_dead_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/dead_hosts-delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/dead_hosts-delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_dead_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_dead_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/dead_hosts-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/dead_hosts-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_dead_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_dead_hosts": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/dead_hosts-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/dead_hosts-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_dead_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_dead_hosts": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/dead_hosts-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/dead_hosts-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_dead_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_dead_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										14
									
								
								backend/lib/access/permissions.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								backend/lib/access/permissions.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| { | ||||
| 	"$schema": "http://json-schema.org/draft-07/schema#", | ||||
| 	"$id": "perms", | ||||
| 	"definitions": { | ||||
| 		"view": { | ||||
| 			"type": "string", | ||||
| 			"pattern": "^(view|manage)$" | ||||
| 		}, | ||||
| 		"manage": { | ||||
| 			"type": "string", | ||||
| 			"pattern": "^(manage)$" | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/proxy_hosts-create.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/proxy_hosts-create.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_proxy_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_proxy_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/proxy_hosts-delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/proxy_hosts-delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_proxy_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_proxy_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/proxy_hosts-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/proxy_hosts-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_proxy_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_proxy_hosts": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/proxy_hosts-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/proxy_hosts-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_proxy_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_proxy_hosts": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/proxy_hosts-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/proxy_hosts-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_proxy_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_proxy_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/redirection_hosts-create.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/redirection_hosts-create.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_redirection_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_redirection_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/redirection_hosts-delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/redirection_hosts-delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_redirection_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_redirection_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/redirection_hosts-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/redirection_hosts-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_redirection_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_redirection_hosts": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/redirection_hosts-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/redirection_hosts-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_redirection_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_redirection_hosts": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/redirection_hosts-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/redirection_hosts-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_redirection_hosts", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_redirection_hosts": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/reports-hosts.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/reports-hosts.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/user" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										39
									
								
								backend/lib/access/roles.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								backend/lib/access/roles.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| { | ||||
| 	"$schema": "http://json-schema.org/draft-07/schema#", | ||||
| 	"$id": "roles", | ||||
| 	"definitions": { | ||||
| 		"admin": { | ||||
| 			"type": "object", | ||||
| 			"required": ["scope", "roles"], | ||||
| 			"properties": { | ||||
| 				"scope": { | ||||
| 					"type": "array", | ||||
| 					"contains": { | ||||
| 						"type": "string", | ||||
| 						"pattern": "^user$" | ||||
| 					} | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"contains": { | ||||
| 						"type": "string", | ||||
| 						"pattern": "^admin$" | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"user": { | ||||
| 			"type": "object", | ||||
| 			"required": ["scope"], | ||||
| 			"properties": { | ||||
| 				"scope": { | ||||
| 					"type": "array", | ||||
| 					"contains": { | ||||
| 						"type": "string", | ||||
| 						"pattern": "^user$" | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/settings-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/settings-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/settings-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/settings-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/settings-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/settings-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/streams-create.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/streams-create.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_streams", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_streams": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/streams-delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/streams-delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_streams", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_streams": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/streams-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/streams-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_streams", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_streams": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/streams-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/streams-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_streams", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_streams": { | ||||
| 					"$ref": "perms#/definitions/view" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/streams-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/streams-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["permission_streams", "roles"], | ||||
| 			"properties": { | ||||
| 				"permission_streams": { | ||||
| 					"$ref": "perms#/definitions/manage" | ||||
| 				}, | ||||
| 				"roles": { | ||||
| 					"type": "array", | ||||
| 					"items": { | ||||
| 						"type": "string", | ||||
| 						"enum": ["user"] | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/users-create.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/users-create.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/users-delete.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/users-delete.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/users-get.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/users-get.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["data", "scope"], | ||||
| 			"properties": { | ||||
| 				"data": { | ||||
| 					"$ref": "objects#/properties/users" | ||||
| 				}, | ||||
| 				"scope": { | ||||
| 					"type": "array", | ||||
| 					"contains": { | ||||
| 						"type": "string", | ||||
| 						"pattern": "^user$" | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/users-list.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/users-list.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/users-loginas.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/users-loginas.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/users-password.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/users-password.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["data", "scope"], | ||||
| 			"properties": { | ||||
| 				"data": { | ||||
| 					"$ref": "objects#/properties/users" | ||||
| 				}, | ||||
| 				"scope": { | ||||
| 					"type": "array", | ||||
| 					"contains": { | ||||
| 						"type": "string", | ||||
| 						"pattern": "^user$" | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										7
									
								
								backend/lib/access/users-permissions.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								backend/lib/access/users-permissions.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										23
									
								
								backend/lib/access/users-update.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								backend/lib/access/users-update.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| { | ||||
| 	"anyOf": [ | ||||
| 		{ | ||||
| 			"$ref": "roles#/definitions/admin" | ||||
| 		}, | ||||
| 		{ | ||||
| 			"type": "object", | ||||
| 			"required": ["data", "scope"], | ||||
| 			"properties": { | ||||
| 				"data": { | ||||
| 					"$ref": "objects#/properties/users" | ||||
| 				}, | ||||
| 				"scope": { | ||||
| 					"type": "array", | ||||
| 					"contains": { | ||||
| 						"type": "string", | ||||
| 						"pattern": "^user$" | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	] | ||||
| } | ||||
							
								
								
									
										90
									
								
								backend/lib/error.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								backend/lib/error.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| const _    = require('lodash'); | ||||
| const util = require('util'); | ||||
|  | ||||
| module.exports = { | ||||
|  | ||||
| 	PermissionError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = 'Permission Denied'; | ||||
| 		this.public   = true; | ||||
| 		this.status   = 403; | ||||
| 	}, | ||||
|  | ||||
| 	ItemNotFoundError: function (id, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = 'Item Not Found - ' + id; | ||||
| 		this.public   = true; | ||||
| 		this.status   = 404; | ||||
| 	}, | ||||
|  | ||||
| 	AuthError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = message; | ||||
| 		this.public   = true; | ||||
| 		this.status   = 401; | ||||
| 	}, | ||||
|  | ||||
| 	InternalError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = message; | ||||
| 		this.status   = 500; | ||||
| 		this.public   = false; | ||||
| 	}, | ||||
|  | ||||
| 	InternalValidationError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = message; | ||||
| 		this.status   = 400; | ||||
| 		this.public   = false; | ||||
| 	}, | ||||
|  | ||||
| 	ConfigurationError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = message; | ||||
| 		this.status   = 400; | ||||
| 		this.public   = true; | ||||
| 	}, | ||||
|  | ||||
| 	CacheError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.message  = message; | ||||
| 		this.previous = previous; | ||||
| 		this.status   = 500; | ||||
| 		this.public   = false; | ||||
| 	}, | ||||
|  | ||||
| 	ValidationError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = message; | ||||
| 		this.public   = true; | ||||
| 		this.status   = 400; | ||||
| 	}, | ||||
|  | ||||
| 	AssertionFailedError: function (message, previous) { | ||||
| 		Error.captureStackTrace(this, this.constructor); | ||||
| 		this.name     = this.constructor.name; | ||||
| 		this.previous = previous; | ||||
| 		this.message  = message; | ||||
| 		this.public   = false; | ||||
| 		this.status   = 400; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| _.forEach(module.exports, function (error) { | ||||
| 	util.inherits(error, Error); | ||||
| }); | ||||
							
								
								
									
										30
									
								
								backend/lib/express/cors.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								backend/lib/express/cors.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| const validator = require('../validator'); | ||||
|  | ||||
| module.exports = function (req, res, next) { | ||||
|  | ||||
| 	if (req.headers.origin) { | ||||
|  | ||||
| 		// very relaxed validation.... | ||||
| 		validator({ | ||||
| 			type:    'string', | ||||
| 			pattern: '^[a-z\\-]+:\\/\\/(?:[\\w\\-\\.]+(:[0-9]+)?/?)?$' | ||||
| 		}, req.headers.origin) | ||||
| 			.then(function () { | ||||
| 				res.set({ | ||||
| 					'Access-Control-Allow-Origin':      req.headers.origin, | ||||
| 					'Access-Control-Allow-Credentials': true, | ||||
| 					'Access-Control-Allow-Methods':     'OPTIONS, GET, POST', | ||||
| 					'Access-Control-Allow-Headers':     'Content-Type, Cache-Control, Pragma, Expires, Authorization, X-Dataset-Total, X-Dataset-Offset, X-Dataset-Limit', | ||||
| 					'Access-Control-Max-Age':           5 * 60, | ||||
| 					'Access-Control-Expose-Headers':    'X-Dataset-Total, X-Dataset-Offset, X-Dataset-Limit' | ||||
| 				}); | ||||
| 				next(); | ||||
| 			}) | ||||
| 			.catch(next); | ||||
|  | ||||
| 	} else { | ||||
| 		// No origin | ||||
| 		next(); | ||||
| 	} | ||||
|  | ||||
| }; | ||||
							
								
								
									
										15
									
								
								backend/lib/express/jwt-decode.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								backend/lib/express/jwt-decode.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| const Access = require('../access'); | ||||
|  | ||||
| module.exports = () => { | ||||
| 	return function (req, res, next) { | ||||
| 		res.locals.access = null; | ||||
| 		let access        = new Access(res.locals.token || null); | ||||
| 		access.load() | ||||
| 			.then(() => { | ||||
| 				res.locals.access = access; | ||||
| 				next(); | ||||
| 			}) | ||||
| 			.catch(next); | ||||
| 	}; | ||||
| }; | ||||
|  | ||||
							
								
								
									
										13
									
								
								backend/lib/express/jwt.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								backend/lib/express/jwt.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| module.exports = function () { | ||||
| 	return function (req, res, next) { | ||||
| 		if (req.headers.authorization) { | ||||
| 			let parts = req.headers.authorization.split(' '); | ||||
|  | ||||
| 			if (parts && parts[0] === 'Bearer' && parts[1]) { | ||||
| 				res.locals.token = parts[1]; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		next(); | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										55
									
								
								backend/lib/express/pagination.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								backend/lib/express/pagination.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| let _ = require('lodash'); | ||||
|  | ||||
| module.exports = function (default_sort, default_offset, default_limit, max_limit) { | ||||
|  | ||||
| 	/** | ||||
| 	 * This will setup the req query params with filtered data and defaults | ||||
| 	 * | ||||
| 	 * sort    will be an array of fields and their direction | ||||
| 	 * offset  will be an int, defaulting to zero if no other default supplied | ||||
| 	 * limit   will be an int, defaulting to 50 if no other default supplied, and limited to the max if that was supplied | ||||
| 	 * | ||||
| 	 */ | ||||
|  | ||||
| 	return function (req, res, next) { | ||||
|  | ||||
| 		req.query.offset = typeof req.query.limit === 'undefined' ? default_offset || 0 : parseInt(req.query.offset, 10); | ||||
| 		req.query.limit  = typeof req.query.limit === 'undefined' ? default_limit || 50 : parseInt(req.query.limit, 10); | ||||
|  | ||||
| 		if (max_limit && req.query.limit > max_limit) { | ||||
| 			req.query.limit = max_limit; | ||||
| 		} | ||||
|  | ||||
| 		// Sorting | ||||
| 		let sort       = typeof req.query.sort === 'undefined' ? default_sort : req.query.sort; | ||||
| 		let myRegexp   = /.*\.(asc|desc)$/ig; | ||||
| 		let sort_array = []; | ||||
|  | ||||
| 		sort = sort.split(','); | ||||
| 		_.map(sort, function (val) { | ||||
| 			let matches = myRegexp.exec(val); | ||||
|  | ||||
| 			if (matches !== null) { | ||||
| 				let dir = matches[1]; | ||||
| 				sort_array.push({ | ||||
| 					field: val.substr(0, val.length - (dir.length + 1)), | ||||
| 					dir:   dir.toLowerCase() | ||||
| 				}); | ||||
| 			} else { | ||||
| 				sort_array.push({ | ||||
| 					field: val, | ||||
| 					dir:   'asc' | ||||
| 				}); | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		// Sort will now be in this format: | ||||
| 		// [ | ||||
| 		//    { field: 'field1', dir: 'asc' }, | ||||
| 		//    { field: 'field2', dir: 'desc' } | ||||
| 		// ] | ||||
|  | ||||
| 		req.query.sort = sort_array; | ||||
| 		next(); | ||||
| 	}; | ||||
| }; | ||||
							
								
								
									
										9
									
								
								backend/lib/express/user-id-from-me.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								backend/lib/express/user-id-from-me.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| module.exports = (req, res, next) => { | ||||
| 	if (req.params.user_id === 'me' && res.locals.access) { | ||||
| 		req.params.user_id = res.locals.access.token.get('attrs').id; | ||||
| 	} else { | ||||
| 		req.params.user_id = parseInt(req.params.user_id, 10); | ||||
| 	} | ||||
|  | ||||
| 	next(); | ||||
| }; | ||||
							
								
								
									
										32
									
								
								backend/lib/helpers.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								backend/lib/helpers.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| const moment = require('moment'); | ||||
|  | ||||
| module.exports = { | ||||
|  | ||||
| 	/** | ||||
| 	 * Takes an expression such as 30d and returns a moment object of that date in future | ||||
| 	 * | ||||
| 	 * Key      Shorthand | ||||
| 	 * ================== | ||||
| 	 * years         y | ||||
| 	 * quarters      Q | ||||
| 	 * months        M | ||||
| 	 * weeks         w | ||||
| 	 * days          d | ||||
| 	 * hours         h | ||||
| 	 * minutes       m | ||||
| 	 * seconds       s | ||||
| 	 * milliseconds  ms | ||||
| 	 * | ||||
| 	 * @param {String}  expression | ||||
| 	 * @returns {Object} | ||||
| 	 */ | ||||
| 	parseDatePeriod: function (expression) { | ||||
| 		let matches = expression.match(/^([0-9]+)(y|Q|M|w|d|h|m|s|ms)$/m); | ||||
| 		if (matches) { | ||||
| 			return moment().add(matches[1], matches[2]); | ||||
| 		} | ||||
|  | ||||
| 		return null; | ||||
| 	} | ||||
|  | ||||
| }; | ||||
							
								
								
									
										55
									
								
								backend/lib/migrate_template.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								backend/lib/migrate_template.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| const migrate_name = 'identifier_for_migrate'; | ||||
| const logger       = require('../logger').migrate; | ||||
|  | ||||
| /** | ||||
|  * Migrate | ||||
|  * | ||||
|  * @see http://knexjs.org/#Schema | ||||
|  * | ||||
|  * @param {Object} knex | ||||
|  * @param {Promise} Promise | ||||
|  * @returns {Promise} | ||||
|  */ | ||||
| exports.up = function (knex, Promise) { | ||||
|  | ||||
| 	logger.info('[' + migrate_name + '] Migrating Up...'); | ||||
|  | ||||
| 	// Create Table example: | ||||
|  | ||||
| 	/*return knex.schema.createTable('notification', (table) => { | ||||
| 		 table.increments().primary(); | ||||
| 		 table.string('name').notNull(); | ||||
| 		 table.string('type').notNull(); | ||||
| 		 table.integer('created_on').notNull(); | ||||
| 		 table.integer('modified_on').notNull(); | ||||
| 	 }) | ||||
| 	 .then(function () { | ||||
| 		logger.info('[' + migrate_name + '] Notification Table created'); | ||||
| 	 });*/ | ||||
|  | ||||
| 	logger.info('[' + migrate_name + '] Migrating Up Complete'); | ||||
|  | ||||
| 	return Promise.resolve(true); | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Undo Migrate | ||||
|  * | ||||
|  * @param {Object} knex | ||||
|  * @param {Promise} Promise | ||||
|  * @returns {Promise} | ||||
|  */ | ||||
| exports.down = function (knex, Promise) { | ||||
| 	logger.info('[' + migrate_name + '] Migrating Down...'); | ||||
|  | ||||
| 	// Drop table example: | ||||
|  | ||||
| 	/*return knex.schema.dropTable('notification') | ||||
| 	 .then(() => { | ||||
| 		logger.info('[' + migrate_name + '] Notification Table dropped'); | ||||
| 	 });*/ | ||||
|  | ||||
| 	logger.info('[' + migrate_name + '] Migrating Down Complete'); | ||||
|  | ||||
| 	return Promise.resolve(true); | ||||
| }; | ||||
							
								
								
									
										20
									
								
								backend/lib/utils.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								backend/lib/utils.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| const exec = require('child_process').exec; | ||||
|  | ||||
| module.exports = { | ||||
|  | ||||
| 	/** | ||||
| 	 * @param   {String} cmd | ||||
| 	 * @returns {Promise} | ||||
| 	 */ | ||||
| 	exec: function (cmd) { | ||||
| 		return new Promise((resolve, reject) => { | ||||
| 			exec(cmd, function (err, stdout, /*stderr*/) { | ||||
| 				if (err && typeof err === 'object') { | ||||
| 					reject(err); | ||||
| 				} else { | ||||
| 					resolve(stdout.trim()); | ||||
| 				} | ||||
| 			}); | ||||
| 		}); | ||||
| 	} | ||||
| }; | ||||
							
								
								
									
										45
									
								
								backend/lib/validator/api.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								backend/lib/validator/api.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| const error  = require('../error'); | ||||
| const path   = require('path'); | ||||
| const parser = require('json-schema-ref-parser'); | ||||
|  | ||||
| const ajv = require('ajv')({ | ||||
| 	verbose:        true, | ||||
| 	validateSchema: true, | ||||
| 	allErrors:      false, | ||||
| 	format:         'full', | ||||
| 	coerceTypes:    true | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * @param {Object} schema | ||||
|  * @param {Object} payload | ||||
|  * @returns {Promise} | ||||
|  */ | ||||
| function apiValidator (schema, payload/*, description*/) { | ||||
| 	return new Promise(function Promise_apiValidator (resolve, reject) { | ||||
| 		if (typeof payload === 'undefined') { | ||||
| 			reject(new error.ValidationError('Payload is undefined')); | ||||
| 		} | ||||
|  | ||||
| 		let validate = ajv.compile(schema); | ||||
| 		let valid    = validate(payload); | ||||
|  | ||||
| 		if (valid && !validate.errors) { | ||||
| 			resolve(payload); | ||||
| 		} else { | ||||
| 			let message = ajv.errorsText(validate.errors); | ||||
| 			let err     = new error.ValidationError(message); | ||||
| 			err.debug   = [validate.errors, payload]; | ||||
| 			reject(err); | ||||
| 		} | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| apiValidator.loadSchemas = parser | ||||
| 	.dereference(path.resolve('schema/index.json')) | ||||
| 	.then((schema) => { | ||||
| 		ajv.addSchema(schema); | ||||
| 		return schema; | ||||
| 	}); | ||||
|  | ||||
| module.exports = apiValidator; | ||||
							
								
								
									
										49
									
								
								backend/lib/validator/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								backend/lib/validator/index.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| const _           = require('lodash'); | ||||
| const error       = require('../error'); | ||||
| const definitions = require('../../schema/definitions.json'); | ||||
|  | ||||
| RegExp.prototype.toJSON = RegExp.prototype.toString; | ||||
|  | ||||
| const ajv = require('ajv')({ | ||||
| 	verbose:     true, //process.env.NODE_ENV === 'development', | ||||
| 	allErrors:   true, | ||||
| 	format:      'full',  // strict regexes for format checks | ||||
| 	coerceTypes: true, | ||||
| 	schemas:     [ | ||||
| 		definitions | ||||
| 	] | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param   {Object} schema | ||||
|  * @param   {Object} payload | ||||
|  * @returns {Promise} | ||||
|  */ | ||||
| function validator (schema, payload) { | ||||
| 	return new Promise(function (resolve, reject) { | ||||
| 		if (!payload) { | ||||
| 			reject(new error.InternalValidationError('Payload is falsy')); | ||||
| 		} else { | ||||
| 			try { | ||||
| 				let validate = ajv.compile(schema); | ||||
|  | ||||
| 				let valid = validate(payload); | ||||
| 				if (valid && !validate.errors) { | ||||
| 					resolve(_.cloneDeep(payload)); | ||||
| 				} else { | ||||
| 					let message = ajv.errorsText(validate.errors); | ||||
| 					reject(new error.InternalValidationError(message)); | ||||
| 				} | ||||
|  | ||||
| 			} catch (err) { | ||||
| 				reject(err); | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 	}); | ||||
|  | ||||
| } | ||||
|  | ||||
| module.exports = validator; | ||||
		Reference in New Issue
	
	Block a user