From b6667dea4c93324b6fa912ee1f5c1d15d2fcf2a8 Mon Sep 17 00:00:00 2001 From: A12893 Date: Fri, 13 Mar 2015 01:24:42 +0900 Subject: [PATCH 1/3] Add acl --- acl/acl-mongoDBBackend.d.ts | 22 ++++++ acl/acl-mongodbBackend-tests.ts | 16 +++++ acl/acl-redisBackend-test.ts | 16 +++++ acl/acl-redisBackend.d.ts | 21 ++++++ acl/acl-tests.ts | 65 ++++++++++++++++++ acl/acl.d.ts | 117 ++++++++++++++++++++++++++++++++ 6 files changed, 257 insertions(+) create mode 100644 acl/acl-mongoDBBackend.d.ts create mode 100644 acl/acl-mongodbBackend-tests.ts create mode 100644 acl/acl-redisBackend-test.ts create mode 100644 acl/acl-redisBackend.d.ts create mode 100644 acl/acl-tests.ts create mode 100644 acl/acl.d.ts diff --git a/acl/acl-mongoDBBackend.d.ts b/acl/acl-mongoDBBackend.d.ts new file mode 100644 index 000000000..48fe6f135 --- /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 000000000..ee3957de8 --- /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 000000000..4d1552b04 --- /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 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..f98bcb1ae --- /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 = _; +} From f3682e195f6762a7589bbb02652f983c3888d4c3 Mon Sep 17 00:00:00 2001 From: A12893 Date: Fri, 13 Mar 2015 02:02:19 +0900 Subject: [PATCH 2/3] Fix comment --- acl/acl-mongodbBackend-tests.ts | 2 +- acl/{acl-mongoDBBackend.d.ts => acl-mongodbBackend.d.ts} | 0 acl/acl-redisBackend-test.ts | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename acl/{acl-mongoDBBackend.d.ts => acl-mongodbBackend.d.ts} (100%) diff --git a/acl/acl-mongodbBackend-tests.ts b/acl/acl-mongodbBackend-tests.ts index ee3957de8..080bfbf42 100644 --- a/acl/acl-mongodbBackend-tests.ts +++ b/acl/acl-mongodbBackend-tests.ts @@ -6,7 +6,7 @@ import mongodb = require('mongodb'); var db: mongodb.Db; -// Using the memory backend +// Using the mongo db backend var acl = new Acl(new Acl.mongodbBackend(db, 'acl_', true)); // guest is allowed to view blogs diff --git a/acl/acl-mongoDBBackend.d.ts b/acl/acl-mongodbBackend.d.ts similarity index 100% rename from acl/acl-mongoDBBackend.d.ts rename to acl/acl-mongodbBackend.d.ts diff --git a/acl/acl-redisBackend-test.ts b/acl/acl-redisBackend-test.ts index 4d1552b04..ce1036528 100644 --- a/acl/acl-redisBackend-test.ts +++ b/acl/acl-redisBackend-test.ts @@ -6,7 +6,7 @@ import redis = require('redis'); var client: redis.RedisClient; -// Using the memory backend +// Using the redis backend var acl = new Acl(new Acl.redisBackend(client, 'acl_')); // guest is allowed to view blogs From 985397ab73833ed0ba3638c4a473bf1fab62224a Mon Sep 17 00:00:00 2001 From: A12893 Date: Fri, 13 Mar 2015 03:18:04 +0900 Subject: [PATCH 3/3] Rename things --- acl/acl-mongodbBackend-tests.ts | 1 + acl/acl-mongodbBackend.d.ts | 2 +- acl/acl-redisBackend-test.ts | 2 +- acl/acl.d.ts | 47 ++++++++++++++++++--------------- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/acl/acl-mongodbBackend-tests.ts b/acl/acl-mongodbBackend-tests.ts index 080bfbf42..31411b65c 100644 --- a/acl/acl-mongodbBackend-tests.ts +++ b/acl/acl-mongodbBackend-tests.ts @@ -14,3 +14,4 @@ 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 index 48fe6f135..8dbfb7e90 100644 --- a/acl/acl-mongodbBackend.d.ts +++ b/acl/acl-mongodbBackend.d.ts @@ -13,7 +13,7 @@ declare module "acl" { mongodbBackend: MongodbBackendStatic; } - interface MongodbBackend extends Backend { } + interface MongodbBackend extends Backend { } interface MongodbBackendStatic { new(db: mongo.Db, prefix: string, useSingle: boolean): MongodbBackend; new(db: mongo.Db, prefix: string): MongodbBackend; diff --git a/acl/acl-redisBackend-test.ts b/acl/acl-redisBackend-test.ts index ce1036528..e1bf29af4 100644 --- a/acl/acl-redisBackend-test.ts +++ b/acl/acl-redisBackend-test.ts @@ -1,4 +1,4 @@ -/// +/// // https://github.com/OptimalBits/node_acl/blob/master/Readme.md import Acl = require('acl'); diff --git a/acl/acl.d.ts b/acl/acl.d.ts index f98bcb1ae..5d0498fed 100644 --- a/acl/acl.d.ts +++ b/acl/acl.d.ts @@ -10,14 +10,14 @@ declare module "acl" { import http = require('http'); import Promise = require("bluebird"); - type Func = ()=>any; + type strings = string|string[]; type Value = string|number; type Values = Value|Value[]; - type strings = string|string[]; - type ErrCallback = (err: Error) => any; + 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) => any; + type GetUserId = (req: http.ServerRequest, res: http.ServerResponse) => Value; interface AclStatic { new (backend: Backend, logger: Logger, options: Option): Acl; @@ -31,19 +31,19 @@ declare module "acl" { } interface Acl { - addUserRoles: (userId: Value, roles: strings, cb?: ErrCallback) => Promise; - removeUserRoles: (userId: Value, roles: strings, cb?: ErrCallback) => Promise; + 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?: ErrCallback) => Promise; - removeRole: (role: string, cb?: ErrCallback) => Promise; - removeResource: (resource: string, cb?: ErrCallback) => 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?: ErrCallback): Promise; + (roles: Values, resources: strings, permissions: strings, cb?: Callback): Promise; (aclSets: AclSet|AclSet[]): Promise; } - removeAllow: (role: string, resources: strings, permissions: strings, cb?: ErrCallback) => 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; @@ -76,15 +76,23 @@ declare module "acl" { permissions: strings; } + interface MemoryBackend extends Backend { } + interface MemoryBackendStatic { + new(): MemoryBackend; + } + + // + // For internal use + // 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; + 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: Value|Value[]) => void; + remove: (transaction: T, bucket: string, key: Value, values: Values) => void; endAsync: Function; //TODO: Give more specific function signature getAsync: Function; @@ -92,11 +100,6 @@ declare module "acl" { unionAsync: Function; } - interface MemoryBackend extends Backend { } - interface MemoryBackendStatic { - new(): MemoryBackend; - } - interface Contract { (args: IArguments): Contract|NoOp; debug: boolean;