@contrast/agent 4.5.1 → 4.7.1

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 (209) 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/membrane/deserialization-membrane.js +4 -5
  6. package/lib/assess/membrane/source-membrane.js +16 -33
  7. package/lib/assess/models/call-context.js +1 -1
  8. package/lib/assess/policy/propagators.json +19 -21
  9. package/lib/assess/policy/rules.json +7 -2
  10. package/lib/assess/policy/signatures.json +42 -0
  11. package/lib/assess/policy/util.js +2 -1
  12. package/lib/assess/propagators/JSON/parse.js +1 -1
  13. package/lib/assess/propagators/JSON/stringify.js +3 -3
  14. package/lib/assess/propagators/array-prototype-join.js +7 -8
  15. package/lib/assess/propagators/common.js +7 -5
  16. package/lib/assess/propagators/dustjs/escape-html.js +22 -0
  17. package/lib/assess/propagators/dustjs/escape-js.js +22 -0
  18. package/lib/assess/propagators/encode-uri/encode-uri-component.js +22 -0
  19. package/lib/assess/propagators/encode-uri/encode-uri.js +22 -0
  20. package/lib/assess/propagators/handlebars-escape-expresssion.js +1 -1
  21. package/lib/assess/propagators/index.js +0 -2
  22. package/lib/assess/propagators/joi/boolean.js +1 -1
  23. package/lib/assess/propagators/joi/expression.js +1 -1
  24. package/lib/assess/propagators/joi/number.js +1 -1
  25. package/lib/assess/propagators/joi/string-base.js +1 -1
  26. package/lib/assess/propagators/joi/string-schema.js +12 -13
  27. package/lib/assess/propagators/joi/values.js +37 -22
  28. package/lib/assess/propagators/manager.js +12 -10
  29. package/lib/assess/propagators/mongoose/helpers.js +20 -0
  30. package/lib/assess/propagators/mongoose/index.js +18 -0
  31. package/lib/assess/propagators/mongoose/map.js +74 -0
  32. package/lib/assess/propagators/mongoose/string.js +104 -0
  33. package/lib/assess/propagators/mustache/escape.js +22 -0
  34. package/lib/assess/propagators/number.js +54 -0
  35. package/lib/assess/propagators/object.js +6 -7
  36. package/lib/assess/propagators/path/basename.js +14 -13
  37. package/lib/assess/propagators/path/common.js +156 -47
  38. package/lib/assess/propagators/path/dirname.js +14 -13
  39. package/lib/assess/propagators/path/extname.js +14 -13
  40. package/lib/assess/propagators/path/join.js +5 -1
  41. package/lib/assess/propagators/path/normalize.js +1 -2
  42. package/lib/assess/propagators/path/parse.js +1 -1
  43. package/lib/assess/propagators/path/relative.js +7 -5
  44. package/lib/assess/propagators/path/resolve.js +11 -2
  45. package/lib/assess/propagators/querystring/escape.js +20 -18
  46. package/lib/assess/propagators/querystring/parse.js +7 -5
  47. package/lib/assess/propagators/querystring/stringify.js +25 -24
  48. package/lib/assess/propagators/querystring/unescape.js +20 -18
  49. package/lib/assess/propagators/sequelize/sql-string-escape.js +1 -1
  50. package/lib/assess/propagators/sequelize/sql-string-format-named-parameters.js +1 -1
  51. package/lib/assess/propagators/sequelize/sql-string-format.js +3 -3
  52. package/lib/assess/propagators/sequelize/utils.js +2 -2
  53. package/lib/assess/propagators/string-prototype-replace.js +30 -28
  54. package/lib/assess/propagators/string-prototype-split.js +36 -36
  55. package/lib/assess/propagators/string-prototype-trim.js +15 -17
  56. package/lib/assess/propagators/string.js +12 -16
  57. package/lib/assess/propagators/template-escape.js +87 -0
  58. package/lib/assess/propagators/templates.js +10 -11
  59. package/lib/assess/propagators/url/url-prototype-parse.js +5 -6
  60. package/lib/assess/propagators/url/url-url.js +51 -43
  61. package/lib/assess/propagators/util/format.js +1 -1
  62. package/lib/assess/propagators/v8/init-hooks.js +3 -3
  63. package/lib/assess/propagators/validator/init-hooks.js +22 -22
  64. package/lib/assess/sinks/common.js +10 -5
  65. package/lib/assess/sinks/dustjs-linkedin-xss.js +131 -0
  66. package/lib/assess/sinks/libxmljs-xxe.js +1 -1
  67. package/lib/assess/sinks/mongodb.js +2 -1
  68. package/lib/assess/sinks/ssrf-url.js +1 -1
  69. package/lib/constants.js +4 -1
  70. package/lib/core/arch-components/dynamodb.js +1 -2
  71. package/lib/core/arch-components/dynamodbv3.js +44 -0
  72. package/lib/core/arch-components/index.js +1 -0
  73. package/lib/core/arch-components/rethinkdb.js +53 -0
  74. package/lib/core/config/options.js +3 -2
  75. package/lib/core/rewrite/injections.js +8 -0
  76. package/lib/core/stacktrace.js +2 -1
  77. package/lib/feature-set.js +1 -1
  78. package/lib/hooks/frameworks/base.js +8 -2
  79. package/lib/hooks/frameworks/http.js +23 -16
  80. package/lib/hooks/frameworks/http2.js +73 -0
  81. package/lib/hooks/frameworks/index.js +8 -3
  82. package/lib/hooks/http.js +112 -128
  83. package/lib/hooks/object-to-primitive.js +6 -7
  84. package/lib/hooks/patcher.js +75 -44
  85. package/lib/hooks/require.js +16 -22
  86. package/lib/instrumentation.js +0 -3
  87. package/lib/protect/rules/nosqli/nosql-injection-rule.js +228 -0
  88. package/lib/protect/rules/rule-factory.js +2 -2
  89. package/lib/protect/service.js +23 -11
  90. package/lib/protect/sinks/mongodb.js +56 -55
  91. package/lib/reporter/translations/to-protobuf/dtm/index.js +1 -1
  92. package/lib/reporter/translations/to-protobuf/dtm/ip-denylist-details.js +1 -1
  93. package/lib/reporter/translations/to-protobuf/dtm/rasp-rule-sample.js +1 -1
  94. package/lib/reporter/translations/to-protobuf/settings/defend-features.js +8 -6
  95. package/lib/reporter/translations/to-protobuf/settings/exclusions.js +5 -4
  96. package/lib/tracker.js +13 -65
  97. package/lib/util/some.js +27 -0
  98. package/lib/util/source-map.js +1 -1
  99. package/package.json +15 -16
  100. package/lib/hooks/frameworks/https.js +0 -42
  101. package/lib/protect/rules/nosqli/no-sql-injection-rule.js +0 -109
  102. package/node_modules/bindings/LICENSE.md +0 -22
  103. package/node_modules/bindings/README.md +0 -98
  104. package/node_modules/bindings/bindings.js +0 -221
  105. package/node_modules/bindings/package.json +0 -32
  106. package/node_modules/file-uri-to-path/.npmignore +0 -1
  107. package/node_modules/file-uri-to-path/.travis.yml +0 -30
  108. package/node_modules/file-uri-to-path/History.md +0 -21
  109. package/node_modules/file-uri-to-path/LICENSE +0 -20
  110. package/node_modules/file-uri-to-path/README.md +0 -74
  111. package/node_modules/file-uri-to-path/index.d.ts +0 -2
  112. package/node_modules/file-uri-to-path/index.js +0 -66
  113. package/node_modules/file-uri-to-path/package.json +0 -36
  114. package/node_modules/file-uri-to-path/test/test.js +0 -24
  115. package/node_modules/file-uri-to-path/test/tests.json +0 -13
  116. package/node_modules/glossy/LICENSE +0 -19
  117. package/node_modules/glossy/README.md +0 -129
  118. package/node_modules/glossy/index.js +0 -12
  119. package/node_modules/glossy/lib/glossy/parse.js +0 -520
  120. package/node_modules/glossy/lib/glossy/produce.js +0 -459
  121. package/node_modules/glossy/package.json +0 -47
  122. package/node_modules/glossy/test/decide.js +0 -7
  123. package/node_modules/glossy/test/decode_pri.js +0 -24
  124. package/node_modules/glossy/test/parse_3164.js +0 -104
  125. package/node_modules/glossy/test/parse_5424.js +0 -106
  126. package/node_modules/glossy/test/parse_5848.js +0 -40
  127. package/node_modules/glossy/test/parse_8601.js +0 -14
  128. package/node_modules/glossy/test/parse_rfc3339.js +0 -9
  129. package/node_modules/glossy/test/produce.js +0 -162
  130. package/node_modules/glossy/test/runner.js +0 -40
  131. package/node_modules/glossy/test/structure_data.js +0 -24
  132. package/node_modules/nan/CHANGELOG.md +0 -537
  133. package/node_modules/nan/LICENSE.md +0 -13
  134. package/node_modules/nan/README.md +0 -455
  135. package/node_modules/nan/doc/asyncworker.md +0 -146
  136. package/node_modules/nan/doc/buffers.md +0 -54
  137. package/node_modules/nan/doc/callback.md +0 -76
  138. package/node_modules/nan/doc/converters.md +0 -41
  139. package/node_modules/nan/doc/errors.md +0 -226
  140. package/node_modules/nan/doc/json.md +0 -62
  141. package/node_modules/nan/doc/maybe_types.md +0 -583
  142. package/node_modules/nan/doc/methods.md +0 -664
  143. package/node_modules/nan/doc/new.md +0 -147
  144. package/node_modules/nan/doc/node_misc.md +0 -123
  145. package/node_modules/nan/doc/object_wrappers.md +0 -263
  146. package/node_modules/nan/doc/persistent.md +0 -296
  147. package/node_modules/nan/doc/scopes.md +0 -73
  148. package/node_modules/nan/doc/script.md +0 -38
  149. package/node_modules/nan/doc/string_bytes.md +0 -62
  150. package/node_modules/nan/doc/v8_internals.md +0 -199
  151. package/node_modules/nan/doc/v8_misc.md +0 -85
  152. package/node_modules/nan/include_dirs.js +0 -1
  153. package/node_modules/nan/nan.h +0 -2898
  154. package/node_modules/nan/nan_callbacks.h +0 -88
  155. package/node_modules/nan/nan_callbacks_12_inl.h +0 -514
  156. package/node_modules/nan/nan_callbacks_pre_12_inl.h +0 -520
  157. package/node_modules/nan/nan_converters.h +0 -72
  158. package/node_modules/nan/nan_converters_43_inl.h +0 -68
  159. package/node_modules/nan/nan_converters_pre_43_inl.h +0 -42
  160. package/node_modules/nan/nan_define_own_property_helper.h +0 -29
  161. package/node_modules/nan/nan_implementation_12_inl.h +0 -430
  162. package/node_modules/nan/nan_implementation_pre_12_inl.h +0 -263
  163. package/node_modules/nan/nan_json.h +0 -166
  164. package/node_modules/nan/nan_maybe_43_inl.h +0 -356
  165. package/node_modules/nan/nan_maybe_pre_43_inl.h +0 -268
  166. package/node_modules/nan/nan_new.h +0 -340
  167. package/node_modules/nan/nan_object_wrap.h +0 -156
  168. package/node_modules/nan/nan_persistent_12_inl.h +0 -132
  169. package/node_modules/nan/nan_persistent_pre_12_inl.h +0 -242
  170. package/node_modules/nan/nan_private.h +0 -73
  171. package/node_modules/nan/nan_string_bytes.h +0 -305
  172. package/node_modules/nan/nan_typedarray_contents.h +0 -96
  173. package/node_modules/nan/nan_weak.h +0 -437
  174. package/node_modules/nan/package.json +0 -41
  175. package/node_modules/nan/tools/1to2.js +0 -412
  176. package/node_modules/nan/tools/README.md +0 -14
  177. package/node_modules/nan/tools/package.json +0 -19
  178. package/node_modules/unix-dgram/LICENSE +0 -13
  179. package/node_modules/unix-dgram/README.md +0 -107
  180. package/node_modules/unix-dgram/binding.gyp +0 -20
  181. package/node_modules/unix-dgram/build/Makefile +0 -324
  182. package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram/src/unix_dgram.o.d +0 -58
  183. package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram.node.d +0 -1
  184. package/node_modules/unix-dgram/build/Release/.deps/Release/unix_dgram.node.d +0 -1
  185. package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram/src/unix_dgram.o +0 -0
  186. package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram.node +0 -0
  187. package/node_modules/unix-dgram/build/Release/unix_dgram.node +0 -0
  188. package/node_modules/unix-dgram/build/binding.Makefile +0 -6
  189. package/node_modules/unix-dgram/build/config.gypi +0 -213
  190. package/node_modules/unix-dgram/build/unix_dgram.target.mk +0 -159
  191. package/node_modules/unix-dgram/lib/unix_dgram.js +0 -168
  192. package/node_modules/unix-dgram/package.json +0 -36
  193. package/node_modules/unix-dgram/src/unix_dgram.cc +0 -404
  194. package/node_modules/unix-dgram/src/win_dummy.cc +0 -7
  195. package/node_modules/unix-dgram/test/test-connect-callback.js +0 -68
  196. package/node_modules/unix-dgram/test/test-connect.js +0 -53
  197. package/node_modules/unix-dgram/test/test-dgram-unix.js +0 -58
  198. package/node_modules/unix-dgram/test/test-send-error.js +0 -26
  199. package/node_modules/winston-syslog/.eslintrc +0 -7
  200. package/node_modules/winston-syslog/.travis.yml +0 -14
  201. package/node_modules/winston-syslog/CHANGELOG.md +0 -9
  202. package/node_modules/winston-syslog/LICENSE +0 -20
  203. package/node_modules/winston-syslog/README.md +0 -135
  204. package/node_modules/winston-syslog/lib/utils.js +0 -26
  205. package/node_modules/winston-syslog/lib/winston-syslog.js +0 -385
  206. package/node_modules/winston-syslog/package.json +0 -56
  207. package/node_modules/winston-syslog/test/format-test.js +0 -122
  208. package/node_modules/winston-syslog/test/syslog-test.js +0 -95
  209. 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
- }