myexperiment-hackers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myexperiment-hackers] [2864] trunk/vendor/plugins: freezing oauth 0.2.4


From: noreply
Subject: [myexperiment-hackers] [2864] trunk/vendor/plugins: freezing oauth 0.2.4 into vendor/plugins
Date: Tue, 6 Dec 2011 05:46:59 -0500 (EST)

Revision
2864
Author
dgc
Date
2011-12-06 05:46:58 -0500 (Tue, 06 Dec 2011)

Log Message

freezing oauth 0.2.4 into vendor/plugins

Added Paths

Diff

Added: trunk/vendor/plugins/oauth/History.txt (0 => 2864)


--- trunk/vendor/plugins/oauth/History.txt	                        (rev 0)
+++ trunk/vendor/plugins/oauth/History.txt	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,17 @@
+== 0.2.2 2008-2-22 Lets actually support SSL release
+
+It didn't actually use https when required.
+
+== 0.2 2008-1-19 All together now release
+
+This is a big release, where we have merged the efforts of various parties into one common library. This means there are definitely some API changes you should be aware of. They should be minimal but please have a look at the unit tests.
+
+== 0.1.2 2007-12-1
+
+* 1 Fixed a problem where incoming request didn't check whether oauth parameters where missing. While not giving unauthorized access it did cause extra processing where not necessary.
+* 2 Includes Pat's fix for getting the realm out.
+
+== 0.1.1 2007-11-26
+
+* 1 First release as a GEM
+  * Moved all non rails functions into this GEM from the Rails plugin http://code.google.com/p/oauth-plugin/

Added: trunk/vendor/plugins/oauth/License.txt (0 => 2864)


--- trunk/vendor/plugins/oauth/License.txt	                        (rev 0)
+++ trunk/vendor/plugins/oauth/License.txt	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,20 @@
+Copyright (c) 2007 Blaine Cook, Larry Halff, Pelle Braendgaard
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/Manifest.txt (0 => 2864)


--- trunk/vendor/plugins/oauth/Manifest.txt	                        (rev 0)
+++ trunk/vendor/plugins/oauth/Manifest.txt	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,55 @@
+History.txt
+License.txt
+Manifest.txt
+README.txt
+Rakefile
+config/hoe.rb
+config/requirements.rb
+lib/oauth.rb
+lib/oauth/client.rb
+lib/oauth/client/action_controller_request.rb
+lib/oauth/client/helper.rb
+lib/oauth/client/net_http.rb
+lib/oauth/consumer.rb
+lib/oauth/helper.rb
+lib/oauth/request_proxy.rb
+lib/oauth/request_proxy/action_controller_request.rb
+lib/oauth/request_proxy/base.rb
+lib/oauth/request_proxy/net_http.rb
+lib/oauth/request_proxy/rack_request.rb
+lib/oauth/server.rb
+lib/oauth/signature.rb
+lib/oauth/signature/base.rb
+lib/oauth/signature/hmac/base.rb
+lib/oauth/signature/hmac/md5.rb
+lib/oauth/signature/hmac/rmd160.rb
+lib/oauth/signature/hmac/sha1.rb
+lib/oauth/signature/hmac/sha2.rb
+lib/oauth/signature/md5.rb
+lib/oauth/signature/plaintext.rb
+lib/oauth/signature/rsa/sha1.rb
+lib/oauth/signature/sha1.rb
+lib/oauth/token.rb
+lib/oauth/version.rb
+script/destroy
+script/generate
+script/txt2html
+setup.rb
+tasks/deployment.rake
+tasks/environment.rake
+tasks/website.rake
+test/test_action_controller_request_proxy.rb
+test/test_consumer.rb
+test/test_helper.rb
+test/test_hmac_sha1.rb
+test/test_net_http_client.rb
+test/test_net_http_request_proxy.rb
+test/test_rack_request_proxy.rb
+test/test_signature.rb
+test/test_signature_base.rb
+test/test_token.rb
+website/index.html
+website/index.txt
+website/_javascript_s/rounded_corners_lite.inc.js
+website/stylesheets/screen.css
+website/template.rhtml

Added: trunk/vendor/plugins/oauth/README.txt (0 => 2864)


--- trunk/vendor/plugins/oauth/README.txt	                        (rev 0)
+++ trunk/vendor/plugins/oauth/README.txt	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1 @@
+README
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/Rakefile (0 => 2864)


