def execute(stdout, stdin, stderr, arguments = [])
@stdout = stdout
@stdin = stdin
@stderr = stderr
extract_command_and_parse_options(arguments)
if sufficient_options? && valid_command?
if command == "debug"
@command = "sign"
@options[:verbose] = true
end
case command
when "authorize"
begin
consumer = OAuth::Consumer.new \
options[:oauth_consumer_key],
options[:oauth_consumer_secret],
:access_token_url => options[:access_token_url],
:authorize_url => options[:authorize_url],
:request_token_url => options[:request_token_url],
:scheme => options[:scheme]
oauth_verifier = nil
request_token = consumer.get_request_token({ :oauth_callback => options[:oauth_callback] }, { :scope => options[:scope] })
if request_token.callback_confirmed?
stdout.puts "Server appears to support OAuth 1.0a; enabling support."
options[:version] = "1.0a"
end
stdout.puts "Please visit this url to authorize:"
stdout.puts request_token.authorize_url
if options[:version] == "1.0a"
stdout.puts "Please enter the verification code provided by the SP (oauth_verifier):"
oauth_verifier = stdin.gets.chomp
else
stdout.puts "Press return to continue..."
stdin.gets
end
begin
access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier)
stdout.puts "Response:"
access_token.params.each do |k,v|
stdout.puts " #{k}: #{v}" unless k.is_a?(Symbol)
end
rescue OAuth::Unauthorized => e
stderr.puts "A problem occurred while attempting to obtain an access token:"
stderr.puts e
stderr.puts e.request.body
end
rescue OAuth::Unauthorized => e
stderr.puts "A problem occurred while attempting to authorize:"
stderr.puts e
stderr.puts e.request.body
end
when "query"
consumer = OAuth::Consumer.new \
options[:oauth_consumer_key],
options[:oauth_consumer_secret],
:scheme => options[:scheme]
access_token = OAuth::AccessToken.new(consumer, options[:oauth_token], options[:oauth_token_secret])
response = access_token.request(options[:method].downcase.to_sym, options[:uri])
puts "#{response.code} #{response.message}"
puts response.body
when "sign"
parameters = prepare_parameters
request = OAuth::RequestProxy.proxy \
"method" => options[:method],
"uri" => options[:uri],
"parameters" => parameters
if verbose?
stdout.puts "OAuth parameters:"
request.oauth_parameters.each do |k,v|
stdout.puts " " + [k, v] * ": "
end
stdout.puts
if request.non_oauth_parameters.any?
stdout.puts "Parameters:"
request.non_oauth_parameters.each do |k,v|
stdout.puts " " + [k, v] * ": "
end
stdout.puts
end
end
request.sign! \
:consumer_secret => options[:oauth_consumer_secret],
:token_secret => options[:oauth_token_secret]
if verbose?
stdout.puts "Method: #{request.method}"
stdout.puts "URI: #{request.uri}"
stdout.puts "Normalized params: #{request.normalized_parameters}" unless options[:xmpp]
stdout.puts "Signature base string: #{request.signature_base_string}"
if options[:xmpp]
stdout.puts
stdout.puts "XMPP Stanza:"
stdout.puts "<oauth xmlns='urn:xmpp:oauth:0'>\n<oauth_consumer_key>\#{request.oauth_consumer_key}</oauth_consumer_key>\n<oauth_token>\#{request.oauth_token}</oauth_token>\n<oauth_signature_method>\#{request.oauth_signature_method}</oauth_signature_method>\n<oauth_signature>\#{request.oauth_signature}</oauth_signature>\n<oauth_timestamp>\#{request.oauth_timestamp}</oauth_timestamp>\n<oauth_nonce>\#{request.oauth_nonce}</oauth_nonce>\n<oauth_version>\#{request.oauth_version}</oauth_version>\n</oauth>\n"
stdout.puts
stdout.puts "Note: You may want to use bare JIDs in your URI."
stdout.puts
else
stdout.puts "OAuth Request URI: #{request.signed_uri}"
stdout.puts "Request URI: #{request.signed_uri(false)}"
stdout.puts "Authorization header: #{request.oauth_header(:realm => options[:realm])}"
end
stdout.puts "Signature: #{request.oauth_signature}"
stdout.puts "Escaped signature: #{OAuth::Helper.escape(request.oauth_signature)}"
else
stdout.puts request.oauth_signature
end
when "version"
puts "OAuth for Ruby #{OAuth::VERSION}"
end
else
usage
end
end