]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Simplify dynamic client generation code
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 3 Nov 2024 08:03:29 +0000 (10:03 +0200)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 3 Nov 2024 08:03:29 +0000 (10:03 +0200)
src/lib/server/client.c

index e1595f678c2db77e9bc51196e66f5baff9c702ee..9474280fda85dda91efafd3f95cc280c6322e317 100644 (file)
@@ -931,14 +931,12 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request)
 {
        static int      cnt;
        CONF_SECTION    *cs;
-       char            buffer[256];
        fr_client_t     *c;
        fr_sbuff_t      *tmp;
-       fr_token_t      v_token = T_BARE_WORD;
 
        if (!request) return NULL;
 
-       FR_SBUFF_TALLOC_THREAD_LOCAL(&tmp, 1024, SIZE_MAX);
+       FR_SBUFF_TALLOC_THREAD_LOCAL(&tmp, 128, SIZE_MAX);
 
        if (unlikely(fr_sbuff_in_sprintf(tmp, "dynamic_%i_", cnt++) <= 0)) {
        name_error:
@@ -948,7 +946,7 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request)
        if (unlikely(fr_value_box_print(tmp, fr_box_ipaddr(request->packet->socket.inet.src_ipaddr), NULL) <= 0)) goto name_error;
        fr_sbuff_set_to_start(tmp);
 
-       cs = cf_section_alloc(ctx, NULL, "client", buffer);
+       cs = cf_section_alloc(ctx, NULL, "client", fr_sbuff_current(tmp));
 
        RDEBUG2("Converting &control.FreeRADIUS-Client-* to client {...} section");
        RINDENT();
@@ -957,29 +955,34 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request)
                CONF_PAIR       *cp = NULL;
                char const      *value;
                char const      *attr;
+               fr_token_t      v_token = T_BARE_WORD;
 
                if (!fr_dict_attr_is_top_level(vp->da)) continue;
 
                switch (vp->da->attr) {
                case FR_FREERADIUS_CLIENT_IP_ADDRESS:
                        attr = "ipv4addr";
-                       value = fr_inet_ntop(buffer, sizeof(buffer), &vp->vp_ip);
+               vb_to_str:
+                       if (unlikely(fr_pair_print_value_quoted(tmp, vp, T_BARE_WORD) < 0)) {
+                               RERROR("Failed to convert %pP to string", vp);
+                       error:
+                               talloc_free(cs);
+                               return NULL;
+                       }
+                       value = fr_sbuff_start(tmp);
                        break;
 
                case FR_FREERADIUS_CLIENT_IP_PREFIX:
                        attr = "ipv4addr";
-                       value = fr_inet_ntop_prefix(buffer, sizeof(buffer), &vp->vp_ip);
-                       break;
+                       goto vb_to_str;
 
                case FR_FREERADIUS_CLIENT_IPV6_ADDRESS:
                        attr = "ipv6addr";
-                       value = fr_inet_ntop(buffer, sizeof(buffer), &vp->vp_ip);
-                       break;
+                       goto vb_to_str;
 
                case FR_FREERADIUS_CLIENT_IPV6_PREFIX:
                        attr = "ipv6addr";
-                       value = fr_inet_ntop_prefix(buffer, sizeof(buffer), &vp->vp_ip);
-                       break;
+                       goto vb_to_str;
 
                case FR_FREERADIUS_CLIENT_SECRET:
                        attr = "secret";
@@ -998,59 +1001,19 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request)
 
                case FR_FREERADIUS_CLIENT_SRC_IP_ADDRESS:
                        attr = "src_ipaddr";
-                       value = fr_inet_ntop(buffer, sizeof(buffer), &vp->vp_ip);
-                       break;
+                       goto vb_to_str;
 
                case FR_FREERADIUS_CLIENT_REQUIRE_MA:
                        attr = "require_message_authenticator";
-                       switch(vp->vp_uint8) {
-                       case FR_FREERADIUS_CLIENT_REQUIRE_MA_VALUE_NO:
-                               value = "no";
-                               break;
-
-                       case FR_FREERADIUS_CLIENT_REQUIRE_MA_VALUE_AUTO:
-                               value = "auto";
-                               break;
-
-                       case FR_FREERADIUS_CLIENT_REQUIRE_MA_VALUE_YES:
-                               value = "yes";
-                               break;
-
-                       default:
-                               RERROR("Invalid value for FreeRADIUS-Client-Require-MA");
-                               goto error;
-                       }
-                       break;
+                       goto vb_to_str;
 
                case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE:
                        attr = "limit_proxy_state";
-                       switch(vp->vp_uint8) {
-                       case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE_VALUE_NO:
-                               value = "no";
-                               break;
-
-                       case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE_VALUE_AUTO:
-                               value = "auto";
-                               break;
-
-                       case FR_FREERADIUS_CLIENT_LIMIT_PROXY_STATE_VALUE_YES:
-                               value = "yes";
-                               break;
-
-                       default:
-                               RERROR("Invalid value for FreeRADIUS-Client-Limit-Proxy-State");
-                               goto error;
-                       }
-                       break;
+                       goto vb_to_str;
 
                case FR_FREERADIUS_CLIENT_TRACK_CONNECTIONS:
                        attr = "track_connections";
-                       if (vp->vp_bool) {
-                               value = "true";
-                       } else {
-                               value = "false";
-                       }
-                       break;
+                       goto vb_to_str;
 
                default:
                        RDEBUG2("Adding custom attribute %pP", vp);
@@ -1077,11 +1040,7 @@ fr_client_t *client_afrom_request(TALLOC_CTX *ctx, request_t *request)
         *      src IP, protocol, etc.  This should all be in TLVs..
         */
        c = client_afrom_cs(cs, cs, unlang_call_current(request), 0);
-       if (!c) {
-       error:
-               talloc_free(cs);
-               return NULL;
-       }
+       if (!c) goto error;
 
        return c;
 }