)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"ecb2931f2c8188bca83b105640d3f0f02b42f9e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"40b3cce0_d6d50f8a","updated":"2025-05-18 22:18:22.000000000","message":"This needs a patch to doc/management-notes.txt and the super-long text blob in test_push_update_msg.c needs to be wrapped to multiple lines\n\n```\n \"foo bar \"\n \"and so on \"\n \"the saga goes\"\n```","commit_id":"f7f54fe12b469afe56e2364cd93a2d4cd75079d1"},{"author":{"_account_id":1000008,"name":"stipa","display_name":"Lev Stipakov","email":"lstipakov@gmail.com","username":"stipa"},"change_message_id":"12c4397d6494c6f27c23bcf5d28d84e2cc9b160f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f937c585_83506f52","updated":"2025-07-03 13:19:28.000000000","message":"I did some testing and indeed I was able to send PUSH_UPDATE messages to the client. However it doesn\u0027t change the state on the server - for example, after pushing new client IP address we got broken tunnel because server rejects packets with unknown source address.\n\nAre there plans to implement the second part too in 2.7 or later? At the moment this implementation is not that useful.","commit_id":"79c2ab4012a99221afaf81bea662ef755543f6fb"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"28c7b017e747d3435527fc7a76efca92d87afd04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ce6fa871_f22e6efd","in_reply_to":"f937c585_83506f52","updated":"2025-07-11 06:10:34.000000000","message":"Now it should work, although it might need a patch to improve it.","commit_id":"79c2ab4012a99221afaf81bea662ef755543f6fb"},{"author":{"_account_id":1000001,"name":"flichtenheld","display_name":"Frank Lichtenheld","email":"frank@lichtenheld.com","username":"flichtenheld","status":"OpenVPN Inc."},"change_message_id":"f98874ad6c41a430379c3fc64d3e3d4e32bc86af","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"9230e2d5_eaf49bfd","updated":"2025-07-10 09:43:28.000000000","message":"Fails build with --disable-management","commit_id":"adff4c0f1a96054fcd52861e5e8b18bbeff5da6f"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"28c7b017e747d3435527fc7a76efca92d87afd04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"fd21b4f7_702e75d5","in_reply_to":"9230e2d5_eaf49bfd","updated":"2025-07-11 06:10:34.000000000","message":"Done","commit_id":"adff4c0f1a96054fcd52861e5e8b18bbeff5da6f"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"d39dd892_4075fb67","updated":"2025-07-21 19:53:36.000000000","message":"lots of string and buffer related nagging, plus some general questioning if we need this in the full breadth...","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"8f6f0c2e3514f08ca77bb72d6cf5f63e52048114","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"6651cd65_0387b4d8","updated":"2025-08-06 14:09:07.000000000","message":"getting there","commit_id":"7f7dc3ee175f9aba14f6929e07c1a2e780c29c54"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"10c44cd8ce1eda594aadaafa2eed04880e20f836","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"0988bf7c_86c951ec","updated":"2025-08-17 16:24:32.000000000","message":"There\u0027s two things that need fixing - one is a (trivial) rebase accident in manage.c (and please check if there are more of them).\n\nThe other is a lack of robustness on invalid pushed options on the server side - that is, you do on the management interface\n\n```\npush-update-broad blab\nSUCCESS: 1 client(s) updated\nSUCCESS: push-update command succeeded\n```\n\n(so it claims \"success\") but what really happens is \"the full server restarts\"\n\n```\nAug 17 18:11:40 gentoo tun-udp-p2mp[4243]: MANAGEMENT: CMD \u0027push-update-cid 20 -dns\u0027\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: MANAGEMENT: CMD \u0027push-update-broad blab\u0027\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: SENT CONTROL [cron2-freebsd-tc-amd64]: \u0027PUSH_UPDATE,blab\u0027 (status\u003d1)\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: Pushed option is not updatable: \u0027blab\u0027. Restarting.\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: Failed to process push update message sent to client ID: 0\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: TCP/UDP: Closing socket\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: TCP/UDP: Close Socket failed: Bad file descriptor (errno\u003d9)\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: TCP/UDP: Closing socket\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: TCP/UDP: Closing socket\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: TCP/UDP: Closing socket\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: TCP/UDP: Closing socket\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: TCP/UDP: Closing socket\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: SIGUSR1[soft,Offending option received from server] received, process restarting\nAug 17 18:11:46 gentoo tun-udp-p2mp[4243]: Restart pause, 1 second(s)\n```\n\nit should not do that, but give an error on the management interface instead.\n\nIf pushing \"correct\" stuff it works, even if the timing is a bit odd\n\nserver:\n```\nAug 17 18:16:01 gentoo tun-udp-p2mp[4243]: MANAGEMENT: CMD \u0027push-update-broad \"route 10.204.0.0 255.255.240.0\"\u0027\n```\n\nclient\n\n```\n2025-08-17 18:16:12 PUSH: Received control message: \u0027PUSH_UPDATE,route 10.204.0.0 255.255.240.0\u0027\n```\n\nso it took 11 seconds for the message to actually get out (clocks are in sync, and this is observable, so not a \"clocks are wrong\" artefact).\n\n\nThere is something else that isn\u0027t right with pushing ifconfigs, but maybe I am doing it wrong\n\n```\npush-update-cid 2 \"ifconfig 10.204.2.46 10.204.2.45\"\nSUCCESS: 1 client(s) updated\n```\n\nclient does new ifconfig.  Ping server gives\n\n```\nAug 17 18:20:08 gentoo tun-udp-p2mp[4243]: cron2-freebsd-tc-amd64/udp6:194.97.140.21:14092 MULTI: bad source address from client [10.204.2.46], packet dropped\n```\n\nso the client is using the correct source IP, but the server has not learned it.\n\nThe server claims it has, though\n\n```\nAug 17 18:19:54 gentoo tun-udp-p2mp[4243]: MULTI: Learn: 10.204.2.46/0 -\u003e cron2-freebsd-tc-amd64/udp6:194.97.140.21:14092\n```\n\nThe /0 is a bit suspicious, for \"regular\" learning it prints\n\n```\nAug 17 18:17:32 gentoo tun-udp-p2mp[4243]: MULTI: Learn: 10.204.2.6 -\u003e cron2-freebsd-tc-amd64/udp6:194.97.140.21:14092\n```\n\nFor IPv6 it does not work either\n\n```\nAug 17 18:23:37 gentoo tun-udp-p2mp[4243]: SENT CONTROL [cron2-freebsd-tc-amd64]: \u0027PUSH_UPDATE,ifconfig-ipv6 fd00:abcd:204:2::9a9a/64 fd00:abcd:204:2::1\u0027 (status\u003d1)\nAug 17 18:23:37 gentoo tun-udp-p2mp[4243]: MULTI: Learn: ::/0 -\u003e cron2-freebsd-tc-amd64/udp6:194.97.140.21:14092\nAug 17 18:23:46 gentoo tun-udp-p2mp[4243]: cron2-freebsd-tc-amd64/udp6:194.97.140.21:14092 MULTI: bad source address from client [fd00:abcd:204:2::9a9a], packet dropped\n```\n\nwhy ::/0 ?!?","commit_id":"39d11745f6472516fecdc737ccae180df9768349"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"3e58b2e95e7bed92287a4cec148006be6e9b51c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"109ccd85_cbd93633","in_reply_to":"0988bf7c_86c951ec","updated":"2025-08-17 16:25:28.000000000","message":"Well, \"3 things that need fixing\", that is :-)","commit_id":"39d11745f6472516fecdc737ccae180df9768349"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"4fa48336578a6ad490a9d3d06d478aa3c1bacc52","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":23,"id":"3ba38d39_94364a62","in_reply_to":"109ccd85_cbd93633","updated":"2025-08-25 10:42:39.000000000","message":"About the first point, i fixed the restarting in the server but the \"sending a wrong message and considering it a `SUCCESS`\" was like this by design. The checks for valid options in the server are made just to update the ifconfig if necessary but they are not part of the \u0027core\u0027 logic of sending the message. Of course i could make this checks and just after validating the options deciding if sending the message or not but maybe it should be discussed i think","commit_id":"39d11745f6472516fecdc737ccae180df9768349"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"e0b884269dd878d7509acb46fc4fd1117df44264","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"7a4d7006_cba8864b","in_reply_to":"3ba38d39_94364a62","updated":"2025-08-26 15:31:15.000000000","message":"* Regarding the second point, the odd timing it\u0027s because the message is just enqueued (by `send_control_channel_string()`) but it gets \"on the wire\" only when `tls_process()` is finally called, so you could get from less than 1 up to around 10 seconds of latency from when the command is injected through management to when the packet leave the server instance.\n\n\n* Regarding 3rd point instead, yes, the `/0` was an issue, i was misusing a function\u0027s parameter. For the push-update usage i think the only \u0027correct\u0027 way of pushing an ifconfig option should be something like `ifconfig 10.204.2.47 255.255.255.0` (shouldn\u0027t we use it only in subnet mode?) with the pushed ip in the same subnet of the server virtual ip, in this case `10.204.2.45/24` for example (or do we want to update the server ip too?) . I mean, this look to me the only practical use case but maybe i\u0027m missing something, if so please tell me.","commit_id":"39d11745f6472516fecdc737ccae180df9768349"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"b546117aad60a1df7dcaa94b8af31cafe6f9520a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"1d73bdcb_38d652c0","updated":"2025-09-03 16:48:05.000000000","message":"This still has a few rough edges, but for \"go into 2.7_beta1\" it is good enough - server does no longer crash, and learning of new IPs works.\n\nUnlearning of old IPs is still marked TODO, and some of the messages on pushing garbage are a bit weird...","commit_id":"b87bab6c063f44050214cbac20de0c402a3051e0"}],"doc/management-notes.txt":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"Example"},{"line_number":1074,"context_line":"  push-update-addr 9.9.9.9 1234 \"route 10.10.10.1 255.255.255.255, -dns, ?tun-mtu 1400\""},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"OUTPUT FORMAT"},{"line_number":1077,"context_line":"-------------"},{"line_number":1078,"context_line":""}],"source_content_type":"text/plain","patch_set":16,"id":"a8274ef9_1e452d98","line":1075,"updated":"2025-07-21 19:53:36.000000000","message":"I do question whether this is a reasonable approach, to have \"by cn\" and \"by addr\" functions, that add code (... that needs to be tested and maintained) when a management client can just look up the CID itself, and then do `push-update-cid`?\n\nIs this something AS wants?  Or \"let\u0027s just do all variants, so nobody complains about a missing feature\"?","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"8f6f0c2e3514f08ca77bb72d6cf5f63e52048114","unresolved":true,"context_lines":[{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"Example"},{"line_number":1074,"context_line":"  push-update-addr 9.9.9.9 1234 \"route 10.10.10.1 255.255.255.255, -dns, ?tun-mtu 1400\""},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"OUTPUT FORMAT"},{"line_number":1077,"context_line":"-------------"},{"line_number":1078,"context_line":""}],"source_content_type":"text/plain","patch_set":16,"id":"6ddb1ed1_95abe02b","line":1075,"in_reply_to":"33d4ba61_04cc0d55","updated":"2025-08-06 14:09:07.000000000","message":"So we discussed this at the community meeting today, and we should go for \"do only what people really need\" (\u003d testing, maintenance) - so, `push-update-cid` and `push-update-broad` should stay, and `cn` and `addr` are left out.","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"4757bd73ff4e1b48878e19a2576351186bb0fda3","unresolved":false,"context_lines":[{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"Example"},{"line_number":1074,"context_line":"  push-update-addr 9.9.9.9 1234 \"route 10.10.10.1 255.255.255.255, -dns, ?tun-mtu 1400\""},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"OUTPUT FORMAT"},{"line_number":1077,"context_line":"-------------"},{"line_number":1078,"context_line":""}],"source_content_type":"text/plain","patch_set":16,"id":"5a3c25e7_de4f1297","line":1075,"in_reply_to":"6ddb1ed1_95abe02b","updated":"2025-08-07 17:26:41.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"Example"},{"line_number":1074,"context_line":"  push-update-addr 9.9.9.9 1234 \"route 10.10.10.1 255.255.255.255, -dns, ?tun-mtu 1400\""},{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"OUTPUT FORMAT"},{"line_number":1077,"context_line":"-------------"},{"line_number":1078,"context_line":""}],"source_content_type":"text/plain","patch_set":16,"id":"33d4ba61_04cc0d55","line":1075,"in_reply_to":"a8274ef9_1e452d98","updated":"2025-07-24 08:21:03.000000000","message":"i mostly followed the `kill` command, but yes it is the second one.","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"}],"src/openvpn/manage.c":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":1359,"context_line":"        else"},{"line_number":1360,"context_line":"        {"},{"line_number":1361,"context_line":"            msg(M_CLIENT, \"ERROR: push-update-broad command failed\");"},{"line_number":1362,"context_line":"        }"},{"line_number":1363,"context_line":"    }"},{"line_number":1364,"context_line":"    else if (type \u003d\u003d UPT_BY_CID)"},{"line_number":1365,"context_line":"    {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"54080c2e_539d2c6e","line":1362,"updated":"2025-07-21 19:53:36.000000000","message":"I bet there are more elegant and less repetitive ways to do 4 different `if (status) print(SUCCESS!) else print(ERROR)` blocks...","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":1359,"context_line":"        else"},{"line_number":1360,"context_line":"        {"},{"line_number":1361,"context_line":"            msg(M_CLIENT, \"ERROR: push-update-broad command failed\");"},{"line_number":1362,"context_line":"        }"},{"line_number":1363,"context_line":"    }"},{"line_number":1364,"context_line":"    else if (type \u003d\u003d UPT_BY_CID)"},{"line_number":1365,"context_line":"    {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"183ce8a9_448ff5ac","line":1362,"in_reply_to":"54080c2e_539d2c6e","updated":"2025-07-24 08:21:03.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"10c44cd8ce1eda594aadaafa2eed04880e20f836","unresolved":true,"context_lines":[{"line_number":133,"context_line":"    msg(M_CLIENT, \"verb [n]               : Set log verbosity level to n, or show if n is absent.\");"},{"line_number":134,"context_line":"    msg(M_CLIENT,"},{"line_number":135,"context_line":"        \"version [n]            : Set client\u0027s version to n or show current version of daemon.\");"},{"line_number":136,"context_line":"    msg(M_CLIENT, \"version [n]            : Set client\u0027s version to n or show current version of daemon.\");"},{"line_number":137,"context_line":"    msg(M_CLIENT, \"push-update-broad options : Broadcast a message to update the specified options.\");"},{"line_number":138,"context_line":"    msg(M_CLIENT, \"                            Ex. push-update-broad \\\"route something, -dns\\\"\");"},{"line_number":139,"context_line":"    msg(M_CLIENT, \"push-update-cid CID options : Send an update message to the client identified by CID.\");"}],"source_content_type":"text/x-csrc","patch_set":23,"id":"9d6db2f0_20959fe8","line":136,"updated":"2025-08-17 16:24:32.000000000","message":"Unfortunately a rebase accident has happened here, and now this line is printed twice.  While trivial to correct, project rules require that I do not do code-changes on merge.","commit_id":"39d11745f6472516fecdc737ccae180df9768349"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"3627c5a7e608adb109fcafaff906f2e5a9f9c8ed","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    msg(M_CLIENT, \"verb [n]               : Set log verbosity level to n, or show if n is absent.\");"},{"line_number":134,"context_line":"    msg(M_CLIENT,"},{"line_number":135,"context_line":"        \"version [n]            : Set client\u0027s version to n or show current version of daemon.\");"},{"line_number":136,"context_line":"    msg(M_CLIENT, \"version [n]            : Set client\u0027s version to n or show current version of daemon.\");"},{"line_number":137,"context_line":"    msg(M_CLIENT, \"push-update-broad options : Broadcast a message to update the specified options.\");"},{"line_number":138,"context_line":"    msg(M_CLIENT, \"                            Ex. push-update-broad \\\"route something, -dns\\\"\");"},{"line_number":139,"context_line":"    msg(M_CLIENT, \"push-update-cid CID options : Send an update message to the client identified by CID.\");"}],"source_content_type":"text/x-csrc","patch_set":23,"id":"3f50d336_21e71356","line":136,"in_reply_to":"9d6db2f0_20959fe8","updated":"2025-08-18 14:20:26.000000000","message":"Done","commit_id":"39d11745f6472516fecdc737ccae180df9768349"}],"src/openvpn/push.h":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    UPT_BY_CID \u003d 3"},{"line_number":52,"context_line":"#endif"},{"line_number":53,"context_line":"} push_update_type;"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"int process_incoming_push_request(struct context *c);"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"/**"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"f1e00c73_49d8e6c7","line":54,"updated":"2025-07-21 19:53:36.000000000","message":"This does confuse me a bit.  If we have no ENABLE_MANAGEMENT, why would we have UPD_BY_ADDR or UPD_BY_CN?  Is this usable from a plugin interface or a script?","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"4757bd73ff4e1b48878e19a2576351186bb0fda3","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    UPT_BY_CID \u003d 3"},{"line_number":52,"context_line":"#endif"},{"line_number":53,"context_line":"} push_update_type;"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"int process_incoming_push_request(struct context *c);"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"/**"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"0c15dcee_8fcf4ab4","line":54,"in_reply_to":"8416a3dd_3e281a0d","updated":"2025-08-07 17:26:41.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"8f6f0c2e3514f08ca77bb72d6cf5f63e52048114","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    UPT_BY_CID \u003d 3"},{"line_number":52,"context_line":"#endif"},{"line_number":53,"context_line":"} push_update_type;"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"int process_incoming_push_request(struct context *c);"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"/**"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"8416a3dd_3e281a0d","line":54,"in_reply_to":"940bc697_89ca7f9f","updated":"2025-08-06 14:09:07.000000000","message":"As we have no other communication channels in OpenVPN 2.x today that can asynchronously decide \"we need new options at a client now!\" (plugins or scripts are only called on connect, and not \"while a client is connected\") this first patch should be \"management only\".  So please make the `#ifdef ENABLE_MANAGEMENT` thing wider, and include all of the new code and data structures.","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    UPT_BY_CID \u003d 3"},{"line_number":52,"context_line":"#endif"},{"line_number":53,"context_line":"} push_update_type;"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"int process_incoming_push_request(struct context *c);"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"/**"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"940bc697_89ca7f9f","line":54,"in_reply_to":"f1e00c73_49d8e6c7","updated":"2025-07-24 08:21:03.000000000","message":"you can get the cid only from management, but theoretically the rest could be used by other functions in the future","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"}],"src/openvpn/push_util.c":[{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    return 0;"},{"line_number":64,"context_line":"}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"/* Allocate memory and asseble the final message */"},{"line_number":67,"context_line":"static char *"},{"line_number":68,"context_line":"forge_msg(const char *src, const char *continuation, struct gc_arena *gc)"},{"line_number":69,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"fb47d1a4_53787e8b","line":66,"updated":"2025-07-21 19:53:36.000000000","message":"typo","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    return 0;"},{"line_number":64,"context_line":"}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"/* Allocate memory and asseble the final message */"},{"line_number":67,"context_line":"static char *"},{"line_number":68,"context_line":"forge_msg(const char *src, const char *continuation, struct gc_arena *gc)"},{"line_number":69,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"ccbe9b3d_34774f2d","line":66,"in_reply_to":"fb47d1a4_53787e8b","updated":"2025-07-24 08:21:03.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":79,"context_line":"    {"},{"line_number":80,"context_line":"        i +\u003d src_len;"},{"line_number":81,"context_line":"        strcpy(\u0026ret[i], continuation);"},{"line_number":82,"context_line":"    }"},{"line_number":83,"context_line":"    return ret;"},{"line_number":84,"context_line":"}"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":16,"id":"384c531b_cb1d0b7b","line":82,"updated":"2025-07-21 19:53:36.000000000","message":"it might increase readability to juse use `snprintf( ... \"%s,%s%s\", push_update_cmd, src, continuation? continuation: 0)` here... and get rid of `i`.\n\nOr use `buf_printf()` and get rid of the length and malloc stuff...  (returning `BSTR(\u0026buf)` then).","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    {"},{"line_number":80,"context_line":"        i +\u003d src_len;"},{"line_number":81,"context_line":"        strcpy(\u0026ret[i], continuation);"},{"line_number":82,"context_line":"    }"},{"line_number":83,"context_line":"    return ret;"},{"line_number":84,"context_line":"}"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":16,"id":"a9514c2d_3d9f4c1f","line":82,"in_reply_to":"384c531b_cb1d0b7b","updated":"2025-07-24 08:21:03.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":119,"context_line":"            }"},{"line_number":120,"context_line":"            str[ci] \u003d \u0027\\0\u0027;"},{"line_number":121,"context_line":"            /* copy from i to (ci -1) */"},{"line_number":122,"context_line":"            msgs[im] \u003d forge_msg(str, \",push-continuation 2\", gc);"},{"line_number":123,"context_line":"            i \u003d ci + 1;"},{"line_number":124,"context_line":"        }"},{"line_number":125,"context_line":"        else"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"e1cd130c_c8e39305","line":122,"updated":"2025-07-21 19:53:36.000000000","message":"I do wonder if this can be done without modifying the string, so getting rid of the `strdup()` requirement...","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            }"},{"line_number":120,"context_line":"            str[ci] \u003d \u0027\\0\u0027;"},{"line_number":121,"context_line":"            /* copy from i to (ci -1) */"},{"line_number":122,"context_line":"            msgs[im] \u003d forge_msg(str, \",push-continuation 2\", gc);"},{"line_number":123,"context_line":"            i \u003d ci + 1;"},{"line_number":124,"context_line":"        }"},{"line_number":125,"context_line":"        else"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"bc395641_798e9979","line":122,"in_reply_to":"e1cd130c_c8e39305","updated":"2025-07-24 08:21:03.000000000","message":"Acknowledged","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":140,"context_line":"    return true;"},{"line_number":141,"context_line":"}"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"/* It actually send the already divided messagge to one single client */"},{"line_number":144,"context_line":"static bool"},{"line_number":145,"context_line":"send_single_push_update(struct context *c, char **msgs, unsigned int *option_types_found)"},{"line_number":146,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"5e9e0424_e91519f2","line":143,"updated":"2025-07-21 19:53:36.000000000","message":"This comment needs a visit from the grammar police ;-)\n\n```\n/* send the message(s) prepared to one single client */\n```","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    return true;"},{"line_number":141,"context_line":"}"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"/* It actually send the already divided messagge to one single client */"},{"line_number":144,"context_line":"static bool"},{"line_number":145,"context_line":"send_single_push_update(struct context *c, char **msgs, unsigned int *option_types_found)"},{"line_number":146,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"9e0a4d3f_be2fdaaa","line":143,"in_reply_to":"5e9e0424_e91519f2","updated":"2025-07-24 08:21:03.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":155,"context_line":"    {"},{"line_number":156,"context_line":"        struct buffer buf \u003d alloc_buf_gc(strlen(msgs[i]), \u0026gc);"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        buf_write(\u0026buf, msgs[i], strlen(msgs[i]));"},{"line_number":159,"context_line":"        if (!send_control_channel_string(c, msgs[i], D_PUSH))"},{"line_number":160,"context_line":"        {"},{"line_number":161,"context_line":"            return false;"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"648be3fc_6ea876c8","line":158,"updated":"2025-07-21 19:53:36.000000000","message":"If you want to have the message in a `buf` here, you could have `forge_msg()` just use `buf_printf()` and return the resulting `buf`...?","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":true,"context_lines":[{"line_number":155,"context_line":"    {"},{"line_number":156,"context_line":"        struct buffer buf \u003d alloc_buf_gc(strlen(msgs[i]), \u0026gc);"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        buf_write(\u0026buf, msgs[i], strlen(msgs[i]));"},{"line_number":159,"context_line":"        if (!send_control_channel_string(c, msgs[i], D_PUSH))"},{"line_number":160,"context_line":"        {"},{"line_number":161,"context_line":"            return false;"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"c617f505_475db955","line":158,"in_reply_to":"648be3fc_6ea876c8","updated":"2025-07-24 08:21:03.000000000","message":"ok, working on it","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"be8a4fe57ac20c3b2469e6251269c43c90ebfa63","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    {"},{"line_number":156,"context_line":"        struct buffer buf \u003d alloc_buf_gc(strlen(msgs[i]), \u0026gc);"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        buf_write(\u0026buf, msgs[i], strlen(msgs[i]));"},{"line_number":159,"context_line":"        if (!send_control_channel_string(c, msgs[i], D_PUSH))"},{"line_number":160,"context_line":"        {"},{"line_number":161,"context_line":"            return false;"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"7f156fa3_fdb8685b","line":158,"in_reply_to":"c617f505_475db955","updated":"2025-07-24 12:19:19.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        }"},{"line_number":163,"context_line":"        i++;"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        /* After sending the control message, we update the options server-side in the client\u0027s context */"},{"line_number":166,"context_line":"        buf_string_compare_advance(\u0026buf, push_update_cmd);"},{"line_number":167,"context_line":"        if (process_incoming_push_update(c, pull_permission_mask(c), option_types_found, \u0026buf) \u003d\u003d PUSH_MSG_ERROR)"},{"line_number":168,"context_line":"        {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"caf4cb50_9100e63f","line":165,"updated":"2025-07-21 19:53:36.000000000","message":"Can you extend the comment a bit on why this is needed?  I assume (which might or might not be a bad idea) that this is so `ifconfig-push` and `ifconfig-ipv6-push`  can work?  `cipher` etc. is not PUSH_UPDATE-able, and most other options the server should not care about?  But without a bit of more specific explanation, this is very, uh, non-intuitive stuff.","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        }"},{"line_number":163,"context_line":"        i++;"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        /* After sending the control message, we update the options server-side in the client\u0027s context */"},{"line_number":166,"context_line":"        buf_string_compare_advance(\u0026buf, push_update_cmd);"},{"line_number":167,"context_line":"        if (process_incoming_push_update(c, pull_permission_mask(c), option_types_found, \u0026buf) \u003d\u003d PUSH_MSG_ERROR)"},{"line_number":168,"context_line":"        {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"ac640134_01fb9aae","line":165,"in_reply_to":"caf4cb50_9100e63f","updated":"2025-07-24 08:21:03.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":201,"context_line":"    unsigned int option_types_found \u003d 0;"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    msgs[msgs_num] \u003d NULL;"},{"line_number":204,"context_line":"    if (!message_splitter(gc_strdup(msg, \u0026gc), msgs, \u0026gc, safe_cap))"},{"line_number":205,"context_line":"    {"},{"line_number":206,"context_line":"        gc_free(\u0026gc);"},{"line_number":207,"context_line":"        return -EINVAL;"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"693c5314_a1a08fa4","line":204,"updated":"2025-07-21 19:53:36.000000000","message":"Please do not call `strdup()` in a function call... yes, this works, but it is hard to read and no gain compared to \"just call strdup() at the beginning of `message_splutter()`  (if it turns out to be necessary).","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    unsigned int option_types_found \u003d 0;"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    msgs[msgs_num] \u003d NULL;"},{"line_number":204,"context_line":"    if (!message_splitter(gc_strdup(msg, \u0026gc), msgs, \u0026gc, safe_cap))"},{"line_number":205,"context_line":"    {"},{"line_number":206,"context_line":"        gc_free(\u0026gc);"},{"line_number":207,"context_line":"        return -EINVAL;"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"7a73548b_cfd887a6","line":204,"in_reply_to":"693c5314_a1a08fa4","updated":"2025-07-24 08:21:03.000000000","message":"Done","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":236,"context_line":"        }"},{"line_number":237,"context_line":"    }"},{"line_number":238,"context_line":"#endif /* ifdef ENABLE_MANAGEMENT */"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    int count \u003d 0;"},{"line_number":241,"context_line":"    struct hash_iterator hi;"},{"line_number":242,"context_line":"    const struct hash_element *he;"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"8aa9f5e8_3e0aac7c","line":239,"updated":"2025-07-21 19:53:36.000000000","message":"how can we ever end here if ENABLE_MANAGEMENT is not defined?  Except for the unit test, there is no caller remaining...","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        }"},{"line_number":237,"context_line":"    }"},{"line_number":238,"context_line":"#endif /* ifdef ENABLE_MANAGEMENT */"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    int count \u003d 0;"},{"line_number":241,"context_line":"    struct hash_iterator hi;"},{"line_number":242,"context_line":"    const struct hash_element *he;"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"4e68ba97_68899c76","line":239,"in_reply_to":"8aa9f5e8_3e0aac7c","updated":"2025-07-24 08:21:03.000000000","message":"We can\u0027t now, yes, but the function could be used somewhere else in the future","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000002,"name":"cron2","display_name":"Gert Doering","email":"gert@greenie.muc.de","username":"cron2"},"change_message_id":"7078822e92d000c630f546fed63ce81f369e6177","unresolved":true,"context_lines":[{"line_number":302,"context_line":"{"},{"line_number":303,"context_line":"    int n_sent \u003d send_push_update(arg, NULL, options, UPT_BROADCAST, PUSH_BUNDLE_SIZE);"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    RETURN_UPDATE_STATUS(n_sent);"},{"line_number":306,"context_line":"}"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"bool"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"ecc7ac6a_56bfc11e","line":305,"updated":"2025-07-21 19:53:36.000000000","message":"so here we have this nice if/else macro that manage.c could use :-)... but only 3 out of 4 functions use it?  Can we not do the \"does this CID exist?\" check in the caller (for `management_callback_send_push_update_by_cid()`)?","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"},{"author":{"_account_id":1000040,"name":"mrbff","email":"marco@mandelbit.com","username":"mrbff"},"change_message_id":"ba656dbd1d19767b2ddebb5d7239b833fd54f470","unresolved":false,"context_lines":[{"line_number":302,"context_line":"{"},{"line_number":303,"context_line":"    int n_sent \u003d send_push_update(arg, NULL, options, UPT_BROADCAST, PUSH_BUNDLE_SIZE);"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    RETURN_UPDATE_STATUS(n_sent);"},{"line_number":306,"context_line":"}"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"bool"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"d6fc2d7c_558c5256","line":305,"in_reply_to":"ecc7ac6a_56bfc11e","updated":"2025-07-24 08:21:03.000000000","message":"i need to do the lookup anyway in send_push_update(), so it would duplicate code with no good reason i think, but i can use the macro anyway, np","commit_id":"450f8fdd96be60091d3b8486c8b090d2c5f37a94"}]}
