appium-ios-remotexpc 2.0.2 → 2.0.3
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/CHANGELOG.md +6 -0
- package/build/src/services/ios/afc/index.d.ts.map +1 -1
- package/build/src/services/ios/afc/index.js +20 -14
- package/build/src/services/ios/afc/index.js.map +1 -1
- package/build/src/services/ios/afc/local-filesystem-case.d.ts +23 -0
- package/build/src/services/ios/afc/local-filesystem-case.d.ts.map +1 -0
- package/build/src/services/ios/afc/local-filesystem-case.js +132 -0
- package/build/src/services/ios/afc/local-filesystem-case.js.map +1 -0
- package/build/src/services/ios/afc/pull-local-name-allocator.d.ts +21 -0
- package/build/src/services/ios/afc/pull-local-name-allocator.d.ts.map +1 -0
- package/build/src/services/ios/afc/pull-local-name-allocator.js +82 -0
- package/build/src/services/ios/afc/pull-local-name-allocator.js.map +1 -0
- package/build/src/services/ios/afc/sanitize-local-filename.d.ts +15 -0
- package/build/src/services/ios/afc/sanitize-local-filename.d.ts.map +1 -0
- package/build/src/services/ios/afc/sanitize-local-filename.js +130 -0
- package/build/src/services/ios/afc/sanitize-local-filename.js.map +1 -0
- package/package.json +2 -2
- package/src/services/ios/afc/index.ts +41 -15
- package/src/services/ios/afc/local-filesystem-case.ts +173 -0
- package/src/services/ios/afc/pull-local-name-allocator.ts +107 -0
- package/src/services/ios/afc/sanitize-local-filename.ts +163 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [2.0.3](https://github.com/appium/appium-ios-remotexpc/compare/v2.0.2...v2.0.3) (2026-05-22)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* Respect local file system limitations while pulling remote files ([#220](https://github.com/appium/appium-ios-remotexpc/issues/220)) ([4aa9491](https://github.com/appium/appium-ios-remotexpc/commit/4aa949169c6763d99aee8fa6b7c6cd4b74f39a82))
|
|
6
|
+
|
|
1
7
|
## [2.0.2](https://github.com/appium/appium-ios-remotexpc/compare/v2.0.1...v2.0.2) (2026-05-21)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/afc/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAqBjD,OAAO,EACL,uBAAuB,EAIxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAY,WAAW,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/afc/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { buildClosePayload, buildFopenPayload, buildMkdirPayload, buildRemovePay
|
|
|
8
8
|
import { AFC_FOPEN_TEXTUAL_MODES, AFC_LOCK_EX, AFC_LOCK_UN, AFC_WRITE_THIS_LENGTH, } from './constants.js';
|
|
9
9
|
import { AfcError, AfcFileMode, AfcOpcode } from './enums.js';
|
|
10
10
|
import { AfcConnectionError } from './errors.js';
|
|
11
|
+
import { PullLocalNameAllocator } from './pull-local-name-allocator.js';
|
|
11
12
|
import { createAfcReadStream, createAfcWriteStream } from './stream-utils.js';
|
|
12
13
|
const log = getLogger('AfcService');
|
|
13
14
|
const NON_LISTABLE_ENTRIES = ['', '.', '..'];
|
|
@@ -244,9 +245,12 @@ export class AfcService {
|
|
|
244
245
|
if (!(await this.exists(remoteSrc))) {
|
|
245
246
|
throw new Error(`Remote path does not exist: ${remoteSrc}`);
|
|
246
247
|
}
|
|
247
|
-
const
|
|
248
|
+
const localNames = new PullLocalNameAllocator((localPath) => this._localPathExists(localPath), overwrite);
|
|
249
|
+
const pullSingleFile = async (remoteFilePath, localFilePath, nameAllocated = false) => {
|
|
248
250
|
log.debug(`Pulling file from '${remoteFilePath}' to '${localFilePath}'`);
|
|
249
|
-
if (!
|
|
251
|
+
if (!nameAllocated &&
|
|
252
|
+
!overwrite &&
|
|
253
|
+
(await this._localPathExists(localFilePath))) {
|
|
250
254
|
throw new Error(`Local file already exists: ${localFilePath}`);
|
|
251
255
|
}
|
|
252
256
|
await this._pullFile(remoteFilePath, localFilePath);
|
|
@@ -256,15 +260,15 @@ export class AfcService {
|
|
|
256
260
|
};
|
|
257
261
|
const isDir = await this.isdir(remoteSrc);
|
|
258
262
|
if (!isDir) {
|
|
259
|
-
const
|
|
260
|
-
if (match && !minimatch(
|
|
263
|
+
const remoteBaseName = path.posix.basename(remoteSrc);
|
|
264
|
+
if (match && !minimatch(remoteBaseName, match)) {
|
|
261
265
|
return;
|
|
262
266
|
}
|
|
263
267
|
const localDstIsDirectory = await this._isLocalDirectory(localDst);
|
|
264
268
|
const targetPath = localDstIsDirectory
|
|
265
|
-
? path.join(localDst,
|
|
269
|
+
? path.join(localDst, await localNames.allocate(localDst, remoteBaseName))
|
|
266
270
|
: localDst;
|
|
267
|
-
await pullSingleFile(remoteSrc, targetPath);
|
|
271
|
+
await pullSingleFile(remoteSrc, targetPath, localDstIsDirectory);
|
|
268
272
|
return;
|
|
269
273
|
}
|
|
270
274
|
// Source is a directory, recursive option required
|
|
@@ -276,6 +280,7 @@ export class AfcService {
|
|
|
276
280
|
match,
|
|
277
281
|
overwrite,
|
|
278
282
|
callback: onPullProgress,
|
|
283
|
+
localNames,
|
|
279
284
|
});
|
|
280
285
|
}
|
|
281
286
|
/**
|
|
@@ -436,7 +441,10 @@ export class AfcService {
|
|
|
436
441
|
* is a directory before invoking.
|
|
437
442
|
*/
|
|
438
443
|
async _pullRecursiveInternal(remoteSrcDir, localDstDir, options, relativePath = '') {
|
|
439
|
-
const { match, overwrite = true, callback: onPullProgress } = options ?? {};
|
|
444
|
+
const { match, overwrite = true, callback: onPullProgress, localNames, } = options ?? {};
|
|
445
|
+
if (!localNames) {
|
|
446
|
+
throw new Error('PullLocalNameAllocator is required for recursive pull');
|
|
447
|
+
}
|
|
440
448
|
let localDirPath;
|
|
441
449
|
if (!relativePath) {
|
|
442
450
|
const localDstIsDirectory = await this._isLocalDirectory(localDstDir);
|
|
@@ -453,9 +461,9 @@ export class AfcService {
|
|
|
453
461
|
throw new Error(`Local destination exists and is a file, not a directory: ${localDstDir}`);
|
|
454
462
|
}
|
|
455
463
|
}
|
|
456
|
-
const
|
|
464
|
+
const remoteBaseName = path.posix.basename(remoteSrcDir);
|
|
457
465
|
localDirPath = localDstIsDirectory
|
|
458
|
-
? path.join(localDstDir,
|
|
466
|
+
? path.join(localDstDir, await localNames.allocate(localDstDir, remoteBaseName))
|
|
459
467
|
: localDstDir;
|
|
460
468
|
}
|
|
461
469
|
else {
|
|
@@ -484,18 +492,16 @@ export class AfcService {
|
|
|
484
492
|
const entryRelativePath = relativePath
|
|
485
493
|
? path.posix.join(relativePath, entry)
|
|
486
494
|
: entry;
|
|
495
|
+
const localEntryName = await localNames.allocate(localDirPath, entry);
|
|
487
496
|
if (await this.isdir(entryPath)) {
|
|
488
|
-
await this._pullRecursiveInternal(entryPath, path.join(localDirPath,
|
|
497
|
+
await this._pullRecursiveInternal(entryPath, path.join(localDirPath, localEntryName), options, entryRelativePath);
|
|
489
498
|
}
|
|
490
499
|
else {
|
|
491
500
|
if (match && !minimatch(entryRelativePath, match)) {
|
|
492
501
|
continue;
|
|
493
502
|
}
|
|
494
503
|
await ensureLocalDir();
|
|
495
|
-
const targetPath = path.join(localDirPath,
|
|
496
|
-
if (!overwrite && (await this._localPathExists(targetPath))) {
|
|
497
|
-
throw new Error(`Local file already exists: ${targetPath}`);
|
|
498
|
-
}
|
|
504
|
+
const targetPath = path.join(localDirPath, localEntryName);
|
|
499
505
|
await this._pullFile(entryPath, targetPath);
|
|
500
506
|
if (onPullProgress) {
|
|
501
507
|
await onPullProgress(entryPath, targetPath, false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/services/ios/afc/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/services/ios/afc/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Subset of keys returned by `diskutil info -plist`. */
|
|
2
|
+
export interface DiskutilInfoPlist {
|
|
3
|
+
FilesystemName?: string;
|
|
4
|
+
FilesystemUserVisibleName?: string;
|
|
5
|
+
VolumeName?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Whether distinct path segments that differ only by letter case collide on `dir`.
|
|
10
|
+
*
|
|
11
|
+
* On macOS, uses `diskutil info -plist` for the volume backing `dir`. Results are
|
|
12
|
+
* cached per device identifier.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isCaseSensitiveDirectory(dir: string): Promise<boolean>;
|
|
15
|
+
/**
|
|
16
|
+
* Derive case sensitivity from a parsed `diskutil info -plist` object.
|
|
17
|
+
*
|
|
18
|
+
* Case-sensitive APFS reports `FilesystemName: Case-sensitive APFS` and/or
|
|
19
|
+
* `FilesystemUserVisibleName: APFS (Case-sensitive)`. Default APFS/HFS+ installs are
|
|
20
|
+
* case-insensitive when not labeled otherwise.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseDiskutilInfoPlist(info: DiskutilInfoPlist): boolean;
|
|
23
|
+
//# sourceMappingURL=local-filesystem-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-filesystem-case.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/afc/local-filesystem-case.ts"],"names":[],"mappings":"AAeA,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2B5E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAmCvE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { plist } from '@appium/support';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import fsp from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import { getLogger } from '../../../lib/logger.js';
|
|
8
|
+
const log = getLogger('LocalFilesystemCase');
|
|
9
|
+
const execFileAsync = promisify(execFile);
|
|
10
|
+
const caseSensitivityByDevice = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Whether distinct path segments that differ only by letter case collide on `dir`.
|
|
13
|
+
*
|
|
14
|
+
* On macOS, uses `diskutil info -plist` for the volume backing `dir`. Results are
|
|
15
|
+
* cached per device identifier.
|
|
16
|
+
*/
|
|
17
|
+
export async function isCaseSensitiveDirectory(dir) {
|
|
18
|
+
const resolved = await fsp.realpath(dir).catch(() => path.resolve(dir));
|
|
19
|
+
let caseSensitive;
|
|
20
|
+
switch (os.platform()) {
|
|
21
|
+
case 'win32':
|
|
22
|
+
caseSensitive = false;
|
|
23
|
+
break;
|
|
24
|
+
case 'linux':
|
|
25
|
+
caseSensitive = true;
|
|
26
|
+
break;
|
|
27
|
+
case 'darwin':
|
|
28
|
+
try {
|
|
29
|
+
caseSensitive = await getDarwinCaseSensitivity(resolved);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
log.info(`Could not determine case sensitivity for '${resolved}'; assuming case-insensitive:`, err);
|
|
33
|
+
caseSensitive = false;
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
default:
|
|
37
|
+
caseSensitive = true;
|
|
38
|
+
}
|
|
39
|
+
return caseSensitive;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Derive case sensitivity from a parsed `diskutil info -plist` object.
|
|
43
|
+
*
|
|
44
|
+
* Case-sensitive APFS reports `FilesystemName: Case-sensitive APFS` and/or
|
|
45
|
+
* `FilesystemUserVisibleName: APFS (Case-sensitive)`. Default APFS/HFS+ installs are
|
|
46
|
+
* case-insensitive when not labeled otherwise.
|
|
47
|
+
*/
|
|
48
|
+
export function parseDiskutilInfoPlist(info) {
|
|
49
|
+
const explicit = getExplicitCaseSensitiveField(info);
|
|
50
|
+
if (explicit !== undefined) {
|
|
51
|
+
return explicit;
|
|
52
|
+
}
|
|
53
|
+
const filesystemName = stringField(info.FilesystemName);
|
|
54
|
+
const visibleName = stringField(info.FilesystemUserVisibleName);
|
|
55
|
+
for (const value of [filesystemName, visibleName]) {
|
|
56
|
+
if (!value) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (/case-insensitive/i.test(value)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
if (/case-sensitive/i.test(value)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (filesystemName?.includes('HFS') &&
|
|
67
|
+
!/case-sensitive/i.test(filesystemName)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if (filesystemName === 'APFS' || visibleName === 'APFS') {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
throw new Error('diskutil info plist did not include recognizable case-sensitivity details');
|
|
74
|
+
}
|
|
75
|
+
/** @internal Reset cached probe results (unit tests only). */
|
|
76
|
+
export function clearCaseSensitivityCache() {
|
|
77
|
+
caseSensitivityByDevice.clear();
|
|
78
|
+
}
|
|
79
|
+
async function getDarwinCaseSensitivity(dir) {
|
|
80
|
+
const device = await getDeviceIdentifierForPath(dir);
|
|
81
|
+
const cached = caseSensitivityByDevice.get(device);
|
|
82
|
+
if (cached !== undefined) {
|
|
83
|
+
return cached;
|
|
84
|
+
}
|
|
85
|
+
const { stdout } = await execFileAsync('diskutil', ['info', '-plist', device], {
|
|
86
|
+
encoding: 'utf8',
|
|
87
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
88
|
+
});
|
|
89
|
+
const diskInfo = plist.parsePlist(stdout);
|
|
90
|
+
const caseSensitive = parseDiskutilInfoPlist(diskInfo);
|
|
91
|
+
caseSensitivityByDevice.set(device, caseSensitive);
|
|
92
|
+
return caseSensitive;
|
|
93
|
+
}
|
|
94
|
+
async function getDeviceIdentifierForPath(dir) {
|
|
95
|
+
const { stdout } = await execFileAsync('df', ['-P', dir], {
|
|
96
|
+
encoding: 'utf8',
|
|
97
|
+
});
|
|
98
|
+
const lines = stdout.trim().split('\n');
|
|
99
|
+
const dataLine = lines[lines.length - 1];
|
|
100
|
+
if (!dataLine) {
|
|
101
|
+
throw new Error(`df produced no output for '${dir}'`);
|
|
102
|
+
}
|
|
103
|
+
const devicePath = dataLine.split(/\s+/)[0];
|
|
104
|
+
if (!devicePath?.startsWith('/dev/')) {
|
|
105
|
+
throw new Error(`Unexpected df device for '${dir}': ${devicePath ?? ''}`);
|
|
106
|
+
}
|
|
107
|
+
return devicePath.slice('/dev/'.length);
|
|
108
|
+
}
|
|
109
|
+
function getExplicitCaseSensitiveField(info) {
|
|
110
|
+
for (const [key, value] of Object.entries(info)) {
|
|
111
|
+
if (!/case-sensitive/i.test(key)) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (typeof value === 'boolean') {
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
if (typeof value === 'string') {
|
|
118
|
+
const normalized = value.toLowerCase();
|
|
119
|
+
if (normalized === 'yes' || normalized === 'true') {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (normalized === 'no' || normalized === 'false') {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
function stringField(value) {
|
|
130
|
+
return typeof value === 'string' ? value : undefined;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=local-filesystem-case.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-filesystem-case.js","sourceRoot":"","sources":["../../../../../src/services/ios/afc/local-filesystem-case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,GAAG,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;AAE7C,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAmB,CAAC;AAU3D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAExE,IAAI,aAAsB,CAAC;IAC3B,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;QACtB,KAAK,OAAO;YACV,aAAa,GAAG,KAAK,CAAC;YACtB,MAAM;QACR,KAAK,OAAO;YACV,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM;QACR,KAAK,QAAQ;YACX,IAAI,CAAC;gBACH,aAAa,GAAG,MAAM,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CACN,6CAA6C,QAAQ,+BAA+B,EACpF,GAAG,CACJ,CAAC;gBACF,aAAa,GAAG,KAAK,CAAC;YACxB,CAAC;YACD,MAAM;QACR;YACE,aAAa,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAuB;IAC5D,MAAM,QAAQ,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAEhE,KAAK,MAAM,KAAK,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,IACE,cAAc,EAAE,QAAQ,CAAC,KAAK,CAAC;QAC/B,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,EACvC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,cAAc,KAAK,MAAM,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,yBAAyB;IACvC,uBAAuB,CAAC,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACjD,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,UAAU,EACV,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC1B;QACE,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;KAC3B,CACF,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAsB,CAAC;IAC/D,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvD,uBAAuB,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,GAAW;IACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;QACxD,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,MAAM,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,6BAA6B,CACpC,IAAuB;IAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;YACvC,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAClD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type CaseSensitiveDirectoryCheck = (dir: string) => Promise<boolean>;
|
|
2
|
+
/**
|
|
3
|
+
* Resolves sanitized local path segment names during a single AFC pull.
|
|
4
|
+
* Adds a UUID-based suffix when the sanitized name is already taken in this pull, or
|
|
5
|
+
* when `overwrite` is false and a file already exists at that path on disk.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PullLocalNameAllocator {
|
|
8
|
+
private readonly pathExists;
|
|
9
|
+
private readonly overwrite;
|
|
10
|
+
private readonly checkCaseSensitive;
|
|
11
|
+
private readonly usedByDir;
|
|
12
|
+
private readonly caseSensitiveByDir;
|
|
13
|
+
constructor(pathExists: (localPath: string) => Promise<boolean>, overwrite: boolean, checkCaseSensitive?: CaseSensitiveDirectoryCheck);
|
|
14
|
+
allocate(parentDir: string, remoteSegment: string): Promise<string>;
|
|
15
|
+
private hasClash;
|
|
16
|
+
private isUsedInPull;
|
|
17
|
+
private namesCollide;
|
|
18
|
+
private isCaseSensitiveForDir;
|
|
19
|
+
private register;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=pull-local-name-allocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-local-name-allocator.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/afc/pull-local-name-allocator.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5E;;;;GAIG;AACH,qBAAa,sBAAsB;IAK/B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IANrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAC5D,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8B;gBAG9C,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACnD,SAAS,EAAE,OAAO,EAClB,kBAAkB,GAAE,2BAAsD;IAGvF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAoB3D,QAAQ;YAUR,YAAY;YAgBZ,YAAY;YAWZ,qBAAqB;IASnC,OAAO,CAAC,QAAQ;CAQjB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isCaseSensitiveDirectory } from './local-filesystem-case.js';
|
|
4
|
+
import { appendUniqueSuffix, sanitizeLocalFilename, } from './sanitize-local-filename.js';
|
|
5
|
+
const MAX_ALLOCATION_ATTEMPTS = 100;
|
|
6
|
+
/**
|
|
7
|
+
* Resolves sanitized local path segment names during a single AFC pull.
|
|
8
|
+
* Adds a UUID-based suffix when the sanitized name is already taken in this pull, or
|
|
9
|
+
* when `overwrite` is false and a file already exists at that path on disk.
|
|
10
|
+
*/
|
|
11
|
+
export class PullLocalNameAllocator {
|
|
12
|
+
pathExists;
|
|
13
|
+
overwrite;
|
|
14
|
+
checkCaseSensitive;
|
|
15
|
+
usedByDir = new Map();
|
|
16
|
+
caseSensitiveByDir = new Map();
|
|
17
|
+
constructor(pathExists, overwrite, checkCaseSensitive = isCaseSensitiveDirectory) {
|
|
18
|
+
this.pathExists = pathExists;
|
|
19
|
+
this.overwrite = overwrite;
|
|
20
|
+
this.checkCaseSensitive = checkCaseSensitive;
|
|
21
|
+
}
|
|
22
|
+
async allocate(parentDir, remoteSegment) {
|
|
23
|
+
const sanitized = sanitizeLocalFilename(remoteSegment);
|
|
24
|
+
for (let attempt = 0; attempt < MAX_ALLOCATION_ATTEMPTS; attempt += 1) {
|
|
25
|
+
const candidate = attempt === 0
|
|
26
|
+
? sanitized
|
|
27
|
+
: appendUniqueSuffix(sanitized, randomSuffix());
|
|
28
|
+
if (!(await this.hasClash(parentDir, candidate))) {
|
|
29
|
+
this.register(parentDir, candidate);
|
|
30
|
+
return candidate;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Could not allocate a unique local name for remote segment '${remoteSegment}'`);
|
|
34
|
+
}
|
|
35
|
+
async hasClash(parentDir, name) {
|
|
36
|
+
if (await this.isUsedInPull(parentDir, name)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
if (!this.overwrite) {
|
|
40
|
+
return this.pathExists(path.join(parentDir, name));
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
async isUsedInPull(parentDir, name) {
|
|
45
|
+
const used = this.usedByDir.get(parentDir);
|
|
46
|
+
if (!used) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
for (const existing of used) {
|
|
50
|
+
if (await this.namesCollide(parentDir, existing, name)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
async namesCollide(parentDir, a, b) {
|
|
57
|
+
if (await this.isCaseSensitiveForDir(parentDir)) {
|
|
58
|
+
return a === b;
|
|
59
|
+
}
|
|
60
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
61
|
+
}
|
|
62
|
+
async isCaseSensitiveForDir(parentDir) {
|
|
63
|
+
let caseSensitive = this.caseSensitiveByDir.get(parentDir);
|
|
64
|
+
if (caseSensitive === undefined) {
|
|
65
|
+
caseSensitive = await this.checkCaseSensitive(parentDir);
|
|
66
|
+
this.caseSensitiveByDir.set(parentDir, caseSensitive);
|
|
67
|
+
}
|
|
68
|
+
return caseSensitive;
|
|
69
|
+
}
|
|
70
|
+
register(parentDir, name) {
|
|
71
|
+
let used = this.usedByDir.get(parentDir);
|
|
72
|
+
if (!used) {
|
|
73
|
+
used = new Set();
|
|
74
|
+
this.usedByDir.set(parentDir, used);
|
|
75
|
+
}
|
|
76
|
+
used.add(name);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function randomSuffix() {
|
|
80
|
+
return randomUUID().replace(/-/g, '').slice(0, 8);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=pull-local-name-allocator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-local-name-allocator.js","sourceRoot":"","sources":["../../../../../src/services/ios/afc/pull-local-name-allocator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Fallback when a remote name has no safe local characters after sanitization. */
|
|
2
|
+
export declare const EMPTY_SANITIZED_FILENAME = "_";
|
|
3
|
+
/**
|
|
4
|
+
* Sanitize a single path segment from the device for use on the local filesystem.
|
|
5
|
+
*
|
|
6
|
+
* Rules are chosen from {@link os.platform} at pull time (the host writing files).
|
|
7
|
+
*/
|
|
8
|
+
export declare function sanitizeLocalFilename(name: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Insert a unique suffix before the file extension (or at the end when there is none).
|
|
11
|
+
*/
|
|
12
|
+
export declare function withUniqueSuffix(filename: string, suffix: string): string;
|
|
13
|
+
/** Sanitized name with a disambiguating suffix, still within host filename byte limits. */
|
|
14
|
+
export declare function appendUniqueSuffix(sanitized: string, suffix: string): string;
|
|
15
|
+
//# sourceMappingURL=sanitize-local-filename.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-local-filename.d.ts","sourceRoot":"","sources":["../../../../../src/services/ios/afc/sanitize-local-filename.ts"],"names":[],"mappings":"AAEA,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAuB5C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMzE;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB5E"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
/** Fallback when a remote name has no safe local characters after sanitization. */
|
|
3
|
+
export const EMPTY_SANITIZED_FILENAME = '_';
|
|
4
|
+
const MAX_FILENAME_BYTES = 255;
|
|
5
|
+
/** C0 and C1 Unicode control characters. */
|
|
6
|
+
// eslint-disable-next-line no-control-regex -- intentional filename sanitization
|
|
7
|
+
const CONTROL_RE = /[\x00-\x1f\x80-\x9f]/g;
|
|
8
|
+
/** Characters invalid on Windows filenames. */
|
|
9
|
+
const WINDOWS_ILLEGAL_RE = /[/?<>\\:*|"]/g;
|
|
10
|
+
/** Path separator on Unix-like systems (and macOS). */
|
|
11
|
+
const POSIX_PATH_SEP_RE = /\//g;
|
|
12
|
+
/** Colon is invalid in macOS / HFS+ / APFS file names. */
|
|
13
|
+
const DARWIN_ILLEGAL_RE = /:/g;
|
|
14
|
+
/** Unix reserved single-segment names (`.` and `..`). */
|
|
15
|
+
const RESERVED_DOTS_RE = /^\.+$/;
|
|
16
|
+
/** Windows reserved device names (case-insensitive, optional extension). */
|
|
17
|
+
const WINDOWS_RESERVED_RE = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
|
|
18
|
+
/**
|
|
19
|
+
* Sanitize a single path segment from the device for use on the local filesystem.
|
|
20
|
+
*
|
|
21
|
+
* Rules are chosen from {@link os.platform} at pull time (the host writing files).
|
|
22
|
+
*/
|
|
23
|
+
export function sanitizeLocalFilename(name) {
|
|
24
|
+
switch (os.platform()) {
|
|
25
|
+
case 'win32':
|
|
26
|
+
return sanitizeForWindows(name);
|
|
27
|
+
case 'darwin':
|
|
28
|
+
return sanitizeForDarwin(name);
|
|
29
|
+
default:
|
|
30
|
+
return sanitizeForPosix(name);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Insert a unique suffix before the file extension (or at the end when there is none).
|
|
35
|
+
*/
|
|
36
|
+
export function withUniqueSuffix(filename, suffix) {
|
|
37
|
+
const dot = filename.lastIndexOf('.');
|
|
38
|
+
if (dot > 0) {
|
|
39
|
+
return `${filename.slice(0, dot)}_${suffix}${filename.slice(dot)}`;
|
|
40
|
+
}
|
|
41
|
+
return `${filename}_${suffix}`;
|
|
42
|
+
}
|
|
43
|
+
/** Sanitized name with a disambiguating suffix, still within host filename byte limits. */
|
|
44
|
+
export function appendUniqueSuffix(sanitized, suffix) {
|
|
45
|
+
const dot = sanitized.lastIndexOf('.');
|
|
46
|
+
const hasExtension = dot > 0;
|
|
47
|
+
const base = hasExtension ? sanitized.slice(0, dot) : sanitized;
|
|
48
|
+
const extension = hasExtension ? sanitized.slice(dot) : '';
|
|
49
|
+
const suffixPart = `_${suffix}`;
|
|
50
|
+
const reservedBytes = Buffer.byteLength(suffixPart, 'utf8') +
|
|
51
|
+
Buffer.byteLength(extension, 'utf8');
|
|
52
|
+
const maxBaseBytes = MAX_FILENAME_BYTES - reservedBytes;
|
|
53
|
+
const truncatedBase = maxBaseBytes > 0
|
|
54
|
+
? truncateUtf8Bytes(base, maxBaseBytes)
|
|
55
|
+
: EMPTY_SANITIZED_FILENAME;
|
|
56
|
+
const suffixed = hasExtension
|
|
57
|
+
? `${truncatedBase || EMPTY_SANITIZED_FILENAME}${suffixPart}${extension}`
|
|
58
|
+
: `${truncatedBase || EMPTY_SANITIZED_FILENAME}${suffixPart}`;
|
|
59
|
+
return finalizeSegment(suffixed);
|
|
60
|
+
}
|
|
61
|
+
function isHighSurrogate(codePoint) {
|
|
62
|
+
return codePoint >= 0xd800 && codePoint <= 0xdbff;
|
|
63
|
+
}
|
|
64
|
+
function isLowSurrogate(codePoint) {
|
|
65
|
+
return codePoint >= 0xdc00 && codePoint <= 0xdfff;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Truncate a string to at most `byteLength` UTF-8 bytes without splitting code points.
|
|
69
|
+
* Ported from truncate-utf8-bytes (dependency of sanitize-filename).
|
|
70
|
+
*/
|
|
71
|
+
function truncateUtf8Bytes(input, byteLength) {
|
|
72
|
+
let curByteLength = 0;
|
|
73
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
74
|
+
const codePoint = input.charCodeAt(i);
|
|
75
|
+
let segment = input.charAt(i);
|
|
76
|
+
if (isHighSurrogate(codePoint) && isLowSurrogate(input.charCodeAt(i + 1))) {
|
|
77
|
+
i += 1;
|
|
78
|
+
segment += input.charAt(i);
|
|
79
|
+
}
|
|
80
|
+
const segmentBytes = Buffer.byteLength(segment, 'utf8');
|
|
81
|
+
curByteLength += segmentBytes;
|
|
82
|
+
if (curByteLength === byteLength) {
|
|
83
|
+
return input.slice(0, i + 1);
|
|
84
|
+
}
|
|
85
|
+
if (curByteLength > byteLength) {
|
|
86
|
+
return input.slice(0, i - segment.length + 1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return input;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Strip trailing spaces and dots (invalid on Windows). Avoids regex backtracking (CWE-1333).
|
|
93
|
+
* Ported from sanitize-filename.
|
|
94
|
+
*/
|
|
95
|
+
function replaceTrailingDotsAndSpaces(input, replacement) {
|
|
96
|
+
let end = input.length;
|
|
97
|
+
while (end > 0 && (input[end - 1] === '.' || input[end - 1] === ' ')) {
|
|
98
|
+
end -= 1;
|
|
99
|
+
}
|
|
100
|
+
return end < input.length ? input.slice(0, end) + replacement : input;
|
|
101
|
+
}
|
|
102
|
+
function stripWith(input, pattern, replacement = '') {
|
|
103
|
+
return input.replace(pattern, replacement);
|
|
104
|
+
}
|
|
105
|
+
function finalizeSegment(input) {
|
|
106
|
+
const truncated = truncateUtf8Bytes(input, MAX_FILENAME_BYTES);
|
|
107
|
+
return truncated || EMPTY_SANITIZED_FILENAME;
|
|
108
|
+
}
|
|
109
|
+
function sanitizeForWindows(name) {
|
|
110
|
+
let sanitized = stripWith(name, WINDOWS_ILLEGAL_RE);
|
|
111
|
+
sanitized = stripWith(sanitized, CONTROL_RE);
|
|
112
|
+
sanitized = stripWith(sanitized, RESERVED_DOTS_RE);
|
|
113
|
+
sanitized = stripWith(sanitized, WINDOWS_RESERVED_RE);
|
|
114
|
+
sanitized = replaceTrailingDotsAndSpaces(sanitized, '');
|
|
115
|
+
return finalizeSegment(sanitized);
|
|
116
|
+
}
|
|
117
|
+
function sanitizeForDarwin(name) {
|
|
118
|
+
let sanitized = stripWith(name, POSIX_PATH_SEP_RE);
|
|
119
|
+
sanitized = stripWith(sanitized, DARWIN_ILLEGAL_RE);
|
|
120
|
+
sanitized = stripWith(sanitized, CONTROL_RE);
|
|
121
|
+
sanitized = stripWith(sanitized, RESERVED_DOTS_RE);
|
|
122
|
+
return finalizeSegment(sanitized);
|
|
123
|
+
}
|
|
124
|
+
function sanitizeForPosix(name) {
|
|
125
|
+
let sanitized = stripWith(name, POSIX_PATH_SEP_RE);
|
|
126
|
+
sanitized = stripWith(sanitized, CONTROL_RE);
|
|
127
|
+
sanitized = stripWith(sanitized, RESERVED_DOTS_RE);
|
|
128
|
+
return finalizeSegment(sanitized);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=sanitize-local-filename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-local-filename.js","sourceRoot":"","sources":["../../../../../src/services/ios/afc/sanitize-local-filename.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-ios-remotexpc",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"main": "build/src/index.js",
|
|
5
5
|
"types": "build/src/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
},
|
|
101
101
|
"dependencies": {
|
|
102
102
|
"@appium/strongbox": "^1.0.0-rc.1",
|
|
103
|
-
"@appium/support": "^7.
|
|
103
|
+
"@appium/support": "^7.2.2",
|
|
104
104
|
"@xmldom/xmldom": "^0.x",
|
|
105
105
|
"appium-ios-tuntap": "^0.x",
|
|
106
106
|
"async-lock": "^1.4.1",
|
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
} from './constants.js';
|
|
33
33
|
import { AfcError, AfcFileMode, AfcOpcode } from './enums.js';
|
|
34
34
|
import { AfcConnectionError } from './errors.js';
|
|
35
|
+
import { PullLocalNameAllocator } from './pull-local-name-allocator.js';
|
|
35
36
|
import { createAfcReadStream, createAfcWriteStream } from './stream-utils.js';
|
|
36
37
|
|
|
37
38
|
const log = getLogger('AfcService');
|
|
@@ -388,13 +389,23 @@ export class AfcService {
|
|
|
388
389
|
throw new Error(`Remote path does not exist: ${remoteSrc}`);
|
|
389
390
|
}
|
|
390
391
|
|
|
392
|
+
const localNames = new PullLocalNameAllocator(
|
|
393
|
+
(localPath) => this._localPathExists(localPath),
|
|
394
|
+
overwrite,
|
|
395
|
+
);
|
|
396
|
+
|
|
391
397
|
const pullSingleFile = async (
|
|
392
398
|
remoteFilePath: string,
|
|
393
399
|
localFilePath: string,
|
|
400
|
+
nameAllocated = false,
|
|
394
401
|
): Promise<void> => {
|
|
395
402
|
log.debug(`Pulling file from '${remoteFilePath}' to '${localFilePath}'`);
|
|
396
403
|
|
|
397
|
-
if (
|
|
404
|
+
if (
|
|
405
|
+
!nameAllocated &&
|
|
406
|
+
!overwrite &&
|
|
407
|
+
(await this._localPathExists(localFilePath))
|
|
408
|
+
) {
|
|
398
409
|
throw new Error(`Local file already exists: ${localFilePath}`);
|
|
399
410
|
}
|
|
400
411
|
|
|
@@ -408,18 +419,21 @@ export class AfcService {
|
|
|
408
419
|
const isDir = await this.isdir(remoteSrc);
|
|
409
420
|
|
|
410
421
|
if (!isDir) {
|
|
411
|
-
const
|
|
422
|
+
const remoteBaseName = path.posix.basename(remoteSrc);
|
|
412
423
|
|
|
413
|
-
if (match && !minimatch(
|
|
424
|
+
if (match && !minimatch(remoteBaseName, match)) {
|
|
414
425
|
return;
|
|
415
426
|
}
|
|
416
427
|
|
|
417
428
|
const localDstIsDirectory = await this._isLocalDirectory(localDst);
|
|
418
429
|
const targetPath = localDstIsDirectory
|
|
419
|
-
? path.join(
|
|
430
|
+
? path.join(
|
|
431
|
+
localDst,
|
|
432
|
+
await localNames.allocate(localDst, remoteBaseName),
|
|
433
|
+
)
|
|
420
434
|
: localDst;
|
|
421
435
|
|
|
422
|
-
await pullSingleFile(remoteSrc, targetPath);
|
|
436
|
+
await pullSingleFile(remoteSrc, targetPath, localDstIsDirectory);
|
|
423
437
|
return;
|
|
424
438
|
}
|
|
425
439
|
|
|
@@ -435,6 +449,7 @@ export class AfcService {
|
|
|
435
449
|
match,
|
|
436
450
|
overwrite,
|
|
437
451
|
callback: onPullProgress,
|
|
452
|
+
localNames,
|
|
438
453
|
});
|
|
439
454
|
}
|
|
440
455
|
|
|
@@ -618,10 +633,21 @@ export class AfcService {
|
|
|
618
633
|
private async _pullRecursiveInternal(
|
|
619
634
|
remoteSrcDir: string,
|
|
620
635
|
localDstDir: string,
|
|
621
|
-
options?: Omit<PullOptions, 'recursive'
|
|
636
|
+
options?: Omit<PullOptions, 'recursive'> & {
|
|
637
|
+
localNames: PullLocalNameAllocator;
|
|
638
|
+
},
|
|
622
639
|
relativePath = '',
|
|
623
640
|
): Promise<void> {
|
|
624
|
-
const {
|
|
641
|
+
const {
|
|
642
|
+
match,
|
|
643
|
+
overwrite = true,
|
|
644
|
+
callback: onPullProgress,
|
|
645
|
+
localNames,
|
|
646
|
+
} = options ?? {};
|
|
647
|
+
|
|
648
|
+
if (!localNames) {
|
|
649
|
+
throw new Error('PullLocalNameAllocator is required for recursive pull');
|
|
650
|
+
}
|
|
625
651
|
|
|
626
652
|
let localDirPath: string;
|
|
627
653
|
if (!relativePath) {
|
|
@@ -643,9 +669,12 @@ export class AfcService {
|
|
|
643
669
|
}
|
|
644
670
|
}
|
|
645
671
|
|
|
646
|
-
const
|
|
672
|
+
const remoteBaseName = path.posix.basename(remoteSrcDir);
|
|
647
673
|
localDirPath = localDstIsDirectory
|
|
648
|
-
? path.join(
|
|
674
|
+
? path.join(
|
|
675
|
+
localDstDir,
|
|
676
|
+
await localNames.allocate(localDstDir, remoteBaseName),
|
|
677
|
+
)
|
|
649
678
|
: localDstDir;
|
|
650
679
|
} else {
|
|
651
680
|
localDirPath = localDstDir;
|
|
@@ -675,11 +704,12 @@ export class AfcService {
|
|
|
675
704
|
const entryRelativePath = relativePath
|
|
676
705
|
? path.posix.join(relativePath, entry)
|
|
677
706
|
: entry;
|
|
707
|
+
const localEntryName = await localNames.allocate(localDirPath, entry);
|
|
678
708
|
|
|
679
709
|
if (await this.isdir(entryPath)) {
|
|
680
710
|
await this._pullRecursiveInternal(
|
|
681
711
|
entryPath,
|
|
682
|
-
path.join(localDirPath,
|
|
712
|
+
path.join(localDirPath, localEntryName),
|
|
683
713
|
options,
|
|
684
714
|
entryRelativePath,
|
|
685
715
|
);
|
|
@@ -690,11 +720,7 @@ export class AfcService {
|
|
|
690
720
|
|
|
691
721
|
await ensureLocalDir();
|
|
692
722
|
|
|
693
|
-
const targetPath = path.join(localDirPath,
|
|
694
|
-
if (!overwrite && (await this._localPathExists(targetPath))) {
|
|
695
|
-
throw new Error(`Local file already exists: ${targetPath}`);
|
|
696
|
-
}
|
|
697
|
-
|
|
723
|
+
const targetPath = path.join(localDirPath, localEntryName);
|
|
698
724
|
await this._pullFile(entryPath, targetPath);
|
|
699
725
|
|
|
700
726
|
if (onPullProgress) {
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { plist } from '@appium/support';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import fsp from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
|
|
8
|
+
import { getLogger } from '../../../lib/logger.js';
|
|
9
|
+
|
|
10
|
+
const log = getLogger('LocalFilesystemCase');
|
|
11
|
+
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
|
|
14
|
+
const caseSensitivityByDevice = new Map<string, boolean>();
|
|
15
|
+
|
|
16
|
+
/** Subset of keys returned by `diskutil info -plist`. */
|
|
17
|
+
export interface DiskutilInfoPlist {
|
|
18
|
+
FilesystemName?: string;
|
|
19
|
+
FilesystemUserVisibleName?: string;
|
|
20
|
+
VolumeName?: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Whether distinct path segments that differ only by letter case collide on `dir`.
|
|
26
|
+
*
|
|
27
|
+
* On macOS, uses `diskutil info -plist` for the volume backing `dir`. Results are
|
|
28
|
+
* cached per device identifier.
|
|
29
|
+
*/
|
|
30
|
+
export async function isCaseSensitiveDirectory(dir: string): Promise<boolean> {
|
|
31
|
+
const resolved = await fsp.realpath(dir).catch(() => path.resolve(dir));
|
|
32
|
+
|
|
33
|
+
let caseSensitive: boolean;
|
|
34
|
+
switch (os.platform()) {
|
|
35
|
+
case 'win32':
|
|
36
|
+
caseSensitive = false;
|
|
37
|
+
break;
|
|
38
|
+
case 'linux':
|
|
39
|
+
caseSensitive = true;
|
|
40
|
+
break;
|
|
41
|
+
case 'darwin':
|
|
42
|
+
try {
|
|
43
|
+
caseSensitive = await getDarwinCaseSensitivity(resolved);
|
|
44
|
+
} catch (err) {
|
|
45
|
+
log.info(
|
|
46
|
+
`Could not determine case sensitivity for '${resolved}'; assuming case-insensitive:`,
|
|
47
|
+
err,
|
|
48
|
+
);
|
|
49
|
+
caseSensitive = false;
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
default:
|
|
53
|
+
caseSensitive = true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return caseSensitive;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Derive case sensitivity from a parsed `diskutil info -plist` object.
|
|
61
|
+
*
|
|
62
|
+
* Case-sensitive APFS reports `FilesystemName: Case-sensitive APFS` and/or
|
|
63
|
+
* `FilesystemUserVisibleName: APFS (Case-sensitive)`. Default APFS/HFS+ installs are
|
|
64
|
+
* case-insensitive when not labeled otherwise.
|
|
65
|
+
*/
|
|
66
|
+
export function parseDiskutilInfoPlist(info: DiskutilInfoPlist): boolean {
|
|
67
|
+
const explicit = getExplicitCaseSensitiveField(info);
|
|
68
|
+
if (explicit !== undefined) {
|
|
69
|
+
return explicit;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const filesystemName = stringField(info.FilesystemName);
|
|
73
|
+
const visibleName = stringField(info.FilesystemUserVisibleName);
|
|
74
|
+
|
|
75
|
+
for (const value of [filesystemName, visibleName]) {
|
|
76
|
+
if (!value) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (/case-insensitive/i.test(value)) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
if (/case-sensitive/i.test(value)) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (
|
|
88
|
+
filesystemName?.includes('HFS') &&
|
|
89
|
+
!/case-sensitive/i.test(filesystemName)
|
|
90
|
+
) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (filesystemName === 'APFS' || visibleName === 'APFS') {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
throw new Error(
|
|
99
|
+
'diskutil info plist did not include recognizable case-sensitivity details',
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** @internal Reset cached probe results (unit tests only). */
|
|
104
|
+
export function clearCaseSensitivityCache(): void {
|
|
105
|
+
caseSensitivityByDevice.clear();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function getDarwinCaseSensitivity(dir: string): Promise<boolean> {
|
|
109
|
+
const device = await getDeviceIdentifierForPath(dir);
|
|
110
|
+
const cached = caseSensitivityByDevice.get(device);
|
|
111
|
+
if (cached !== undefined) {
|
|
112
|
+
return cached;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const { stdout } = await execFileAsync(
|
|
116
|
+
'diskutil',
|
|
117
|
+
['info', '-plist', device],
|
|
118
|
+
{
|
|
119
|
+
encoding: 'utf8',
|
|
120
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
121
|
+
},
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
const diskInfo = plist.parsePlist(stdout) as DiskutilInfoPlist;
|
|
125
|
+
const caseSensitive = parseDiskutilInfoPlist(diskInfo);
|
|
126
|
+
caseSensitivityByDevice.set(device, caseSensitive);
|
|
127
|
+
return caseSensitive;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function getDeviceIdentifierForPath(dir: string): Promise<string> {
|
|
131
|
+
const { stdout } = await execFileAsync('df', ['-P', dir], {
|
|
132
|
+
encoding: 'utf8',
|
|
133
|
+
});
|
|
134
|
+
const lines = stdout.trim().split('\n');
|
|
135
|
+
const dataLine = lines[lines.length - 1];
|
|
136
|
+
if (!dataLine) {
|
|
137
|
+
throw new Error(`df produced no output for '${dir}'`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const devicePath = dataLine.split(/\s+/)[0];
|
|
141
|
+
if (!devicePath?.startsWith('/dev/')) {
|
|
142
|
+
throw new Error(`Unexpected df device for '${dir}': ${devicePath ?? ''}`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return devicePath.slice('/dev/'.length);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function getExplicitCaseSensitiveField(
|
|
149
|
+
info: DiskutilInfoPlist,
|
|
150
|
+
): boolean | undefined {
|
|
151
|
+
for (const [key, value] of Object.entries(info)) {
|
|
152
|
+
if (!/case-sensitive/i.test(key)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (typeof value === 'boolean') {
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
if (typeof value === 'string') {
|
|
159
|
+
const normalized = value.toLowerCase();
|
|
160
|
+
if (normalized === 'yes' || normalized === 'true') {
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
if (normalized === 'no' || normalized === 'false') {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function stringField(value: unknown): string | undefined {
|
|
172
|
+
return typeof value === 'string' ? value : undefined;
|
|
173
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { isCaseSensitiveDirectory } from './local-filesystem-case.js';
|
|
5
|
+
import {
|
|
6
|
+
appendUniqueSuffix,
|
|
7
|
+
sanitizeLocalFilename,
|
|
8
|
+
} from './sanitize-local-filename.js';
|
|
9
|
+
|
|
10
|
+
const MAX_ALLOCATION_ATTEMPTS = 100;
|
|
11
|
+
|
|
12
|
+
export type CaseSensitiveDirectoryCheck = (dir: string) => Promise<boolean>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolves sanitized local path segment names during a single AFC pull.
|
|
16
|
+
* Adds a UUID-based suffix when the sanitized name is already taken in this pull, or
|
|
17
|
+
* when `overwrite` is false and a file already exists at that path on disk.
|
|
18
|
+
*/
|
|
19
|
+
export class PullLocalNameAllocator {
|
|
20
|
+
private readonly usedByDir = new Map<string, Set<string>>();
|
|
21
|
+
private readonly caseSensitiveByDir = new Map<string, boolean>();
|
|
22
|
+
|
|
23
|
+
constructor(
|
|
24
|
+
private readonly pathExists: (localPath: string) => Promise<boolean>,
|
|
25
|
+
private readonly overwrite: boolean,
|
|
26
|
+
private readonly checkCaseSensitive: CaseSensitiveDirectoryCheck = isCaseSensitiveDirectory,
|
|
27
|
+
) {}
|
|
28
|
+
|
|
29
|
+
async allocate(parentDir: string, remoteSegment: string): Promise<string> {
|
|
30
|
+
const sanitized = sanitizeLocalFilename(remoteSegment);
|
|
31
|
+
|
|
32
|
+
for (let attempt = 0; attempt < MAX_ALLOCATION_ATTEMPTS; attempt += 1) {
|
|
33
|
+
const candidate =
|
|
34
|
+
attempt === 0
|
|
35
|
+
? sanitized
|
|
36
|
+
: appendUniqueSuffix(sanitized, randomSuffix());
|
|
37
|
+
|
|
38
|
+
if (!(await this.hasClash(parentDir, candidate))) {
|
|
39
|
+
this.register(parentDir, candidate);
|
|
40
|
+
return candidate;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
throw new Error(
|
|
45
|
+
`Could not allocate a unique local name for remote segment '${remoteSegment}'`,
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private async hasClash(parentDir: string, name: string): Promise<boolean> {
|
|
50
|
+
if (await this.isUsedInPull(parentDir, name)) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
if (!this.overwrite) {
|
|
54
|
+
return this.pathExists(path.join(parentDir, name));
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private async isUsedInPull(
|
|
60
|
+
parentDir: string,
|
|
61
|
+
name: string,
|
|
62
|
+
): Promise<boolean> {
|
|
63
|
+
const used = this.usedByDir.get(parentDir);
|
|
64
|
+
if (!used) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
for (const existing of used) {
|
|
68
|
+
if (await this.namesCollide(parentDir, existing, name)) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private async namesCollide(
|
|
76
|
+
parentDir: string,
|
|
77
|
+
a: string,
|
|
78
|
+
b: string,
|
|
79
|
+
): Promise<boolean> {
|
|
80
|
+
if (await this.isCaseSensitiveForDir(parentDir)) {
|
|
81
|
+
return a === b;
|
|
82
|
+
}
|
|
83
|
+
return a.toLowerCase() === b.toLowerCase();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private async isCaseSensitiveForDir(parentDir: string): Promise<boolean> {
|
|
87
|
+
let caseSensitive = this.caseSensitiveByDir.get(parentDir);
|
|
88
|
+
if (caseSensitive === undefined) {
|
|
89
|
+
caseSensitive = await this.checkCaseSensitive(parentDir);
|
|
90
|
+
this.caseSensitiveByDir.set(parentDir, caseSensitive);
|
|
91
|
+
}
|
|
92
|
+
return caseSensitive;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private register(parentDir: string, name: string): void {
|
|
96
|
+
let used = this.usedByDir.get(parentDir);
|
|
97
|
+
if (!used) {
|
|
98
|
+
used = new Set();
|
|
99
|
+
this.usedByDir.set(parentDir, used);
|
|
100
|
+
}
|
|
101
|
+
used.add(name);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function randomSuffix(): string {
|
|
106
|
+
return randomUUID().replace(/-/g, '').slice(0, 8);
|
|
107
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
|
|
3
|
+
/** Fallback when a remote name has no safe local characters after sanitization. */
|
|
4
|
+
export const EMPTY_SANITIZED_FILENAME = '_';
|
|
5
|
+
|
|
6
|
+
const MAX_FILENAME_BYTES = 255;
|
|
7
|
+
|
|
8
|
+
/** C0 and C1 Unicode control characters. */
|
|
9
|
+
// eslint-disable-next-line no-control-regex -- intentional filename sanitization
|
|
10
|
+
const CONTROL_RE = /[\x00-\x1f\x80-\x9f]/g;
|
|
11
|
+
|
|
12
|
+
/** Characters invalid on Windows filenames. */
|
|
13
|
+
const WINDOWS_ILLEGAL_RE = /[/?<>\\:*|"]/g;
|
|
14
|
+
|
|
15
|
+
/** Path separator on Unix-like systems (and macOS). */
|
|
16
|
+
const POSIX_PATH_SEP_RE = /\//g;
|
|
17
|
+
|
|
18
|
+
/** Colon is invalid in macOS / HFS+ / APFS file names. */
|
|
19
|
+
const DARWIN_ILLEGAL_RE = /:/g;
|
|
20
|
+
|
|
21
|
+
/** Unix reserved single-segment names (`.` and `..`). */
|
|
22
|
+
const RESERVED_DOTS_RE = /^\.+$/;
|
|
23
|
+
|
|
24
|
+
/** Windows reserved device names (case-insensitive, optional extension). */
|
|
25
|
+
const WINDOWS_RESERVED_RE = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Sanitize a single path segment from the device for use on the local filesystem.
|
|
29
|
+
*
|
|
30
|
+
* Rules are chosen from {@link os.platform} at pull time (the host writing files).
|
|
31
|
+
*/
|
|
32
|
+
export function sanitizeLocalFilename(name: string): string {
|
|
33
|
+
switch (os.platform()) {
|
|
34
|
+
case 'win32':
|
|
35
|
+
return sanitizeForWindows(name);
|
|
36
|
+
case 'darwin':
|
|
37
|
+
return sanitizeForDarwin(name);
|
|
38
|
+
default:
|
|
39
|
+
return sanitizeForPosix(name);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Insert a unique suffix before the file extension (or at the end when there is none).
|
|
45
|
+
*/
|
|
46
|
+
export function withUniqueSuffix(filename: string, suffix: string): string {
|
|
47
|
+
const dot = filename.lastIndexOf('.');
|
|
48
|
+
if (dot > 0) {
|
|
49
|
+
return `${filename.slice(0, dot)}_${suffix}${filename.slice(dot)}`;
|
|
50
|
+
}
|
|
51
|
+
return `${filename}_${suffix}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Sanitized name with a disambiguating suffix, still within host filename byte limits. */
|
|
55
|
+
export function appendUniqueSuffix(sanitized: string, suffix: string): string {
|
|
56
|
+
const dot = sanitized.lastIndexOf('.');
|
|
57
|
+
const hasExtension = dot > 0;
|
|
58
|
+
const base = hasExtension ? sanitized.slice(0, dot) : sanitized;
|
|
59
|
+
const extension = hasExtension ? sanitized.slice(dot) : '';
|
|
60
|
+
const suffixPart = `_${suffix}`;
|
|
61
|
+
|
|
62
|
+
const reservedBytes =
|
|
63
|
+
Buffer.byteLength(suffixPart, 'utf8') +
|
|
64
|
+
Buffer.byteLength(extension, 'utf8');
|
|
65
|
+
const maxBaseBytes = MAX_FILENAME_BYTES - reservedBytes;
|
|
66
|
+
|
|
67
|
+
const truncatedBase =
|
|
68
|
+
maxBaseBytes > 0
|
|
69
|
+
? truncateUtf8Bytes(base, maxBaseBytes)
|
|
70
|
+
: EMPTY_SANITIZED_FILENAME;
|
|
71
|
+
|
|
72
|
+
const suffixed = hasExtension
|
|
73
|
+
? `${truncatedBase || EMPTY_SANITIZED_FILENAME}${suffixPart}${extension}`
|
|
74
|
+
: `${truncatedBase || EMPTY_SANITIZED_FILENAME}${suffixPart}`;
|
|
75
|
+
|
|
76
|
+
return finalizeSegment(suffixed);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function isHighSurrogate(codePoint: number): boolean {
|
|
80
|
+
return codePoint >= 0xd800 && codePoint <= 0xdbff;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function isLowSurrogate(codePoint: number): boolean {
|
|
84
|
+
return codePoint >= 0xdc00 && codePoint <= 0xdfff;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Truncate a string to at most `byteLength` UTF-8 bytes without splitting code points.
|
|
89
|
+
* Ported from truncate-utf8-bytes (dependency of sanitize-filename).
|
|
90
|
+
*/
|
|
91
|
+
function truncateUtf8Bytes(input: string, byteLength: number): string {
|
|
92
|
+
let curByteLength = 0;
|
|
93
|
+
|
|
94
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
95
|
+
const codePoint = input.charCodeAt(i);
|
|
96
|
+
let segment = input.charAt(i);
|
|
97
|
+
|
|
98
|
+
if (isHighSurrogate(codePoint) && isLowSurrogate(input.charCodeAt(i + 1))) {
|
|
99
|
+
i += 1;
|
|
100
|
+
segment += input.charAt(i);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const segmentBytes = Buffer.byteLength(segment, 'utf8');
|
|
104
|
+
curByteLength += segmentBytes;
|
|
105
|
+
|
|
106
|
+
if (curByteLength === byteLength) {
|
|
107
|
+
return input.slice(0, i + 1);
|
|
108
|
+
}
|
|
109
|
+
if (curByteLength > byteLength) {
|
|
110
|
+
return input.slice(0, i - segment.length + 1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return input;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Strip trailing spaces and dots (invalid on Windows). Avoids regex backtracking (CWE-1333).
|
|
119
|
+
* Ported from sanitize-filename.
|
|
120
|
+
*/
|
|
121
|
+
function replaceTrailingDotsAndSpaces(
|
|
122
|
+
input: string,
|
|
123
|
+
replacement: string,
|
|
124
|
+
): string {
|
|
125
|
+
let end = input.length;
|
|
126
|
+
while (end > 0 && (input[end - 1] === '.' || input[end - 1] === ' ')) {
|
|
127
|
+
end -= 1;
|
|
128
|
+
}
|
|
129
|
+
return end < input.length ? input.slice(0, end) + replacement : input;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function stripWith(input: string, pattern: RegExp, replacement = ''): string {
|
|
133
|
+
return input.replace(pattern, replacement);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function finalizeSegment(input: string): string {
|
|
137
|
+
const truncated = truncateUtf8Bytes(input, MAX_FILENAME_BYTES);
|
|
138
|
+
return truncated || EMPTY_SANITIZED_FILENAME;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function sanitizeForWindows(name: string): string {
|
|
142
|
+
let sanitized = stripWith(name, WINDOWS_ILLEGAL_RE);
|
|
143
|
+
sanitized = stripWith(sanitized, CONTROL_RE);
|
|
144
|
+
sanitized = stripWith(sanitized, RESERVED_DOTS_RE);
|
|
145
|
+
sanitized = stripWith(sanitized, WINDOWS_RESERVED_RE);
|
|
146
|
+
sanitized = replaceTrailingDotsAndSpaces(sanitized, '');
|
|
147
|
+
return finalizeSegment(sanitized);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function sanitizeForDarwin(name: string): string {
|
|
151
|
+
let sanitized = stripWith(name, POSIX_PATH_SEP_RE);
|
|
152
|
+
sanitized = stripWith(sanitized, DARWIN_ILLEGAL_RE);
|
|
153
|
+
sanitized = stripWith(sanitized, CONTROL_RE);
|
|
154
|
+
sanitized = stripWith(sanitized, RESERVED_DOTS_RE);
|
|
155
|
+
return finalizeSegment(sanitized);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function sanitizeForPosix(name: string): string {
|
|
159
|
+
let sanitized = stripWith(name, POSIX_PATH_SEP_RE);
|
|
160
|
+
sanitized = stripWith(sanitized, CONTROL_RE);
|
|
161
|
+
sanitized = stripWith(sanitized, RESERVED_DOTS_RE);
|
|
162
|
+
return finalizeSegment(sanitized);
|
|
163
|
+
}
|