--- trunk/vendor/plugins/oauth/Rakefile	                        (rev 0)
+++ trunk/vendor/plugins/oauth/Rakefile	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,4 @@
+require 'config/requirements'
+require 'config/hoe' # setup Hoe + all gem configuration
+
+Dir['tasks/**/*.rake'].each { |rake| load rake }
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/config/hoe.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/config/hoe.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/config/hoe.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,71 @@
+require 'oauth/version'
+
+AUTHOR = ['Pelle Braendgaard','Blaine Cook','Larry Halff','Jesse Clark','Jon Crosby', 'Seth Fitzsimmons']  # can also be an array of Authors
+EMAIL = "address@hidden"
+DESCRIPTION = "OAuth Core Ruby implementation"
+GEM_NAME = 'oauth' # what ppl will type to install your gem
+RUBYFORGE_PROJECT = 'oauth' # The unix name for your project
+HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
+DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
+
address@hidden = "~/.rubyforge/user-config.yml"
address@hidden = nil
+RUBYFORGE_USERNAME = "unknown"
+def rubyforge_username
+  unless @config
+    begin
+      @config = YAML.load(File.read(File.expand_path(@config_file)))
+    rescue
+      puts <<-EOS
+ERROR: No rubyforge config file found: address@hidden
+Run 'rubyforge setup' to prepare your env for access to Rubyforge
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
+      EOS
+      exit
+    end
+  end
+  RUBYFORGE_USERNAME.replace @config["username"]
+end
+
+
+REV = nil 
+# UNCOMMENT IF REQUIRED: 
+# REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
+VERS = Oauth::VERSION::STRING + (REV ? ".#{REV}" : "")
+RDOC_OPTS = ['--quiet', '--title', 'oauth documentation',
+    "--opname", "index.html",
+    "--line-numbers", 
+    "--main", "README",
+    "--inline-source"]
+
+class Hoe
+  def extra_deps 
+    @extra_deps.reject! { |x| Array(x).first == 'hoe' } 
+    @extra_deps
+  end 
+end
+
+# Generate all the Rake tasks
+# Run 'rake -T' to see list of generated tasks (from gem root directory)
+hoe = Hoe.new(GEM_NAME, VERS) do |p|
+  p.author = AUTHOR 
+  p.description = DESCRIPTION
+  p.email = EMAIL
+  p.summary = DESCRIPTION
+  p.url = ""
+  p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
+  p.test_globs = ["test/**/test_*.rb"]
+  p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store']  #An array of file patterns to delete on clean.
+  
+  # == Optional
+  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
+  p.extra_deps = [['ruby-hmac','>= 0.3.1'] ]    # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
+  
+  #p.spec_extras = {}    # A hash of extra values to set in the gemspec.
+  
+end
+
+CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
+PATH    = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
+hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
+hoe.rsync_args = '-av --delete --ignore-errors'
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/config/requirements.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/config/requirements.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/config/requirements.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,17 @@
+require 'fileutils'
+include FileUtils
+
+require 'rubygems'
+%w[rake hoe newgem rubigen].each do |req_gem|
+  begin
+    require req_gem
+  rescue LoadError
+    puts "This Rakefile requires the '#{req_gem}' RubyGem."
+    puts "Installation: gem install #{req_gem} -y"
+    exit
+  end
+end
+
+$:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
+
+require 'oauth'
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/lib/oauth/client/action_controller_request.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/client/action_controller_request.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/client/action_controller_request.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,52 @@
+require 'oauth/client/helper'
+require 'oauth/request_proxy/action_controller_request'
+require 'action_controller/test_process'
+
+module ActionController
+  class Base
+    def process_with_oauth(request,response=nil)
+      request.apply_oauth!
+      process_without_oauth(request,response)
+    end
+
+    alias_method_chain :process, :oauth
+  end
+
+  class TestRequest
+    def self.use_oauth=(bool)
+      @use_oauth = bool
+    end
+
+    def self.use_oauth?
+      @use_oauth 
+    end
+
+    def configure_oauth(consumer = nil, token = nil, options = {})
+      @oauth_options = { :consumer => consumer,
+                   :token => token,
+                   :scheme => 'header',
+                   :signature_method => nil,
+                   :nonce => nil,
+                   :timestamp => nil }.merge(options)
+    end
+
+    def apply_oauth!
+      return unless ActionController::TestRequest.use_oauth? && @oauth_options
+      @oauth_helper = OAuth::Client::Helper.new(self, @oauth_options.merge( { :request_uri => request_uri } ))
+
+      self.send("address@hidden:scheme]}")
+    end
+
+    def set_oauth_header
+      env['Authorization'] = @oauth_helper.header
+    end
+
+    def set_oauth_parameters
+      @query_parameters = @oauth_helper.parameters_with_oauth
+      @query_parameters.merge!( { :oauth_signature => @oauth_helper.signature } )
+    end
+    
+    def set_oauth_query_string
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/client/helper.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/client/helper.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/client/helper.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,74 @@
+require 'oauth/client'
+require 'oauth/consumer'
+require 'oauth/helper'
+require 'oauth/token'
+require 'oauth/signature/hmac/sha1'
+
+module OAuth::Client
+  class Helper
+    include OAuth::Helper
+    
+    def initialize(request, options = {})
+      @request = request
+      @options = options
+      @options[:signature_method] ||= 'HMAC-SHA1'
+    end
+
+    def options
+      @options
+    end
+
+    def nonce
+      options[:nonce] ||= generate_key
+    end
+
+    def timestamp
+      options[:timestamp] ||= generate_timestamp
+    end
+
+    def generate_timestamp
+      Time.now.to_i.to_s
+    end
+
+    def oauth_parameters
+      {
+        'oauth_consumer_key'     => options[:consumer].key,
+        'oauth_token'            => options[:token] ? options[:token].token : '',
+        'oauth_signature_method' => options[:signature_method],
+        'oauth_timestamp'        => timestamp,
+        'oauth_nonce'            => nonce,
+        'oauth_version'          => '1.0'
+      }
+    end
+
+    def signature(extra_options = {})
+      OAuth::Signature.sign(@request, { :uri      => options[:request_uri],
+                                                    :consumer => options[:consumer],
+                                                    :token    => options[:token] }.merge(extra_options) )
+    end
+
+    def signature_base_string(extra_options = {})
+      OAuth::Signature.signature_base_string(@request, { :uri      => options[:request_uri],
+                                                    :consumer => options[:consumer],
+                                                    :token    => options[:token],
+                                                    :parameters => oauth_parameters}.merge(extra_options) )
+    end
+
+    def header
+      parameters = oauth_parameters
+      parameters.merge!( { 'oauth_signature' => signature( { :parameters => parameters } ) } )
+
+      header_params_str = parameters.map { |k,v| "#{k}=\"#{escape(v)}\"" }.join(', ')
+
+      return "OAuth realm=\"#{options[:realm]||''}\", #{header_params_str}"
+    end
+
+    def parameters
+      OAuth::RequestProxy.proxy(@request).parameters
+    end
+
+    def parameters_with_oauth
+      oauth_parameters.merge( parameters )
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/client/net_http.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/client/net_http.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/client/net_http.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,74 @@
+require 'oauth/client/helper'
+require 'oauth/request_proxy/net_http'
+
+class Net::HTTPRequest
+  include OAuth::Helper
+
+  def oauth!(http, consumer = nil, token = nil, options = {})
+    options = { :request_uri => oauth_full_request_uri(http),
+                :consumer => consumer,
+                :token => token,
+                :scheme => 'header',
+                :signature_method => nil,
+                :nonce => nil,
+                :timestamp => nil }.merge(options)
+
+    @oauth_helper = OAuth::Client::Helper.new(self, options)
+    self.send("set_oauth_#{options[:scheme]}")
+  end
+
+  def signature_base_string(http, consumer = nil, token = nil, options = {})
+    options = { :request_uri => oauth_full_request_uri(http),
+                :consumer => consumer,
+                :token => token,
+                :scheme => 'header',
+                :signature_method => nil,
+                :nonce => nil,
+                :timestamp => nil }.merge(options)
+
+    OAuth::Client::Helper.new(self, options).signature_base_string
+  end
+  
+  def oauth_helper
+    @oauth_helper
+  end
+  private
+
+  def oauth_full_request_uri(http)
+    uri = URI.parse(self.path)
+    uri.host = http.address
+    uri.port = http.port
+    if http.respond_to?(:use_ssl?)
+      uri.scheme = http.use_ssl? ? 'https' : 'http'
+    end
+    uri.to_s
+  end
+
+  def set_oauth_header
+    self['Authorization'] = @oauth_helper.header
+  end
+
+  # FIXME: if you're using a POST body and query string parameters, using this
+  # method will convert those parameters on the query string into parameters in
+  # the body. this is broken, and should be fixed.
+  def set_oauth_body
+    self.set_form_data(@oauth_helper.parameters_with_oauth)
+    params_with_sig = @oauth_helper.parameters.merge(:oauth_signature => @oauth_helper.signature)
+    self.set_form_data(params_with_sig)
+  end
+
+  def set_oauth_query_string
+    oauth_params_str = @oauth_helper.oauth_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
+
+    uri = URI.parse(path)
+    if !uri.query || uri.query == ''
+      uri.query = oauth_params_str
+    else
+      uri.query = uri.query + "&" + oauth_params_str
+    end
+
+    @path = uri.to_s
+
+    @path << "&oauth_signature=#{escape(@oauth_helper.signature)}"
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/client.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/client.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/client.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,4 @@
+module OAuth
+  module Client
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/consumer.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/consumer.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/consumer.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,208 @@
+require 'net/http'
+require 'net/https'
+require 'oauth/client/net_http'
+module OAuth
+  class Consumer
+    
+    @@default_options={
+      # Signature method used by server. Defaults to HMAC-SHA1
+      :oauth_signature_method=>'HMAC-SHA1',
+      
+      # default paths on site. These are the same as the defaults set up by the generators
+      :request_token_path=>'/oauth/request_token',
+      :authorize_path=>'/oauth/authorize',
+      :access_token_path=>'/oauth/access_token',
+      
+      # How do we send the oauth values to the server see 
+      # http://oauth.net/core/1.0/#consumer_req_param for more info
+      #
+      # Possible values:
+      #
+      #   :header - via the Authorize header (Default) ( option 1. in spec)
+      #   :body - url form encoded in body of POST request ( option 2. in spec)
+      #   :query_string - via the query part of the url ( option 3. in spec)
+      :scheme=>:header, 
+      
+      # Default http method used for OAuth Token Requests (defaults to :post)
+      :http_method=>:post, 
+      
+      :oauth_version=>"1.0"
+    }
+    
+    attr_accessor :site,:options, :key, :secret,:http
+    
+    
+    # Create a new consumer instance by passing it a configuration hash:
+    #
+    #   @consumer=OAuth::Consumer.new( key,secret,{
+    #     :site=>"http://term.ie",
+    #     :scheme=>:header,
+    #     :http_method=>:post,
+    #     :request_token_path=>"/oauth/example/request_token.php",
+    #     :access_token_path=>"/oauth/example/access_token.php",
+    #     :authorize_path=>"/oauth/example/authorize.php"
+    #    })
+    #
+    # Start the process by requesting a token
+    #
+    #   @address@hidden
+    #   session[:address@hidden
+    #   redirect_to @request_token.authorize_url
+    #
+    # When user returns create an access_token
+    #
+    #   @address@hidden
+    #   @address@hidden('/photos.xml')
+    #
+    #
+    
+    def initialize(consumer_key,consumer_secret,options={})
+      # ensure that keys are symbols
+      @options=@@default_options.merge( options.inject({}) do |options, (key, value)|
+        options[key.to_sym] = value
+        options
+      end)
+      @key = consumer_key
+      @secret = consumer_secret
+    end
+    
+    # The default http method
+    def http_method
+      @http_method||address@hidden:http_method]||:post
+    end
+    
+    # The HTTP object for the site. The HTTP Object is what you get when you do Net::HTTP.new
+    def http
+      @http ||= create_http
+    end
+    
+    # Contains the root URI for this site
+    def uri(url=""
+      @uri||=URI.parse(url||site)
+    end
+    
+    # Makes a request to the service for a new OAuth::RequestToken
+    #   
+    #  @address@hidden
+    #
+    def get_request_token
+      response=token_request(http_method,request_token_path)
+      OAuth::RequestToken.new(self,response[:oauth_token],response[:oauth_token_secret])
+    end
+    
+    # Creates, signs and performs an http request.
+    # It's recommended to use the OAuth::Token classes to set this up correctly.
+    # The arguments parameters are a hash or string encoded set of parameters if it's a post request as well as optional http headers.
+    # 
+    #   @consumer.request(:get,'/people',@token,{:scheme=>:query_string})
+    #   @consumer.request(:post,'/people',@token,{},@person.to_xml,{ 'Content-Type' => 'application/xml' })
+    #
+    def request(http_method,path, token=nil,request_options={},*arguments)
+      http.request(create_signed_request(http_method,path,token,request_options,*arguments))
+    end
+    
+    # Creates and signs an http request.
+    # It's recommended to use the Token classes to set this up correctly
+    def create_signed_request(http_method,path, token=nil,request_options={},*arguments)
+      request=create_http_request(http_method,path,*arguments)
+      sign!(request,token,request_options)
+      request
+    end
+    
+    # Creates a request and parses the result as url_encoded. This is used internally for the RequestToken and AccessToken requests.
+    def token_request(http_method,path,token=nil,request_options={},*arguments)
+      response=request(http_method,path,token,request_options,*arguments)
+      if response.code=="200"
+        CGI.parse(response.body).inject({}){|h,(k,v)| h[k.to_sym]=v.first;h}
+      else 
+        response.error! 
+      end
+    end
+
+    # Sign the Request object. Use this if you have an externally generated http request object you want to sign.
+    def sign!(request,token=nil, request_options = {})
+      request.oauth!(http,self,token,{:scheme=>scheme}.merge(request_options))
+    end
+    
+    # Return the signature_base_string
+    def signature_base_string(request,token=nil, request_options = {})
+      request.signature_base_string(http,self,token,{:scheme=>scheme}.merge(request_options))
+    end
+
+    def site
+      @options[:site]
+    end
+
+    def scheme
+      @options[:scheme]
+    end
+    
+    def request_token_path
+      @options[:request_token_path]
+    end
+    
+    def authorize_path
+      @options[:authorize_path]
+    end
+    
+    def access_token_path
+      @options[:access_token_path]
+    end
+    
+    # TODO this is ugly, rewrite
+    def request_token_url
+      @options[:request_token_url]||site+request_token_path
+    end
+
+    def authorize_url
+      @options[:authorize_url]||site+authorize_path
+    end
+
+    def access_token_url
+      @options[:access_token_url]||site+access_token_path
+    end
+
+    protected
+    
+    #Instantiates the http object
+    def create_http
+      http_object=Net::HTTP.new(uri.host, uri.port)
+      http_object.use_ssl = true if uri.scheme=="https"
+      http_object
+    end
+    
+    # create the http request object for a given http_method and path
+    def create_http_request(http_method,path,*arguments)
+      http_method=http_method.to_sym
+      if [:post,:put].include?(http_method)
+        data=""
+      end
+      headers=(arguments.first.is_a?(Hash) ? arguments.shift : {})
+      case http_method
+      when :post
+        request=Net::HTTP::Post.new(path,headers)
+        request["Content-Length"]=0 # Default to 0
+      when :put
+        request=Net::HTTP::Put.new(path,headers)
+        request["Content-Length"]=0 # Default to 0
+      when :get
+        request=Net::HTTP::Get.new(path,headers)
+      when :delete
+        request=Net::HTTP::Delete.new(path,headers)
+      when :head
+        request=Net::HTTP::Head.new(path,headers)
+      else
+        raise ArgumentError, "Don't know how to handle http_method: :#{http_method.to_s}"
+      end
+      if data.is_a?(Hash)
+        request.set_form_data(data)
+      elsif data
+        request.body=data.to_s
+        request["Content-Length"]=request.body.length
+      end
+      request
+    end
+    
+    
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/helper.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/helper.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/helper.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,14 @@
+require 'openssl'
+require 'base64'
+module OAuth
+  module Helper
+    def escape(value)
+      CGI.escape(value.to_s).gsub("%7E", '~').gsub("+", "%20")
+    end
+    
+    def generate_key(size=32)
+      Base64.encode64(OpenSSL::Random.random_bytes(size)).gsub(/\W/,'')
+    end    
+    
+  end
+end
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/lib/oauth/request_proxy/action_controller_request.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/request_proxy/action_controller_request.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/request_proxy/action_controller_request.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,43 @@
+require 'rubygems'
+require 'active_support'
+require 'action_controller/request'
+require 'rack/auth/abstract/request.rb'
+require 'oauth/request_proxy/base'
+require 'uri'
+
+module OAuth::RequestProxy
+  class ActionControllerRequest < OAuth::RequestProxy::Base
+    proxies ActionController::AbstractRequest
+
+    def method
+      request.method.to_s.upcase
+    end
+
+    def uri
+      uri = URI.parse(request.protocol + request.host + request.port_string + request.path)
+      uri.query = nil
+      uri.to_s
+    end
+
+    def parameters
+      if options[:clobber_request]
+        options[:parameters] || {}
+      else
+        params = request_params.merge(query_params).merge(header_params)
+        params.stringify_keys! if params.respond_to?(:stringify_keys!)
+        params.merge(options[:parameters] || {})
+      end
+    end
+
+    protected
+
+    def query_params
+      request.query_parameters
+    end
+
+    def request_params
+      request.request_parameters
+    end
+
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/request_proxy/base.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/request_proxy/base.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/request_proxy/base.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,76 @@
+require 'oauth/request_proxy'
+
+module OAuth::RequestProxy
+  class Base
+    def self.proxies(klass)
+      OAuth::RequestProxy.available_proxies[klass] = self
+    end
+
+    attr_accessor :request, :options
+
+    def initialize(request, options = {})
+      @request = request
+      @options = options
+    end
+
+    def token
+      parameters['oauth_token']
+    end
+
+    def consumer_key
+      parameters['oauth_consumer_key']
+    end
+
+    def parameters_for_signature
+      p = parameters.dup
+      p.delete("oauth_signature")
+      p
+    end
+
+    def nonce
+      parameters['oauth_nonce']
+    end
+
+    def timestamp
+      parameters['oauth_timestamp']
+    end
+
+    def signature_method
+      case parameters['oauth_signature_method']
+      when Array: parameters['oauth_signature_method'].first
+      else
+        parameters['oauth_signature_method']
+      end
+    end
+
+    def signature
+      parameters['oauth_signature'] || ""
+    end
+    
+    protected
+    
+    def header_params
+      %w( X-HTTP_AUTHORIZATION Authorization HTTP_AUTHORIZATION ).each do |header|
+        next unless request.env.include?(header)
+
+        header = request.env[header]
+        next unless header[0,6] == 'OAuth '
+
+        oauth_param_string = header[6,header.length].split(/[,=]/)
+        oauth_param_string.map! { |v| unescape(v.strip) }
+        oauth_param_string.map! { |v| v =~ /^\".*\"$/ ? v[1..-2] : v }
+        oauth_params = Hash[*oauth_param_string.flatten]
+        oauth_params.reject! { |k,v| k !~ /^oauth_/ }
+
+        return oauth_params
+      end
+
+      return {}
+    end
+    
+    def unescape(value)
+      URI.unescape(value.gsub('+', '%2B'))
+    end
+    
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/request_proxy/net_http.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/request_proxy/net_http.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/request_proxy/net_http.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,64 @@
+require 'oauth/request_proxy/base'
+require 'net/http'
+require 'uri'
+require 'cgi'
+
+module OAuth::RequestProxy::Net
+  module HTTP
+    class HTTPRequest < OAuth::RequestProxy::Base
+      proxies ::Net::HTTPRequest
+
+      def method
+        request.method
+      end
+
+      def uri
+        uri = options[:uri]
+        uri = URI.parse(uri) unless uri.kind_of?(URI)
+        uri.query = nil
+        uri.to_s
+      end
+
+      def parameters
+        if options[:clobber_request]
+          options[:parameters]
+        else
+          all_parameters
+        end
+      end
+
+      private
+
+      def all_parameters
+        request_params = CGI.parse(query_string)
+        if options[:parameters]
+          options[:parameters].each do |k,v|
+            if request_params.has_key?(k)
+              request_params[k] << v
+            else
+              request_params[k] = [v].flatten
+            end
+          end
+        end
+        request_params
+      end
+
+      def query_string
+        [ query_params, post_params, auth_header_params ].compact.join('&')
+      end
+      
+      def query_params
+        URI.parse(request.path).query
+      end
+
+      def post_params
+        request.body
+      end
+
+      def auth_header_params
+        return nil unless request['Authorization'] && request['Authorization'][0,5] == 'OAuth'
+        auth_params = request['Authorization']
+      end
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/request_proxy/rack_request.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/request_proxy/rack_request.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/request_proxy/rack_request.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,42 @@
+require 'oauth/request_proxy/base'
+require 'uri'
+require 'rack'
+
+module OAuth::RequestProxy
+  class RackRequest < OAuth::RequestProxy::Base
+    proxies Rack::Request
+    
+    def method
+      request.request_method
+    end
+    
+    def uri
+      uri = URI.parse(request.url)
+      uri.query = nil
+      uri.to_s
+    end
+
+    def parameters
+      if options[:clobber_request]
+        options[:parameters] || {}
+      else
+        params = request_params.merge(query_params).merge(header_params)
+        params.merge(options[:parameters] || {})
+      end
+    end
+    
+    def signature
+      parameters['oauth_signature']
+    end
+    
+    protected
+
+    def query_params
+      request.GET
+    end
+
+    def request_params
+      request.params
+    end
+  end
+end
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/lib/oauth/request_proxy.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/request_proxy.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/request_proxy.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,24 @@
+module OAuth
+  module RequestProxy
+    def self.available_proxies #:nodoc:
+      @available_proxies ||= {}
+    end
+
+    def self.proxy(request, options = {})
+      return request if request.kind_of?(OAuth::RequestProxy::Base)
+
+      klass = available_proxies[request.class]
+
+      # Search for possible superclass matches.
+      if klass.nil?
+        request_parent = available_proxies.keys.find { |rc| request.kind_of?(rc) }
+        klass = available_proxies[request_parent]
+      end
+
+      raise UnknownRequestType, request.class.to_s unless klass
+      klass.new(request, options)
+    end
+
+    class UnknownRequestType < Exception; end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/server.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/server.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/server.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,68 @@
+require 'oauth/helper'
+require 'oauth/consumer'
+module OAuth
+  # This is mainly used to create consumer credentials and can pretty much be ignored if you want to create your own
+  class Server
+    include OAuth::Helper
+    attr_accessor :base_url
+    
+    @@server_paths={
+      :request_token_path=>"/oauth/request_token",
+      :authorize_path=>"/oauth/authorize",
+      :access_token_path=>"/oauth/access_token"
+    }
+    # Create a new server instance
+    def initialize(base_url,paths={})
+      @base_url=base_url
+      @paths=@@server_paths.merge(paths)
+    end
+        
+    def generate_credentials()
+      [generate_key(16),generate_key]
+    end
+    
+    def generate_consumer_credentials(params={})
+      Consumer.new( *generate_credentials)
+    end
+
+    # mainly for testing purposes
+    def create_consumer
+      credentials=generate_credentials
+      Consumer.new( 
+        credentials[0],
+        credentials[1],
+        {
+          :site=>base_url,
+          :request_token_path=>request_token_path,
+          :authorize_path=>authorize_path,
+          :access_token_path=>access_token_path
+      })
+    end
+        
+    def request_token_path
+      @paths[:request_token_path]
+    end
+    
+    def request_token_url
+      base_url+request_token_path
+    end
+    
+    def authorize_path
+      @paths[:authorize_path]
+    end
+    
+    def authorize_url
+      base_url+authorize_path
+    end
+    
+    def access_token_path
+      @paths[:access_token_path]
+    end
+
+    def access_token_url
+      base_url+access_token_path
+    end
+    
+    
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/base.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/base.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/base.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,73 @@
+require 'oauth/signature'
+require 'oauth/helper'
+require 'oauth/request_proxy/base'
+require 'base64'
+
+module OAuth::Signature
+  class Base
+    include OAuth::Helper
+    
+    def self.implements(signature_method)
+      OAuth::Signature.available_methods[signature_method] = self
+    end
+
+    def self.digest_class(digest_class = nil)
+      return @digest_class if digest_class.nil?
+      @digest_class = digest_class
+    end
+
+    attr_reader :token_secret, :consumer_secret, :request
+
+    def initialize(request, options = {}, &block)
+      raise TypeError unless request.kind_of?(OAuth::RequestProxy::Base)
+      @request = request
+      if block_given?
+        @token_secret, @consumer_secret = yield block.arity == 1 ? token : [token, consumer_key,nonce,request.timestamp]
+      else
+        @consumer_secret = options[:consumer].secret
+        @token_secret = options[:token] ? options[:token].secret : ''
+      end
+    end
+
+    def signature
+      Base64.encode64(digest).chomp
+    end
+
+    def ==(cmp_signature)
+      Base64.decode64(signature) == Base64.decode64(cmp_signature)
+    end
+
+    def verify
+      self == self.request.signature
+    end
+
+    def signature_base_string
+      normalized_params = request.parameters_for_signature.sort.map { |k,v| [escape(k), escape(v)] * "=" }.join("&")
+      base = [request.method, request.uri, normalized_params]
+      sbs = base.map { |v| escape(v) }.join("&")
+    end
+
+    private
+
+    def token
+      request.token
+    end
+    
+    def consumer_key
+      request.consumer_key
+    end
+    
+    def nonce
+      request.nonce
+    end
+
+    def secret
+      "#{escape(consumer_secret)}&#{escape(token_secret)}"
+    end
+
+    def digest
+      self.class.digest_class.digest(signature_base_string)
+    end
+
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/base.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/base.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/base.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,12 @@
+require 'oauth/signature/base'
+
+module OAuth::Signature::HMAC
+  class Base < OAuth::Signature::Base
+
+    private
+
+    def digest
+      self.class.digest_class.digest(secret, signature_base_string)
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/md5.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/md5.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/md5.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,9 @@
+require 'oauth/signature/hmac/base'
+require 'hmac-md5'
+
+module OAuth::Signature::HMAC
+  class MD5 < Base
+    implements 'hmac-md5'
+    digest_class ::HMAC::MD5
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/rmd160.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/rmd160.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/rmd160.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,9 @@
+require 'oauth/signature/hmac/base'
+require 'hmac-rmd160'
+
+module OAuth::Signature::HMAC
+  class RMD160 < Base
+    implements 'hmac-rmd160'
+    digest_class ::HMAC::RMD160
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/sha1.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/sha1.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/sha1.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,10 @@
+require 'oauth/signature/hmac/base'
+require 'rubygems'
+require 'hmac-sha1'
+
+module OAuth::Signature::HMAC
+  class SHA1 < Base
+    implements 'hmac-sha1'
+    digest_class ::HMAC::SHA1
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/sha2.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/sha2.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/hmac/sha2.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,9 @@
+require 'oauth/signature/hmac/base'
+require 'hmac-sha2'
+
+module OAuth::Signature::HMAC
+  class SHA2 < Base
+    implements 'hmac-sha2'
+    digest_class ::HMAC::SHA2
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/md5.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/md5.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/md5.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,13 @@
+require 'oauth/signature/base'
+require 'digest/md5'
+
+module OAuth::Signature
+  class MD5 < Base
+    implements 'md5'
+    digest_class Digest::MD5
+
+    def signature_base_string
+      secret + super
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/plaintext.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/plaintext.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/plaintext.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,19 @@
+require 'oauth/signature/base'
+
+module OAuth::Signature
+  class PLAINTEXT < Base
+    implements 'plaintext'
+
+    def signature
+      signature_base_string
+    end
+
+    def ==(cmp_signature)
+      signature == cmp_signature
+    end
+
+    def signature_base_string
+      secret
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/rsa/sha1.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/rsa/sha1.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/rsa/sha1.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,20 @@
+require 'oauth/signature/base'
+require 'openssl'
+
+module OAuth::Signature::RSA
+  class SHA1 < OAuth::Signature::Base
+    implements 'rsa-sha1'
+
+    def ==(cmp_signature)
+      public_key = OpenSSL::PKey::RSA.new(request.consumer.secret)
+      public_key.verify(OpenSSL::Digest::SHA1.new, cmp_signature, signature_base_string)
+    end
+
+    private
+
+    def digest
+      private_key = OpenSSL::PKey::RSA.new(request.consumer.secret)
+      private_key.sign(OpenSSL::Digest::SHA1.new, signature_base_string)
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature/sha1.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature/sha1.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature/sha1.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,13 @@
+require 'oauth/signature/base'
+require 'digest/sha1'
+
+module OAuth::Signature
+  class SHA1 < Base
+    implements 'sha1'
+    digest_class Digest::SHA1
+
+    def signature_base_string
+      secret + super
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/signature.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/signature.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/signature.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,28 @@
+module OAuth
+  module Signature
+    def self.available_methods
+      @available_methods ||= {}
+    end
+
+    def self.build(request, options = {}, &block)
+      request = OAuth::RequestProxy.proxy(request, options)
+      klass = available_methods[(request.signature_method || "").downcase]
+      raise UnknownSignatureMethod, request.signature_method unless klass
+      klass.new(request, options, &block)
+    end
+
+    def self.sign(request, options = {}, &block)
+      self.build(request, options, &block).signature
+    end
+
+    def self.verify(request, options = {}, &block)
+      self.build(request, options, &block).verify
+    end
+
+    def self.signature_base_string(request, options = {}, &block)
+      self.build(request, options, &block).signature_base_string
+    end
+
+    class UnknownSignatureMethod < Exception; end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/token.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/token.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/token.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,123 @@
+require 'oauth/helper'
+module OAuth
+  
+  # Superclass for the various tokens used by OAuth
+  
+  class Token
+    include OAuth::Helper
+    
+    attr_accessor :token, :secret
+
+    def initialize(token, secret)
+      @token = token
+      @secret = secret
+    end
+    
+    def to_query
+      "oauth_token=#{escape(token)}&oauth_secret=#{escape(secret)}"
+    end
+    
+  end
+  
+  # Used on the server for generating tokens
+  class ServerToken<Token
+    
+    def initialize
+      super generate_key(16),generate_key
+    end
+  end
+  # Superclass for tokens used by OAuth Clients
+  class ConsumerToken<Token
+    attr_accessor :consumer
+
+    def initialize(consumer,token,secret)
+      super token,secret
+      @consumer=consumer
+    end
+    
+    # Make a signed request using given http_method to the path
+    #
+    #   @token.request(:get,'/people')
+    #   @token.request(:post,'/people',@person.to_xml,{ 'Content-Type' => 'application/xml' })
+    #
+    def request(http_method,path,*arguments)
+      response=consumer.request(http_method,path,self,{},*arguments)
+    end
+    
+    # Sign a request generated elsewhere using Net:HTTP::Post.new or friends
+    def sign!(request,options = {})
+      consumer.sign!(request,self,options)
+    end
+    
+  end
+
+  # The RequestToken is used for the initial Request.
+  # This is normally created by the Consumer object.
+  class RequestToken<ConsumerToken
+    
+    # Returns the authorization url that you need to use for redirecting the user
+    def authorize_url
+      consumer.authorize_url+"?oauth_token="+CGI.escape(token)
+    end
+    
+    # exchange for AccessToken on server
+    def get_access_token(options={})
+      response=consumer.token_request(consumer.http_method,consumer.access_token_path,self,options)
+      OAuth::AccessToken.new(consumer,response[:oauth_token],response[:oauth_token_secret])
+    end
+  end
+  
+  # The Access Token is used for the actual "real" web service calls thatyou perform against the server
+  class AccessToken<ConsumerToken
+    
+    # Make a regular get request using AccessToken
+    #
+    #   @address@hidden('/people')
+    #   @address@hidden('/people',{'Accept'=>'application/xml'})
+    #
+    def get(path,headers={})
+      request(:get,path,headers)
+    end
+    
+    # Make a regular head request using AccessToken
+    #
+    #   @address@hidden('/people')
+    #
+    def head(path,headers={})
+      request(:head,path,headers)
+    end
+
+    # Make a regular post request using AccessToken
+    #
+    #   @address@hidden('/people')
+    #   @address@hidden('/people',{:name=>'Bob',:email=>'address@hidden'})
+    #   @address@hidden('/people',{:name=>'Bob',:email=>'address@hidden'},{'Accept'=>'application/xml'})
+    #   @address@hidden('/people',nil,{'Accept'=>'application/xml'})
+    #   @address@hidden('/people',@person.to_xml,{'Accept'=>'application/xml','Content-Type' => 'application/xml'})
+    #
+    def post(path, body = '',headers={})
+      request(:post,path,body,headers)
+    end
+
+    # Make a regular put request using AccessToken
+    #
+    #   @address@hidden('/people/123')
+    #   @address@hidden('/people/123',{:name=>'Bob',:email=>'address@hidden'})
+    #   @address@hidden('/people/123',{:name=>'Bob',:email=>'address@hidden'},{'Accept'=>'application/xml'})
+    #   @address@hidden('/people/123',nil,{'Accept'=>'application/xml'})
+    #   @address@hidden('/people/123',@person.to_xml,{'Accept'=>'application/xml','Content-Type' => 'application/xml'})
+    #
+    def put(path, body = '', headers={})
+      request(:put,path,body,headers)
+    end
+    
+    # Make a regular delete request using AccessToken
+    #
+    #   @address@hidden('/people/123')
+    #   @address@hidden('/people/123',{'Accept'=>'application/xml'})
+    #
+    def delete(path,headers={})
+      request(:delete,path,headers)
+    end
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth/version.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth/version.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth/version.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,9 @@
+module Oauth #:nodoc:
+  module VERSION #:nodoc:
+    MAJOR = 0
+    MINOR = 2
+    TINY  = 4
+
+    STRING = [MAJOR, MINOR, TINY].join('.')
+  end
+end

Added: trunk/vendor/plugins/oauth/lib/oauth.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/lib/oauth.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/lib/oauth.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,3 @@
+$:.unshift File.dirname(__FILE__)
+
+module OAuth; end

Added: trunk/vendor/plugins/oauth/script/destroy (0 => 2864)


--- trunk/vendor/plugins/oauth/script/destroy	                        (rev 0)
+++ trunk/vendor/plugins/oauth/script/destroy	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+APP_ROOT = File.join(File.dirname(__FILE__), '..')
+
+begin
+  require 'rubigen'
+rescue LoadError
+  require 'rubygems'
+  require 'rubigen'
+end
+require 'rubigen/scripts/destroy'
+
+ARGV.shift if ['--help', '-h'].include?(ARGV[0])
+RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
+RubiGen::Scripts::Destroy.new.run(ARGV)
Property changes on: trunk/vendor/plugins/oauth/script/destroy
___________________________________________________________________

Added: svn:executable

Added: trunk/vendor/plugins/oauth/script/generate (0 => 2864)


--- trunk/vendor/plugins/oauth/script/generate	                        (rev 0)
+++ trunk/vendor/plugins/oauth/script/generate	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,14 @@
+#!/usr/bin/env ruby
+APP_ROOT = File.join(File.dirname(__FILE__), '..')
+
+begin
+  require 'rubigen'
+rescue LoadError
+  require 'rubygems'
+  require 'rubigen'
+end
+require 'rubigen/scripts/generate'
+
+ARGV.shift if ['--help', '-h'].include?(ARGV[0])
+RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
+RubiGen::Scripts::Generate.new.run(ARGV)
Property changes on: trunk/vendor/plugins/oauth/script/generate
___________________________________________________________________

Added: svn:executable

Added: trunk/vendor/plugins/oauth/script/txt2html (0 => 2864)


--- trunk/vendor/plugins/oauth/script/txt2html	                        (rev 0)
+++ trunk/vendor/plugins/oauth/script/txt2html	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,74 @@
+#!/usr/bin/env ruby
+
+require 'rubygems'
+begin
+  require 'newgem'
+rescue LoadError
+  puts "\n\nGenerating the website requires the newgem RubyGem"
+  puts "Install: gem install newgem\n\n"
+  exit(1)
+end
+require 'redcloth'
+require 'syntax/convertors/html'
+require 'erb'
+require File.dirname(__FILE__) + '/../lib/oauth/version.rb'
+
+version  = Oauth::VERSION::STRING
+download = 'http://rubyforge.org/projects/oauth'
+
+class Fixnum
+  def ordinal
+    # teens
+    return 'th' if (10..19).include?(self % 100)
+    # others
+    case self % 10
+    when 1: return 'st'
+    when 2: return 'nd'
+    when 3: return 'rd'
+    else    return 'th'
+    end
+  end
+end
+
+class Time
+  def pretty
+    return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
+  end
+end
+
+def convert_syntax(syntax, source)
+  return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
+end
+
+if ARGV.length >= 1
+  src, template = ARGV
+  template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml')
+  
+else
+  puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
+  exit!
+end
+
+template = ERB.new(File.open(template).read)
+
+title = nil
+body = nil
+File.open(src) do |fsrc|
+  title_text = fsrc.readline
+  body_text = fsrc.read
+  syntax_items = []
+  body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
+    ident = syntax_items.length
+    element, syntax, source = $1, $2, $3
+    syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
+    "syntax-temp-#{ident}"
+  }
+  title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
+  body = RedCloth.new(body_text).to_html
+  body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
+end
+stat = File.stat(src)
+created = stat.ctime
+modified = stat.mtime
+
+$stdout << template.result(binding)
Property changes on: trunk/vendor/plugins/oauth/script/txt2html
___________________________________________________________________

Added: svn:executable

Added: trunk/vendor/plugins/oauth/setup.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/setup.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/setup.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,1585 @@
+#
+# setup.rb
+#
+# Copyright (c) 2000-2005 Minero Aoki
+#
+# This program is free software.
+# You can distribute/modify this program under the terms of
+# the GNU LGPL, Lesser General Public License version 2.1.
+#
+
+unless Enumerable.method_defined?(:map)   # Ruby 1.4.6
+  module Enumerable
+    alias map collect
+  end
+end
+
+unless File.respond_to?(:read)   # Ruby 1.6
+  def File.read(fname)
+    open(fname) {|f|
+      return f.read
+    }
+  end
+end
+
+unless Errno.const_defined?(:ENOTEMPTY)   # Windows?
+  module Errno
+    class ENOTEMPTY
+      # We do not raise this exception, implementation is not needed.
+    end
+  end
+end
+
+def File.binread(fname)
+  open(fname, 'rb') {|f|
+    return f.read
+  }
+end
+
+# for corrupted Windows' stat(2)
+def File.dir?(path)
+  File.directory?((path[-1,1] == '/') ? path : path + '/')
+end
+
+
+class ConfigTable
+
+  include Enumerable
+
+  def initialize(rbconfig)
+    @rbconfig = rbconfig
+    @items = []
+    @table = {}
+    # options
+    @install_prefix = nil
+    @config_opt = nil
+    @verbose = true
+    @no_harm = false
+  end
+
+  attr_accessor :install_prefix
+  attr_accessor :config_opt
+
+  attr_writer :verbose
+
+  def verbose?
+    @verbose
+  end
+
+  attr_writer :no_harm
+
+  def no_harm?
+    @no_harm
+  end
+
+  def [](key)
+    lookup(key).resolve(self)
+  end
+
+  def []=(key, val)
+    lookup(key).set val
+  end
+
+  def names
+    @items.map {|i| i.name }
+  end
+
+  def each(&block)
+    @items.each(&block)
+  end
+
+  def key?(name)
+    @table.key?(name)
+  end
+
+  def lookup(name)
+    @table[name] or setup_rb_error "no such config item: #{name}"
+  end
+
+  def add(item)
+    @items.push item
+    @table[item.name] = item
+  end
+
+  def remove(name)
+    item = lookup(name)
+    @items.delete_if {|i| i.name == name }
+    @table.delete_if {|name, i| i.name == name }
+    item
+  end
+
+  def load_script(path, inst = nil)
+    if File.file?(path)
+      MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
+    end
+  end
+
+  def savefile
+    '.config'
+  end
+
+  def load_savefile
+    begin
+      File.foreach(savefile()) do |line|
+        k, v = *line.split(/=/, 2)
+        self[k] = v.strip
+      end
+    rescue Errno::ENOENT
+      setup_rb_error $!.message + "\n#{File.basename($0)} config first"
+    end
+  end
+
+  def save
+    @items.each {|i| i.value }
+    File.open(savefile(), 'w') {|f|
+      @items.each do |i|
+        f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
+      end
+    }
+  end
+
+  def load_standard_entries
+    standard_entries(@rbconfig).each do |ent|
+      add ent
+    end
+  end
+
+  def standard_entries(rbconfig)
+    c = rbconfig
+
+    rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
+
+    major = c['MAJOR'].to_i
+    minor = c['MINOR'].to_i
+    teeny = c['TEENY'].to_i
+    version = "#{major}.#{minor}"
+
+    # ruby ver. >= 1.4.4?
+    newpath_p = ((major >= 2) or
+                 ((major == 1) and
+                  ((minor >= 5) or
+                   ((minor == 4) and (teeny >= 4)))))
+
+    if c['rubylibdir']
+      # V > 1.6.3
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = c['rubylibdir']
+      librubyverarch  = c['archdir']
+      siteruby        = c['sitedir']
+      siterubyver     = c['sitelibdir']
+      siterubyverarch = c['sitearchdir']
+    elsif newpath_p
+      # 1.4.4 <= V <= 1.6.3
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+      siteruby        = c['sitedir']
+      siterubyver     = "$siteruby/#{version}"
+      siterubyverarch = "$siterubyver/#{c['arch']}"
+    else
+      # V < 1.4.4
+      libruby         = "#{c['prefix']}/lib/ruby"
+      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
+      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+      siteruby        = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
+      siterubyver     = siteruby
+      siterubyverarch = "$siterubyver/#{c['arch']}"
+    end
+    parameterize = lambda {|path|
+      path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
+    }
+
+    if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
+      makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
+    else
+      makeprog = 'make'
+    end
+
+    [
+      ExecItem.new('installdirs', 'std/site/home',
+                   'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
+          {|val, table|
+            case val
+            when 'std'
+              table['rbdir'] = '$librubyver'
+              table['sodir'] = '$librubyverarch'
+            when 'site'
+              table['rbdir'] = '$siterubyver'
+              table['sodir'] = '$siterubyverarch'
+            when 'home'
+              setup_rb_error '$HOME was not set' unless ENV['HOME']
+              table['prefix'] = ENV['HOME']
+              table['rbdir'] = '$libdir/ruby'
+              table['sodir'] = '$libdir/ruby'
+            end
+          },
+      PathItem.new('prefix', 'path', c['prefix'],
+                   'path prefix of target environment'),
+      PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
+                   'the directory for commands'),
+      PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
+                   'the directory for libraries'),
+      PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
+                   'the directory for shared data'),
+      PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
+                   'the directory for man pages'),
+      PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
+                   'the directory for system configuration files'),
+      PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
+                   'the directory for local state data'),
+      PathItem.new('libruby', 'path', libruby,
+                   'the directory for ruby libraries'),
+      PathItem.new('librubyver', 'path', librubyver,
+                   'the directory for standard ruby libraries'),
+      PathItem.new('librubyverarch', 'path', librubyverarch,
+                   'the directory for standard ruby extensions'),
+      PathItem.new('siteruby', 'path', siteruby,
+          'the directory for version-independent aux ruby libraries'),
+      PathItem.new('siterubyver', 'path', siterubyver,
+                   'the directory for aux ruby libraries'),
+      PathItem.new('siterubyverarch', 'path', siterubyverarch,
+                   'the directory for aux ruby binaries'),
+      PathItem.new('rbdir', 'path', '$siterubyver',
+                   'the directory for ruby scripts'),
+      PathItem.new('sodir', 'path', '$siterubyverarch',
+                   'the directory for ruby extentions'),
+      PathItem.new('rubypath', 'path', rubypath,
+                   'the path to set to #! line'),
+      ProgramItem.new('rubyprog', 'name', rubypath,
+                      'the ruby program using for installation'),
+      ProgramItem.new('makeprog', 'name', makeprog,
+                      'the make program to compile ruby extentions'),
+      SelectItem.new('shebang', 'all/ruby/never', 'ruby',
+                     'shebang line (#!) editing mode'),
+      BoolItem.new('without-ext', 'yes/no', 'no',
+                   'does not compile/install ruby extentions')
+    ]
+  end
+  private :standard_entries
+
+  def load_multipackage_entries
+    multipackage_entries().each do |ent|
+      add ent
+    end
+  end
+
+  def multipackage_entries
+    [
+      PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
+                               'package names that you want to install'),
+      PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
+                               'package names that you do not want to install')
+    ]
+  end
+  private :multipackage_entries
+
+  ALIASES = {
+    'std-ruby'         => 'librubyver',
+    'stdruby'          => 'librubyver',
+    'rubylibdir'       => 'librubyver',
+    'archdir'          => 'librubyverarch',
+    'site-ruby-common' => 'siteruby',     # For backward compatibility
+    'site-ruby'        => 'siterubyver',  # For backward compatibility
+    'bin-dir'          => 'bindir',
+    'bin-dir'          => 'bindir',
+    'rb-dir'           => 'rbdir',
+    'so-dir'           => 'sodir',
+    'data-dir'         => 'datadir',
+    'ruby-path'        => 'rubypath',
+    'ruby-prog'        => 'rubyprog',
+    'ruby'             => 'rubyprog',
+    'make-prog'        => 'makeprog',
+    'make'             => 'makeprog'
+  }
+
+  def fixup
+    ALIASES.each do |ali, name|
+      @table[ali] = @table[name]
+    end
+    @items.freeze
+    @table.freeze
+    @options_re = /\A--(address@hidden('|')})(?:=(.*))?\z/
+  end
+
+  def parse_opt(opt)
+    m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
+    m.to_a[1,2]
+  end
+
+  def dllext
+    @rbconfig['DLEXT']
+  end
+
+  def value_config?(name)
+    lookup(name).value?
+  end
+
+  class Item
+    def initialize(name, template, default, desc)
+      @name = name.freeze
+      @template = template
+      @value = default
+      @default = default
+      @description = desc
+    end
+
+    attr_reader :name
+    attr_reader :description
+
+    attr_accessor :default
+    alias help_default default
+
+    def help_opt
+      "address@hidden@template}"
+    end
+
+    def value?
+      true
+    end
+
+    def value
+      @value
+    end
+
+    def resolve(table)
+      @value.gsub(%r<\$([^/]+)>) { table[$1] }
+    end
+
+    def set(val)
+      @value = check(val)
+    end
+
+    private
+
+    def check(val)
+      setup_rb_error "config: --#{name} requires argument" unless val
+      val
+    end
+  end
+
+  class BoolItem < Item
+    def config_type
+      'bool'
+    end
+
+    def help_opt
+      "address@hidden"
+    end
+
+    private
+
+    def check(val)
+      return 'yes' unless val
+      case val
+      when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
+      when /\An(o)?\z/i, /\Af(alse)\z/i  then 'no'
+      else
+        setup_rb_error "config: address@hidden accepts only yes/no for argument"
+      end
+    end
+  end
+
+  class PathItem < Item
+    def config_type
+      'path'
+    end
+
+    private
+
+    def check(path)
+      setup_rb_error "config: address@hidden requires argument"  unless path
+      path[0,1] == '$' ? path : File.expand_path(path)
+    end
+  end
+
+  class ProgramItem < Item
+    def config_type
+      'program'
+    end
+  end
+
+  class SelectItem < Item
+    def initialize(name, selection, default, desc)
+      super
+      @ok = selection.split('/')
+    end
+
+    def config_type
+      'select'
+    end
+
+    private
+
+    def check(val)
+      unless @ok.include?(val.strip)
+        setup_rb_error "config: use address@hidden@template} (#{val})"
+      end
+      val.strip
+    end
+  end
+
+  class ExecItem < Item
+    def initialize(name, selection, desc, &block)
+      super name, selection, nil, desc
+      @ok = selection.split('/')
+      @action = ""
+    end
+
+    def config_type
+      'exec'
+    end
+
+    def value?
+      false
+    end
+
+    def resolve(table)
+      setup_rb_error "$#{name()} wrongly used as option value"
+    end
+
+    undef set
+
+    def evaluate(val, table)
+      v = val.strip.downcase
+      unless @ok.include?(v)
+        setup_rb_error "invalid option address@hidden (use address@hidden)"
+      end
+      @action.call v, table
+    end
+  end
+
+  class PackageSelectionItem < Item
+    def initialize(name, template, default, help_default, desc)
+      super name, template, default, desc
+      @help_default = help_default
+    end
+
+    attr_reader :help_default
+
+    def config_type
+      'package'
+    end
+
+    private
+
+    def check(val)
+      unless File.dir?("packages/#{val}")
+        setup_rb_error "config: no such package: #{val}"
+      end
+      val
+    end
+  end
+
+  class MetaConfigEnvironment
+    def initialize(config, installer)
+      @config = config
+      @installer = installer
+    end
+
+    def config_names
+      @config.names
+    end
+
+    def config?(name)
+      @config.key?(name)
+    end
+
+    def bool_config?(name)
+      @config.lookup(name).config_type == 'bool'
+    end
+
+    def path_config?(name)
+      @config.lookup(name).config_type == 'path'
+    end
+
+    def value_config?(name)
+      @config.lookup(name).config_type != 'exec'
+    end
+
+    def add_config(item)
+      @config.add item
+    end
+
+    def add_bool_config(name, default, desc)
+      @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
+    end
+
+    def add_path_config(name, default, desc)
+      @config.add PathItem.new(name, 'path', default, desc)
+    end
+
+    def set_config_default(name, default)
+      @config.lookup(name).default = default
+    end
+
+    def remove_config(name)
+      @config.remove(name)
+    end
+
+    # For only multipackage
+    def packages
+      raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
+      @installer.packages
+    end
+
+    # For only multipackage
+    def declare_packages(list)
+      raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
+      @installer.packages = list
+    end
+  end
+
+end   # class ConfigTable
+
+
+# This module requires: #verbose?, #no_harm?
+module FileOperations
+
+  def mkdir_p(dirname, prefix = nil)
+    dirname = prefix + File.expand_path(dirname) if prefix
+    $stderr.puts "mkdir -p #{dirname}" if verbose?
+    return if no_harm?
+
+    # Does not check '/', it's too abnormal.
+    dirs = File.expand_path(dirname).split(%r<(?=/)>)
+    if /\A[a-z]:\z/i =~ dirs[0]
+      disk = dirs.shift
+      dirs[0] = disk + dirs[0]
+    end
+    dirs.each_index do |idx|
+      path = dirs[0..idx].join('')
+      Dir.mkdir path unless File.dir?(path)
+    end
+  end
+
+  def rm_f(path)
+    $stderr.puts "rm -f #{path}" if verbose?
+    return if no_harm?
+    force_remove_file path
+  end
+
+  def rm_rf(path)
+    $stderr.puts "rm -rf #{path}" if verbose?
+    return if no_harm?
+    remove_tree path
+  end
+
+  def remove_tree(path)
+    if File.symlink?(path)
+      remove_file path
+    elsif File.dir?(path)
+      remove_tree0 path
+    else
+      force_remove_file path
+    end
+  end
+
+  def remove_tree0(path)
+    Dir.foreach(path) do |ent|
+      next if ent == '.'
+      next if ent == '..'
+      entpath = "#{path}/#{ent}"
+      if File.symlink?(entpath)
+        remove_file entpath
+      elsif File.dir?(entpath)
+        remove_tree0 entpath
+      else
+        force_remove_file entpath
+      end
+    end
+    begin
+      Dir.rmdir path
+    rescue Errno::ENOTEMPTY
+      # directory may not be empty
+    end
+  end
+
+  def move_file(src, dest)
+    force_remove_file dest
+    begin
+      File.rename src, dest
+    rescue
+      File.open(dest, 'wb') {|f|
+        f.write File.binread(src)
+      }
+      File.chmod File.stat(src).mode, dest
+      File.unlink src
+    end
+  end
+
+  def force_remove_file(path)
+    begin
+      remove_file path
+    rescue
+    end
+  end
+
+  def remove_file(path)
+    File.chmod 0777, path
+    File.unlink path
+  end
+
+  def install(from, dest, mode, prefix = nil)
+    $stderr.puts "install #{from} #{dest}" if verbose?
+    return if no_harm?
+
+    realdest = prefix ? prefix + File.expand_path(dest) : dest
+    realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
+    str = File.binread(from)
+    if diff?(str, realdest)
+      verbose_off {
+        rm_f realdest if File.exist?(realdest)
+      }
+      File.open(realdest, 'wb') {|f|
+        f.write str
+      }
+      File.chmod mode, realdest
+
+      File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
+        if prefix
+          f.puts realdest.sub(prefix, '')
+        else
+          f.puts realdest
+        end
+      }
+    end
+  end
+
+  def diff?(new_content, path)
+    return true unless File.exist?(path)
+    new_content != File.binread(path)
+  end
+
+  def command(*args)
+    $stderr.puts args.join(' ') if verbose?
+    system(*args) or raise RuntimeError,
+        "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
+  end
+
+  def ruby(*args)
+    command config('rubyprog'), *args
+  end
+  
+  def make(task = nil)
+    command(*[config('makeprog'), task].compact)
+  end
+
+  def extdir?(dir)
+    File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
+  end
+
+  def files_of(dir)
+    Dir.open(dir) {|d|
+      return d.select {|ent| File.file?("#{dir}/#{ent}") }
+    }
+  end
+
+  DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
+
+  def directories_of(dir)
+    Dir.open(dir) {|d|
+      return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
+    }
+  end
+
+end
+
+
+# This module requires: #srcdir_root, #objdir_root, #relpath
+module HookScriptAPI
+
+  def get_config(key)
+    @config[key]
+  end
+
+  alias config get_config
+
+  # obsolete: use metaconfig to change configuration
+  def set_config(key, val)
+    @config[key] = val
+  end
+
+  #
+  # srcdir/objdir (works only in the package directory)
+  #
+
+  def curr_srcdir
+    "#{srcdir_root()}/#{relpath()}"
+  end
+
+  def curr_objdir
+    "#{objdir_root()}/#{relpath()}"
+  end
+
+  def srcfile(path)
+    "#{curr_srcdir()}/#{path}"
+  end
+
+  def srcexist?(path)
+    File.exist?(srcfile(path))
+  end
+
+  def srcdirectory?(path)
+    File.dir?(srcfile(path))
+  end
+  
+  def srcfile?(path)
+    File.file?(srcfile(path))
+  end
+
+  def srcentries(path = '.')
+    Dir.open("#{curr_srcdir()}/#{path}") {|d|
+      return d.to_a - %w(. ..)
+    }
+  end
+
+  def srcfiles(path = '.')
+    srcentries(path).select {|fname|
+      File.file?(File.join(curr_srcdir(), path, fname))
+    }
+  end
+
+  def srcdirectories(path = '.')
+    srcentries(path).select {|fname|
+      File.dir?(File.join(curr_srcdir(), path, fname))
+    }
+  end
+
+end
+
+
+class ToplevelInstaller
+
+  Version   = '3.4.1'
+  Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
+
+  TASKS = [
+    [ 'all',      'do config, setup, then install' ],
+    [ 'config',   'saves your configurations' ],
+    [ 'show',     'shows current configuration' ],
+    [ 'setup',    'compiles ruby extentions and others' ],
+    [ 'install',  'installs files' ],
+    [ 'test',     'run all tests in test/' ],
+    [ 'clean',    "does `make clean' for each extention" ],
+    [ 'distclean',"does `make distclean' for each extention" ]
+  ]
+
+  def ToplevelInstaller.invoke
+    config = ConfigTable.new(load_rbconfig())
+    config.load_standard_entries
+    config.load_multipackage_entries if multipackage?
+    config.fixup
+    klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
+    klass.new(File.dirname($0), config).invoke
+  end
+
+  def ToplevelInstaller.multipackage?
+    File.dir?(File.dirname($0) + '/packages')
+  end
+
+  def ToplevelInstaller.load_rbconfig
+    if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
+      ARGV.delete(arg)
+      load File.expand_path(arg.split(/=/, 2)[1])
+      $".push 'rbconfig.rb'
+    else
+      require 'rbconfig'
+    end
+    ::Config::CONFIG
+  end
+
+  def initialize(ardir_root, config)
+    @ardir = File.expand_path(ardir_root)
+    @config = config
+    # cache
+    @valid_task_re = nil
+  end
+
+  def config(key)
+    @config[key]
+  end
+
+  def inspect
+    "#<#{self.class} #{__id__()}>"
+  end
+
+  def invoke
+    run_metaconfigs
+    case task = parsearg_global()
+    when nil, 'all'
+      parsearg_config
+      init_installers
+      exec_config
+      exec_setup
+      exec_install
+    else
+      case task
+      when 'config', 'test'
+        ;
+      when 'clean', 'distclean'
+        @config.load_savefile if File.exist?(@config.savefile)
+      else
+        @config.load_savefile
+      end
+      __send__ "parsearg_#{task}"
+      init_installers
+      __send__ "exec_#{task}"
+    end
+  end
+  
+  def run_metaconfigs
+    @config.load_script "address@hidden/metaconfig"
+  end
+
+  def init_installers
+    @installer = Installer.new(@config, @ardir, File.expand_path('.'))
+  end
+
+  #
+  # Hook Script API bases
+  #
+
+  def srcdir_root
+    @ardir
+  end
+
+  def objdir_root
+    '.'
+  end
+
+  def relpath
+    '.'
+  end
+
+  #
+  # Option Parsing
+  #
+
+  def parsearg_global
+    while arg = ARGV.shift
+      case arg
+      when /\A\w+\z/
+        setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
+        return arg
+      when '-q', '--quiet'
+        @config.verbose = false
+      when '--verbose'
+        @config.verbose = true
+      when '--help'
+        print_usage $stdout
+        exit 0
+      when '--version'
+        puts "#{File.basename($0)} version #{Version}"
+        exit 0
+      when '--copyright'
+        puts Copyright
+        exit 0
+      else
+        setup_rb_error "unknown global option '#{arg}'"
+      end
+    end
+    nil
+  end
+
+  def valid_task?(t)
+    valid_task_re() =~ t
+  end
+
+  def valid_task_re
+    @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
+  end
+
+  def parsearg_no_options
+    unless ARGV.empty?
+      task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
+      setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
+    end
+  end
+
+  alias parsearg_show       parsearg_no_options
+  alias parsearg_setup      parsearg_no_options
+  alias parsearg_test       parsearg_no_options
+  alias parsearg_clean      parsearg_no_options
+  alias parsearg_distclean  parsearg_no_options
+
+  def parsearg_config
+    evalopt = []
+    set = []
+    @config.config_opt = []
+    while i = ARGV.shift
+      if /\A--?\z/ =~ i
+        @config.config_opt = ARGV.dup
+        break
+      end
+      name, value = address@hidden(i)
+      if @config.value_config?(name)
+        @config[name] = value
+      else
+        evalopt.push [name, value]
+      end
+      set.push name
+    end
+    evalopt.each do |name, value|
+      @config.lookup(name).evaluate value, @config
+    end
+    # Check if configuration is valid
+    set.each do |n|
+      @config[n] if @config.value_config?(n)
+    end
+  end
+
+  def parsearg_install
+    @config.no_harm = false
+    @config.install_prefix = ''
+    while a = ARGV.shift
+      case a
+      when '--no-harm'
+        @config.no_harm = true
+      when /\A--prefix=/
+        path = a.split(/=/, 2)[1]
+        path = File.expand_path(path) unless path[0,1] == '/'
+        @config.install_prefix = path
+      else
+        setup_rb_error "install: unknown option #{a}"
+      end
+    end
+  end
+
+  def print_usage(out)
+    out.puts 'Typical Installation Procedure:'
+    out.puts "  $ ruby #{File.basename $0} config"
+    out.puts "  $ ruby #{File.basename $0} setup"
+    out.puts "  # ruby #{File.basename $0} install (may require root privilege)"
+    out.puts
+    out.puts 'Detailed Usage:'
+    out.puts "  ruby #{File.basename $0} <global option>"
+    out.puts "  ruby #{File.basename $0} [<global options>] <task> [<task options>]"
+
+    fmt = "  %-24s %s\n"
+    out.puts
+    out.puts 'Global options:'
+    out.printf fmt, '-q,--quiet',   'suppress message outputs'
+    out.printf fmt, '   --verbose', 'output messages verbosely'
+    out.printf fmt, '   --help',    'print this message'
+    out.printf fmt, '   --version', 'print version and quit'
+    out.printf fmt, '   --copyright',  'print copyright and quit'
+    out.puts
+    out.puts 'Tasks:'
+    TASKS.each do |name, desc|
+      out.printf fmt, name, desc
+    end
+
+    fmt = "  %-24s %s [%s]\n"
+    out.puts
+    out.puts 'Options for CONFIG or ALL:'
+    @config.each do |item|
+      out.printf fmt, item.help_opt, item.description, item.help_default
+    end
+    out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
+    out.puts
+    out.puts 'Options for INSTALL:'
+    out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
+    out.printf fmt, '--prefix=path',  'install path prefix', ''
+    out.puts
+  end
+
+  #
+  # Task Handlers
+  #
+
+  def exec_config
+    @installer.exec_config
+    @config.save   # must be final
+  end
+
+  def exec_setup
+    @installer.exec_setup
+  end
+
+  def exec_install
+    @installer.exec_install
+  end
+
+  def exec_test
+    @installer.exec_test
+  end
+
+  def exec_show
+    @config.each do |i|
+      printf "%-20s %s\n", i.name, i.value if i.value?
+    end
+  end
+
+  def exec_clean
+    @installer.exec_clean
+  end
+
+  def exec_distclean
+    @installer.exec_distclean
+  end
+
+end   # class ToplevelInstaller
+
+
+class ToplevelInstallerMulti < ToplevelInstaller
+
+  include FileOperations
+
+  def initialize(ardir_root, config)
+    super
+    @packages = directories_of("address@hidden/packages")
+    raise 'no package exists' if @packages.empty?
+    @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
+  end
+
+  def run_metaconfigs
+    @config.load_script "address@hidden/metaconfig", self
+    @packages.each do |name|
+      @config.load_script "address@hidden/packages/#{name}/metaconfig"
+    end
+  end
+
+  attr_reader :packages
+
+  def packages=(list)
+    raise 'package list is empty' if list.empty?
+    list.each do |name|
+      raise "directory packages/#{name} does not exist"\
+              unless File.dir?("address@hidden/packages/#{name}")
+    end
+    @packages = list
+  end
+
+  def init_installers
+    @installers = {}
+    @packages.each do |pack|
+      @installers[pack] = Installer.new(@config,
+                                       "address@hidden/packages/#{pack}",
+                                       "packages/#{pack}")
+    end
+    with    = extract_selection(config('with'))
+    without = extract_selection(config('without'))
+    @selected = @installers.keys.select {|name|
+                  (with.empty? or with.include?(name)) \
+                      and not without.include?(name)
+                }
+  end
+
+  def extract_selection(list)
+    a = list.split(/,/)
+    a.each do |name|
+      setup_rb_error "no such package: #{name}"  unless @installers.key?(name)
+    end
+    a
+  end
+
+  def print_usage(f)
+    super
+    f.puts 'Inluded packages:'
+    f.puts '  ' + @packages.sort.join(' ')
+    f.puts
+  end
+
+  #
+  # Task Handlers
+  #
+
+  def exec_config
+    run_hook 'pre-config'
+    each_selected_installers {|inst| inst.exec_config }
+    run_hook 'post-config'
+    @config.save   # must be final
+  end
+
+  def exec_setup
+    run_hook 'pre-setup'
+    each_selected_installers {|inst| inst.exec_setup }
+    run_hook 'post-setup'
+  end
+
+  def exec_install
+    run_hook 'pre-install'
+    each_selected_installers {|inst| inst.exec_install }
+    run_hook 'post-install'
+  end
+
+  def exec_test
+    run_hook 'pre-test'
+    each_selected_installers {|inst| inst.exec_test }
+    run_hook 'post-test'
+  end
+
+  def exec_clean
+    rm_f @config.savefile
+    run_hook 'pre-clean'
+    each_selected_installers {|inst| inst.exec_clean }
+    run_hook 'post-clean'
+  end
+
+  def exec_distclean
+    rm_f @config.savefile
+    run_hook 'pre-distclean'
+    each_selected_installers {|inst| inst.exec_distclean }
+    run_hook 'post-distclean'
+  end
+
+  #
+  # lib
+  #
+
+  def each_selected_installers
+    Dir.mkdir 'packages' unless File.dir?('packages')
+    @selected.each do |pack|
+      $stderr.puts "Processing the package `#{pack}' ..." if verbose?
+      Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
+      Dir.chdir "packages/#{pack}"
+      yield @installers[pack]
+      Dir.chdir '../..'
+    end
+  end
+
+  def run_hook(id)
+    @root_installer.run_hook id
+  end
+
+  # module FileOperations requires this
+  def verbose?
+    @config.verbose?
+  end
+
+  # module FileOperations requires this
+  def no_harm?
+    @config.no_harm?
+  end
+
+end   # class ToplevelInstallerMulti
+
+
+class Installer
+
+  FILETYPES = %w( bin lib ext data conf man )
+
+  include FileOperations
+  include HookScriptAPI
+
+  def initialize(config, srcroot, objroot)
+    @config = config
+    @srcdir = File.expand_path(srcroot)
+    @objdir = File.expand_path(objroot)
+    @currdir = '.'
+  end
+
+  def inspect
+    "#<#{self.class} #{File.basename(@srcdir)}>"
+  end
+
+  def noop(rel)
+  end
+
+  #
+  # Hook Script API base methods
+  #
+
+  def srcdir_root
+    @srcdir
+  end
+
+  def objdir_root
+    @objdir
+  end
+
+  def relpath
+    @currdir
+  end
+
+  #
+  # Config Access
+  #
+
+  # module FileOperations requires this
+  def verbose?
+    @config.verbose?
+  end
+
+  # module FileOperations requires this
+  def no_harm?
+    @config.no_harm?
+  end
+
+  def verbose_off
+    begin
+      save, @config.verbose = @config.verbose?, false
+      yield
+    ensure
+      @config.verbose = save
+    end
+  end
+
+  #
+  # TASK config
+  #
+
+  def exec_config
+    exec_task_traverse 'config'
+  end
+
+  alias config_dir_bin noop
+  alias config_dir_lib noop
+
+  def config_dir_ext(rel)
+    extconf if extdir?(curr_srcdir())
+  end
+
+  alias config_dir_data noop
+  alias config_dir_conf noop
+  alias config_dir_man noop
+
+  def extconf
+    ruby "#{curr_srcdir()}/extconf.rb", address@hidden
+  end
+
+  #
+  # TASK setup
+  #
+
+  def exec_setup
+    exec_task_traverse 'setup'
+  end
+
+  def setup_dir_bin(rel)
+    files_of(curr_srcdir()).each do |fname|
+      update_shebang_line "#{curr_srcdir()}/#{fname}"
+    end
+  end
+
+  alias setup_dir_lib noop
+
+  def setup_dir_ext(rel)
+    make if extdir?(curr_srcdir())
+  end
+
+  alias setup_dir_data noop
+  alias setup_dir_conf noop
+  alias setup_dir_man noop
+
+  def update_shebang_line(path)
+    return if no_harm?
+    return if config('shebang') == 'never'
+    old = Shebang.load(path)
+    if old
+      $stderr.puts "warning: #{path}: Shebang line includes too many args.  It is not portable and your program may not work." if old.args.size > 1
+      new = new_shebang(old)
+      return if new.to_s == old.to_s
+    else
+      return unless config('shebang') == 'all'
+      new = Shebang.new(config('rubypath'))
+    end
+    $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
+    open_atomic_writer(path) {|output|
+      File.open(path, 'rb') {|f|
+        f.gets if old   # discard
+        output.puts new.to_s
+        output.print f.read
+      }
+    }
+  end
+
+  def new_shebang(old)
+    if /\Aruby/ =~ File.basename(old.cmd)
+      Shebang.new(config('rubypath'), old.args)
+    elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
+      Shebang.new(config('rubypath'), old.args[1..-1])
+    else
+      return old unless config('shebang') == 'all'
+      Shebang.new(config('rubypath'))
+    end
+  end
+
+  def open_atomic_writer(path, &block)
+    tmpfile = File.basename(path) + '.tmp'
+    begin
+      File.open(tmpfile, 'wb', &block)
+      File.rename tmpfile, File.basename(path)
+    ensure
+      File.unlink tmpfile if File.exist?(tmpfile)
+    end
+  end
+
+  class Shebang
+    def Shebang.load(path)
+      line = nil
+      File.open(path) {|f|
+        line = f.gets
+      }
+      return nil unless /\A#!/ =~ line
+      parse(line)
+    end
+
+    def Shebang.parse(line)
+      cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
+      new(cmd, args)
+    end
+
+    def initialize(cmd, args = [])
+      @cmd = cmd
+      @args = args
+    end
+
+    attr_reader :cmd
+    attr_reader :args
+
+    def to_s
+      "#! address@hidden" + (@args.empty? ? '' : " address@hidden(' ')}")
+    end
+  end
+
+  #
+  # TASK install
+  #
+
+  def exec_install
+    rm_f 'InstalledFiles'
+    exec_task_traverse 'install'
+  end
+
+  def install_dir_bin(rel)
+    install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
+  end
+
+  def install_dir_lib(rel)
+    install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
+  end
+
+  def install_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    install_files rubyextentions('.'),
+                  "#{config('sodir')}/#{File.dirname(rel)}",
+                  0555
+  end
+
+  def install_dir_data(rel)
+    install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
+  end
+
+  def install_dir_conf(rel)
+    # FIXME: should not remove current config files
+    # (rename previous file to .old/.org)
+    install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
+  end
+
+  def install_dir_man(rel)
+    install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
+  end
+
+  def install_files(list, dest, mode)
+    mkdir_p dest, @config.install_prefix
+    list.each do |fname|
+      install fname, dest, mode, @config.install_prefix
+    end
+  end
+
+  def libfiles
+    glob_reject(%w(*.y *.output), targetfiles())
+  end
+
+  def rubyextentions(dir)
+    ents = glob_select("address@hidden", targetfiles())
+    if ents.empty?
+      setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
+    end
+    ents
+  end
+
+  def targetfiles
+    mapdir(existfiles() - hookfiles())
+  end
+
+  def mapdir(ents)
+    ents.map {|ent|
+      if File.exist?(ent)
+      then ent                         # objdir
+      else "#{curr_srcdir()}/#{ent}"   # srcdir
+      end
+    }
+  end
+
+  # picked up many entries from cvs-1.11.1/src/ignore.c
+  JUNK_FILES = %w( 
+    core RCSLOG tags TAGS .make.state
+    .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
+    *~ *.old *.bak *.BAK *.orig *.rej _$* *$
+
+    *.org *.in .*
+  )
+
+  def existfiles
+    glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
+  end
+
+  def hookfiles
+    %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
+      %w( config setup install clean ).map {|t| sprintf(fmt, t) }
+    }.flatten
+  end
+
+  def glob_select(pat, ents)
+    re = globs2re([pat])
+    ents.select {|ent| re =~ ent }
+  end
+
+  def glob_reject(pats, ents)
+    re = globs2re(pats)
+    ents.reject {|ent| re =~ ent }
+  end
+
+  GLOB2REGEX = {
+    '.' => '\.',
+    '$' => '\$',
+    '#' => '\#',
+    '*' => '.*'
+  }
+
+  def globs2re(pats)
+    /\A(?:#{
+      pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
+    })\z/
+  end
+
+  #
+  # TASK test
+  #
+
+  TESTDIR = 'test'
+
+  def exec_test
+    unless File.directory?('test')
+      $stderr.puts 'no test in this package' if verbose?
+      return
+    end
+    $stderr.puts 'Running tests...' if verbose?
+    begin
+      require 'test/unit'
+    rescue LoadError
+      setup_rb_error 'test/unit cannot loaded.  You need Ruby 1.8 or later to invoke this task.'
+    end
+    runner = Test::Unit::AutoRunner.new(true)
+    runner.to_run << TESTDIR
+    runner.run
+  end
+
+  #
+  # TASK clean
+  #
+
+  def exec_clean
+    exec_task_traverse 'clean'
+    rm_f @config.savefile
+    rm_f 'InstalledFiles'
+  end
+
+  alias clean_dir_bin noop
+  alias clean_dir_lib noop
+  alias clean_dir_data noop
+  alias clean_dir_conf noop
+  alias clean_dir_man noop
+
+  def clean_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    make 'clean' if File.file?('Makefile')
+  end
+
+  #
+  # TASK distclean
+  #
+
+  def exec_distclean
+    exec_task_traverse 'distclean'
+    rm_f @config.savefile
+    rm_f 'InstalledFiles'
+  end
+
+  alias distclean_dir_bin noop
+  alias distclean_dir_lib noop
+
+  def distclean_dir_ext(rel)
+    return unless extdir?(curr_srcdir())
+    make 'distclean' if File.file?('Makefile')
+  end
+
+  alias distclean_dir_data noop
+  alias distclean_dir_conf noop
+  alias distclean_dir_man noop
+
+  #
+  # Traversing
+  #
+
+  def exec_task_traverse(task)
+    run_hook "pre-#{task}"
+    FILETYPES.each do |type|
+      if type == 'ext' and config('without-ext') == 'yes'
+        $stderr.puts 'skipping ext/* by user option' if verbose?
+        next
+      end
+      traverse task, type, "#{task}_dir_#{type}"
+    end
+    run_hook "post-#{task}"
+  end
+
+  def traverse(task, rel, mid)
+    dive_into(rel) {
+      run_hook "pre-#{task}"
+      __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
+      directories_of(curr_srcdir()).each do |d|
+        traverse task, "#{rel}/#{d}", mid
+      end
+      run_hook "post-#{task}"
+    }
+  end
+
+  def dive_into(rel)
+    return unless File.dir?("address@hidden/#{rel}")
+
+    dir = File.basename(rel)
+    Dir.mkdir dir unless File.dir?(dir)
+    prevdir = Dir.pwd
+    Dir.chdir dir
+    $stderr.puts '---> ' + rel if verbose?
+    @currdir = rel
+    yield
+    Dir.chdir prevdir
+    $stderr.puts '<--- ' + rel if verbose?
+    @currdir = File.dirname(rel)
+  end
+
+  def run_hook(id)
+    path = [ "#{curr_srcdir()}/#{id}",
+             "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
+    return unless path
+    begin
+      instance_eval File.read(path), path, 1
+    rescue
+      raise if $DEBUG
+      setup_rb_error "hook #{path} failed:\n" + $!.message
+    end
+  end
+
+end   # class Installer
+
+
+class SetupError < StandardError; end
+
+def setup_rb_error(msg)
+  raise SetupError, msg
+end
+
+if $0 == __FILE__
+  begin
+    ToplevelInstaller.invoke
+  rescue SetupError
+    raise if $DEBUG
+    $stderr.puts $!.message
+    $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
+    exit 1
+  end
+end

Added: trunk/vendor/plugins/oauth/tasks/deployment.rake (0 => 2864)


--- trunk/vendor/plugins/oauth/tasks/deployment.rake	                        (rev 0)
+++ trunk/vendor/plugins/oauth/tasks/deployment.rake	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,34 @@
+desc 'Release the website and new gem version'
+task :deploy => [:check_version, :website, :release] do
+  puts "Remember to create SVN tag:"
+  puts "svn copy svn+ssh://address@hidden/var/svn/#{PATH}/trunk " +
+    "svn+ssh://address@hidden/var/svn/#{PATH}/tags/REL-#{VERS} "
+  puts "Suggested comment:"
+  puts "Tagging release #{CHANGES}"
+end
+
+desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
+task :local_deploy => [:website_generate, :install_gem]
+
+task :check_version do
+  unless ENV['VERSION']
+    puts 'Must pass a VERSION=x.y.z release version'
+    exit
+  end
+  unless ENV['VERSION'] == VERS
+    puts "Please update your version.rb to match the release version, currently #{VERS}"
+    exit
+  end
+end
+
+desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
+task :install_gem_no_doc => [:clean, :package] do
+  sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
+end
+
+namespace :manifest do
+  desc 'Recreate Manifest.txt to include ALL files'
+  task :refresh do
+    `rake check_manifest | patch -p0 > Manifest.txt`
+  end
+end
\ No newline at end of file

Added: trunk/vendor/plugins/oauth/tasks/environment.rake (0 => 2864)


--- trunk/vendor/plugins/oauth/tasks/environment.rake	                        (rev 0)
+++ trunk/vendor/plugins/oauth/tasks/environment.rake	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,7 @@
+task :ruby_env do
+  RUBY_APP = if RUBY_PLATFORM =~ /java/
+    "jruby"
+  else
+    "ruby"
+  end unless defined? RUBY_APP
+end

Added: trunk/vendor/plugins/oauth/tasks/website.rake (0 => 2864)


--- trunk/vendor/plugins/oauth/tasks/website.rake	                        (rev 0)
+++ trunk/vendor/plugins/oauth/tasks/website.rake	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,17 @@
+desc 'Generate website files'
+task :website_generate => :ruby_env do
+  (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
+    sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
+  end
+end
+
+desc 'Upload website files to rubyforge'
+task :website_upload do
+  host = "address@hidden"
+  remote_dir = "/var/www/gforge-projects/#{PATH}/"
+  local_dir = 'website'
+  sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
+end
+
+desc 'Generate and upload website files'
+task :website => [:website_generate, :website_upload, :publish_docs]

Added: trunk/vendor/plugins/oauth/test/test_action_controller_request_proxy.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_action_controller_request_proxy.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_action_controller_request_proxy.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+require 'oauth/request_proxy/action_controller_request.rb'
+
+class ActionControllerRequestProxyTest < Test::Unit::TestCase
+
+  def test_truth
+    assert true
+  end
+
+end

Added: trunk/vendor/plugins/oauth/test/test_consumer.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_consumer.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_consumer.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,203 @@
+require 'test/unit'
+require 'oauth/consumer'
+
+# This performs testing against Andy Smith's test server http://term.ie/oauth/example/
+# Thanks Andy.
+# This also means you have to be online to be able to run these.
+class ConsumerTest < Test::Unit::TestCase
+  def setup
+    @consumer=OAuth::Consumer.new( 
+        'consumer_key_86cad9', '5888bf0345e5d237',
+        {
+        :site=>"http://blabla.bla",
+        :request_token_path=>"/oauth/example/request_token.php",
+        :access_token_path=>"/oauth/example/access_token.php",
+        :authorize_path=>"/oauth/example/authorize.php",
+        :scheme=>:header,
+        :http_method=>:get
+        })
+    @token = OAuth::ConsumerToken.new(@consumer,'token_411a7f', '3196ffd991c8ebdb')
+    @request_uri = URI.parse('http://example.com/test?key=value')
+    @request_parameters = { 'key' => 'value' }
+    @nonce = 225579211881198842005988698334675835446
+    @timestamp = "1199645624"
+    @consumer.http=Net::HTTP.new(@request_uri.host, @request_uri.port)
+  end
+  
+  def test_initializer
+    assert_equal "consumer_key_86cad9",@consumer.key
+    assert_equal "5888bf0345e5d237",@consumer.secret
+    assert_equal "http://blabla.bla",@consumer.site
+    assert_equal "/oauth/example/request_token.php",@consumer.request_token_path
+    assert_equal "/oauth/example/access_token.php",@consumer.access_token_path
+    assert_equal "http://blabla.bla/oauth/example/request_token.php",@consumer.request_token_url
+    assert_equal "http://blabla.bla/oauth/example/access_token.php",@consumer.access_token_url
+    assert_equal "http://blabla.bla/oauth/example/authorize.php",@consumer.authorize_url
+    assert_equal :header,@consumer.scheme
+    assert_equal :get,@consumer.http_method
+  end
+
+  def test_defaults
+    @consumer=OAuth::Consumer.new(
+      "key",
+      "secret",
+      {
+          :site=>"http://twitter.com"
+      })
+    assert_equal "key",@consumer.key
+    assert_equal "secret",@consumer.secret
+    assert_equal "http://twitter.com",@consumer.site
+    assert_equal "/oauth/request_token",@consumer.request_token_path
+    assert_equal "/oauth/access_token",@consumer.access_token_path
+    assert_equal "http://twitter.com/oauth/request_token",@consumer.request_token_url
+    assert_equal "http://twitter.com/oauth/access_token",@consumer.access_token_url
+    assert_equal "http://twitter.com/oauth/authorize",@consumer.authorize_url
+    assert_equal :header,@consumer.scheme
+    assert_equal :post,@consumer.http_method 
+  end
+
+  def test_override_paths
+    @consumer=OAuth::Consumer.new(
+      "key",
+      "secret",
+      {
+          :site=>"http://twitter.com",
+          :request_token_url=>"http://oauth.twitter.com/request_token",
+          :access_token_url=>"http://oauth.twitter.com/access_token",
+          :authorize_url=>"http://site.twitter.com/authorize"
+      })
+    assert_equal "key",@consumer.key
+    assert_equal "secret",@consumer.secret
+    assert_equal "http://twitter.com",@consumer.site
+    assert_equal "/oauth/request_token",@consumer.request_token_path
+    assert_equal "/oauth/access_token",@consumer.access_token_path
+    assert_equal "http://oauth.twitter.com/request_token",@consumer.request_token_url
+    assert_equal "http://oauth.twitter.com/access_token",@consumer.access_token_url
+    assert_equal "http://site.twitter.com/authorize",@consumer.authorize_url
+    assert_equal :header,@consumer.scheme
+    assert_equal :post,@consumer.http_method 
+  end
+
+  def test_that_signing_auth_headers_on_get_requests_works
+    request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
+    @token.sign!(request, {:nonce => @nonce, :timestamp => @timestamp})
+    
+    assert_equal 'GET', request.method
+    assert_equal '/test?key=value', request.path
+    assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"1oO2izFav1GP4kEH2EskwXkCRFg%3D\", oauth_version=\"1.0\"", request['authorization']
+  end
+
+  def test_that_signing_auth_headers_on_post_requests_works
+    request = Net::HTTP::Post.new(@request_uri.path)
+    request.set_form_data( @request_parameters )
+    @token.sign!(request, {:nonce => @nonce, :timestamp => @timestamp})
+#    assert_equal "",request.oauth_helper.signature_base_string
+
+    assert_equal 'POST', request.method
+    assert_equal '/test', request.path
+    assert_equal 'key=value', request.body
+    assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"", request['authorization']
+  end
+ 
+  def test_that_signing_post_params_works
+    request = Net::HTTP::Post.new(@request_uri.path)
+    request.set_form_data( @request_parameters )
+    @token.sign!(request, {:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp})
+
+    assert_equal 'POST', request.method
+    assert_equal '/test', request.path
+    assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=iMZaUTbQof%2fHMFyIde%2bOIkhW5is%3d&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
+    assert_equal nil, request['authorization']
+  end
+
+  def test_that_using_auth_headers_on_get_on_create_signed_requests_works
+    address@hidden(:get,@request_uri.path+ "?" + request_parameters_to_s,@token,{:nonce => @nonce, :timestamp => @timestamp},@request_parameters)
+    
+    assert_equal 'GET', request.method
+    assert_equal '/test?key=value', request.path
+    assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"1oO2izFav1GP4kEH2EskwXkCRFg%3D\", oauth_version=\"1.0\"", request['authorization']
+  end
+
+  def test_that_using_auth_headers_on_post_on_create_signed_requests_works
+    address@hidden(:post,@request_uri.path,@token,{:nonce => @nonce, :timestamp => @timestamp},@request_parameters,{})
+    assert_equal 'POST', request.method
+    assert_equal '/test', request.path
+    assert_equal 'key=value', request.body
+    assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"", request['authorization']
+  end
+
+  def test_that_signing_post_params_works
+    address@hidden(:post,@request_uri.path,@token,{:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp},@request_parameters,{})
+
+    assert_equal 'POST', request.method
+    assert_equal '/test', request.path
+    assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=26g7wHTtNO6ZWJaLltcueppHYiI%3d&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
+    assert_equal nil, request['authorization']
+  end
+  
+  def test_step_by_step_token_request
+    @consumer=OAuth::Consumer.new( 
+        "key",
+        "secret",
+        {
+        :site=>"http://term.ie",
+        :request_token_path=>"/oauth/example/request_token.php",
+        :access_token_path=>"/oauth/example/access_token.php",
+        :authorize_path=>"/oauth/example/authorize.php",
+        :scheme=>:header
+        })
+    options={:nonce=>'nonce',:timestamp=>Time.now.to_i.to_s}
+ 
+    request = Net::HTTP::Get.new("/oauth/example/request_token.php")
+    address@hidden(request,nil,options)
+    assert_equal "GET&http%3A%2F%2Fterm.ie%2Foauth%2Fexample%2Frequest_token.php&oauth_consumer_key%3Dkey%26oauth_nonce%3D#{options[:nonce]}%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D#{options[:timestamp]}%26oauth_token%3D%26oauth_version%3D1.0",signature_base_string
+    @consumer.sign!(request, nil,options)
+
+    assert_equal 'GET', request.method
+    assert_equal nil, request.body
+    address@hidden(request)
+    assert_equal "200",response.code
+    assert_equal "oauth_token=requestkey&oauth_token_secret=requestsecret",response.body
+  end
+  
+  def test_get_token_sequence  
+    @consumer=OAuth::Consumer.new( 
+        "key",
+        "secret",
+        {
+        :site=>"http://term.ie",
+        :request_token_path=>"/oauth/example/request_token.php",
+        :access_token_path=>"/oauth/example/access_token.php",
+        :authorize_path=>"/oauth/example/authorize.php"
+        })
+    
+    @address@hidden
+    assert_not_nil @request_token
+    assert_equal "requestkey",@request_token.token
+    assert_equal "requestsecret",@request_token.secret
+    assert_equal "http://term.ie/oauth/example/authorize.php?oauth_token=requestkey",@request_token.authorize_url
+
+    @address@hidden
+    assert_not_nil @access_token
+    assert_equal "accesskey",@access_token.token
+    assert_equal "accesssecret",@access_token.secret
+    
+    @address@hidden("/oauth/example/echo_api.php?ok=hello&test=this")
+    assert_not_nil @response
+    assert_equal "200",@response.code
+    assert_equal( "ok=hello&test=this",@response.body)
+    
+    @address@hidden("/oauth/example/echo_api.php",{'ok'=>'hello','test'=>'this'})
+    assert_not_nil @response
+    assert_equal "200",@response.code
+    assert_equal( "ok=hello&test=this",@response.body)    
+  end
+  protected
+
+  def request_parameters_to_s
+    @request_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
+  end
+
+  
+end
+

Added: trunk/vendor/plugins/oauth/test/test_helper.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_helper.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_helper.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,7 @@
+require 'test/unit'
+require File.dirname(__FILE__) + '/../lib/oauth'
+
+def requests(request)
+  Marshal.load(File.read(File.dirname(__FILE__) + '/fixtures/' + request))
+end
+

Added: trunk/vendor/plugins/oauth/test/test_hmac_sha1.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_hmac_sha1.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_hmac_sha1.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,21 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+require 'oauth/signature/hmac/sha1'
+
+class TestSignatureHmacSha1 < Test::Unit::TestCase
+  def test_that_hmac_sha1_implements_hmac_sha1
+    assert OAuth::Signature.available_methods.include?('hmac-sha1')
+  end
+
+  def test_that_get_request_from_oauth_test_cases_produces_matching_signature
+    request = Net::HTTP::Get.new('/photos?file=vacation.jpg&size=original&oauth_version=1.0&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_token=nnch734d00sl2jdk&oauth_timestamp=1191242096&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1')
+
+    consumer = OAuth::Consumer.new('dpf43f3p2l4k3l03', 'kd94hf93k423kf44')
+    token = OAuth::Token.new('nnch734d00sl2jdk', 'pfkkdhi9sl3r4s00')
+
+    signature = OAuth::Signature.sign(request, { :consumer => consumer,
+                                                 :token => token,
+                                                 :uri => 'http://photos.example.net/photos' } )
+
+    assert_equal 'tR3+Ty81lMeYAr/Fid0kMTYa/WM=', signature
+  end
+end

Added: trunk/vendor/plugins/oauth/test/test_net_http_client.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_net_http_client.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_net_http_client.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,139 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+require 'oauth/client/net_http'
+
+class NetHTTPClientTest < Test::Unit::TestCase
+
+  def setup
+    @consumer = OAuth::Consumer.new('consumer_key_86cad9', '5888bf0345e5d237')
+    @token = OAuth::Token.new('token_411a7f', '3196ffd991c8ebdb')
+    @request_uri = URI.parse('http://example.com/test?key=value')
+    @request_parameters = { 'key' => 'value' }
+    @nonce = 225579211881198842005988698334675835446
+    @timestamp = "1199645624"
+    @http = Net::HTTP.new(@request_uri.host, @request_uri.port)
+  end
+
+  def test_that_using_auth_headers_on_get_requests_works
+    request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
+    request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
+    
+    assert_equal 'GET', request.method
+    assert_equal '/test?key=value', request.path
+    assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"1oO2izFav1GP4kEH2EskwXkCRFg%3D\", oauth_version=\"1.0\"", request['authorization']
+  end
+
+  def test_that_using_auth_headers_on_post_requests_works
+    request = Net::HTTP::Post.new(@request_uri.path)
+    request.set_form_data( @request_parameters )
+    request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
+
+    assert_equal 'POST', request.method
+    assert_equal '/test', request.path
+    assert_equal 'key=value', request.body
+    assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"", request['authorization']
+  end
+ 
+  def test_that_using_post_params_works
+    request = Net::HTTP::Post.new(@request_uri.path)
+    request.set_form_data( @request_parameters )
+    request.oauth!(@http, @consumer, @token, {:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp})
+
+    assert_equal 'POST', request.method
+    assert_equal '/test', request.path
+    assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=26g7wHTtNO6ZWJaLltcueppHYiI%3d&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
+    assert_equal nil, request['authorization']
+  end
+
+  def test_that_using_get_params_works
+    request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
+    request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp})
+
+    assert_equal 'GET', request.method
+    uri = URI.parse(request.path)
+    assert_equal '/test', uri.path
+    assert_equal nil, uri.fragment
+    assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=1oO2izFav1GP4kEH2EskwXkCRFg%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", uri.query.split("&").sort.join("&")
+    assert_equal nil, request['authorization']
+  end
+
+  def test_that_using_get_params_works_with_post_requests
+    request = Net::HTTP::Post.new(@request_uri.path + "?" + request_parameters_to_s)
+    request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp})
+
+    assert_equal 'POST', request.method
+    uri = URI.parse(request.path)
+    assert_equal '/test', uri.path
+    assert_equal nil, uri.fragment
+    assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=26g7wHTtNO6ZWJaLltcueppHYiI%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", uri.query.split("&").sort.join('&')
+    assert_equal nil, request.body
+    assert_equal nil, request['authorization']
+  end
+
+  def test_that_using_get_params_works_with_post_requests_that_have_post_bodies
+    request = Net::HTTP::Post.new(@request_uri.path + "?" + request_parameters_to_s)
+    request.set_form_data( { 'key2' => 'value2' } )
+    request.oauth!(@http, @consumer, @token, {:scheme => :query_string, :nonce => @nonce, :timestamp => @timestamp})
+
+    assert_equal 'POST', request.method
+    uri = URI.parse(request.path)
+    assert_equal '/test', uri.path
+    assert_equal nil, uri.fragment
+    assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=4kSU8Zd1blWo3W6qJH7eaRTMkg0%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", uri.query.split("&").sort.join('&')
+    assert_equal "key2=value2", request.body
+    assert_equal nil, request['authorization']
+  end
+  
+  
+  def test_example_from_specs
+    consumer=OAuth::Consumer.new("dpf43f3p2l4k3l03","kd94hf93k423kf44")
+    token = OAuth::Token.new('nnch734d00sl2jdk', 'pfkkdhi9sl3r4s00')
+    request_uri = URI.parse('http://photos.example.net/photos?file=vacation.jpg&size=original')
+    nonce = 'kllo9940pd9333jh'
+    timestamp = "1191242096"
+    http = Net::HTTP.new(request_uri.host, request_uri.port)
+
+    request = Net::HTTP::Get.new(request_uri.path + "?" + request_uri.query)
+    signature_base_string=request.signature_base_string(http, consumer, token, {:nonce => nonce, :timestamp => timestamp})
+    assert_equal 'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal',signature_base_string
+
+#    request = Net::HTTP::Get.new(request_uri.path + "?" + request_uri.query)
+    request.oauth!(http, consumer, token, {:nonce => nonce, :timestamp => timestamp,:realm=>"http://photos.example.net/"})
+
+    assert_equal 'GET', request.method
+    assert_equal 'OAuth realm="http://photos.example.net/", oauth_nonce="kllo9940pd9333jh", oauth_signature_method="HMAC-SHA1", oauth_token="nnch734d00sl2jdk", oauth_timestamp="1191242096", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", oauth_version="1.0"', request['authorization']
+    
+  end
+  
+  def test_step_by_step_token_request
+    consumer=OAuth::Consumer.new( 
+        "key",
+        "secret")
+    request_uri = URI.parse('http://term.ie/oauth/example/request_token.php')
+    nonce = rand(2**128).to_s
+    timestamp = Time.now.to_i.to_s
+    http = Net::HTTP.new(request_uri.host, request_uri.port)
+ 
+    request = Net::HTTP::Get.new(request_uri.path)
+    signature_base_string=request.signature_base_string(http, consumer, nil, {:scheme=>:query_string,:nonce => nonce, :timestamp => timestamp})
+    assert_equal "GET&http%3A%2F%2Fterm.ie%2Foauth%2Fexample%2Frequest_token.php&oauth_consumer_key%3Dkey%26oauth_nonce%3D#{nonce}%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D#{timestamp}%26oauth_token%3D%26oauth_version%3D1.0",signature_base_string
+ 
+#    request = Net::HTTP::Get.new(request_uri.path)
+    request.oauth!(http, consumer, nil, {:scheme=>:query_string,:nonce => nonce, :timestamp => timestamp})
+    assert_equal 'GET', request.method
+    assert_nil request.body
+    assert_nil request['authorization']
+#    assert_equal 'OAuth oauth_nonce="kllo9940pd9333jh", oauth_signature_method="HMAC-SHA1", oauth_token="", oauth_timestamp="'+timestamp+'", oauth_consumer_key="key", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", oauth_version="1.0"', request['authorization']
+
+    response=http.request(request)
+    assert_equal "200",response.code
+#    assert_equal request['authorization'],response.body
+    assert_equal "oauth_token=requestkey&oauth_token_secret=requestsecret",response.body
+  end
+
+  protected
+
+    def request_parameters_to_s
+      @request_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
+    end
+
+end

