update debian/
This commit is contained in:
parent
8244dbbb9f
commit
03705088c8
10
README.md
10
README.md
|
@ -115,6 +115,8 @@ Handlers receive 3 arguments:
|
||||||
encountered an error which prevented it from being unpacked. This occurs
|
encountered an error which prevented it from being unpacked. This occurs
|
||||||
when:
|
when:
|
||||||
- an unrecoverable fs error happens during unpacking,
|
- an unrecoverable fs error happens during unpacking,
|
||||||
|
- an entry is trying to extract into an excessively deep
|
||||||
|
location (by default, limited to 1024 subfolders),
|
||||||
- an entry has `..` in the path and `preservePaths` is not set, or
|
- an entry has `..` in the path and `preservePaths` is not set, or
|
||||||
- an entry is extracting through a symbolic link, when `preservePaths` is
|
- an entry is extracting through a symbolic link, when `preservePaths` is
|
||||||
not set.
|
not set.
|
||||||
|
@ -427,6 +429,10 @@ The following options are supported:
|
||||||
`process.umask()` to determine the default umask value, since tar will
|
`process.umask()` to determine the default umask value, since tar will
|
||||||
extract with whatever mode is provided, and let the process `umask` apply
|
extract with whatever mode is provided, and let the process `umask` apply
|
||||||
normally.
|
normally.
|
||||||
|
- `maxDepth` The maximum depth of subfolders to extract into. This
|
||||||
|
defaults to 1024. Anything deeper than the limit will raise a
|
||||||
|
warning and skip the entry. Set to `Infinity` to remove the
|
||||||
|
limitation.
|
||||||
|
|
||||||
The following options are mostly internal, but can be modified in some
|
The following options are mostly internal, but can be modified in some
|
||||||
advanced use cases, such as re-using caches between runs.
|
advanced use cases, such as re-using caches between runs.
|
||||||
|
@ -749,6 +755,10 @@ Most unpack errors will cause a `warn` event to be emitted. If the
|
||||||
`process.umask()` to determine the default umask value, since tar will
|
`process.umask()` to determine the default umask value, since tar will
|
||||||
extract with whatever mode is provided, and let the process `umask` apply
|
extract with whatever mode is provided, and let the process `umask` apply
|
||||||
normally.
|
normally.
|
||||||
|
- `maxDepth` The maximum depth of subfolders to extract into. This
|
||||||
|
defaults to 1024. Anything deeper than the limit will raise a
|
||||||
|
warning and skip the entry. Set to `Infinity` to remove the
|
||||||
|
limitation.
|
||||||
|
|
||||||
### class tar.Unpack.Sync
|
### class tar.Unpack.Sync
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
|
c*/
|
||||||
debian/node-tar.copyright
|
debian/node-tar.copyright
|
||||||
test/fixtures/unpack/
|
test/fixtures/unpack/
|
||||||
|
|
|
@ -3,18 +3,21 @@ Maintainer: OpenKylin Developers <packaging@lists.openkylin.top>
|
||||||
Section: javascript
|
Section: javascript
|
||||||
Testsuite: autopkgtest-pkg-nodejs
|
Testsuite: autopkgtest-pkg-nodejs
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Build-Depends: debhelper-compat (= 13),
|
Build-Depends:
|
||||||
dh-sequence-nodejs,
|
debhelper-compat (= 13)
|
||||||
node-chownr <!nocheck>,
|
, dh-sequence-nodejs
|
||||||
node-end-of-stream <!nocheck>,
|
, dh-nodejs
|
||||||
node-minipass <!nocheck>,
|
, node-chownr <!nocheck>
|
||||||
node-mkdirp (>= 1),
|
, node-end-of-stream <!nocheck>
|
||||||
node-mutate-fs <!nocheck>,
|
, node-mkdirp (>= 1)
|
||||||
node-rimraf <!nocheck>,
|
, node-minipass <!nocheck>
|
||||||
node-tap <!nocheck>,
|
, node-mutate-fs <!nocheck>
|
||||||
node-tar-stream <!nocheck>,
|
, node-nock <!nocheck>
|
||||||
node-yallist (>= 4.0~) <!nocheck>
|
, node-rimraf <!nocheck>
|
||||||
Standards-Version: 4.6.0
|
, node-tap (>= 15) <!nocheck>
|
||||||
|
, node-tar-stream <!nocheck>
|
||||||
|
, node-yallist (>= 4.0~) <!nocheck>
|
||||||
|
Standards-Version: 4.6.2
|
||||||
Vcs-Browser: https://gitee.com/openkylin/node-tar
|
Vcs-Browser: https://gitee.com/openkylin/node-tar
|
||||||
Vcs-Git: https://gitee.com/openkylin/node-tar.git
|
Vcs-Git: https://gitee.com/openkylin/node-tar.git
|
||||||
Homepage: https://github.com/npm/node-tar
|
Homepage: https://github.com/npm/node-tar
|
||||||
|
@ -22,13 +25,16 @@ Rules-Requires-Root: no
|
||||||
|
|
||||||
Package: node-tar
|
Package: node-tar
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends: node-chownr,
|
Depends:
|
||||||
node-minipass,
|
${misc:Depends}
|
||||||
node-mkdirp (>= 1),
|
, node-chownr
|
||||||
node-safe-buffer,
|
, node-mkdirp (>= 1)
|
||||||
node-yallist (>= 4.0~),
|
, node-minipass
|
||||||
${misc:Depends}
|
, node-safe-buffer
|
||||||
Provides: ${nodejs:Provides}
|
, node-yallist (>= 4.0~)
|
||||||
|
Provides:
|
||||||
|
${nodejs:Provides}
|
||||||
|
Multi-Arch: foreign
|
||||||
Description: read and write portable tar archives module for Node.js
|
Description: read and write portable tar archives module for Node.js
|
||||||
node-tar is able to read and write tar archives generated by
|
node-tar is able to read and write tar archives generated by
|
||||||
bsdtar, gnutar, solaris posix tar, and "Schilly" tar.
|
bsdtar, gnutar, solaris posix tar, and "Schilly" tar.
|
||||||
|
|
|
@ -1,2 +1,16 @@
|
||||||
|
[DEFAULT]
|
||||||
|
# The default name for the upstream branch is "upstream".
|
||||||
|
# Change it if the name is different (for instance, "master").
|
||||||
|
upstream-branch=upstream
|
||||||
|
# The default name for the Debian branch is "master".
|
||||||
|
# Change it if the name is different (for instance, "debian/unstable").
|
||||||
|
debian-branch=master
|
||||||
|
# git-import-orig uses the following names for the upstream tags.
|
||||||
|
# Change the value if you are not using git-import-orig
|
||||||
|
upstream-tag=upstream/%(version)s
|
||||||
|
# Always use pristine-tar.
|
||||||
|
pristine-tar=True
|
||||||
|
component=['fs-minipass', 'types-tar']
|
||||||
|
|
||||||
[import-orig]
|
[import-orig]
|
||||||
filter=[ '.gitattributes', '.gitignore', '.travis.yml', '.git*' ]
|
filter=[ '.gitattributes', '.gitignore', '.travis.yml', '.git*' ]
|
||||||
|
|
|
@ -10,3 +10,7 @@
|
||||||
override_dh_fixperms:
|
override_dh_fixperms:
|
||||||
dh_fixperms
|
dh_fixperms
|
||||||
chmod -x debian/node-tar/usr/share/nodejs/@types/tar/*
|
chmod -x debian/node-tar/usr/share/nodejs/@types/tar/*
|
||||||
|
|
||||||
|
override_dh_installdocs:
|
||||||
|
dh_installdocs
|
||||||
|
dh_nodejs_autodocs
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
debian/tests/excluded
|
debian/tests/excluded
|
||||||
|
debian/tests/fixtures
|
||||||
debian/tests/test_modules
|
debian/tests/test_modules
|
||||||
map.js
|
map.js
|
||||||
README.md
|
README.md
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
export TAP_TIMEOUT=60
|
export TAP_TIMEOUT=60
|
||||||
export NODE_PATH=debian/tests/test_modules:node_modules
|
cp debian/tests/fixtures/excessively-deep.tar test/fixtures/ || true
|
||||||
tap `ls test/*.js|grep -v -f debian/tests/excluded`
|
tap --no-cov -R dot test/*.js
|
||||||
|
rm -f test/fixtures/excessively-deep.tar
|
||||||
|
|
|
@ -10,7 +10,7 @@ ctype=nodejs,\
|
||||||
component=fs-minipass,\
|
component=fs-minipass,\
|
||||||
dversionmangle=auto,\
|
dversionmangle=auto,\
|
||||||
filenamemangle=s/.*?(\d[\d\.-]*@ARCHIVE_EXT@)/node-fs-minipass-$1/ \
|
filenamemangle=s/.*?(\d[\d\.-]*@ARCHIVE_EXT@)/node-fs-minipass-$1/ \
|
||||||
https://github.com/npm/fs-minipass/releases .*/archive/.*/v?([\d\.]+).tar.gz checksum
|
https://github.com/npm/fs-minipass/tags .*/archive/.*/v?([\d\.]+).tar.gz checksum
|
||||||
|
|
||||||
# It is not recommended use npmregistry. Please investigate more.
|
# It is not recommended use npmregistry. Please investigate more.
|
||||||
# Take a look at https://wiki.debian.org/debian/watch/
|
# Take a look at https://wiki.debian.org/debian/watch/
|
||||||
|
|
10
index.js
10
index.js
|
@ -1,11 +1,11 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
// high-level commands
|
// high-level commands
|
||||||
exports.c = exports.create = require('./lib/create.js')
|
exports.c = exports.create = exports.Create = require('./lib/create.js')
|
||||||
exports.r = exports.replace = require('./lib/replace.js')
|
exports.r = exports.replace = exports.Replace = require('./lib/replace.js')
|
||||||
exports.t = exports.list = require('./lib/list.js')
|
exports.t = exports.list = exports.List = require('./lib/list.js')
|
||||||
exports.u = exports.update = require('./lib/update.js')
|
exports.u = exports.update = exports.Update = require('./lib/update.js')
|
||||||
exports.x = exports.extract = require('./lib/extract.js')
|
exports.x = exports.extract = exports.Extract = require('./lib/extract.js')
|
||||||
|
|
||||||
// classes
|
// classes
|
||||||
exports.Pack = require('./lib/pack.js')
|
exports.Pack = require('./lib/pack.js')
|
||||||
|
|
|
@ -48,6 +48,7 @@ const crypto = require('crypto')
|
||||||
const getFlag = require('./get-write-flag.js')
|
const getFlag = require('./get-write-flag.js')
|
||||||
const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform
|
const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform
|
||||||
const isWindows = platform === 'win32'
|
const isWindows = platform === 'win32'
|
||||||
|
const DEFAULT_MAX_DEPTH = 1024
|
||||||
|
|
||||||
// Unlinks on Windows are not atomic.
|
// Unlinks on Windows are not atomic.
|
||||||
//
|
//
|
||||||
|
@ -181,6 +182,12 @@ class Unpack extends Parser {
|
||||||
this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ?
|
this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ?
|
||||||
process.getgid() : null
|
process.getgid() : null
|
||||||
|
|
||||||
|
// prevent excessively deep nesting of subfolders
|
||||||
|
// set to `Infinity` to remove this restriction
|
||||||
|
this.maxDepth = typeof opt.maxDepth === 'number'
|
||||||
|
? opt.maxDepth
|
||||||
|
: DEFAULT_MAX_DEPTH
|
||||||
|
|
||||||
// mostly just for testing, but useful in some cases.
|
// mostly just for testing, but useful in some cases.
|
||||||
// Forcibly trigger a chown on every entry, no matter what
|
// Forcibly trigger a chown on every entry, no matter what
|
||||||
this.forceChown = opt.forceChown === true
|
this.forceChown = opt.forceChown === true
|
||||||
|
@ -238,13 +245,13 @@ class Unpack extends Parser {
|
||||||
}
|
}
|
||||||
|
|
||||||
[CHECKPATH] (entry) {
|
[CHECKPATH] (entry) {
|
||||||
|
const p = normPath(entry.path)
|
||||||
|
const parts = p.split('/')
|
||||||
|
|
||||||
if (this.strip) {
|
if (this.strip) {
|
||||||
const parts = normPath(entry.path).split('/')
|
|
||||||
if (parts.length < this.strip) {
|
if (parts.length < this.strip) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
entry.path = parts.slice(this.strip).join('/')
|
|
||||||
|
|
||||||
if (entry.type === 'Link') {
|
if (entry.type === 'Link') {
|
||||||
const linkparts = normPath(entry.linkpath).split('/')
|
const linkparts = normPath(entry.linkpath).split('/')
|
||||||
if (linkparts.length >= this.strip) {
|
if (linkparts.length >= this.strip) {
|
||||||
|
@ -253,11 +260,21 @@ class Unpack extends Parser {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
parts.splice(0, this.strip)
|
||||||
|
entry.path = parts.join('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFinite(this.maxDepth) && parts.length > this.maxDepth) {
|
||||||
|
this.warn('TAR_ENTRY_ERROR', 'path excessively deep', {
|
||||||
|
entry,
|
||||||
|
path: p,
|
||||||
|
depth: parts.length,
|
||||||
|
maxDepth: this.maxDepth,
|
||||||
|
})
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.preservePaths) {
|
if (!this.preservePaths) {
|
||||||
const p = normPath(entry.path)
|
|
||||||
const parts = p.split('/')
|
|
||||||
if (parts.includes('..') || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) {
|
if (parts.includes('..') || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) {
|
||||||
this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
|
this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
|
||||||
entry,
|
entry,
|
||||||
|
|
|
@ -551,7 +551,7 @@ t.test('truncated gzip input', t => {
|
||||||
p.write(tgz.slice(split))
|
p.write(tgz.slice(split))
|
||||||
p.end()
|
p.end()
|
||||||
t.equal(aborted, true, 'aborted writing')
|
t.equal(aborted, true, 'aborted writing')
|
||||||
t.same(warnings, ['zlib: incorrect data check'])
|
t.match(warnings, [/^zlib: /])
|
||||||
t.end()
|
t.end()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ const mkdirp = require('mkdirp')
|
||||||
const mutateFS = require('mutate-fs')
|
const mutateFS = require('mutate-fs')
|
||||||
const eos = require('end-of-stream')
|
const eos = require('end-of-stream')
|
||||||
const normPath = require('../lib/normalize-windows-path.js')
|
const normPath = require('../lib/normalize-windows-path.js')
|
||||||
|
const ReadEntry = require('../lib/read-entry.js')
|
||||||
|
|
||||||
// On Windows in particular, the "really deep folder path" file
|
// On Windows in particular, the "really deep folder path" file
|
||||||
// often tends to cause problems, which don't indicate a failure
|
// often tends to cause problems, which don't indicate a failure
|
||||||
|
@ -3233,3 +3234,63 @@ t.test('recognize C:.. as a dot path part', t => {
|
||||||
|
|
||||||
t.end()
|
t.end()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.test('excessively deep subfolder nesting', async t => {
|
||||||
|
const tf = path.resolve(fixtures, 'excessively-deep.tar')
|
||||||
|
const data = fs.readFileSync(tf)
|
||||||
|
const warnings = []
|
||||||
|
const onwarn = (c, w, { entry, path, depth, maxDepth }) =>
|
||||||
|
warnings.push([c, w, { entry, path, depth, maxDepth }])
|
||||||
|
|
||||||
|
const check = (t, maxDepth = 1024) => {
|
||||||
|
t.match(warnings, [
|
||||||
|
['TAR_ENTRY_ERROR',
|
||||||
|
'path excessively deep',
|
||||||
|
{
|
||||||
|
entry: ReadEntry,
|
||||||
|
path: /^\.(\/a){1024,}\/foo.txt$/,
|
||||||
|
depth: 222372,
|
||||||
|
maxDepth,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
])
|
||||||
|
warnings.length = 0
|
||||||
|
t.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
t.test('async', t => {
|
||||||
|
const cwd = t.testdir()
|
||||||
|
new Unpack({
|
||||||
|
cwd,
|
||||||
|
onwarn
|
||||||
|
}).on('end', () => check(t)).end(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.test('sync', t => {
|
||||||
|
const cwd = t.testdir()
|
||||||
|
new UnpackSync({
|
||||||
|
cwd,
|
||||||
|
onwarn
|
||||||
|
}).end(data)
|
||||||
|
check(t)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.test('async set md', t => {
|
||||||
|
const cwd = t.testdir()
|
||||||
|
new Unpack({
|
||||||
|
cwd,
|
||||||
|
onwarn,
|
||||||
|
maxDepth: 64,
|
||||||
|
}).on('end', () => check(t, 64)).end(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.test('sync set md', t => {
|
||||||
|
const cwd = t.testdir()
|
||||||
|
new UnpackSync({
|
||||||
|
cwd,
|
||||||
|
onwarn,
|
||||||
|
maxDepth: 64,
|
||||||
|
}).end(data)
|
||||||
|
check(t, 64)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
Loading…
Reference in New Issue