diff --git a/acl/acl-mongodbBackend-tests.ts b/acl/acl-mongodbBackend-tests.ts
new file mode 100644
index 000000000..31411b65c
--- /dev/null
+++ b/acl/acl-mongodbBackend-tests.ts
@@ -0,0 +1,17 @@
+///
+
+// https://github.com/OptimalBits/node_acl/blob/master/Readme.md
+import Acl = require('acl');
+import mongodb = require('mongodb');
+
+var db: mongodb.Db;
+
+// Using the mongo db 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-mongodbBackend.d.ts b/acl/acl-mongodbBackend.d.ts
new file mode 100644
index 000000000..8dbfb7e90
--- /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-redisBackend-test.ts b/acl/acl-redisBackend-test.ts
new file mode 100644
index 000000000..e1bf29af4
--- /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 redis 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 000000000..e199f8b81
--- /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 000000000..551ad9c1c
--- /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 000000000..5d0498fed
--- /dev/null
+++ b/acl/acl.d.ts
@@ -0,0 +1,120 @@
+// 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 strings = string|string[];
+ type Value = string|number;
+ type Values = Value|Value[];
+ type Action = () => any;
+ type Callback = (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) => Value;
+
+ 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?: Callback) => Promise;
+ removeUserRoles: (userId: Value, roles: strings, cb?: Callback) => 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?: Callback) => Promise;
+ removeRole: (role: string, cb?: Callback) => Promise;
+ removeResource: (resource: string, cb?: Callback) => Promise;
+ allow: {
+ (roles: Values, resources: strings, permissions: strings, cb?: Callback): Promise;
+ (aclSets: AclSet|AclSet[]): Promise;
+ }
+ removeAllow: (role: string, resources: strings, permissions: strings, cb?: Callback) => 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 MemoryBackend extends Backend { }
+ interface MemoryBackendStatic {
+ new(): MemoryBackend;
+ }
+
+ //
+ // For internal use
+ //
+ interface Backend {
+ begin: () => T;
+ end: (transaction: T, cb?: Action) => void;
+ clean: (cb?: Action) => void;
+ get: (bucket: string, key: Value, cb?: Action) => void;
+ union: (bucket: string, keys: Value[], cb?: Action) => void;
+ add: (transaction: T, bucket: string, key: Value, values: Values) => void;
+ del: (transaction: T, bucket: string, keys: Value[]) => void;
+ remove: (transaction: T, bucket: string, key: Value, values: Values) => void;
+
+ endAsync: Function; //TODO: Give more specific function signature
+ getAsync: Function;
+ cleanAsync: Function;
+ unionAsync: Function;
+ }
+
+ 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 = _;
+}