{"_id":"rbac-core","_rev":"13-29beb54d2ef2296fbdd192305daa5c4a","name":"rbac-core","description":"RBAC core from hapi-rbac","dist-tags":{"latest":"3.0.0"},"versions":{"0.0.1":{"name":"rbac-core","version":"0.0.1","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"^1.5.2","boom":"^3.1.2","hoek":"^3.0.4","joi":"^7.3.0"},"devDependencies":{"code":"^2.1.0","lab":"^8.2.0"},"gitHead":"2de27cbfd3a7ccc221b74d6fc432b4209c9a3f6f","_id":"rbac-core@0.0.1","_shasum":"27df569b85087edb06b142bc1e7de5750dfedef5","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"27df569b85087edb06b142bc1e7de5750dfedef5","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-0.0.1.tgz","integrity":"sha512-dwXtNtsK9840LluI6ycY0QIWMLz4XyOTQOE9dxm5cA4TMwabPlj3DRIW4XkDfFaiYtpsCgz8OOLlLq1OWl52sw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC6jjWczsXqDWFS/8hKVF3Lh1UZ0ZvxZLyJV0PjvfldJwIhAL1FOOFkBZUZfAUgx1HijHA0marnnJrGulbk6ccDy4dI"}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-5-east.internal.npmjs.com","tmp":"tmp/rbac-core-0.0.1.tgz_1455325098378_0.2553006452508271"}},"0.0.2":{"name":"rbac-core","version":"0.0.2","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"^1.5.2","boom":"^3.1.2","hoek":"^3.0.4","joi":"^7.3.0"},"devDependencies":{"code":"^2.1.0","lab":"^8.2.0"},"gitHead":"13858ed04de9da667d985c992ceb7e61048ffedd","_id":"rbac-core@0.0.2","_shasum":"81e403c15523c192ace88eb6a2b673d88746a57f","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"81e403c15523c192ace88eb6a2b673d88746a57f","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-0.0.2.tgz","integrity":"sha512-pRPk9n/amfy5fZcAEhOyPnZtNKsdaYFZjYS3YXR14hrHmDTWw2AC26dySfrVttuRLskdm6n4/Ex5F7hRWgz+1g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFqKKreQA0QGnBT3Yz3huCyhoTPZz0b61YMRUXQzXFqGAiEAgtvt5m+kQmGrzdZU8o6PcgEAQib2Tyruh/grTZCIjQM="}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-6-west.internal.npmjs.com","tmp":"tmp/rbac-core-0.0.2.tgz_1455325808458_0.08354910789057612"}},"1.0.0":{"name":"rbac-core","version":"1.0.0","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v","coverage":"lab -s -r lcov | coveralls","lint":"lab -dL","indent":"js-beautify lib/index.js"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"^1.5.2","boom":"^3.1.2","hoek":"^3.0.4","joi":"^7.3.0"},"devDependencies":{"code":"^2.1.0","lab":"^8.2.0","coveralls":"^2.11.6","js-beautify":"^1.5.10"},"gitHead":"9a7db3cfa15848302824d720b5a5c81b03c20a7a","_id":"rbac-core@1.0.0","_shasum":"c18487d2adc618a96d783997a9805c91c9886c86","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.0","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"c18487d2adc618a96d783997a9805c91c9886c86","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-1.0.0.tgz","integrity":"sha512-tRuWfmsXYYgySqYkzkkbUsk5Q1m5Mpp8j9Fek23nxu40dGBQgtmJlfoBNi6eqG/y1XxnuumtvuLlMOdAyWyeQA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrkGB0iA+oCiouVnr2/YeYJ/iKuTSsFtcqBXab5q8SKQIhAPeqfYGuurTRACpiKLB5/IjzjGl60D8kLJhE0dx4DrkY"}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-5-east.internal.npmjs.com","tmp":"tmp/rbac-core-1.0.0.tgz_1455571902859_0.3523737210780382"}},"2.0.0":{"name":"rbac-core","version":"2.0.0","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v","coverage":"lab -s -r lcov | coveralls","lint":"lab -dL","indent":"js-beautify lib/index.js"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"^1.5.2","boom":"^3.1.2","hoek":"^3.0.4","joi":"^7.3.0"},"devDependencies":{"code":"^2.1.0","lab":"^8.2.0","coveralls":"^2.11.6","js-beautify":"^1.5.10"},"gitHead":"d1ec79c0ed69e679d565e2f4dcf39bb87bfc97bd","_id":"rbac-core@2.0.0","_shasum":"99aea218459047784dbf0bc6e276bad02663e48b","_from":".","_npmVersion":"3.7.2","_nodeVersion":"4.3.0","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"99aea218459047784dbf0bc6e276bad02663e48b","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-2.0.0.tgz","integrity":"sha512-HeuNJ72Mp9Baqo6XXbgekXE2E6yPtwb8pFmmu4W+uUCiGDc4nXCSLjyclDz2wqkjRuvdFcqKjBuL2/lENjZg4Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICKa+wii8+cVf5shmtLe1S/rK4iEt7YnnbeW895pqYNBAiEAqnHF4lvvsOl3qWb3b3tknk1fCOsxhdUrfrwoMgzgTz8="}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-6-west.internal.npmjs.com","tmp":"tmp/rbac-core-2.0.0.tgz_1455668592667_0.6243692215066403"}},"2.0.1":{"name":"rbac-core","version":"2.0.1","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v","coverage":"lab -s -r lcov | coveralls","lint":"lab -dL","indent":"js-beautify lib/index.js"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"^1.5.2","boom":"^3.1.3","hoek":"^4.0.0","joi":"^8.1.0"},"devDependencies":{"code":"^2.3.0","lab":"^10.5.1","coveralls":"^2.11.9","js-beautify":"^1.6.2"},"gitHead":"60f74c00075904fa6ecbe412ccc6abf7623a13f3","_id":"rbac-core@2.0.1","_shasum":"74376049730b79c86e63d9f9067f4163816678c2","_from":".","_npmVersion":"2.15.1","_nodeVersion":"4.4.4","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"74376049730b79c86e63d9f9067f4163816678c2","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-2.0.1.tgz","integrity":"sha512-F7Huqo7FU3fv8q2/MHHZTnhTsbFS3ehPncPtj6e56sScd1r0fMrV5QSMh3vysDp4KhWwnW+sQ6ch2rdZP0z6hg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICWxqyvmjO5vxhzU7DUvxIIHIjTiV2YSN4uaTpy1pJDDAiBbIx/CryRmKZ1TZcdSd7/Xf+ZAGODNCZCEI3jmzE8UAQ=="}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/rbac-core-2.0.1.tgz_1463924195263_0.6217451626434922"}},"2.0.2":{"name":"rbac-core","version":"2.0.2","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v","coverage":"lab -s -r lcov | coveralls","lint":"lab -dL","indent":"js-beautify lib/index.js"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"2.0.1","boom":"4.0.0","hoek":"^4.0.0","joi":"9.0.4"},"devDependencies":{"code":"4.0.0","lab":"11.0.1","coveralls":"^2.11.9","js-beautify":"^1.6.2"},"gitHead":"e05a238cea18e975b4da931f4ef0098b7817eb4b","_id":"rbac-core@2.0.2","_shasum":"0a9ce375f7e758661aca22317059f7082a0e9c6d","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.6.0","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"0a9ce375f7e758661aca22317059f7082a0e9c6d","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-2.0.2.tgz","integrity":"sha512-YNkvpMNSckC/6U2VqDAn08qoLm6jVIJif58AIwOhF9eLIrbtSuasEvFg+cCArb4PDo0oteUUi+k6jsx4d9U8aQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDKh0q4GvJ1jH09DTWsYQpLGOUSitouniMB6euNot0+AIgRQLNp542uxRGXcQHbEVSl1Mt5M/3eM4sPS5AYWOmb4Q="}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/rbac-core-2.0.2.tgz_1474632552973_0.5334793492220342"}},"2.1.0":{"name":"rbac-core","version":"2.1.0","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v","coverage":"lab -s -r lcov | coveralls","lint":"lab -dL","indent":"js-beautify lib/index.js"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"2.0.1","boom":"4.0.0","hoek":"^4.0.0","joi":"9.0.4"},"devDependencies":{"code":"4.0.0","lab":"11.0.1","coveralls":"^2.11.9","js-beautify":"^1.6.2"},"gitHead":"aa8b035e0d22b7c182f38a97aad7f264f2a24211","_id":"rbac-core@2.1.0","_shasum":"d6f9a313e8384b0ec03671e78c267d9304a9ecee","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.0","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"d6f9a313e8384b0ec03671e78c267d9304a9ecee","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-2.1.0.tgz","integrity":"sha512-wT06iLdpRoHjVsOvw9vjzMwlhfpT4veuLs52nob4O1ZKL37aI5HlSu5fyKz2bnDbWiiXJmVrBD8M6Wr3/+l62A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEntHafZvAEiLQDkOkm13qR8sktf3reTuwp1r3XCQrYFAiBWS3CDKSESBDyO4OLPE86pOcFTufbLeqnASpAlZ5aPnw=="}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/rbac-core-2.1.0.tgz_1488654953156_0.08697652723640203"}},"3.0.0":{"name":"rbac-core","version":"3.0.0","description":"RBAC core from hapi-rbac","main":"lib/index.js","directories":{"test":"test"},"scripts":{"test":"lab -v","coverage":"lab -s -r lcov | coveralls","lint":"lab -dL","indent":"js-beautify lib/index.js"},"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"keywords":["rbac"],"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"license":"ISC","bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","dependencies":{"async":"2.0.1","boom":"4.0.0","hoek":"^4.0.0","joi":"9.0.4"},"devDependencies":{"code":"4.0.0","lab":"11.0.1","coveralls":"^2.11.9","js-beautify":"^1.6.2"},"gitHead":"80bfd55b6eb805a49083945c27119bfc9d7a8429","_id":"rbac-core@3.0.0","_shasum":"c4802da376e83f8c8d9f24169e77eb5c6ea5cc56","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.0","_npmUser":{"name":"fgouveia","email":"francisco@de-gouveia.eu"},"dist":{"shasum":"c4802da376e83f8c8d9f24169e77eb5c6ea5cc56","tarball":"https://registry.npmjs.org/rbac-core/-/rbac-core-3.0.0.tgz","integrity":"sha512-ZeO3poffZGvroT6eLUleQP37FtdR1nc/F5mJcLz8JqfQuHfSoiQN7Dgg10dTVwwXq943WZis8ELkDcn7riarng==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkLg71djqaKq0QkqqQVjlihRYBBoe6RWgzFhCf6MGWnwIgPG0Y3Do/M76Ozgfib2wEJvN+X4alWiclh6MS1X656xg="}]},"maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/rbac-core-3.0.0.tgz_1488664066286_0.2050499019678682"}}},"readme":"# rbac-core\n\n[![npm version][npm-badge]][npm-url]\n[![Build Status][travis-badge]][travis-url]\n[![Coverage Status][coveralls-badge]][coveralls-url]\n[![Dependency Status][david-badge]][david-url]\n\n> The RBAC core from hapi-rbac\n\n> This is inspired by the [XACML](https://en.wikipedia.org/wiki/XACML) policies.\n\n## Versions\n\n* `1.0.0` [Release Notes](https://github.com/franciscogouveia/rbac-core/issues/12)\n* `2.0.0` [Release Notes](https://github.com/franciscogouveia/rbac-core/issues/15)\n* `3.0.0` [Release Notes](https://github.com/franciscogouveia/rbac-core/issues/23)\n\n## How to use it\n\nFirst, install\n\n```\nnpm install --save rbac-core\n```\n\nImport it to your project\n\n```js\nconst Rbac = require('rbac-core');\nconst DataRetrievalRouter = Rbac.DataRetrievalRouter;\n```\n\nCreate your data sources in the data retrieval router\n\n```js\nconst dataRetrieverRouter = new DataRetrievalRouter();\n\n/**\n * register(prefixes, dataretriever): registers a data retriever.\n *\n * prefixes - a string or array of strings with prefixes which this data retriever will be associated\n * dataretriever - a function with the following signature\n *         source - The requested prefix\n *         key - the key being requested\n *         context - An object with contextual information\n **/\ndataRetrieverRouter.register('credentials', (source, key, context) => {\n\n    // Obtain your value (e.g. from the context)\n    const value = context.user[key];\n\n    return value;\n});\n\n// You can handle multiple prefixes with a single data retriever\ndataRetrieverRouter.register(['connection', 'status'], (source, key, context) => {\n\n    let value;\n\n    switch (source) {\n        case 'connection':\n            // Obtain connection info\n            value = context.connection[key];\n            break;\n        case 'status':\n            // Obtain from somewhere else\n            value = getStatusValue(key);\n            break;\n    }\n\n    return value;\n});\n```\n\nEvaluate your policies against a certain context\n\n```js\nconst context = {\n    user: {\n        username: 'francisco',\n        group: ['articles:admin', 'articles:developer'],\n        validated: true,\n        exampleField1: \"test-value\"\n    },\n    connection: {\n        remoteip: '192.168.0.123',\n        remoteport: 90,\n        localip: '192.168.0.2'\n        localport: 80,\n        exampleField2: \"test-value\"\n    }\n};\n\ndataRetrieverRouter.setContext(context);\n\nconst policy = {\n    target: [\n        // if username matches 'francisco' OR (exampleField1 matches exampleField2 AND user group matches 'articles:*')\n        { 'credentials:username': 'francisco' },\n        // OR\n        {\n            'credentials:exampleField1': { field: 'connection:exampleField2' }\n            // AND\n            'credentials:group': /^articles\\:.*$/ //(using native javascript RegExp)\n        }\n    ],\n    apply: 'deny-overrides', // permit, unless one denies\n    rules: [\n        {\n            target: { 'credentials:group': 'articles:admin', 'credentials:validated': false }, // if group is 'articles:admin' AND is not validated\n            effect: 'deny'  // then deny (deny access to users that are not validated)\n        },\n        {\n            target: { 'connection:remoteip': ['192.168.0.2', '192.168.0.3'] }, // if remoteip is one of '192.168.0.2' or '192.168.0.3'\n            effect: 'deny'  // then deny (deny blacklisted ips)\n        },\n        {\n            effect: 'permit' // else permit\n        }\n    ]\n};\n\nRbac.evaluatePolicy(policy, dataRetrieverRouter, (err, result) => {\n\n    switch (result) {\n        case Rbac.PERMIT:\n            console.log('ACCESS GRANTED');\n            break;\n        case Rbac.DENY:\n            console.log('ACCESS DENIED');\n            break;\n    }\n});\n\n```\n\nIf you want to extend your existent data retriever router, you can do it.\n\n```js\n// You can just extend\nconst dataRetrieverRouter1 = dataRetrieverRouter.createChild();\n\n// You can also directly add context to the extension, for isolation\nconst dataRetrieverRouter2 = dataRetrieverRouter.createChild(context);\n```\n\nBoth `dataRetrieverRouter1` and `dataRetrieverRouter2` will have all the registered data retrievers from `dataRetrieverRouter`.\n\nChanges to `dataRetrieverRouter` will influence `dataRetrieverRouter1` and `dataRetrieverRouter2`.\n\nChanges to any of `dataRetrieverRouter1` or `dataRetrieverRouter2` will not cause influence on any data retriever routers, but themselves.\n\nContexts are preserved per data retriever router.\n\nYou can also get data from data retriever router\n\n```js\ndataRetrieverRouter.get('credentials:username', (err, result) => {\n    ...\n});\n```\n\nAnd you can override the context on get, by passing it in the second argument\n\n```js\ndataRetrieverRouter.get('credentials:username', { username: 'the_overrider', group: ['anonymous'] }, (err, result) => {\n    ...\n});\n```\n\n## Learn more about _Rule Based Access Control_\n\nTo have a better idea of how this works, you can check my Bachelor's project presentation about XACML\n[here](http://helios.av.it.pt/attachments/download/559/_en_XACML.PAPOX.Presentation.pdf) (english),\nor [here](http://helios.av.it.pt/attachments/download/557/_pt_XACML.PAPOX.Presentation.pdf) (portuguese).\n\nEven though this plugin doesn't implement the XACML specification, it was based on its policies.\n\n[npm-badge]: https://img.shields.io/npm/v/rbac-core.svg\n[npm-url]: https://npmjs.com/package/rbac-core\n[travis-badge]: https://travis-ci.org/franciscogouveia/rbac-core.svg?branch=master\n[travis-url]: https://travis-ci.org/franciscogouveia/rbac-core\n[coveralls-badge]:https://coveralls.io/repos/github/franciscogouveia/rbac-core/badge.svg?branch=master\n[coveralls-url]: https://coveralls.io/github/franciscogouveia/rbac-core?branch=master\n[david-badge]: https://david-dm.org/franciscogouveia/rbac-core.svg\n[david-url]: https://david-dm.org/franciscogouveia/rbac-core\n","maintainers":[{"name":"fgouveia","email":"francisco@de-gouveia.eu"}],"time":{"modified":"2022-06-25T14:06:06.943Z","created":"2016-02-13T00:58:20.230Z","0.0.1":"2016-02-13T00:58:20.230Z","0.0.2":"2016-02-13T01:10:11.888Z","1.0.0":"2016-02-15T21:31:44.965Z","2.0.0":"2016-02-17T00:23:16.547Z","2.0.1":"2016-05-22T13:36:36.308Z","2.0.2":"2016-09-23T12:09:14.867Z","2.1.0":"2017-03-04T19:15:55.095Z","2.2.0":"2017-03-04T21:35:16.969Z","3.0.0":"2017-03-04T21:47:47.888Z"},"homepage":"https://github.com/franciscogouveia/rbac-core#readme","keywords":["rbac"],"repository":{"type":"git","url":"git+https://github.com/franciscogouveia/rbac-core.git"},"author":{"name":"Francisco de Gouveia","email":"francisco@de-gouveia.eu","url":"http://de-gouveia.eu"},"bugs":{"url":"https://github.com/franciscogouveia/rbac-core/issues"},"license":"ISC","readmeFilename":"README.md","users":{"temasm":true}}