diff --git a/app/jobs/xmpp_exchange_contacts_job.rb b/app/jobs/xmpp_exchange_contacts_job.rb index 50f6fa2..c082e32 100644 --- a/app/jobs/xmpp_exchange_contacts_job.rb +++ b/app/jobs/xmpp_exchange_contacts_job.rb @@ -1,18 +1,21 @@ class XmppExchangeContactsJob < ApplicationJob queue_as :default - def perform(inviter, username, domain) + def perform(inviter, invitee) + return unless inviter.services_enabled.include?("ejabberd") && + invitee.services_enabled.include?("ejabberd") + ejabberd = EjabberdApiClient.new ejabberd.add_rosteritem({ - "localuser": username, "localhost": domain, + "localuser": invitee.cn, "localhost": invitee.ou, "user": inviter.cn, "host": inviter.ou, "nick": inviter.cn, "group": Setting.ejabberd_buddy_roster, "subs": "both" }) ejabberd.add_rosteritem({ "localuser": inviter.cn, "localhost": inviter.ou, - "user": username, "host": domain, - "nick": username, "group": Setting.ejabberd_buddy_roster, "subs": "both" + "user": invitee.cn, "host": invitee.ou, + "nick": invitee.cn, "group": Setting.ejabberd_buddy_roster, "subs": "both" }) end end diff --git a/app/models/user.rb b/app/models/user.rb index 94c3b14..937bc9c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -59,11 +59,10 @@ class User < ApplicationRecord enable_service %w[ discourse ejabberd gitea mediawiki ] #TODO enable in development when we have easy setup of ejabberd etc. - return if Rails.env.development? + return if Rails.env.development? || !Setting.ejabberd_enabled? - if inviter.present? - exchange_xmpp_contact_with_inviter if Setting.ejabberd_enabled? - end + XmppExchangeContactsJob.perform_later(inviter, self) if inviter.present? + XmppSetDefaultBookmarksJob.perform_later(self) end def send_devise_notification(notification, *args) @@ -134,12 +133,6 @@ class User < ApplicationRecord ldap.delete_attribute(dn,:service) end - def exchange_xmpp_contact_with_inviter - return unless inviter.services_enabled.include?("ejabberd") && - services_enabled.include?("ejabberd") - XmppExchangeContactsJob.perform_later(inviter, self.cn, self.ou) - end - private def ldap diff --git a/spec/jobs/xmpp_exchange_contacts_job_spec.rb b/spec/jobs/xmpp_exchange_contacts_job_spec.rb index f7732dc..013a80d 100644 --- a/spec/jobs/xmpp_exchange_contacts_job_spec.rb +++ b/spec/jobs/xmpp_exchange_contacts_job_spec.rb @@ -2,15 +2,18 @@ require 'rails_helper' require 'webmock/rspec' RSpec.describe XmppExchangeContactsJob, type: :job do - let(:user) { create :user, cn: "willherschel", ou: "kosmos.org" } + let(:user) { create :user, cn: "willherschel", ou: "kosmos.org" } + let(:guest) { create :user, cn: "isaacnewton", ou: "kosmos.org", + id: 2, email: "hotapple42@eol.com" } subject(:job) { - described_class.perform_later(user, 'isaacnewton', 'kosmos.org') + described_class.perform_later(user, guest) } before do stub_request(:post, "http://xmpp.example.com/api/add_rosteritem") .to_return(status: 200, body: "", headers: {}) + allow_any_instance_of(User).to receive(:services_enabled).and_return(["ejabberd"]) end it "posts add_rosteritem commands to the ejabberd API" do diff --git a/spec/jobs/xmpp_set_default_bookmarks_job_spec.rb b/spec/jobs/xmpp_set_default_bookmarks_job_spec.rb new file mode 100644 index 0000000..299cbcc --- /dev/null +++ b/spec/jobs/xmpp_set_default_bookmarks_job_spec.rb @@ -0,0 +1,34 @@ +require 'rails_helper' +require 'webmock/rspec' + +RSpec.describe XmppSetDefaultBookmarksJob, type: :job do + let(:user) { create :user, cn: "willherschel", ou: "kosmos.org" } + + before do + Setting.xmpp_default_rooms = [ + "Welcome ", + "Kosmos Dev " + ] + end + + subject(:job) { + described_class.perform_later(user) + } + + before do + stub_request(:post, "http://xmpp.example.com/api/private_set") + .to_return(status: 200, body: "", headers: {}) + end + + it "posts a private_set command to the ejabberd API" do + perform_enqueued_jobs { job } + + expect(WebMock).to have_requested(:post, "http://xmpp.example.com/api/private_set") + .with { |req| req.body == '{"user":"willherschel","host":"kosmos.org","element":"\u003cstorage xmlns=\'storage:bookmarks\'\u003e\u003cconference jid=\'welcome@kosmos.chat\' name=\'Welcome\' autojoin=\'false\'\u003e\u003cnick\u003ewillherschel\u003c/nick\u003e\u003c/conference\u003e\u003cconference jid=\'kosmos-dev@kosmos.chat\' name=\'Kosmos Dev\' autojoin=\'false\'\u003e\u003cnick\u003ewillherschel\u003c/nick\u003e\u003c/conference\u003e\u003c/storage\u003e"}' } + end + + after do + clear_enqueued_jobs + clear_performed_jobs + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 1dfc1ac..b8f8675 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -101,38 +101,23 @@ RSpec.describe User, type: :model do end end - describe "#exchange_xmpp_contact_with_inviter" do - include ActiveJob::TestHelper - - let(:user) { create :user, cn: "willherschel", ou: "kosmos.org" } - let(:guest) { create :user, id: 2, cn: "isaacnewton", ou: "kosmos.org", email: "newt@example.com" } - - before do - Invitation.create! user: user, invited_user_id: guest.id, used_at: DateTime.now - allow_any_instance_of(User).to receive(:services_enabled).and_return(%w[ ejabberd ]) - end - - it "enqueues a job to exchange XMPP contacts between inviter and invitee" do - guest.send(:exchange_xmpp_contact_with_inviter) - - expect(enqueued_jobs.size).to eq(1) - args = enqueued_jobs.first['arguments'] - expect(args[0]['_aj_globalid']).to match('gid://akkounts/User') - expect(args[1]).to eq('isaacnewton') - expect(args[2]).to eq('kosmos.org') - end - - after do - clear_enqueued_jobs - end - end - describe "#devise_after_confirmation" do + include ActiveJob::TestHelper + after { clear_enqueued_jobs } + let(:user) { create :user, cn: "willherschel", ou: "kosmos.org" } it "enables default services" do expect(user).to receive(:enable_service).with(%w[ discourse ejabberd gitea mediawiki ]) - user.send(:devise_after_confirmation) + user.send :devise_after_confirmation + end + + it "enqueues a job to set default chatroom bookmarks for XMPP" do + allow(user).to receive(:enable_service).and_return(true) + user.send :devise_after_confirmation + + job = enqueued_jobs.select{|j| j['job_class'] == "XmppSetDefaultBookmarksJob"}.first + expect(job['arguments'][0]['_aj_globalid']).to eq('gid://akkounts/User/1') end context "for invited user with ejabberd enabled" do @@ -140,12 +125,15 @@ RSpec.describe User, type: :model do before do Invitation.create! user: user, invited_user_id: guest.id, used_at: DateTime.now - allow_any_instance_of(User).to receive(:enable_service).and_return(true) + allow_any_instance_of(User).to receive(:enable_service) end - it "exchanges XMPP contacts with the inviter" do - expect(guest).to receive(:exchange_xmpp_contact_with_inviter) - guest.send(:devise_after_confirmation) + it "enqueues jobs to exchange XMPP contacts between inviter and invitee" do + guest.send :devise_after_confirmation + + job = enqueued_jobs.select{|j| j['job_class'] == "XmppExchangeContactsJob"}.first + expect(job["arguments"][0]['_aj_globalid']).to eq('gid://akkounts/User/1') + expect(job["arguments"][1]['_aj_globalid']).to eq('gid://akkounts/User/2') end end end