diff options
author | An-Cheng Huang <ancheng@vyatta.com> | 2010-11-04 18:34:30 -0700 |
---|---|---|
committer | An-Cheng Huang <ancheng@vyatta.com> | 2010-11-04 18:34:30 -0700 |
commit | 1e1d0de703f3c7a7e1b6af0d984a736573759ad7 (patch) | |
tree | 00d5c4a7d801d1bcb6306beb961bfecd31b96596 | |
parent | b979a051f8cf987edba889e812863260f73e8312 (diff) | |
download | vyatta-cfg-1e1d0de703f3c7a7e1b6af0d984a736573759ad7.tar.gz vyatta-cfg-1e1d0de703f3c7a7e1b6af0d984a736573759ad7.zip |
add session assertion for API functions
* enforce session for API functions requiring it.
-rw-r--r-- | src/cstore/cstore-node.cpp | 7 | ||||
-rw-r--r-- | src/cstore/cstore.cpp | 106 | ||||
-rw-r--r-- | src/cstore/cstore.hpp | 8 |
3 files changed, 119 insertions, 2 deletions
diff --git a/src/cstore/cstore-node.cpp b/src/cstore/cstore-node.cpp index a67f291..04e774e 100644 --- a/src/cstore/cstore-node.cpp +++ b/src/cstore/cstore-node.cpp @@ -109,8 +109,11 @@ CstoreCfgNode::CstoreCfgNode(Cstore& cstore, vector<string>& path_comps, // handle comment string ac_str; bool ac = _cstore->cfgPathGetComment(path_comps, ac_str, true); - string wc_str; - bool wc = _cstore->cfgPathGetComment(path_comps, wc_str, false); + string wc_str = ac_str; + bool wc = ac; + if (!_active_only) { + wc = _cstore->cfgPathGetComment(path_comps, wc_str, false); + } if (ac) { if (wc) { // has comment in both active and working diff --git a/src/cstore/cstore.cpp b/src/cstore/cstore.cpp index a52cae1..9bdfaa7 100644 --- a/src/cstore/cstore.cpp +++ b/src/cstore/cstore.cpp @@ -210,6 +210,8 @@ Cstore::tmplGetChildNodes(const vector<string>& path_comps, bool Cstore::deleteCfgPath(const vector<string>& path_comps, const vtw_def& def) { + ASSERT_IN_SESSION; + if (!cfg_path_exists(path_comps, false, true)) { output_user("Nothing to delete (the specified %s does not exist)\n", (!def.is_value || def.tag) ? "node" : "value"); @@ -299,6 +301,8 @@ Cstore::deleteCfgPath(const vector<string>& path_comps, const vtw_def& def) bool Cstore::validateSetPath(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + // if we can get parsed tmpl, path is valid vtw_def def; string terr; @@ -343,6 +347,8 @@ Cstore::validateSetPath(const vector<string>& path_comps) bool Cstore::validateDeletePath(const vector<string>& path_comps, vtw_def& def) { + ASSERT_IN_SESSION; + string terr; if (!get_parsed_tmpl(path_comps, false, def, terr)) { output_user("%s\n", terr.c_str()); @@ -357,6 +363,8 @@ Cstore::validateDeletePath(const vector<string>& path_comps, vtw_def& def) bool Cstore::validateActivatePath(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + vtw_def def; if (!validate_act_deact(path_comps, "activate", def)) { return false; @@ -392,6 +400,8 @@ Cstore::validateActivatePath(const vector<string>& path_comps) bool Cstore::validateDeactivatePath(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + vtw_def def; return validate_act_deact(path_comps, "deactivate", def); } @@ -404,6 +414,8 @@ Cstore::validateDeactivatePath(const vector<string>& path_comps) bool Cstore::getEditEnv(const vector<string>& path_comps, string& env) { + ASSERT_IN_SESSION; + vtw_def def; string terr; if (!get_parsed_tmpl(path_comps, false, def, terr)) { @@ -459,6 +471,8 @@ Cstore::getEditEnv(const vector<string>& path_comps, string& env) bool Cstore::getEditUpEnv(string& env) { + ASSERT_IN_SESSION; + /* "up" is based on current levels in environment. levels should already * be set up in constructor (with "use_edit_level" true). */ @@ -499,6 +513,8 @@ Cstore::getEditUpEnv(string& env) bool Cstore::getEditResetEnv(string& env) { + ASSERT_IN_SESSION; + SAVE_PATHS; while (!edit_level_at_root()) { pop_cfg_path(); @@ -520,6 +536,8 @@ Cstore::getEditResetEnv(string& env) bool Cstore::getCompletionEnv(const vector<string>& comps, string& env) { + ASSERT_IN_SESSION; + vector<string> pcomps = comps; string cmd = pcomps[0]; string last_comp = pcomps.back(); @@ -808,6 +826,8 @@ Cstore::getCompletionEnv(const vector<string>& comps, string& env) bool Cstore::setCfgPath(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + return set_cfg_path(path_comps, true); } @@ -817,6 +837,8 @@ Cstore::setCfgPath(const vector<string>& path_comps) bool Cstore::validateRenameArgs(const vector<string>& args) { + ASSERT_IN_SESSION; + return validate_rename_copy(args, "rename"); } @@ -826,6 +848,8 @@ Cstore::validateRenameArgs(const vector<string>& args) bool Cstore::validateCopyArgs(const vector<string>& args) { + ASSERT_IN_SESSION; + return validate_rename_copy(args, "copy"); } @@ -835,6 +859,8 @@ Cstore::validateCopyArgs(const vector<string>& args) bool Cstore::validateMoveArgs(const vector<string>& args) { + ASSERT_IN_SESSION; + vector<string> epath; vector<string> nargs; if (!conv_move_args_for_rename(args, epath, nargs)) { @@ -855,6 +881,8 @@ Cstore::validateMoveArgs(const vector<string>& args) bool Cstore::validateCommentArgs(const vector<string>& args, vtw_def& def) { + ASSERT_IN_SESSION; + /* separate path from comment. * follow the original implementation: the last arg is the comment, and * everything else is part of the path. @@ -909,6 +937,8 @@ Cstore::validateCommentArgs(const vector<string>& args, vtw_def& def) bool Cstore::renameCfgPath(const vector<string>& args) { + ASSERT_IN_SESSION; + string otagnode = args[0]; string otagval = args[1]; string ntagval = args[4]; @@ -930,6 +960,8 @@ Cstore::renameCfgPath(const vector<string>& args) bool Cstore::copyCfgPath(const vector<string>& args) { + ASSERT_IN_SESSION; + string otagnode = args[0]; string otagval = args[1]; string ntagval = args[4]; @@ -949,6 +981,8 @@ Cstore::copyCfgPath(const vector<string>& args) bool Cstore::commentCfgPath(const vector<string>& args, const vtw_def& def) { + ASSERT_IN_SESSION; + // separate path from comment vector<string> path_comps(args); string comment = args.back(); @@ -983,6 +1017,8 @@ Cstore::commentCfgPath(const vector<string>& args, const vtw_def& def) bool Cstore::discardChanges() { + ASSERT_IN_SESSION; + // just call underlying implementation unsigned long long num_removed = 0; if (discard_changes(num_removed)) { @@ -1003,6 +1039,8 @@ Cstore::discardChanges() bool Cstore::moveCfgPath(const vector<string>& args) { + ASSERT_IN_SESSION; + vector<string> epath; vector<string> nargs; if (!conv_move_args_for_rename(args, epath, nargs)) { @@ -1024,6 +1062,10 @@ Cstore::moveCfgPath(const vector<string>& args) bool Cstore::cfgPathExists(const vector<string>& path_comps, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + return cfg_path_exists(path_comps, active_cfg, false); } @@ -1032,6 +1074,10 @@ bool Cstore::cfgPathExistsDA(const vector<string>& path_comps, bool active_cfg, bool include_deactivated) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + return cfg_path_exists(path_comps, active_cfg, include_deactivated); } @@ -1040,6 +1086,8 @@ Cstore::cfgPathExistsDA(const vector<string>& path_comps, bool active_cfg, bool Cstore::cfgPathDeleted(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + // whether it's in active but not in working return (cfg_path_exists(path_comps, true, false) && !cfg_path_exists(path_comps, false, false)); @@ -1050,6 +1098,8 @@ Cstore::cfgPathDeleted(const vector<string>& path_comps) bool Cstore::cfgPathAdded(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + // whether it's not in active but in working return (!cfg_path_exists(path_comps, true, false) && cfg_path_exists(path_comps, false, false)); @@ -1076,6 +1126,8 @@ Cstore::cfgPathAdded(const vector<string>& path_comps) bool Cstore::cfgPathChanged(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + if (cfgPathDeleted(path_comps) || cfgPathAdded(path_comps)) { return true; } @@ -1093,6 +1145,8 @@ void Cstore::cfgPathGetDeletedChildNodes(const vector<string>& path_comps, vector<string>& cnodes) { + ASSERT_IN_SESSION; + cfgPathGetDeletedChildNodesDA(path_comps, cnodes, false); } @@ -1102,6 +1156,8 @@ Cstore::cfgPathGetDeletedChildNodesDA(const vector<string>& path_comps, vector<string>& cnodes, bool include_deactivated) { + ASSERT_IN_SESSION; + vector<string> acnodes; cfgPathGetChildNodesDA(path_comps, acnodes, true, include_deactivated); vector<string> wcnodes; @@ -1130,6 +1186,8 @@ void Cstore::cfgPathGetDeletedValues(const vector<string>& path_comps, vector<string>& dvals) { + ASSERT_IN_SESSION; + cfgPathGetDeletedValuesDA(path_comps, dvals, false); } @@ -1139,6 +1197,8 @@ Cstore::cfgPathGetDeletedValuesDA(const vector<string>& path_comps, vector<string>& dvals, bool include_deactivated) { + ASSERT_IN_SESSION; + vector<string> ovals; vector<string> nvals; if (!cfgPathGetValuesDA(path_comps, ovals, true, include_deactivated) @@ -1165,6 +1225,10 @@ Cstore::cfgPathGetDeletedValuesDA(const vector<string>& path_comps, bool Cstore::cfgPathDeactivated(const vector<string>& path_comps, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + vector<string> ppath; for (size_t i = 0; i < path_comps.size(); i++) { ppath.push_back(path_comps[i]); @@ -1185,6 +1249,10 @@ bool Cstore::cfgPathMarkedDeactivated(const vector<string>& path_comps, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + SAVE_PATHS; append_cfg_path(path_comps); bool ret = marked_deactivated(active_cfg); @@ -1199,6 +1267,10 @@ void Cstore::cfgPathGetChildNodes(const vector<string>& path_comps, vector<string>& cnodes, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + cfgPathGetChildNodesDA(path_comps, cnodes, active_cfg, false); } @@ -1208,6 +1280,10 @@ Cstore::cfgPathGetChildNodesDA(const vector<string>& path_comps, vector<string>& cnodes, bool active_cfg, bool include_deactivated) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + if (!include_deactivated && cfgPathDeactivated(path_comps, active_cfg)) { /* this node is deactivated (an ancestor or this node itself is * marked deactivated) and we don't want to include deactivated. nop. @@ -1231,6 +1307,10 @@ bool Cstore::cfgPathGetValue(const vector<string>& path_comps, string& value, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + return cfgPathGetValueDA(path_comps, value, active_cfg, false); } @@ -1239,6 +1319,10 @@ bool Cstore::cfgPathGetValueDA(const vector<string>& path_comps, string& value, bool active_cfg, bool include_deactivated) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + vtw_def def; if (!get_parsed_tmpl(path_comps, false, def)) { // invalid node @@ -1283,6 +1367,10 @@ bool Cstore::cfgPathGetValues(const vector<string>& path_comps, vector<string>& values, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + return cfgPathGetValuesDA(path_comps, values, active_cfg, false); } @@ -1292,6 +1380,10 @@ Cstore::cfgPathGetValuesDA(const vector<string>& path_comps, vector<string>& values, bool active_cfg, bool include_deactivated) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + vtw_def def; if (!get_parsed_tmpl(path_comps, false, def)) { // invalid node @@ -1328,6 +1420,10 @@ bool Cstore::cfgPathGetComment(const vector<string>& path_comps, string& comment, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + SAVE_PATHS; append_cfg_path(path_comps); bool ret = get_comment(comment, active_cfg); @@ -1342,6 +1438,10 @@ Cstore::cfgPathGetComment(const vector<string>& path_comps, string& comment, bool Cstore::cfgPathDefault(const vector<string>& path_comps, bool active_cfg) { + if (!active_cfg) { + ASSERT_IN_SESSION; + } + SAVE_PATHS; append_cfg_path(path_comps); bool ret = marked_display_default(active_cfg); @@ -1669,6 +1769,8 @@ Cstore::setVarRef(const string& ref_str, const string& value, bool to_active) bool Cstore::markCfgPathDeactivated(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + if (cfgPathDeactivated(path_comps)) { output_user("The specified configuration node is already deactivated\n"); // treat as success @@ -1691,6 +1793,8 @@ Cstore::markCfgPathDeactivated(const vector<string>& path_comps) bool Cstore::unmarkCfgPathDeactivated(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + SAVE_PATHS; append_cfg_path(path_comps); // note: also mark changed @@ -1749,6 +1853,8 @@ Cstore::unmarkCfgPathDeactivated(const vector<string>& path_comps) bool Cstore::unmarkCfgPathChanged(const vector<string>& path_comps) { + ASSERT_IN_SESSION; + SAVE_PATHS; append_cfg_path(path_comps); bool ret = unmark_changed_with_descendants(); diff --git a/src/cstore/cstore.hpp b/src/cstore/cstore.hpp index e09c015..c7f179b 100644 --- a/src/cstore/cstore.hpp +++ b/src/cstore/cstore.hpp @@ -28,6 +28,14 @@ exit(-1); \ } while (0); +#define ASSERT_IN_SESSION do \ + { \ + if (!inSession()) { \ + exit_internal("no session\n"); \ + } \ + } while (0); + + /* macros for saving/restoring paths. * note: this allows "nested" save/restore invocations but NOT recursive ones. */ |