Added: trunk/vendor/plugins/oauth/test/test_net_http_request_proxy.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_net_http_request_proxy.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_net_http_request_proxy.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,38 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+require 'oauth/request_proxy/net_http'
+
+class NetHTTPRequestProxyTest < Test::Unit::TestCase
+
+  def test_that_proxy_simple_get_request_works
+    request = Net::HTTP::Get.new('/test?key=value')
+    request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test?key=value'})
+
+    expected_parameters = {'key' => ['value']}
+    assert_equal expected_parameters, request_proxy.parameters
+    assert_equal 'http://example.com/test', request_proxy.uri
+    assert_equal 'GET', request_proxy.method
+  end
+
+  def test_that_proxy_simple_post_request_works
+    request = Net::HTTP::Post.new('/test')
+    params = {'key' => 'value'}
+    request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test', :parameters => params})
+
+    expected_parameters = {'key' => ['value']}
+    assert_equal expected_parameters, request_proxy.parameters
+    assert_equal 'http://example.com/test', request_proxy.uri
+    assert_equal 'POST', request_proxy.method
+  end
+
+  def test_that_proxy_post_and_get_request_works
+    request = Net::HTTP::Post.new('/test?key=value')
+    params = {'key2' => 'value2'}
+    request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test?key=value', :parameters => params})
+
+    expected_parameters = {'key' => ['value'], 'key2' => ['value2']}
+    assert_equal expected_parameters, request_proxy.parameters
+    assert_equal 'http://example.com/test', request_proxy.uri
+    assert_equal 'POST', request_proxy.method
+  end
+
+end

