Skip to content
This repository was archived by the owner on Aug 11, 2021. It is now read-only.

Commit 690d62c

Browse files
authored
feat(integrity): add integrity field to publish (#157)
1 parent 53c15d9 commit 690d62c

File tree

3 files changed

+27
-5
lines changed

3 files changed

+27
-5
lines changed

lib/publish.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ module.exports = publish
22

33
var url = require('url')
44
var semver = require('semver')
5-
var crypto = require('crypto')
65
var Stream = require('stream').Stream
76
var assert = require('assert')
87
var fixer = require('normalize-package-data').fixer
98
var concat = require('concat-stream')
9+
var ssri = require('ssri')
1010

1111
function escaped (name) {
1212
return name.replace('/', '%2f')
@@ -84,10 +84,16 @@ function putFirst (registry, data, tarbuffer, access, auth, cb) {
8484

8585
var tbName = data.name + '-' + data.version + '.tgz'
8686
var tbURI = data.name + '/-/' + tbName
87+
var integrity = ssri.fromData(tarbuffer, {
88+
algorithms: ['sha1', 'sha512']
89+
})
8790

8891
data._id = data.name + '@' + data.version
8992
data.dist = data.dist || {}
90-
data.dist.shasum = crypto.createHash('sha1').update(tarbuffer).digest('hex')
93+
// Don't bother having sha1 in the actual integrity field
94+
data.dist.integrity = integrity['sha512'][0].toString()
95+
// Legacy shasum support
96+
data.dist.shasum = integrity['sha1'][0].hexDigest()
9197
data.dist.tarball = url.resolve(registry, tbURI)
9298
.replace(/^https:\/\//, 'http://')
9399

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"request": "^2.74.0",
2424
"retry": "^0.10.0",
2525
"semver": "2 >=2.2.1 || 3.x || 4 || 5",
26-
"slide": "^1.1.3"
26+
"slide": "^1.1.3",
27+
"ssri": "^4.1.2"
2728
},
2829
"devDependencies": {
2930
"negotiator": "^0.6.1",

test/publish.js

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
var test = require('tap').test
1+
'use strict'
2+
23
var crypto = require('crypto')
4+
var test = require('tap').test
35
var fs = require('fs')
6+
var ssri = require('ssri')
47

58
var server = require('./lib/server.js')
69
var common = require('./lib/common.js')
@@ -187,7 +190,19 @@ test('publish', function (t) {
187190
t.same(att.data, pd.toString('base64'))
188191

189192
var hash = crypto.createHash('sha1').update(pd).digest('hex')
190-
t.equal(o.versions[METADATA.version].dist.shasum, hash)
193+
var integrity = ssri.fromData(pd, {
194+
algorithms: ['sha512']
195+
})
196+
t.equal(
197+
o.versions[METADATA.version].dist.shasum,
198+
hash,
199+
'shasum is the same as generated originally by crypto module'
200+
)
201+
t.equal(
202+
o.versions[METADATA.version].dist.integrity,
203+
integrity.toString(),
204+
'integrity field is a valid SRI string'
205+
)
191206

192207
res.statusCode = 201
193208
res.json({ created: true })

0 commit comments

Comments
 (0)