@contrast/agent 4.4.1 → 4.6.0

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 (156) hide show
  1. package/bin/VERSION +1 -1
  2. package/bin/linux/contrast-service +0 -0
  3. package/bin/mac/contrast-service +0 -0
  4. package/bin/windows/contrast-service.exe +0 -0
  5. package/lib/assess/hapi/route-coverage.js +3 -3
  6. package/lib/assess/membrane/index.js +2 -8
  7. package/lib/assess/membrane/source-membrane.js +3 -4
  8. package/lib/assess/models/base-event.js +2 -2
  9. package/lib/assess/models/call-context.js +0 -3
  10. package/lib/assess/policy/propagators.json +20 -0
  11. package/lib/assess/policy/signatures.json +103 -0
  12. package/lib/assess/propagators/path/common.js +165 -36
  13. package/lib/assess/propagators/path/join.js +5 -1
  14. package/lib/assess/propagators/path/normalize.js +5 -1
  15. package/lib/assess/propagators/path/resolve.js +11 -2
  16. package/lib/assess/response-scanning/autocomplete-missing.js +0 -2
  17. package/lib/assess/response-scanning/parameter-pollution.js +0 -2
  18. package/lib/core/arch-components/dynamodb.js +1 -2
  19. package/lib/core/arch-components/dynamodbv3.js +44 -0
  20. package/lib/core/arch-components/index.js +1 -0
  21. package/lib/core/async-storage/hooks/bluebird.js +20 -0
  22. package/lib/core/config/options.js +3 -2
  23. package/lib/core/express/utils.js +1 -1
  24. package/lib/core/logger/debug-logger.js +15 -17
  25. package/lib/core/stacktrace.js +3 -4
  26. package/lib/feature-set.js +2 -1
  27. package/lib/hooks/encoding.js +1 -1
  28. package/lib/hooks/frameworks/base.js +8 -2
  29. package/lib/hooks/frameworks/http.js +23 -16
  30. package/lib/hooks/frameworks/http2.js +73 -0
  31. package/lib/hooks/frameworks/index.js +8 -3
  32. package/lib/hooks/http.js +112 -128
  33. package/lib/hooks/patcher.js +10 -12
  34. package/lib/hooks/require.js +16 -22
  35. package/lib/instrumentation.js +0 -3
  36. package/lib/protect/analysis/aho-corasick.js +13 -30
  37. package/lib/protect/rules/cmd-injection-command-backdoors/backdoor-detector.js +3 -3
  38. package/lib/protect/rules/signatures/reflected-xss/helpers/function-call.js +1 -1
  39. package/lib/protect/rules/xss/helpers/function-call.js +1 -1
  40. package/lib/util/clean-stack.js +1 -1
  41. package/lib/util/clean-string/brackets.js +3 -3
  42. package/lib/util/clean-string/concatenations.js +1 -1
  43. package/lib/util/clean-string/util.js +1 -2
  44. package/lib/util/ip-analyzer.js +1 -1
  45. package/lib/util/some.js +27 -0
  46. package/lib/util/xml-analyzer/external-entity-finder.js +1 -1
  47. package/package.json +14 -15
  48. package/lib/hooks/frameworks/https.js +0 -42
  49. package/node_modules/bindings/LICENSE.md +0 -22
  50. package/node_modules/bindings/README.md +0 -98
  51. package/node_modules/bindings/bindings.js +0 -221
  52. package/node_modules/bindings/package.json +0 -32
  53. package/node_modules/file-uri-to-path/.npmignore +0 -1
  54. package/node_modules/file-uri-to-path/.travis.yml +0 -30
  55. package/node_modules/file-uri-to-path/History.md +0 -21
  56. package/node_modules/file-uri-to-path/LICENSE +0 -20
  57. package/node_modules/file-uri-to-path/README.md +0 -74
  58. package/node_modules/file-uri-to-path/index.d.ts +0 -2
  59. package/node_modules/file-uri-to-path/index.js +0 -66
  60. package/node_modules/file-uri-to-path/package.json +0 -36
  61. package/node_modules/file-uri-to-path/test/test.js +0 -24
  62. package/node_modules/file-uri-to-path/test/tests.json +0 -13
  63. package/node_modules/glossy/LICENSE +0 -19
  64. package/node_modules/glossy/README.md +0 -129
  65. package/node_modules/glossy/index.js +0 -12
  66. package/node_modules/glossy/lib/glossy/parse.js +0 -520
  67. package/node_modules/glossy/lib/glossy/produce.js +0 -459
  68. package/node_modules/glossy/package.json +0 -47
  69. package/node_modules/glossy/test/decide.js +0 -7
  70. package/node_modules/glossy/test/decode_pri.js +0 -24
  71. package/node_modules/glossy/test/parse_3164.js +0 -104
  72. package/node_modules/glossy/test/parse_5424.js +0 -106
  73. package/node_modules/glossy/test/parse_5848.js +0 -40
  74. package/node_modules/glossy/test/parse_8601.js +0 -14
  75. package/node_modules/glossy/test/parse_rfc3339.js +0 -9
  76. package/node_modules/glossy/test/produce.js +0 -162
  77. package/node_modules/glossy/test/runner.js +0 -40
  78. package/node_modules/glossy/test/structure_data.js +0 -24
  79. package/node_modules/nan/CHANGELOG.md +0 -537
  80. package/node_modules/nan/LICENSE.md +0 -13
  81. package/node_modules/nan/README.md +0 -455
  82. package/node_modules/nan/doc/asyncworker.md +0 -146
  83. package/node_modules/nan/doc/buffers.md +0 -54
  84. package/node_modules/nan/doc/callback.md +0 -76
  85. package/node_modules/nan/doc/converters.md +0 -41
  86. package/node_modules/nan/doc/errors.md +0 -226
  87. package/node_modules/nan/doc/json.md +0 -62
  88. package/node_modules/nan/doc/maybe_types.md +0 -583
  89. package/node_modules/nan/doc/methods.md +0 -664
  90. package/node_modules/nan/doc/new.md +0 -147
  91. package/node_modules/nan/doc/node_misc.md +0 -123
  92. package/node_modules/nan/doc/object_wrappers.md +0 -263
  93. package/node_modules/nan/doc/persistent.md +0 -296
  94. package/node_modules/nan/doc/scopes.md +0 -73
  95. package/node_modules/nan/doc/script.md +0 -38
  96. package/node_modules/nan/doc/string_bytes.md +0 -62
  97. package/node_modules/nan/doc/v8_internals.md +0 -199
  98. package/node_modules/nan/doc/v8_misc.md +0 -85
  99. package/node_modules/nan/include_dirs.js +0 -1
  100. package/node_modules/nan/nan.h +0 -2898
  101. package/node_modules/nan/nan_callbacks.h +0 -88
  102. package/node_modules/nan/nan_callbacks_12_inl.h +0 -514
  103. package/node_modules/nan/nan_callbacks_pre_12_inl.h +0 -520
  104. package/node_modules/nan/nan_converters.h +0 -72
  105. package/node_modules/nan/nan_converters_43_inl.h +0 -68
  106. package/node_modules/nan/nan_converters_pre_43_inl.h +0 -42
  107. package/node_modules/nan/nan_define_own_property_helper.h +0 -29
  108. package/node_modules/nan/nan_implementation_12_inl.h +0 -430
  109. package/node_modules/nan/nan_implementation_pre_12_inl.h +0 -263
  110. package/node_modules/nan/nan_json.h +0 -166
  111. package/node_modules/nan/nan_maybe_43_inl.h +0 -356
  112. package/node_modules/nan/nan_maybe_pre_43_inl.h +0 -268
  113. package/node_modules/nan/nan_new.h +0 -340
  114. package/node_modules/nan/nan_object_wrap.h +0 -156
  115. package/node_modules/nan/nan_persistent_12_inl.h +0 -132
  116. package/node_modules/nan/nan_persistent_pre_12_inl.h +0 -242
  117. package/node_modules/nan/nan_private.h +0 -73
  118. package/node_modules/nan/nan_string_bytes.h +0 -305
  119. package/node_modules/nan/nan_typedarray_contents.h +0 -96
  120. package/node_modules/nan/nan_weak.h +0 -437
  121. package/node_modules/nan/package.json +0 -41
  122. package/node_modules/nan/tools/1to2.js +0 -412
  123. package/node_modules/nan/tools/README.md +0 -14
  124. package/node_modules/nan/tools/package.json +0 -19
  125. package/node_modules/unix-dgram/LICENSE +0 -13
  126. package/node_modules/unix-dgram/README.md +0 -107
  127. package/node_modules/unix-dgram/binding.gyp +0 -20
  128. package/node_modules/unix-dgram/build/Makefile +0 -324
  129. package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram/src/unix_dgram.o.d +0 -58
  130. package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram.node.d +0 -1
  131. package/node_modules/unix-dgram/build/Release/.deps/Release/unix_dgram.node.d +0 -1
  132. package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram/src/unix_dgram.o +0 -0
  133. package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram.node +0 -0
  134. package/node_modules/unix-dgram/build/Release/unix_dgram.node +0 -0
  135. package/node_modules/unix-dgram/build/binding.Makefile +0 -6
  136. package/node_modules/unix-dgram/build/config.gypi +0 -213
  137. package/node_modules/unix-dgram/build/unix_dgram.target.mk +0 -159
  138. package/node_modules/unix-dgram/lib/unix_dgram.js +0 -168
  139. package/node_modules/unix-dgram/package.json +0 -36
  140. package/node_modules/unix-dgram/src/unix_dgram.cc +0 -404
  141. package/node_modules/unix-dgram/src/win_dummy.cc +0 -7
  142. package/node_modules/unix-dgram/test/test-connect-callback.js +0 -68
  143. package/node_modules/unix-dgram/test/test-connect.js +0 -53
  144. package/node_modules/unix-dgram/test/test-dgram-unix.js +0 -58
  145. package/node_modules/unix-dgram/test/test-send-error.js +0 -26
  146. package/node_modules/winston-syslog/.eslintrc +0 -7
  147. package/node_modules/winston-syslog/.travis.yml +0 -14
  148. package/node_modules/winston-syslog/CHANGELOG.md +0 -9
  149. package/node_modules/winston-syslog/LICENSE +0 -20
  150. package/node_modules/winston-syslog/README.md +0 -135
  151. package/node_modules/winston-syslog/lib/utils.js +0 -26
  152. package/node_modules/winston-syslog/lib/winston-syslog.js +0 -385
  153. package/node_modules/winston-syslog/package.json +0 -56
  154. package/node_modules/winston-syslog/test/format-test.js +0 -122
  155. package/node_modules/winston-syslog/test/syslog-test.js +0 -95
  156. package/node_modules/winston-syslog/test/unix-connect-test.js +0 -133
