diff --git a/acl/acl-mongoDBBackend.d.ts b/acl/acl-mongoDBBackend.d.ts new file mode 100644 index 00000000000000..48fe6f135516c8 --- /dev/null +++ b/acl/acl-mongoDBBackend.d.ts @@ -0,0 +1,22 @@ +// Type definitions for node_acl 0.4.7 +// Project: https://github.com/optimalbits/node_acl +// Definitions by: Qubo +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// +/// + +declare module "acl" { + import mongo = require('mongodb'); + + interface AclStatic { + mongodbBackend: MongodbBackendStatic; + } + + interface MongodbBackend extends Backend { } + interface MongodbBackendStatic { + new(db: mongo.Db, prefix: string, useSingle: boolean): MongodbBackend; + new(db: mongo.Db, prefix: string): MongodbBackend; + new(db: mongo.Db): MongodbBackend; + } +} diff --git a/acl/acl-mongodbBackend-tests.ts b/acl/acl-mongodbBackend-tests.ts new file mode 100644 index 00000000000000..ee3957de81395d --- /dev/null +++ b/acl/acl-mongodbBackend-tests.ts @@ -0,0 +1,16 @@ +/// + +// https://github.com/OptimalBits/node_acl/blob/master/Readme.md +import Acl = require('acl'); +import mongodb = require('mongodb'); + +var db: mongodb.Db; + +// Using the memory backend +var acl = new Acl(new Acl.mongodbBackend(db, 'acl_', true)); + +// guest is allowed to view blogs +acl.allow('guest', 'blogs', 'view'); + +// allow function accepts arrays as any parameter +acl.allow('member', 'blogs', ['edit','view', 'delete']); diff --git a/acl/acl-redisBackend-test.ts b/acl/acl-redisBackend-test.ts new file mode 100644 index 00000000000000..4d1552b04edd94 --- /dev/null +++ b/acl/acl-redisBackend-test.ts @@ -0,0 +1,16 @@ +/// + +// https://github.com/OptimalBits/node_acl/blob/master/Readme.md +import Acl = require('acl'); +import redis = require('redis'); + +var client: redis.RedisClient; + +// Using the memory backend +var acl = new Acl(new Acl.redisBackend(client, 'acl_')); + +// guest is allowed to view blogs +acl.allow('guest', 'blogs', 'view'); + +// allow function accepts arrays as any parameter +acl.allow('member', 'blogs', ['edit','view', 'delete']); diff --git a/acl/acl-redisBackend.d.ts b/acl/acl-redisBackend.d.ts new file mode 100644 index 00000000000000..e199f8b81cbda8 --- /dev/null +++ b/acl/acl-redisBackend.d.ts @@ -0,0 +1,21 @@ +// Type definitions for node_acl 0.4.7 +// Project: https://github.com/optimalbits/node_acl +// Definitions by: Qubo +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// +/// + +declare module "acl" { + import redis = require('redis'); + + interface AclStatic { + redisBackend: RedisBackendStatic; + } + + interface RedisBackend extends Backend { } + interface RedisBackendStatic { + new(redis: redis.RedisClient, prefix: string): RedisBackend; + new(redis: redis.RedisClient): RedisBackend; + } +} diff --git a/acl/acl-tests.ts b/acl/acl-tests.ts new file mode 100644 index 00000000000000..551ad9c1cd1e3a --- /dev/null +++ b/acl/acl-tests.ts @@ -0,0 +1,65 @@ +/// + +// Sample code from +// https://github.com/OptimalBits/node_acl/blob/master/Readme.md +import Acl = require('acl'); + +var report = (err: Error, value: T) => { + if (err) { + console.error(err); + } + console.info(value); +}; + +// Using the memory backend +var acl = new Acl(new Acl.memoryBackend()); + +// guest is allowed to view blogs +acl.allow('guest', 'blogs', 'view'); + +// allow function accepts arrays as any parameter +acl.allow('member', 'blogs', ['edit','view', 'delete']); + +acl.addUserRoles('joed', 'guest'); + +acl.addRoleParents('baz', ['foo','bar']); + +acl.allow('foo', ['blogs','forums','news'], ['view', 'delete']); + +acl.allow('admin', ['blogs','forums'], '*'); + +acl.allow([ + { + roles:['guest','special-member'], + allows:[ + {resources:'blogs', permissions:'get'}, + {resources:['forums','news'], permissions:['get','put','delete']} + ] + }, + { + roles:['gold','silver'], + allows:[ + {resources:'cash', permissions:['sell','exchange']}, + {resources:['account','deposit'], permissions:['put','delete']} + ] + } +]); + +acl.isAllowed('joed', 'blogs', 'view', (err, res) => { + if (res) { + console.log("User joed is allowed to view blogs"); + } +}); + +acl.isAllowed('jsmith', 'blogs', ['edit','view','delete']) +.then((result) => { + console.dir('jsmith is allowed blogs ' + result); + acl.addUserRoles('jsmith', 'member'); +}).then(() => + acl.isAllowed('jsmith', 'blogs', ['edit','view','delete']) +).then((result) => + console.dir('jsmith is allowed blogs ' + result) +).then(() => { + acl.allowedPermissions('james', ['blogs','forums'], report); + acl.allowedPermissions('jsmith', ['blogs','forums'], report); +}); diff --git a/acl/acl.d.ts b/acl/acl.d.ts new file mode 100644 index 00000000000000..f98bcb1ae65a4d --- /dev/null +++ b/acl/acl.d.ts @@ -0,0 +1,117 @@ +// Type definitions for node_acl 0.4.7 +// Project: https://github.com/optimalbits/node_acl +// Definitions by: Qubo +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// +/// + +declare module "acl" { + import http = require('http'); + import Promise = require("bluebird"); + + type Func = ()=>any; + type Value = string|number; + type Values = Value|Value[]; + type strings = string|string[]; + type ErrCallback = (err: Error) => any; + type AnyCallback = (err: Error, obj: any) => any; + type AllowedCallback = (err: Error, allowed: boolean) => any; + type GetUserId = (req: http.ServerRequest, res: http.ServerResponse) => any; + + interface AclStatic { + new (backend: Backend, logger: Logger, options: Option): Acl; + new (backend: Backend, logger: Logger): Acl; + new (backend: Backend): Acl; + memoryBackend: MemoryBackendStatic; + } + + interface Logger { + debug: (msg: string)=>any; + } + + interface Acl { + addUserRoles: (userId: Value, roles: strings, cb?: ErrCallback) => Promise; + removeUserRoles: (userId: Value, roles: strings, cb?: ErrCallback) => Promise; + userRoles: (userId: Value, cb?: (err: Error, roles: string[])=>any) => Promise; + roleUsers: (role: Value, cb?: (err: Error, users: Values)=>any) => Promise; + hasRole: (userId: Value, role: string, cb?: (err: Error, isInRole: boolean)=>any) => Promise; + addRoleParents: (role: string, parents: Values, cb?: ErrCallback) => Promise; + removeRole: (role: string, cb?: ErrCallback) => Promise; + removeResource: (resource: string, cb?: ErrCallback) => Promise; + allow: { + (roles: Values, resources: strings, permissions: strings, cb?: ErrCallback): Promise; + (aclSets: AclSet|AclSet[]): Promise; + } + removeAllow: (role: string, resources: strings, permissions: strings, cb?: ErrCallback) => Promise; + removePermissions: (role: string, resources: strings, permissions: strings, cb?: Function) => Promise; + allowedPermissions: (userId: Value, resources: strings, cb?: AnyCallback) => Promise; + isAllowed: (userId: Value, resources: strings, permissions: strings, cb?: AllowedCallback) => Promise; + areAnyRolesAllowed: (roles: strings, resource: strings, permissions: strings, cb?: AllowedCallback) => Promise; + whatResources: (roles: strings, permissions: strings, cb?: AnyCallback) => Promise; + permittedResources: (roles: strings, permissions: strings, cb?: Function) => Promise; + middleware: (numPathComponents: number, userId: Value|GetUserId, actions: strings) => Promise; + } + + interface Option { + buckets?: BucketsOption; + } + + interface BucketsOption { + meta?: string; + parents?: string; + permissions?: string; + resources?: string; + roles?: string; + users?: string; + } + + interface AclSet { + roles: strings; + allows: AclAllow[]; + } + + interface AclAllow { + resources: strings; + permissions: strings; + } + + interface Backend { + begin: () => T; + end: (transaction: T, cb?: Func) => void; + clean: (cb?: Func) => void; + get: (bucket: string, key: Value, cb?: Func) => void; + union: (bucket: string, keys: Value[], cb?: Func) => void; + add: (transaction: T, bucket: string, key: Value, values: Value|Value[]) => void; + del: (transaction: T, bucket: string, keys: Value[]) => void; + remove: (transaction: T, bucket: string, key: Value, values: Value|Value[]) => void; + + endAsync: Function; //TODO: Give more specific function signature + getAsync: Function; + cleanAsync: Function; + unionAsync: Function; + } + + interface MemoryBackend extends Backend { } + interface MemoryBackendStatic { + new(): MemoryBackend; + } + + interface Contract { + (args: IArguments): Contract|NoOp; + debug: boolean; + fulfilled: boolean; + args: any[]; + checkedParams: string[]; + params: (...types: string[]) => Contract|NoOp; + end: () => void; + } + + interface NoOp { + params: (...types: string[]) => NoOp; + end: () => void; + } + + var _: AclStatic; + export = _; +}