use crate::jsonbuilder::{JsonBuilder, JsonError};
use std;
-fn log_websocket(tx: &WebSocketTransaction, js: &mut JsonBuilder) -> Result<(), JsonError> {
+fn log_websocket(
+ tx: &WebSocketTransaction, js: &mut JsonBuilder, pp: bool, pb64: bool,
+) -> Result<(), JsonError> {
js.open_object("websocket")?;
js.set_bool("fin", tx.pdu.fin)?;
if let Some(xorkey) = tx.pdu.mask {
} else {
js.set_string("opcode", &format!("unknown-{}", tx.pdu.opcode))?;
}
+ if pp {
+ js.set_string(
+ "payload_printable",
+ &String::from_utf8_lossy(&tx.pdu.payload),
+ )?;
+ }
+ if pb64 {
+ js.set_base64("payload_base64", &tx.pdu.payload)?;
+ }
js.close()?;
Ok(())
}
tx: *mut std::os::raw::c_void, js: &mut JsonBuilder,
) -> bool {
let tx = cast_pointer!(tx, WebSocketTransaction);
- log_websocket(tx, js).is_ok()
+ log_websocket(tx, js, false, false).is_ok()
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn SCWebSocketLogDetails(
+ tx: &WebSocketTransaction, js: &mut JsonBuilder, pp: bool, pb64: bool,
+) -> bool {
+ log_websocket(tx, js, pp, pb64).is_ok()
}
#define LOG_JSON_RULE_METADATA BIT_U16(8)
#define LOG_JSON_RULE BIT_U16(9)
#define LOG_JSON_VERDICT BIT_U16(10)
+#define LOG_JSON_WEBSOCKET_PAYLOAD BIT_U16(11)
+#define LOG_JSON_WEBSOCKET_PAYLOAD_BASE64 BIT_U16(12)
#define METADATA_DEFAULTS ( LOG_JSON_FLOW | \
LOG_JSON_APP_LAYER | \
LOG_JSON_RULE_METADATA)
-#define JSON_BODY_LOGGING (LOG_JSON_HTTP_BODY | LOG_JSON_HTTP_BODY_BASE64)
+#define JSON_BODY_LOGGING \
+ (LOG_JSON_HTTP_BODY | LOG_JSON_HTTP_BODY_BASE64 | LOG_JSON_WEBSOCKET_PAYLOAD | \
+ LOG_JSON_WEBSOCKET_PAYLOAD_BASE64)
#define JSON_STREAM_BUFFER_SIZE 4096
void *tx = AppLayerParserGetTx(p->flow->proto, proto, state, tx_id);
if (tx) {
jb_get_mark(jb, &mark);
+ switch (proto) {
+ // first check some protocols need special options for alerts logging
+ case ALPROTO_WEBSOCKET:
+ if (option_flags &
+ (LOG_JSON_WEBSOCKET_PAYLOAD | LOG_JSON_WEBSOCKET_PAYLOAD_BASE64)) {
+ bool pp = (option_flags & LOG_JSON_WEBSOCKET_PAYLOAD) != 0;
+ bool pb64 = (option_flags & LOG_JSON_WEBSOCKET_PAYLOAD_BASE64) != 0;
+ if (!SCWebSocketLogDetails(tx, jb, pp, pb64)) {
+ jb_restore_mark(jb, &mark);
+ }
+ // nothing more to log or do
+ return;
+ }
+ }
if (!al->LogTx(tx, jb)) {
jb_restore_mark(jb, &mark);
}
SetFlag(conf, "payload-printable", LOG_JSON_PAYLOAD, &flags);
SetFlag(conf, "http-body-printable", LOG_JSON_HTTP_BODY, &flags);
SetFlag(conf, "http-body", LOG_JSON_HTTP_BODY_BASE64, &flags);
+ SetFlag(conf, "websocket-payload-printable", LOG_JSON_WEBSOCKET_PAYLOAD, &flags);
+ SetFlag(conf, "websocket-payload", LOG_JSON_WEBSOCKET_PAYLOAD_BASE64, &flags);
SetFlag(conf, "verdict", LOG_JSON_VERDICT, &flags);
/* Check for obsolete flags and warn that they have no effect. */
# metadata: no # enable inclusion of app layer metadata with alert. Default yes
# http-body: yes # Requires metadata; enable dumping of HTTP body in Base64
# http-body-printable: yes # Requires metadata; enable dumping of HTTP body in printable format
+ # websocket-payload: yes # Requires metadata; enable dumping of WebSocket Payload in Base64
+ # websocket-payload-printable: yes # Requires metadata; enable dumping of WebSocket Payload in printable format
# Enable the logging of tagged packets for rules using the
# "tag" keyword.