diff --git a/src/python/yaramod_python.cpp b/src/python/yaramod_python.cpp
index e3a8a76d..9d8b9482 100644
--- a/src/python/yaramod_python.cpp
+++ b/src/python/yaramod_python.cpp
@@ -306,7 +306,13 @@ void addBasicClasses(py::module& module)
py::class_(module, "Meta")
.def_property("key", &Meta::getKey, &Meta::setKey)
- .def_property("value", &Meta::getValue, &Meta::setValue);
+ .def_property("value", &Meta::getValue, &Meta::setValue)
+ .def_property_readonly("token_key", [](Meta& self) {
+ return *self.getKeyTokenIt();
+ })
+ .def_property_readonly("token_value", [](Meta& self) {
+ return *self.getValueTokenIt();
+ });
py::class_(module, "Variable")
.def_property("key", &Variable::getKey, &Variable::setKey)
diff --git a/tests/python/test_representation.py b/tests/python/test_representation.py
index e9e3a2f6..2d30d149 100644
--- a/tests/python/test_representation.py
+++ b/tests/python/test_representation.py
@@ -151,3 +151,46 @@ def test_get_tokenstream_after_unknown_module_error(self):
'\n',
'rule'
])
+
+ def test_meta_values_interface(self):
+ input_text = """rule test {
+ meta:
+ author = "Name Surname"
+ description = "Test checking the meta value tokens"
+ condition:
+ false
+}
+"""
+ ymod = yaramod.Yaramod()
+ yfile = ymod.parse_string(input_text)
+ self.assertEqual(len(yfile.rules[0].metas), 2)
+
+ meta = yfile.rules[0].metas[0] # author
+ self.assertTrue(hasattr(meta, "token_key"))
+ token = meta.token_key
+ self.assertEqual(token.location.begin.line, 3)
+ self.assertEqual(token.location.begin.column, 9)
+ self.assertEqual(token.location.end.line, 3)
+ self.assertEqual(token.location.end.column, 14)
+
+ self.assertTrue(hasattr(meta, "token_value"))
+ token = meta.token_value
+ self.assertEqual(token.location.begin.line, 3)
+ self.assertEqual(token.location.begin.column, 18)
+ self.assertEqual(token.location.end.line, 3)
+ self.assertEqual(token.location.end.column, 31)
+
+ meta = yfile.rules[0].metas[1] # description
+ self.assertTrue(hasattr(meta, "token_key"))
+ token = meta.token_key
+ self.assertEqual(token.location.begin.line, 4)
+ self.assertEqual(token.location.begin.column, 9)
+ self.assertEqual(token.location.end.line, 4)
+ self.assertEqual(token.location.end.column, 19)
+
+ self.assertTrue(hasattr(meta, "token_value"))
+ token = meta.token_value
+ self.assertEqual(token.location.begin.line, 4)
+ self.assertEqual(token.location.begin.column, 23)
+ self.assertEqual(token.location.end.line, 4)
+ self.assertEqual(token.location.end.column, 59)