diff --git a/app/controllers/api/v1/omniauth_callbacks_controller.rb b/app/controllers/api/v1/omniauth_callbacks_controller.rb index 1618c47331..8f4d16aab1 100644 --- a/app/controllers/api/v1/omniauth_callbacks_controller.rb +++ b/app/controllers/api/v1/omniauth_callbacks_controller.rb @@ -1,7 +1,6 @@ module Api module V1 class OmniauthCallbacksController < Devise::OmniauthCallbacksController - include TwitterAuthentication include FacebookAuthentication include SlackAuthentication include GoogleAuthentication @@ -21,7 +20,6 @@ def failure end def setup - setup_twitter if request.env['omniauth.strategy'].is_a?(OmniAuth::Strategies::Twitter) setup_facebook if request.env['omniauth.strategy'].is_a?(OmniAuth::Strategies::Facebook) render plain: 'Setup complete.', status: 404 end diff --git a/app/controllers/api/v1/registrations_controller.rb b/app/controllers/api/v1/registrations_controller.rb deleted file mode 100644 index 4ceefa72a5..0000000000 --- a/app/controllers/api/v1/registrations_controller.rb +++ /dev/null @@ -1,80 +0,0 @@ -class Api::V1::RegistrationsController < Devise::RegistrationsController - before_action :configure_sign_up_params, only: [:create] - before_action :configure_account_update_params, only: [:update] - - respond_to :json - - include RegistrationsDoc - - # POST /resource - def create - # super - build_resource(sign_up_params) - - begin - duplicate_user = User.get_duplicate_user(resource.email, [])[:user] - user = resource - error = [ - { - message: I18n.t(:email_exists) - } - ] - if !duplicate_user.nil? && duplicate_user.invited_to_sign_up? - duplicate_user.last_accepted_terms_at = Time.now - duplicate_user.save! - else - resource.last_accepted_terms_at = Time.now - resource.save! - end - - render_success user, 'user', 401, error - rescue ActiveRecord::RecordInvalid => e - # Check if the error is specifically related to the email being taken - if resource.errors.details[:email].any? { |email_error| email_error[:error] == :taken } && resource.errors.details.except(:email).empty? - render_success nil, 'user', 401, error - else - # For other errors, show the error message in the form - clean_up_passwords resource - set_minimum_password_length - render_error e.message.gsub("Email #{I18n.t(:email_exists)}
", '').strip, 'INVALID_VALUE', 401 - end - end - end - - # PUT /resource - def update - # super - self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key) - - resource_updated = update_resource(resource, account_update_params) - User.current = resource - - if resource_updated - sign_in resource, scope: resource_name, bypass_sign_in: true - render_success 'user', resource - else - clean_up_passwords resource - render_error 'Could not update user: ' + resource.errors.full_messages.join(', '), 'INVALID_VALUE' - end - end - - # DELETE /resource - def destroy - # super - resource.destroy - Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name) - render_success - end - - protected - - # If you have extra params to permit, append them to the sanitizer. - def configure_sign_up_params - devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :login, :password, :password_confirmation, :image]) - end - - # If you have extra params to permit, append them to the sanitizer. - def configure_account_update_params - devise_parameter_sanitizer.permit(:account_update, keys: [:name, :password, :password_confirmation, :current_password]) - end -end diff --git a/app/controllers/concerns/twitter_authentication.rb b/app/controllers/concerns/twitter_authentication.rb deleted file mode 100644 index a8d1cd0af8..0000000000 --- a/app/controllers/concerns/twitter_authentication.rb +++ /dev/null @@ -1,15 +0,0 @@ -module TwitterAuthentication - extend ActiveSupport::Concern - - def setup_twitter - prefix = params[:context].to_s == 'smooch' ? 'smooch_' : '' - request.env['omniauth.strategy'].options[:consumer_key] = CheckConfig.get("#{prefix}twitter_consumer_key") - request.env['omniauth.strategy'].options[:consumer_secret] = CheckConfig.get("#{prefix}twitter_consumer_secret") - end - - # OAuth callback - def twitter - request.env['omniauth.auth']['url'] = 'https://twitter.com/' + request.env['omniauth.auth'].info.nickname - start_session_and_redirect - end -end diff --git a/app/mailers/registration_mailer.rb b/app/mailers/registration_mailer.rb deleted file mode 100644 index 7c03b947cf..0000000000 --- a/app/mailers/registration_mailer.rb +++ /dev/null @@ -1,19 +0,0 @@ -class RegistrationMailer < ApplicationMailer - layout nil - - def welcome_email(user, password=nil) - @user = user - @user.password ||= password - @url = CheckConfig.get('checkdesk_client') - mail(to: @user.email, subject: I18n.t("mails_notifications.register.subject", app_name: CheckConfig.get('app_name'))) unless @user.email.blank? - end - - def duplicate_email_detection(user, provider) - @user = user - @duplicate_provider = provider.blank? ? I18n.t("mails_notifications.duplicated.email") : provider - @user_provider = user.encrypted_password? ? I18n.t("mails_notifications.duplicated.email") : user.get_user_provider(user.email) - @body_key = (provider.blank? && user.encrypted_password?) ? "both_emails" : "one_email" - mail(to: @user.email, subject: I18n.t("mails_notifications.duplicated.subject", app_name: CheckConfig.get('app_name'))) unless @user.email.blank? - end - -end diff --git a/app/models/concerns/user_invitation.rb b/app/models/concerns/user_invitation.rb index 55c7b152e8..3b9c755273 100644 --- a/app/models/concerns/user_invitation.rb +++ b/app/models/concerns/user_invitation.rb @@ -21,7 +21,7 @@ def self.send_user_invitation(members, text=nil) user = User.invite!({:email => email, :name => email.split("@").first, :invitation_role => role, :invitation_text => text}, User.current) do |iu| iu.skip_invitation = true end - user.update_column(:raw_invitation_token, user.raw_invitation_token) + user.update_columns(raw_invitation_token: user.raw_invitation_token, encrypted_password: nil) else u.invitation_role = role u.invitation_text = text @@ -110,17 +110,20 @@ def is_invited?(team = nil) private def create_team_user_invitation(options = {}) - tu = TeamUser.new - tu.user_id = self.id - tu.team_id = Team.current.id - tu.role = self.invitation_role - tu.status = 'invited' - tu.invited_by_id = self.invited_by_id - tu.invited_by_id ||= User.current.id unless User.current.nil? - tu.invitation_token = self.invitation_token || options[:enc] - tu.raw_invitation_token = self.read_attribute(:raw_invitation_token) || self.raw_invitation_token || options[:raw] - tu.invitation_email = options[:email] || self.email - self.send_invitation_mail(tu) if tu.save! + team_id = Team.current&.id + unless team_id.nil? + tu = TeamUser.new + tu.user_id = self.id + tu.team_id = team_id + tu.role = self.invitation_role + tu.status = 'invited' + tu.invited_by_id = self.invited_by_id + tu.invited_by_id ||= User.current.id unless User.current.nil? + tu.invitation_token = self.invitation_token || options[:enc] + tu.raw_invitation_token = self.read_attribute(:raw_invitation_token) || self.raw_invitation_token || options[:raw] + tu.invitation_email = options[:email] || self.email + self.send_invitation_mail(tu) if tu.save! + end end def self.accept_team_user_invitation(tu, token, options) diff --git a/app/models/concerns/user_multi_auth_login.rb b/app/models/concerns/user_multi_auth_login.rb index 146d8283de..393e2c42eb 100644 --- a/app/models/concerns/user_multi_auth_login.rb +++ b/app/models/concerns/user_multi_auth_login.rb @@ -15,7 +15,8 @@ def self.from_omniauth(auth, current_user=nil) duplicate_user.accept_invitation_or_confirm unless duplicate_user.nil? u = self.check_merge_users(u, current_user, duplicate_user) u ||= current_user - user = self.create_omniauth_user(u, auth) + raise I18n.t('errors.messages.restrict_registration_to_invited_users_only') if u.nil? + user = self.update_omniauth_user(u, auth) User.create_omniauth_account(auth, user) unless auth.url.blank? || auth.provider.blank? user.reload end @@ -39,11 +40,11 @@ def self.check_merge_users(u, current_user, duplicate_user) u end - def self.create_omniauth_user(u, auth) - user = u.nil? ? User.new : u + def self.update_omniauth_user(u, auth) + user = u user.email = user.email.presence || auth.info.email user.name = user.name.presence || auth.info.name - user.login = auth.info.nickname || auth.info.name.tr(' ', '-').downcase + user.login = auth.info.nickname.blank? ? auth.info.name.tr(' ', '-').downcase : auth.info.nickname user.from_omniauth_login = true user.skip_confirmation! user.last_accepted_terms_at = Time.now if user.last_accepted_terms_at.nil? diff --git a/app/models/concerns/user_private.rb b/app/models/concerns/user_private.rb index c48d1d8b99..f5962c0cfc 100644 --- a/app/models/concerns/user_private.rb +++ b/app/models/concerns/user_private.rb @@ -25,18 +25,7 @@ def set_token end def set_login - if self.login.blank? - if self.email.blank? - self.login = self.name.tr(' ', '-').downcase - else - self.login = self.email.split('@')[0] - end - end - end - - def send_welcome_email - config_value = JSON.parse(CheckConfig.get('send_welcome_email_on_registration').to_s) - RegistrationMailer.delay.welcome_email(self) if self.encrypted_password? && config_value && !self.is_invited? + self.login = self.email.split('@')[0] if self.login.blank? end def user_is_member_in_current_team @@ -53,7 +42,10 @@ def validate_duplicate_email duplicate = User.get_duplicate_user(self.email, self.id) unless duplicate[:user].nil? errors.add(:email, I18n.t(:email_exists)) if duplicate[:type] == 'Account' - handle_duplicate_email(duplicate[:user]) + unless duplicate[:user].is_active? + self.errors.clear + errors.add(:base, I18n.t(:banned_user, app_name: CheckConfig.get('app_name'), support_email: CheckConfig.get('support_email'))) + end return false end end @@ -63,16 +55,6 @@ def password_complexity errors.add :password, I18n.t(:error_password_not_strong) end - def handle_duplicate_email(u) - if u.is_active? - provider = u.get_user_provider(self.email) - RegistrationMailer.delay.duplicate_email_detection(self, provider) if self.new_record? - else - self.errors.clear - errors.add(:base, I18n.t(:banned_user, app_name: CheckConfig.get('app_name'), support_email: CheckConfig.get('support_email'))) - end - end - def skip_confirmation_for_non_email_provider self.skip_confirmation! if self.from_omniauth_login && self.skip_confirmation_mail.nil? end diff --git a/app/models/user.rb b/app/models/user.rb index 26366dc48d..5a67fcb38c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -30,12 +30,11 @@ class ToSOrPrivacyPolicyReadError < StandardError; end has_many :api_keys has_many :explainers - devise :registerable, - :recoverable, :rememberable, :trackable, :validatable, :confirmable, + devise :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable, omniauth_providers: [:twitter, :facebook, :slack, :google_oauth2] before_create :skip_confirmation_for_non_email_provider, :set_last_received_terms_email_at - after_create :create_source_and_account, :set_source_image, :send_welcome_email + after_create :create_source_and_account, :set_source_image before_save :set_token, :set_login after_update :set_blank_email_for_unconfirmed_user before_destroy :freeze_account_ids_and_source_id @@ -174,23 +173,9 @@ def is_member_of?(team) end def handle - self.email.blank? ? get_provider_from_user_account : self.email - end - - def get_provider_from_user_account - account = self.get_social_accounts_for_login - account = account.first unless account.nil? - return nil if account.nil? - provider = account.provider.capitalize - if !account.omniauth_info.nil? - if account.provider == 'slack' - provider = account.omniauth_info.dig('extra', 'raw_info', 'url') - else - provider = account.omniauth_info.dig('url') - return provider if !provider.nil? - end - end - "#{self.login} at #{provider}" + # As we must invite users first then the email must exists + # which means the handle is email address + self.email end # Whether two users are members of any same team diff --git a/app/views/registration_mailer/duplicate_email_detection.html.erb b/app/views/registration_mailer/duplicate_email_detection.html.erb deleted file mode 100644 index 1c089ce856..0000000000 --- a/app/views/registration_mailer/duplicate_email_detection.html.erb +++ /dev/null @@ -1,93 +0,0 @@ -<%= render "shared/header" %> - - - - - -
- - - - -
 
