class DBus::Client
Authentication client class.¶ ↑
Class
tha performs the actional authentication.
Public Class Methods
new(socket)
click to toggle source
Create a new authentication client.
# File lib/dbus/auth.rb 119 def initialize(socket) 120 @socket = socket 121 @state = nil 122 @auth_list = [External, DBusCookieSHA1, Anonymous] 123 end
Public Instance Methods
authenticate()
click to toggle source
Start the authentication process.
# File lib/dbus/auth.rb 126 def authenticate 127 if RbConfig::CONFIG["target_os"] =~ /freebsd/ 128 @socket.sendmsg(0.chr, 0, nil, [:SOCKET, :SCM_CREDS, ""]) 129 else 130 @socket.write(0.chr) 131 end 132 next_authenticator 133 @state = :Starting 134 while @state != :Authenticated 135 r = next_state 136 return r if !r 137 end 138 true 139 end
Private Instance Methods
next_authenticator()
click to toggle source
Try authentication using the next authenticator.
# File lib/dbus/auth.rb 155 def next_authenticator 156 raise AuthenticationFailed if @auth_list.empty? 157 @authenticator = @auth_list.shift.new 158 auth_msg = ["AUTH", @authenticator.name, @authenticator.authenticate] 159 DBus.logger.debug "auth_msg: #{auth_msg.inspect}" 160 send(auth_msg) 161 rescue AuthenticationFailed 162 @socket.close 163 raise 164 end
next_msg()
click to toggle source
Read data (a buffer) from the bus until CR LF is encountered. Return the buffer without the CR LF characters.
# File lib/dbus/auth.rb 168 def next_msg 169 data = "" 170 crlf = "\r\n" 171 left = 1024 # 1024 byte, no idea if it's ever getting bigger 172 while left > 0 173 buf = @socket.read(left > 1 ? 1 : left) 174 break if buf.nil? 175 left -= buf.bytesize 176 data += buf 177 break if data.include? crlf # crlf means line finished, the TCP socket keeps on listening, so we break 178 end 179 readline = data.chomp.split(" ") 180 DBus.logger.debug "readline: #{readline.inspect}" 181 readline 182 end
next_state()
click to toggle source
Try to reach the next state based on the current state.
# File lib/dbus/auth.rb 191 def next_state 192 msg = next_msg 193 if @state == :Starting 194 DBus.logger.debug ":Starting msg: #{msg[0].inspect}" 195 case msg[0] 196 when "OK" 197 @state = :WaitingForOk 198 when "CONTINUE" 199 @state = :WaitingForData 200 when "REJECTED" # needed by tcp, unix-path/abstract doesn't get here 201 @state = :WaitingForData 202 end 203 end 204 DBus.logger.debug "state: #{@state}" 205 case @state 206 when :WaitingForData 207 DBus.logger.debug ":WaitingForData msg: #{msg[0].inspect}" 208 case msg[0] 209 when "DATA" 210 chall = msg[1] 211 resp, chall = @authenticator.data(chall) 212 DBus.logger.debug ":WaitingForData/DATA resp: #{resp.inspect}" 213 case resp 214 when :AuthContinue 215 send("DATA", chall) 216 @state = :WaitingForData 217 when :AuthOk 218 send("DATA", chall) 219 @state = :WaitingForOk 220 when :AuthError 221 send("ERROR") 222 @state = :WaitingForData 223 end 224 when "REJECTED" 225 next_authenticator 226 @state = :WaitingForData 227 when "ERROR" 228 send("CANCEL") 229 @state = :WaitingForReject 230 when "OK" 231 send("BEGIN") 232 @state = :Authenticated 233 else 234 send("ERROR") 235 @state = :WaitingForData 236 end 237 when :WaitingForOk 238 DBus.logger.debug ":WaitingForOk msg: #{msg[0].inspect}" 239 case msg[0] 240 when "OK" 241 send("BEGIN") 242 @state = :Authenticated 243 when "REJECT" 244 next_authenticator 245 @state = :WaitingForData 246 when "DATA", "ERROR" 247 send("CANCEL") 248 @state = :WaitingForReject 249 else 250 send("ERROR") 251 @state = :WaitingForOk 252 end 253 when :WaitingForReject 254 DBus.logger.debug ":WaitingForReject msg: #{msg[0].inspect}" 255 case msg[0] 256 when "REJECT" 257 next_authenticator 258 @state = :WaitingForOk 259 else 260 @socket.close 261 return false 262 end 263 end 264 true 265 end
send(meth, *args)
click to toggle source
Send an authentication method meth with arguments args to the server.
# File lib/dbus/auth.rb 149 def send(meth, *args) 150 o = ([meth] + args).join(" ") 151 @socket.write(o + "\r\n") 152 end