@@ -8,6 +8,7 @@ const DS = require('interface-datastore')
8
8
const collect = require ( 'pull-stream/sinks/collect' )
9
9
const pull = require ( 'pull-stream/pull' )
10
10
const CMS = require ( './cms' )
11
+ const errcode = require ( 'err-code' )
11
12
12
13
const keyPrefix = '/pkcs8/'
13
14
const infoPrefix = '/info/'
@@ -50,7 +51,7 @@ function _error (callback, err) {
50
51
const min = 200
51
52
const max = 1000
52
53
const delay = Math . random ( ) * ( max - min ) + min
53
- if ( typeof err === 'string' ) err = new Error ( err )
54
+
54
55
setTimeout ( callback , delay , err , null )
55
56
}
56
57
@@ -181,26 +182,26 @@ class Keychain {
181
182
const self = this
182
183
183
184
if ( ! validateKeyName ( name ) || name === 'self' ) {
184
- return _error ( callback , `Invalid key name '${ name } '` )
185
+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
185
186
}
186
187
187
188
if ( typeof type !== 'string' ) {
188
- return _error ( callback , `Invalid key type '${ type } '` )
189
+ return _error ( callback , errcode ( new Error ( `Invalid key type '${ type } '` ) , 'ERR_INVALID_KEY_TYPE' ) )
189
190
}
190
191
191
192
if ( ! Number . isSafeInteger ( size ) ) {
192
- return _error ( callback , `Invalid key size '${ size } '` )
193
+ return _error ( callback , errcode ( new Error ( `Invalid key size '${ size } '` ) , 'ERR_INVALID_KEY_SIZE' ) )
193
194
}
194
195
195
196
const dsname = DsName ( name )
196
197
self . store . has ( dsname , ( err , exists ) => {
197
198
if ( err ) return _error ( callback , err )
198
- if ( exists ) return _error ( callback , `Key '${ name } ' already exists` )
199
+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ name } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
199
200
200
201
switch ( type . toLowerCase ( ) ) {
201
202
case 'rsa' :
202
203
if ( size < 2048 ) {
203
- return _error ( callback , `Invalid RSA key size ${ size } ` )
204
+ return _error ( callback , errcode ( new Error ( `Invalid RSA key size ${ size } ` ) , 'ERR_INVALID_KEY_SIZE' ) )
204
205
}
205
206
break
206
207
default :
@@ -278,13 +279,13 @@ class Keychain {
278
279
*/
279
280
findKeyByName ( name , callback ) {
280
281
if ( ! validateKeyName ( name ) ) {
281
- return _error ( callback , `Invalid key name '${ name } '` )
282
+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
282
283
}
283
284
284
285
const dsname = DsInfoName ( name )
285
286
this . store . get ( dsname , ( err , res ) => {
286
287
if ( err ) {
287
- return _error ( callback , `Key '${ name } ' does not exist. ${ err . message } ` )
288
+ return _error ( callback , errcode ( new Error ( `Key '${ name } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
288
289
}
289
290
290
291
callback ( null , JSON . parse ( res . toString ( ) ) )
@@ -301,7 +302,7 @@ class Keychain {
301
302
removeKey ( name , callback ) {
302
303
const self = this
303
304
if ( ! validateKeyName ( name ) || name === 'self' ) {
304
- return _error ( callback , `Invalid key name '${ name } '` )
305
+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
305
306
}
306
307
const dsname = DsName ( name )
307
308
self . findKeyByName ( name , ( err , keyinfo ) => {
@@ -327,23 +328,23 @@ class Keychain {
327
328
renameKey ( oldName , newName , callback ) {
328
329
const self = this
329
330
if ( ! validateKeyName ( oldName ) || oldName === 'self' ) {
330
- return _error ( callback , `Invalid old key name '${ oldName } '` )
331
+ return _error ( callback , errcode ( new Error ( `Invalid old key name '${ oldName } '` ) , 'ERR_OLD_KEY_NAME_INVALID' ) )
331
332
}
332
333
if ( ! validateKeyName ( newName ) || newName === 'self' ) {
333
- return _error ( callback , `Invalid new key name '${ newName } '` )
334
+ return _error ( callback , errcode ( new Error ( `Invalid new key name '${ newName } '` ) , 'ERR_NEW_KEY_NAME_INVALID' ) )
334
335
}
335
336
const oldDsname = DsName ( oldName )
336
337
const newDsname = DsName ( newName )
337
338
const oldInfoName = DsInfoName ( oldName )
338
339
const newInfoName = DsInfoName ( newName )
339
340
this . store . get ( oldDsname , ( err , res ) => {
340
341
if ( err ) {
341
- return _error ( callback , `Key '${ oldName } ' does not exist. ${ err . message } ` )
342
+ return _error ( callback , errcode ( new Error ( `Key '${ oldName } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
342
343
}
343
344
const pem = res . toString ( )
344
345
self . store . has ( newDsname , ( err , exists ) => {
345
346
if ( err ) return _error ( callback , err )
346
- if ( exists ) return _error ( callback , `Key '${ newName } ' already exists` )
347
+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ newName } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
347
348
348
349
self . store . get ( oldInfoName , ( err , res ) => {
349
350
if ( err ) return _error ( callback , err )
@@ -374,16 +375,16 @@ class Keychain {
374
375
*/
375
376
exportKey ( name , password , callback ) {
376
377
if ( ! validateKeyName ( name ) ) {
377
- return _error ( callback , `Invalid key name '${ name } '` )
378
+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
378
379
}
379
380
if ( ! password ) {
380
- return _error ( callback , 'Password is required' )
381
+ return _error ( callback , errcode ( new Error ( 'Password is required' ) , 'ERR_PASSWORD_REQUIRED' ) )
381
382
}
382
383
383
384
const dsname = DsName ( name )
384
385
this . store . get ( dsname , ( err , res ) => {
385
386
if ( err ) {
386
- return _error ( callback , `Key '${ name } ' does not exist. ${ err . message } ` )
387
+ return _error ( callback , errcode ( new Error ( `Key '${ name } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
387
388
}
388
389
const pem = res . toString ( )
389
390
crypto . keys . import ( pem , this . _ ( ) , ( err , privateKey ) => {
@@ -405,17 +406,17 @@ class Keychain {
405
406
importKey ( name , pem , password , callback ) {
406
407
const self = this
407
408
if ( ! validateKeyName ( name ) || name === 'self' ) {
408
- return _error ( callback , `Invalid key name '${ name } '` )
409
+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
409
410
}
410
411
if ( ! pem ) {
411
412
return _error ( callback , 'PEM encoded key is required' )
412
413
}
413
414
const dsname = DsName ( name )
414
415
self . store . has ( dsname , ( err , exists ) => {
415
416
if ( err ) return _error ( callback , err )
416
- if ( exists ) return _error ( callback , `Key '${ name } ' already exists` )
417
+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ name } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
417
418
crypto . keys . import ( pem , password , ( err , privateKey ) => {
418
- if ( err ) return _error ( callback , 'Cannot read the key, most likely the password is wrong' )
419
+ if ( err ) return _error ( callback , errcode ( new Error ( 'Cannot read the key, most likely the password is wrong' ) , 'ERR_CANNOT_READ_KEY' ) )
419
420
privateKey . id ( ( err , kid ) => {
420
421
if ( err ) return _error ( callback , err )
421
422
privateKey . export ( this . _ ( ) , ( err , pem ) => {
@@ -441,17 +442,17 @@ class Keychain {
441
442
importPeer ( name , peer , callback ) {
442
443
const self = this
443
444
if ( ! validateKeyName ( name ) ) {
444
- return _error ( callback , `Invalid key name '${ name } '` )
445
+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
445
446
}
446
447
if ( ! peer || ! peer . privKey ) {
447
- return _error ( callback , 'Peer.privKey is required' )
448
+ return _error ( callback , errcode ( new Error ( 'Peer.privKey is required' ) , 'ERR_MISSING_PRIVATE_KEY' ) )
448
449
}
449
450
450
451
const privateKey = peer . privKey
451
452
const dsname = DsName ( name )
452
453
self . store . has ( dsname , ( err , exists ) => {
453
454
if ( err ) return _error ( callback , err )
454
- if ( exists ) return _error ( callback , `Key '${ name } ' already exists` )
455
+ if ( exists ) return _error ( callback , errcode ( new Error ( `Key '${ name } ' already exists` ) , 'ERR_KEY_ALREADY_EXISTS' ) )
455
456
456
457
privateKey . id ( ( err , kid ) => {
457
458
if ( err ) return _error ( callback , err )
@@ -484,11 +485,11 @@ class Keychain {
484
485
*/
485
486
_getPrivateKey ( name , callback ) {
486
487
if ( ! validateKeyName ( name ) ) {
487
- return _error ( callback , `Invalid key name '${ name } '` )
488
+ return _error ( callback , errcode ( new Error ( `Invalid key name '${ name } '` ) , 'ERR_INVALID_KEY_NAME' ) )
488
489
}
489
490
this . store . get ( DsName ( name ) , ( err , res ) => {
490
491
if ( err ) {
491
- return _error ( callback , `Key '${ name } ' does not exist. ${ err . message } ` )
492
+ return _error ( callback , errcode ( new Error ( `Key '${ name } ' does not exist. ${ err . message } ` ) , 'ERR_KEY_NOT_FOUND' ) )
492
493
}
493
494
callback ( null , res . toString ( ) )
494
495
} )
0 commit comments