@@ -1,520 +0,0 @@
1
- /*
2
- * Glossy Parser - Parse incoming syslog messages
3
- *
4
- * Copyright Squeeks <privacymyass@gmail.com>.
5
- * This is free software licensed under the MIT License -
6
- * see the LICENSE file that should be included with this package.
7
- */
8
-
9
- /*
10
- * These values replace the integers in message that define the facility.
11
- */
12
- var FacilityIndex = [
13
- 'kern', // kernel messages
14
- 'user', // user-level messages
15
- 'mail', // mail system
16
- 'daemon', // system daemons
17
- 'auth', // security/authorization messages
18
- 'syslog', // messages generated internally by syslogd
19
- 'lpr', // line printer subsystem
20
- 'news', // network news subsystem
21
- 'uucp', // UUCP subsystem
22
- 'clock', // clock daemon
23
- 'sec', // security/authorization messages
24
- 'ftp', // FTP daemon
25
- 'ntp', // NTP subsystem
26
- 'audit', // log audit
27
- 'alert', // log alert
28
- 'clock', // clock daemon (note 2)
29
- 'local0', // local use 0 (local0)
30
- 'local1', // local use 1 (local1)
31
- 'local2', // local use 2 (local2)
32
- 'local3', // local use 3 (local3)
33
- 'local4', // local use 4 (local4)
34
- 'local5', // local use 5 (local5)
35
- 'local6', // local use 6 (local6)
36
- 'local7' // local use 7 (local7)
37
- ];
38
-
39
- // Note 1 - Various operating systems have been found to utilize
40
- // Facilities 4, 10, 13 and 14 for security/authorization,
41
- // audit, and alert messages which seem to be similar.
42
-
43
- // Note 2 - Various operating systems have been found to utilize
44
- // both Facilities 9 and 15 for clock (cron/at) messages.
45
-
46
- /*
47
- * These values replace the integers in message that define the severity.
48
- */
49
- var SeverityIndex = [
50
- 'emerg', // Emergency: system is unusable
51
- 'alert', // Alert: action must be taken immediately
52
- 'crit', // Critical: critical conditions
53
- 'err', // Error: error conditions
54
- 'warn', // Warning: warning conditions
55
- 'notice', // Notice: normal but significant condition
56
- 'info', // Informational: informational messages
57
- 'debug' // Debug: debug-level messages
58
- ];
59
-
60
- /*
61
- * Defines the range matching BSD style months to integers.
62
- */
63
- var BSDDateIndex = {
64
- 'Jan': 0,
65
- 'Feb': 1,
66
- 'Mar': 2,
67
- 'Apr': 3,
68
- 'May': 4,
69
- 'Jun': 5,
70
- 'Jul': 6,
71
- 'Aug': 7,
72
- 'Sep': 8,
73
- 'Oct': 9,
74
- 'Nov': 10,
75
- 'Dec': 11
76
- };
77
-
78
- // These values match the hasing algorithm values as defined in RFC 5848
79
- var signedBlockValues = {
80
-
81
- // Section 4.2.1
82
- hashAlgorithm: [
83
- null,
84
- 'SHA1',
85
- 'SHA256'
86
- ],
87
-
88
- // Section 5.2.1
89
- keyBlobType: {
90
- 'C': 'PKIX Certificate',
91
- 'P': 'OpenPGP KeyID',
92
- 'K': 'Public Key',
93
- 'N': 'No key information',
94
- 'U': 'Unknown'
95
- }
96
-
97
- };
98
-
99
- var GlossyParser = function() {};
100
-
101
- /*
102
- * Parse the raw message received.
103
- *
104
- * @param {String/Buffer} rawMessage Raw message received from socket
105
- * @param {Function} callback Callback to run after parse is complete
106
- * @return {Object} map containing all successfully parsed data.
107
- */
108
- GlossyParser.prototype.parse = function(rawMessage, callback) {
109
-
110
- // Are you node.js? Is this a Buffer?
111
- if(typeof Buffer == 'function' && Buffer.isBuffer(rawMessage)) {
112
- rawMessage = rawMessage.toString('utf8', 0);
113
- } else if(typeof rawMessage != 'string') {
114
- return rawMessage;
115
- }
116
-
117
- // Always return the original message
118
- var parsedMessage = {
119
- originalMessage: rawMessage
120
- };
121
-
122
- var segments = rawMessage.split(' ');
123
- if(segments.length < 2) return parsedMessage;
124
- var priKeys = this.decodePri(segments[0]);
125
- if(priKeys) {
126
- for (var key in priKeys) parsedMessage[key] = priKeys[key];
127
- }
128
-
129
- var timeStamp;
130
- //TODO Could our detection between 3164/5424 be improved?
131
- if(segments[0].match(/^(<\d+>\d)$/)) {
132
- segments.shift(); // Shift the prival off
133
- timeStamp = segments.shift();
134
- parsedMessage.type = 'RFC5424';
135
- parsedMessage.time = this.parseTimeStamp(timeStamp);
136
- parsedMessage.host = this.decideValue(segments.shift());
137
- parsedMessage.appName = this.decideValue(segments.shift());
138
- parsedMessage.pid = this.decideValue(segments.shift());
139
- parsedMessage.msgID = this.decideValue(segments.shift());
140
-
141
- if(segments[0] !== '-') {
142
- var spliceMarker = 0;
143
- for (i = segments.length -1; i > -1; i--) {
144
- if(segments[i].substr(-1) === ']'){
145
- spliceMarker = i;
146
- spliceMarker++;
147
- break;
148
- }
149
- }
150
- if(spliceMarker !== 0) {
151
- var sd = segments.splice(0, spliceMarker).join(' ');
152
- parsedMessage.structuredData = this.parseStructure(sd);
153
-
154
- if(parsedMessage.structuredData.ssign) {
155
- parsedMessage.structuredData.signedBlock =
156
- this.parseSignedBlock(parsedMessage.structuredData);
157
- } else if(parsedMessage.structuredData['ssign-cert']) {
158
- parsedMessage.structuredData.signedBlock =
159
- this.parseSignedCertificate(parsedMessage.structuredData);
160
- }
161
-
162
- }
163
- } else {
164
- segments.shift(); // Shift the SD marker off
165
- }
166
- parsedMessage.message = segments.join(' ');
167
-
168
- } else if (segments[0].match(/^(<\d+>\d+:)$/)) {
169
- parsedMessage.type = 'RFC3164';
170
- timeStamp = segments.splice(0,1).join(' ').replace(/^(<\d+>)/,'');
171
- parsedMessage.time = this.parseBsdTime(timeStamp);
172
- parsedMessage.message = segments.join(' ');
173
-
174
- } else if(segments[0].match(/^(<\d+>\w+)/)) {
175
- parsedMessage.type = 'RFC3164';
176
- if (segments[1] === '') segments.splice(1,1);
177
- timeStamp = segments.splice(0,3).join(' ').replace(/^(<\d+>)/,'');
178
- parsedMessage.time = this.parseBsdTime(timeStamp);
179
- parsedMessage.host = segments.shift();
180
- parsedMessage.message = segments.join(' ');
181
- }
182
-
183
- if(callback) {
184
- callback(parsedMessage);
185
- } else {
186
- return parsedMessage;
187
- }
188
-
189
- };
190
-
191
- /*
192
- * RFC5424 messages are supposed to specify '-' as the null value
193
- * @param {String} a section from an RFC5424 message
194
- * @return {Boolean/String} null if string is entirely '-', or the original value
195
- */
196
- GlossyParser.prototype.decideValue = function(value) {
197
- return value === '-' ? null : value;
198
- };
199
-
200
- /*
201
- * Parses the PRI value from the start of message
202
- *
203
- * @param {String} message Supplied raw primary value and version
204
- * @return {Object} Returns object containing Facility, Severity and Version
205
- * if correctly parsed, empty values on failure.
206
- */
207
- GlossyParser.prototype.decodePri = function(message) {
208
- if(typeof message != 'string') return;
209
-
210
- var privalMatch = message.match(/^<(\d+)>/);
211
- if(!privalMatch) return false;
212
-
213
- var returnVal = {
214
- prival: parseInt(privalMatch[1], 10)
215
- };
216
-
217
- if(privalMatch[2]) returnVal.versio = parseInt(privalMatch[2], 10);
218
-
219
- if(returnVal.prival && returnVal.prival >= 0 && returnVal.prival <= 191) {
220
-
221
- returnVal.facilityID = parseInt(returnVal.prival / 8, 10);
222
- returnVal.severityID = returnVal.prival - (returnVal.facilityID * 8);
223
-
224
- if(returnVal.facilityID < 24 && returnVal.severityID < 8) {
225
- returnVal.facility = FacilityIndex[returnVal.facilityID];
226
- returnVal.severity = SeverityIndex[returnVal.severityID];
227
- }
228
- } else if(returnVal.prival >= 191) {
229
- return false;
230
- }
231
-
232
- return returnVal;
233
- };
234
-
235
-
236
- /*
237
- * Attempts to parse a given timestamp
238
- * @param {String} timeStamp Supplied timestamp, should only be the timestamp,
239
- * not the entire message
240
- * @return {Object} Date object on success
241
- */
242
- GlossyParser.prototype.parseTimeStamp = function(timeStamp) {
243
-
244
- if(typeof timeStamp != 'string') return;
245
- var parsedTime;
246
-
247
- parsedTime = this.parse8601(timeStamp);
248
- if(parsedTime) return parsedTime;
249
-
250
- parsedTime = this.parseRfc3339(timeStamp);
251
- if(parsedTime) return parsedTime;
252
-
253
- parsedTime = this.parseBsdTime(timeStamp);
254
- if(parsedTime) return parsedTime;
255
-
256
- return parsedTime;
257
-
258
- };
259
-
260
- /*
261
- * Parse RFC3339 style timestamps
262
- * @param {String} timeStamp
263
- * @return {Date/false} Timestamp, if parsed correctly
264
- * @see http://blog.toppingdesign.com/2009/08/13/fast-rfc-3339-date-processing-in-javascript/
265
- */
266
- GlossyParser.prototype.parseRfc3339 = function(timeStamp){
267
-   var utcOffset, offsetSplitChar, offsetString,
268
-     offsetMultiplier = 1,
269
-     dateTime = timeStamp.split("T");
270
- if(dateTime.length < 2) return false;
271
-
272
-     var date = dateTime[0].split("-"),
273
-     time = dateTime[1].split(":"),
274
-     offsetField = time[time.length - 1];
275
-
276
-     offsetFieldIdentifier = offsetField.charAt(offsetField.length - 1);
277
-     if (offsetFieldIdentifier === "Z") {
278
-     utcOffset = 0;
279
-         time[time.length - 1] = offsetField.substr(0, offsetField.length - 2);
280
-     } else {
281
-     if (offsetField[offsetField.length - 1].indexOf("+") != -1) {
282
-             offsetSplitChar = "+";
283
-             offsetMultiplier = 1;
284
-         } else {
285
-             offsetSplitChar = "-";
286
-             offsetMultiplier = -1;
287
-         }
288
-
289
-         offsetString = offsetField.split(offsetSplitChar);
290
- if(offsetString.length < 2) return false;
291
-         time[(time.length - 1)] = offsetString[0];
292
-         offsetString = offsetString[1].split(":");
293
-         utcOffset = (offsetString[0] * 60) + offsetString[1];
294
-         utcOffset = utcOffset * 60 * 1000;
295
-     }
296
-                
297
-     var parsedTime = new Date(Date.UTC(date[0], date[1] - 1, date[2], time[0], time[1], time[2]) + (utcOffset * offsetMultiplier ));
298
-     return parsedTime;
299
- };
300
-
301
- /*
302
- * Parse "BSD style" timestamps, as defined in RFC3164
303
- * @param {String} timeStamp
304
- * @return {Date/false} Timestamp, if parsed correctly
305
- */
306
- GlossyParser.prototype.parseBsdTime = function(timeStamp) {
307
- var parsedTime;
308
- var d = timeStamp.match(/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{1,2})\s+(\d{2}):(\d{2}):(\d{2})/);
309
- if(d) {
310
- // Years are absent from the specification, use this year
311
- currDate = new Date();
312
- parsedTime = new Date(
313
- currDate.getUTCFullYear(),
314
- BSDDateIndex[ d[1] ],
315
- d[2],
316
- d[3],
317
- d[4],
318
- d[5]);
319
- }
320
-
321
- return parsedTime;
322
- };
323
-
324
- /*
325
- * Parse ISO 8601 timestamps
326
- * @param {String} timeStamp
327
- * @return {Object/false} Timestamp, if successfully parsed
328
- */
329
- GlossyParser.prototype.parse8601 = function(timeStamp) {
330
- var parsedTime = new Date(Date.parse(timeStamp));
331
- if(parsedTime.toString() === 'Invalid Date') return; //FIXME not the best
332
- return parsedTime;
333
- };
334
-
335
-
336
- /*
337
- * Parse the structured data out of RFC5424 messages
338
- * @param {String} msg The STRUCTURED-DATA section
339
- * @return {Object} sdStructure parsed structure
340
- */
341
- GlossyParser.prototype.parseStructure = function(msg) {
342
- var sdStructure = { };
343
-
344
- var state = 0,
345
- ignore = false,
346
- sdId = '',
347
- sdParam = '',
348
- sdValue = '';
349
-
350
- /*
351
- * Build the structure using a horrible FSM.
352
- * The states we cycle are as following:
353
- * 0 1 2 34 20
354
- * [sdID sdParam="sdValue"]
355
- */
356
- for(var i = 0; i < msg.length; i++) {
357
- var c = msg[i];
358
- switch(state) {
359
- case 0: // SD-ELEMENT
360
- state = (c === '[') ? 1 : 0;
361
- break;
362
- case 1: // SD-ID
363
- if(c != ' ') {
364
- sdId += c;
365
- } else {
366
- sdStructure[sdId] = {};
367
- state = 2;
368
- }
369
- break;
370
- case 2: // SD-PARAM
371
- if(c === '=') {
372
- sdStructure[sdId][sdParam] = '';
373
- state = 3;
374
- } else if(c === ']') {
375
- sdId = '';
376
- state = 0;
377
- } else if(c != ' '){
378
- sdParam += c;
379
- }
380
- break;
381
- case 3: // SD-PARAM/SD-VALUE
382
- state = c === '"' ? 4 : null; // FIXME Handle rubbish better
383
- break;
384
- case 4: // SD-VALUE
385
- if(c === '\\' && !ignore) {
386
- ignore = true;
387
- } else if(c === '"' && !ignore) {
388
- sdStructure[sdId][sdParam] = sdValue;
389
- sdParam = '', sdValue = '';
390
- state = 2;
391
- } else {
392
- sdValue += c;
393
- ignore = false;
394
- }
395
- break;
396
- default:
397
- break;
398
- }
399
- }
400
- return sdStructure;
401
- };
402
-
403
-
404
- /*
405
- * Make sense of signed block messages
406
- * @param {Object} block the parsed structured data containing signed data
407
- * @return {Object} validatedBlock translated and named values, binary
408
- * elements will be Buffer objects, if available
409
- */
410
- GlossyParser.prototype.parseSignedBlock = function(block) {
411
-
412
- if(typeof block != 'object') return false;
413
-
414
- var signedBlock = { };
415
- var validatedBlock = { };
416
- // Figure out where in the object the keys live...
417
- if(block.structuredData && block.structuredData.ssign) {
418
- signedBlock = block.structuredData.ssign;
419
- } else if(block.ssign) {
420
- signedBlock = block.ssign;
421
- } else if(block.VER) {
422
- signedBlock = block;
423
- } else {
424
- return false;
425
- }
426
-
427
- var versionMatch = signedBlock.VER.match(/^(\d{2})(\d|\w)(\d)$/);
428
- if(versionMatch !== null) {
429
- validatedBlock.version = versionMatch[1];
430
- validatedBlock.hashAlgorithm = parseInt(versionMatch[2], 10);
431
- validatedBlock.hashAlgoString = signedBlockValues.hashAlgorithm[validatedBlock.hashAlgorithm];
432
- validatedBlock.sigScheme = parseInt(versionMatch[3], 10);
433
- }
434
-
435
- validatedBlock.rebootSessionID = parseInt(signedBlock.RSID, 10);
436
- validatedBlock.signatureGroup = parseInt(signedBlock.SG, 10);
437
- validatedBlock.signaturePriority = parseInt(signedBlock.SPRI, 10);
438
- validatedBlock.globalBlockCount = parseInt(signedBlock.GBC, 10);
439
- validatedBlock.firstMsgNumber = parseInt(signedBlock.FMN, 10);
440
- validatedBlock.msgCount = parseInt(signedBlock.CNT, 10);
441
- validatedBlock.hashBlock = signedBlock.HB.split(/\s/);
442
-
443
- // Check to see if we're in node or have a Buffer type
444
- if(typeof Buffer == 'function') {
445
- for(var hash in validatedBlock.hashBlock) {
446
- validatedBlock.hashBlock[hash] = new Buffer(
447
- validatedBlock.hashBlock[hash], encoding='base64');
448
- }
449
- validatedBlock.thisSignature = new Buffer(
450
- signedBlock.SIGN, encoding='base64');
451
- } else {
452
- validatedBlock.thisSignature = signedBlock.SIGN;
453
- }
454
-
455
- return validatedBlock;
456
-
457
- };
458
-
459
-
460
- /*
461
- * Make sense of signed certificate messages
462
- * @param {Object} block the parsed structured data containing signed data
463
- * @return {Object} validatedBlock translated and named values, binary
464
- * elements will be Buffer objects, if available
465
- */
466
- GlossyParser.prototype.parseSignedCertificate = function(block) {
467
-
468
- if(typeof block != 'object') return false;
469
-
470
- var signedBlock = { };
471
- var validatedBlock = { };
472
- // Figure out where in the object the keys live...
473
- if(block.structuredData && block.structuredData['ssign-cert']) {
474
- signedBlock = block.structuredData['ssign-cert'];
475
- } else if(block['ssign-cert']) {
476
- signedBlock = block['ssign-cert'];
477
- } else if(block.VER) {
478
- signedBlock = block;
479
- } else {
480
- return false;
481
- }
482
-
483
- var versionMatch = signedBlock.VER.match(/^(\d{2})(\d|\w)(\d)$/);
484
- if(versionMatch !== null) {
485
- validatedBlock.version = versionMatch[1];
486
- validatedBlock.hashAlgorithm = parseInt(versionMatch[2], 10);
487
- validatedBlock.hashAlgoString = signedBlockValues.hashAlgorithm[validatedBlock.hashAlgorithm];
488
- validatedBlock.sigScheme = parseInt(versionMatch[3], 10);
489
- }
490
-
491
- validatedBlock.rebootSessionID = parseInt(signedBlock.RSID, 10);
492
- validatedBlock.signatureGroup = parseInt(signedBlock.SG, 10);
493
- validatedBlock.signaturePriority = parseInt(signedBlock.SPRI, 10);
494
- validatedBlock.totalPayloadLength = parseInt(signedBlock.TPBL, 10);
495
- validatedBlock.payloadIndex = parseInt(signedBlock.INDEX, 10);
496
- validatedBlock.fragmentLength = parseInt(signedBlock.FLEN, 10);
497
-
498
- var payloadFragment = signedBlock.FRAG.split(/\s/);
499
- validatedBlock.payloadTimestamp = this.parseTimeStamp(payloadFragment[0]);
500
- validatedBlock.payloadType = payloadFragment[1];
501
- validatedBlock.payloadName = signedBlockValues.keyBlobType[payloadFragment[1]];
502
-
503
- if(typeof Buffer == 'function') {
504
- validatedBlock.keyBlob = new Buffer(
505
- payloadFragment[2], encoding='base64');
506
- validatedBlock.thisSignature = new Buffer(
507
- signedBlock.SIGN, encoding='base64');
508
- } else {
509
- validatedBlock.keyBlob = payloadFragment[2];
510
- validatedBlock.thisSignature = signedBlock.SIGN;
511
- }
512
-
513
- return validatedBlock;
514
-
515
- };
516
-
517
-
518
- if(typeof module == 'object') {
519
- module.exports = new GlossyParser();
520
- }