-
- - -
-
-
- <%= I18n.t("mails_notifications.greeting_anonymous") %> -
- - - - -
 
-
- <%= I18n.t("mails_notifications.duplicated.header_title") %> -
- - - - -
 
-
-
- <%= - I18n.t("mails_notifications.duplicated.#{@body_key}", user_email: @user.email, user_provider: @user_provider, duplicate_provider: @duplicate_provider, app_name: CheckConfig.get('app_name'), support_email: CheckConfig.get('support_email')).html_safe - %> -
-
-
- - - - - -
 
- - - - - - - - -
 
- - -<%= render "shared/footer" %> diff --git a/app/views/registration_mailer/duplicate_email_detection.text.erb b/app/views/registration_mailer/duplicate_email_detection.text.erb deleted file mode 100644 index ce4bdbe6ae..0000000000 --- a/app/views/registration_mailer/duplicate_email_detection.text.erb +++ /dev/null @@ -1,14 +0,0 @@ -<%= I18n.t("mails_notifications.greeting_anonymous") %> - -========================================== -<%= I18n.t("mails_notifications.duplicated.header_title") %> -========================================== - -<%= - strip_tags I18n.t("mails_notifications.duplicated.#{@body_key}", user_email: @user.email, user_provider: @user_provider, duplicate_provider: @duplicate_provider, app_name: CheckConfig.get('app_name'), support_email: CheckConfig.get('support_email')).html_safe -%> - -... - -<%= strip_tags I18n.t("mails_notifications.copyright_html", app_name: CheckConfig.get('app_name')) %> -https://meedan.com diff --git a/app/views/registration_mailer/welcome_email.html.erb b/app/views/registration_mailer/welcome_email.html.erb deleted file mode 100644 index 4a49c640eb..0000000000 --- a/app/views/registration_mailer/welcome_email.html.erb +++ /dev/null @@ -1,133 +0,0 @@ -<%= render "shared/header" %> - - - - - -
- - - - -
 
