@spinajs/rbac-http 1.2.125 → 1.2.136

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/lib/decorators.d.ts +2 -1
  2. package/lib/decorators.js +18 -3
  3. package/lib/decorators.js.map +1 -1
  4. package/lib/http/src/interfaces.d.ts +443 -0
  5. package/lib/http/src/interfaces.js +222 -0
  6. package/lib/http/src/interfaces.js.map +1 -0
  7. package/lib/interfaces.d.ts +3 -3
  8. package/lib/policies.d.ts +6 -2
  9. package/lib/policies.js +24 -4
  10. package/lib/policies.js.map +1 -1
  11. package/lib/rbac-http/src/augumentation.d.ts +7 -0
  12. package/lib/rbac-http/src/augumentation.js +4 -0
  13. package/lib/rbac-http/src/augumentation.js.map +1 -0
  14. package/lib/rbac-http/src/config/rbac-http.d.ts +1 -0
  15. package/lib/rbac-http/src/config/rbac-http.js +21 -0
  16. package/lib/rbac-http/src/config/rbac-http.js.map +1 -0
  17. package/lib/rbac-http/src/controllers/LoginController.d.ts +12 -0
  18. package/lib/rbac-http/src/controllers/LoginController.js +91 -0
  19. package/lib/rbac-http/src/controllers/LoginController.js.map +1 -0
  20. package/lib/rbac-http/src/controllers/UsersController.d.ts +17 -0
  21. package/lib/rbac-http/src/controllers/UsersController.js +199 -0
  22. package/lib/rbac-http/src/controllers/UsersController.js.map +1 -0
  23. package/lib/rbac-http/src/decorators.d.ts +18 -0
  24. package/lib/rbac-http/src/decorators.js +80 -0
  25. package/lib/rbac-http/src/decorators.js.map +1 -0
  26. package/lib/rbac-http/src/dto/login-dto.d.ts +20 -0
  27. package/lib/rbac-http/src/dto/login-dto.js +27 -0
  28. package/lib/rbac-http/src/dto/login-dto.js.map +1 -0
  29. package/lib/rbac-http/src/dto/password-dto.d.ts +22 -0
  30. package/lib/rbac-http/src/dto/password-dto.js +27 -0
  31. package/lib/rbac-http/src/dto/password-dto.js.map +1 -0
  32. package/lib/rbac-http/src/dto/user-dto.d.ts +42 -0
  33. package/lib/rbac-http/src/dto/user-dto.js +31 -0
  34. package/lib/rbac-http/src/dto/user-dto.js.map +1 -0
  35. package/lib/rbac-http/src/index.d.ts +8 -0
  36. package/lib/rbac-http/src/index.js +25 -0
  37. package/lib/rbac-http/src/index.js.map +1 -0
  38. package/lib/rbac-http/src/interfaces.d.ts +23 -0
  39. package/lib/rbac-http/src/interfaces.js +3 -0
  40. package/lib/rbac-http/src/interfaces.js.map +1 -0
  41. package/lib/rbac-http/src/middlewares.d.ts +11 -0
  42. package/lib/rbac-http/src/middlewares.js +85 -0
  43. package/lib/rbac-http/src/middlewares.js.map +1 -0
  44. package/lib/rbac-http/src/policies.d.ts +13 -0
  45. package/lib/rbac-http/src/policies.js +57 -0
  46. package/lib/rbac-http/src/policies.js.map +1 -0
  47. package/lib/rbac-http/src/route-args.d.ts +9 -0
  48. package/lib/rbac-http/src/route-args.js +24 -0
  49. package/lib/rbac-http/src/route-args.js.map +1 -0
  50. package/lib/rbac-http/src/transformers.d.ts +11 -0
  51. package/lib/rbac-http/src/transformers.js +34 -0
  52. package/lib/rbac-http/src/transformers.js.map +1 -0
  53. package/package.json +11 -10
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataTransformer = exports.BasePolicy = exports.BaseMiddleware = exports.ParameterType = exports.UuidVersion = exports.RouteType = exports.HTTP_STATUS_CODE = exports.ServerMiddleware = exports.HttpAcceptHeaders = void 0;
4
+ const di_1 = require("@spinajs/di");
5
+ /**
6
+ * Accept header enum
7
+ */
8
+ var HttpAcceptHeaders;
9
+ (function (HttpAcceptHeaders) {
10
+ /**
11
+ * Accept header for JSON
12
+ */
13
+ HttpAcceptHeaders[HttpAcceptHeaders["JSON"] = 1] = "JSON";
14
+ /**
15
+ * Accept header for HTML
16
+ */
17
+ HttpAcceptHeaders[HttpAcceptHeaders["HTML"] = 2] = "HTML";
18
+ /**
19
+ * Accept header for XML
20
+ */
21
+ HttpAcceptHeaders[HttpAcceptHeaders["XML"] = 4] = "XML";
22
+ /**
23
+ * Accept all accept headers shorcut
24
+ */
25
+ HttpAcceptHeaders[HttpAcceptHeaders["ALL"] = 7] = "ALL";
26
+ })(HttpAcceptHeaders = exports.HttpAcceptHeaders || (exports.HttpAcceptHeaders = {}));
27
+ class ServerMiddleware extends di_1.AsyncModule {
28
+ }
29
+ exports.ServerMiddleware = ServerMiddleware;
30
+ /**
31
+ * HTTP response statuses
32
+ */
33
+ var HTTP_STATUS_CODE;
34
+ (function (HTTP_STATUS_CODE) {
35
+ /**
36
+ * All ok with content
37
+ */
38
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["OK"] = 200] = "OK";
39
+ /**
40
+ * Request is OK and new resource has been created.
41
+ */
42
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["CREATED"] = 201] = "CREATED";
43
+ /**
44
+ * Request is accepted, but has not been completed yet.
45
+ */
46
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["ACCEPTED"] = 202] = "ACCEPTED";
47
+ /**
48
+ * ALl is ok & no content to return
49
+ */
50
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["NO_CONTENT"] = 204] = "NO_CONTENT";
51
+ /**
52
+ * The server is delivering only part of the resource (byte serving) due to a range header
53
+ * sent by the client. The range header is used by HTTP clients to enable resuming of
54
+ * interrupted downloads, or split a download into multiple simultaneous streams.
55
+ */
56
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["PARTIAL_CONTENT"] = 206] = "PARTIAL_CONTENT";
57
+ /**
58
+ * Resource is not modified
59
+ */
60
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_MODIFIED"] = 304] = "NOT_MODIFIED";
61
+ /**
62
+ * Invalid request, eg. invalid parameters
63
+ */
64
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["BAD_REQUEST"] = 400] = "BAD_REQUEST";
65
+ /**
66
+ * Auth required
67
+ */
68
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["UNAUTHORIZED"] = 401] = "UNAUTHORIZED";
69
+ /**
70
+ * No permission
71
+ */
72
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["FORBIDDEN"] = 403] = "FORBIDDEN";
73
+ /**
74
+ * Resource not found
75
+ */
76
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_FOUND"] = 404] = "NOT_FOUND";
77
+ /**
78
+ * Not acceptable request headers (Accept header)
79
+ */
80
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_ACCEPTABLE"] = 406] = "NOT_ACCEPTABLE";
81
+ /**
82
+ * Conflict
83
+ */
84
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["CONFLICT"] = 409] = "CONFLICT";
85
+ /**
86
+ * Internal server error.
87
+ */
88
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["INTERNAL_ERROR"] = 500] = "INTERNAL_ERROR";
89
+ /**
90
+ * Method not implemented
91
+ */
92
+ HTTP_STATUS_CODE[HTTP_STATUS_CODE["NOT_IMPLEMENTED"] = 501] = "NOT_IMPLEMENTED";
93
+ })(HTTP_STATUS_CODE = exports.HTTP_STATUS_CODE || (exports.HTTP_STATUS_CODE = {}));
94
+ /**
95
+ * Avaible route types, match HTTP methods
96
+ */
97
+ var RouteType;
98
+ (function (RouteType) {
99
+ /**
100
+ * POST method - used to create new resource or send data to server
101
+ */
102
+ RouteType["POST"] = "post";
103
+ /**
104
+ * GET method - used to retrieve data from server
105
+ */
106
+ RouteType["GET"] = "get";
107
+ /**
108
+ * PUT method - used to updates resource
109
+ */
110
+ RouteType["PUT"] = "put";
111
+ /**
112
+ * DELETE method - used to delete resource
113
+ */
114
+ RouteType["DELETE"] = "delete";
115
+ /**
116
+ * PATCH method - used to partially update resource eg. one field
117
+ */
118
+ RouteType["PATCH"] = "patch";
119
+ /**
120
+ * HEAD method - same as get, but returns no data. usefull for checking if resource exists etc.
121
+ */
122
+ RouteType["HEAD"] = "head";
123
+ /**
124
+ * FILE method - spine special route type. Internall its simple GET method, but informs that specified route returns binary file
125
+ */
126
+ RouteType["FILE"] = "file";
127
+ RouteType["UNKNOWN"] = "unknown";
128
+ })(RouteType = exports.RouteType || (exports.RouteType = {}));
129
+ var UuidVersion;
130
+ (function (UuidVersion) {
131
+ UuidVersion[UuidVersion["v1"] = 0] = "v1";
132
+ UuidVersion[UuidVersion["v3"] = 1] = "v3";
133
+ UuidVersion[UuidVersion["v4"] = 2] = "v4";
134
+ UuidVersion[UuidVersion["v5"] = 3] = "v5";
135
+ })(UuidVersion = exports.UuidVersion || (exports.UuidVersion = {}));
136
+ /**
137
+ * Avaible route parameters type
138
+ */
139
+ var ParameterType;
140
+ (function (ParameterType) {
141
+ /**
142
+ * Parameter is injected from DI container & resolved
143
+ */
144
+ ParameterType["FromDi"] = "FromDi";
145
+ /**
146
+ * Parameter value is taken from query string eg. `?name=flavio`
147
+ */
148
+ ParameterType["FromQuery"] = "FromQuery";
149
+ /**
150
+ * From message body, eg. POST json object
151
+ */
152
+ ParameterType["FromBody"] = "FromBody";
153
+ /**
154
+ * From url params eg: `/:id`
155
+ */
156
+ ParameterType["FromParams"] = "FromParams";
157
+ /**
158
+ * From form file field
159
+ */
160
+ ParameterType["FromFile"] = "FromFile";
161
+ /**
162
+ * From form
163
+ */
164
+ ParameterType["FromForm"] = "FromForm";
165
+ /**
166
+ * From cvs file
167
+ */
168
+ ParameterType["FromCSV"] = "FromCSV";
169
+ /**
170
+ * From JSON file
171
+ */
172
+ ParameterType["FromJSONFile"] = "FromJSONFile";
173
+ /**
174
+ * From form field
175
+ */
176
+ ParameterType["FormField"] = "FromFormField";
177
+ /**
178
+ * From model object
179
+ */
180
+ ParameterType["FromModel"] = "FromModel";
181
+ /**
182
+ * Data from coockie
183
+ */
184
+ ParameterType["FromCookie"] = "FromCookie";
185
+ /**
186
+ * From http header
187
+ */
188
+ ParameterType["FromHeader"] = "FromHeader";
189
+ /**
190
+ * Req from express
191
+ */
192
+ ParameterType["Req"] = "ArgAsRequest";
193
+ // Res from express
194
+ ParameterType["Res"] = "ArgAsResponse";
195
+ })(ParameterType = exports.ParameterType || (exports.ParameterType = {}));
196
+ /**
197
+ * Middlewares are classes that can change request object or perform specific task before & after route execution
198
+ * eg. route parameter logging / headers check etc.
199
+ */
200
+ class BaseMiddleware {
201
+ }
202
+ exports.BaseMiddleware = BaseMiddleware;
203
+ /**
204
+ * Base class for policies.
205
+ *
206
+ * Policies checks if route can be executed eg. user have proper role
207
+ */
208
+ class BasePolicy {
209
+ }
210
+ exports.BasePolicy = BasePolicy;
211
+ /**
212
+ * Base class for data transformers.
213
+ *
214
+ * Data formatter helps transforms data for desired format.
215
+ * Eg. we have API function that returns some data, but we want
216
+ * to easily transform data for some client
217
+ * eg. plain array to format that datatables.net can easily read
218
+ */
219
+ class DataTransformer {
220
+ }
221
+ exports.DataTransformer = DataTransformer;
222
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../../http/src/interfaces.ts"],"names":[],"mappings":";;;AACA,oCAAuD;AAGvD;;GAEG;AACH,IAAY,iBAoBX;AApBD,WAAY,iBAAiB;IAC3B;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,yDAAQ,CAAA;IAER;;OAEG;IACH,uDAAO,CAAA;IAEP;;OAEG;IACH,uDAAe,CAAA;AACjB,CAAC,EApBW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAoB5B;AAsCD,MAAsB,gBAAiB,SAAQ,gBAAW;CAKzD;AALD,4CAKC;AAED;;GAEG;AACH,IAAY,gBAwEX;AAxED,WAAY,gBAAgB;IAC1B;;OAEG;IACH,qDAAQ,CAAA;IAER;;OAEG;IACH,+DAAa,CAAA;IAEb;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,qEAAgB,CAAA;IAEhB;;;;OAIG;IACH,+EAAqB,CAAA;IAErB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,uEAAiB,CAAA;IAEjB;;OAEG;IACH,yEAAkB,CAAA;IAElB;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,mEAAe,CAAA;IAEf;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,iEAAc,CAAA;IAEd;;OAEG;IACH,6EAAoB,CAAA;IAEpB;;OAEG;IACH,+EAAqB,CAAA;AACvB,CAAC,EAxEW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAwE3B;AAED;;GAEG;AACH,IAAY,SAqCX;AArCD,WAAY,SAAS;IACnB;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,wBAAW,CAAA;IAEX;;OAEG;IACH,8BAAiB,CAAA;IAEjB;;OAEG;IACH,4BAAe,CAAA;IAEf;;OAEG;IACH,0BAAa,CAAA;IAEb;;OAEG;IACH,0BAAa,CAAA;IAEb,gCAAmB,CAAA;AACrB,CAAC,EArCW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAqCpB;AAED,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;IACF,yCAAE,CAAA;AACJ,CAAC,EALW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAKtB;AAED;;GAEG;AACH,IAAY,aAoEX;AApED,WAAY,aAAa;IACvB;;OAEG;IACH,kCAAiB,CAAA;IAEjB;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,sCAAqB,CAAA;IAErB;;OAEG;IACH,oCAAmB,CAAA;IAEnB;;OAEG;IACH,8CAA6B,CAAA;IAE7B;;OAEG;IACH,4CAA2B,CAAA;IAE3B;;OAEG;IACH,wCAAuB,CAAA;IAEvB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,0CAAyB,CAAA;IAEzB;;OAEG;IACH,qCAAoB,CAAA;IAEpB,mBAAmB;IACnB,sCAAqB,CAAA;AACvB,CAAC,EApEW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAoExB;AA0KD;;;GAGG;AACH,MAAsB,cAAc;CAenC;AAfD,wCAeC;AAWD;;;;GAIG;AACH,MAAsB,UAAU;CAgB/B;AAhBD,gCAgBC;AA2BD;;;;;;;GAOG;AACH,MAAsB,eAAe;CASpC;AATD,0CASC"}
@@ -1,5 +1,5 @@
1
1
  export declare type PermissionType = 'readAny' | 'readOwn' | 'updateAny' | 'updateOwn' | 'deleteAny' | 'deleteOwn' | 'createAny' | 'createOwn';