Added: trunk/vendor/plugins/oauth/test/test_rack_request_proxy.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_rack_request_proxy.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_rack_request_proxy.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,40 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+require 'oauth/request_proxy/rack_request'
+require 'rack/request'
+require 'rack/mock'
+
+class RackRequestProxyTest < Test::Unit::TestCase
+
+  def test_that_proxy_simple_get_request_works
+    request = Rack::Request.new(Rack::MockRequest.env_for('http://example.com/test?key=value'))
+    request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test?key=value'})
+
+    expected_parameters = {'key' => 'value'}
+    assert_equal expected_parameters, request_proxy.parameters
+    assert_equal 'http://example.com/test', request_proxy.uri
+    assert_equal 'GET', request_proxy.method
+  end
+
+  def test_that_proxy_simple_post_request_works
+    request = Rack::Request.new(Rack::MockRequest.env_for('http://example.com/test', :method => 'POST'))
+    params = {'key' => 'value'}
+    request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test', :parameters => params})
+
+    expected_parameters = {'key' => 'value'}
+    assert_equal expected_parameters, request_proxy.parameters
+    assert_equal 'http://example.com/test', request_proxy.uri
+    assert_equal 'POST', request_proxy.method
+  end
+
+  def test_that_proxy_post_and_get_request_works
+    request = Rack::Request.new(Rack::MockRequest.env_for('http://example.com/test?key=value', :method => 'POST', :input => 'key2=value2'))
+    params = {'key2' => 'value2'}
+    request_proxy = OAuth::RequestProxy.proxy(request, {:uri => 'http://example.com/test?key=value', :parameters => params})
+
+    expected_parameters = {'key' => 'value', 'key2' => 'value2'}
+    assert_equal expected_parameters, request_proxy.parameters
+    assert_equal 'http://example.com/test', request_proxy.uri
+    assert_equal 'POST', request_proxy.method
+  end
+
+end

Added: trunk/vendor/plugins/oauth/test/test_server.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_server.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_server.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,40 @@
+require 'test/unit'
+require 'oauth/server'
+class ServerTest < Test::Unit::TestCase
+  def setup
+    @server=OAuth::Server.new "http://test.com"
+  end
+  
+  def test_default_paths
+    assert_equal "/oauth/request_token",@server.request_token_path
+    assert_equal "/oauth/authorize",@server.authorize_path
+    assert_equal "/oauth/access_token",@server.access_token_path
+  end
+  
+  def test_default_urls
+    assert_equal "http://test.com/oauth/request_token",@server.request_token_url
+    assert_equal "http://test.com/oauth/authorize",@server.authorize_url
+    assert_equal "http://test.com/oauth/access_token",@server.access_token_url
+  end
+  
+  def test_generate_consumer_credentials
+    address@hidden
+    assert_not_nil consumer.key
+    assert_not_nil consumer.secret
+  end
+
+  def test_create_consumer
+    @address@hidden
+    assert_not_nil @consumer
+    assert_not_nil @consumer.key
+    assert_not_nil @consumer.secret
+    assert_equal "http://test.com",@consumer.site
+    assert_equal "/oauth/request_token",@consumer.request_token_path
+    assert_equal "/oauth/authorize",@consumer.authorize_path
+    assert_equal "/oauth/access_token",@consumer.access_token_path
+    assert_equal "http://test.com/oauth/request_token",@consumer.request_token_url
+    assert_equal "http://test.com/oauth/authorize",@consumer.authorize_url
+    assert_equal "http://test.com/oauth/access_token",@consumer.access_token_url
+  end  
+  
+end

