pangdudu-ruby-dbus 0.2.4.1 → 0.2.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +26 -4
- data/lib/dbus/auth.rb +22 -12
- data/lib/dbus/bus.rb +13 -2
- data/lib/dbus/introspect.rb +2 -0
- data/lib/dbus.rb +0 -3
- metadata +2 -2
data/README.rdoc
CHANGED
@@ -91,10 +91,32 @@ painful to use.
|
|
91
91
|
The file content also get's updated every 5 minutes (when a client fails to auth etc.).
|
92
92
|
Making copy and paste from one shell to another very frolic.
|
93
93
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
94
|
+
=== Hackish solution from pangdudu/robots/lib/robots_agent.rb
|
95
|
+
|
96
|
+
#because dbus remote auth still betrays us, we need to hack it
|
97
|
+
def get_remote_cookie
|
98
|
+
if @config[:robots_socket_name].include? "tcp:"
|
99
|
+
af, port, daemon_name, daemon_addr = (Socket::getaddrinfo(@config[:daemonhost],@config[:daemonhost].to_i)).first
|
100
|
+
ilog "Trying to get/hack remote cookie from: #{daemon_name}."
|
101
|
+
begin
|
102
|
+
cookiepath = "#{ENV['HOME']}/.dbus-keyrings/org_freedesktop_general"
|
103
|
+
#oki, the scp magic only works, if you use sshkeys
|
104
|
+
`scp #{daemon_addr}:.dbus-keyrings/org_freedesktop_general #{cookiepath}`
|
105
|
+
if File.exist? cookiepath
|
106
|
+
cookie = File.open(cookiepath)
|
107
|
+
dlog "Got cookie: #{cookie.gets}"
|
108
|
+
end
|
109
|
+
rescue
|
110
|
+
elog "Oops, something is wrong."
|
111
|
+
end
|
112
|
+
else
|
113
|
+
dlog "Nothing to hack, boring."
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
in principle, this is ok. we can now do what we want and it is save to exchange cookies over
|
118
|
+
a ssh session. However I'm still not feeling comfortable doing this. I guess everything else
|
119
|
+
would mean touching the reference C dbus-daemon implementation.
|
98
120
|
|
99
121
|
|
100
122
|
more infos:
|
data/lib/dbus/auth.rb
CHANGED
@@ -6,7 +6,10 @@
|
|
6
6
|
# License, version 2.1 as published by the Free Software Foundation.
|
7
7
|
# See the file "COPYING" for the exact licensing terms.
|
8
8
|
|
9
|
+
$debug = false #it's all over the state machine
|
10
|
+
|
9
11
|
module DBus
|
12
|
+
|
10
13
|
# Exception raised when authentication fails somehow.
|
11
14
|
class AuthenticationFailed < Exception
|
12
15
|
end
|
@@ -39,10 +42,12 @@ module DBus
|
|
39
42
|
# Class for 'CookieSHA1' type authentication.
|
40
43
|
# Implements the AUTH DBUS_COOKIE_SHA1 mechanism.
|
41
44
|
class DBusCookieSHA1 < Authenticator
|
42
|
-
|
45
|
+
|
43
46
|
#the autenticate method (called in stage one of authentification)
|
44
47
|
def authenticate
|
45
48
|
require 'etc'
|
49
|
+
#number of retries we have for auth
|
50
|
+
@retries = 1
|
46
51
|
return "#{hex_encode(Etc.getlogin)}" #server expects it to be binary
|
47
52
|
end
|
48
53
|
|
@@ -61,12 +66,12 @@ module DBus
|
|
61
66
|
c_challenge = Array.new(s_challenge.length/2).map{|obj|obj=rand(255).to_s}.join
|
62
67
|
# Search cookie file for id
|
63
68
|
path = File.join(ENV['HOME'], '.dbus-keyrings', context)
|
64
|
-
dlog "path: #{path.inspect}"
|
69
|
+
dlog "path: #{path.inspect}" #if $debug
|
65
70
|
File.foreach(path) do |line|
|
66
71
|
if line.index(id) == 0
|
67
72
|
# Right line of file, read cookie
|
68
73
|
cookie = line.split(' ')[2].chomp
|
69
|
-
dlog "cookie: #{cookie.inspect}"
|
74
|
+
dlog "cookie: #{cookie.inspect}" if $debug
|
70
75
|
# Concatenate and encrypt
|
71
76
|
to_encrypt = [s_challenge, c_challenge, cookie].join(':')
|
72
77
|
sha = Digest::SHA1.hexdigest(to_encrypt)
|
@@ -77,7 +82,12 @@ module DBus
|
|
77
82
|
return response
|
78
83
|
end
|
79
84
|
end
|
80
|
-
|
85
|
+
#a little rescue magic
|
86
|
+
elog "Could not auth, will now exit." unless @retries <= 0
|
87
|
+
elog "Unable to locate cookie, retry in 1 second."
|
88
|
+
@retries -= 1
|
89
|
+
sleep 1
|
90
|
+
data(hexdata)
|
81
91
|
end
|
82
92
|
|
83
93
|
# encode plain to hex
|
@@ -132,7 +142,7 @@ module DBus
|
|
132
142
|
raise AuthException if @auth_list.size == 0
|
133
143
|
@authenticator = @auth_list.shift.new
|
134
144
|
auth_msg = ["AUTH", @authenticator.name, @authenticator.authenticate]
|
135
|
-
dlog "auth_msg: #{auth_msg.inspect}"
|
145
|
+
dlog "auth_msg: #{auth_msg.inspect}" if $debug
|
136
146
|
send(auth_msg)
|
137
147
|
rescue AuthException
|
138
148
|
@socket.close
|
@@ -154,7 +164,7 @@ module DBus
|
|
154
164
|
break if data.include? crlf #crlf means line finished, the TCP socket keeps on listening, so we break
|
155
165
|
end
|
156
166
|
readline = data.chomp.split(" ")
|
157
|
-
dlog "readline: #{readline.inspect}"
|
167
|
+
dlog "readline: #{readline.inspect}" if $debug
|
158
168
|
return readline
|
159
169
|
end
|
160
170
|
|
@@ -162,7 +172,7 @@ module DBus
|
|
162
172
|
def next_state
|
163
173
|
msg = next_msg
|
164
174
|
if @state == :Starting
|
165
|
-
dlog ":Starting msg: #{msg[0].inspect}"
|
175
|
+
dlog ":Starting msg: #{msg[0].inspect}" if $debug
|
166
176
|
case msg[0]
|
167
177
|
when "OK"
|
168
178
|
@state = :WaitingForOk
|
@@ -172,15 +182,15 @@ module DBus
|
|
172
182
|
@state = :WaitingForData
|
173
183
|
end
|
174
184
|
end
|
175
|
-
dlog "state: #{@state}"
|
185
|
+
dlog "state: #{@state}" if $debug
|
176
186
|
case @state
|
177
187
|
when :WaitingForData
|
178
|
-
dlog ":WaitingForData msg: #{msg[0].inspect}"
|
188
|
+
dlog ":WaitingForData msg: #{msg[0].inspect}" if $debug
|
179
189
|
case msg[0]
|
180
190
|
when "DATA"
|
181
191
|
chall = msg[1]
|
182
192
|
resp, chall = @authenticator.data(chall)
|
183
|
-
dlog ":WaitingForData/DATA resp: #{resp.inspect}"
|
193
|
+
dlog ":WaitingForData/DATA resp: #{resp.inspect}" if $debug
|
184
194
|
case resp
|
185
195
|
when :AuthContinue
|
186
196
|
send("DATA", chall)
|
@@ -206,7 +216,7 @@ module DBus
|
|
206
216
|
@state = :WaitingForData
|
207
217
|
end
|
208
218
|
when :WaitingForOk
|
209
|
-
dlog ":WaitingForOk msg: #{msg[0].inspect}"
|
219
|
+
dlog ":WaitingForOk msg: #{msg[0].inspect}" if $debug
|
210
220
|
case msg[0]
|
211
221
|
when "OK"
|
212
222
|
send("BEGIN")
|
@@ -222,7 +232,7 @@ module DBus
|
|
222
232
|
@state = :WaitingForOk
|
223
233
|
end
|
224
234
|
when :WaitingForReject
|
225
|
-
dlog ":WaitingForReject msg: #{msg[0].inspect}"
|
235
|
+
dlog ":WaitingForReject msg: #{msg[0].inspect}" if $debug
|
226
236
|
case msg[0]
|
227
237
|
when "REJECT"
|
228
238
|
next_authenticator
|
data/lib/dbus/bus.rb
CHANGED
@@ -176,6 +176,7 @@ module DBus
|
|
176
176
|
# "transport1:key1=value1,key2=value2;transport2:key1=value1,key2=value2"
|
177
177
|
# e.g. "unix:path=/tmp/dbus-test" or "tcp:host=localhost,port=2687"
|
178
178
|
def initialize(path)
|
179
|
+
dlog "path: #{path}"
|
179
180
|
@path = path
|
180
181
|
@unique_name = nil
|
181
182
|
@buffer = ""
|
@@ -184,6 +185,7 @@ module DBus
|
|
184
185
|
@signal_matchrules = Array.new
|
185
186
|
@proxy = nil
|
186
187
|
@object_root = Node.new("/")
|
188
|
+
@is_tcp = false
|
187
189
|
end
|
188
190
|
|
189
191
|
# Connect to the bus and initialize the connection.
|
@@ -203,11 +205,12 @@ module DBus
|
|
203
205
|
port = para.sub("port=","").to_i if para.include? "port="
|
204
206
|
family = para.sub("family=","") if para.include? "family="
|
205
207
|
end
|
206
|
-
dlog "host,port,family : #{host},#{port},#{family}"
|
208
|
+
#dlog "host,port,family : #{host},#{port},#{family}"
|
207
209
|
begin
|
208
210
|
#initialize the tcp socket
|
209
211
|
@socket = TCPSocket.new(host,port)
|
210
212
|
init_connection
|
213
|
+
@is_tcp = true
|
211
214
|
rescue
|
212
215
|
elog "Could not establish connection to: #{@path}, will now exit."
|
213
216
|
exit(0) #a little harsh
|
@@ -446,7 +449,15 @@ module DBus
|
|
446
449
|
# Fill (append) the buffer from data that might be available on the
|
447
450
|
# socket.
|
448
451
|
def update_buffer
|
449
|
-
@buffer += @socket.read_nonblock(MSG_BUF_SIZE)
|
452
|
+
@buffer += @socket.read_nonblock(MSG_BUF_SIZE) if @is_tcp
|
453
|
+
unless @is_tcp
|
454
|
+
begin
|
455
|
+
@buffer += @socket.read_nonblock(MSG_BUF_SIZE)
|
456
|
+
rescue
|
457
|
+
wlog ".read_nonblock failed, falling back to .recv"
|
458
|
+
@buffer += @socket.recv(MSG_BUF_SIZE)
|
459
|
+
end
|
460
|
+
end
|
450
461
|
end
|
451
462
|
|
452
463
|
# Get one message from the bus and remove it from the buffer.
|
data/lib/dbus/introspect.rb
CHANGED
@@ -470,6 +470,8 @@ module DBus
|
|
470
470
|
if @default_iface and has_iface?(@default_iface)
|
471
471
|
@interfaces[@default_iface].method(name).call(*args)
|
472
472
|
else
|
473
|
+
dlog "interfaces: #{@interfaces.keys.inspect}"
|
474
|
+
dlog "default_iface: #{@default_iface}"
|
473
475
|
raise NoMethodError
|
474
476
|
end
|
475
477
|
end
|
data/lib/dbus.rb
CHANGED
@@ -9,9 +9,6 @@
|
|
9
9
|
# See the file "COPYING" for the exact licensing terms.
|
10
10
|
require 'rubygems'
|
11
11
|
require 'rofl' #http://github.com/pangdudu/rofl/tree/master makes the debug/tracing easy
|
12
|
-
#comes from the Rofl logger/tracer module
|
13
|
-
@logger.level = Logger::DEBUG
|
14
|
-
|
15
12
|
require 'dbus/type'
|
16
13
|
require 'dbus/introspect'
|
17
14
|
require 'dbus/export'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pangdudu-ruby-dbus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.4.
|
4
|
+
version: 0.2.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruby DBUS Team, pangdudu
|
@@ -9,7 +9,7 @@ autorequire: dbus
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-31 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|