Skip to content

Commit a9b4e7b

Browse files
jrainlaujrainliu
and
jrainliu
authored
fix: fix symlink pointing error in filesystem.insertLink (#301)
Co-authored-by: jrainliu <[email protected]>
1 parent 896ed4a commit a9b4e7b

File tree

6 files changed

+26
-3
lines changed

6 files changed

+26
-3
lines changed

lib/filesystem.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ class Filesystem {
9999
}
100100

101101
insertLink (p) {
102-
const link = path.relative(fs.realpathSync(this.src), fs.realpathSync(p))
102+
const symlink = fs.readlinkSync(p)
103+
const parentPath = path.dirname(p)
104+
const link = path.relative(fs.realpathSync(this.src), path.join(parentPath, symlink))
103105
if (link.substr(0, 2) === '..') {
104106
throw new Error(`${p}: file "${link}" links out of the package`)
105107
}

test/api-spec.js

+5
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ describe('api', function () {
8181
asar.extractAll('test/input/extractthis-unpack-dir.asar', 'tmp/extractthis-unpack-dir-api/')
8282
return compDirs('tmp/extractthis-unpack-dir-api/', 'test/expected/extractthis')
8383
})
84+
it('should extract an archive with symlink', async () => {
85+
await asar.createPackageWithOptions('test/input/packthis-with-symlink/', 'tmp/packthis-with-symlink.asar', { dot: false })
86+
asar.extractAll('tmp/packthis-with-symlink.asar', 'tmp/packthis-with-symlink/')
87+
return compFiles('tmp/packthis-with-symlink/real.txt', 'test/input/packthis-with-symlink/real.txt')
88+
})
8489
it('should handle multibyte characters in paths', async () => {
8590
await asar.createPackageWithOptions('test/input/packthis-unicode-path/', 'tmp/packthis-unicode-path.asar', {
8691
globOptions: {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
I AM REAL TXT FILE
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
A
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Current/real.txt

test/util/compareFiles.js

+15-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,19 @@ module.exports = async function (actualFilePath, expectedFilePath) {
77
if (process.env.ELECTRON_ASAR_SPEC_UPDATE) {
88
await fs.writeFile(expectedFilePath, await fs.readFile(actualFilePath))
99
}
10-
const [actual, expected] = await Promise.all([fs.readFile(actualFilePath, 'utf8'), fs.readFile(expectedFilePath, 'utf8')])
11-
assert.strictEqual(actual, expected)
10+
const [actualFileContent, expectedFileContent] = await Promise.all([fs.readFile(actualFilePath, 'utf8'), fs.readFile(expectedFilePath, 'utf8')])
11+
assert.strictEqual(actualFileContent, expectedFileContent)
12+
13+
const [actualIsSymlink, expectedIsSymlink] = [isSymbolicLinkSync(actualFilePath), isSymbolicLinkSync(expectedFilePath)]
14+
assert.strictEqual(actualIsSymlink, expectedIsSymlink)
15+
16+
if (actualIsSymlink && expectedIsSymlink) {
17+
const [actualSymlinkPointer, expectedSymlinkPointer] = [fs.readlinkSync(actualFilePath), fs.readlinkSync(expectedFilePath)]
18+
assert.strictEqual(actualSymlinkPointer, expectedSymlinkPointer)
19+
}
20+
}
21+
22+
function isSymbolicLinkSync (path) {
23+
const stats = fs.lstatSync(path)
24+
return stats.isSymbolicLink()
1225
}

0 commit comments

Comments
 (0)