Added: trunk/vendor/plugins/oauth/test/test_signature.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_signature.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_signature.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,11 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+
+class TestOauth < Test::Unit::TestCase
+
+  def setup
+  end
+  
+  def test_truth
+    assert true
+  end
+end

Added: trunk/vendor/plugins/oauth/test/test_signature_base.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_signature_base.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_signature_base.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,32 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+require 'oauth/signature/base'
+require 'net/http'
+class SignatureBaseTest < Test::Unit::TestCase
+
+  def test_that_initialize_requires_one_request_argument
+    assert_raises ArgumentError do
+      OAuth::Signature::Base.new()
+    end
+  end
+
+  def test_that_initialize_requires_a_valid_request_argument
+    request = nil
+    assert_raises TypeError do
+      OAuth::Signature::Base.new(request) { |token|
+        # just a stub
+      }
+    end
+  end
+
+  def test_that_initialize_succeeds_when_the_request_proxy_is_valid
+    # this isn't quite valid, but it will do.
+    raw_request = Net::HTTP::Get.new('/test')
+    request = OAuth::RequestProxy.proxy(raw_request)
+    assert_nothing_raised do
+      OAuth::Signature::Base.new(request) { |token|
+        # just a stub
+      }
+    end
+  end
+
+end

Added: trunk/vendor/plugins/oauth/test/test_token.rb (0 => 2864)


