From 476f1d84d3ffe60218715ac3145924135331a300 Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Thu, 23 Apr 2020 11:06:25 +0200 Subject: [PATCH] Fix a bind rpc assert on unknown namespace --- apps/backend/backend_client.c | 3 +-- apps/backend/backend_commit.c | 1 - apps/backend/backend_commit.h | 2 +- lib/src/clixon_xml_bind.c | 10 ++-------- test/test_rpc.sh | 29 +++++++++++++++-------------- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/apps/backend/backend_client.c b/apps/backend/backend_client.c index 566e26e9..2426eee7 100644 --- a/apps/backend/backend_client.c +++ b/apps/backend/backend_client.c @@ -293,8 +293,7 @@ clixon_stats_get_db(clicon_handle h, * @param[in] nsc XML Namespace context for xpath * @param[in,out] xret Existing XML tree, merge x into this * @retval 0 OK -* @retval -1 Error - + * @retval -1 Error */ int clixon_stats_get(clicon_handle h, diff --git a/apps/backend/backend_commit.c b/apps/backend/backend_commit.c index 18af8e82..5beff810 100644 --- a/apps/backend/backend_commit.c +++ b/apps/backend/backend_commit.c @@ -538,7 +538,6 @@ candidate_commit(clicon_handle h, /* 7. Call plugin transaction commit callbacks */ if (plugin_transaction_commit(h, td) < 0) goto done; - /* Clear cached trees from default values and marking */ if (xmldb_get0_clear(h, td->td_target) < 0) diff --git a/apps/backend/backend_commit.h b/apps/backend/backend_commit.h index adcdc0bc..2fccb688 100644 --- a/apps/backend/backend_commit.h +++ b/apps/backend/backend_commit.h @@ -47,6 +47,6 @@ int candidate_commit(clicon_handle h, char *db, cbuf *cbret); int from_client_commit(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); int from_client_discard_changes(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); int from_client_cancel_commit(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); -int from_client_validate(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); +int from_client_validate(clicon_handle h, cxobj *xe, cbuf *cbret, void *arg, void *regarg); #endif /* _BACKEND_COMMIT_H_ */ diff --git a/lib/src/clixon_xml_bind.c b/lib/src/clixon_xml_bind.c index 70ef9f52..466f1c64 100644 --- a/lib/src/clixon_xml_bind.c +++ b/lib/src/clixon_xml_bind.c @@ -428,18 +428,12 @@ xml_bind_yang_rpc(cxobj *xrpc, rpcname = xml_name(x); if (ys_module_by_xml(yspec, x, &ymod) < 0) goto done; -#if 1 - assert(ymod); -#else if (ymod == NULL){ - if ((cberr = cbuf_new()) == NULL){ - clicon_err(OE_UNIX, errno, "cbuf_new"); + if (xerr && + netconf_unknown_element_xml(xerr, "application", rpcname, "Unrecognized RPC (wrong namespace?)") < 0) goto done; - } - /* more here */ goto fail; } -#endif if ((yrpc = yang_find(ymod, Y_RPC, rpcname)) == NULL){ if (xerr && netconf_unknown_element_xml(xerr, "application", rpcname, "Unrecognized RPC") < 0) diff --git a/test/test_rpc.sh b/test/test_rpc.sh index 60f0f051..170987b9 100755 --- a/test/test_rpc.sh +++ b/test/test_rpc.sh @@ -70,35 +70,29 @@ new "netconf empty rpc" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^]]>]]>$' new "restconf example rpc json/json default - no http media headers" -expectpart "$(curl -is -X POST -H "Content-Type: application/yang-data+json" -d '{"clixon-example:input":{"x":0}}' http://localhost/restconf/operations/clixon-example:example)" 0 'HTTP/1.1 200 OK' 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"42"}} - ' +expectpart "$(curl -is -X POST -H "Content-Type: application/yang-data+json" -d '{"clixon-example:input":{"x":0}}' http://localhost/restconf/operations/clixon-example:example)" 0 'HTTP/1.1 200 OK' 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"42"}}' new "restconf example rpc json/json change y default" -expectpart "$(curl -is -X POST -H "Content-Type: application/yang-data+json" -d '{"clixon-example:input":{"x":"0","y":"99"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"99"}} - ' +expectpart "$(curl -is -X POST -H "Content-Type: application/yang-data+json" -d '{"clixon-example:input":{"x":"0","y":"99"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"99"}}' new "restconf example rpc json/json" # XXX example:input example:output -expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+json' -H 'Accept: application/yang-data+json' -d '{"clixon-example:input":{"x":"0"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"42"}} - ' +expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+json' -H 'Accept: application/yang-data+json' -d '{"clixon-example:input":{"x":"0"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"42"}}' new "restconf example rpc xml/json" -expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+xml' -H 'Accept: application/yang-data+json' -d '0' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"42"}} - ' +expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+xml' -H 'Accept: application/yang-data+json' -d '0' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+json' '{"clixon-example:output":{"x":"0","y":"42"}}' new "restconf example rpc json/xml" -expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+json' -H 'Accept: application/yang-data+xml' -d '{"clixon-example:input":{"x":"0"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+xml' '042 - ' +expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+json' -H 'Accept: application/yang-data+xml' -d '{"clixon-example:input":{"x":"0"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+xml' '042' new "restconf example rpc xml/xml" -expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+xml' -H 'Accept: application/yang-data+xml' -d '0' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+xml' '042 - ' +expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+xml' -H 'Accept: application/yang-data+xml' -d '0' http://localhost/restconf/operations/clixon-example:example)" 0 'Content-Type: application/yang-data+xml' '042' new "restconf example rpc xml in w json encoding (expect fail)" -expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+json' -H 'Accept: application/yang-data+xml' -d '0' http://localhost/restconf/operations/clixon-example:example)" 0 'HTTP/1.1 400 Bad Request' "rpcmalformed-messageerrorjson_parse: line 1: syntax error at or before: '<' " +expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+json' -H 'Accept: application/yang-data+xml' -d '0' http://localhost/restconf/operations/clixon-example:example)" 0 'HTTP/1.1 400 Bad Request' "rpcmalformed-messageerrorjson_parse: line 1: syntax error at or before: '<'" new "restconf example rpc json in xml encoding (expect fail)" -expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+xml' -H 'Accept: application/yang-data+xml' -d '{"clixon-example:input":{"x":"0"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'HTTP/1.1 400 Bad Reques' 'rpcmalformed-messageerrorxml_parse: line 0: syntax error: at or before: " ' +expectpart "$(curl -is -X POST -H 'Content-Type: application/yang-data+xml' -H 'Accept: application/yang-data+xml' -d '{"clixon-example:input":{"x":"0"}}' http://localhost/restconf/operations/clixon-example:example)" 0 'HTTP/1.1 400 Bad Reques' 'rpcmalformed-messageerrorxml_parse: line 0: syntax error: at or before: "' new "netconf example rpc" expecteof "$clixon_netconf -qf $cfg" 0 '0]]>]]>' '^042]]>]]>$' @@ -155,6 +149,13 @@ expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^applicationdata-missingmissing-choiceedit-contenterror]]>]]>$' +# Negative errors (namespace/module missing) +new "netconf wrong rpc namespace (should fail)" +expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^applicationunknown-elementgeterror]]>]]>$' + +new "restconf wrong rpc (should fail" +expectpart "$(curl -is -X POST -H "Content-Type: application/yang-data+json" u http://localhost/restconf/operations/clixon-foo:get)" 0 'HTTP/1.1 412 Precondition Failed' '{"ietf-restconf:errors":{"error":{"error-type":"protocol","error-tag":"operation-failed","error-severity":"error","error-message":"yang module not found"}}}' + new "Kill restconf daemon" stop_restconf