@opengis/fastify-table 2.5.28 → 2.5.30
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.
- package/dist/helper.d.ts.map +1 -1
- package/dist/helper.js +8 -3
- package/dist/server/migrations/users.sql +2 -1
- package/dist/server/plugins/crud/funcs/utils/logChanges.d.ts.map +1 -1
- package/dist/server/plugins/crud/funcs/utils/logChanges.js +22 -17
- package/dist/server/plugins/policy/funcs/checkPermissions.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkPermissions.js +16 -3
- package/dist/server/plugins/policy/index.d.ts.map +1 -1
- package/dist/server/plugins/policy/index.js +20 -3
- package/dist/server/routes/access/controllers/access.group.d.ts +1 -2
- package/dist/server/routes/access/controllers/access.group.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.group.js +9 -7
- package/dist/server/routes/access/controllers/access.group.post.d.ts +9 -2
- package/dist/server/routes/access/controllers/access.group.post.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.group.post.js +74 -51
- package/dist/server/routes/access/controllers/access.interface.d.ts +1 -2
- package/dist/server/routes/access/controllers/access.interface.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.interface.js +11 -9
- package/dist/server/routes/access/controllers/access.user.d.ts +1 -1
- package/dist/server/routes/access/controllers/access.user.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.user.js +19 -12
- package/dist/server/routes/access/controllers/access.user.post.d.ts +8 -1
- package/dist/server/routes/access/controllers/access.user.post.d.ts.map +1 -1
- package/dist/server/routes/access/controllers/access.user.post.js +10 -5
- package/dist/server/routes/access/index.js +3 -3
- package/dist/server/routes/table/controllers/suggest.d.ts.map +1 -1
- package/dist/server/routes/table/controllers/suggest.js +32 -1
- package/dist/server/routes/table/schema.d.ts +3 -0
- package/dist/server/routes/table/schema.d.ts.map +1 -1
- package/dist/server/routes/table/schema.js +3 -2
- package/dist/test.setup.js +3 -2
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -1
- package/package.json +1 -1
package/dist/helper.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../helper.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../helper.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,QAAA,MAAQ,MAAM,KAAoB,CAAC;AAInC,wBAAsB,KAAK,kBAI1B;AAGD,wBAAsB,QAAQ,kBAW7B;AAED,wBAAsB,KAAK,iBA+B1B;AAED,OAAO,EAEL,MAAM,EACN,MAAM,EACN,SAAS,GACV,CAAC"}
|
package/dist/helper.js
CHANGED
|
@@ -22,13 +22,18 @@ export async function teardown() {
|
|
|
22
22
|
export async function build() {
|
|
23
23
|
if (!app) {
|
|
24
24
|
app = Fastify({ logger: false });
|
|
25
|
+
app.addHook("onRequest", async (req) => {
|
|
26
|
+
req.user = req.headers?.uid
|
|
27
|
+
? {
|
|
28
|
+
uid: req.headers?.uid,
|
|
29
|
+
user_type: req.headers?.user_type || "regular",
|
|
30
|
+
}
|
|
31
|
+
: undefined;
|
|
32
|
+
});
|
|
25
33
|
app.register(appService, config);
|
|
26
34
|
app.get("/jwt-scoped", { config: { auth: "user-jwt", scope: "sumdu" } }, (req) => req.headers.authorization);
|
|
27
35
|
app.get("/jwt-scoped2", { config: { auth: "user-jwt", scope: "dzk" } }, (req) => req.headers.authorization);
|
|
28
36
|
app.get("/jwt-unscoped", { config: { auth: "user-jwt" } }, (req) => req.headers.authorization);
|
|
29
|
-
app.addHook("onRequest", async (req) => {
|
|
30
|
-
req.user = req.user || { uid: "1", user_type: "admin" };
|
|
31
|
-
});
|
|
32
37
|
await app.ready(); // ? ensure plugins registered, can not add fastify hooks after app is ready
|
|
33
38
|
}
|
|
34
39
|
console.log("server started", process.env.PORT || 3000);
|
|
@@ -28,7 +28,8 @@ ALTER TABLE admin.users add column if not exists salt text;
|
|
|
28
28
|
ALTER TABLE admin.users add column if not exists cdate timestamp without time zone DEFAULT date_trunc('seconds'::text, now());
|
|
29
29
|
ALTER TABLE admin.users add column if not exists editor_id text;
|
|
30
30
|
ALTER TABLE admin.users add column if not exists editor_date timestamp without time zone;
|
|
31
|
-
ALTER TABLE admin.users add column if not exists twofa boolean not null DEFAULT
|
|
31
|
+
ALTER TABLE admin.users add column if not exists twofa boolean not null DEFAULT false;
|
|
32
|
+
alter table admin.users alter column twofa set default false;
|
|
32
33
|
|
|
33
34
|
ALTER TABLE admin.users add CONSTRAINT admin_user_uid_pkey PRIMARY KEY (uid);
|
|
34
35
|
ALTER TABLE admin.users add CONSTRAINT admin_user_user_rnokpp UNIQUE (user_rnokpp);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logChanges.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/crud/funcs/utils/logChanges.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"logChanges.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/crud/funcs/utils/logChanges.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AA4D5D,wBAA8B,UAAU,CAAC,EACvC,EAAE,EACF,KAAK,EAAE,MAAM,EACb,SAAS,EACT,OAAO,EACP,EAAE,EACF,IAAI,EACJ,GAAO,EACP,IAAI,GACL,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;;;;;;;;;;;;;;;;;;;;UAoNA"}
|
|
@@ -39,6 +39,12 @@ function getValue(val, tableName) {
|
|
|
39
39
|
if (["crm.files"].includes(tableName)) {
|
|
40
40
|
return typeof val === "object" ? JSON.stringify(val) : val;
|
|
41
41
|
}
|
|
42
|
+
if ((process.env.LOG_TABLE_CHANGES_JSON === "true" ||
|
|
43
|
+
config.LOG_TABLE_CHANGES_JSON) &&
|
|
44
|
+
val &&
|
|
45
|
+
typeof val === "object") {
|
|
46
|
+
return JSON.stringify(val);
|
|
47
|
+
}
|
|
42
48
|
return typeof val === "object"
|
|
43
49
|
? null
|
|
44
50
|
: val?.toString?.()?.substring?.(0, logLength);
|
|
@@ -112,23 +118,22 @@ export default async function logChanges({ pg, table: table1, tokenData, referer
|
|
|
112
118
|
[curr.name]: pg?.pgType?.[curr.dataTypeID],
|
|
113
119
|
}), {});
|
|
114
120
|
if (type !== "DELETE") {
|
|
115
|
-
Object.keys(row || {})
|
|
121
|
+
const newObj2 = Object.keys(row || {})
|
|
116
122
|
.filter((key) => !systemColumns.includes(key))
|
|
117
|
-
.reduce((acc, curr) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
});
|
|
123
|
+
.reduce((acc, curr) => ({
|
|
124
|
+
...acc,
|
|
125
|
+
[titles[curr] || curr]: columnTypes[curr] === "geometry"
|
|
126
|
+
? {}
|
|
127
|
+
: {
|
|
128
|
+
value: getValue(row[curr], table),
|
|
129
|
+
hash: typeof row[curr] === "boolean" || row[curr]
|
|
130
|
+
? createHash("md5")
|
|
131
|
+
.update(JSON.stringify(row[curr]))
|
|
132
|
+
.digest("hex")
|
|
133
|
+
: null,
|
|
134
|
+
},
|
|
135
|
+
}), {});
|
|
136
|
+
Object.assign(newObj1, newObj2);
|
|
132
137
|
}
|
|
133
138
|
await Promise.all(Object.keys(row || {})
|
|
134
139
|
.filter((key) => row[key] && columnTypes[key] === "geometry")
|
|
@@ -192,7 +197,7 @@ export default async function logChanges({ pg, table: table1, tokenData, referer
|
|
|
192
197
|
};
|
|
193
198
|
}
|
|
194
199
|
catch (err) {
|
|
195
|
-
console.error("logChanges error", type, table, id, data, err.toString());
|
|
200
|
+
console.error("logChanges error", type, table, id, data, err.toString(), err.stack);
|
|
196
201
|
return {
|
|
197
202
|
error: err.toString(),
|
|
198
203
|
entity_type: table,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkPermissions.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"checkPermissions.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAQhC,wBAA8B,gBAAgB,CAAC,GAAG,EAAE,eAAe,iBAyElE"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import logger from "../../logger/getLogger.js";
|
|
2
2
|
import getUserPermissions from "../../access/funcs/getUserPermissions.js";
|
|
3
3
|
import pgClients from "../../pg/pgClients.js";
|
|
4
|
-
import { ForbiddenError } from "../../../../errors.js";
|
|
4
|
+
import { ForbiddenError, UnauthorizedError } from "../../../../errors.js";
|
|
5
|
+
import getIP from "./getIP.js";
|
|
5
6
|
export default async function checkPermissions(req) {
|
|
6
7
|
const { originalUrl: path, query, params, method, routeOptions, pg = pgClients.client, } = req;
|
|
7
8
|
const user = req.user || req.session?.passport?.user;
|
|
@@ -17,6 +18,18 @@ export default async function checkPermissions(req) {
|
|
|
17
18
|
if (!permissions?.length) {
|
|
18
19
|
return null;
|
|
19
20
|
}
|
|
21
|
+
if (!user?.uid) {
|
|
22
|
+
logger.file("policy/permissions", {
|
|
23
|
+
path,
|
|
24
|
+
method,
|
|
25
|
+
params,
|
|
26
|
+
query,
|
|
27
|
+
body,
|
|
28
|
+
message: "unauthorized: not permitted",
|
|
29
|
+
ip: getIP(req),
|
|
30
|
+
});
|
|
31
|
+
throw UnauthorizedError("unauthorized: not permitted");
|
|
32
|
+
}
|
|
20
33
|
const userPermissions = await getUserPermissions({ uid: user?.uid, userType: user?.user_type }, pg).then((arr) => arr.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.actions }), {}));
|
|
21
34
|
const havePermission = permissions?.some(([key, value]) => userPermissions?.[key]?.includes(value)) ?? false;
|
|
22
35
|
if (!user?.user_type?.includes?.("admin") && !havePermission) {
|
|
@@ -26,10 +39,10 @@ export default async function checkPermissions(req) {
|
|
|
26
39
|
params,
|
|
27
40
|
query,
|
|
28
41
|
body,
|
|
29
|
-
message: "access restricted:
|
|
42
|
+
message: "access restricted: not permitted",
|
|
30
43
|
uid: user?.uid,
|
|
31
44
|
});
|
|
32
|
-
throw ForbiddenError("access restricted:
|
|
45
|
+
throw ForbiddenError("access restricted: not permitted");
|
|
33
46
|
}
|
|
34
47
|
return null;
|
|
35
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/plugins/policy/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/plugins/policy/index.ts"],"names":[],"mappings":"AAWA,iBAAS,MAAM,CAAC,OAAO,EAAE,GAAG,QAkD3B;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
import config from "../../../config.js";
|
|
2
|
+
import logger from "../logger/getLogger.js";
|
|
2
3
|
import checkPolicy from "./funcs/checkPolicy.js";
|
|
3
4
|
import checkTraversal from "./funcs/checkTraversal.js";
|
|
4
5
|
import checkPermissions from "./funcs/checkPermissions.js";
|
|
5
6
|
import checkJWT from "./funcs/checkJWT.js";
|
|
7
|
+
import getIP from "./funcs/getIP.js";
|
|
8
|
+
import { ForbiddenError } from "../../../errors.js";
|
|
6
9
|
function plugin(fastify) {
|
|
7
10
|
fastify.addHook("preHandler", async (request) => {
|
|
8
11
|
checkTraversal(request);
|
|
9
12
|
// ! skip locally, skip tests
|
|
10
|
-
if ((process.env.local === "true" ||
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
if ((process.env.local === "true" ||
|
|
14
|
+
process.env.NODE_ENV === "test" ||
|
|
15
|
+
process.env.VITEST) &&
|
|
16
|
+
!config.debugAuth) {
|
|
13
17
|
console.log("skipping policy / permissions check", request.url);
|
|
14
18
|
return null;
|
|
15
19
|
}
|
|
20
|
+
if (request.user?.user_type === "viewer" && request.method === "GET") {
|
|
21
|
+
console.log("skipping policy / permissions check for viewer", request.url);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
16
24
|
// ! skip non-API Requests, handle with vite/vike
|
|
17
25
|
const isApi = request.routeOptions?.method &&
|
|
18
26
|
request.routeOptions?.url &&
|
|
@@ -21,6 +29,15 @@ function plugin(fastify) {
|
|
|
21
29
|
if (!isApi) {
|
|
22
30
|
return null;
|
|
23
31
|
}
|
|
32
|
+
if (request.query?.sql) {
|
|
33
|
+
logger.file("alert", {
|
|
34
|
+
message: "database structure disclosure attempt",
|
|
35
|
+
url: request.url,
|
|
36
|
+
ip: getIP(request),
|
|
37
|
+
uid: request.user?.uid,
|
|
38
|
+
});
|
|
39
|
+
throw ForbiddenError("query.sql not allowed");
|
|
40
|
+
}
|
|
24
41
|
await checkPermissions(request);
|
|
25
42
|
const jwt = await checkJWT(request);
|
|
26
43
|
checkPolicy(request, jwt);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type FastifyReply } from "fastify";
|
|
2
1
|
import { type ExtendedPG } from "../../../types/core.js";
|
|
3
2
|
export default function accessGroup({ pg, params, user, }: {
|
|
4
3
|
pg: ExtendedPG;
|
|
@@ -6,7 +5,7 @@ export default function accessGroup({ pg, params, user, }: {
|
|
|
6
5
|
id: string;
|
|
7
6
|
};
|
|
8
7
|
user: Record<string, any>;
|
|
9
|
-
}
|
|
8
|
+
}): Promise<{
|
|
10
9
|
routes: any;
|
|
11
10
|
resources: any;
|
|
12
11
|
users: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.group.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"access.group.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AASzD,wBAA8B,WAAW,CAAC,EACxC,EAAqB,EACrB,MAAM,EACN,IAAS,GACV,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;;;;GA0CA"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import { pgClients
|
|
2
|
-
import { BadRequestError } from "../../../../errors.js";
|
|
3
|
-
export default async function accessGroup({ pg = pgClients.client, params, user = {}, }
|
|
1
|
+
import { pgClients } from "../../../../utils.js";
|
|
2
|
+
import { BadRequestError, ForbiddenError, UnauthorizedError, } from "../../../../errors.js";
|
|
3
|
+
export default async function accessGroup({ pg = pgClients.client, params, user = {}, }) {
|
|
4
4
|
if (!params?.id) {
|
|
5
5
|
throw BadRequestError("not enough params: id");
|
|
6
6
|
}
|
|
7
|
+
if (!user?.uid) {
|
|
8
|
+
throw UnauthorizedError("unauthorized");
|
|
9
|
+
}
|
|
7
10
|
// restrict access - admin only
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
});
|
|
11
|
+
if (!user.user_type?.includes?.("admin")) {
|
|
12
|
+
throw ForbiddenError("not an admin");
|
|
13
|
+
}
|
|
12
14
|
const routes = await pg
|
|
13
15
|
.query(`select a.route_id as path, b.actions from admin.routes a
|
|
14
16
|
left join admin.role_access b on a.route_id=b.route_id
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { type FastifyReply } from "fastify";
|
|
2
1
|
import { type ExtendedPG } from "../../../types/core.js";
|
|
3
2
|
export default function accessGroupPost({ pg, params, user, body, }: {
|
|
4
3
|
pg: ExtendedPG;
|
|
@@ -7,9 +6,17 @@ export default function accessGroupPost({ pg, params, user, body, }: {
|
|
|
7
6
|
};
|
|
8
7
|
user: Record<string, any>;
|
|
9
8
|
body: Record<string, any>;
|
|
10
|
-
}
|
|
9
|
+
}): Promise<{
|
|
11
10
|
routes: any;
|
|
12
11
|
resources: any;
|
|
13
12
|
users: any;
|
|
13
|
+
} | {
|
|
14
|
+
id: string;
|
|
15
|
+
routes: any;
|
|
16
|
+
resources?: undefined;
|
|
17
|
+
} | {
|
|
18
|
+
id: string;
|
|
19
|
+
routes: any;
|
|
20
|
+
resources: any;
|
|
14
21
|
}>;
|
|
15
22
|
//# sourceMappingURL=access.group.post.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.group.post.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.group.post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"access.group.post.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.group.post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,wBAA8B,eAAe,CAAC,EAC5C,EAAqB,EACrB,MAAM,EACN,IAAS,EACT,IAAS,GACV,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;;;;;;;;;;;;GA+HA"}
|
|
@@ -1,57 +1,80 @@
|
|
|
1
|
-
import { pgClients
|
|
1
|
+
import { pgClients } from "../../../../utils.js";
|
|
2
|
+
import { BadRequestError, ForbiddenError, UnauthorizedError, } from "../../../../errors.js";
|
|
2
3
|
import accessGroup from "./access.group.js";
|
|
3
|
-
|
|
4
|
-
export default async function accessGroupPost({ pg = pgClients.client, params, user = {}, body = {}, }, reply) {
|
|
4
|
+
export default async function accessGroupPost({ pg = pgClients.client, params, user = {}, body = {}, }) {
|
|
5
5
|
const { id } = params;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
// restrict access - admin only
|
|
10
|
-
await getAdminAccess({ id, user });
|
|
11
|
-
const { users = [], routes = [] } = body;
|
|
12
|
-
if (!routes?.length) {
|
|
13
|
-
await pg.query("delete from admin.role_access where role_id=$1", [id]);
|
|
14
|
-
if (!users?.length) {
|
|
15
|
-
return reply.status(200).send({ id, routes });
|
|
6
|
+
try {
|
|
7
|
+
if (!user?.uid) {
|
|
8
|
+
throw UnauthorizedError("unauthorized");
|
|
16
9
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
.query(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
10
|
+
// restrict access - admin only
|
|
11
|
+
if (!user.user_type?.includes?.("admin")) {
|
|
12
|
+
throw ForbiddenError("not an admin");
|
|
13
|
+
}
|
|
14
|
+
const { users = [], routes = [] } = body;
|
|
15
|
+
const roleExists = await pg
|
|
16
|
+
.query("select 1 from admin.roles where role_id=$1", [id])
|
|
17
|
+
.then((r) => r.rowCount === 1);
|
|
18
|
+
if (!roleExists) {
|
|
19
|
+
throw BadRequestError("role not found: " + id);
|
|
20
|
+
}
|
|
21
|
+
if (!routes?.length) {
|
|
22
|
+
await pg.query("delete from admin.role_access where role_id=$1", [id]);
|
|
23
|
+
if (!users?.length) {
|
|
24
|
+
return { id, routes };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (routes?.length) {
|
|
28
|
+
const routesDB = await pg
|
|
29
|
+
.query('select array_agg(route_id) as "routesDB" from admin.routes where enabled')
|
|
30
|
+
.then((r) => r.rows?.[0]?.routesDB || []);
|
|
31
|
+
await pg.query("delete from admin.role_access where role_id=$1", [id]);
|
|
32
|
+
await Promise.all(routes
|
|
33
|
+
.filter((el) => el.path && !routesDB?.includes(el.path))
|
|
34
|
+
.map((el) => pg.query("insert into admin.routes(route_id) values($1)", [el.path])));
|
|
35
|
+
await Promise.all(routes
|
|
36
|
+
.filter((el) => el.path && el.actions)
|
|
37
|
+
.map((el) => pg.query("insert into admin.role_access(role_id,route_id,actions) values ($1,$2,$3)", [id, el.path, el.actions])));
|
|
38
|
+
await Promise.all(routes
|
|
39
|
+
.filter((el) => el.resource && el.actions)
|
|
40
|
+
.map((el) => pg.query("insert into admin.role_access(role_id,resource_id,route_id,actions) values ($1,$2,$3,$4)", [id, el.resource, el.path, el.actions])));
|
|
41
|
+
const rows = await pg
|
|
42
|
+
.query(`select a.route_id as path, b.actions as actions from admin.routes a
|
|
43
|
+
left join admin.role_access b on a.route_id=b.route_id
|
|
44
|
+
where b.role_id=$1`, [id])
|
|
45
|
+
.then((el) => el.rows || []);
|
|
46
|
+
const resources = await pg
|
|
47
|
+
.query(`select resource_id, actions from admin.role_access
|
|
48
|
+
where resource_id is not null and role_id=$1`, [id])
|
|
49
|
+
.then((el) => el.rows || []);
|
|
50
|
+
if (!users?.length) {
|
|
51
|
+
return { id, routes: rows, resources };
|
|
52
|
+
}
|
|
43
53
|
}
|
|
54
|
+
const client = await pg.connect();
|
|
55
|
+
try {
|
|
56
|
+
await client.query("begin");
|
|
57
|
+
await client.query("delete from admin.user_roles where role_id=$1", [id]);
|
|
58
|
+
await Promise.all(users
|
|
59
|
+
.filter((el) => el?.id)
|
|
60
|
+
.map((el) => pg.query("insert into admin.user_roles(role_id,user_uid,access_granted) values ($1,$2,$3)", [id, el.id, user.uid])));
|
|
61
|
+
await client.query("commit");
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
await client.query("rollback");
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
client.release();
|
|
69
|
+
const res = await accessGroup({
|
|
70
|
+
pg,
|
|
71
|
+
params,
|
|
72
|
+
user,
|
|
73
|
+
});
|
|
74
|
+
return res;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
throw error;
|
|
44
79
|
}
|
|
45
|
-
const q = `delete from admin.user_roles where role_id='${id.replace(/'/g, "''")}';
|
|
46
|
-
insert into admin.user_roles(role_id,user_uid,access_granted)
|
|
47
|
-
values ${users
|
|
48
|
-
.filter((el) => el?.id)
|
|
49
|
-
.map((el) => `('${id.replace(/'/g, "''")}','${el.id.replace(/'/g, "''")}','${user?.uid?.replace(/'/g, "''")}')`)}`;
|
|
50
|
-
await pg.query(q);
|
|
51
|
-
const res = await accessGroup({
|
|
52
|
-
pg,
|
|
53
|
-
params,
|
|
54
|
-
user,
|
|
55
|
-
}, reply);
|
|
56
|
-
return res;
|
|
57
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.interface.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.interface.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"access.interface.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.interface.ts"],"names":[],"mappings":"AAmBA,wBAA8B,eAAe,CAAC,GAAG,EAAE,GAAG;;GAsBrD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import { pgClients, metaFormat
|
|
1
|
+
import { ForbiddenError, UnauthorizedError } from "../../../../errors.js";
|
|
2
|
+
import { pgClients, metaFormat } from "../../../../utils.js";
|
|
3
3
|
const q = `select a.route_id as id, coalesce(b.user_uid, d.user_uid) as user_uid, coalesce(d.actions, b.actions, array['view']) as actions, b.scope, c.role_id
|
|
4
4
|
from admin.routes a
|
|
5
5
|
left join admin.role_access b on
|
|
@@ -15,14 +15,16 @@ left join admin.user_roles d on
|
|
|
15
15
|
else 1=1
|
|
16
16
|
end )
|
|
17
17
|
where $1 in (a.route_id, a.alias, a.table_name) and coalesce(b.user_uid, d.user_uid) is not null`;
|
|
18
|
-
export default async function accessInterface(req
|
|
19
|
-
const { pg = pgClients.client, params = {}, user = {}
|
|
18
|
+
export default async function accessInterface(req) {
|
|
19
|
+
const { pg = pgClients.client, params = {}, user = {} } = req;
|
|
20
|
+
if (!user?.uid) {
|
|
21
|
+
throw UnauthorizedError("unauthorized");
|
|
22
|
+
}
|
|
20
23
|
// restrict access - admin only
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const { rows = [] } = await pg.query(q, [params.name]);
|
|
24
|
+
if (!user.user_type?.includes?.("admin")) {
|
|
25
|
+
throw ForbiddenError("not an admin");
|
|
26
|
+
}
|
|
27
|
+
const rows = await pg.query(q, [params.name]).then((r) => r.rows || []);
|
|
26
28
|
const cls = {
|
|
27
29
|
user_uid: "core.user_uid",
|
|
28
30
|
actions: "core.actions",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.user.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.user.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"access.user.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.user.ts"],"names":[],"mappings":"AAOA,wBAA8B,UAAU,CAAC,EACvC,EAAqB,EACrB,MAAM,EACN,IAAI,GACL,EAAE,GAAG;;;;GAyCL"}
|
|
@@ -1,24 +1,31 @@
|
|
|
1
|
-
import { BadRequestError
|
|
1
|
+
import { BadRequestError,
|
|
2
|
+
// ForbiddenError,
|
|
3
|
+
UnauthorizedError, } from "../../../../errors.js";
|
|
2
4
|
import { pgClients } from "../../../../utils.js";
|
|
3
|
-
export default async function accessUser(
|
|
4
|
-
if (!
|
|
5
|
+
export default async function accessUser({ pg = pgClients.client, params, user, }) {
|
|
6
|
+
if (!params?.id) {
|
|
5
7
|
throw BadRequestError("not enough params: id");
|
|
6
8
|
}
|
|
7
|
-
|
|
9
|
+
if (!user?.uid) {
|
|
10
|
+
throw UnauthorizedError("unauthorized");
|
|
11
|
+
}
|
|
12
|
+
if (!user.user_type?.includes?.("admin")) {
|
|
13
|
+
// throw ForbiddenError("not an admin");
|
|
14
|
+
}
|
|
8
15
|
const routes = await pg
|
|
9
16
|
.query(`select a.route_id as path, b.actions from admin.routes a
|
|
10
17
|
left join admin.role_access b on a.route_id=b.route_id
|
|
11
|
-
where b.user_uid=$1`, [
|
|
12
|
-
.then((
|
|
18
|
+
where b.user_uid=$1`, [params.id])
|
|
19
|
+
.then((r) => r.rows || []);
|
|
13
20
|
const resources = await pg
|
|
14
21
|
.query(`select resource_id, actions from admin.role_access
|
|
15
|
-
where resource_id is not null and user_uid=$1`, [
|
|
16
|
-
.then((
|
|
17
|
-
const
|
|
22
|
+
where resource_id is not null and user_uid=$1`, [params.id])
|
|
23
|
+
.then((r) => r.rows || []);
|
|
24
|
+
const userRoles = await pg
|
|
18
25
|
.query(`select user_uid as id, user_name as name, access_granted,
|
|
19
26
|
b.cdate as user_created, b.last_activity_date as last_activity from admin.user_roles a
|
|
20
27
|
left join admin.users b on a.user_uid=b.uid
|
|
21
|
-
where a.user_uid=$1`, [
|
|
22
|
-
.then((
|
|
23
|
-
return { routes, resources, user };
|
|
28
|
+
where a.user_uid=$1`, [params.id])
|
|
29
|
+
.then((r) => r.rows?.[0]);
|
|
30
|
+
return { routes, resources, user: userRoles };
|
|
24
31
|
}
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
export default function accessUserPost(req: any
|
|
1
|
+
export default function accessUserPost(req: any): Promise<{
|
|
2
|
+
routes: any;
|
|
3
|
+
resources: any;
|
|
4
|
+
user: any;
|
|
5
|
+
} | {
|
|
6
|
+
id: any;
|
|
7
|
+
routes: never[];
|
|
8
|
+
}>;
|
|
2
9
|
//# sourceMappingURL=access.user.post.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access.user.post.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.user.post.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"access.user.post.d.ts","sourceRoot":"","sources":["../../../../../server/routes/access/controllers/access.user.post.ts"],"names":[],"mappings":"AASA,wBAA8B,cAAc,CAAC,GAAG,EAAE,GAAG;;;;;;;GA2DpD"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { BadRequestError,
|
|
1
|
+
import { BadRequestError,
|
|
2
|
+
// ForbiddenError,
|
|
3
|
+
UnauthorizedError, } from "../../../../errors.js";
|
|
2
4
|
import { pgClients } from "../../../../utils.js";
|
|
3
5
|
import accessUser from "./access.user.js";
|
|
4
|
-
export default async function accessUserPost(req
|
|
6
|
+
export default async function accessUserPost(req) {
|
|
5
7
|
const { pg = pgClients.client, params, body, user } = req;
|
|
6
8
|
if (!params?.id) {
|
|
7
9
|
throw BadRequestError("not enough params: id");
|
|
@@ -9,15 +11,18 @@ export default async function accessUserPost(req, reply) {
|
|
|
9
11
|
if (!user?.uid) {
|
|
10
12
|
throw UnauthorizedError("unauthorized");
|
|
11
13
|
}
|
|
14
|
+
if (!user.user_type?.includes?.("admin")) {
|
|
15
|
+
// throw ForbiddenError("not an admin");
|
|
16
|
+
}
|
|
12
17
|
await pg.query("delete from admin.role_access where user_uid=$1", [
|
|
13
18
|
params.id,
|
|
14
19
|
]);
|
|
15
20
|
if (!body?.routes?.length) {
|
|
16
|
-
return
|
|
21
|
+
return { id: params.id, routes: [] };
|
|
17
22
|
}
|
|
18
23
|
const routesDB = await pg
|
|
19
24
|
.query("select array_agg(route_id) from admin.routes where enabled")
|
|
20
|
-
.then((
|
|
25
|
+
.then((r) => r.rows?.[0]?.array_agg || []);
|
|
21
26
|
await Promise.all(body.routes
|
|
22
27
|
.filter((el) => el.path && !routesDB?.includes(el.path))
|
|
23
28
|
.map((el) => pg.query("insert into admin.routes(route_id) values($1)", [el.path])));
|
|
@@ -27,6 +32,6 @@ export default async function accessUserPost(req, reply) {
|
|
|
27
32
|
await Promise.all(body.routes
|
|
28
33
|
.filter((el) => el.resource && el.actions)
|
|
29
34
|
.map((el) => pg.query("insert into admin.role_access(user_uid,resource_id,actions) values ($1,$2,$3)", [params.id, el.resource, el.actions])));
|
|
30
|
-
const result = await accessUser({ pg, params });
|
|
35
|
+
const result = await accessUser({ pg, params, user });
|
|
31
36
|
return result;
|
|
32
37
|
}
|
|
@@ -7,8 +7,8 @@ import { publicResourcesList } from "../../plugins/access/funcs/getResources.js"
|
|
|
7
7
|
import { accessGroupPostSchema, accessGroupSchema, accessInterfaceSchema, accessUserPostSchema, accessUserSchema, } from "./schema.js";
|
|
8
8
|
const tags = ["core", "access"];
|
|
9
9
|
export default async function route(fastify, opt = {}) {
|
|
10
|
-
fastify.get("/access-group/:id", { config: { tags }, schema: accessGroupSchema }, accessGroup);
|
|
11
|
-
fastify.post("/access-group/:id", { config: { tags }, schema: accessGroupPostSchema }, accessGroupPost);
|
|
10
|
+
fastify.get("/access-group/:id", { config: { tags, role: "admin" }, schema: accessGroupSchema }, accessGroup);
|
|
11
|
+
fastify.post("/access-group/:id", { config: { tags, role: "admin" }, schema: accessGroupPostSchema }, accessGroupPost);
|
|
12
12
|
fastify.get("/access-user/:id", {
|
|
13
13
|
config: { tags, permission: "admin.users.read" },
|
|
14
14
|
schema: accessUserSchema,
|
|
@@ -17,6 +17,6 @@ export default async function route(fastify, opt = {}) {
|
|
|
17
17
|
config: { tags, permission: "admin.users.update" },
|
|
18
18
|
schema: accessUserPostSchema,
|
|
19
19
|
}, accessUserPost);
|
|
20
|
-
fastify.get("/access-interface/:name", { config: { tags }, schema: accessInterfaceSchema }, accessInterface);
|
|
20
|
+
fastify.get("/access-interface/:name", { config: { tags, role: "admin" }, schema: accessInterfaceSchema }, accessInterface);
|
|
21
21
|
fastify.get("/resources", { config: { tags, policy: "L0" } }, async () => publicResourcesList);
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/suggest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AA8BpD,wBAAsB,kBAAkB,CAAC,EACvC,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,EACV,GAAG,EACH,EAAqB,GACtB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,UAAU,CAAC;CACjB;;;;;UAwFA;AAED,wBAA8B,OAAO,CAAC,GAAG,EAAE,GAAG,gBAuc7C"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import { config, getPGAsync, getTemplate, getSelectMeta, getMeta, applyHook, getSelectVal, logger, getSelect, metaFormat, getColumnCLS, pgClients, getFilter, getUserClsList, } from "../../../../utils.js";
|
|
4
|
-
import { BadRequestError, NotFoundError } from "../../../../errors.js";
|
|
4
|
+
import { BadRequestError, ForbiddenError, NotFoundError, } from "../../../../errors.js";
|
|
5
|
+
import getIP from "../../../plugins/policy/funcs/getIP.js";
|
|
5
6
|
const defaultLimit = 50;
|
|
6
7
|
export async function getTableColumnMeta({ table, template, column, selectName, filtered, startsWith, key, pg = pgClients.client, }) {
|
|
7
8
|
if (!table || !column) {
|
|
@@ -73,6 +74,36 @@ export default async function suggest(req) {
|
|
|
73
74
|
user?.user_type?.includes?.("admin") ||
|
|
74
75
|
process.env.NODE_ENV === "test" ||
|
|
75
76
|
process.env.VITEST;
|
|
77
|
+
if (params.data.includes("admin.") && !user) {
|
|
78
|
+
const ip = getIP(req);
|
|
79
|
+
logger.file("alert", {
|
|
80
|
+
message: "admin table data get attempt",
|
|
81
|
+
suggest: params.data,
|
|
82
|
+
ip,
|
|
83
|
+
});
|
|
84
|
+
throw ForbiddenError("unauthorized");
|
|
85
|
+
}
|
|
86
|
+
if (query.token && query.token?.includes("admin.") && !user) {
|
|
87
|
+
const ip = getIP(req);
|
|
88
|
+
logger.file("alert", {
|
|
89
|
+
message: "admin table data get attempt - token",
|
|
90
|
+
suggest: params.data,
|
|
91
|
+
token: query.token,
|
|
92
|
+
ip,
|
|
93
|
+
});
|
|
94
|
+
throw ForbiddenError("unauthorized");
|
|
95
|
+
}
|
|
96
|
+
const forbidden = params.data.includes(":password") || params.data.includes(":salt");
|
|
97
|
+
if (forbidden) {
|
|
98
|
+
const ip = getIP(req);
|
|
99
|
+
logger.file("alert", {
|
|
100
|
+
message: "password / salt get attempt",
|
|
101
|
+
uid: user?.uid,
|
|
102
|
+
suggest: params.data,
|
|
103
|
+
ip,
|
|
104
|
+
});
|
|
105
|
+
throw ForbiddenError("unauthorized");
|
|
106
|
+
}
|
|
76
107
|
if (params?.data && params.data?.startsWith?.("hash-")) {
|
|
77
108
|
const filepath = path.join(process.cwd(), `/log/suggest/${params.data.replace("hash-", "")}.json`);
|
|
78
109
|
if (existsSync(filepath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../server/routes/table/schema.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpB,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhB,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAajB,CAAC;AAEF,QAAA,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../server/routes/table/schema.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBpB,CAAC;AAEF,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhB,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAajB,CAAC;AAEF,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBlB,CAAC;AAEF,QAAA,MAAM,UAAU;;;;;;;;;;;;;;CAQf,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;;;;CAOjB,CAAC;AAEF,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;CAatB,CAAC;AAEF,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;CAQtB,CAAC;AAEF,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,YAAY,EACZ,iBAAiB,GAClB,CAAC"}
|
|
@@ -77,13 +77,14 @@ const suggestSchema = {
|
|
|
77
77
|
val: { type: "string", pattern: "([\\d\\w]+)$" },
|
|
78
78
|
sql: { type: "number" },
|
|
79
79
|
count: { type: "number" },
|
|
80
|
+
json: { type: "number" },
|
|
80
81
|
},
|
|
81
82
|
},
|
|
82
83
|
params: {
|
|
83
84
|
type: "object",
|
|
84
85
|
properties: {
|
|
85
86
|
// data: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
|
86
|
-
}
|
|
87
|
+
},
|
|
87
88
|
},
|
|
88
89
|
};
|
|
89
90
|
const formSchema = {
|
|
@@ -115,7 +116,7 @@ const cardTabDataSchema = {
|
|
|
115
116
|
properties: {
|
|
116
117
|
token: { type: "string", pattern: "^([\\d\\w]+)$" },
|
|
117
118
|
},
|
|
118
|
-
}
|
|
119
|
+
},
|
|
119
120
|
};
|
|
120
121
|
const tableDataIdSchema = {
|
|
121
122
|
params: {
|
package/dist/test.setup.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { beforeEach, afterEach, afterAll } from "vitest";
|
|
2
2
|
import { build, teardown } from "./helper.js";
|
|
3
|
+
const timeoutMs = process.platform === "win32" ? 500000 : 5000;
|
|
3
4
|
beforeEach(async () => {
|
|
4
5
|
if (process.env.trace === "true")
|
|
5
6
|
console.log("build after each bun test start...");
|
|
6
7
|
await build();
|
|
7
8
|
if (process.env.trace === "true")
|
|
8
9
|
console.log("build after each bun test finished");
|
|
9
|
-
});
|
|
10
|
+
}, timeoutMs);
|
|
10
11
|
afterEach(async () => {
|
|
11
12
|
if (process.env.trace === "true")
|
|
12
13
|
console.log("teardown after each bun test start...");
|
|
13
14
|
// await teardown();
|
|
14
15
|
if (process.env.trace === "true")
|
|
15
16
|
console.log("teardown after each bun test finished");
|
|
16
|
-
});
|
|
17
|
+
}, timeoutMs);
|
|
17
18
|
afterAll(async () => {
|
|
18
19
|
console.log("teardown after all bun test start...");
|
|
19
20
|
await teardown();
|
package/dist/utils.d.ts
CHANGED
|
@@ -78,7 +78,7 @@ export { default as officeConverter } from "./server/plugins/grpc/office2pdf.js"
|
|
|
78
78
|
export { default as getExport } from "./server/plugins/file/getExport.js";
|
|
79
79
|
export { default as jsonToCsv } from "./server/routes/file/controllers/utils/jsonToCsv.js";
|
|
80
80
|
export { default as jsonToXls } from "./server/routes/file/controllers/utils/jsonToXls.js";
|
|
81
|
-
export
|
|
81
|
+
export declare const getAdminAccess: () => never;
|
|
82
82
|
export { default as getUserPermissions } from "./server/plugins/access/funcs/getUserPermissions.js";
|
|
83
83
|
export { resourcesList, publicResourcesList, } from "./server/plugins/access/funcs/getResources.js";
|
|
84
84
|
export { default as sendNotification } from "./server/plugins/auth/funcs/sendNotification.js";
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.js
CHANGED
|
@@ -95,7 +95,9 @@ export { default as officeConverter } from "./server/plugins/grpc/office2pdf.js"
|
|
|
95
95
|
export { default as getExport } from "./server/plugins/file/getExport.js";
|
|
96
96
|
export { default as jsonToCsv } from "./server/routes/file/controllers/utils/jsonToCsv.js";
|
|
97
97
|
export { default as jsonToXls } from "./server/routes/file/controllers/utils/jsonToXls.js";
|
|
98
|
-
export
|
|
98
|
+
export const getAdminAccess = () => {
|
|
99
|
+
throw new Error("deprecated utils");
|
|
100
|
+
};
|
|
99
101
|
export { default as getUserPermissions } from "./server/plugins/access/funcs/getUserPermissions.js";
|
|
100
102
|
export { resourcesList, publicResourcesList, } from "./server/plugins/access/funcs/getResources.js";
|
|
101
103
|
export { default as sendNotification } from "./server/plugins/auth/funcs/sendNotification.js"; // email
|