--- trunk/vendor/plugins/oauth/test/test_token.rb	                        (rev 0)
+++ trunk/vendor/plugins/oauth/test/test_token.rb	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,14 @@
+require File.dirname(__FILE__) + '/test_helper.rb'
+require 'oauth/token'
+
+class TestToken < Test::Unit::TestCase
+
+  def setup
+  end
+  
+  def test_token_constructor_produces_valid_token
+    token = OAuth::Token.new('xyz', '123')
+    assert_equal 'xyz', token.token
+    assert_equal '123', token.secret
+  end
+end

Added: trunk/vendor/plugins/oauth/website/index.html (0 => 2864)


--- trunk/vendor/plugins/oauth/website/index.html	                        (rev 0)
+++ trunk/vendor/plugins/oauth/website/index.html	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <link rel="stylesheet" href="" type="text/css" media="screen" />
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>
+      Ruby OAuth GEM
+  </title>
+  <script src="" type="text/_javascript_"></script>
+<style>
+
+</style>
+  <script type="text/_javascript_">
+    window. {
+      settings = {
+          tl: { radius: 10 },
+          tr: { radius: 10 },
+          bl: { radius: 10 },
+          br: { radius: 10 },
+          antiAlias: true,
+          autoPad: true,
+          validTags: ["div"]
+      }
+      var versionBox = new curvyCorners(settings, document.getElementById("version"));
+      versionBox.applyCornersToAll();
+    }
+  </script>
+</head>
+<body>
+<div id="main">
+
+    <h1>Ruby OAuth GEM</h1>
+    <div id="version" class="clickable" >
+      <p>Get Version</p>
+      <a href="" class="numbers">0.2.3</a>
+    </div>
+    <h2>What</h2>
+
+
+	<p>This is a RubyGem for implementing both OAuth clients and servers in Ruby applications.</p>
+
+
+	<p>See the <a href="" specs</a></p>
+
+
+	<h2>Installing</h2>
+
+
+	<p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">oauth</span></pre></p>
+
+
+	<p>You can also install it from the <a href="" rubyforge project</a>.</p>
+
+
+	<h2>The basics</h2>
+
+
+	<p>This is a ruby library which is intended to be used in creating Ruby Consumer and Service Provider applications. It is <span class="caps">NOT</span> a Rails plugin, but could easily be used for the foundation for such a Rails plugin.</p>
+
+
+	<p>As a matter of fact it has been pulled out from an <a href="" Rails Plugin</a> which now requires this <span class="caps">GEM</span>.</p>
+
+
+	<h2>Demonstration of usage</h2>
+
+
+	<p>Create a new consumer instance by passing it a configuration hash:</p>
+
+
+<pre><code>@consumer=OAuth::Consumer.new( "key","secret", {
+    :site=&gt;"https://agree2" 
+    })</code></pre>
+
+	<p>Start the process by requesting a token</p>
+
+
+<pre><code>@address@hidden
+session[:address@hidden
+redirect_to @request_token.authorize_url</code></pre>
+
+	<p>When user returns create an access_token</p>
+
+
+<pre><code>@address@hidden
address@hidden@access_token.get('/photos.xml')</code></pre>
+
+	<p>For more detailed instructions I have written this <a href="" Client Tutorial</a> and <a href="" to turn your rails site into an OAuth Provider</a>.</p>
+
+
+	<p>Finally be sure to check out the <a href="" RDoc Manual</a>.</p>
+
+
+	<h2>Documentation Wiki</h2>
+
+
+	<p>There is some documentation on the Google Code project for the <a href="" Rails Plugin</a> :</p>
+
+
+	<ul>
+	<li><a href=""
+		<li><a href=""
+	</ul>
+
+
+	<h2>Forum</h2>
+
+
+	<p><a href=""
+
+
+	<h2>How to submit patches</h2>
+
+
+	<p>Read the <a href="" steps for fixing other people&#8217;s code</a> and for section <a href="" Submit patch to Google Groups</a>, use the Google Group above.</p>
+
+
+	<p>The trunk repository is <code>http://oauth.rubyforge.org/svn/trunk/</code> for anonymous access.</p>
+
+
+	<h2>License</h2>
+
+
+	<p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
+
+
+	<h2>Contact</h2>
+
+
+	<p>Comments are welcome. Send an email to <a href="" Braendgaard</a> email via the <a href="" Ruby mailing list</a></p>
+    <p class="coda">
+      <a href="" email">FIXME full name</a>, 25th February 2008<br>
+      Theme extended from <a href="" Battley</a>
+    </p>
+</div>
+
+<!-- insert site tracking codes here, like Google Urchin -->
+
+</body>
+</html>

Added: trunk/vendor/plugins/oauth/website/index.txt (0 => 2864)


--- trunk/vendor/plugins/oauth/website/index.txt	                        (rev 0)
+++ trunk/vendor/plugins/oauth/website/index.txt	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,69 @@
+h1. Ruby OAuth GEM
+
+h2. What
+
+This is a RubyGem for implementing both OAuth clients and servers in Ruby applications.
+
+See the "OAuth specs":http://oauth.net/core/1.0/
+
+h2. Installing
+
+<pre syntax="ruby">sudo gem install oauth</pre>
+
+You can also install it from the "oauth rubyforge project":http://rubyforge.org/projects/oauth/.
+
+h2. The basics
+
+This is a ruby library which is intended to be used in creating Ruby Consumer and Service Provider applications. It is NOT a Rails plugin, but could easily be used for the foundation for such a Rails plugin.
+
+As a matter of fact it has been pulled out from an "OAuth Rails Plugin":http://code.google.com/p/oauth-plugin/ which now requires this GEM.
+
+h2. Demonstration of usage
+
+Create a new consumer instance by passing it a configuration hash:
+
+<pre><code>@consumer=OAuth::Consumer.new( "key","secret", {
+    :site=>"https://agree2"
+    })</code></pre>
+
+Start the process by requesting a token
+
+<pre><code>@address@hidden
+session[:address@hidden
+redirect_to @request_token.authorize_url</code></pre>
+
+When user returns create an access_token
+
+<pre><code>@address@hidden
address@hidden@access_token.get('/photos.xml')</code></pre>
+
+For more detailed instructions I have written this "OAuth Client Tutorial":http://stakeventures.com/articles/2008/02/23/developing-oauth-clients-in-ruby and "How to turn your rails site into an OAuth Provider ":http://stakeventures.com/articles/2007/11/26/how-to-turn-your-rails-site-into-an-oauth-provider.
+
+Finally be sure to check out the "OAuth RDoc Manual":http://oauth.rubyforge.org/rdoc/.
+
+h2. Documentation Wiki
+
+There is some documentation on the Google Code project for the "OAuth Rails Plugin":http://code.google.com/p/oauth-plugin/ :
+
+* "RequestToken":http://code.google.com/p/oauth-plugin/wiki/RequestToken
+* "AccessToken":http://code.google.com/p/oauth-plugin/wiki/AccessToken
+
+h2. Forum
+
+"http://groups.google.com/group/oauth-ruby":http://groups.google.com/group/oauth-ruby
+
+
+h2. How to submit patches
+
+Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
+
+The trunk repository is <code>http://oauth.rubyforge.org/svn/trunk/</code> for anonymous access.
+
+h2. License
+
+This code is free to use under the terms of the MIT license. 
+
+h2. Contact
+
+Comments are welcome. Send an email to "Pelle Braendgaard":mailto:address@hidden email via the "OAuth Ruby mailing list":http://groups.google.com/group/oauth-ruby
+

Added: trunk/vendor/plugins/oauth/website/_javascript_s/rounded_corners_lite.inc.js (0 => 2864)


--- trunk/vendor/plugins/oauth/website/_javascript_s/rounded_corners_lite.inc.js	                        (rev 0)
+++ trunk/vendor/plugins/oauth/website/_javascript_s/rounded_corners_lite.inc.js	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,285 @@
+
+ /****************************************************************
+  *                                                              *
+  *  curvyCorners                                                *
+  *  ------------                                                *
+  *                                                              *
+  *  This script generates rounded corners for your divs.        *
+  *                                                              *
+  *  Version 1.2.9                                               *
+  *  Copyright (c) 2006 Cameron Cooke                            *
+  *  By: Cameron Cooke and Tim Hutchison.                        *
+  *                                                              *
+  *                                                              *
+  *  Website: http://www.curvycorners.net                        *
+  *  Email:   address@hidden                             *
+  *  Forum:   http://www.curvycorners.net/forum/                 *
+  *                                                              *
+  *                                                              *
+  *  This library is free software; you can redistribute         *
+  *  it and/or modify it under the terms of the GNU              *
+  *  Lesser General Public License as published by the           *
+  *  Free Software Foundation; either version 2.1 of the         *
+  *  License, or (at your option) any later version.             *
+  *                                                              *
+  *  This library is distributed in the hope that it will        *
+  *  be useful, but WITHOUT ANY WARRANTY; without even the       *
+  *  implied warranty of MERCHANTABILITY or FITNESS FOR A        *
+  *  PARTICULAR PURPOSE. See the GNU Lesser General Public       *
+  *  License for more details.                                   *
+  *                                                              *
+  *  You should have received a copy of the GNU Lesser           *
+  *  General Public License along with this library;             *
+  *  Inc., 59 Temple Place, Suite 330, Boston,                   *
+  *  MA 02111-1307 USA                                           *
+  *                                                              *
+  ****************************************************************/
+  
+var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1; var isMoz = document.implementation && document.implementation.createDocument; var isSafari = ((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false; function curvyCorners()
+{ if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object."); if(typeof(arguments[1]) != "object" && typeof(arguments[1]) != "string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name."); if(typeof(arguments[1]) == "string")
+{ var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
+else
+{ var startIndex = 1; var boxCol = arguments;}
+var curvyCornersCol = new Array(); if(arguments[0].validTags)
+var validElements = arguments[0].validTags; else
+var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
+{ var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
+{ curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
+}
+this.objects = curvyCornersCol; this.applyCornersToAll = function()
+{ for(var x = 0, k = this.objects.length; x < k; x++)
+{ this.objects[x].applyCorners();}
+}
+}
+function curvyObject()
+{ this.box = arguments[1]; this.settings = arguments[0]; this.topContainer = null; this.bottomContainer = null; this.masterCorners = new Array(); this.contentDIV = null; var boxHeight = get_style(this.box, "height", "height"); var boxWidth = get_style(this.box, "width", "width"); var borderWidth = get_style(this.box, "borderTopWidth", "border-top-width"); var borderColour = get_style(this.box, "borderTopColor", "border-top-color"); var boxColour = get_style(this.box, "backgroundColor", "background-color"); var backgroundImage = get_style(this.box, "backgroundImage", "background-image"); var boxPosition = get_style(this.box, "position", "position"); var boxPadding = get_style(this.box, "paddingTop", "padding-top"); this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight)); this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth)); this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1)? borderWidth.slice(0, borderWidth.indexOf("px")) : 0)); this.boxColour = format_colour(boxColour); this.boxPadding = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0, boxPadding.indexOf("px")) : 0)); this.borderColour = format_colour(borderColour); this.borderString = this.borderWidth + "px" + " solid " + this.borderColour; this.backgroundImage = ((backgroundImage != "none")? backgroundImage : ""); this.boxContent = this.box.innerHTML; if(boxPosition != "absolute") this.box.style.position = "relative"; this.box.style.padding = "0px"; if(isIE && boxWidth == "auto" && boxHeight == "auto") this.box.style.width = "100%"; if(this.settings.autoPad == true && this.boxPadding > 0)
+this.box.innerHTML = ""; this.applyCorners = function()
+{ for(var t = 0; t < 2; t++)
+{ switch(t)
+{ case 0:
+if(this.settings.tl || this.settings.tr)
+{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0); newMainContainer.style.height = topMaxRadius + "px"; newMainContainer.style.top = 0 - topMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.topContainer = this.box.appendChild(newMainContainer);}
+break; case 1:
+if(this.settings.bl || this.settings.br)
+{ var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0); newMainContainer.style.height = botMaxRadius + "px"; newMainContainer.style.bottom = 0 - botMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.bottomContainer = this.box.appendChild(newMainContainer);}
+break;}
+}
+if(this.topContainer) this.box.style.borderTopWidth = "0px"; if(this.bottomContainer) this.box.style.borderBottomWidth = "0px"; var corners = ["tr", "tl", "br", "bl"]; for(var i in corners)
+{ if(i > -1 < 4)
+{ var cc = corners[i]; if(!this.settings[cc])
+{ if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
+{ var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
+newCorner.style.backgroundColor = this.boxColour; else
+newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
+{ case "tl":
+newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.tr.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.left = -this.borderWidth + "px"; break; case "tr":
+newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.tl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; newCorner.style.left = this.borderWidth + "px"; break; case "bl":
+newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.br.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = -this.borderWidth + "px"; newCorner.style.backgroundPosition = "-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break; case "br":
+newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.bl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = this.borderWidth + "px"
+newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
+}
+}
+else
+{ if(this.masterCorners[this.settings[cc].radius])
+{ var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
+else
+{ var newCorner = document.createElement("DIV"); newCorner.style.height = this.settings[cc].radius + "px"; newCorner.style.width = this.settings[cc].radius + "px"; newCorner.style.position = "absolute"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth); for(var intx = 0, j = this.settings[cc].radius; intx < j; intx++)
+{ if((intx +1) >= borderRadius)
+var y1 = -1; else
+var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
+{ if((intx) >= borderRadius)
+var y2 = -1; else
+var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
+var y3 = -1; else
+var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
+if((intx) >= j)
+var y4 = -1; else
+var y4 = Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2))); if(y1 > -1) this.drawPixel(intx, 0, this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius); if(borderRadius != j)
+{ for(var inty = (y1 + 1); inty < y2; inty++)
+{ if(this.settings.antiAlias)
+{ if(this.backgroundImage != "")
+{ var borderFract = (pixelFraction(intx, inty, borderRadius) * 100); if(borderFract < 30)
+{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);}
+else
+{ this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);}
+}
+else
+{ var pixelcolour = BlendColour(this.boxColour, this.borderColour, pixelFraction(intx, inty, borderRadius)); this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius, cc);}
+}
+}
+if(this.settings.antiAlias)
+{ if(y3 >= y2)
+{ if (y2 == -1) y2 = 0; this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);}
+}
+else
+{ if(y3 >= y1)
+{ this.drawPixel(intx, (y1 + 1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);}
+}
+var outsideColour = this.borderColour;}
+else
+{ var outsideColour = this.boxColour; var y3 = y1;}
+if(this.settings.antiAlias)
+{ for(var inty = (y3 + 1); inty < y4; inty++)
+{ this.drawPixel(intx, inty, outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner, ((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);}
+}
+}
+this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);}
+if(cc != "br")
+{ for(var t = 0, k = newCorner.childNodes.length; t < k; t++)
+{ var pixelBar = newCorner.childNodes[t]; var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px"))); var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px"))); var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px"))); if(cc == "tl" || cc == "bl"){ pixelBar.style.left = this.settings[cc].radius -pixelBarLeft -1 + "px";}
+if(cc == "tr" || cc == "tl"){ pixelBar.style.top = this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px";}
+switch(cc)
+{ case "tr":
+pixelBar.style.backgroundPosition = "-" + Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "tl":
+pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "bl":
+pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px"; break;}
+}
+}
+}
+if(newCorner)
+{ switch(cc)
+{ case "tl":
+if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "tr":
+if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "bl":
+if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break; case "br":
+if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break;}
+}
+}
+}
+var radiusDiff = new Array(); radiusDiff["t"] = Math.abs(this.settings.tl.radius - this.settings.tr.radius)
+radiusDiff["b"] = Math.abs(this.settings.bl.radius - this.settings.br.radius); for(z in radiusDiff)
+{ if(z == "t" || z == "b")
+{ if(radiusDiff[z])
+{ var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r"); var newFiller = document.createElement("DIV"); newFiller.style.height = radiusDiff[z] + "px"; newFiller.style.width = this.settings[smallerCornerType].radius+ "px"
+newFiller.style.position = "absolute"; newFiller.style.fontSize = "1px"; newFiller.style.overflow = "hidden"; newFiller.style.backgroundColor = this.boxColour; switch(smallerCornerType)
+{ case "tl":
+newFiller.style.bottom = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.topContainer.appendChild(newFiller); break; case "tr":
+newFiller.style.bottom = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.topContainer.appendChild(newFiller); break; case "bl":
+newFiller.style.top = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.bottomContainer.appendChild(newFiller); break; case "br":
+newFiller.style.top = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.bottomContainer.appendChild(newFiller); break;}
+}
+var newFillerBar = document.createElement("DIV"); newFillerBar.style.position = "relative"; newFillerBar.style.fontSize = "1px"; newFillerBar.style.overflow = "hidden"; newFillerBar.style.backgroundColor = this.boxColour; newFillerBar.style.backgroundImage = this.backgroundImage; switch(z)
+{ case "t":
+if(this.topContainer)
+{ if(this.settings.tl.radius && this.settings.tr.radius)
+{ newFillerBar.style.height = topMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.tl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.tr.radius - this.borderWidth + "px"; newFillerBar.style.borderTop = this.borderString; if(this.backgroundImage != "")
+newFillerBar.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; this.topContainer.appendChild(newFillerBar);}
+this.box.style.backgroundPosition = "0px -" + (topMaxRadius - this.borderWidth) + "px";}
+break; case "b":
+if(this.bottomContainer)
+{ if(this.settings.bl.radius && this.settings.br.radius)
+{ newFillerBar.style.height = botMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.bl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.br.radius - this.borderWidth + "px"; newFillerBar.style.borderBottom = this.borderString; if(this.backgroundImage != "")
+newFillerBar.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius + this.borderWidth)) + "px"; this.bottomContainer.appendChild(newFillerBar);}
+}
+break;}
+}
+}
+if(this.settings.autoPad == true && this.boxPadding > 0)
+{ var contentContainer = document.createElement("DIV"); contentContainer.style.position = "relative"; contentContainer.innerHTML = this.boxContent; contentContainer.className = "autoPadDiv"; var topPadding = Math.abs(topMaxRadius - this.boxPadding); var botPadding = Math.abs(botMaxRadius - this.boxPadding); if(topMaxRadius < this.boxPadding)
+contentContainer.style.paddingTop = topPadding + "px"; if(botMaxRadius < this.boxPadding)
+contentContainer.style.paddingBottom = botMaxRadius + "px"; contentContainer.style.paddingLeft = this.boxPadding + "px"; contentContainer.style.paddingRight = this.boxPadding + "px"; this.contentDIV = this.box.appendChild(contentContainer);}
+}
+this.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius)
+{ var pixel = document.createElement("DIV"); pixel.style.height = height + "px"; pixel.style.width = "1px"; pixel.style.position = "absolute"; pixel.style.fontSize = "1px"; pixel.style.overflow = "hidden"; var topMaxRadius = Math.max(this.settings["tr"].radius, this.settings["tl"].radius); if(image == -1 && this.backgroundImage != "")
+{ pixel.style.backgroundImage = this.backgroundImage; pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) -this.borderWidth) + "px";}
+else
+{ pixel.style.backgroundColor = colour;}
+if (transAmount != 100)
+setOpacity(pixel, transAmount); pixel.style.top = inty + "px"; pixel.style.left = intx + "px"; newCorner.appendChild(pixel);}
+}
+function insertAfter(parent, node, referenceNode)
+{ parent.insertBefore(node, referenceNode.nextSibling);}
+function BlendColour(Col1, Col2, Col1Fraction)
+{ var red1 = parseInt(Col1.substr(1,2),16); var green1 = parseInt(Col1.substr(3,2),16); var blue1 = parseInt(Col1.substr(5,2),16); var red2 = parseInt(Col2.substr(1,2),16); var green2 = parseInt(Col2.substr(3,2),16); var blue2 = parseInt(Col2.substr(5,2),16); if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1; var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction))); if(endRed > 255) endRed = 255; if(endRed < 0) endRed = 0; var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction))); if(endGreen > 255) endGreen = 255; if(endGreen < 0) endGreen = 0; var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction))); if(endBlue > 255) endBlue = 255; if(endBlue < 0) endBlue = 0; return "#" + IntToHex(endRed)+ IntToHex(endGreen)+ IntToHex(endBlue);}
+function IntToHex(strNum)
+{ base = strNum / 16; rem = strNum % 16; base = base - (rem / 16); baseS = MakeHex(base); remS = MakeHex(rem); return baseS + '' + remS;}
+function MakeHex(x)
+{ if((x >= 0) && (x <= 9))
+{ return x;}
+else
+{ switch(x)
+{ case 10: return "A"; case 11: return "B"; case 12: return "C"; case 13: return "D"; case 14: return "E"; case 15: return "F";}
+}
+}
+function pixelFraction(x, y, r)
+{ var pixelfraction = 0; var xvalues = new Array(1); var yvalues = new Array(1); var point = 0; var whatsides = ""; var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2))); if ((intersect >= y) && (intersect < (y+1)))
+{ whatsides = "Left"; xvalues[point] = 0; yvalues[point] = intersect - y; point = point + 1;}
+var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2))); if ((intersect >= x) && (intersect < (x+1)))
+{ whatsides = whatsides + "Top"; xvalues[point] = intersect - x; yvalues[point] = 1; point = point + 1;}
+var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2))); if ((intersect >= y) && (intersect < (y+1)))
+{ whatsides = whatsides + "Right"; xvalues[point] = 1; yvalues[point] = intersect - y; point = point + 1;}
+var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2))); if ((intersect >= x) && (intersect < (x+1)))
+{ whatsides = whatsides + "Bottom"; xvalues[point] = intersect - x; yvalues[point] = 0;}
+switch (whatsides)
+{ case "LeftRight":
+pixelfraction = Math.min(yvalues[0],yvalues[1]) + ((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2); break; case "TopRight":
+pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2); break; case "TopBottom":
+pixelfraction = Math.min(xvalues[0],xvalues[1]) + ((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2); break; case "LeftBottom":
+pixelfraction = (yvalues[0]*xvalues[1])/2; break; default:
+pixelfraction = 1;}
+return pixelfraction;}
+function rgb2Hex(rgbColour)
+{ try{ var rgbArray = rgb2Array(rgbColour); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); var hexColour = "#" + IntToHex(red) + IntToHex(green) + IntToHex(blue);}
+catch(e){ alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");}
+return hexColour;}
+function rgb2Array(rgbColour)
+{ var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")")); var rgbArray = rgbValues.split(", "); return rgbArray;}
+function setOpacity(obj, opacity)
+{ opacity = (opacity == 100)?99.999:opacity; if(isSafari && obj.tagName != "IFRAME")
+{ var rgbArray = rgb2Array(obj.style.backgroundColor); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity/100 + ")";}
+else if(typeof(obj.style.opacity) != "undefined")
+{ obj.style.opacity = opacity/100;}
+else if(typeof(obj.style.MozOpacity) != "undefined")
+{ obj.style.MozOpacity = opacity/100;}
+else if(typeof(obj.style.filter) != "undefined")
+{ obj.style.filter = "alpha(opacity:" + opacity + ")";}
+else if(typeof(obj.style.KHTMLOpacity) != "undefined")
+{ obj.style.KHTMLOpacity = opacity/100;}
+}
+function inArray(array, value)
+{ for(var i = 0; i < array.length; i++){ if (array[i] === value) return i;}
+return false;}
+function inArrayKey(array, value)
+{ for(key in array){ if(key === value) return true;}
+return false;}
+function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true;}
+else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r;}
+else { elm['on' + evType] = fn;}
+}
+function removeEvent(obj, evType, fn, useCapture){ if (obj.removeEventListener){ obj.removeEventListener(evType, fn, useCapture); return true;} else if (obj.detachEvent){ var r = obj.detachEvent("on"+evType, fn); return r;} else { alert("Handler could not be removed");}
+}
+function format_colour(colour)
+{ var returnColour = "#ffffff"; if(colour != "" && colour != "transparent")
+{ if(colour.substr(0, 3) == "rgb")
+{ returnColour = rgb2Hex(colour);}
+else if(colour.length == 4)
+{ returnColour = "#" + colour.substring(1, 2) + colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2, 3) + colour.substring(3, 4) + colour.substring(3, 4);}
+else
+{ returnColour = colour;}
+}
+return returnColour;}
+function get_style(obj, property, propertyNS)
+{ try
+{ if(obj.currentStyle)
+{ var returnVal = eval("obj.currentStyle." + property);}
+else
+{ if(isSafari && obj.style.display == "none")
+{ obj.style.display = ""; var wasHidden = true;}
+var returnVal = document.defaultView.getComputedStyle(obj, '').getPropertyValue(propertyNS); if(isSafari && wasHidden)
+{ obj.style.display = "none";}
+}
+}
+catch(e)
+{ }
+return returnVal;}
+function getElementsByClass(searchClass, node, tag)
+{ var classElements = new Array(); if(node == null)
+node = document; if(tag == null)
+tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)"); for (i = 0, j = 0; i < elsLen; i++)
+{ if(pattern.test(els[i].className))
+{ classElements[j] = els[i]; j++;}
+}
+return classElements;}
+function newCurvyError(errorMessage)
+{ return new Error("curvyCorners Error:\n" + errorMessage)
+}

