Commit fc6893d4 authored by Benjamin Neff's avatar Benjamin Neff Committed by Dennis Schubert

Remove facebook integration

Facebook removed the API and facebook integration is broken now, so lets
remove it.

closes #7874
parent d0c6495b
......@@ -3,6 +3,7 @@
## Refactor
* Remove mention of deprecated `statistic.json` [#7867](https://github.com/diaspora/diaspora/pull/7867)
* Add quotes in `database.yml.example` to fields that may contain special characters [#7875](https://github.com/diaspora/diaspora/pull/7875)
* Removed broken, and thus deprecated, Facebook integration [#7874](https://github.com/diaspora/diaspora/pull/7874)
## Bug fixes
* Add compatibility with macOS to `script/configure_bundler` [#7830](https://github.com/diaspora/diaspora/pull/7830)
......
......@@ -157,7 +157,6 @@ gem "secure_headers", "5.0.5"
# Services
gem "omniauth", "1.8.1"
gem "omniauth-facebook", "4.0.0"
gem "omniauth-tumblr", "1.2"
gem "omniauth-twitter", "1.4.0"
gem "omniauth-wordpress", "0.2.2"
......
......@@ -408,8 +408,6 @@ GEM
omniauth (1.8.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-facebook (4.0.0)
omniauth-oauth2 (~> 1.2)
omniauth-oauth (1.1.0)
oauth
omniauth (~> 1.0)
......@@ -820,7 +818,6 @@ DEPENDENCIES
mysql2 (= 0.5.0)
nokogiri (= 1.8.2)
omniauth (= 1.8.1)
omniauth-facebook (= 4.0.0)
omniauth-tumblr (= 1.2)
omniauth-twitter (= 1.4.0)
omniauth-wordpress (= 0.2.2)
......
......@@ -199,7 +199,6 @@
}
text-align: center;
.social-media-logos-facebook-24x24,
.social-media-logos-twitter-24x24,
.social-media-logos-tumblr-24x24,
.social-media-logos-wordpress-24x24 {
......
# frozen_string_literal: true
class Services::Facebook < Service
include Rails.application.routes.url_helpers
OVERRIDE_FIELDS_ON_FB_UPDATE = [:contact_id, :person_id, :request_id, :invitation_id, :photo_url, :name, :username]
MAX_CHARACTERS = 63206
def provider
"facebook"
end
def post(post, url='')
logger.debug "event=post_to_service type=facebook sender_id=#{user_id} post=#{post.guid}"
response = post_to_facebook("https://graph.facebook.com/me/feed", create_post_params(post).to_param)
response = JSON.parse response.body
post.facebook_id = response["id"]
post.save
end
def post_to_facebook(url, body)
Faraday.post(url, body)
end
def create_post_params(post)
message = post.message.plain_text_without_markdown
post_url = short_post_url(post, protocol: AppConfig.pod_uri.scheme, host: AppConfig.pod_uri.authority)
message = if message.empty?
post_url
else
"#{message} (via #{post_url})"
end
{
message: message,
access_token: access_token,
link: post.message.urls.first
}
end
def profile_photo_url
"https://graph.facebook.com/#{self.uid}/picture?type=large&access_token=#{URI.escape(self.access_token)}"
end
def post_opts(post)
{facebook_id: post.facebook_id} if post.facebook_id.present?
end
def delete_from_service(opts)
logger.debug "event=delete_from_service type=facebook sender_id=#{user_id} facebook_id=#{opts[:facebook_id]}"
delete_from_facebook("https://graph.facebook.com/#{opts[:facebook_id]}/", access_token: access_token)
end
def delete_from_facebook(url, body)
Faraday.delete(url, body)
end
end
......@@ -14,10 +14,6 @@
%h3
= t(".who_are_you")
- if AppConfig.configured_services.include? :facebook
%p
!= t('.connect_to_facebook', link: link_to(t('.connect_to_facebook_link'), "auth/facebook?callback_url=#{getting_started_url}"))
= form_tag profile_path, method: :put, remote: true, id: 'edit_profile' do
%fieldset
.form-group
......
......@@ -19,10 +19,6 @@
%h2
= t(".who_are_you")
- if AppConfig.configured_services.include? :facebook
%p
!= t('.connect_to_facebook', link: link_to(t('.connect_to_facebook_link'), "auth/facebook?callback_url=#{getting_started_url}"))
= form_tag profile_path, method: :put, remote: true, id: "edit_profile" do
%fieldset
.form-group
......
......@@ -153,12 +153,6 @@ defaults:
report_only: true
report_uri:
services:
facebook:
enable: false
app_id:
secret:
open_graph_namespace: 'joindiaspora'
authorized: false
twitter:
enable: false
key:
......@@ -234,11 +228,10 @@ test:
invitations:
open: true
services:
facebook:
twitter:
enable: true
app_id: 'fake'
key: 'fake'
secret: 'sdoigjosdfijg'
authorized: true
mail:
enable: true
integration1:
......
......@@ -21,7 +21,7 @@
## - Specify lists/arrays as comma-separated values
##
## - For example, on Heroku:
## heroku config:set SERVICES_FACEBOOK_APP_ID=yourappid SERVICES_FACEBOOK_SECRET=yourappsecret
## heroku config:set SERVICES_TWITTER_KEY=yourkey SERVICES_TWITTER_SECRET=yoursecret
configuration: ## Section
......@@ -583,20 +583,6 @@ configuration: ## Section
## Posting from Diaspora to external services (all are disabled by default).
services: ## Section
## OAuth credentials for Facebook
facebook: ## Section
#enable: true
#app_id: 'abcdef'
#secret: 'change_me'
## This setting is required to define whether the Facebook app has permissions to post
## false == No permissions (default)
## true == Permissions for all users to post. App MUST have 'publish_actions' approved by Facebook!
## "username" == Set to local username to allow a single user to cross-post. The person who has created
## the Facebook app will always be able to cross-post, even without 'publish_actions'.
#authorized: false
## OAuth credentials for Twitter
twitter: ## Section
......
......@@ -13,17 +13,6 @@ Rails.application.config.middleware.use OmniAuth::Builder do
provider :tumblr, AppConfig.services.tumblr.key, AppConfig.services.tumblr.secret
end
if AppConfig.services.facebook.enable?
provider :facebook, AppConfig.services.facebook.app_id, AppConfig.services.facebook.secret, {
scope: "public_profile,publish_actions",
client_options: {
ssl: {
ca_file: AppConfig.environment.certificate_authorities
}
}
}
end
if AppConfig.services.wordpress.enable?
provider :wordpress, AppConfig.services.wordpress.client_id, AppConfig.services.wordpress.secret
end
......
......@@ -1043,7 +1043,6 @@ en:
comment_email_subject: "%{resharer}’s reshare of %{author}’s post"
services:
provider:
facebook: "Facebook"
tumblr: "Tumblr"
twitter: "Twitter"
wordpress: "WordPress"
......@@ -1264,8 +1263,6 @@ en:
community_welcome: "diaspora*’s community is happy to have you aboard!"
awesome_take_me_to_diaspora: "Awesome! Take me to diaspora*"
who_are_you: "Who are you?"
connect_to_facebook: "We can speed things up a bit by %{link} to diaspora*. This will pull your name and photo, and enable cross-posting."
connect_to_facebook_link: "Hooking up your Facebook account"
what_are_you_in_to: "What are you into?"
hashtag_explanation: "Hashtags allow you to talk about and follow your interests. They’re also a great way to find new people on diaspora*."
hashtag_suggestions: "Try following tags like #art, #movies, #gif, etc."
......
# frozen_string_literal: true
class RemoveFacebook < ActiveRecord::Migration[5.1]
class Service < ApplicationRecord
end
def change
remove_column :posts, :facebook_id, :string
reversible do |change|
change.up { Service.where(type: "Services::Facebook").delete_all }
end
end
end
# frozen_string_literal: true
module Configuration
KNOWN_SERVICES = [:twitter, :tumblr, :facebook, :wordpress].freeze
KNOWN_SERVICES = %i[twitter tumblr wordpress].freeze
module Methods
def pod_uri
......
......@@ -29,8 +29,8 @@ describe StreamsController, :type => :controller do
end
it 'generates a jasmine fixture with services', :fixture => true do
alice.services << Services::Facebook.create(:user_id => alice.id)
alice.services << Services::Twitter.create(:user_id => alice.id)
alice.services << Services::Twitter.create(user_id: alice.id)
alice.services << Services::Tumblr.create(user_id: alice.id)
get :aspects, params: {prefill: "reshare things"}
save_fixture(html_for("body"), "aspects_index_services")
end
......
......@@ -5,12 +5,14 @@
# the COPYRIGHT file.
describe ServicesController, :type => :controller do
let(:omniauth_auth) do
{ 'provider' => 'facebook',
'uid' => '2',
'info' => { 'nickname' => 'grimmin', 'image' => 'http://graph.facebook.com/2/picture' },
'credentials' => { 'token' => 'tokin', 'secret' =>"not_so_much" }}
end
let(:omniauth_auth) {
{
"provider" => "tumblr",
"uid" => "2",
"info" => {"nickname" => "grimmin"},
"credentials" => {"token" => "token", "secret" => "not_so_much"}
}
}
let(:user) { alice }
before do
......@@ -37,22 +39,13 @@ describe ServicesController, :type => :controller do
it 'creates a new service and associates it with the current user' do
expect {
post :create, params: {provider: "facebook"}
post :create, params: {provider: "twitter"}
}.to change(user.services, :count).by(1)
end
it 'saves the provider' do
post :create, params: {provider: "facebook"}
expect(user.reload.services.first.class.name).to eq("Services::Facebook")
end
context "when the user hasn't got a profile photo on Diaspora" do
before { user.person.profile.update_attribute :image_url, nil }
it "imports the profile photo from the service" do
expect(Workers::FetchProfilePhoto).to receive(:perform_async)
post :create, params: {provider: "facebook"}
end
post :create, params: {provider: "twitter"}
expect(user.reload.services.first.class.name).to eq("Services::Tumblr")
end
context 'when service exists with the same uid' do
......@@ -97,23 +90,10 @@ describe ServicesController, :type => :controller do
end
end
context 'Facebook' do
before do
facebook_auth_without_twitter_extras = { 'provider' => 'facebook', 'extras' => { 'someotherkey' => 'lorem'}}
request.env['omniauth.auth'] = omniauth_auth.merge!( facebook_auth_without_twitter_extras )
end
it "doesn't break when twitter-specific extras aren't available in omniauth hash" do
expect {
post :create, params: {provider: "facebook"}
}.to change(user.services, :count).by(1)
end
end
context 'when fetching a photo' do
before do
omniauth_auth
omniauth_auth["info"].merge!({"image" => "https://service.com/fallback_lowres.jpg"})
omniauth_auth["info"]["image"] = "https://service.com/fallback_lowres.jpg"
request.env['omniauth.auth'] = omniauth_auth
end
......
......@@ -141,20 +141,17 @@ describe StatusMessagesController, :type => :controller do
end
it "dispatches the post to the specified services" do
s1 = Services::Facebook.new
alice.services << s1
alice.services << Services::Twitter.new
status_message_hash[:services] = ['facebook']
status_message_hash[:services] = ["twitter"]
service_types = Service.titles(status_message_hash[:services])
expect(alice).to receive(:dispatch_post).with(anything(), hash_including(:service_types => service_types))
expect(alice).to receive(:dispatch_post).with(anything, hash_including(service_types: service_types))
post :create, params: status_message_hash
end
it "works if services is a string" do
s1 = Services::Facebook.new
alice.services << s1
status_message_hash[:services] = "facebook"
expect(alice).to receive(:dispatch_post).with(anything(), hash_including(:service_types => ["Services::Facebook"]))
alice.services << Services::Twitter.new
status_message_hash[:services] = "twitter"
expect(alice).to receive(:dispatch_post).with(anything, hash_including(service_types: ["Services::Twitter"]))
post :create, params: status_message_hash
end
......
......@@ -16,8 +16,8 @@ describe("app.models.User", function(){
describe("isServiceConnected", function(){
it("checks to see if the sent provider name is a configured service", function(){
this.user.set({configured_services : ["facebook"]});
expect(this.user.isServiceConfigured("facebook")).toBeTruthy();
this.user.set({configured_services: ["twitter"]}); // eslint-disable-line camelcase
expect(this.user.isServiceConfigured("twitter")).toBeTruthy();
expect(this.user.isServiceConfigured("tumblr")).toBeFalsy();
});
});
......
......@@ -94,22 +94,17 @@ describe Configuration::Methods do
allow(disabled).to receive(:enable?).and_return(false)
allow(services).to receive(:twitter).and_return(enabled)
allow(services).to receive(:tumblr).and_return(enabled)
allow(services).to receive(:facebook).and_return(disabled)
allow(services).to receive(:wordpress).and_return(disabled)
allow(@settings).to receive(:services).and_return(services)
expect(@settings.configured_services).to include :twitter
expect(@settings.configured_services).to include :tumblr
expect(@settings.configured_services).not_to include :facebook
expect(@settings.configured_services).not_to include :wordpress
end
end
describe "#show_service" do
before do
AppConfig.services.twitter.authorized = true
AppConfig.services.twitter.enable = true
AppConfig.services.facebook.authorized = true
AppConfig.services.facebook.enable = true
AppConfig.services.wordpress.authorized = false
AppConfig.services.wordpress.enable = true
AppConfig.services.tumblr.authorized = "alice"
......@@ -120,10 +115,6 @@ describe Configuration::Methods do
expect(AppConfig.show_service?("twitter", bob)).to be_truthy
end
it "shows service with authorized key true" do
expect(AppConfig.show_service?("facebook", bob)).to be_truthy
end
it "doesn't show service with authorized key false" do
expect(AppConfig.show_service?("wordpress", bob)).to be_falsey
end
......
......@@ -79,8 +79,7 @@ describe Retraction do
it "adds service metadata to queued job for deletion" do
post.tweet_id = "123"
twitter = Services::Twitter.new(access_token: "twitter")
facebook = Services::Facebook.new(access_token: "facebook")
alice.services << twitter << facebook
alice.services << twitter
retraction = Retraction.for(post)
federation_retraction = Diaspora::Federation::Entities.retraction(retraction)
......
# frozen_string_literal: true
describe Service, :type => :model do
describe Service, type: :model do
before do
@post = alice.post(:status_message, :text => "hello", :to => alice.aspects.first.id)
@service = Services::Facebook.new(:access_token => "yeah", :uid => 1)
@post = alice.post(:status_message, text: "hello", to: alice.aspects.first.id)
@service = Services::Twitter.new(access_token: "yeah", uid: 1)
alice.services << @service
end
it 'is unique to a user by service type and uid' do
it "is unique to a user by service type and uid" do
@service.save
second_service = Services::Facebook.new(:access_token => "yeah", :uid => 1)
second_service = Services::Twitter.new(access_token: "yeah", uid: 1)
alice.services << second_service
alice.services.last.save
expect(alice.services.last).to be_invalid
end
it 'by default has no profile photo url' do
expect( described_class.new.profile_photo_url ).to be_nil
it "by default has no profile photo url" do
expect(described_class.new.profile_photo_url).to be_nil
end
describe '.titles' do
describe ".titles" do
it "converts passed service titles into service constants" do
expect( described_class.titles( ['twitter'] ) ).to eql ['Services::Twitter']
expect(described_class.titles(["twitter"])).to eql ["Services::Twitter"]
end
end
describe '.first_from_omniauth' do
let(:omniauth) { { 'provider' => 'facebook', 'uid' => '1', 'credentials' => {}, 'info' => {} } }
it 'first service by provider and uid' do
expect( described_class.first_from_omniauth( omniauth ) ).to eql @service
describe ".first_from_omniauth" do
let(:omniauth) { {"provider" => "twitter", "uid" => "1", "credentials" => {}, "info" => {}} }
it "first service by provider and uid" do
expect(described_class.first_from_omniauth(omniauth)).to eql @service
end
end
describe '.initialize_from_omniauth' do
describe ".initialize_from_omniauth" do
let(:omniauth) do
{ 'provider' => 'facebook',
'uid' => '2',
'info' => { 'nickname' => 'grimmin' },
'credentials' => { 'token' => 'tokin', 'secret' =>"not_so_much" }
{
"provider" => "twitter",
"uid" => "2",
"info" => {"nickname" => "grimmin"},
"credentials" => {"token" => "token", "secret" => "not_so_much"}
}
end
let(:subject) { described_class.initialize_from_omniauth( omniauth ) }
let(:subject) { described_class.initialize_from_omniauth(omniauth) }
it 'new service obj of type Services::Facebook' do
expect( subject.type ).to eql "Services::Facebook"
it "new service obj of type Services::Twitter" do
expect(subject.type).to eql "Services::Twitter"
end
it 'new service obj with oauth options populated' do
expect( subject.uid ).to eql "2"
expect( subject.nickname ).to eql "grimmin"
expect( subject.access_token ).to eql "tokin"
expect( subject.access_secret ).to eql "not_so_much"
it "new service obj with oauth options populated" do
expect(subject.uid).to eql "2"
expect(subject.nickname).to eql "grimmin"
expect(subject.access_token).to eql "token"
expect(subject.access_secret).to eql "not_so_much"
end
end
end
# frozen_string_literal: true
describe Services::Facebook, :type => :model do
before do
@user = alice
@post = @user.post(:status_message, :text => "hello", :to =>@user.aspects.first.id, :public =>true, :photos => [])
@service = Services::Facebook.new(:access_token => "yeah")
@user.services << @service
end
describe '#post' do
it 'posts a status message to facebook' do
stub_request(:post, "https://graph.facebook.com/me/feed").
to_return(:status => 200, :body => '{"id": "12345"}', :headers => {})
@service.post(@post)
end
it 'removes text formatting markdown from post text' do
message = double(urls: [])
expect(message).to receive(:plain_text_without_markdown).and_return("")
post = double(message: message, photos: [])
post_params = @service.create_post_params(post)
end
it "adds '(via <post URL>)'" do
message = "Some text."
post = double(message: double(plain_text_without_markdown: message, urls: []), photos: [])
post_params = @service.create_post_params(post)
expect(post_params[:message]).to include "(via http:"
end
it "sets facebook id on post" do
stub_request(:post, "https://graph.facebook.com/me/feed")
.to_return(status: 200, body: '{"id": "12345"}', headers: {})
@service.post(@post)
expect(@post.facebook_id).to match "12345"
end
end
describe "with photo" do
before do
@photos = [alice.build_post(:photo, pending: true, user_file: File.open(photo_fixture_name)),
alice.build_post(:photo, pending: true, user_file: File.open(photo_fixture_name))]
@photos.each(&:save!)
end
it "should include post url in message with photos as (via... " do
@status_message = alice.build_post(:status_message, text: "the best pebble.")
@status_message.photos << @photos
@status_message.save!
alice.add_to_streams(@status_message, alice.aspects)
post_params = @service.create_post_params(@status_message)
expect(post_params[:message]).to include "(via http:"
end
it "should include post url in message with photos when no text message" do
@status_message = alice.build_post(:status_message, text: "")
@status_message.photos << @photos
@status_message.save!
alice.add_to_streams(@status_message, alice.aspects)
post_params = @service.create_post_params(@status_message)
expect(post_params[:message]).to include "http:"
end
end
describe "#profile_photo_url" do
it 'returns a large profile photo url' do
@service.uid = "abc123"
@service.access_token = "token123"
expect(@service.profile_photo_url).to eq(
"https://graph.facebook.com/abc123/picture?type=large&access_token=token123"
)
end
end
describe "#post_opts" do
it "returns the facebook_id of the post" do
@post.facebook_id = "2345"
expect(@service.post_opts(@post)).to eq(facebook_id: "2345")
end
it "returns nil when the post has no facebook_id" do
expect(@service.post_opts(@post)).to be_nil
end
end
describe "#delete_from_service" do
it "removes a post from facebook" do
facebook_id = "2345"
url = "https://graph.facebook.com/#{facebook_id}/"
stub_request(:delete, "#{url}?access_token=#{@service.access_token}").to_return(status: 200)
expect(@service).to receive(:delete_from_facebook).with(url, access_token: @service.access_token)
@service.delete_from_service(facebook_id: facebook_id)
end
end
end
......@@ -52,10 +52,6 @@ describe NodeInfoPresenter do
context "when services are enabled" do
before do
AppConfig.services = {
"facebook" => {
"enable" => true,
"authorized" => true
},
"twitter" => {"enable" => true},
"wordpress" => {"enable" => false},
"tumblr" => {
......@@ -66,17 +62,13 @@ describe NodeInfoPresenter do
end
it "provides services" do
expect(hash).to include "services" => include("outbound" => %w(twitter facebook))
expect(hash).to include "services" => include("outbound" => ["twitter"])
end
end
context "when some services are set to username authorized" do
before do
AppConfig.services = {
"facebook" => {
"enable" => true,
"authorized" => "bob"
},
"twitter" => {"enable" => true},
"wordpress" => {
"enable" => true,
......
......@@ -169,8 +169,8 @@ describe StatusMessageCreationService do
it "dispatches the StatusMessage to services" do
expect(alice).to receive(:dispatch_post)
.with(instance_of(StatusMessage),
hash_including(service_types: array_including(%w(Services::Facebook Services::Twitter))))
StatusMessageCreationService.new(alice).create(params.merge(services: %w(twitter facebook)))
hash_including(service_types: array_including(%w[Services::Tumblr Services::Twitter])))
StatusMessageCreationService.new(alice).create(params.merge(services: %w[twitter tumblr]))
end
context "with mention" do
......
......@@ -3,7 +3,7 @@
describe Workers::DeletePostFromService do
it "calls service#delete_from_service with given opts" do
service = double
opts = {facebook_id: "23456"}
opts = {twitter_id: "23456"}
expect(service).to receive(:delete_from_service).with(opts)
allow(Service).to receive(:find_by_id).with("123").and_return(service)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment