Repository: mitsuhiko/minijinja (language: rust)

Issue:
Context has Undefined value if there is the underscore sign in it
## Description

When using the python's binding, the context has "Undefined" value if there is the underscore sign in the context's object.

## Reproduction steps

```python
ctx = {"ctx": {"_fa": {"a": 1}, "fa": {"a": 2}}}

print(minijinja.render_str('string = {{ ctx["fa"]["a"] }}', **ctx))  # works
print(minijinja.render_str('string = {{ ctx["_fa"]["a"] }}', **ctx))  # fails
```

The error is 

```
   1 > string = {{ ctx["_fa"]["a"] }}
     i                ^^^^^^^^^^^^ undefined value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Referenced variables: {
    ctx: {
        "_fa": Undefined,
        "fa": {
            "a": 2,
        },
    },
}
```

Additional helpful information:

- Version of minijinja: minijinja = "^0.30.1"
- Version of rustc: -
- Operating system and version: MacOs 13.2

## What did you expect

Two examples should work without errors.




Discussion / hints:

Fix patch:
diff --git a/minijinja-py/src/typeconv.rs b/minijinja-py/src/typeconv.rs
index ba97fd65..94b95461 100644
--- a/minijinja-py/src/typeconv.rs
+++ b/minijinja-py/src/typeconv.rs
@@ -25,9 +25,6 @@ pub struct DictLikeObject {
 
 impl StructObject for DictLikeObject {
     fn get_field(&self, name: &str) -> Option<Value> {
-        if !is_safe_attr(name) {
-            return None;
-        }
         Python::with_gil(|py| {
             let inner = self.inner.as_ref(py);
             inner.get_item(name).map(to_minijinja_value)


Test patch:
diff --git a/minijinja-py/tests/test_security.py b/minijinja-py/tests/test_security.py
new file mode 100644
index 00000000..41b8af33
--- /dev/null
+++ b/minijinja-py/tests/test_security.py
@@ -0,0 +1,19 @@
+from _pytest.unraisableexception import catch_unraisable_exception
+from minijinja import Environment, TemplateError, safe
+
+
+def test_private_attrs():
+    class MyClass:
+        def __init__(self):
+            self.public = 42
+            self._private = 23
+
+    env = Environment()
+    rv = env.eval_expr("[x.public, x._private]", x=MyClass())
+    assert rv == [42, None]
+
+
+def test_dict_is_always_public():
+    env = Environment()
+    rv = env.eval_expr("[x.public, x._private]", x={"public": 42, "_private": 23})
+    assert rv == [42, 23]