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 CHANGED
@@ -1,7 +1,7 @@
1
1
  language: node_js
2
2
  node_js:
3
- - node
4
3
  - lts/*
4
+ - 14
5
5
  - 12
6
6
  - 10
7
7
  - 8
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 MAX_INT32 = 2147483647;
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
- ** Some SNMP agents produce integers on the wire such as 00 ff ff ff ff.
383
- ** The ASN.1 BER parser we use throws an error when parsing this, which we
384
- ** believe is correct. So, we decided not to bother the "asn1" developer(s)
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
- if (length > 5) {
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
- for (var i = 0; i < length; i++) {
431
- value *= 256;
432
- value += buffer.readByte ();
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
- if (signedBitSet) {
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 = readInt (buffer);
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 = readUint (buffer);
442
+ value = readUint32 (buffer);
472
443
  } else if (type == ObjectType.Gauge) {
473
- value = readUint (buffer);
444
+ value = readUint32 (buffer);
474
445
  } else if (type == ObjectType.TimeTicks) {
475
- value = readUint (buffer);
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 writeUint (buffer, type, value) {
523
- var b = Buffer.alloc (4);
524
- b.writeUInt32BE (value, 0);
525
- buffer.writeBuffer (b, type);
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.writeInt (value);
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
- writeUint (buffer, ObjectType.Counter, value);
554
+ writeUint32 (buffer, ObjectType.Counter, value);
570
555
  break;
571
556
  case ObjectType.Gauge: // also Gauge32 & Unsigned32
572
- writeUint (buffer, ObjectType.Gauge, value);
557
+ writeUint32 (buffer, ObjectType.Gauge, value);
573
558
  break;
574
559
  case ObjectType.TimeTicks:
575
- writeUint (buffer, ObjectType.TimeTicks, value);
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.writeInt (this.id);
613
- buffer.writeInt ((this.type == PduType.GetBulkRequest)
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
- buffer.writeInt ((this.type == PduType.GetBulkRequest)
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 = reader.readInt ();
637
- this.nonRepeaters = reader.readInt ();
638
- this.maxRepetitions = reader.readInt ();
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.writeInt (this.generic);
744
- buffer.writeInt (this.specific);
745
- writeUint (buffer, ObjectType.TimeTicks,
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 = reader.readInt ();
760
- pdu.specific = reader.readInt ();
761
- pdu.upTime = readUint (reader);
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.writeInt (this.id);
815
- writer.writeInt (this.errorStatus || 0);
816
- writer.writeInt (this.errorIndex || 0);
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 = reader.readInt ();
826
- this.errorStatus = reader.readInt ();
827
- this.errorIndex = reader.readInt ();
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.writeInt (this.version);
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.writeInt (this.version);
1370
+ writeInt32 (writer, ObjectType.Integer, this.version);
1384
1371
 
1385
1372
  // HeaderData
1386
1373
  writer.startSequence ();
1387
- writer.writeInt (this.msgGlobalData.msgID);
1388
- writer.writeInt (this.msgGlobalData.msgMaxSize);
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.writeInt (this.msgGlobalData.msgSecurityModel);
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.writeInt (this.msgSecurityParameters.msgAuthoritativeEngineBoots);
1406
- writer.writeInt (this.msgSecurityParameters.msgAuthoritativeEngineTime);
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 = reader.readInt ();
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 = reader.readInt ();
1676
- message.msgGlobalData.msgMaxSize = reader.readInt ();
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 = reader.readInt ();
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 = msgSecurityParametersReader.readInt ();
1686
- message.msgSecurityParameters.msgAuthoritativeEngineTime = msgSecurityParametersReader.readInt ();
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 > MAX_INT32) {
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
- readInt: readInt,
6234
- readUint: readUint,
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.7.2",
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": {