@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.
- package/bin/VERSION +1 -1
- package/bin/linux/contrast-service +0 -0
- package/bin/mac/contrast-service +0 -0
- package/bin/windows/contrast-service.exe +0 -0
- package/lib/assess/membrane/deserialization-membrane.js +4 -5
- package/lib/assess/membrane/source-membrane.js +16 -33
- package/lib/assess/models/call-context.js +1 -1
- package/lib/assess/policy/propagators.json +19 -21
- package/lib/assess/policy/rules.json +7 -2
- package/lib/assess/policy/signatures.json +42 -0
- package/lib/assess/policy/util.js +2 -1
- package/lib/assess/propagators/JSON/parse.js +1 -1
- package/lib/assess/propagators/JSON/stringify.js +3 -3
- package/lib/assess/propagators/array-prototype-join.js +7 -8
- package/lib/assess/propagators/common.js +7 -5
- package/lib/assess/propagators/dustjs/escape-html.js +22 -0
- package/lib/assess/propagators/dustjs/escape-js.js +22 -0
- package/lib/assess/propagators/encode-uri/encode-uri-component.js +22 -0
- package/lib/assess/propagators/encode-uri/encode-uri.js +22 -0
- package/lib/assess/propagators/handlebars-escape-expresssion.js +1 -1
- package/lib/assess/propagators/index.js +0 -2
- package/lib/assess/propagators/joi/boolean.js +1 -1
- package/lib/assess/propagators/joi/expression.js +1 -1
- package/lib/assess/propagators/joi/number.js +1 -1
- package/lib/assess/propagators/joi/string-base.js +1 -1
- package/lib/assess/propagators/joi/string-schema.js +12 -13
- package/lib/assess/propagators/joi/values.js +37 -22
- package/lib/assess/propagators/manager.js +12 -10
- package/lib/assess/propagators/mongoose/helpers.js +20 -0
- package/lib/assess/propagators/mongoose/index.js +18 -0
- package/lib/assess/propagators/mongoose/map.js +74 -0
- package/lib/assess/propagators/mongoose/string.js +104 -0
- package/lib/assess/propagators/mustache/escape.js +22 -0
- package/lib/assess/propagators/number.js +54 -0
- package/lib/assess/propagators/object.js +6 -7
- package/lib/assess/propagators/path/basename.js +14 -13
- package/lib/assess/propagators/path/common.js +156 -47
- package/lib/assess/propagators/path/dirname.js +14 -13
- package/lib/assess/propagators/path/extname.js +14 -13
- package/lib/assess/propagators/path/join.js +5 -1
- package/lib/assess/propagators/path/normalize.js +1 -2
- package/lib/assess/propagators/path/parse.js +1 -1
- package/lib/assess/propagators/path/relative.js +7 -5
- package/lib/assess/propagators/path/resolve.js +11 -2
- package/lib/assess/propagators/querystring/escape.js +20 -18
- package/lib/assess/propagators/querystring/parse.js +7 -5
- package/lib/assess/propagators/querystring/stringify.js +25 -24
- package/lib/assess/propagators/querystring/unescape.js +20 -18
- package/lib/assess/propagators/sequelize/sql-string-escape.js +1 -1
- package/lib/assess/propagators/sequelize/sql-string-format-named-parameters.js +1 -1
- package/lib/assess/propagators/sequelize/sql-string-format.js +3 -3
- package/lib/assess/propagators/sequelize/utils.js +2 -2
- package/lib/assess/propagators/string-prototype-replace.js +30 -28
- package/lib/assess/propagators/string-prototype-split.js +36 -36
- package/lib/assess/propagators/string-prototype-trim.js +15 -17
- package/lib/assess/propagators/string.js +12 -16
- package/lib/assess/propagators/template-escape.js +87 -0
- package/lib/assess/propagators/templates.js +10 -11
- package/lib/assess/propagators/url/url-prototype-parse.js +5 -6
- package/lib/assess/propagators/url/url-url.js +51 -43
- package/lib/assess/propagators/util/format.js +1 -1
- package/lib/assess/propagators/v8/init-hooks.js +3 -3
- package/lib/assess/propagators/validator/init-hooks.js +22 -22
- package/lib/assess/sinks/common.js +10 -5
- package/lib/assess/sinks/dustjs-linkedin-xss.js +131 -0
- package/lib/assess/sinks/libxmljs-xxe.js +1 -1
- package/lib/assess/sinks/mongodb.js +2 -1
- package/lib/assess/sinks/ssrf-url.js +1 -1
- package/lib/constants.js +4 -1
- package/lib/core/arch-components/dynamodb.js +1 -2
- package/lib/core/arch-components/dynamodbv3.js +44 -0
- package/lib/core/arch-components/index.js +1 -0
- package/lib/core/arch-components/rethinkdb.js +53 -0
- package/lib/core/config/options.js +3 -2
- package/lib/core/rewrite/injections.js +8 -0
- package/lib/core/stacktrace.js +2 -1
- package/lib/feature-set.js +1 -1
- package/lib/hooks/frameworks/base.js +8 -2
- package/lib/hooks/frameworks/http.js +23 -16
- package/lib/hooks/frameworks/http2.js +73 -0
- package/lib/hooks/frameworks/index.js +8 -3
- package/lib/hooks/http.js +112 -128
- package/lib/hooks/object-to-primitive.js +6 -7
- package/lib/hooks/patcher.js +75 -44
- package/lib/hooks/require.js +16 -22
- package/lib/instrumentation.js +0 -3
- package/lib/protect/rules/nosqli/nosql-injection-rule.js +228 -0
- package/lib/protect/rules/rule-factory.js +2 -2
- package/lib/protect/service.js +23 -11
- package/lib/protect/sinks/mongodb.js +56 -55
- package/lib/reporter/translations/to-protobuf/dtm/index.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/ip-denylist-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/rasp-rule-sample.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/defend-features.js +8 -6
- package/lib/reporter/translations/to-protobuf/settings/exclusions.js +5 -4
- package/lib/tracker.js +13 -65
- package/lib/util/some.js +27 -0
- package/lib/util/source-map.js +1 -1
- package/package.json +15 -16
- package/lib/hooks/frameworks/https.js +0 -42
- package/lib/protect/rules/nosqli/no-sql-injection-rule.js +0 -109
- package/node_modules/bindings/LICENSE.md +0 -22
- package/node_modules/bindings/README.md +0 -98
- package/node_modules/bindings/bindings.js +0 -221
- package/node_modules/bindings/package.json +0 -32
- package/node_modules/file-uri-to-path/.npmignore +0 -1
- package/node_modules/file-uri-to-path/.travis.yml +0 -30
- package/node_modules/file-uri-to-path/History.md +0 -21
- package/node_modules/file-uri-to-path/LICENSE +0 -20
- package/node_modules/file-uri-to-path/README.md +0 -74
- package/node_modules/file-uri-to-path/index.d.ts +0 -2
- package/node_modules/file-uri-to-path/index.js +0 -66
- package/node_modules/file-uri-to-path/package.json +0 -36
- package/node_modules/file-uri-to-path/test/test.js +0 -24
- package/node_modules/file-uri-to-path/test/tests.json +0 -13
- package/node_modules/glossy/LICENSE +0 -19
- package/node_modules/glossy/README.md +0 -129
- package/node_modules/glossy/index.js +0 -12
- package/node_modules/glossy/lib/glossy/parse.js +0 -520
- package/node_modules/glossy/lib/glossy/produce.js +0 -459
- package/node_modules/glossy/package.json +0 -47
- package/node_modules/glossy/test/decide.js +0 -7
- package/node_modules/glossy/test/decode_pri.js +0 -24
- package/node_modules/glossy/test/parse_3164.js +0 -104
- package/node_modules/glossy/test/parse_5424.js +0 -106
- package/node_modules/glossy/test/parse_5848.js +0 -40
- package/node_modules/glossy/test/parse_8601.js +0 -14
- package/node_modules/glossy/test/parse_rfc3339.js +0 -9
- package/node_modules/glossy/test/produce.js +0 -162
- package/node_modules/glossy/test/runner.js +0 -40
- package/node_modules/glossy/test/structure_data.js +0 -24
- package/node_modules/nan/CHANGELOG.md +0 -537
- package/node_modules/nan/LICENSE.md +0 -13
- package/node_modules/nan/README.md +0 -455
- package/node_modules/nan/doc/asyncworker.md +0 -146
- package/node_modules/nan/doc/buffers.md +0 -54
- package/node_modules/nan/doc/callback.md +0 -76
- package/node_modules/nan/doc/converters.md +0 -41
- package/node_modules/nan/doc/errors.md +0 -226
- package/node_modules/nan/doc/json.md +0 -62
- package/node_modules/nan/doc/maybe_types.md +0 -583
- package/node_modules/nan/doc/methods.md +0 -664
- package/node_modules/nan/doc/new.md +0 -147
- package/node_modules/nan/doc/node_misc.md +0 -123
- package/node_modules/nan/doc/object_wrappers.md +0 -263
- package/node_modules/nan/doc/persistent.md +0 -296
- package/node_modules/nan/doc/scopes.md +0 -73
- package/node_modules/nan/doc/script.md +0 -38
- package/node_modules/nan/doc/string_bytes.md +0 -62
- package/node_modules/nan/doc/v8_internals.md +0 -199
- package/node_modules/nan/doc/v8_misc.md +0 -85
- package/node_modules/nan/include_dirs.js +0 -1
- package/node_modules/nan/nan.h +0 -2898
- package/node_modules/nan/nan_callbacks.h +0 -88
- package/node_modules/nan/nan_callbacks_12_inl.h +0 -514
- package/node_modules/nan/nan_callbacks_pre_12_inl.h +0 -520
- package/node_modules/nan/nan_converters.h +0 -72
- package/node_modules/nan/nan_converters_43_inl.h +0 -68
- package/node_modules/nan/nan_converters_pre_43_inl.h +0 -42
- package/node_modules/nan/nan_define_own_property_helper.h +0 -29
- package/node_modules/nan/nan_implementation_12_inl.h +0 -430
- package/node_modules/nan/nan_implementation_pre_12_inl.h +0 -263
- package/node_modules/nan/nan_json.h +0 -166
- package/node_modules/nan/nan_maybe_43_inl.h +0 -356
- package/node_modules/nan/nan_maybe_pre_43_inl.h +0 -268
- package/node_modules/nan/nan_new.h +0 -340
- package/node_modules/nan/nan_object_wrap.h +0 -156
- package/node_modules/nan/nan_persistent_12_inl.h +0 -132
- package/node_modules/nan/nan_persistent_pre_12_inl.h +0 -242
- package/node_modules/nan/nan_private.h +0 -73
- package/node_modules/nan/nan_string_bytes.h +0 -305
- package/node_modules/nan/nan_typedarray_contents.h +0 -96
- package/node_modules/nan/nan_weak.h +0 -437
- package/node_modules/nan/package.json +0 -41
- package/node_modules/nan/tools/1to2.js +0 -412
- package/node_modules/nan/tools/README.md +0 -14
- package/node_modules/nan/tools/package.json +0 -19
- package/node_modules/unix-dgram/LICENSE +0 -13
- package/node_modules/unix-dgram/README.md +0 -107
- package/node_modules/unix-dgram/binding.gyp +0 -20
- package/node_modules/unix-dgram/build/Makefile +0 -324
- package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram/src/unix_dgram.o.d +0 -58
- package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram.node.d +0 -1
- package/node_modules/unix-dgram/build/Release/.deps/Release/unix_dgram.node.d +0 -1
- package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram/src/unix_dgram.o +0 -0
- package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram.node +0 -0
- package/node_modules/unix-dgram/build/Release/unix_dgram.node +0 -0
- package/node_modules/unix-dgram/build/binding.Makefile +0 -6
- package/node_modules/unix-dgram/build/config.gypi +0 -213
- package/node_modules/unix-dgram/build/unix_dgram.target.mk +0 -159
- package/node_modules/unix-dgram/lib/unix_dgram.js +0 -168
- package/node_modules/unix-dgram/package.json +0 -36
- package/node_modules/unix-dgram/src/unix_dgram.cc +0 -404
- package/node_modules/unix-dgram/src/win_dummy.cc +0 -7
- package/node_modules/unix-dgram/test/test-connect-callback.js +0 -68
- package/node_modules/unix-dgram/test/test-connect.js +0 -53
- package/node_modules/unix-dgram/test/test-dgram-unix.js +0 -58
- package/node_modules/unix-dgram/test/test-send-error.js +0 -26
- package/node_modules/winston-syslog/.eslintrc +0 -7
- package/node_modules/winston-syslog/.travis.yml +0 -14
- package/node_modules/winston-syslog/CHANGELOG.md +0 -9
- package/node_modules/winston-syslog/LICENSE +0 -20
- package/node_modules/winston-syslog/README.md +0 -135
- package/node_modules/winston-syslog/lib/utils.js +0 -26
- package/node_modules/winston-syslog/lib/winston-syslog.js +0 -385
- package/node_modules/winston-syslog/package.json +0 -56
- package/node_modules/winston-syslog/test/format-test.js +0 -122
- package/node_modules/winston-syslog/test/syslog-test.js +0 -95
- 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
|
-
}
|