Added: trunk/vendor/plugins/oauth/website/stylesheets/screen.css (0 => 2864)


--- trunk/vendor/plugins/oauth/website/stylesheets/screen.css	                        (rev 0)
+++ trunk/vendor/plugins/oauth/website/stylesheets/screen.css	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,138 @@
+body {
+  background-color: #E1D1F1;
+  font-family: "Georgia", sans-serif;
+  font-size: 16px;
+  line-height: 1.6em;
+  padding: 1.6em 0 0 0;
+  color: #333;
+}
+h1, h2, h3, h4, h5, h6 {
+  color: #444;
+}
+h1 { 
+  font-family: sans-serif;
+  font-weight: normal;
+  font-size: 4em;
+  line-height: 0.8em;
+  letter-spacing: -0.1ex;
+	margin: 5px;
+}
+li {
+  padding: 0;
+  margin: 0;
+  list-style-type: square;
+}
+a {
+  color: #5E5AFF;
+	background-color: #DAC;
+  font-weight: normal;
+  text-decoration: underline;
+}
+blockquote {
+  font-size: 90%;
+  font-style: italic;
+  border-left: 1px solid #111;
+  padding-left: 1em;
+}
+.caps {
+  font-size: 80%;
+}
+
+#main {
+  width: 45em;
+  padding: 0;
+  margin: 0 auto;
+}
+.coda {
+  text-align: right;
+  color: #77f;
+  font-size: smaller;
+}
+
+table {
+  font-size: 90%;
+  line-height: 1.4em;
+  color: #ff8;
+  background-color: #111;
+  padding: 2px 10px 2px 10px;
+	border-style: dashed;
+}
+
+th {
+	color: #fff;
+}
+
+td {
+  padding: 2px 10px 2px 10px;
+}
+
+.success {
+	color: #0CC52B;
+}
+
+.failed {
+	color: #E90A1B;
+}
+
+.unknown {
+	color: #995000;
+}
+pre, code {
+  font-family: monospace;
+  font-size: 90%;
+  line-height: 1.4em;
+  color: #ff8;
+  background-color: #111;
+  padding: 2px 10px 2px 10px;
+}
+.comment { color: #aaa; font-style: italic; }
+.keyword { color: #eff; font-weight: bold; }
+.punct { color: #eee; font-weight: bold; }
+.symbol { color: #0bb; }
+.string { color: #6b4; }
+.ident { color: #ff8; }
+.constant { color: #66f; }
+.regex { color: #ec6; }
+.number { color: #F99; }
+.expr { color: #227; }
+
+#version {
+  float: right;
+  text-align: right;
+  font-family: sans-serif;
+  font-weight: normal;
+  background-color: #B3ABFF;
+  color: #141331;
+  padding: 15px 20px 10px 20px;
+  margin: 0 auto;
+	margin-top: 15px;
+  border: 3px solid #141331;
+}
+
+#version .numbers {
+  display: block;
+  font-size: 4em;
+  line-height: 0.8em;
+  letter-spacing: -0.1ex;
+	margin-bottom: 15px;
+}
+
+#version p {
+  text-decoration: none;
+	color: #141331;
+	background-color: #B3ABFF;
+	margin: 0;
+	padding: 0;
+}
+
+#version a {
+  text-decoration: none;
+	color: #141331;
+	background-color: #B3ABFF;
+}
+
+.clickable {
+	cursor:	pointer; 
+	cursor:	hand;
+}
+

Added: trunk/vendor/plugins/oauth/website/template.rhtml (0 => 2864)


--- trunk/vendor/plugins/oauth/website/template.rhtml	                        (rev 0)
+++ trunk/vendor/plugins/oauth/website/template.rhtml	2011-12-06 10:46:58 UTC (rev 2864)
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <link rel="stylesheet" href="" type="text/css" media="screen" />
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+  <title>
+      <%= title %>
+  </title>
+  <script src="" type="text/_javascript_"></script>
+<style>
+
+</style>
+  <script type="text/_javascript_">
+    window. {
+      settings = {
+          tl: { radius: 10 },
+          tr: { radius: 10 },
+          bl: { radius: 10 },
+          br: { radius: 10 },
+          antiAlias: true,
+          autoPad: true,
+          validTags: ["div"]
+      }
+      var versionBox = new curvyCorners(settings, document.getElementById("version"));
+      versionBox.applyCornersToAll();
+    }
+  </script>
+</head>
+<body>
+<div id="main">
+
+    <h1><%= title %></h1>
+    <div id="version" class="clickable" >
+      <p>Get Version</p>
+      <a href="" download %>" class="numbers"><%= version %></a>
+    </div>
+    <%= body %>
+    <p class="coda">
+      <a href="" email">FIXME full name</a>, <%= modified.pretty %><br>
+      Theme extended from <a href="" Battley</a>
+    </p>
+</div>
+
+<!-- insert site tracking codes here, like Google Urchin -->
+
+</body>
+</html>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]