From 0ecc27a935f123720e9bd9f7cf9c9b0c912b9cbe Mon Sep 17 00:00:00 2001 From: maxwell Date: Tue, 2 Nov 2010 18:56:00 -0700 Subject: [PATCH 1/7] MS IZ posts should now update --- app/models/user.rb | 2 ++ spec/models/user_spec.rb | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/app/models/user.rb b/app/models/user.rb index 516a6cc71..48e2a05f2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -178,6 +178,8 @@ class User def update_post(post, post_hash = {}) if self.owns? post post.update_attributes(post_hash) + aspects = aspects_with_post(post.id) + self.push_to_aspects(post, aspects) end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 55c5575fb..6c5a2d0bc 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -226,6 +226,15 @@ describe User do end end + describe '#update_post' do + + it 'sends a notification to aspects' do + user.should_receive(:push_to_aspects).twice + album = user.post(:album, :name => "cat", :to => aspect.id) + user.update_post(album, :name => 'bat') + end + end + describe 'account removal' do it 'should unfriend everyone' do user.should_receive(:unfriend_everyone) From d482334ca26c68bd8704ff9a3ef3a1a1ce16cd9b Mon Sep 17 00:00:00 2001 From: maxwell Date: Tue, 2 Nov 2010 18:59:18 -0700 Subject: [PATCH 2/7] Revert "Revert "IZ MS webfinger now trys ssl first, then http"" This reverts commit 153265aae8519e88d4ac51af7647b1354484d38e. --- lib/em-webfinger.rb | 15 +++++------ spec/lib/em-webfinger_spec.rb | 50 +++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/lib/em-webfinger.rb b/lib/em-webfinger.rb index f5c4c6148..97b31184c 100644 --- a/lib/em-webfinger.rb +++ b/lib/em-webfinger.rb @@ -6,6 +6,7 @@ class EMWebfinger def initialize(account) @account = account.strip.gsub('acct:','').to_s @callbacks = [] + @ssl = true # Raise an error if identifier has a port number raise "Identifier is invalid" if(@account.strip.match(/\:\d+$/)) # Raise an error if identifier is not a valid email (generous regexp) @@ -34,6 +35,9 @@ class EMWebfinger profile_url = webfinger_profile_url(http.response) if profile_url get_webfinger_profile(profile_url) + elsif @ssl + @ssl = false + get_xrd else process_callbacks "webfinger does not seem to be enabled for #{@account}'s host" end @@ -73,25 +77,18 @@ class EMWebfinger ##helpers private - def check_nil_response(html) - - end - - - def webfinger_profile_url(xrd_response) doc = Nokogiri::XML::Document.parse(xrd_response) return nil if doc.namespaces["xmlns"] != "http://docs.oasis-open.org/ns/xri/xrd-1.0" swizzle doc.at('Link[rel=lrdd]').attribute('template').value end - def xrd_url(ssl = false) + def xrd_url domain = @account.split('@')[1] - "http#{'s' if ssl}://#{domain}/.well-known/host-meta" + "http#{'s' if @ssl}://#{domain}/.well-known/host-meta" end def swizzle(template) template.gsub '{uri}', @account end - end diff --git a/spec/lib/em-webfinger_spec.rb b/spec/lib/em-webfinger_spec.rb index 9c6d384a2..eb88684a4 100644 --- a/spec/lib/em-webfinger_spec.rb +++ b/spec/lib/em-webfinger_spec.rb @@ -47,6 +47,11 @@ describe EMWebfinger do EMWebfinger.new('eviljoe@diaspora.local:3000') }.should raise_error(RuntimeError, "Identifier is invalid") end + + it 'should set ssl as the default' do + foo = EMWebfinger.new(account) + foo.instance_variable_get(:@ssl).should be true + end end @@ -94,14 +99,14 @@ describe EMWebfinger do end describe '#xrd_url' do - it 'should return canonical host-meta url' do + it 'should return canonical host-meta url for http' do + finger.instance_variable_set(:@ssl, false) finger.send(:xrd_url).should == "http://tom.joindiaspora.com/.well-known/host-meta" end it 'can return the https version' do - finger.send(:xrd_url, true).should == "https://tom.joindiaspora.com/.well-known/host-meta" + finger.send(:xrd_url).should == "https://tom.joindiaspora.com/.well-known/host-meta" end - end end @@ -127,9 +132,44 @@ describe EMWebfinger do EM.run { f.on_person{ |p| - p.valid?.should be true - EM.stop + p.valid?.should be true + EM.stop + } } + end + + it 'should retry with http if https fails' do + good_request.callbacks = [nil, diaspora_xrd, diaspora_finger, hcard_xml] + + #new_person = Factory.build(:person, :diaspora_handle => "tom@tom.joindiaspora.com") + # http://tom.joindiaspora.com/.well-known/host-meta + f = EMWebfinger.new("tom@tom.joindiaspora.com") + + EventMachine::HttpRequest.should_receive(:new).exactly(4).times.and_return(good_request) + + f.should_receive(:xrd_url).twice + + EM.run { + f.on_person{ |p| + EM.stop + } + } + end + + + it 'must try https first' do + single_request = FakeHttpRequest.new(:success) + single_request.callbacks = [diaspora_xrd] + good_request.callbacks = [diaspora_finger, hcard_xml] + EventMachine::HttpRequest.should_receive(:new).with("https://tom.joindiaspora.com/.well-known/host-meta").and_return(single_request) + EventMachine::HttpRequest.should_receive(:new).exactly(2).and_return(good_request) + + f = EMWebfinger.new("tom@tom.joindiaspora.com") + + EM.run { + f.on_person{ |p| + EM.stop + } } end end From 8f5052fe618c12cf5ebd6882d38c31e4763d4111 Mon Sep 17 00:00:00 2001 From: maxwell Date: Tue, 2 Nov 2010 18:59:42 -0700 Subject: [PATCH 3/7] Revert "Revert "making emwebfinger not try ssl first, for now"" This reverts commit 0db30bb2211b1848eb88915865fd389f365e8825. --- lib/em-webfinger.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/em-webfinger.rb b/lib/em-webfinger.rb index 97b31184c..102760156 100644 --- a/lib/em-webfinger.rb +++ b/lib/em-webfinger.rb @@ -6,7 +6,7 @@ class EMWebfinger def initialize(account) @account = account.strip.gsub('acct:','').to_s @callbacks = [] - @ssl = true + @ssl = false # Raise an error if identifier has a port number raise "Identifier is invalid" if(@account.strip.match(/\:\d+$/)) # Raise an error if identifier is not a valid email (generous regexp) @@ -43,7 +43,9 @@ class EMWebfinger end } - http.errback { process_callbacks "there was an error getting the xrd from account#{@account}" } + http.errback { + + process_callbacks "there was an error getting the xrd from account#{@account}" } end From 1c67211ebca8d1da2d40e3ed497efe38930e5f50 Mon Sep 17 00:00:00 2001 From: Raphael Date: Tue, 2 Nov 2010 18:51:34 -0700 Subject: [PATCH 4/7] Move post dispatching to dispatch_post --- app/models/user.rb | 47 ++++++++++++++++---------------- spec/lib/websocket_spec.rb | 1 + spec/models/user/posting_spec.rb | 15 ++++++++-- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 48e2a05f2..0ec7ed50b 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -150,19 +150,34 @@ class User post = build_post(class_name, options) - if post.persisted? - Rails.logger.info("Pushing: #{post.inspect} out to aspects") - push_to_aspects(post, aspect_ids) - post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid) - if options[:public] == true - self.services.each do |service| - self.send("post_to_#{service.provider}".to_sym, service, post.message) - end - end + if post.save + raise 'MongoMapper failed to catch a failed save' unless post.id + dispatch_post(post, :to => aspect_ids) end post end + def build_post(class_name, options = {}) + options[:person] = self.person + options[:diaspora_handle] = self.person.diaspora_handle + + model_class = class_name.to_s.camelize.constantize + model_class.instantiate(options) + end + + def dispatch_post(post, opts = {}) + self.raw_visible_posts << post + self.save + Rails.logger.info("Pushing: #{post.inspect} out to aspects") + push_to_aspects(post, opts[:to]) + post.socket_to_uid(id, :aspect_ids => opts[:to]) if post.respond_to?(:socket_to_uid) + if post.public + self.services.each do |service| + self.send("post_to_#{service.provider}".to_sym, service, post.message) + end + end + end + def post_to_facebook(service, message) Rails.logger.info("Sending a message: #{message} to Facebook") EventMachine::HttpRequest.new("https://graph.facebook.com/me/feed?message=#{message}&access_token=#{service.access_token}").post @@ -203,20 +218,6 @@ class User aspect_ids end - def build_post(class_name, options = {}) - options[:person] = self.person - options[:diaspora_handle] = self.person.diaspora_handle - - model_class = class_name.to_s.camelize.constantize - post = model_class.instantiate(options) - if post.save - raise 'MongoMapper failed to catch a failed save' unless post.id - self.raw_visible_posts << post - self.save - end - post - end - def push_to_aspects(post, aspect_ids) if aspect_ids == :all || aspect_ids == "all" aspects = self.aspects diff --git a/spec/lib/websocket_spec.rb b/spec/lib/websocket_spec.rb index e3917008a..2615ac82d 100644 --- a/spec/lib/websocket_spec.rb +++ b/spec/lib/websocket_spec.rb @@ -9,6 +9,7 @@ describe Diaspora::WebSocket do @user = make_user @aspect = @user.aspects.create(:name => "losers") @post = @user.build_post(:status_message, :message => "hey", :to => @aspect.id) + @post.save end it 'should queue a job' do diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb index 734c187fc..79233cb4c 100644 --- a/spec/models/user/posting_spec.rb +++ b/spec/models/user/posting_spec.rb @@ -36,7 +36,19 @@ describe User do end end - describe '#post' do + describe '#build_post' do + it 'does not save a status_message' do + post = user.build_post(:status_message, :message => "hey", :to => aspect.id) + post.persisted?.should be_false + end + + it 'does not save an album' do + post = user.build_post(:album, :name => "hey", :to => aspect.id) + post.persisted?.should be_false + end + end + + describe '#dispatch_post' do it 'should put the post in the aspect post array' do post = user.post(:status_message, :message => "hey", :to => aspect.id) aspect.reload @@ -67,7 +79,6 @@ describe User do user.should_receive(:post_to_facebook).exactly(0).times user.post :status_message, :message => "hi", :to => "all" end - end describe '#update_post' do From d5a4de58b3a70f6b25e9ce2cacad954125540981 Mon Sep 17 00:00:00 2001 From: Raphael Date: Tue, 2 Nov 2010 19:15:52 -0700 Subject: [PATCH 5/7] User#post is now like a future controller, Photo#instantiate no longer saves --- app/models/photo.rb | 8 ++------ app/models/user.rb | 35 +++++++++++++++++------------------ spec/models/photo_spec.rb | 17 ++++++++++------- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/app/models/photo.rb b/app/models/photo.rb index 6c96e425c..1eb0aa10e 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -34,15 +34,11 @@ class Photo < Post before_destroy :ensure_user_picture def self.instantiate(params = {}) + photo = super(params) image_file = params.delete(:user_file) - person = params.delete(:person) - - photo = Photo.new(params) - photo.diaspora_handle = params[:diaspora_handle] + photo.album_id = params[:album_id] photo.image.store! image_file - photo.person = person - photo.save photo end diff --git a/app/models/user.rb b/app/models/user.rb index 0ec7ed50b..9784a480f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -138,39 +138,38 @@ class User end ######## Posting ######## - def post(class_name, options = {}) - if class_name == :photo && !options[:album_id].to_s.empty? - aspect_ids = aspects_with_post(options[:album_id]) - aspect_ids.map! { |aspect| aspect.id } - else - aspect_ids = options.delete(:to) - end - - aspect_ids = validate_aspect_permissions(aspect_ids) - - post = build_post(class_name, options) + def post(class_name, opts = {}) + post = build_post(class_name, opts) if post.save raise 'MongoMapper failed to catch a failed save' unless post.id - dispatch_post(post, :to => aspect_ids) + dispatch_post(post, :to => opts[:to]) end post end - def build_post(class_name, options = {}) - options[:person] = self.person - options[:diaspora_handle] = self.person.diaspora_handle + def build_post(class_name, opts = {}) + opts[:person] = self.person + opts[:diaspora_handle] = self.person.diaspora_handle model_class = class_name.to_s.camelize.constantize - model_class.instantiate(options) + model_class.instantiate(opts) end def dispatch_post(post, opts = {}) + if post.is_a?(Photo) && post.album_id + aspect_ids = aspects_with_post(post.album_id) + aspect_ids.map! { |aspect| aspect.id } + else + aspect_ids = opts.delete(:to) + end + + aspect_ids = validate_aspect_permissions(aspect_ids) self.raw_visible_posts << post self.save Rails.logger.info("Pushing: #{post.inspect} out to aspects") - push_to_aspects(post, opts[:to]) - post.socket_to_uid(id, :aspect_ids => opts[:to]) if post.respond_to?(:socket_to_uid) + push_to_aspects(post, aspect_ids) + post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid) if post.public self.services.each do |service| self.send("post_to_#{service.provider}".to_sym, service, post.message) diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb index f0e38fa42..0e2513e1d 100644 --- a/spec/models/photo_spec.rb +++ b/spec/models/photo_spec.rb @@ -42,15 +42,18 @@ describe Photo do it 'sets the persons diaspora handle' do @photo2.diaspora_handle.should == @user.person.diaspora_handle end + it 'has a constructor' do + image = File.open(@fixture_name) + photo = Photo.instantiate( + :person => @user.person, :album => @album, :user_file => image) + photo.created_at.nil?.should be true + photo.image.read.nil?.should be false + photo.album.should == @album + end + end - it 'has a constructor' do - image = File.open(@fixture_name) - photo = Photo.instantiate( - :person => @user.person, :album => @album, :user_file => image) - photo.created_at.nil?.should be false - photo.image.read.nil?.should be false - end + it 'should save a photo' do @photo.image.store! File.open(@fixture_name) From 545577a9500758293935f8c39d0f23ae8987929d Mon Sep 17 00:00:00 2001 From: maxwell Date: Tue, 2 Nov 2010 19:16:08 -0700 Subject: [PATCH 6/7] em-webfinger ssl should work --- lib/em-webfinger.rb | 10 +++++++--- spec/lib/em-webfinger_spec.rb | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/lib/em-webfinger.rb b/lib/em-webfinger.rb index 102760156..f6a3539f7 100644 --- a/lib/em-webfinger.rb +++ b/lib/em-webfinger.rb @@ -6,7 +6,7 @@ class EMWebfinger def initialize(account) @account = account.strip.gsub('acct:','').to_s @callbacks = [] - @ssl = false + @ssl = true # Raise an error if identifier has a port number raise "Identifier is invalid" if(@account.strip.match(/\:\d+$/)) # Raise an error if identifier is not a valid email (generous regexp) @@ -44,8 +44,12 @@ class EMWebfinger } http.errback { - - process_callbacks "there was an error getting the xrd from account#{@account}" } + if @ssl + @ssl = false + get_xrd + else + process_callbacks "there was an error getting the xrd from account#{@account}" + end } end diff --git a/spec/lib/em-webfinger_spec.rb b/spec/lib/em-webfinger_spec.rb index eb88684a4..5441d3f91 100644 --- a/spec/lib/em-webfinger_spec.rb +++ b/spec/lib/em-webfinger_spec.rb @@ -156,7 +156,6 @@ describe EMWebfinger do } end - it 'must try https first' do single_request = FakeHttpRequest.new(:success) single_request.callbacks = [diaspora_xrd] @@ -172,6 +171,23 @@ describe EMWebfinger do } } end + + it 'should retry with http if https fails with an http error code' do + bad_request = FakeHttpRequest.new(:failure) + + good_request.callbacks = [diaspora_xrd, diaspora_finger, hcard_xml] + + EventMachine::HttpRequest.should_receive(:new).with("https://tom.joindiaspora.com/.well-known/host-meta").and_return(bad_request) + EventMachine::HttpRequest.should_receive(:new).exactly(3).and_return(good_request) + + f = EMWebfinger.new("tom@tom.joindiaspora.com") + + EM.run { + f.on_person{ |p| + EM.stop + } + } + end end end end From 034d56656448c4fd9148376f72a5de3520a4ce22 Mon Sep 17 00:00:00 2001 From: Sarah Mei Date: Tue, 2 Nov 2010 21:49:24 -0700 Subject: [PATCH 7/7] CI has decided it wants a proper shell to launch the virtual display. So FINE. It can have one. --- lib/tasks/cruise.rake | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/tasks/cruise.rake b/lib/tasks/cruise.rake index e3a7a65a1..91c3f31d8 100644 --- a/lib/tasks/cruise.rake +++ b/lib/tasks/cruise.rake @@ -1,10 +1,13 @@ namespace :cruise do desc "Run all specs and features" task :cruise => :environment do - system('/etc/init.d/xvfb start') + puts "Starting virtual display..." + `sh -e /etc/init.d/xvfb start` + puts "Starting specs..." system('export DISPLAY=:99.0 && export SELENIUM_SERVER_PORT=53809 && bundle exec rake') exit_status = $?.exitstatus - system('/etc/init.d/xvfb stop') + puts "Stopping virtual display..." + `sh -e /etc/init.d/xvfb stop` raise "tests failed!" unless exit_status == 0 end end