@nocobase/plugin-backup-restore 0.19.0-alpha.1

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.
Files changed (158) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +118 -0
  3. package/README.zh-CN.md +118 -0
  4. package/client.d.ts +2 -0
  5. package/client.js +1 -0
  6. package/dist/client/Configuration.d.ts +2 -0
  7. package/dist/client/DuplicatorProvider.d.ts +2 -0
  8. package/dist/client/index.d.ts +5 -0
  9. package/dist/client/index.js +1 -0
  10. package/dist/client/locale/index.d.ts +4 -0
  11. package/dist/externalVersion.js +14 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +39 -0
  14. package/dist/locale/en-US.json +44 -0
  15. package/dist/locale/ja-JP.d.ts +25 -0
  16. package/dist/locale/ja-JP.js +46 -0
  17. package/dist/locale/pt-BR.d.ts +26 -0
  18. package/dist/locale/pt-BR.js +48 -0
  19. package/dist/locale/zh-CN.json +50 -0
  20. package/dist/node_modules/@hapi/topo/lib/index.d.ts +60 -0
  21. package/dist/node_modules/@hapi/topo/lib/index.js +1 -0
  22. package/dist/node_modules/@hapi/topo/package.json +1 -0
  23. package/dist/node_modules/archiver/LICENSE +22 -0
  24. package/dist/node_modules/archiver/index.js +68 -0
  25. package/dist/node_modules/archiver/lib/core.js +974 -0
  26. package/dist/node_modules/archiver/lib/error.js +40 -0
  27. package/dist/node_modules/archiver/lib/plugins/json.js +110 -0
  28. package/dist/node_modules/archiver/lib/plugins/tar.js +167 -0
  29. package/dist/node_modules/archiver/lib/plugins/zip.js +120 -0
  30. package/dist/node_modules/archiver/node_modules/readable-stream/errors-browser.js +127 -0
  31. package/dist/node_modules/archiver/node_modules/readable-stream/errors.js +116 -0
  32. package/dist/node_modules/archiver/node_modules/readable-stream/experimentalWarning.js +17 -0
  33. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
  34. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
  35. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
  36. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_transform.js +190 -0
  37. package/dist/node_modules/archiver/node_modules/readable-stream/lib/_stream_writable.js +641 -0
  38. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
  39. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
  40. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
  41. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
  42. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
  43. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
  44. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
  45. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
  46. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  47. package/dist/node_modules/archiver/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  48. package/dist/node_modules/archiver/node_modules/readable-stream/package.json +68 -0
  49. package/dist/node_modules/archiver/node_modules/readable-stream/readable-browser.js +9 -0
  50. package/dist/node_modules/archiver/node_modules/readable-stream/readable.js +16 -0
  51. package/dist/node_modules/archiver/node_modules/string_decoder/lib/string_decoder.js +296 -0
  52. package/dist/node_modules/archiver/node_modules/string_decoder/package.json +34 -0
  53. package/dist/node_modules/archiver/node_modules/tar-stream/extract.js +257 -0
  54. package/dist/node_modules/archiver/node_modules/tar-stream/headers.js +295 -0
  55. package/dist/node_modules/archiver/node_modules/tar-stream/index.js +2 -0
  56. package/dist/node_modules/archiver/node_modules/tar-stream/pack.js +255 -0
  57. package/dist/node_modules/archiver/node_modules/tar-stream/package.json +58 -0
  58. package/dist/node_modules/archiver/node_modules/tar-stream/sandbox.js +11 -0
  59. package/dist/node_modules/archiver/package.json +1 -0
  60. package/dist/node_modules/decompress/index.js +16 -0
  61. package/dist/node_modules/decompress/license +9 -0
  62. package/dist/node_modules/decompress/node_modules/make-dir/index.js +85 -0
  63. package/dist/node_modules/decompress/node_modules/make-dir/license +9 -0
  64. package/dist/node_modules/decompress/node_modules/make-dir/node_modules/pify/index.js +84 -0
  65. package/dist/node_modules/decompress/node_modules/make-dir/node_modules/pify/license +9 -0
  66. package/dist/node_modules/decompress/node_modules/make-dir/node_modules/pify/package.json +51 -0
  67. package/dist/node_modules/decompress/node_modules/make-dir/package.json +54 -0
  68. package/dist/node_modules/decompress/package.json +1 -0
  69. package/dist/node_modules/mkdirp/LICENSE +21 -0
  70. package/dist/node_modules/mkdirp/bin/cmd.js +68 -0
  71. package/dist/node_modules/mkdirp/index.js +1 -0
  72. package/dist/node_modules/mkdirp/lib/find-made.js +29 -0
  73. package/dist/node_modules/mkdirp/lib/mkdirp-manual.js +64 -0
  74. package/dist/node_modules/mkdirp/lib/mkdirp-native.js +39 -0
  75. package/dist/node_modules/mkdirp/lib/opts-arg.js +23 -0
  76. package/dist/node_modules/mkdirp/lib/path-arg.js +29 -0
  77. package/dist/node_modules/mkdirp/lib/use-native.js +10 -0
  78. package/dist/node_modules/mkdirp/package.json +1 -0
  79. package/dist/node_modules/mkdirp/readme.markdown +266 -0
  80. package/dist/node_modules/semver/LICENSE +15 -0
  81. package/dist/node_modules/semver/bin/semver.js +197 -0
  82. package/dist/node_modules/semver/classes/comparator.js +141 -0
  83. package/dist/node_modules/semver/classes/index.js +5 -0
  84. package/dist/node_modules/semver/classes/range.js +539 -0
  85. package/dist/node_modules/semver/classes/semver.js +302 -0
  86. package/dist/node_modules/semver/functions/clean.js +6 -0
  87. package/dist/node_modules/semver/functions/cmp.js +52 -0
  88. package/dist/node_modules/semver/functions/coerce.js +52 -0
  89. package/dist/node_modules/semver/functions/compare-build.js +7 -0
  90. package/dist/node_modules/semver/functions/compare-loose.js +3 -0
  91. package/dist/node_modules/semver/functions/compare.js +5 -0
  92. package/dist/node_modules/semver/functions/diff.js +65 -0
  93. package/dist/node_modules/semver/functions/eq.js +3 -0
  94. package/dist/node_modules/semver/functions/gt.js +3 -0
  95. package/dist/node_modules/semver/functions/gte.js +3 -0
  96. package/dist/node_modules/semver/functions/inc.js +19 -0
  97. package/dist/node_modules/semver/functions/lt.js +3 -0
  98. package/dist/node_modules/semver/functions/lte.js +3 -0
  99. package/dist/node_modules/semver/functions/major.js +3 -0
  100. package/dist/node_modules/semver/functions/minor.js +3 -0
  101. package/dist/node_modules/semver/functions/neq.js +3 -0
  102. package/dist/node_modules/semver/functions/parse.js +16 -0
  103. package/dist/node_modules/semver/functions/patch.js +3 -0
  104. package/dist/node_modules/semver/functions/prerelease.js +6 -0
  105. package/dist/node_modules/semver/functions/rcompare.js +3 -0
  106. package/dist/node_modules/semver/functions/rsort.js +3 -0
  107. package/dist/node_modules/semver/functions/satisfies.js +10 -0
  108. package/dist/node_modules/semver/functions/sort.js +3 -0
  109. package/dist/node_modules/semver/functions/valid.js +6 -0
  110. package/dist/node_modules/semver/index.js +1 -0
  111. package/dist/node_modules/semver/internal/constants.js +35 -0
  112. package/dist/node_modules/semver/internal/debug.js +9 -0
  113. package/dist/node_modules/semver/internal/identifiers.js +23 -0
  114. package/dist/node_modules/semver/internal/parse-options.js +15 -0
  115. package/dist/node_modules/semver/internal/re.js +212 -0
  116. package/dist/node_modules/semver/package.json +1 -0
  117. package/dist/node_modules/semver/preload.js +2 -0
  118. package/dist/node_modules/semver/range.bnf +16 -0
  119. package/dist/node_modules/semver/ranges/gtr.js +4 -0
  120. package/dist/node_modules/semver/ranges/intersects.js +7 -0
  121. package/dist/node_modules/semver/ranges/ltr.js +4 -0
  122. package/dist/node_modules/semver/ranges/max-satisfying.js +25 -0
  123. package/dist/node_modules/semver/ranges/min-satisfying.js +24 -0
  124. package/dist/node_modules/semver/ranges/min-version.js +61 -0
  125. package/dist/node_modules/semver/ranges/outside.js +80 -0
  126. package/dist/node_modules/semver/ranges/simplify.js +47 -0
  127. package/dist/node_modules/semver/ranges/subset.js +247 -0
  128. package/dist/node_modules/semver/ranges/to-comparators.js +8 -0
  129. package/dist/node_modules/semver/ranges/valid.js +11 -0
  130. package/dist/server/app-migrator.d.ts +17 -0
  131. package/dist/server/app-migrator.js +61 -0
  132. package/dist/server/collection-group-manager.d.ts +4 -0
  133. package/dist/server/collection-group-manager.js +29 -0
  134. package/dist/server/commands/restore-command.d.ts +2 -0
  135. package/dist/server/commands/restore-command.js +67 -0
  136. package/dist/server/dumper.d.ts +71 -0
  137. package/dist/server/dumper.js +406 -0
  138. package/dist/server/errors/restore-check-error.d.ts +3 -0
  139. package/dist/server/errors/restore-check-error.js +32 -0
  140. package/dist/server/field-value-writer.d.ts +9 -0
  141. package/dist/server/field-value-writer.js +101 -0
  142. package/dist/server/index.d.ts +1 -0
  143. package/dist/server/index.js +33 -0
  144. package/dist/server/locale/zh-CN.d.ts +9 -0
  145. package/dist/server/locale/zh-CN.js +30 -0
  146. package/dist/server/resourcers/backup-files.d.ts +25 -0
  147. package/dist/server/resourcers/backup-files.js +193 -0
  148. package/dist/server/restorer.d.ts +36 -0
  149. package/dist/server/restorer.js +326 -0
  150. package/dist/server/server.d.ts +5 -0
  151. package/dist/server/server.js +41 -0
  152. package/dist/server/utils.d.ts +5 -0
  153. package/dist/server/utils.js +78 -0
  154. package/dist/swagger/index.d.ts +392 -0
  155. package/dist/swagger/index.js +447 -0
  156. package/package.json +40 -0
  157. package/server.d.ts +2 -0
  158. package/server.js +1 -0