-
- - -
-
-
- <%= I18n.t("mails_notifications.greeting", username: @user.name) %> -
- - - - -
 
-
- <%= I18n.t(:mail_view_welcome, app_name: CheckConfig.get('app_name')) %> -
- - - - -
 
-
-
- <%= - I18n.t("mails_notifications.register.header_text", app_name: CheckConfig.get('app_name'), url: @url, password: @user.password).html_safe - %> -
-
-
- - - - - -
 
- - - - -
- - - - - -
- - - - - -
- - <%= - link_to(I18n.t("mails_notifications.register.login_button", app_name: CheckConfig.get('app_name')), @url, - :style => "text-decoration: none !important;color: #fff !important;" - ) - %> - - - <%= image_tag("https://images.ctfassets.net/g118h5yoccvd/#{@direction[:arrow]}", width: "7", alt: "arrow-icon", style: "-ms-interpolation-mode: bicubic; border: 0 none; height: auto; line-height: 100%; outline: none; text-decoration: none;") %> -
-
- - - - - -
 
- -
-
- <%= t("mails_notifications.register.footer_text") %> -
-
- -
- - - - - -
 
- - -<%= render "shared/footer" %> diff --git a/app/views/registration_mailer/welcome_email.text.erb b/app/views/registration_mailer/welcome_email.text.erb deleted file mode 100644 index 2f0ba25b24..0000000000 --- a/app/views/registration_mailer/welcome_email.text.erb +++ /dev/null @@ -1,19 +0,0 @@ -<%= I18n.t("mails_notifications.greeting", username: @user.name) %> - -========================================== -<%= I18n.t(:mail_view_welcome, app_name: CheckConfig.get('app_name')) %> -========================================== - -<%= - strip_tags I18n.t("mails_notifications.register.header_text", app_name: CheckConfig.get('app_name'), url: @url, password: @user.password) -%> - -<%= I18n.t("mails_notifications.register.login_button", app_name: CheckConfig.get('app_name')) %> -<%= @url %> - -<%= t("mails_notifications.register.footer_text") %> - -... - -<%= strip_tags I18n.t("mails_notifications.copyright_html", app_name: CheckConfig.get('app_name')) %> -https://meedan.com diff --git a/config/locales/en.yml b/config/locales/en.yml index 0cca7eb910..34d967b424 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -113,6 +113,7 @@ en: invalid_feed_saved_search_value: Should belong to a workspace that is part of this feed. invalid_feed_saved_search_list_type: The saved search list type is invalid. platform_allowed_values_error: 'cannot be of type %{type}, allowed types: %{allowed_types}' + restrict_registration_to_invited_users_only: 'Looks like you don’t have an invitation yet. Please request one from your workspace.' activerecord: models: link: Link diff --git a/config/routes.rb b/config/routes.rb index a790b10c50..682ae2d413 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -34,7 +34,7 @@ match '/admin/smooch_bot/:id/authorize/instagram' => 'admin#save_instagram_credentials_for_smooch_bot', via: [:get] match '/project_medias/:id/oembed' => 'project_medias#oembed', via: [:get], defaults: { format: :json } match '/webhooks/:name' => 'webhooks#index', via: [:post, :get], defaults: { format: :json } - devise_for :users, controllers: { invitations: 'api/v1/invitations', sessions: 'api/v1/sessions', registrations: 'api/v1/registrations', omniauth_callbacks: 'api/v1/omniauth_callbacks', confirmations: 'api/v1/confirmations' } + devise_for :users, controllers: { invitations: 'api/v1/invitations', sessions: 'api/v1/sessions', omniauth_callbacks: 'api/v1/omniauth_callbacks', confirmations: 'api/v1/confirmations' } devise_scope :api_user do get '/users/logout', to: 'omniauth_callbacks#logout' get '/users/auth/twitter/setup' => 'omniauth_callbacks#setup' diff --git a/lib/sample_data.rb b/lib/sample_data.rb index 6f5a9ad1d7..5e8ec926bd 100644 --- a/lib/sample_data.rb +++ b/lib/sample_data.rb @@ -139,7 +139,20 @@ def create_user(options = {}) u.reload end + def invite_new_user(options = {}) + email = options.has_key?(:email) ? options[:email] : "#{random_string}@#{random_string}.com" + name = options.has_key?(:name) ? options[:name] : random_string + user = User.invite!(email: email, name: name) do |u| + u.skip_invitation = true + end + user.update_column(:encrypted_password, nil) + user + end + def create_omniauth_user(options = {}) + # Invite user first + options[:email] ||= "#{random_string}@#{random_string}.com" + invite_new_user(options) u_current = User.current url = if options.has_key?(:url) options[:url] @@ -154,11 +167,11 @@ def create_omniauth_user(options = {}) end options[:uid] = options[:uuid] if options.has_key?(:uuid) auth = {} - provider = options.has_key?(:provider) ? options[:provider] : %w(twitter facebook).sample - email = options.has_key?(:email) ? options[:email] : "#{random_string}@#{random_string}.com" + provider = options.has_key?(:provider) ? options[:provider] : %w(google slack).sample auth[:uid] = options.has_key?(:uid) ? options[:uid] : random_string auth[:url] = url - auth[:info] = options.has_key?(:info) ? options[:info] : {name: random_string, email: email} + options[:info][:email] = options[:email] if options.has_key?(:info) && options[:info][:email].nil? + auth[:info] = options.has_key?(:info) ? options[:info] : {name: random_string, email: options[:email]} auth[:credentials] = options.has_key?(:credentials) ? options[:credentials] : {token: random_string, secret: random_string} auth[:extra] = options.has_key?(:extra) ? options[:extra] : {} current_user = options.has_key?(:current_user) ? options[:current_user] : nil diff --git a/test/controllers/base_api_controller_test.rb b/test/controllers/base_api_controller_test.rb index 3991da0b19..10b9989765 100644 --- a/test/controllers/base_api_controller_test.rb +++ b/test/controllers/base_api_controller_test.rb @@ -41,23 +41,23 @@ def setup end test "should get current user from session" do - u = create_omniauth_user info: {name: 'Test User'} + u = create_omniauth_user email: 'test@local.com', info: {name: 'Test User'} authenticate_with_user(u) get :me, params: {} assert_response :success response = JSON.parse(@response.body) - assert_equal 'Test User', response['data']['name'] + assert_equal 'test@local.com', response['data']['email'] assert_equal 'session', response['data']['source'] end test "should get current user from token" do - u = create_omniauth_user info: {name: 'Test User'} + u = create_omniauth_user email: 'test@local.com', info: { name: 'Test User', email: 'test@local.com' } header = CheckConfig.get('authorization_header') || 'X-Token' @request.headers.merge!({ header => u.token }) get :me, params: {} assert_response :success response = JSON.parse(@response.body) - assert_equal 'Test User', response['data']['name'] + assert_equal 'test@local.com', response['data']['email'] assert_equal 'token', response['data']['source'] end diff --git a/test/controllers/omniauth_callbacks_controller_test.rb b/test/controllers/omniauth_callbacks_controller_test.rb index 56165f4b89..fb7e6365d1 100644 --- a/test/controllers/omniauth_callbacks_controller_test.rb +++ b/test/controllers/omniauth_callbacks_controller_test.rb @@ -5,19 +5,6 @@ def setup super @controller = Api::V1::OmniauthCallbacksController.new OmniAuth.config.test_mode = true - OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new({ - provider: 'twitter', - uid: '654321', - info: { - name: 'Test', - image: 'http://twitter.com/test/image.png', - nickname: 'test' - }, - credentials: { - token: '123456', - secret: 'top_secret' - } - }) OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({ provider: 'facebook', uid: '654321', @@ -77,8 +64,11 @@ def setup secret: 'top_secret' } }) + [{email: 'test@test.com', name: 'Test'}, {email: 'sawy@meedan.com', name: 'Mohamed El-Sawy'}].each do |info| + invite_new_user info + end request.env['devise.mapping'] = Devise.mappings[:api_user] - ['https://twitter.com/test', 'https://facebook.com/654321', 'https://www.googleapis.com/plus/v1/people/654321'].each do |url| + ['https://facebook.com/654321', 'https://www.googleapis.com/plus/v1/people/654321'].each do |url| WebMock.stub_request(:get, CheckConfig.get('pender_url_private') + '/api/medias').with({ query: { url: url } }).to_return(body: '{"type":"media","data":{"type":"profile"}}') end User.current = nil @@ -89,25 +79,6 @@ def teardown User.current = nil end - test "should redirect to root after Twitter authentication" do - request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:twitter] - get :twitter, params: {} - assert_redirected_to '/close.html' - end - - test "should set information in session after Twitter authentication" do - request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:twitter] - assert_nil session['checkdesk.user'] - get :twitter, params: {} - assert_not_nil session['checkdesk.current_user_id'] - end - - test "should redirect to destination after Twitter authentication" do - request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:twitter] - get :twitter, params: { destination: '/close.html' } - assert_redirected_to '/close.html' - end - test "should set information in session after Facebook authentication" do request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:facebook] assert_nil session['checkdesk.user'] @@ -190,12 +161,11 @@ def teardown end test "should connect when current user set" do - p1 = random_complex_password - u = create_user login: 'test', password: p1, password_confirmation: p1, email: 'test@test.com' + u = User.where(email: 'test@test.com').first u.confirm authenticate_with_user(u) - request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:twitter] - get :twitter, params: {} + request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:facebook] + get :facebook, params: {} u = User.find(u.id) assert_equal 1, u.source.accounts.count end @@ -219,12 +189,6 @@ def teardown assert_redirected_to '/close.html' end - test "should setup Twitter authentication" do - request.env['omniauth.strategy'] = OmniAuth::Strategies::Twitter.new({}) - get :setup, params: {} - assert_response 404 - end - test "should setup Facebook authentication" do request.env['omniauth.strategy'] = OmniAuth::Strategies::Facebook.new({}) get :setup, params: {} diff --git a/test/controllers/registrations_controller_test.rb b/test/controllers/registrations_controller_test.rb deleted file mode 100644 index 46ca89c0bf..0000000000 --- a/test/controllers/registrations_controller_test.rb +++ /dev/null @@ -1,167 +0,0 @@ -require_relative '../test_helper' - -class RegistrationsControllerTest < ActionController::TestCase - def setup - super - @controller = Api::V1::RegistrationsController.new - @request.env["devise.mapping"] = Devise.mappings[:api_user] - User.current = nil - Team.current = nil - end - - def teardown - super - User.current = nil - Team.current = nil - end - - test "should create user" do - p1 = random_complex_password - assert_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: 't@test.com', login: 'test', name: 'Test' } } - assert_response 401 # needs to confirm before login - end - end - - test "should create user if invited" do - t = create_team - u = create_user - email = 'test@local.com' - create_team_user team: t, user: u, role: 'admin' - with_current_user_and_team(u, t) do - members = [{role: 'collaborator', email: email}] - User.send_user_invitation(members) - end - User.current = Team.current = nil - p1 = random_complex_password - assert_no_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: email, login: 'test', name: 'Test' } } - assert_response 401 - end - end - - test "should create user if confirmed" do - p1 = random_complex_password - User.any_instance.stubs(:confirmation_required?).returns(false) - assert_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: 't@test.com', login: 'test', name: 'Test' } } - assert_response 401 - end - User.any_instance.unstub(:confirmation_required?) - end - - test "should not create user if password is missing" do - p1 = random_complex_password - assert_no_difference 'User.count' do - post :create, params: { api_user: { password_confirmation: p1, email: 't@test.com', login: 'test', name: 'Test' } } - assert_response 401 - end - end - - test "should not create user if password is too short" do - p1 = '1234' - assert_no_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: 't@test.com', login: 'test', name: 'Test' } } - assert_response 401 - end - end - - test "should not create user if password don't match" do - p1 = random_complex_password - assert_no_difference 'User.count' do - post :create, params: { api_user: { password: random_complex_password, password_confirmation: random_complex_password, email: 't@test.com', login: 'test', name: 'Test' } } - assert_response 401 - end - end - - test "should not create user if email is not present" do - p1 = random_complex_password - assert_no_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: '', login: 'test', name: 'Test' } } - assert_response 401 - end - end - - test "should create user if login is not present" do - p1 = random_complex_password - assert_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: 't@test.com', login: '', name: 'Test' } } - assert_response 401 # needs to confirm before login - end - end - - test "should not create user if name is not present" do - p1 = random_complex_password - assert_no_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: 't@test.com', login: 'test', name: '' } } - assert_response 401 - end - end - - test "should update only a few attributes" do - p1 = random_complex_password - u = create_user name: 'Foo', login: 'test', token: 'test', email: 'foo@test.com', password: p1 - authenticate_with_user(u) - post :update, params: { api_user: { name: 'Bar', login: 'bar', token: 'bar', email: 'bar@test.com', current_password: p1 } } - assert_response :success - u = u.reload - assert_equal 'Bar', u.name - assert_equal 'test', u.login - assert_equal 'test', u.token - assert_empty u.email - assert_equal 'bar@test.com', u.unconfirmed_email - end - - test "should not update account if not logged in" do - p1 = random_complex_password - post :update, params: { api_user: { name: 'Bar', login: 'bar', token: 'bar', email: 'bar@test.com', current_password: p1 } } - assert_response 401 - end - - test "should not update account" do - p1 = random_complex_password - u = create_user name: 'Foo', login: 'test', token: 'test', email: 'foo@test.com', password: p1 - authenticate_with_user(u) - post :update, params: { api_user: { name: 'Bar', login: 'bar', token: 'bar', email: 'bar@test.com', current_password: p1, password: '123', password_confirmation: '123' } } - assert_response 400 - u = u.reload - end - - test "should destroy account" do - p1 = random_complex_password - u = create_user name: 'Foo', login: 'test', token: 'test', email: 'foo@test.com', password: p1 - authenticate_with_user(u) - assert_difference 'User.count', -1 do - delete :destroy, params: {} - end - assert_response :success - end - - test "should not destroy account if not logged in" do - assert_no_difference 'User.count' do - delete :destroy, params: {} - end - assert_response 401 - end - - test "should return generic response in case of error when registering using an existing email" do - existing_user = create_user(email: 'existing@test.com') - p1 = random_complex_password - - assert_no_difference 'User.count' do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: existing_user.email, login: 'test', name: 'Test' } } - assert_response 401 - assert_equal 'Please check your email. If an account with that email doesn’t exist, you should have received a confirmation email. If you don’t receive a confirmation e-mail, try to reset your password or get in touch with our support.', response.parsed_body.dig("errors", 0, "message") - end - end - - test "should return generic response when registering with non-existing email" do - p1 = random_complex_password - - assert_difference 'User.count', 1 do - post :create, params: { api_user: { password: p1, password_confirmation: p1, email: 'non_existing@test.com', login: 'test', name: 'Test' } } - assert_response 401 - assert_equal 'Please check your email. If an account with that email doesn’t exist, you should have received a confirmation email. If you don’t receive a confirmation e-mail, try to reset your password or get in touch with our support.', response.parsed_body.dig("errors", 0, "message") - end - end -end diff --git a/test/mailers/registration_mailer_test.rb b/test/mailers/registration_mailer_test.rb deleted file mode 100644 index 0e7a2bb7df..0000000000 --- a/test/mailers/registration_mailer_test.rb +++ /dev/null @@ -1,28 +0,0 @@ -require_relative '../test_helper' - -class RegistrationMailerTest < ActionMailer::TestCase - - test "should send welcome email" do - u = create_user email: 'test@localhost', password: 'testA@12' - email = RegistrationMailer.welcome_email(u) - - assert_emails 1 do - email.deliver_now - end - - assert_match email.from.first, CheckConfig.get('default_mail') - assert_equal ['test@localhost'], email.to - assert_match /testA@12/, email.body.parts.first.to_s - end - - test "should send email for mail duplicate" do - u = create_user email: 'test@localhost' - email = RegistrationMailer.duplicate_email_detection(u, u) - assert_emails 1 do - email.deliver_now - end - assert_match email.from.first, CheckConfig.get('default_mail') - assert_equal ['test@localhost'], email.to - end - -end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index cb8233a8ce..0c3a8eeb11 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -72,21 +72,13 @@ def setup test "should not require password if there is a provider" do assert_nothing_raised do - create_omniauth_user password: '', provider: 'twitter' + create_omniauth_user password: '', provider: 'slack' end assert_raises ActiveRecord::RecordInvalid do create_user password: '' end end - test "should not require email for omniauth user" do - u = nil - assert_nothing_raised do - u = create_omniauth_user email: '' - end - assert_equal '', u.reload.email - end - test "should output json" do u = create_user assert_nothing_raised do @@ -157,8 +149,8 @@ def setup end test "should set login from name" do - info = {login: '', nickname: '', name: 'Foo Bar'} - u = create_omniauth_user provider: 'facebook', info: info, email: '' + info = {login: '', nickname: '', name: 'Foo Bar', email: 'test@local.com'} + u = create_omniauth_user provider: 'facebook', info: info, email: 'test@local.com' assert_equal 'foo-bar', u.reload.login end @@ -167,35 +159,6 @@ def setup assert_equal 'foobar', u.reload.login end - test "should send welcome email when user is created" do - stub_configs({ 'send_welcome_email_on_registration' => true }) do - assert_difference 'ActionMailer::Base.deliveries.size', 1 do - create_user skip_confirmation: true - end - assert_no_difference 'ActionMailer::Base.deliveries.size' do - create_omniauth_user provider: 'twitter', password: nil - create_omniauth_user provider: 'facebook', password: nil - end - end - - stub_configs({ 'send_welcome_email_on_registration' => false }) do - assert_no_difference 'ActionMailer::Base.deliveries.size' do - create_user skip_confirmation: true - create_omniauth_user provider: 'twitter' - create_omniauth_user provider: 'facebook' - end - end - end - - test "should send email when user email is duplicate" do - u = create_omniauth_user provider: 'facebook' - assert_difference 'ActionMailer::Base.deliveries.size', 1 do - assert_raises ActiveRecord::RecordInvalid do - create_user email: u.email - end - end - end - test "should not add duplicate mail" do u = create_user create_account user: u, source: u.source, provider: 'slack', email: 'test@local.com' @@ -381,7 +344,7 @@ def setup test "should not crash when creating user account" do Account.any_instance.stubs(:save).raises(Errno::ECONNREFUSED) assert_nothing_raised do - create_omniauth_user url: 'http://twitter.com/meedan', provider: 'twitter' + create_omniauth_user url: 'http://slack.com/meedan', provider: 'slack' end Account.any_instance.unstub(:save) end @@ -461,13 +424,10 @@ def setup test "should get handle" do u = create_user email: 'user@email.com' assert_equal 'user@email.com', u.handle - u = create_omniauth_user provider: 'facebook', email: '', url: 'https://facebook.com/10157109339765023' - assert_equal 'https://facebook.com/10157109339765023', u.handle - end - - test "should get handle for Slack" do - u = create_omniauth_user provider: 'slack', email: '', info: { name: 'caiosba' }, extra: { 'raw_info' => { 'url' => 'https://meedan.slack.com' } } - assert_equal 'caiosba at https://meedan.slack.com', u.handle + u = create_omniauth_user provider: 'facebook', email: 'test@local.com', url: 'https://facebook.com/10157109339765023' + assert_equal 'test@local.com', u.handle + u = create_omniauth_user provider: 'slack', email: 'test2@local.com', info: { name: 'caiosba' }, extra: { 'raw_info' => { 'url' => 'https://meedan.slack.com' } } + assert_equal 'test2@local.com', u.handle end test "should return whether two users are colleagues in a team" do @@ -487,14 +447,14 @@ def setup end test "should require confirmation for e-mail accounts only" do - u = create_omniauth_user provider: 'twitter' + u = create_omniauth_user provider: 'slack' assert !u.send(:confirmation_required?) u = create_user confirm: false assert u.send(:confirmation_required?) end test "should require confirmation after update email" do - u = create_omniauth_user provider: 'twitter' + u = create_omniauth_user provider: 'slack' assert u.is_confirmed? u = create_user email: 'foo@bar.com', confirm: false assert_not u.is_confirmed? @@ -574,18 +534,6 @@ def setup assert_equal '654321', a.reload.uid end - test "should not update Facebook id if email not set" do - u1 = create_omniauth_user provider: 'facebook', uid: '123456', email: '' - u2 = create_omniauth_user provider: 'facebook', uid: '456789', email: '' - a1 = u1.get_social_accounts_for_login({provider: 'facebook', uid: '123456'}).first - a2 = u2.get_social_accounts_for_login({provider: 'facebook', uid: '456789'}).first - assert_equal '123456', a1.uid - assert_equal '456789', a2.uid - User.update_facebook_uuid(OpenStruct.new({ provider: 'facebook',url: a1.url, uid: '456789', info: OpenStruct.new({ email: '' })})) - assert_equal '123456', a1.reload.uid - assert_equal '456789', a2.reload.uid - end - test "should save valid languages" do u = create_user value = ["en"] @@ -658,6 +606,7 @@ def setup auth = OpenStruct.new({ url: url, provider: 'facebook', uid: '1062518227129764', credentials: credentials, info: info}) Account.any_instance.stubs(:save).returns(false) assert_difference 'User.count' do + invite_new_user email: 'user@fb.com', name: 'John' User.from_omniauth(auth) end u = User.find_by_email 'user@fb.com' @@ -720,11 +669,11 @@ def setup end test "should set source image when call user from omniauth" do - u = create_omniauth_user provider: 'twitter', uid: '12345' + u = create_omniauth_user provider: 'slack', uid: '12345' assert_match /images\/user.png/, u.source.avatar credentials = OpenStruct.new({ token: '1234', secret: 'secret'}) info = OpenStruct.new({ email: 'user@fb.com', name: 'John', image: 'picture.png' }) - auth = OpenStruct.new({ provider: 'twitter', uid: '12345', credentials: credentials, info: info, url: random_url}) + auth = OpenStruct.new({ provider: 'slack', uid: '12345', credentials: credentials, info: info, url: random_url}) omniauth_info = {"info"=> { "image"=>"https://avatars.slack-edge.com/2016-08-30/74454572532_7b40a563ce751e1c1d50_192.jpg"} } Account.any_instance.stubs(:omniauth_info).returns(omniauth_info) User.from_omniauth(auth) @@ -1025,20 +974,6 @@ def setup assert_not_empty result.errors end - test "should not send welcome email for invited user" do - t = create_team - u = create_user - create_team_user team: t, user: u, role: 'admin' - stub_configs({ 'send_welcome_email_on_registration' => true }) do - with_current_user_and_team(u, t) do - assert_difference 'ActionMailer::Base.deliveries.size', 1 do - members = [{role: 'collaborator', email: 'test1@local.com'}] - User.send_user_invitation(members) - end - end - end - end - test "should send invitation using invitation email not primary email" do t = create_team u = create_user email: 'primary@local.com' @@ -1089,14 +1024,14 @@ def setup u = create_user assert_no_difference 'User.count' do assert_difference 'Account.count', 1 do - create_omniauth_user provider: 'twitter', uid: '123456', current_user: u + create_omniauth_user provider: 'slack', uid: '123456', current_user: u end end end test "should get user through omniauth info" do - u = create_omniauth_user uid: '123456', provider: 'twitter' - assert_equal u, User.find_with_omniauth('123456', 'twitter') + u = create_omniauth_user uid: '123456', provider: 'slack' + assert_equal u, User.find_with_omniauth('123456', 'slack') end test "should get user through token" do @@ -1105,7 +1040,7 @@ def setup end test "should get social accounts for login" do - u = create_omniauth_user provider: 'twitter' + u = create_omniauth_user provider: 'slack' a = create_account source: u.source, user: u, provider: 'facebook' a2 = create_account source: u.source, user: u, uid: '' assert_equal 2, u.get_social_accounts_for_login.count @@ -1115,14 +1050,13 @@ def setup end test "should get user accounts and providers" do - u = create_omniauth_user provider: 'twitter' + u = create_omniauth_user provider: 'facebook' s = u.source omniauth_info = {"info"=> { "name" => "test" } } create_account source: s, user: u, provider: 'slack', uid: '123456', omniauth_info: omniauth_info create_account source: s, user: u, provider: 'slack', uid: '987654', omniauth_info: omniauth_info assert_equal 3, u.get_social_accounts_for_login.count - assert_equal 0, u.get_social_accounts_for_login({provider: 'facebook'}).count - assert_equal 1, u.get_social_accounts_for_login({provider: 'twitter'}).count + assert_equal 1, u.get_social_accounts_for_login({provider: 'facebook'}).count assert_equal 2, u.get_social_accounts_for_login({provider: 'slack'}).count assert_equal 1, u.get_social_accounts_for_login({provider: 'slack', uid: '123456'}).count providers = u.providers @@ -1137,8 +1071,8 @@ def setup end test "should disconnect social account" do - u = create_omniauth_user provider: 'twitter', uid: '123456' - u.disconnect_login_account('twitter', '123456') + u = create_omniauth_user provider: 'slack', uid: '123456' + u.disconnect_login_account('slack', '123456') assert_equal 0, u.get_social_accounts_for_login.count u2 = create_omniauth_user provider: 'slack', uid: '456789' a = u2.get_social_accounts_for_login({provider: 'slack', uid: '456789'}).first @@ -1163,30 +1097,17 @@ def setup create_omniauth_user email: u.email end end - u = create_omniauth_user provider: 'twitter', email: '', uid: '123456' - u2 = create_omniauth_user provider: 'facebook', email: 'test@local.com' - tu = create_team_user user: u2 - pm = create_project_media user: u2 - s2_id = u2.source.id - u2_id = u2.id - u3 = create_omniauth_user provider: 'twitter', uid: '123456', email: 'test@local.com' - assert_equal u.id, u3.id + u = create_omniauth_user provider: 'google', email: 'test@local.com', uid: '123456' + u2 = create_omniauth_user provider: 'slack', email: 'test@local.com', uid: '456789' + assert_equal u.id, u2.id accounts = u.source.accounts assert_equal 2, accounts.count - assert_equal ['facebook', 'twitter'].sort, accounts.map(&:provider).sort - assert_equal u.id, pm.reload.user_id - assert_equal u.id, tu.reload.user_id - assert_raises ActiveRecord::RecordNotFound do - User.find(u2_id) - end - assert_raises ActiveRecord::RecordNotFound do - Source.find(s2_id) - end + assert_equal ['google', 'slack'].sort, accounts.map(&:provider).sort end test "should keep higher role when merge accounts in same team" do t = create_team - u = create_omniauth_user provider: 'twitter', email: 'test@local.com' + u = create_omniauth_user provider: 'slack', email: 'test@local.com' u2 = create_omniauth_user provider: 'facebook', email: 'test2@local.com' create_team_user team: t, user: u, role: 'collaborator' create_team_user team: t, user: u2, role: 'editor' @@ -1197,18 +1118,18 @@ def setup end test "should merge two existing accounts" do - u = create_omniauth_user provider: 'twitter', email: '', uid: '123456' - u2 = create_omniauth_user provider: 'twitter', email: '', uid: '345678' + u = create_omniauth_user provider: 'facebook', email: 'test@local.com', uid: '123456' + u2 = create_omniauth_user provider: 'facebook', email: 'test2@local.com', uid: '345678' assert_no_difference 'User.count' do - create_omniauth_user provider: 'twitter', email: 'test_a@local.com', uid: '123456' + create_omniauth_user provider: 'facebook', email: 'test_a@local.com', uid: '123456' end - create_omniauth_user provider: 'twitter', email: 'test_b@local.com', uid: '345678', current_user: u + create_omniauth_user provider: 'facebook', email: 'test_b@local.com', uid: '345678', current_user: u assert_equal 2, u.source.accounts.count assert_raises ActiveRecord::RecordNotFound do User.find(u2.id) end # test connect with same provider - create_omniauth_user provider: 'twitter', email: 'test_a@local.com', uid: '123456', current_user: u + create_omniauth_user provider: 'facebook', email: 'test_a@local.com', uid: '123456', current_user: u end test "should merge two users with same source" do