2
- export interface IAclDescriptor {
2
+ export interface IRbacDescriptor {
3
3
  /**
4
4
  * Resource name
5
5
  */
@@ -13,9 +13,9 @@ export interface IAclDescriptor {
13
13
  /**
14
14
  * Per routes permissions
15
15
  */
16
- Routes: Map<string, IAclRoutePermissionDescriptor>;
16
+ Routes: Map<string, IRbacRoutePermissionDescriptor>;
17
17
  }
18
- export interface IAclRoutePermissionDescriptor {
18
+ export interface IRbacRoutePermissionDescriptor {
19
19
  /**
20
20
  * controller route permission. It overrides acl descriptor options
21
21
  */
package/lib/policies.d.ts CHANGED
@@ -1,9 +1,13 @@
1
- import { AccessControl } from '@spinajs/rbac';
1
+ import { AccessControl, Permission } from 'accesscontrol';
2
2
  import { BasePolicy, IController, IRoute } from '@spinajs/http';
3
3
  import * as express from 'express';
4
- export declare class AclPolicy extends BasePolicy {
4
+ import { User } from '@spinajs/rbac';
5
+ export declare class RbacPolicy extends BasePolicy {
5
6
  protected Ac: AccessControl;
6
7
  constructor();
7
8
  isEnabled(_action: IRoute, _instance: IController): boolean;
8
9
  execute(req: express.Request, action: IRoute, instance: IController): Promise<void>;
9
10
  }
11
+ export declare function checkRbacPermission(role: string | string[], resource: string, permission: string): Permission;
12
+ export declare function checkUserPermission(user: User, resource: string, permission: string): Permission;
13
+ export declare function checkRoutePermission(req: express.Request, resource: string, permission: string): Permission;
package/lib/policies.js CHANGED
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AclPolicy = void 0;
3
+ exports.checkRoutePermission = exports.checkUserPermission = exports.checkRbacPermission = exports.RbacPolicy = void 0;
4
4
  const http_1 = require("@spinajs/http");
5
5
  const exceptions_1 = require("@spinajs/exceptions");
6
6
  const decorators_1 = require("./decorators");
7
7
  const di_1 = require("@spinajs/di");
8
- class AclPolicy extends http_1.BasePolicy {
8
+ class RbacPolicy extends http_1.BasePolicy {
9
9
  constructor() {
10
10
  super();
11
11
  this.Ac = di_1.DI.get('AccessControl');
@@ -28,10 +28,30 @@ class AclPolicy extends http_1.BasePolicy {
28
28
  if (!req.User) {
29
29
  throw new exceptions_1.AuthenticationFailed();
30
30
  }
31
- if (!this.Ac.can(req.User.Role.split(',')).resource(descriptor.Resource)[permission]()) {
31
+ if (!checkRoutePermission(req, descriptor.Resource, permission).granted) {
32
32
  throw new exceptions_1.Forbidden(`role(s) ${req.User.Role} does not have permission ${permission} for resource ${descriptor.Resource}`);
33
33
  }
34
34
  }
35
35
  }
36
- exports.AclPolicy = AclPolicy;
36
+ exports.RbacPolicy = RbacPolicy;
37
+ function checkRbacPermission(role, resource, permission) {
38
+ const ac = di_1.DI.get('AccessControl');
39
+ return ac.can(role)[permission](resource);
40
+ }
41
+ exports.checkRbacPermission = checkRbacPermission;
42
+ function checkUserPermission(user, resource, permission) {
43
+ const ac = di_1.DI.get('AccessControl');
44
+ if (!user) {
45
+ return null;
46
+ }
47
+ return ac.can(user.Role.split(','))[permission](resource);
48
+ }
49
+ exports.checkUserPermission = checkUserPermission;
50
+ function checkRoutePermission(req, resource, permission) {
51
+ if (!req.User) {
52
+ return null;
53
+ }
54
+ return checkUserPermission(req.User, resource, permission);
55
+ }
56
+ exports.checkRoutePermission = checkRoutePermission;
37
57
  //# sourceMappingURL=policies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":";;;AACA,wCAAgE;AAEhE,oDAAsE;AACtE,6CAAyD;AAEzD,oCAAiC;AAEjC,MAAa,SAAU,SAAQ,iBAAU;IAGvC;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,EAAE,GAAG,OAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,OAAe,EAAE,SAAsB;QACtD,0BAA0B;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAoB,EAAE,MAAc,EAAE,QAAqB;;QAC9E,MAAM,UAAU,GAAmB,OAAO,CAAC,WAAW,CAAC,sCAAyB,EAAE,QAAQ,CAAC,CAAC;QAC5F,IAAI,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,EAAE,CAAC;QAE7C,wCAAwC;QACxC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACxC,UAAU,GAAG,MAAA,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,mCAAI,EAAE,CAAC;SACpE;QAED,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YACzC,MAAM,IAAI,sBAAS,CAAC,2CAA2C,CAAC,CAAC;SAClE;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YACb,MAAM,IAAI,iCAAoB,EAAE,CAAC;SAClC;QAED,IAAI,CAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAS,CAAC,UAAU,CAAC,EAAE,EAAE;YAC/F,MAAM,IAAI,sBAAS,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,6BAA6B,UAAU,iBAAiB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC5H;IACH,CAAC;CACF;AAnCD,8BAmCC"}
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":";;;AACA,wCAAgE;AAEhE,oDAAsE;AACtE,6CAAyD;AAEzD,oCAAiC;AAGjC,MAAa,UAAW,SAAQ,iBAAU;IAGxC;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,EAAE,GAAG,OAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAEM,SAAS,CAAC,OAAe,EAAE,SAAsB;QACtD,0BAA0B;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAoB,EAAE,MAAc,EAAE,QAAqB;;QAC9E,MAAM,UAAU,GAAoB,OAAO,CAAC,WAAW,CAAC,sCAAyB,EAAE,QAAQ,CAAC,CAAC;QAC7F,IAAI,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,EAAE,CAAC;QAE7C,wCAAwC;QACxC,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YACxC,UAAU,GAAG,MAAA,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,mCAAI,EAAE,CAAC;SACpE;QAED,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YACzC,MAAM,IAAI,sBAAS,CAAC,2CAA2C,CAAC,CAAC;SAClE;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YACb,MAAM,IAAI,iCAAoB,EAAE,CAAC;SAClC;QAED,IAAI,CAAC,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE;YACvE,MAAM,IAAI,sBAAS,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,6BAA6B,UAAU,iBAAiB,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;SAC5H;IACH,CAAC;CACF;AAnCD,gCAmCC;AAED,SAAgB,mBAAmB,CAAC,IAAuB,EAAE,QAAgB,EAAE,UAAkB;IAC/F,MAAM,EAAE,GAAG,OAAE,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;IAClD,OAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrD,CAAC;AAHD,kDAGC;AAED,SAAgB,mBAAmB,CAAC,IAAU,EAAE,QAAgB,EAAE,UAAkB;IAClF,MAAM,EAAE,GAAG,OAAE,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,IAAI,CAAC;KACb;IAED,OAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;AACrE,CAAC;AARD,kDAQC;AAED,SAAgB,oBAAoB,CAAC,GAAoB,EAAE,QAAgB,EAAE,UAAkB;IAC7F,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QACb,OAAO,IAAI,CAAC;KACb;IAED,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC7D,CAAC;AAND,oDAMC"}
@@ -0,0 +1,7 @@
1
+ import '@spinajs/http';
2
+ import { User } from '@spinajs/rbac';
3
+ declare module '@spinajs/http' {
4
+ interface IActionLocalStoregeContext {
5
+ user: User;
6
+ }
7
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("@spinajs/http");
4
+ //# sourceMappingURL=augumentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"augumentation.js","sourceRoot":"","sources":["../../../src/augumentation.ts"],"names":[],"mappings":";;AAAA,yBAAuB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const path_1 = require("path");
4
+ function dir(path) {
5
+ return (0, path_1.resolve)((0, path_1.normalize)((0, path_1.join)(__dirname, path)));
6
+ }
7
+ module.exports = {
8
+ system: {
9
+ dirs: {
10
+ controllers: [dir('./../controllers')],
11
+ locales: [dir('./../locales')],
12
+ views: [dir('./../views')],
13
+ },
14
+ },
15
+ http: {
16
+ middlewares: [
17
+ // add global user from session middleware
18
+ ],
19
+ },
20
+ };
21
+ //# sourceMappingURL=rbac-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rbac-http.js","sourceRoot":"","sources":["../../../../src/config/rbac-http.ts"],"names":[],"mappings":";;AAAA,+BAAgD;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,CAAC,OAAO,GAAG;IACf,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,WAAW,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC9B,KAAK,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;SAC3B;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE;QACX,0CAA0C;SAC3C;KACF;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { LoginDto } from './../dto/login-dto';
2
+ import { BaseController, Ok, CookieResponse, Unauthorized } from '@spinajs/http';
3
+ import { AuthProvider, SessionProvider } from '@spinajs/rbac';
4
+ import { Configuration } from '@spinajs/configuration';
5
+ export declare class LoginController extends BaseController {
6
+ protected Configuration: Configuration;
7
+ protected AuthProvider: AuthProvider;
8
+ protected SessionProvider: SessionProvider;
9
+ protected SessionExpirationTime: number;
10
+ login(credentials: LoginDto): Promise<Unauthorized | CookieResponse>;
11
+ logout(ssid: string): Promise<Ok | CookieResponse>;
12
+ }
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.LoginController = void 0;
16
+ const login_dto_1 = require("./../dto/login-dto");
17
+ const http_1 = require("@spinajs/http");
18
+ const rbac_1 = require("@spinajs/rbac");
19
+ const di_1 = require("@spinajs/di");
20
+ const configuration_1 = require("@spinajs/configuration");
21
+ const luxon_1 = require("luxon");
22
+ let LoginController = class LoginController extends http_1.BaseController {
23
+ async login(credentials) {
24
+ const user = await this.AuthProvider.authenticate(credentials.Login, credentials.Password);
25
+ if (!user) {
26
+ return new http_1.Unauthorized({
27
+ error: {
28
+ message: 'login or password incorrect',
29
+ },
30
+ });
31
+ }
32
+ const lifetime = luxon_1.DateTime.now().plus({ minutes: this.SessionExpirationTime });
33
+ const uObject = {
34
+ Login: user.Login,
35
+ Email: user.Email,
36
+ NiceName: user.NiceName,
37
+ Metadata: user.Metadata.map((m) => ({ Key: m.Key, Value: m.Value })),
38
+ Role: user.Role,
39
+ Id: user.Id,
40
+ };
41
+ const session = new rbac_1.Session({
42
+ Data: uObject,
43
+ Expiration: lifetime,
44
+ });
45
+ await this.SessionProvider.updateSession(session);
46
+ return new http_1.CookieResponse('ssid', session.SessionId, this.SessionExpirationTime, uObject);
47
+ }
48
+ async logout(ssid) {
49
+ if (!ssid) {
50
+ return new http_1.Ok();
51
+ }
52
+ await this.SessionProvider.deleteSession(ssid);
53
+ // send empty cookie to confirm session deletion
54
+ return new http_1.CookieResponse('ssid', null, this.SessionExpirationTime);
55
+ }
56
+ };
57
+ __decorate([
58
+ (0, di_1.Autoinject)(),
59
+ __metadata("design:type", configuration_1.Configuration)
60
+ ], LoginController.prototype, "Configuration", void 0);
61
+ __decorate([
62
+ (0, di_1.Autoinject)(),
63
+ __metadata("design:type", rbac_1.AuthProvider)
64
+ ], LoginController.prototype, "AuthProvider", void 0);
65
+ __decorate([
66
+ (0, di_1.Autoinject)(),
67
+ __metadata("design:type", rbac_1.SessionProvider)
68
+ ], LoginController.prototype, "SessionProvider", void 0);
69
+ __decorate([
70
+ (0, configuration_1.Config)('acl.session.expiration', 10),
71
+ __metadata("design:type", Number)
72
+ ], LoginController.prototype, "SessionExpirationTime", void 0);
73
+ __decorate([
74
+ (0, http_1.Post)(),
75
+ __param(0, (0, http_1.Body)()),
76
+ __metadata("design:type", Function),
77
+ __metadata("design:paramtypes", [login_dto_1.LoginDto]),
78
+ __metadata("design:returntype", Promise)
79
+ ], LoginController.prototype, "login", null);
80
+ __decorate([
81
+ (0, http_1.Get)(),
82
+ __param(0, (0, http_1.Cookie)()),
83
+ __metadata("design:type", Function),
84
+ __metadata("design:paramtypes", [String]),
85
+ __metadata("design:returntype", Promise)
86
+ ], LoginController.prototype, "logout", null);
87
+ LoginController = __decorate([
88
+ (0, http_1.BasePath)('auth')
89
+ ], LoginController);
90
+ exports.LoginController = LoginController;
91
+ //# sourceMappingURL=LoginController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginController.js","sourceRoot":"","sources":["../../../../src/controllers/LoginController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA8C;AAC9C,wCAAoH;AACpH,wCAAuE;AACvE,oCAAyC;AACzC,0DAA+D;AAC/D,iCAAiC;AAGjC,IAAa,eAAe,GAA5B,MAAa,eAAgB,SAAQ,qBAAc;IAc1C,KAAK,CAAC,KAAK,CAAS,WAAqB;QAC9C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE3F,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,mBAAY,CAAC;gBACtB,KAAK,EAAE;oBACL,OAAO,EAAE,6BAA6B;iBACvC;aACF,CAAC,CAAC;SACJ;QACD,MAAM,QAAQ,GAAG,gBAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAE9E,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACpE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;SACZ,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC;YAC1B,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAElD,OAAO,IAAI,qBAAc,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC5F,CAAC;IAGM,KAAK,CAAC,MAAM,CAAW,IAAY;QACxC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,SAAE,EAAE,CAAC;SACjB;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE/C,gDAAgD;QAChD,OAAO,IAAI,qBAAc,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACF,CAAA;AAtDC;IADC,IAAA,eAAU,GAAE;8BACY,6BAAa;sDAAC;AAGvC;IADC,IAAA,eAAU,GAAE;8BACW,mBAAY;qDAAC;AAGrC;IADC,IAAA,eAAU,GAAE;8BACc,sBAAe;wDAAC;AAG3C;IADC,IAAA,sBAAM,EAAC,wBAAwB,EAAE,EAAE,CAAC;;8DACG;AAGxC;IADC,IAAA,WAAI,GAAE;IACa,WAAA,IAAA,WAAI,GAAE,CAAA;;qCAAc,oBAAQ;;4CA6B/C;AAGD;IADC,IAAA,UAAG,GAAE;IACe,WAAA,IAAA,aAAM,GAAE,CAAA;;;;6CAS5B;AAvDU,eAAe;IAD3B,IAAA,eAAQ,EAAC,MAAM,CAAC;GACJ,eAAe,CAwD3B;AAxDY,0CAAe"}
@@ -0,0 +1,17 @@
1
+ import { PasswordDto } from './../dto/password-dto';
2
+ import { UserDto } from './../dto/user-dto';
3
+ import * as express from 'express';
4
+ import { BaseController, Ok, NotFound } from '@spinajs/http';
5
+ import { IContainer } from '@spinajs/di';
6
+ import { UserDataTransformer, IUserResult } from '../transformers';
7
+ import { SORT_ORDER } from '@spinajs/orm/lib/enums';
8
+ export declare class UsersController extends BaseController {
9
+ protected DataTransformer: UserDataTransformer<IUserResult>;
10
+ protected Container: IContainer;
11
+ listUsers(search: string, page: number, perPage: number, order: string, orderDirection: SORT_ORDER, request: express.Request): Promise<NotFound | Ok>;
12
+ getUser(id: number): Promise<Ok>;
13
+ addUser(user: UserDto): Promise<Ok>;
14
+ deleteUser(id: number): Promise<Ok>;
15
+ updateUser(id: number, user: UserDto): Promise<Ok>;
16
+ updateUserPassword(id: number, pwd: PasswordDto): Promise<Ok>;
17
+ }