/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to mandos-ctl

  • Committer: Teddy Hogeborn
  • Date: 2019-04-09 13:50:57 UTC
  • Revision ID: teddy@recompile.se-20190409135057-5di780wouddap7tf
mandos-ctl: Fix --secret when using the dbus-python module

* mandos-ctl (dbus_python_adapter.SystemBus.set_client_property): New;
  force ByteArray type to be sent for the client property "Secret".
  (Test_dbus_python_adapter_SystemBus.MockDBusPython_func
  .mock_dbus_python.SystemBus.get_object.DBusObject.Set): New.
  (Test_dbus_python_adapter_SystemBus.MockDBusPython_func
  .mock_dbus_python.SystemBus.get_object.set_property): - '' -
  (Test_dbus_python_adapter.SystemBus.MockDBusPython_func
  .mock_dbus_python.ByteArray): - '' -
  (Test_dbus_python_adapter_SystemBus
  .test_Set_Secret_sends_bytearray): - '' -

Show diffs side-by-side

added added

removed removed

Lines of Context:
571
571
                        for key, subval in value.items()}
572
572
            return value
573
573
 
 
574
        def set_client_property(self, objectpath, key, value):
 
575
            if key == "Secret":
 
576
                if not isinstance(value, bytes):
 
577
                    value = value.encode("utf-8")
 
578
                value = self.dbus_python.ByteArray(value)
 
579
            return self.set_property(self.busname, objectpath,
 
580
                                     self.client_interface, key,
 
581
                                     value)
574
582
 
575
583
    class SilenceLogger(object):
576
584
        "Simple context manager to silence a particular logger"
1312
1320
                @staticmethod
1313
1321
                def get_object(busname, objectpath):
1314
1322
                    DBusObject = collections.namedtuple(
1315
 
                        "DBusObject", ("methodname",))
 
1323
                        "DBusObject", ("methodname", "Set"))
1316
1324
                    def method(*args, **kwargs):
1317
1325
                        self.assertEqual({"dbus_interface":
1318
1326
                                          "interface"},
1319
1327
                                         kwargs)
1320
1328
                        return func(*args)
1321
 
                    return DBusObject(methodname=method)
 
1329
                    def set_property(interface, key, value,
 
1330
                                     dbus_interface=None):
 
1331
                        self.assertEqual(
 
1332
                            "org.freedesktop.DBus.Properties",
 
1333
                            dbus_interface)
 
1334
                        self.assertEqual("Secret", key)
 
1335
                        return func(interface, key, value,
 
1336
                                    dbus_interface=dbus_interface)
 
1337
                    return DBusObject(methodname=method,
 
1338
                                      Set=set_property)
1322
1339
            class Boolean(object):
1323
1340
                def __init__(self, value):
1324
1341
                    self.value = bool(value)
1330
1347
                pass
1331
1348
            class Dictionary(dict):
1332
1349
                pass
 
1350
            class ByteArray(bytes):
 
1351
                pass
1333
1352
        return mock_dbus_python
1334
1353
 
1335
1354
    def call_method(self, bus, methodname, busname, objectpath,
1512
1531
        # Make sure the dbus logger was suppressed
1513
1532
        self.assertEqual(0, counting_handler.count)
1514
1533
 
 
1534
    def test_Set_Secret_sends_bytearray(self):
 
1535
        ret = [None]
 
1536
        def func(*args, **kwargs):
 
1537
            ret[0] = (args, kwargs)
 
1538
        mock_dbus_python = self.MockDBusPython_func(func)
 
1539
        bus = dbus_python_adapter.SystemBus(mock_dbus_python)
 
1540
        bus.set_client_property("objectpath", "Secret", "value")
 
1541
        expected_call = (("se.recompile.Mandos.Client", "Secret",
 
1542
                          mock_dbus_python.ByteArray(b"value")),
 
1543
                         {"dbus_interface":
 
1544
                          "org.freedesktop.DBus.Properties"})
 
1545
        self.assertEqual(expected_call, ret[0])
 
1546
        if sys.version_info.major == 2:
 
1547
            self.assertIsInstance(ret[0][0][-1],
 
1548
                                  mock_dbus_python.ByteArray)
 
1549
 
1515
1550
    def test_get_object_converts_to_correct_exception(self):
1516
1551
        bus = dbus_python_adapter.SystemBus(
1517
1552
            self.fake_dbus_python_raises_exception_on_connect)