@@ -0,0 +1,257 @@
1
+ var util = require('util')
2
+ var bl = require('bl')
3
+ var headers = require('./headers')
4
+
5
+ var Writable = require('readable-stream').Writable
6
+ var PassThrough = require('readable-stream').PassThrough
7
+
8
+ var noop = function () {}
9
+
10
+ var overflow = function (size) {
11
+ size &= 511
12
+ return size && 512 - size
13
+ }
14
+
15
+ var emptyStream = function (self, offset) {
16
+ var s = new Source(self, offset)
17
+ s.end()
18
+ return s
19
+ }
20
+
21
+ var mixinPax = function (header, pax) {
22
+ if (pax.path) header.name = pax.path
23
+ if (pax.linkpath) header.linkname = pax.linkpath
24
+ if (pax.size) header.size = parseInt(pax.size, 10)
25
+ header.pax = pax
26
+ return header
27
+ }
28
+
29
+ var Source = function (self, offset) {
30
+ this._parent = self
31
+ this.offset = offset
32
+ PassThrough.call(this, { autoDestroy: false })
33
+ }
34
+
35
+ util.inherits(Source, PassThrough)
36
+
37
+ Source.prototype.destroy = function (err) {
38
+ this._parent.destroy(err)
39
+ }
40
+
41
+ var Extract = function (opts) {
42
+ if (!(this instanceof Extract)) return new Extract(opts)
43
+ Writable.call(this, opts)
44
+
45
+ opts = opts || {}
46
+
47
+ this._offset = 0
48
+ this._buffer = bl()
49
+ this._missing = 0
50
+ this._partial = false
51
+ this._onparse = noop
52
+ this._header = null
53
+ this._stream = null
54
+ this._overflow = null
55
+ this._cb = null
56
+ this._locked = false
57
+ this._destroyed = false
58
+ this._pax = null
59
+ this._paxGlobal = null
60
+ this._gnuLongPath = null
61
+ this._gnuLongLinkPath = null
62
+
63
+ var self = this
64
+ var b = self._buffer
65
+
66
+ var oncontinue = function () {
67
+ self._continue()
68
+ }
69
+
70
+ var onunlock = function (err) {
71
+ self._locked = false
72
+ if (err) return self.destroy(err)
73
+ if (!self._stream) oncontinue()
74
+ }
75
+
76
+ var onstreamend = function () {
77
+ self._stream = null
78
+ var drain = overflow(self._header.size)
79
+ if (drain) self._parse(drain, ondrain)
80
+ else self._parse(512, onheader)
81
+ if (!self._locked) oncontinue()
82
+ }
83
+
84
+ var ondrain = function () {
85
+ self._buffer.consume(overflow(self._header.size))
86
+ self._parse(512, onheader)
87
+ oncontinue()
88
+ }
89
+
90
+ var onpaxglobalheader = function () {
91
+ var size = self._header.size
92
+ self._paxGlobal = headers.decodePax(b.slice(0, size))
93
+ b.consume(size)
94
+ onstreamend()
95
+ }
96
+
97
+ var onpaxheader = function () {
98
+ var size = self._header.size
99
+ self._pax = headers.decodePax(b.slice(0, size))
100
+ if (self._paxGlobal) self._pax = Object.assign({}, self._paxGlobal, self._pax)
101
+ b.consume(size)
102
+ onstreamend()
103
+ }
104
+
105
+ var ongnulongpath = function () {
106
+ var size = self._header.size
107
+ this._gnuLongPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
108
+ b.consume(size)
109
+ onstreamend()
110
+ }
111
+
112
+ var ongnulonglinkpath = function () {
113
+ var size = self._header.size
114
+ this._gnuLongLinkPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
115
+ b.consume(size)
116
+ onstreamend()
117
+ }
118
+
119
+ var onheader = function () {
120
+ var offset = self._offset
121
+ var header
122
+ try {
123
+ header = self._header = headers.decode(b.slice(0, 512), opts.filenameEncoding, opts.allowUnknownFormat)
124
+ } catch (err) {
125
+ self.emit('error', err)
126
+ }
127
+ b.consume(512)
128
+
129
+ if (!header) {
130
+ self._parse(512, onheader)
131
+ oncontinue()
132
+ return
133
+ }
134
+ if (header.type === 'gnu-long-path') {
135
+ self._parse(header.size, ongnulongpath)
136
+ oncontinue()
137
+ return
138
+ }
139
+ if (header.type === 'gnu-long-link-path') {
140
+ self._parse(header.size, ongnulonglinkpath)
141
+ oncontinue()
142
+ return
143
+ }
144
+ if (header.type === 'pax-global-header') {
145
+ self._parse(header.size, onpaxglobalheader)
146
+ oncontinue()
147
+ return
148
+ }
149
+ if (header.type === 'pax-header') {
150
+ self._parse(header.size, onpaxheader)
151
+ oncontinue()
152
+ return
153
+ }
154
+
155
+ if (self._gnuLongPath) {
156
+ header.name = self._gnuLongPath
157
+ self._gnuLongPath = null
158
+ }
159
+
160
+ if (self._gnuLongLinkPath) {
161
+ header.linkname = self._gnuLongLinkPath
162
+ self._gnuLongLinkPath = null
163
+ }
164
+
165
+ if (self._pax) {
166
+ self._header = header = mixinPax(header, self._pax)
167
+ self._pax = null
168
+ }
169
+
170
+ self._locked = true
171
+
172
+ if (!header.size || header.type === 'directory') {
173
+ self._parse(512, onheader)
174
+ self.emit('entry', header, emptyStream(self, offset), onunlock)
175
+ return
176
+ }
177
+
178
+ self._stream = new Source(self, offset)
179
+
180
+ self.emit('entry', header, self._stream, onunlock)
181
+ self._parse(header.size, onstreamend)
182
+ oncontinue()
183
+ }
184
+
185
+ this._onheader = onheader
186
+ this._parse(512, onheader)
187
+ }
188
+
189
+ util.inherits(Extract, Writable)
190
+
191
+ Extract.prototype.destroy = function (err) {
192
+ if (this._destroyed) return
193
+ this._destroyed = true
194
+
195
+ if (err) this.emit('error', err)
196
+ this.emit('close')
197
+ if (this._stream) this._stream.emit('close')
198
+ }
199
+
200
+ Extract.prototype._parse = function (size, onparse) {
201
+ if (this._destroyed) return
202
+ this._offset += size
203
+ this._missing = size
204
+ if (onparse === this._onheader) this._partial = false
205
+ this._onparse = onparse
206
+ }
207
+
208
+ Extract.prototype._continue = function () {
209
+ if (this._destroyed) return
210
+ var cb = this._cb
211
+ this._cb = noop
212
+ if (this._overflow) this._write(this._overflow, undefined, cb)
213
+ else cb()
214
+ }
215
+
216
+ Extract.prototype._write = function (data, enc, cb) {
217
+ if (this._destroyed) return
218
+
219
+ var s = this._stream
220
+ var b = this._buffer
221
+ var missing = this._missing
222
+ if (data.length) this._partial = true
223
+
224
+ // we do not reach end-of-chunk now. just forward it
225
+
226
+ if (data.length < missing) {
227
+ this._missing -= data.length
228
+ this._overflow = null
229
+ if (s) return s.write(data, cb)
230
+ b.append(data)
231
+ return cb()
232
+ }
233
+
234
+ // end-of-chunk. the parser should call cb.
235
+
236
+ this._cb = cb
237
+ this._missing = 0
238
+
239
+ var overflow = null
240
+ if (data.length > missing) {
241
+ overflow = data.slice(missing)
242
+ data = data.slice(0, missing)
243
+ }
244
+
245
+ if (s) s.end(data)
246
+ else b.append(data)
247
+
248
+ this._overflow = overflow
249
+ this._onparse()
250
+ }
251
+
252
+ Extract.prototype._final = function (cb) {
253
+ if (this._partial) return this.destroy(new Error('Unexpected end of data'))
254
+ cb()
255
+ }
256
+
257
+ module.exports = Extract
@@ -0,0 +1,295 @@
1
+ var alloc = Buffer.alloc
2
+
3
+ var ZEROS = '0000000000000000000'
4
+ var SEVENS = '7777777777777777777'
5
+ var ZERO_OFFSET = '0'.charCodeAt(0)
6
+ var USTAR_MAGIC = Buffer.from('ustar\x00', 'binary')
7
+ var USTAR_VER = Buffer.from('00', 'binary')
8
+ var GNU_MAGIC = Buffer.from('ustar\x20', 'binary')
9
+ var GNU_VER = Buffer.from('\x20\x00', 'binary')
10
+ var MASK = parseInt('7777', 8)
11
+ var MAGIC_OFFSET = 257
12
+ var VERSION_OFFSET = 263
13
+
14
+ var clamp = function (index, len, defaultValue) {
15
+ if (typeof index !== 'number') return defaultValue
16
+ index = ~~index // Coerce to integer.
17
+ if (index >= len) return len
18
+ if (index >= 0) return index
19
+ index += len
20
+ if (index >= 0) return index
21
+ return 0
22
+ }
23
+
24
+ var toType = function (flag) {
25
+ switch (flag) {
26
+ case 0:
27
+ return 'file'
28
+ case 1:
29
+ return 'link'
30
+ case 2:
31
+ return 'symlink'
32
+ case 3:
33
+ return 'character-device'
34
+ case 4:
35
+ return 'block-device'
36
+ case 5:
37
+ return 'directory'
38
+ case 6:
39
+ return 'fifo'
40
+ case 7:
41
+ return 'contiguous-file'
42
+ case 72:
43
+ return 'pax-header'
44
+ case 55:
45
+ return 'pax-global-header'
46
+ case 27:
47
+ return 'gnu-long-link-path'
48
+ case 28:
49
+ case 30:
50
+ return 'gnu-long-path'
51
+ }
52
+
53
+ return null
54
+ }
55
+
56
+ var toTypeflag = function (flag) {
57
+ switch (flag) {
58
+ case 'file':
59
+ return 0
60
+ case 'link':
61
+ return 1
62
+ case 'symlink':
63
+ return 2
64
+ case 'character-device':
65
+ return 3
66
+ case 'block-device':
67
+ return 4
68
+ case 'directory':
69
+ return 5
70
+ case 'fifo':
71
+ return 6
72
+ case 'contiguous-file':
73
+ return 7
74
+ case 'pax-header':
75
+ return 72
76
+ }
77
+
78
+ return 0
79
+ }
80
+
81
+ var indexOf = function (block, num, offset, end) {
82
+ for (; offset < end; offset++) {
83
+ if (block[offset] === num) return offset
84
+ }
85
+ return end
86
+ }
87
+
88
+ var cksum = function (block) {
89
+ var sum = 8 * 32
90
+ for (var i = 0; i < 148; i++) sum += block[i]
91
+ for (var j = 156; j < 512; j++) sum += block[j]
92
+ return sum
93
+ }
94
+
95
+ var encodeOct = function (val, n) {
96
+ val = val.toString(8)
97
+ if (val.length > n) return SEVENS.slice(0, n) + ' '
98
+ else return ZEROS.slice(0, n - val.length) + val + ' '
99
+ }
100
+
101
+ /* Copied from the node-tar repo and modified to meet
102
+ * tar-stream coding standard.
103
+ *
104
+ * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349
105
+ */
106
+ function parse256 (buf) {
107
+ // first byte MUST be either 80 or FF
108
+ // 80 for positive, FF for 2's comp
109
+ var positive
110
+ if (buf[0] === 0x80) positive = true
111
+ else if (buf[0] === 0xFF) positive = false
112
+ else return null
113
+
114
+ // build up a base-256 tuple from the least sig to the highest
115
+ var tuple = []
116
+ for (var i = buf.length - 1; i > 0; i--) {
117
+ var byte = buf[i]
118
+ if (positive) tuple.push(byte)
119
+ else tuple.push(0xFF - byte)
120
+ }
121
+
122
+ var sum = 0
123
+ var l = tuple.length
124
+ for (i = 0; i < l; i++) {
125
+ sum += tuple[i] * Math.pow(256, i)
126
+ }
127
+
128
+ return positive ? sum : -1 * sum
129
+ }
130
+
131
+ var decodeOct = function (val, offset, length) {
132
+ val = val.slice(offset, offset + length)
133
+ offset = 0
134
+
135
+ // If prefixed with 0x80 then parse as a base-256 integer
136
+ if (val[offset] & 0x80) {
137
+ return parse256(val)
138
+ } else {
139
+ // Older versions of tar can prefix with spaces
140
+ while (offset < val.length && val[offset] === 32) offset++
141
+ var end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length)
142
+ while (offset < end && val[offset] === 0) offset++
143
+ if (end === offset) return 0
144
+ return parseInt(val.slice(offset, end).toString(), 8)
145
+ }
146
+ }
147
+
148
+ var decodeStr = function (val, offset, length, encoding) {
149
+ return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding)
150
+ }
151
+
152
+ var addLength = function (str) {
153
+ var len = Buffer.byteLength(str)
154
+ var digits = Math.floor(Math.log(len) / Math.log(10)) + 1
155
+ if (len + digits >= Math.pow(10, digits)) digits++
156
+
157
+ return (len + digits) + str
158
+ }
159
+
160
+ exports.decodeLongPath = function (buf, encoding) {
161
+ return decodeStr(buf, 0, buf.length, encoding)
162
+ }
163
+
164
+ exports.encodePax = function (opts) { // TODO: encode more stuff in pax
165
+ var result = ''
166
+ if (opts.name) result += addLength(' path=' + opts.name + '\n')
167
+ if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\n')
168
+ var pax = opts.pax
169
+ if (pax) {
170
+ for (var key in pax) {
171
+ result += addLength(' ' + key + '=' + pax[key] + '\n')
172
+ }
173
+ }
174
+ return Buffer.from(result)
175
+ }
176
+
177
+ exports.decodePax = function (buf) {
178
+ var result = {}
179
+
180
+ while (buf.length) {
181
+ var i = 0
182
+ while (i < buf.length && buf[i] !== 32) i++
183
+ var len = parseInt(buf.slice(0, i).toString(), 10)
184
+ if (!len) return result
185
+
186
+ var b = buf.slice(i + 1, len - 1).toString()
187
+ var keyIndex = b.indexOf('=')
188
+ if (keyIndex === -1) return result
189
+ result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1)
190
+
191
+ buf = buf.slice(len)
192
+ }
193
+
194
+ return result
195
+ }
196
+
197
+ exports.encode = function (opts) {
198
+ var buf = alloc(512)
199
+ var name = opts.name
200
+ var prefix = ''
201
+
202
+ if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/'
203
+ if (Buffer.byteLength(name) !== name.length) return null // utf-8
204
+
205
+ while (Buffer.byteLength(name) > 100) {
206
+ var i = name.indexOf('/')
207
+ if (i === -1) return null
208
+ prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i)
209
+ name = name.slice(i + 1)
210
+ }
211
+
212
+ if (Buffer.byteLength(name) > 100 || Buffer.byteLength(prefix) > 155) return null
213
+ if (opts.linkname && Buffer.byteLength(opts.linkname) > 100) return null
214
+
215
+ buf.write(name)
216
+ buf.write(encodeOct(opts.mode & MASK, 6), 100)
217
+ buf.write(encodeOct(opts.uid, 6), 108)
218
+ buf.write(encodeOct(opts.gid, 6), 116)
219
+ buf.write(encodeOct(opts.size, 11), 124)
220
+ buf.write(encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136)
221
+
222
+ buf[156] = ZERO_OFFSET + toTypeflag(opts.type)
223
+
224
+ if (opts.linkname) buf.write(opts.linkname, 157)
225
+
226
+ USTAR_MAGIC.copy(buf, MAGIC_OFFSET)
227
+ USTAR_VER.copy(buf, VERSION_OFFSET)
228
+ if (opts.uname) buf.write(opts.uname, 265)
229
+ if (opts.gname) buf.write(opts.gname, 297)
230
+ buf.write(encodeOct(opts.devmajor || 0, 6), 329)
231
+ buf.write(encodeOct(opts.devminor || 0, 6), 337)
232
+
233
+ if (prefix) buf.write(prefix, 345)
234
+
235
+ buf.write(encodeOct(cksum(buf), 6), 148)
236
+
237
+ return buf
238
+ }
239
+
240
+ exports.decode = function (buf, filenameEncoding, allowUnknownFormat) {
241
+ var typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET
242
+
243
+ var name = decodeStr(buf, 0, 100, filenameEncoding)
244
+ var mode = decodeOct(buf, 100, 8)
245
+ var uid = decodeOct(buf, 108, 8)
246
+ var gid = decodeOct(buf, 116, 8)
247
+ var size = decodeOct(buf, 124, 12)
248
+ var mtime = decodeOct(buf, 136, 12)
249
+ var type = toType(typeflag)
250
+ var linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding)
251
+ var uname = decodeStr(buf, 265, 32)
252
+ var gname = decodeStr(buf, 297, 32)
253
+ var devmajor = decodeOct(buf, 329, 8)
254
+ var devminor = decodeOct(buf, 337, 8)
255
+
256
+ var c = cksum(buf)
257
+
258
+ // checksum is still initial value if header was null.
259
+ if (c === 8 * 32) return null
260
+
261
+ // valid checksum
262
+ if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?')
263
+
264
+ if (USTAR_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0) {
265
+ // ustar (posix) format.
266
+ // prepend prefix, if present.
267
+ if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name
268
+ } else if (GNU_MAGIC.compare(buf, MAGIC_OFFSET, MAGIC_OFFSET + 6) === 0 &&
269
+ GNU_VER.compare(buf, VERSION_OFFSET, VERSION_OFFSET + 2) === 0) {
270
+ // 'gnu'/'oldgnu' format. Similar to ustar, but has support for incremental and
271
+ // multi-volume tarballs.
272
+ } else {
273
+ if (!allowUnknownFormat) {
274
+ throw new Error('Invalid tar header: unknown format.')
275
+ }
276
+ }
277
+
278
+ // to support old tar versions that use trailing / to indicate dirs
279
+ if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5
280
+
281
+ return {
282
+ name,
283
+ mode,
284
+ uid,
285
+ gid,
286
+ size,
287
+ mtime: new Date(1000 * mtime),
288
+ type,
289
+ linkname,
290
+ uname,
291
+ gname,
292
+ devmajor,
293
+ devminor
294
+ }
295
+ }
@@ -0,0 +1,2 @@
1
+ exports.extract = require('./extract')
2
+ exports.pack = require('./pack')