net-snmp 3.7.2 → 3.8.2
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.
- package/.travis.yml +1 -1
- package/README.md +12 -0
- package/index.js +94 -107
- package/package.json +2 -2
package/.travis.yml
CHANGED
package/README.md
CHANGED
@@ -3211,6 +3211,18 @@ Example programs are included under the module's `example` directory.
|
|
3211
3211
|
|
3212
3212
|
* Improve getBulk response handling
|
3213
3213
|
|
3214
|
+
## Version 3.8.0 - 07/06/2022
|
3215
|
+
|
3216
|
+
* Fix 32-bit unsigned integer writing and add integer range checking
|
3217
|
+
|
3218
|
+
## Version 3.8.1 - 07/06/2022
|
3219
|
+
|
3220
|
+
* Add bit string type to varbind reading
|
3221
|
+
|
3222
|
+
## Version 3.8.2 - 21/06/2022
|
3223
|
+
|
3224
|
+
* Fix PDU error status field writing
|
3225
|
+
|
3214
3226
|
# License
|
3215
3227
|
|
3216
3228
|
Copyright (c) 2020 Mark Abrahams <mark@abrahams.co.nz>
|
package/index.js
CHANGED
@@ -11,7 +11,10 @@ var crypto = require ("crypto");
|
|
11
11
|
var mibparser = require ("./lib/mib");
|
12
12
|
var DEBUG = false;
|
13
13
|
|
14
|
-
var
|
14
|
+
var MIN_SIGNED_INT32 = -2147483648;
|
15
|
+
var MAX_SIGNED_INT32 = 2147483647;
|
16
|
+
var MIN_UNSIGNED_INT32 = 0;
|
17
|
+
var MAX_UNSIGNED_INT32 = 4294967295;
|
15
18
|
|
16
19
|
function debug (line) {
|
17
20
|
if ( DEBUG ) {
|
@@ -59,6 +62,7 @@ _expandConstantObject (ErrorStatus);
|
|
59
62
|
var ObjectType = {
|
60
63
|
1: "Boolean",
|
61
64
|
2: "Integer",
|
65
|
+
3: "BitString",
|
62
66
|
4: "OctetString",
|
63
67
|
5: "Null",
|
64
68
|
6: "OID",
|
@@ -378,71 +382,26 @@ function oidInSubtree (oidString, nextString) {
|
|
378
382
|
return true;
|
379
383
|
}
|
380
384
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
** with this, instead opting to work around it here.
|
386
|
-
**
|
387
|
-
** If an integer is 5 bytes in length we check if the first byte is 0, and if so
|
388
|
-
** simply drop it and parse it like it was a 4 byte integer, otherwise throw
|
389
|
-
** an error since the integer is too large.
|
390
|
-
**/
|
391
|
-
|
392
|
-
function readInt (buffer) {
|
393
|
-
return readUint (buffer, true);
|
394
|
-
}
|
395
|
-
|
396
|
-
function readIpAddress (buffer) {
|
397
|
-
var bytes = buffer.readString (ObjectType.IpAddress, true);
|
398
|
-
if (bytes.length != 4)
|
399
|
-
throw new ResponseInvalidError ("Length '" + bytes.length
|
400
|
-
+ "' of IP address '" + bytes.toString ("hex")
|
401
|
-
+ "' is not 4", ResponseInvalidCode.EIp4AddressSize);
|
402
|
-
var value = bytes[0] + "." + bytes[1] + "." + bytes[2] + "." + bytes[3];
|
403
|
-
return value;
|
404
|
-
}
|
405
|
-
|
406
|
-
function readUint (buffer, isSigned) {
|
407
|
-
buffer.readByte ();
|
408
|
-
var length = buffer.readByte ();
|
409
|
-
var value = 0;
|
410
|
-
var signedBitSet = false;
|
411
|
-
|
412
|
-
// Handle BER long-form length encoding
|
413
|
-
if ((length & 0x80) == 0x80) {
|
414
|
-
var lengthOctets = (length & 0x7f);
|
415
|
-
length = 0;
|
416
|
-
for (var lengthOctet = 0; lengthOctet < lengthOctets; lengthOctet++) {
|
417
|
-
length *= 256;
|
418
|
-
length += buffer.readByte ();
|
419
|
-
}
|
385
|
+
function readInt32 (buffer) {
|
386
|
+
var parsedInt = buffer.readInt ();
|
387
|
+
if ( ! Number.isInteger(parsedInt) ) {
|
388
|
+
throw new TypeError('Value read as integer ' + parsedInt + ' is not an integer');
|
420
389
|
}
|
421
|
-
|
422
|
-
|
423
|
-
throw new RangeError ("Integer too long '" + length + "'");
|
424
|
-
} else if (length == 5) {
|
425
|
-
if (buffer.readByte () !== 0)
|
426
|
-
throw new RangeError ("Integer too long '" + length + "'");
|
427
|
-
length = 4;
|
390
|
+
if ( parsedInt < MIN_SIGNED_INT32 || parsedInt > MAX_SIGNED_INT32 ) {
|
391
|
+
throw new RangeError('Read integer ' + parsedInt + ' is outside the signed 32-bit range');
|
428
392
|
}
|
393
|
+
return parsedInt;
|
394
|
+
}
|
429
395
|
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
if (isSigned && i <= 0) {
|
435
|
-
if ((value & 0x80) == 0x80) {
|
436
|
-
signedBitSet = true;
|
437
|
-
}
|
438
|
-
}
|
396
|
+
function readUint32 (buffer) {
|
397
|
+
var parsedInt = buffer.readInt ();
|
398
|
+
if ( ! Number.isInteger(parsedInt) ) {
|
399
|
+
throw new TypeError('Value read as integer ' + parsedInt + ' is not an integer');
|
439
400
|
}
|
440
|
-
|
441
|
-
|
442
|
-
value -= 2 ** (i * 8);
|
401
|
+
if ( parsedInt < MIN_UNSIGNED_INT32 || parsedInt > MAX_UNSIGNED_INT32 ) {
|
402
|
+
throw new RangeError('Read integer ' + parsedInt + ' is outside the unsigned 32-bit range');
|
443
403
|
}
|
444
|
-
|
445
|
-
return value;
|
404
|
+
return parsedInt;
|
446
405
|
}
|
447
406
|
|
448
407
|
function readUint64 (buffer) {
|
@@ -451,12 +410,24 @@ function readUint64 (buffer) {
|
|
451
410
|
return value;
|
452
411
|
}
|
453
412
|
|
413
|
+
function readIpAddress (buffer) {
|
414
|
+
var bytes = buffer.readString (ObjectType.IpAddress, true);
|
415
|
+
if (bytes.length != 4)
|
416
|
+
throw new ResponseInvalidError ("Length '" + bytes.length
|
417
|
+
+ "' of IP address '" + bytes.toString ("hex")
|
418
|
+
+ "' is not 4", ResponseInvalidCode.EIp4AddressSize);
|
419
|
+
var value = bytes[0] + "." + bytes[1] + "." + bytes[2] + "." + bytes[3];
|
420
|
+
return value;
|
421
|
+
}
|
422
|
+
|
454
423
|
function readVarbindValue (buffer, type) {
|
455
424
|
var value;
|
456
425
|
if (type == ObjectType.Boolean) {
|
457
426
|
value = buffer.readBoolean ();
|
458
427
|
} else if (type == ObjectType.Integer) {
|
459
|
-
value =
|
428
|
+
value = readInt32 (buffer);
|
429
|
+
} else if (type == ObjectType.BitString) {
|
430
|
+
value = buffer.readBitString();
|
460
431
|
} else if (type == ObjectType.OctetString) {
|
461
432
|
value = buffer.readString (null, true);
|
462
433
|
} else if (type == ObjectType.Null) {
|
@@ -468,11 +439,11 @@ function readVarbindValue (buffer, type) {
|
|
468
439
|
} else if (type == ObjectType.IpAddress) {
|
469
440
|
value = readIpAddress (buffer);
|
470
441
|
} else if (type == ObjectType.Counter) {
|
471
|
-
value =
|
442
|
+
value = readUint32 (buffer);
|
472
443
|
} else if (type == ObjectType.Gauge) {
|
473
|
-
value =
|
444
|
+
value = readUint32 (buffer);
|
474
445
|
} else if (type == ObjectType.TimeTicks) {
|
475
|
-
value =
|
446
|
+
value = readUint32 (buffer);
|
476
447
|
} else if (type == ObjectType.Opaque) {
|
477
448
|
value = buffer.readString (ObjectType.Opaque, true);
|
478
449
|
} else if (type == ObjectType.Counter64) {
|
@@ -519,10 +490,24 @@ function readVarbinds (buffer, varbinds) {
|
|
519
490
|
}
|
520
491
|
}
|
521
492
|
|
522
|
-
function
|
523
|
-
|
524
|
-
|
525
|
-
|
493
|
+
function writeInt32 (buffer, type, value) {
|
494
|
+
if ( ! Number.isInteger(value) ) {
|
495
|
+
throw new TypeError('Value to write as integer ' + value + ' is not an integer');
|
496
|
+
}
|
497
|
+
if ( value < MIN_SIGNED_INT32 || value > MAX_SIGNED_INT32 ) {
|
498
|
+
throw new RangeError('Integer to write ' + value + ' is outside the signed 32-bit range');
|
499
|
+
}
|
500
|
+
buffer.writeInt(value, type);
|
501
|
+
}
|
502
|
+
|
503
|
+
function writeUint32 (buffer, type, value) {
|
504
|
+
if ( ! Number.isInteger(value) ) {
|
505
|
+
throw new TypeError('Value to write as integer ' + value + ' is not an integer');
|
506
|
+
}
|
507
|
+
if ( value < MIN_UNSIGNED_INT32 || value > MAX_UNSIGNED_INT32 ) {
|
508
|
+
throw new RangeError('Integer to write ' + value + ' is outside the unsigned 32-bit range');
|
509
|
+
}
|
510
|
+
buffer.writeInt(value, type);
|
526
511
|
}
|
527
512
|
|
528
513
|
function writeUint64 (buffer, value) {
|
@@ -544,7 +529,7 @@ function writeVarbinds (buffer, varbinds) {
|
|
544
529
|
buffer.writeBoolean (value ? true : false);
|
545
530
|
break;
|
546
531
|
case ObjectType.Integer: // also Integer32
|
547
|
-
buffer.
|
532
|
+
writeInt32 (buffer, ObjectType.Integer, value);
|
548
533
|
break;
|
549
534
|
case ObjectType.OctetString:
|
550
535
|
if (typeof value == "string")
|
@@ -566,13 +551,13 @@ function writeVarbinds (buffer, varbinds) {
|
|
566
551
|
buffer.writeBuffer (Buffer.from (bytes), 64);
|
567
552
|
break;
|
568
553
|
case ObjectType.Counter: // also Counter32
|
569
|
-
|
554
|
+
writeUint32 (buffer, ObjectType.Counter, value);
|
570
555
|
break;
|
571
556
|
case ObjectType.Gauge: // also Gauge32 & Unsigned32
|
572
|
-
|
557
|
+
writeUint32 (buffer, ObjectType.Gauge, value);
|
573
558
|
break;
|
574
559
|
case ObjectType.TimeTicks:
|
575
|
-
|
560
|
+
writeUint32 (buffer, ObjectType.TimeTicks, value);
|
576
561
|
break;
|
577
562
|
case ObjectType.Opaque:
|
578
563
|
buffer.writeBuffer (value, ObjectType.Opaque);
|
@@ -609,11 +594,13 @@ var SimplePdu = function () {
|
|
609
594
|
SimplePdu.prototype.toBuffer = function (buffer) {
|
610
595
|
buffer.startSequence (this.type);
|
611
596
|
|
612
|
-
buffer.
|
613
|
-
|
597
|
+
writeInt32 (buffer, ObjectType.Integer, this.id);
|
598
|
+
writeInt32 (buffer, ObjectType.Integer,
|
599
|
+
(this.type == PduType.GetBulkRequest)
|
614
600
|
? (this.options.nonRepeaters || 0)
|
615
601
|
: 0);
|
616
|
-
|
602
|
+
writeInt32 (buffer, ObjectType.Integer,
|
603
|
+
(this.type == PduType.GetBulkRequest)
|
617
604
|
? (this.options.maxRepetitions || 0)
|
618
605
|
: 0);
|
619
606
|
|
@@ -633,9 +620,9 @@ SimplePdu.prototype.initializeFromBuffer = function (reader) {
|
|
633
620
|
this.type = reader.peek ();
|
634
621
|
reader.readSequence ();
|
635
622
|
|
636
|
-
this.id =
|
637
|
-
this.nonRepeaters =
|
638
|
-
this.maxRepetitions =
|
623
|
+
this.id = readInt32 (reader);
|
624
|
+
this.nonRepeaters = readInt32 (reader);
|
625
|
+
this.maxRepetitions = readInt32 (reader);
|
639
626
|
|
640
627
|
this.varbinds = [];
|
641
628
|
readVarbinds (reader, this.varbinds);
|
@@ -740,9 +727,9 @@ TrapPdu.prototype.toBuffer = function (buffer) {
|
|
740
727
|
buffer.writeOID (this.enterprise);
|
741
728
|
buffer.writeBuffer (Buffer.from (this.agentAddr.split (".")),
|
742
729
|
ObjectType.IpAddress);
|
743
|
-
buffer.
|
744
|
-
buffer.
|
745
|
-
|
730
|
+
writeInt32 (buffer, ObjectType.Integer, this.generic);
|
731
|
+
writeInt32 (buffer, ObjectType.Integer, this.specific);
|
732
|
+
writeUint32 (buffer, ObjectType.TimeTicks,
|
746
733
|
this.upTime || Math.floor (process.uptime () * 100));
|
747
734
|
|
748
735
|
writeVarbinds (buffer, this.varbinds);
|
@@ -756,9 +743,9 @@ TrapPdu.createFromBuffer = function (reader) {
|
|
756
743
|
|
757
744
|
pdu.enterprise = reader.readOID ();
|
758
745
|
pdu.agentAddr = readIpAddress (reader);
|
759
|
-
pdu.generic =
|
760
|
-
pdu.specific =
|
761
|
-
pdu.upTime =
|
746
|
+
pdu.generic = readInt32 (reader);
|
747
|
+
pdu.specific = readInt32 (reader);
|
748
|
+
pdu.upTime = readUint32 (reader);
|
762
749
|
|
763
750
|
pdu.varbinds = [];
|
764
751
|
readVarbinds (reader, pdu.varbinds);
|
@@ -811,9 +798,9 @@ var SimpleResponsePdu = function() {
|
|
811
798
|
SimpleResponsePdu.prototype.toBuffer = function (writer) {
|
812
799
|
writer.startSequence (this.type);
|
813
800
|
|
814
|
-
writer.
|
815
|
-
writer.
|
816
|
-
writer.
|
801
|
+
writeInt32 (writer, ObjectType.Integer, this.id);
|
802
|
+
writeInt32 (writer, ObjectType.Integer, this.errorStatus || 0);
|
803
|
+
writeInt32 (writer, ObjectType.Integer, this.errorIndex || 0);
|
817
804
|
writeVarbinds (writer, this.varbinds);
|
818
805
|
writer.endSequence ();
|
819
806
|
|
@@ -822,9 +809,9 @@ SimpleResponsePdu.prototype.toBuffer = function (writer) {
|
|
822
809
|
SimpleResponsePdu.prototype.initializeFromBuffer = function (reader) {
|
823
810
|
reader.readSequence (this.type);
|
824
811
|
|
825
|
-
this.id =
|
826
|
-
this.errorStatus =
|
827
|
-
this.errorIndex =
|
812
|
+
this.id = readInt32 (reader);
|
813
|
+
this.errorStatus = readInt32 (reader);
|
814
|
+
this.errorIndex = readInt32 (reader);
|
828
815
|
|
829
816
|
this.varbinds = [];
|
830
817
|
readVarbinds (reader, this.varbinds);
|
@@ -1335,7 +1322,7 @@ Message.prototype.toBufferCommunity = function () {
|
|
1335
1322
|
|
1336
1323
|
writer.startSequence ();
|
1337
1324
|
|
1338
|
-
writer.
|
1325
|
+
writeInt32 (writer, ObjectType.Integer, this.version);
|
1339
1326
|
writer.writeString (this.community);
|
1340
1327
|
|
1341
1328
|
this.pdu.toBuffer (writer);
|
@@ -1380,16 +1367,16 @@ Message.prototype.toBufferV3 = function () {
|
|
1380
1367
|
|
1381
1368
|
writer.startSequence ();
|
1382
1369
|
|
1383
|
-
writer.
|
1370
|
+
writeInt32 (writer, ObjectType.Integer, this.version);
|
1384
1371
|
|
1385
1372
|
// HeaderData
|
1386
1373
|
writer.startSequence ();
|
1387
|
-
writer.
|
1388
|
-
writer.
|
1374
|
+
writeInt32 (writer, ObjectType.Integer, this.msgGlobalData.msgID);
|
1375
|
+
writeInt32 (writer, ObjectType.Integer, this.msgGlobalData.msgMaxSize);
|
1389
1376
|
writer.writeByte (ber.OctetString);
|
1390
1377
|
writer.writeByte (1);
|
1391
1378
|
writer.writeByte (this.msgGlobalData.msgFlags);
|
1392
|
-
writer.
|
1379
|
+
writeInt32 (writer, ObjectType.Integer, this.msgGlobalData.msgSecurityModel);
|
1393
1380
|
writer.endSequence ();
|
1394
1381
|
|
1395
1382
|
// msgSecurityParameters
|
@@ -1402,8 +1389,8 @@ Message.prototype.toBufferV3 = function () {
|
|
1402
1389
|
} else {
|
1403
1390
|
writer.writeBuffer (this.msgSecurityParameters.msgAuthoritativeEngineID, ber.OctetString);
|
1404
1391
|
}
|
1405
|
-
writer.
|
1406
|
-
writer.
|
1392
|
+
writeInt32 (writer, ObjectType.Integer, this.msgSecurityParameters.msgAuthoritativeEngineBoots);
|
1393
|
+
writeInt32 (writer, ObjectType.Integer, this.msgSecurityParameters.msgAuthoritativeEngineTime);
|
1407
1394
|
writer.writeString (this.msgSecurityParameters.msgUserName);
|
1408
1395
|
|
1409
1396
|
var msgAuthenticationParameters = '';
|
@@ -1663,7 +1650,7 @@ Message.createFromBuffer = function (buffer, user) {
|
|
1663
1650
|
|
1664
1651
|
reader.readSequence ();
|
1665
1652
|
|
1666
|
-
message.version =
|
1653
|
+
message.version = readInt32 (reader);
|
1667
1654
|
|
1668
1655
|
if (message.version != 3) {
|
1669
1656
|
message.community = reader.readString ();
|
@@ -1672,18 +1659,18 @@ Message.createFromBuffer = function (buffer, user) {
|
|
1672
1659
|
// HeaderData
|
1673
1660
|
message.msgGlobalData = {};
|
1674
1661
|
reader.readSequence ();
|
1675
|
-
message.msgGlobalData.msgID =
|
1676
|
-
message.msgGlobalData.msgMaxSize =
|
1662
|
+
message.msgGlobalData.msgID = readInt32 (reader);
|
1663
|
+
message.msgGlobalData.msgMaxSize = readInt32 (reader);
|
1677
1664
|
message.msgGlobalData.msgFlags = reader.readString (ber.OctetString, true)[0];
|
1678
|
-
message.msgGlobalData.msgSecurityModel =
|
1665
|
+
message.msgGlobalData.msgSecurityModel = readInt32 (reader);
|
1679
1666
|
|
1680
1667
|
// msgSecurityParameters
|
1681
1668
|
message.msgSecurityParameters = {};
|
1682
1669
|
var msgSecurityParametersReader = new ber.Reader (reader.readString (ber.OctetString, true));
|
1683
1670
|
msgSecurityParametersReader.readSequence ();
|
1684
1671
|
message.msgSecurityParameters.msgAuthoritativeEngineID = msgSecurityParametersReader.readString (ber.OctetString, true);
|
1685
|
-
message.msgSecurityParameters.msgAuthoritativeEngineBoots =
|
1686
|
-
message.msgSecurityParameters.msgAuthoritativeEngineTime =
|
1672
|
+
message.msgSecurityParameters.msgAuthoritativeEngineBoots = readInt32 (msgSecurityParametersReader);
|
1673
|
+
message.msgSecurityParameters.msgAuthoritativeEngineTime = readInt32 (msgSecurityParametersReader);
|
1687
1674
|
message.msgSecurityParameters.msgUserName = msgSecurityParametersReader.readString ();
|
1688
1675
|
message.msgSecurityParameters.msgAuthenticationParameters = msgSecurityParametersReader.readString (ber.OctetString, true);
|
1689
1676
|
message.msgSecurityParameters.msgPrivacyParameters = Buffer.from(msgSecurityParametersReader.readString (ber.OctetString, true));
|
@@ -4416,7 +4403,7 @@ Mib.convertOidToAddress = function (oid) {
|
|
4416
4403
|
throw new RangeError('object identifier component ' +
|
4417
4404
|
address[i] + ' is negative');
|
4418
4405
|
}
|
4419
|
-
if (n >
|
4406
|
+
if (n > MAX_SIGNED_INT32) {
|
4420
4407
|
throw new RangeError('object identifier component ' +
|
4421
4408
|
address[i] + ' is too large');
|
4422
4409
|
}
|
@@ -6230,8 +6217,8 @@ exports.RequestTimedOutError = RequestTimedOutError;
|
|
6230
6217
|
** Added for testing
|
6231
6218
|
**/
|
6232
6219
|
exports.ObjectParser = {
|
6233
|
-
|
6234
|
-
|
6220
|
+
readInt32: readInt32,
|
6221
|
+
readUint32: readUint32,
|
6235
6222
|
readVarbindValue: readVarbindValue
|
6236
6223
|
};
|
6237
6224
|
exports.Authentication = Authentication;
|
package/package.json
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
{
|
2
2
|
"name": "net-snmp",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.8.2",
|
4
4
|
"description": "JavaScript implementation of the Simple Network Management Protocol (SNMP)",
|
5
5
|
"main": "index.js",
|
6
6
|
"directories": {
|
7
7
|
"example": "example"
|
8
8
|
},
|
9
9
|
"dependencies": {
|
10
|
-
"asn1-ber": "
|
10
|
+
"asn1-ber": "^1.2.1",
|
11
11
|
"smart-buffer": "^4.1.0"
|
12
12
|
},
|
13
13
|
"devDependencies": {
|