summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/schemata/interface_definition.rnc6
-rw-r--r--src/reference_tree.ml14
-rw-r--r--src/reference_tree.mli6
-rw-r--r--test/data/interface_definition_sample.xml12
-rw-r--r--test/reference_tree_test.ml23
5 files changed, 60 insertions, 1 deletions
diff --git a/data/schemata/interface_definition.rnc b/data/schemata/interface_definition.rnc
index 5c60ffb..913123c 100644
--- a/data/schemata/interface_definition.rnc
+++ b/data/schemata/interface_definition.rnc
@@ -80,6 +80,8 @@ children = element children
# By default, a leaf node can have only one value.
# "multi" tag means a node can have one or more values,
# "valueless" means it can have no values at all.
+# "hidden" means node visibility can be toggled, eg 'dangerous' commands,
+# "secret" allows a node to hide its value from unprivileged users.
properties = element properties
{
help? &
@@ -89,7 +91,9 @@ properties = element properties
# These are meaningful only for leaf nodes
(element valueless { empty })? &
(element multi { empty })? &
- valueHelp*
+ (element hidden { empty })? &
+ (element secret { empty })? &
+ valueHelp*
}
# All nodes must have "name" attribute
diff --git a/src/reference_tree.ml b/src/reference_tree.ml
index 48de53b..8372ea0 100644
--- a/src/reference_tree.ml
+++ b/src/reference_tree.ml
@@ -10,6 +10,8 @@ type ref_node_data = {
valueless: bool;
owner: string option;
keep_order: bool;
+ hidden: bool;
+ secret: bool;
}
type t = ref_node_data Vytree.t
@@ -28,6 +30,8 @@ let default_data = {
valueless = false;
owner = None;
keep_order = false;
+ hidden = false;
+ secret = false;
}
(* Loading from XML *)
@@ -67,6 +71,8 @@ let data_from_xml d x =
| Xml.Element ("constraintErrorMessage", _, [Xml.PCData s]) ->
{d with constraint_error_message=s}
| Xml.Element ("constraint", _, _) -> load_constraint_from_xml d x
+ | Xml.Element ("hidden", _, _) -> {d with hidden=true}
+ | Xml.Element ("secret", _, _) -> {d with secret=true}
| _ -> raise (Bad_interface_definition "Malformed property tag")
in Xml.fold aux d x
@@ -173,3 +179,11 @@ let rec validate_path validators_dir node path =
let is_multi reftree path =
let data = Vytree.get_data reftree path in
data.multi
+
+let is_hidden reftree path =
+ let data = Vytree.get_data reftree path in
+ data.hidden
+
+let is_secret reftree path =
+ let data = Vytree.get_data reftree path in
+ data.secret
diff --git a/src/reference_tree.mli b/src/reference_tree.mli
index f0d7807..3bbfc4b 100644
--- a/src/reference_tree.mli
+++ b/src/reference_tree.mli
@@ -10,6 +10,8 @@ type ref_node_data = {
valueless: bool;
owner: string option;
keep_order: bool;
+ hidden: bool;
+ secret: bool;
}
exception Validation_error of string
@@ -23,3 +25,7 @@ val load_from_xml : t -> string -> t
val validate_path : string -> t -> string list -> string list * string option
val is_multi : t -> string list -> bool
+
+val is_hidden : t -> string list -> bool
+
+val is_secret : t -> string list -> bool
diff --git a/test/data/interface_definition_sample.xml b/test/data/interface_definition_sample.xml
index f4b950e..6a4f201 100644
--- a/test/data/interface_definition_sample.xml
+++ b/test/data/interface_definition_sample.xml
@@ -20,6 +20,12 @@
</leafNode>
</children>
</tagNode>
+ <leafNode name="password">
+ <properties>
+ <help>A password</help>
+ <secret/>
+ </properties>
+ </leafNode>
</children>
</node>
<leafNode name="host-name">
@@ -43,6 +49,12 @@
<valueless/>
</properties>
</leafNode>
+ <leafNode name="enable-dangerous-features">
+ <properties>
+ <help>Enable dangerous features</help>
+ <hidden/>
+ </properties>
+ </leafNode>
</children>
</node>
</children>
diff --git a/test/reference_tree_test.ml b/test/reference_tree_test.ml
index 8ffc079..078fc00 100644
--- a/test/reference_tree_test.ml
+++ b/test/reference_tree_test.ml
@@ -71,6 +71,25 @@ let test_is_multi_invalid test_ctxt =
let r = load_from_xml r (in_testdata_dir test_ctxt ["interface_definition_sample.xml"]) in
assert_equal (is_multi r ["system"; "host-name"]) false
+let test_is_secret_valid test_ctxt =
+ let r = Vytree.make default_data "root" in
+ let r = load_from_xml r (in_testdata_dir test_ctxt ["interface_definition_sample.xml"]) in
+ assert_equal (is_secret r ["system"; "login"; "password"]) true
+
+let test_is_secret_invalid test_ctxt =
+ let r = Vytree.make default_data "root" in
+ let r = load_from_xml r (in_testdata_dir test_ctxt ["interface_definition_sample.xml"]) in
+ assert_equal (is_secret r ["system"; "login"; "user"; "full-name"]) false
+
+let test_is_hidden_valid test_ctxt =
+ let r = Vytree.make default_data "root" in
+ let r = load_from_xml r (in_testdata_dir test_ctxt ["interface_definition_sample.xml"]) in
+ assert_equal (is_hidden r ["system"; "options"; "enable-dangerous-features"]) true
+
+let test_is_hidden_invalid test_ctxt =
+ let r = Vytree.make default_data "root" in
+ let r = load_from_xml r (in_testdata_dir test_ctxt ["interface_definition_sample.xml"]) in
+ assert_equal (is_hidden r ["system"; "login"; "user"; "full-name"]) false
let suite =
"Util tests" >::: [
@@ -86,6 +105,10 @@ let suite =
"test_validate_path_valueless_node_valid" >:: test_validate_path_valueless_node_valid;
"test_is_multi_valid" >:: test_is_multi_valid;
"test_is_multi_invalid" >:: test_is_multi_invalid;
+ "test_is_secret_valid" >:: test_is_secret_valid;
+ "test_is_secret_invalid" >:: test_is_secret_invalid;
+ "test_is_hidden_valid" >:: test_is_hidden_valid;
+ "test_is_hidden_invalid" >:: test_is_hidden_invalid;
]
let () =