Hi Daniel,
I've got a patch for perl-Net-DBus that adds support for the interactive
authorization stuff currently in dbus-1.9.x branch.
It seems to work well when using it but will need a little polish to
make work nicely when complied against different versions of dbus (e.g.
compiling against older version that doesn't have the appropriate
getter/setter methods).
Before I polish it and get it over to you, what is the definitive VCS
for it?
I think it's https://gitorious.org/net-dbus is this correct?
I've attached the WIP patch FYI, but feel free to ignore it until a
properly git formatted patch is available.
FWIW, this would also address this issue:
https://rt.cpan.org/Public/Bug/Display.html?id=101369
All the best
Col
--
Colin Guthrie
colin(at)mageia.org
http://colin.guthr.ie/
Day Job:
Tribalogic Limited http://www.tribalogic.net/
Open Source:
Mageia Contributor http://www.mageia.org/
PulseAudio Hacker http://www.pulseaudio.org/
Trac Hacker http://trac.edgewall.org/
diff -u -r Net-DBus-1.0.0.orig/DBus.xs Net-DBus-1.0.0/DBus.xs
--- Net-DBus-1.0.0.orig/DBus.xs 2011-06-30 22:32:04.000000000 +0100
+++ Net-DBus-1.0.0/DBus.xs 2015-01-07 14:10:05.955498879 +0000
@@ -997,6 +997,15 @@
DBusMessage *msg;
dbus_bool_t flag;
+dbus_bool_t
+dbus_message_get_allow_interactive_authorization(msg)
+ DBusMessage *msg;
+
+void
+dbus_message_set_allow_interactive_authorization(msg,flag)
+ DBusMessage *msg;
+ dbus_bool_t flag;
+
int
dbus_message_get_type(msg)
DBusMessage *msg;
diff -u -r Net-DBus-1.0.0.orig/lib/Net/DBus/Annotation.pm Net-DBus-1.0.0/lib/Net/DBus/Annotation.pm
--- Net-DBus-1.0.0.orig/lib/Net/DBus/Annotation.pm 2011-06-30 22:32:04.000000000 +0100
+++ Net-DBus-1.0.0/lib/Net/DBus/Annotation.pm 2015-01-07 14:13:47.763262283 +0000
@@ -64,16 +64,20 @@
our $CALL_SYNC = "sync";
our $CALL_ASYNC = "async";
our $CALL_NOREPLY = "noreply";
+our $AUTH_NONE = "auth_none";
+our $AUTH_INTERACTIVE = "auth_interactive";
bless \$CALL_SYNC, __PACKAGE__;
bless \$CALL_ASYNC, __PACKAGE__;
bless \$CALL_NOREPLY, __PACKAGE__;
+bless \$AUTH_NONE, __PACKAGE__;
+bless \$AUTH_INTERACTIVE, __PACKAGE__;
require Exporter;
our @ISA = qw(Exporter);
-our @EXPORT_OK = qw(dbus_call_sync dbus_call_async dbus_call_noreply);
-our %EXPORT_TAGS = (call => [qw(dbus_call_sync dbus_call_async dbus_call_noreply)]);
+our @EXPORT_OK = qw(dbus_call_sync dbus_call_async dbus_call_noreply dbus_auth_none dbus_auth_interactive);
+our %EXPORT_TAGS = (call => [qw(dbus_call_sync dbus_call_async dbus_call_noreply)], auth => [qw(dbus_auth_none dbus_auth_interactive)]);
=item dbus_call_sync
@@ -110,6 +114,26 @@
return \$CALL_NOREPLY;
}
+=item dbus_auth_none
+
+Requests that a method call disallows interactive authorization.
+
+=cut
+
+sub dbus_auth_none() {
+ return \$AUTH_NONE;
+}
+
+=item dbus_auth_interactive
+
+Requests that a method call allows interactive authorization.
+
+=cut
+
+sub dbus_auth_interactive() {
+ return \$AUTH_INTERACTIVE;
+}
+
1;
=pod
diff -u -r Net-DBus-1.0.0.orig/lib/Net/DBus/Binding/Message.pm Net-DBus-1.0.0/lib/Net/DBus/Binding/Message.pm
--- Net-DBus-1.0.0.orig/lib/Net/DBus/Binding/Message.pm 2011-06-30 22:32:04.000000000 +0100
+++ Net-DBus-1.0.0/lib/Net/DBus/Binding/Message.pm 2015-01-07 14:10:05.955498879 +0000
@@ -375,6 +375,34 @@
$self->{message}->dbus_message_set_no_reply($flag);
}
+=item $boolean = $msg->get_allow_interactive_authorization()
+
+Gets the flag indicating whether the message allows
+interactive authorization.
+
+=cut
+
+sub get_allow_interactive_authorization {
+ my $self = shift;
+
+ return $self->{message}->dbus_message_get_allow_interactive_authorization;
+}
+
+=item $msg->set_allow_interactive_authorization($boolean)
+
+Toggles the flag indicating whether the message allows
+interactive authorization.
+
+=cut
+
+
+sub set_allow_interactive_authorization {
+ my $self = shift;
+ my $flag = shift;
+
+ $self->{message}->dbus_message_set_allow_interactive_authorization($flag);
+}
+
=item my @values = $msg->get_args_list
De-marshall all the values in the body of the message, using the
diff -u -r Net-DBus-1.0.0.orig/lib/Net/DBus/RemoteObject.pm Net-DBus-1.0.0/lib/Net/DBus/RemoteObject.pm
--- Net-DBus-1.0.0.orig/lib/Net/DBus/RemoteObject.pm 2011-06-30 22:32:04.000000000 +0100
+++ Net-DBus-1.0.0/lib/Net/DBus/RemoteObject.pm 2015-01-07 14:21:46.022922890 +0000
@@ -57,7 +57,7 @@
use Net::DBus::Binding::Introspector;
use Net::DBus::ASyncReply;
-use Net::DBus::Annotation qw(:call);
+use Net::DBus::Annotation qw(:call :auth);
=item my $object = Net::DBus::RemoteObject->new($service, $object_path[, $interface]);
@@ -341,8 +341,14 @@
my $sub = $AUTOLOAD;
my $mode = dbus_call_sync;
- if (@_ && UNIVERSAL::isa($_[0], "Net::DBus::Annotation")) {
- $mode = shift;
+ my $auth = dbus_auth_none;
+ while (@_ && UNIVERSAL::isa($_[0], "Net::DBus::Annotation")) {
+ my $annotation = shift;
+ if ($annotation == dbus_call_sync || $annotation == dbus_call_async || $annotation == dbus_call_noreply) {
+ $mode = $annotation;
+ } elsif ($annotation == dbus_auth_none || $annotation == dbus_auth_interactive) {
+ $auth = $annotation;
+ }
}
(my $name = $AUTOLOAD) =~ s/.*:://;
@@ -356,7 +362,7 @@
if ($ins) {
if ($interface) {
if ($ins->has_method($name, $interface)) {
- return $self->_call_method($mode, $name, $interface, 1, @_);
+ return $self->_call_method($auth, $mode, $name, $interface, 1, @_);
}
if ($ins->has_property($name, $interface)) {
if ($ins->is_property_deprecated($name, $interface)) {
@@ -364,10 +370,10 @@
}
if (@_) {
- $self->_call_method($mode, "Set", "org.freedesktop.DBus.Properties", $interface, 1, $name, $_[0]);
+ $self->_call_method($auth, $mode, "Set", "org.freedesktop.DBus.Properties", $interface, 1, $name, $_[0]);
return ();
} else {
- return $self->_call_method($mode, "Get", "org.freedesktop.DBus.Properties", $interface, 1, $name);
+ return $self->_call_method($auth, $mode, "Get", "org.freedesktop.DBus.Properties", $interface, 1, $name);
}
}
} else {
@@ -378,7 +384,7 @@
die "method with name '$name' is exported " .
"in multiple interfaces of '" . $self->get_object_path . "'";
}
- return $self->_call_method($mode, $name, $interfaces[0], 1, @_);
+ return $self->_call_method($auth, $mode, $name, $interfaces[0], 1, @_);
}
@interfaces = $ins->has_property($name);
@@ -392,10 +398,10 @@
warn "property $name in interface $interface on " . $self->get_object_path . " is deprecated";
}
if (@_) {
- $self->_call_method($mode, "Set", "org.freedesktop.DBus.Properties", $interface, 1, $name, $_[0]);
+ $self->_call_method($auth, $mode, "Set", "org.freedesktop.DBus.Properties", $interface, 1, $name, $_[0]);
return ();
} else {
- return $self->_call_method($mode, "Get", "org.freedesktop.DBus.Properties", $interface, 1, $name);
+ return $self->_call_method($auth, $mode, "Get", "org.freedesktop.DBus.Properties", $interface, 1, $name);
}
}
}
@@ -406,12 +412,13 @@
$self->get_object_path . "', and object is not cast to any interface";
}
- return $self->_call_method($mode, $name, $interface, 0, @_);
+ return $self->_call_method($auth, $mode, $name, $interface, 0, @_);
}
sub _call_method {
my $self = shift;
+ my $auth = shift;
my $mode = shift;
my $name = shift;
my $interface = shift;
@@ -438,6 +445,10 @@
$call->append_args_list(@_);
}
+ if ($auth == dbus_auth_interactive) {
+ $call->set_allow_interactive_authorization(1);
+ }
+
if ($mode == dbus_call_sync) {
my $reply = $con->
send_with_reply_and_block($call, 60 * 1000);
_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel