@opengis/fastify-table 2.5.20 → 2.5.22
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/server/plugins/auth/funcs/getQuery.d.ts.map +1 -1
- package/dist/server/plugins/auth/funcs/getQuery.js +1 -1
- package/dist/server/plugins/file/uploadMultiPart.d.ts.map +1 -1
- package/dist/server/plugins/file/uploadMultiPart.js +11 -5
- package/dist/server/plugins/file/utils/inspectContent.d.ts +6 -0
- package/dist/server/plugins/file/utils/inspectContent.d.ts.map +1 -0
- package/dist/server/plugins/file/utils/inspectContent.js +58 -0
- package/dist/server/plugins/pg/funcs/pool.d.ts.map +1 -1
- package/dist/server/plugins/pg/funcs/pool.js +3 -0
- package/dist/server/plugins/policy/funcs/checkPolicy.d.ts.map +1 -1
- package/dist/server/plugins/policy/funcs/checkPolicy.js +2 -16
- package/dist/server/plugins/policy/funcs/checkTraversal.d.ts +2 -0
- package/dist/server/plugins/policy/funcs/checkTraversal.d.ts.map +1 -0
- package/dist/server/plugins/policy/funcs/checkTraversal.js +22 -0
- package/dist/server/plugins/policy/index.d.ts.map +1 -1
- package/dist/server/plugins/policy/index.js +3 -1
- package/dist/server/plugins/upload/startUpload.d.ts.map +1 -1
- package/dist/server/plugins/upload/startUpload.js +12 -3
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getQuery.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/auth/funcs/getQuery.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,wBAA8B,QAAQ,CAAC,EACrC,EAAE,EACF,IAAI,GACL,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B,
|
|
1
|
+
{"version":3,"file":"getQuery.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/auth/funcs/getQuery.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,wBAA8B,QAAQ,CAAC,EACrC,EAAE,EACF,IAAI,GACL,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B,gBAoIA"}
|
|
@@ -124,5 +124,5 @@ export default async function getQuery({ pg, data, }) {
|
|
|
124
124
|
.query(`select * from admin.users where uid =(select uid from admin.users_social_auth
|
|
125
125
|
where ${id ? "social_auth_id=$1" : "email=$1"} limit 1)`, [id || email])
|
|
126
126
|
.then((el) => el.rows?.[0] || {});
|
|
127
|
-
return result;
|
|
127
|
+
return { ...result, isNewUser: !(userId || socialUserId) };
|
|
128
128
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadMultiPart.d.ts","sourceRoot":"","sources":["../../../../server/plugins/file/uploadMultiPart.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uploadMultiPart.d.ts","sourceRoot":"","sources":["../../../../server/plugins/file/uploadMultiPart.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,KAAK;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA2CD,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,mBAkBvE;AAED,wBAAsB,gBAAgB,CACpC,EACE,IAAI,EAAE,QAAQ,EACd,MAA2C,EAC3C,MAAM,GACP,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACpD,MAAM,MAAW,mBA+BlB;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,GAAG,EACR,EACE,UAAU,EACV,GAAG,EACH,MAAM,EACN,gBAAwB,GACzB,GAAE;IACD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,OAAO,CAAC,KAAK,CAAC,CA0HhB;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -4,7 +4,6 @@ import { existsSync } from "node:fs";
|
|
|
4
4
|
import { mkdir, writeFile, readdir } from "node:fs/promises";
|
|
5
5
|
import { randomUUID } from "node:crypto";
|
|
6
6
|
import { imageSize } from "image-size";
|
|
7
|
-
import { fileTypeFromBuffer } from "file-type";
|
|
8
7
|
import { ListObjectsV2Command } from "@aws-sdk/client-s3";
|
|
9
8
|
import config from "../../../config.js";
|
|
10
9
|
import s3Client from "./providers/s3/client.js";
|
|
@@ -12,7 +11,8 @@ import providers from "./providers/index.js";
|
|
|
12
11
|
import { all, images } from "./utils/allowedExtensions.js";
|
|
13
12
|
import grpc from "../grpc/grpc.js";
|
|
14
13
|
import getFileType from "./utils/getFileType.js";
|
|
15
|
-
import { BadRequestError, ConflictError, PayloadTooLargeError, } from "../../../errors.js";
|
|
14
|
+
import { BadRequestError, ForbiddenError, ConflictError, PayloadTooLargeError, } from "../../../errors.js";
|
|
15
|
+
import inspectContent from "./utils/inspectContent.js";
|
|
16
16
|
const { resizeImage } = grpc();
|
|
17
17
|
const { resizeImageMinSize = 5 } = config; // resize images >= 5 MB by default
|
|
18
18
|
async function writeFileToDisk(file, buffer) {
|
|
@@ -82,6 +82,9 @@ export async function uploadMultiPart(req, { extensions, raw, subdir, originalFi
|
|
|
82
82
|
throw new Error("parts already processed");
|
|
83
83
|
}
|
|
84
84
|
const value = part?.fields?.file || part;
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
throw new ForbiddenError("upload of multiple files at once not allowed");
|
|
87
|
+
}
|
|
85
88
|
if (!value?.file?.on || !value?.filename) {
|
|
86
89
|
throw new Error("upload error");
|
|
87
90
|
}
|
|
@@ -90,6 +93,10 @@ export async function uploadMultiPart(req, { extensions, raw, subdir, originalFi
|
|
|
90
93
|
if (extensions && !extensions.includes(ext)) {
|
|
91
94
|
throw new BadRequestError("file extension is not allowed");
|
|
92
95
|
}
|
|
96
|
+
const dir = subdir != null ? subdir : req.params?.["*"] || "uploads";
|
|
97
|
+
if (dir.replace(/%2e/g, ".").replace(/%2E/g, ".").includes("..")) {
|
|
98
|
+
throw new ConflictError("path traversal is not allowed");
|
|
99
|
+
}
|
|
93
100
|
// ! check extension by core list if custom not provided - from filename
|
|
94
101
|
if (!extensions && !allowedExtensions.includes(ext.substring(1))) {
|
|
95
102
|
throw new BadRequestError("file extension is not allowed");
|
|
@@ -104,8 +111,8 @@ export async function uploadMultiPart(req, { extensions, raw, subdir, originalFi
|
|
|
104
111
|
if (!fileBuffer?.length) {
|
|
105
112
|
throw new BadRequestError("file buffer is empty");
|
|
106
113
|
}
|
|
107
|
-
const { ext: fileExtension } = (await fileTypeFromBuffer(fileBuffer)) || {};
|
|
108
114
|
const nameExt = ext.substring(1);
|
|
115
|
+
const { isValid } = await inspectContent(fileBuffer, nameExt);
|
|
109
116
|
// return buffer for custom upload
|
|
110
117
|
if (raw) {
|
|
111
118
|
return {
|
|
@@ -116,10 +123,9 @@ export async function uploadMultiPart(req, { extensions, raw, subdir, originalFi
|
|
|
116
123
|
fields: value.fields,
|
|
117
124
|
};
|
|
118
125
|
}
|
|
119
|
-
if (
|
|
126
|
+
if (!isValid) {
|
|
120
127
|
throw new ConflictError("file type spoofing attempt detected");
|
|
121
128
|
}
|
|
122
|
-
const dir = subdir != null ? subdir : req.params?.["*"] || "uploads";
|
|
123
129
|
const yearMonthDay = subdir != null ? "" : new Date().toISOString().split("T")[0];
|
|
124
130
|
const dbname = req.pg?.options?.database || req.pg?.database || config.pg?.database; // request / config params / default config params
|
|
125
131
|
const rootDir = config.root || `/data/local/${dbname || ""}`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectContent.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/file/utils/inspectContent.ts"],"names":[],"mappings":"AAwCA,wBAA8B,cAAc,CAC1C,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM;;;;GA+B1B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { fileTypeFromBuffer } from "file-type";
|
|
2
|
+
import { BadRequestError } from "../../../../errors.js";
|
|
3
|
+
import applyHook from "../../hook/applyHook.js";
|
|
4
|
+
const handlers = {
|
|
5
|
+
pdf: (buffer) => {
|
|
6
|
+
const head = buffer.subarray(0, 1024).toString("latin1");
|
|
7
|
+
if (head.includes("%PDF-")) {
|
|
8
|
+
return {
|
|
9
|
+
ext: "pdf",
|
|
10
|
+
mime: "application/pdf",
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
json: (buffer) => {
|
|
15
|
+
const head = buffer.subarray(0, 1).toString("utf8").trimStart();
|
|
16
|
+
if (["{", "["].includes(head)) {
|
|
17
|
+
return {
|
|
18
|
+
ext: "json",
|
|
19
|
+
mime: "application/json",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
geojson: (buffer) => {
|
|
24
|
+
const text = buffer.subarray(0, 64).toString("utf8").trimStart();
|
|
25
|
+
if (text.startsWith("{") &&
|
|
26
|
+
text.includes("features") &&
|
|
27
|
+
text.includes("FeatureCollection")) {
|
|
28
|
+
return {
|
|
29
|
+
ext: "geojson",
|
|
30
|
+
mime: "application/geo+json",
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
export default async function inspectContent(buffer, expectedExtension) {
|
|
36
|
+
if (!expectedExtension) {
|
|
37
|
+
throw new BadRequestError("not enough params: expectedExtension");
|
|
38
|
+
}
|
|
39
|
+
if (!Buffer.isBuffer(buffer) || !buffer.length) {
|
|
40
|
+
throw new BadRequestError("Invalid buffer");
|
|
41
|
+
}
|
|
42
|
+
// custom inspection of extensions like kml, svg etc
|
|
43
|
+
const hookData = (await applyHook("onInspectContent", {
|
|
44
|
+
buffer,
|
|
45
|
+
expectedExtension,
|
|
46
|
+
}));
|
|
47
|
+
if (hookData) {
|
|
48
|
+
return hookData;
|
|
49
|
+
}
|
|
50
|
+
const { ext, mime } = (await fileTypeFromBuffer(buffer)) || {};
|
|
51
|
+
// ? geojson, signed pdf, kml, svg etc - not recognized - inspecting the content
|
|
52
|
+
if (!ext && handlers[expectedExtension]) {
|
|
53
|
+
const { ext: ext2, mime: mime2 } = (await handlers[expectedExtension](buffer)) || {};
|
|
54
|
+
return { ext: ext2, mime: mime2, isValid: ext2 === expectedExtension };
|
|
55
|
+
}
|
|
56
|
+
// ? simple xml, pdf are recognized via file-type
|
|
57
|
+
return { ext, mime, isValid: ext === expectedExtension };
|
|
58
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/pool.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,CAAC;yBAE7B,QAAO,GAAQ;AAA/B,wBAgEE"}
|
|
@@ -2,7 +2,10 @@ import pg from "pg";
|
|
|
2
2
|
import logger from "../../../plugins/logger/getLogger.js";
|
|
3
3
|
const { types } = pg;
|
|
4
4
|
types.setTypeParser(1082, (stringValue) => stringValue);
|
|
5
|
+
// ALTER ROLE myuser SET timezone = 'Europe/Kyiv'; - for GET requests
|
|
5
6
|
types.setTypeParser(1114, (stringValue) => stringValue);
|
|
7
|
+
// optional - now frontend does not support timestamp in such format
|
|
8
|
+
// types.setTypeParser(1184, (stringValue) => stringValue);
|
|
6
9
|
import pgClients from "../pgClients.js";
|
|
7
10
|
import init from "./init.js";
|
|
8
11
|
import config from "../../../../config.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkPolicy.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAKhC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"checkPolicy.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAKhC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,GAAG,QAkIlE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { config, logger } from "../../../../utils.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ForbiddenError } from "../../../../errors.js";
|
|
3
3
|
export default function checkPolicy(req, jwt) {
|
|
4
4
|
const { originalUrl: path, hostname, query, params, headers, method, routeOptions, } = req;
|
|
5
5
|
const user = req.user || req.session?.passport?.user;
|
|
@@ -12,7 +12,7 @@ export default function checkPolicy(req, jwt) {
|
|
|
12
12
|
hostname.startsWith("admin");
|
|
13
13
|
const { role, referer, policy = [], } = (routeOptions?.config || {});
|
|
14
14
|
// role=admin|regular
|
|
15
|
-
const isRole = (role && (!user?.user_type || !
|
|
15
|
+
const isRole = (role && (!user?.user_type || !user?.user_type?.includes?.(role))) ||
|
|
16
16
|
(policy.includes("admin") && !user?.user_type?.includes?.("admin"));
|
|
17
17
|
const allowExtPublic = [".png", ".jpg", ".svg"];
|
|
18
18
|
const ext = path.toLowerCase().substr(-4);
|
|
@@ -47,20 +47,6 @@ export default function checkPolicy(req, jwt) {
|
|
|
47
47
|
});
|
|
48
48
|
throw ForbiddenError("access restricted: 0");
|
|
49
49
|
}
|
|
50
|
-
// ! file injection
|
|
51
|
-
if (JSON.stringify(params || {})?.includes("../") ||
|
|
52
|
-
JSON.stringify(query || {})?.includes("../") ||
|
|
53
|
-
path?.includes("../")) {
|
|
54
|
-
logger.file("injection/file", {
|
|
55
|
-
path,
|
|
56
|
-
method,
|
|
57
|
-
params,
|
|
58
|
-
query,
|
|
59
|
-
body,
|
|
60
|
-
uid: user?.uid,
|
|
61
|
-
});
|
|
62
|
-
throw ConflictError("access restricted: 1");
|
|
63
|
-
}
|
|
64
50
|
// ! invalid file extension
|
|
65
51
|
if (path.includes("files/") && allowExtPublic.includes(ext)) {
|
|
66
52
|
return null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkTraversal.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkTraversal.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,OAAO,EAAE,GAAG,QAgBlD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { logger } from "../../../../utils.js";
|
|
2
|
+
import { ConflictError } from "../../../../errors.js";
|
|
3
|
+
const decodeTraversal = (str) => str
|
|
4
|
+
.replace(/%2e/g, ".")
|
|
5
|
+
.replace(/%2E/g, ".")
|
|
6
|
+
.replace(/%2f/g, "/")
|
|
7
|
+
.replace(/%2F/g, "/");
|
|
8
|
+
export default function checkTraversal(request) {
|
|
9
|
+
const { method, originalUrl, query, params, user } = request;
|
|
10
|
+
if (decodeTraversal(JSON.stringify(params || {})).includes("../") ||
|
|
11
|
+
decodeTraversal(JSON.stringify(query || {})).includes("../") ||
|
|
12
|
+
decodeTraversal(originalUrl).includes("../")) {
|
|
13
|
+
logger.file("injection/file", {
|
|
14
|
+
path: originalUrl,
|
|
15
|
+
method,
|
|
16
|
+
params,
|
|
17
|
+
query,
|
|
18
|
+
uid: user?.uid,
|
|
19
|
+
});
|
|
20
|
+
throw ConflictError("path traversal detected");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -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":"AAOA,iBAAS,MAAM,CAAC,OAAO,EAAE,GAAG,QA+B3B;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import config from "../../../config.js";
|
|
2
2
|
import checkPolicy from "./funcs/checkPolicy.js";
|
|
3
|
+
import checkTraversal from "./funcs/checkTraversal.js";
|
|
3
4
|
import checkPermissions from "./funcs/checkPermissions.js";
|
|
4
5
|
import checkJWT from "./funcs/checkJWT.js";
|
|
5
6
|
function plugin(fastify) {
|
|
6
|
-
fastify.addHook("preHandler", async (request
|
|
7
|
+
fastify.addHook("preHandler", async (request) => {
|
|
8
|
+
checkTraversal(request);
|
|
7
9
|
// ! skip locally, skip tests
|
|
8
10
|
if ((process.env.local === "true" || process.env.NODE_ENV === "test") &&
|
|
9
11
|
!config.debugAuth &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startUpload.d.ts","sourceRoot":"","sources":["../../../../server/plugins/upload/startUpload.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"startUpload.d.ts","sourceRoot":"","sources":["../../../../server/plugins/upload/startUpload.ts"],"names":[],"mappings":"AAyBA,wBAA8B,WAAW,CAAC,EACxC,IAAI,EACJ,EAAE,EACF,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,gBAAwB,GACzB,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,gBA2GA"}
|
|
@@ -4,20 +4,29 @@ import { mkdir, writeFile } from "node:fs/promises";
|
|
|
4
4
|
import config from "../../../config.js";
|
|
5
5
|
import getUploadStatus from "./getUploadStatus.js";
|
|
6
6
|
import { prefix, fileDir, metaDir, uploadChunkDirectory, fetchTimeoutMs, } from "./index.js";
|
|
7
|
+
import { all } from "../file/utils/allowedExtensions.js";
|
|
7
8
|
import mimes from "../file/providers/mime/mimes.js";
|
|
8
9
|
import { startUpload as startUploadS3 } from "./s3.js";
|
|
9
|
-
import { BadRequestError, NotImplementedError } from "../../../errors.js";
|
|
10
|
+
import { BadRequestError, ForbiddenError, NotImplementedError, } from "../../../errors.js";
|
|
10
11
|
const { chunkSize = 5242880 } = config;
|
|
11
12
|
export default async function startUpload({ host, id, fileName, size, subdir, originalFilename = false, }) {
|
|
12
|
-
if (subdir &&
|
|
13
|
+
if (subdir &&
|
|
14
|
+
(typeof subdir !== "string" ||
|
|
15
|
+
subdir.replace(/%2e/g, ".").replace(/%2E/g, ".").includes(".."))) {
|
|
13
16
|
throw BadRequestError("invalid params: subdir");
|
|
14
17
|
}
|
|
15
18
|
if (originalFilename) {
|
|
16
19
|
throw NotImplementedError("currently not supported");
|
|
17
20
|
}
|
|
21
|
+
if (!fileName) {
|
|
22
|
+
throw BadRequestError("not enough params: fileName");
|
|
23
|
+
}
|
|
24
|
+
const extension = path.extname(fileName).substring(1);
|
|
25
|
+
if (!all.includes(extension)) {
|
|
26
|
+
throw ForbiddenError("file extension is not allowed");
|
|
27
|
+
}
|
|
18
28
|
if (!host) {
|
|
19
29
|
const id1 = id || randomUUID();
|
|
20
|
-
const extension = path.extname(fileName).substring(1);
|
|
21
30
|
const yearMonthDay = subdir ? "" : new Date().toISOString().split("T")[0];
|
|
22
31
|
const relativeDirpath = path
|
|
23
32
|
.join(uploadChunkDirectory, subdir || "", yearMonthDay || "")
|
package/dist/utils.d.ts
CHANGED
|
@@ -70,6 +70,7 @@ export { uploadMultiPart, rotateFilenameFS, rotateFilenameS3, } from "./server/p
|
|
|
70
70
|
export { default as getMimeType } from "./server/plugins/file/providers/mime/index.js";
|
|
71
71
|
export { default as getFileType } from "./server/plugins/file/utils/getFileType.js";
|
|
72
72
|
export { default as allowedExtensions } from "./server/plugins/file/utils/allowedExtensions.js";
|
|
73
|
+
export { default as inspectContent } from "./server/plugins/file/utils/inspectContent.js";
|
|
73
74
|
export { default as grpc } from "./server/plugins/grpc/grpc.js";
|
|
74
75
|
export { default as file2json } from "./server/plugins/grpc/file2json.js";
|
|
75
76
|
export { default as officeConverter } from "./server/plugins/grpc/office2pdf.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
|
@@ -86,6 +86,7 @@ export { uploadMultiPart, rotateFilenameFS, rotateFilenameS3, } from "./server/p
|
|
|
86
86
|
export { default as getMimeType } from "./server/plugins/file/providers/mime/index.js";
|
|
87
87
|
export { default as getFileType } from "./server/plugins/file/utils/getFileType.js";
|
|
88
88
|
export { default as allowedExtensions } from "./server/plugins/file/utils/allowedExtensions.js";
|
|
89
|
+
export { default as inspectContent } from "./server/plugins/file/utils/inspectContent.js";
|
|
89
90
|
// grpc
|
|
90
91
|
export { default as grpc } from "./server/plugins/grpc/grpc.js";
|
|
91
92
|
export { default as file2json } from "./server/plugins/grpc/file2json.js";
|