@blocklet/uploader-server 0.1.101 → 0.1.102

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.
@@ -7,7 +7,7 @@ import crypto from "crypto";
7
7
  import mime from "mime-types";
8
8
  import joinUrlLib from "url-join";
9
9
  import queue from "p-queue";
10
- import { setPDFDownloadHeader, logger } from "../utils.js";
10
+ import { setPDFDownloadHeader, logger, removeExifFromFile } from "../utils.js";
11
11
  const validFilePathInDirPath = (dirPath, filePath) => {
12
12
  const fileName = path.basename(filePath);
13
13
  if (!filePath.startsWith(dirPath) || path.join(dirPath, fileName) !== filePath) {
@@ -85,6 +85,11 @@ export function initLocalStorageServer({
85
85
  res.setHeader("x-uploader-file-exist", true);
86
86
  uploadMetadata = formatMetadata(uploadMetadata);
87
87
  await rewriteMetaDataFile(uploadMetadata);
88
+ try {
89
+ await removeExifFromFile(uploadMetadata.runtime.absolutePath);
90
+ } catch (err) {
91
+ logger.error("failed to remove EXIF from file", err);
92
+ }
88
93
  if (_onUploadFinish) {
89
94
  try {
90
95
  const result = await _onUploadFinish(req, res, uploadMetadata);
package/es/utils.d.ts CHANGED
@@ -49,4 +49,8 @@ export declare function scanDirectory(directory: string, options?: {
49
49
  blockletInfo?: any;
50
50
  }): Map<string, ResourceFile>;
51
51
  export declare function getFileNameFromReq(req: any): any;
52
+ /**
53
+ * Remove EXIF from file
54
+ */
55
+ export declare const removeExifFromFile: (filePath: string) => Promise<void>;
52
56
  export {};
package/es/utils.js CHANGED
@@ -4,15 +4,15 @@ import joinUrl from "url-join";
4
4
  import { isbot } from "isbot";
5
5
  import component from "@blocklet/sdk/lib/component";
6
6
  import { ImageBinDid } from "./constants.js";
7
- import { createReadStream } from "fs";
8
7
  import crypto from "crypto";
9
8
  import { getSignData } from "@blocklet/sdk/lib/util/verify-sign";
10
9
  import FormData from "form-data";
11
10
  import omit from "lodash/omit";
12
11
  import ms from "ms";
13
12
  import mime from "mime-types";
14
- import { existsSync, readdirSync, statSync } from "fs";
13
+ import { existsSync, readdirSync, renameSync, statSync, unlinkSync, createReadStream, createWriteStream } from "fs";
15
14
  import { join } from "path";
15
+ import ExifTransformer from "exif-be-gone";
16
16
  export let logger = console;
17
17
  if (process.env.BLOCKLET_LOG_DIR) {
18
18
  try {
@@ -277,3 +277,24 @@ export function getFileNameFromReq(req) {
277
277
  const pathname = req.path || req.url?.split("?")[0];
278
278
  return path.basename(decodeURIComponent(pathname || ""));
279
279
  }
280
+ export const removeExifFromFile = async (filePath) => {
281
+ return new Promise(async (resolve, reject) => {
282
+ try {
283
+ statSync(filePath);
284
+ } catch (e) {
285
+ reject(e);
286
+ return;
287
+ }
288
+ const tempPath = filePath + ".tmp";
289
+ const reader = createReadStream(filePath);
290
+ const writer = createWriteStream(tempPath);
291
+ reader.pipe(new ExifTransformer()).pipe(writer).on("finish", () => {
292
+ renameSync(tempPath, filePath);
293
+ resolve();
294
+ }).on("error", (err) => {
295
+ logger.error("[exif-be-gone] failed", err);
296
+ unlinkSync(tempPath);
297
+ reject(err);
298
+ });
299
+ });
300
+ };
@@ -105,6 +105,11 @@ function initLocalStorageServer({
105
105
  res.setHeader("x-uploader-file-exist", true);
106
106
  uploadMetadata = formatMetadata(uploadMetadata);
107
107
  await rewriteMetaDataFile(uploadMetadata);
108
+ try {
109
+ await (0, _utils.removeExifFromFile)(uploadMetadata.runtime.absolutePath);
110
+ } catch (err) {
111
+ _utils.logger.error("failed to remove EXIF from file", err);
112
+ }
108
113
  if (_onUploadFinish) {
109
114
  try {
110
115
  const result = await _onUploadFinish(req, res, uploadMetadata);
package/lib/utils.d.ts CHANGED
@@ -49,4 +49,8 @@ export declare function scanDirectory(directory: string, options?: {
49
49
  blockletInfo?: any;
50
50
  }): Map<string, ResourceFile>;
51
51
  export declare function getFileNameFromReq(req: any): any;
52
+ /**
53
+ * Remove EXIF from file
54
+ */
55
+ export declare const removeExifFromFile: (filePath: string) => Promise<void>;
52
56
  export {};
package/lib/utils.js CHANGED
@@ -11,6 +11,7 @@ exports.getMediaKitFileStream = getMediaKitFileStream;
11
11
  exports.getTrustedDomainsCache = getTrustedDomainsCache;
12
12
  exports.logger = void 0;
13
13
  exports.proxyImageDownload = proxyImageDownload;
14
+ exports.removeExifFromFile = void 0;
14
15
  exports.scanDirectory = scanDirectory;
15
16
  exports.serveResource = serveResource;
16
17
  exports.setPDFDownloadHeader = setPDFDownloadHeader;
@@ -21,13 +22,14 @@ var _urlJoin = _interopRequireDefault(require("url-join"));
21
22
  var _isbot = require("isbot");
22
23
  var _component = _interopRequireDefault(require("@blocklet/sdk/lib/component"));
23
24
  var _constants = require("./constants");
24
- var _fs = require("fs");
25
25
  var _crypto = _interopRequireDefault(require("crypto"));
26
26
  var _verifySign = require("@blocklet/sdk/lib/util/verify-sign");
27
27
  var _formData = _interopRequireDefault(require("form-data"));
28
28
  var _omit = _interopRequireDefault(require("lodash/omit"));
29
29
  var _ms = _interopRequireDefault(require("ms"));
30
30
  var _mimeTypes = _interopRequireDefault(require("mime-types"));
31
+ var _fs = require("fs");
32
+ var _exifBeGone = _interopRequireDefault(require("exif-be-gone"));
31
33
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
32
34
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
33
35
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -300,4 +302,26 @@ function scanDirectory(directory, options = {}) {
300
302
  function getFileNameFromReq(req) {
301
303
  const pathname = req.path || req.url?.split("?")[0];
302
304
  return _path.default.basename(decodeURIComponent(pathname || ""));
303
- }
305
+ }
306
+ const removeExifFromFile = async filePath => {
307
+ return new Promise(async (resolve, reject) => {
308
+ try {
309
+ (0, _fs.statSync)(filePath);
310
+ } catch (e) {
311
+ reject(e);
312
+ return;
313
+ }
314
+ const tempPath = filePath + ".tmp";
315
+ const reader = (0, _fs.createReadStream)(filePath);
316
+ const writer = (0, _fs.createWriteStream)(tempPath);
317
+ reader.pipe(new _exifBeGone.default()).pipe(writer).on("finish", () => {
318
+ (0, _fs.renameSync)(tempPath, filePath);
319
+ resolve();
320
+ }).on("error", err => {
321
+ logger.error("[exif-be-gone] failed", err);
322
+ (0, _fs.unlinkSync)(tempPath);
323
+ reject(err);
324
+ });
325
+ });
326
+ };
327
+ exports.removeExifFromFile = removeExifFromFile;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/uploader-server",
3
- "version": "0.1.101",
3
+ "version": "0.1.102",
4
4
  "description": "blocklet upload server",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -58,6 +58,7 @@
58
58
  "@uppy/companion": "4.15.1",
59
59
  "axios": "^1.7.8",
60
60
  "body-parser": "^1.20.3",
61
+ "exif-be-gone": "^1.5.1",
61
62
  "express-session": "1.17.3",
62
63
  "glob": "^11.0.1",
63
64
  "isbot": "^5.1.17",