@@ -763,11 +763,16 @@ nc_server_config_del_certs(struct nc_cert_grouping *certs_grp)
763763 free (certs_grp -> certs [i ].name );
764764 free (certs_grp -> certs [i ].data );
765765 }
766+ certs_grp -> cert_count = 0 ;
766767 free (certs_grp -> certs );
767768 certs_grp -> certs = NULL ;
768769 } else if (certs_grp -> store == NC_STORE_TRUSTSTORE ) {
769770 free (certs_grp -> ts_ref );
771+ certs_grp -> ts_ref = NULL ;
770772 }
773+
774+ /* reset to the default */
775+ certs_grp -> store = NC_STORE_LOCAL ;
771776}
772777
773778static void
@@ -2965,6 +2970,115 @@ nc_server_config_asymmetric_key(const struct lyd_node *node, NC_OPERATION op)
29652970 return ret ;
29662971}
29672972
2973+ static int
2974+ nc_server_config_client_authentication (const struct lyd_node * node , NC_OPERATION op )
2975+ {
2976+ int ret = 0 ;
2977+ struct nc_server_tls_opts * opts ;
2978+ struct nc_ch_client * ch_client = NULL ;
2979+
2980+ assert (!strcmp (LYD_NAME (node ), "client-authentication" ));
2981+
2982+ /* only do something on delete and if we're in the TLS subtree,
2983+ * because this is a presence container unlike its SSH counterpart */
2984+ if (!is_tls (node ) || (op != NC_OP_DELETE )) {
2985+ return 0 ;
2986+ }
2987+
2988+ /* LOCK */
2989+ if (is_ch (node ) && nc_server_config_get_ch_client_with_lock (node , & ch_client )) {
2990+ /* to avoid unlock on fail */
2991+ return 1 ;
2992+ }
2993+
2994+ if (nc_server_config_get_tls_opts (node , ch_client , & opts )) {
2995+ ret = 1 ;
2996+ goto cleanup ;
2997+ }
2998+
2999+ nc_server_config_del_certs (& opts -> ca_certs );
3000+ nc_server_config_del_certs (& opts -> ee_certs );
3001+
3002+ cleanup :
3003+ if (is_ch (node )) {
3004+ /* UNLOCK */
3005+ nc_ch_client_unlock (ch_client );
3006+ }
3007+ return ret ;
3008+ }
3009+
3010+ static int
3011+ nc_server_config_ca_certs (const struct lyd_node * node , NC_OPERATION op )
3012+ {
3013+ int ret = 0 ;
3014+ struct nc_server_tls_opts * opts ;
3015+ struct nc_ch_client * ch_client = NULL ;
3016+
3017+ assert (!strcmp (LYD_NAME (node ), "ca-certs" ));
3018+
3019+ /* only do something on delete and if we're in the TLS subtree,
3020+ * because SSH certs are not yet supported */
3021+ if (!is_tls (node ) || (op != NC_OP_DELETE )) {
3022+ return 0 ;
3023+ }
3024+
3025+ /* LOCK */
3026+ if (is_ch (node ) && nc_server_config_get_ch_client_with_lock (node , & ch_client )) {
3027+ /* to avoid unlock on fail */
3028+ return 1 ;
3029+ }
3030+
3031+ if (nc_server_config_get_tls_opts (node , ch_client , & opts )) {
3032+ ret = 1 ;
3033+ goto cleanup ;
3034+ }
3035+
3036+ nc_server_config_del_certs (& opts -> ca_certs );
3037+
3038+ cleanup :
3039+ if (is_ch (node )) {
3040+ /* UNLOCK */
3041+ nc_ch_client_unlock (ch_client );
3042+ }
3043+ return ret ;
3044+ }
3045+
3046+ static int
3047+ nc_server_config_ee_certs (const struct lyd_node * node , NC_OPERATION op )
3048+ {
3049+ int ret = 0 ;
3050+ struct nc_server_tls_opts * opts ;
3051+ struct nc_ch_client * ch_client = NULL ;
3052+
3053+ assert (!strcmp (LYD_NAME (node ), "ee-certs" ));
3054+
3055+ /* only do something on delete and if we're in the TLS subtree,
3056+ * because SSH certs are not yet supported */
3057+ if (!is_tls (node ) || (op != NC_OP_DELETE )) {
3058+ return 0 ;
3059+ }
3060+
3061+ /* LOCK */
3062+ if (is_ch (node ) && nc_server_config_get_ch_client_with_lock (node , & ch_client )) {
3063+ /* to avoid unlock on fail */
3064+ return 1 ;
3065+ }
3066+
3067+ if (nc_server_config_get_tls_opts (node , ch_client , & opts )) {
3068+ ret = 1 ;
3069+ goto cleanup ;
3070+ }
3071+
3072+ nc_server_config_del_certs (& opts -> ee_certs );
3073+
3074+ cleanup :
3075+ if (is_ch (node )) {
3076+ /* UNLOCK */
3077+ nc_ch_client_unlock (ch_client );
3078+ }
3079+ return ret ;
3080+ }
3081+
29683082static int
29693083nc_server_config_create_ca_certs_certificate (const struct lyd_node * node , struct nc_server_tls_opts * opts )
29703084{
@@ -3795,6 +3909,12 @@ nc_server_config_parse_netconf_server(const struct lyd_node *node, NC_OPERATION
37953909 ret = nc_server_config_cert_data (node , op );
37963910 } else if (!strcmp (name , "asymmetric-key" )) {
37973911 ret = nc_server_config_asymmetric_key (node , op );
3912+ } else if (!strcmp (name , "client-authentication" )) {
3913+ ret = nc_server_config_client_authentication (node , op );
3914+ } else if (!strcmp (name , "ca-certs" )) {
3915+ ret = nc_server_config_ca_certs (node , op );
3916+ } else if (!strcmp (name , "ee-certs" )) {
3917+ ret = nc_server_config_ee_certs (node , op );
37983918 } else if (!strcmp (name , "certificate" )) {
37993919 ret = nc_server_config_certificate (node , op );
38003920 } else if (!strcmp (name , "cert-to-name" )) {
0 commit comments