<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>db/migrate/20090216032013_add_twitter_consumer_creds_preferences.rb</filename>
    </added>
    <added>
      <filename>public/images/twitter.gif</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -4,6 +4,54 @@ class ReqsController &lt; ApplicationController
   before_filter :login_or_oauth_required, :only =&gt; [:show, :index]
   before_filter :correct_person_and_no_accept_required, :only =&gt; [ :edit, :update ]
   before_filter :correct_person_and_no_commitment_required, :only =&gt; [ :destroy ]
+  before_filter :twitter_oauth_setup, :only =&gt; [:twitter_oauth_client, :twitter_oauth_callback]
+
+  def twitter_oauth_client
+    @request_token = @consumer.get_request_token
+    session[:req_token] = @request_token.token
+    session[:req_token_secret] = @request_token.secret
+    redirect_to @request_token.authorize_url
+    return
+  end
+
+  def twitter_oauth_callback
+    require 'json'
+    @request_token = OAuth::RequestToken.new(@consumer,session[:req_token],session[:req_token_secret])
+    @access_token = @request_token.get_access_token
+    @resp = @consumer.request(:get, '/account/verify_credentials.json', @access_token, {:scheme =&gt; :query_string})
+    case @resp
+    when Net::HTTPSuccess
+      user_info = JSON.parse(@resp.body)
+      unless user_info['screen_name']
+        flash[:error] = &quot;Authentication failed&quot;
+        redirect_to :action =&gt; :index
+        return
+      end
+
+      changed = update_screen_name( user_info['screen_name'] )
+      if changed
+        system_twitter = global_prefs.twitter_name
+        response = @access_token.post(&quot;/friendships/create/#{system_twitter}.json&quot;,&quot;&quot;)
+        case response 
+        when Net::HTTPSuccess
+          follow(user_info['screen_name'])
+          flash[:notice] = &quot;You are following requests on Twitter!&quot; 
+          redirect_to :action =&gt; :index
+        else
+          flash[:error] = &quot;Authentication failed&quot;
+          redirect_to :action =&gt; :index
+        end
+        return
+      end
+
+    else
+        flash[:error] = &quot;Authentication failed&quot;
+        redirect_to :action =&gt; :index
+        return
+    end
+
+  end
+
   # GET /reqs
   # GET /reqs.xml
   def index
@@ -108,6 +156,48 @@ class ReqsController &lt; ApplicationController
 
   private
 
+  def update_screen_name(screen_name)
+    changed = false
+
+    if current_person.twitter_name.blank?
+      current_person.twitter_name = screen_name
+      current_person.save!
+      flash[:notice] = &quot;Your Twitter name has been set to #{screen_name}&quot;
+      changed = true
+    else
+      if current_person.twitter_name != screen_name
+        current_person.twitter_name = screen_name
+        current_person.save!
+        logger.info &quot;#{current_person.name} changing twitter from #{current_person.twitter_name} to #{screen_name}&quot;
+        flash[:notice] = &quot;Your Twitter has been changed from #{current_person.twitter_name} to #{screen_name}&quot;
+        changed = true
+      end
+    end
+
+    changed
+  end
+  
+  def twitter_oauth_setup
+    require 'oauth'
+    require 'oauth/consumer'
+    @consumer_key = global_prefs.twitter_oauth_consumer_key
+    @consumer_secret = global_prefs.plaintext_twitter_oauth_consumer_secret
+    @consumer = OAuth::Consumer.new(@consumer_key, @consumer_secret, { :site =&gt; &quot;http://twitter.com&quot; })
+  end
+
+  def follow(twitter_id)
+    twitter_name = global_prefs.twitter_name
+    twitter_password = global_prefs.plaintext_twitter_password
+    twitter_api = global_prefs.twitter_api
+
+    twit = Twitter::Base.new(twitter_name,twitter_password, :api_host =&gt; twitter_api )
+    begin
+      twit.create_friendship(twitter_id)
+    rescue Twitter::CantConnect =&gt; e
+      logger.info &quot;ERROR Twitter::CantConnect for [#{twitter_id}] (&quot; + e.to_s + &quot;)&quot;
+    end
+  end
+
   def correct_person_and_no_accept_required
     request = Req.find(params[:id])
     redirect_to home_url unless request.person == current_person</diff>
      <filename>app/controllers/reqs_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -18,19 +18,23 @@
 #
 
 class Preference &lt; ActiveRecord::Base
-  attr_accessor :twitter_password
+  attr_accessor :twitter_password,
+                :twitter_oauth_consumer_secret
   attr_accessible :app_name, :server_name, :domain, :smtp_server, 
                   :exception_notification,
                   :email_notifications, :email_verifications, :analytics,
                   :about, :demo, :whitelist, :gmail, :registration_notification,
                   :practice, :steps, :questions, :memberships, :contact,
-                  :twitter_name, :twitter_password, :twitter_api
+                  :twitter_name, :twitter_password, :twitter_api,
+                  :twitter_oauth_consumer_key, :twitter_oauth_consumer_secret
 
   validates_presence_of :domain,       :if =&gt; :using_email?
   validates_presence_of :smtp_server,  :if =&gt; :using_email?
   validates_presence_of :twitter_api,  :if =&gt; :using_twitter?
   
   before_save :encrypt_twitter_password
+  before_save :encrypt_twitter_oauth_consumer_secret
+
   before_validation :set_default_twitter_api_if_using_twitter
 
   # Can we send mail with the present configuration?
@@ -42,6 +46,10 @@ class Preference &lt; ActiveRecord::Base
     decrypt(crypted_twitter_password)
   end
 
+  def plaintext_twitter_oauth_consumer_secret
+    decrypt(crypted_twitter_oauth_consumer_secret)
+  end
+
   private
     def decrypt(password)
       Crypto::Key.from_file(&quot;#{RAILS_ROOT}/rsa_key&quot;).decrypt(password)
@@ -61,6 +69,11 @@ class Preference &lt; ActiveRecord::Base
       self.crypted_twitter_password = encrypt(twitter_password)
     end
 
+    def encrypt_twitter_oauth_consumer_secret
+      return if twitter_oauth_consumer_secret.blank?
+      self.crypted_twitter_oauth_consumer_secret = encrypt(twitter_oauth_consumer_secret)
+    end
+
     def set_default_twitter_api_if_using_twitter
       self.twitter_api = 'twitter.com' if self.twitter_api.blank?
     end</diff>
      <filename>app/models/preference.rb</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,16 @@
     &lt;/div&gt;
 
     &lt;div class=&quot;form_row&quot;&gt;
+      &lt;label for=&quot;twitter_oauth_consumer_key&quot;&gt;Twitter OAuth Consumer Key&lt;/label&gt;
+      &lt;%= f.text_field :twitter_oauth_consumer_key %&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;form_row&quot;&gt;
+      &lt;label for=&quot;twitter_password&quot;&gt;Twitter OAuth Consumer Secret&lt;/label&gt;
+      &lt;%= f.password_field :twitter_oauth_consumer_secret %&gt;
+    &lt;/div&gt;
+
+    &lt;div class=&quot;form_row&quot;&gt;
       &lt;label for=&quot;twitter_api&quot;&gt;Twitter api&lt;/label&gt;
       &lt;%= f.text_field :twitter_api %&gt;
     &lt;/div&gt;</diff>
      <filename>app/views/admin/preferences/edit.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -26,6 +26,11 @@
 &lt;/p&gt;
 
 &lt;p&gt;
+  &lt;b&gt;Twitter oauth consumer key:&lt;/b&gt;
+  &lt;%=h @preferences.twitter_oauth_consumer_key %&gt;
+&lt;/p&gt;
+
+&lt;p&gt;
   &lt;b&gt;Twitter api:&lt;/b&gt;
   &lt;%=h @preferences.twitter_api %&gt;
 &lt;/p&gt;</diff>
      <filename>app/views/admin/preferences/show.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,9 @@
 &lt;%- column_div :type =&gt; :primary do -%&gt;
+&lt;% if global_prefs.twitter_name.blank? %&gt;
 &lt;h2&gt;Requests&lt;/h2&gt;
+&lt;% else %&gt;
+  &lt;h2&gt;Requests &amp;nbsp;&amp;nbsp;&lt;%= link_to( image_tag(&quot;twitter.gif&quot;, :border =&gt; 0, :title =&gt; &quot;follow me&quot;), twitter_oauth_client_path ) %&gt;&lt;/h2&gt;
+&lt;%- end -%&gt;
 
 &lt;%- if @reqs.empty? -%&gt;
     &lt;h3 class=&quot;blankslate&quot;&gt;No requests (yet!)&lt;/h3&gt;</diff>
      <filename>app/views/reqs/index.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -3,6 +3,9 @@ ActionController::Routing::Routes.draw do |map|
 
   map.resources :bids
 
+  map.twitter_oauth_client '/reqs/twitter_oauth_client', :controller =&gt; &quot;reqs&quot;, :action =&gt; &quot;twitter_oauth_client&quot;
+  map.twitter_oauth_callback '/reqs/twitter_oauth_callback', :controller =&gt; &quot;reqs&quot;, :action =&gt; &quot;twitter_oauth_callback&quot;
+
   map.resources :reqs do |req|
     req.resources :bids
   end</diff>
      <filename>config/routes.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>694ac2d062504d71cea2322cc98e6968ede0ae21</id>
    </parent>
  </parents>
  <author>
    <name>Tom Brown</name>
    <login>herestomwiththeweather</login>
    <email>herestomwiththeweather@gmail.com</email>
  </author>
  <url>http://github.com/austintimeexchange/oscurrency/commit/20cf72f451879f97cbb5857b6a886bff82144c6d</url>
  <id>20cf72f451879f97cbb5857b6a886bff82144c6d</id>
  <committed-date>2009-02-17T23:08:17-08:00</committed-date>
  <authored-date>2009-02-17T23:08:17-08:00</authored-date>
  <message>twitter oauth support. if twitter, reqs page displays oauth follow button. will associate twitter id to person, have them follow system twitter and system will follow them back. caveat: protected system twitter will follow back but manually accepts follow request</message>
  <tree>66266a24fa55c563a7e3fad3f75626daa906a480</tree>
  <committer>
    <name>Tom Brown</name>
    <login>herestomwiththeweather</login>
    <email>herestomwiththeweather@gmail.com</email>
  </committer>
</commit>
