Message ID | 20180703144755.6794-1-arne@rfc2549.org |
---|---|
State | Accepted |
Headers | show |
Series | [Openvpn-devel] Implement parsing and sending INFO and INFO_PRE control messages | expand |
Hi, On Tue, Jul 03, 2018 at 04:47:55PM +0200, Arne Schwabe wrote: > OpenVPN 3 implements these messages to send information during the > authentication to the UI, implement these message also in OpenVPN 2.x Feature-Questionmark :-) Is there any documentation about this? What sort of messages are sent, by which product? What do you do with it? Can we maybe have some documentation in management-notes.txt? gert
Hi, On 03/07/18 23:33, Gert Doering wrote: > Hi, > > On Tue, Jul 03, 2018 at 04:47:55PM +0200, Arne Schwabe wrote: >> OpenVPN 3 implements these messages to send information during the >> authentication to the UI, implement these message also in OpenVPN 2.x > > Feature-Questionmark :-) > > Is there any documentation about this? What sort of messages are sent, > by which product? What do you do with it? > > Can we maybe have some documentation in management-notes.txt? And even at a higher level: what is the actual use case for this? Porting more features "just because they are supported in openvpn3" does not really sound like a reason to maintain more code on the community side, imho. Cheers,
diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c index 9905b5a0..d3e6eede 100644 --- a/src/openvpn/forward.c +++ b/src/openvpn/forward.c @@ -169,6 +169,14 @@ check_incoming_control_channel_dowork(struct context *c) { server_pushed_signal(c, &buf, false, 4); } + else if (buf_string_match_head_str(&buf, "INFO_PRE")) + { + server_pushed_info(c, &buf, 8); + } + else if (buf_string_match_head_str(&buf, "INFO")) + { + server_pushed_info(c, &buf, 4); + } else { msg(D_PUSH_ERRORS, "WARNING: Received unknown control message: %s", BSTR(&buf)); diff --git a/src/openvpn/push.c b/src/openvpn/push.c index d1ca84d1..069a32c4 100644 --- a/src/openvpn/push.c +++ b/src/openvpn/push.c @@ -175,6 +175,34 @@ server_pushed_signal(struct context *c, const struct buffer *buffer, const bool } } +void server_pushed_info(struct context *c, const struct buffer *buffer, const int adv) +{ + struct gc_arena gc; + const char *m = ""; + struct buffer buf = *buffer; + + if (buf_advance(&buf, adv) && buf_read_u8(&buf) == ',' && BLEN(&buf)) + { + m = BSTR(&buf); + } + + #ifdef ENABLE_MANAGEMENT + if (management) + { + gc = gc_new(); + + /* We use >INFOMSG here instead of plain >INFO since INFO is used to */ + /* for management greeting and we don't want to confuse the client */ + struct buffer out = alloc_buf_gc(256, &gc); + buf_printf(&out, ">%s:%s", "INFOMSG", m); + management_notify_generic(management, BSTR(&out)); + + gc_free(&gc); + } + #endif + msg(D_PUSH, "Info command was pushed by server ('%s')", m); +} + #if P2MP_SERVER /** * Add an option to the given push list by providing a format string. diff --git a/src/openvpn/push.h b/src/openvpn/push.h index 5f6181e7..acc94003 100644 --- a/src/openvpn/push.h +++ b/src/openvpn/push.h @@ -50,6 +50,8 @@ void receive_auth_failed(struct context *c, const struct buffer *buffer); void server_pushed_signal(struct context *c, const struct buffer *buffer, const bool restart, const int adv); +void server_pushed_info(struct context *c, const struct buffer *buffer, const int adv); + void incoming_push_message(struct context *c, const struct buffer *buffer); #if P2MP_SERVER