diff --git a/lib/generators/sorcery/templates/initializer.rb b/lib/generators/sorcery/templates/initializer.rb index e4abbeaf..f93eecfb 100644 --- a/lib/generators/sorcery/templates/initializer.rb +++ b/lib/generators/sorcery/templates/initializer.rb @@ -86,6 +86,15 @@ # config.ca_file = + # For information about the Instagram API: + # - note that in their docs and console `client_id` correspond to `key` + # + # config.instagram.key = "8e4eeace2cfb4823bc1d49537f3a7a5b" + # config.instagram.secret = "edd2fce451914c828124c0eeaa674bae" + # config.instagram.callback_url = "http://0.0.0.0:3000/oauth/callback?provider=instagram" + # config.instagram.user_info_mapping = {name: "username", instagram_id: "id"} + # + # # For information about LinkedIn API: # - user info fields go to https://developer.linkedin.com/documents/profile-fields # - access permissions go to https://developer.linkedin.com/documents/authentication#granting @@ -146,6 +155,18 @@ # config.liveid.callback_url = "http://mydomain.com:3000/oauth/callback?provider=liveid" # config.liveid.user_info_mapping = {:username => "name"} + # For information about JIRA API: + # https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Example+-+OAuth+authentication + # to obtain the consumer key and the public key you can use the jira-ruby gem https://github.com/sumoheavy/jira-ruby + # or run openssl req -x509 -nodes -newkey rsa:1024 -sha1 -keyout rsakey.pem -out rsacert.pem to obtain the public key + # Make sure you have configured the application link properly + + # config.jira.key = "1234567" + # config.jira.secret = "jiraTest" + # config.jira.site = "http://localhost:2990/jira/plugins/servlet/oauth" + # config.jira.signature_method = "RSA-SHA1" + # config.jira.private_key_file = "rsakey.pem" + # --- user config --- config.user_config do |user| diff --git a/lib/sorcery/controller.rb b/lib/sorcery/controller.rb index 87fd2b34..27052ca8 100644 --- a/lib/sorcery/controller.rb +++ b/lib/sorcery/controller.rb @@ -103,7 +103,7 @@ def not_authenticated # @param [] user the user instance. # @return - do not depend on the return value. def auto_login(user, should_remember = false) - session[:user_id] = user.id + session[:user_id] = user.id.to_s @current_user = user end diff --git a/lib/sorcery/controller/submodules/external.rb b/lib/sorcery/controller/submodules/external.rb index 7e980fae..f10d95b8 100644 --- a/lib/sorcery/controller/submodules/external.rb +++ b/lib/sorcery/controller/submodules/external.rb @@ -9,6 +9,7 @@ def self.included(base) require 'sorcery/providers/base' require 'sorcery/providers/facebook' + require 'sorcery/providers/instagram' require 'sorcery/providers/twitter' require 'sorcery/providers/vk' require 'sorcery/providers/linkedin' @@ -16,6 +17,7 @@ def self.included(base) require 'sorcery/providers/xing' require 'sorcery/providers/github' require 'sorcery/providers/google' + require 'sorcery/providers/jira' Config.module_eval do class << self diff --git a/lib/sorcery/controller/submodules/remember_me.rb b/lib/sorcery/controller/submodules/remember_me.rb index 5760fccb..8ab9557a 100644 --- a/lib/sorcery/controller/submodules/remember_me.rb +++ b/lib/sorcery/controller/submodules/remember_me.rb @@ -38,7 +38,7 @@ def forget_me! # Override. # logins a user instance, and optionally remembers him. def auto_login(user, should_remember = false) - session[:user_id] = user.id + session[:user_id] = user.id.to_s @current_user = user remember_me! if should_remember end @@ -58,7 +58,7 @@ def login_from_cookie user = cookies.signed[:remember_me_token] && user_class.sorcery_adapter.find_by_remember_me_token(cookies.signed[:remember_me_token]) if user && user.has_remember_me_token? set_remember_me_cookie!(user) - session[:user_id] = user.id + session[:user_id] = user.id.to_s @current_user = user else @current_user = false diff --git a/lib/sorcery/providers/instagram.rb b/lib/sorcery/providers/instagram.rb new file mode 100644 index 00000000..5b8e7fad --- /dev/null +++ b/lib/sorcery/providers/instagram.rb @@ -0,0 +1,102 @@ +module Sorcery + module Providers + # This class adds support for OAuth with Instagram.com. + + class Instagram < Base + + include Protocols::Oauth2 + + + attr_accessor :access_permissions, :token_url, + :authorization_path, :user_info_path, + :scope, :user_info_fields + + + def initialize + @site = 'https://api.instagram.com' + @token_url = '/oauth/access_token' + @authorization_path = '/oauth/authorize/' + @user_info_path = '/v1/users/self' + super + end + + # provider implements method to build Oauth client + def login_url(params, session) + authorize_url + end + + + # @override of Base#authorize_url + def authorize_url(opts={}) + @scope = build_access_scope! + super(opts.merge(:token_url => @token_url)) + end + + # pass oauth2 param `code` provided by instgrm server + def process_callback(params, session) + args = {}.tap do |a| + a[:code] = params[:code] if params[:code] + end + get_access_token(args, token_url: @token_url, + client_id: @key, client_secret: @secret) + end + + + # see `user_info_mapping` in config/initializer, + # given `user_info_mapping` to specify + # {:db_attribute_name => 'instagram_attr_name'} + # so that Sorcery can build AR model from attr names + # + # NOTE: instead of just getting the user info + # from the access_token (which already returns them), + # testing strategy relies on querying user_info_path + def get_user_hash(access_token) + call_api_params = { + :access_token => access_token.token, + :client_id => access_token[:client_id] + } + response = access_token.get( + "#{user_info_path}?#{call_api_params.to_param}" + ) + + + _user_attrs = Hash.new + _user_attrs[:user_info] = JSON.parse(response.body)['data'] + _user_attrs[:uid] = _user_attrs[:user_info]['id'] + _user_attrs + end + + + private + + # build access scope attribute for instagram + # e.g. whether to access for `likes` or just basic + def build_access_scope! + valid = /\A(basic|comments|relationships|likes)$/ + + if !access_permissions.present? + _scopes = ["basic"] + elsif access_permissions.kind_of?(Array) + _scopes = access_permissions + .map(&:to_s) + .grep(valid) + elsif access_permissions.kind_of?(String) + _scopes = access_permissions + .split(/\W+/) + .grep(valid) + end + + # basic IS required + # b/c instagram fails on blank values + # and requires `basic` for any additional scope + _scopes.push('basic') + + _scopes.uniq.join(' ') + + end + + end + + end + +end \ No newline at end of file diff --git a/lib/sorcery/providers/jira.rb b/lib/sorcery/providers/jira.rb new file mode 100644 index 00000000..19aad565 --- /dev/null +++ b/lib/sorcery/providers/jira.rb @@ -0,0 +1,77 @@ +module Sorcery + module Providers + # This class adds support for OAuth with Jira + # + # config.jira.key = + # config.jira.secret = + # ... + # + class Jira < Base + + include Protocols::Oauth + + attr_accessor :access_token_path, :authorize_path, :request_token_path, + :user_info_path, :site, :signature_method, :private_key_file, :callback_url + + + def initialize + @configuration = { + authorize_path: '/authorize', + request_token_path: '/request-token', + access_token_path: '/access-token' + } + @user_info_path = '/users/me' + end + + # Override included get_consumer method to provide authorize_path + #read extra configurations + def get_consumer + @configuration = @configuration.merge({ + site: site, + signature_method: signature_method, + consumer_key: key, + private_key_file: private_key_file + }) + ::OAuth::Consumer.new(@key, @secret, @configuration) + end + + def get_user_hash(access_token) + response = access_token.get(user_info_path) + + {}.tap do |h| + h[:user_info] = JSON.parse(response.body)['users'].first + h[:uid] = user_hash[:user_info]['id'].to_s + end + end + + # calculates and returns the url to which the user should be redirected, + # to get authenticated at the external provider's site. + def login_url(params, session) + req_token = get_request_token + session[:request_token] = req_token.token + session[:request_token_secret] = req_token.secret + + #it was like that -> redirect_to authorize_url({ request_token: req_token.token, request_token_secret: req_token.secret }) + #for some reason Jira does not need these parameters + + get_request_token( + session[:request_token], + session[:request_token_secret] + ).authorize_url + end + + # tries to login the user from access token + def process_callback(params, session) + args = { + oauth_verifier: params[:oauth_verifier], + request_token: session[:request_token], + request_token_secret: session[:request_token_secret] + } + + args.merge!({ code: params[:code] }) if params[:code] + get_access_token(args) + end + + end + end +end diff --git a/spec/controllers/controller_http_basic_auth_spec.rb b/spec/controllers/controller_http_basic_auth_spec.rb index 316836b9..5b821fae 100644 --- a/spec/controllers/controller_http_basic_auth_spec.rb +++ b/spec/controllers/controller_http_basic_auth_spec.rb @@ -62,7 +62,7 @@ get :test_http_basic_auth, nil, http_authentication_used: true - expect(session[:user_id]).to be 42 + expect(session[:user_id]).to eq "42" end end end diff --git a/spec/controllers/controller_oauth2_spec.rb b/spec/controllers/controller_oauth2_spec.rb index 74876736..dc4238fe 100644 --- a/spec/controllers/controller_oauth2_spec.rb +++ b/spec/controllers/controller_oauth2_spec.rb @@ -137,7 +137,7 @@ expect(flash[:notice]).to eq "Success!" end - [:github, :google, :liveid, :vk].each do |provider| + [:github, :google, :liveid, :vk, :instagram].each do |provider| describe "with #{provider}" do @@ -190,11 +190,14 @@ end sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer) - sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk]) + sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk, :instagram]) sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w") sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8") sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com") + sorcery_controller_external_property_set(:instagram, :key, "eYVNBjBDi33aa9GkA3w") + sorcery_controller_external_property_set(:instagram, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8") + sorcery_controller_external_property_set(:instagram, :callback_url, "http://blabla.com") sorcery_controller_external_property_set(:github, :key, "eYVNBjBDi33aa9GkA3w") sorcery_controller_external_property_set(:github, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8") sorcery_controller_external_property_set(:github, :callback_url, "http://blabla.com") @@ -235,7 +238,7 @@ expect(ActionMailer::Base.deliveries.size).to eq old_size end - [:github, :google, :liveid, :vk].each do |provider| + [:github, :google, :liveid, :vk, :instagram].each do |provider| it "does not send activation email to external users (#{provider})" do old_size = ActionMailer::Base.deliveries.size create_new_external_user provider @@ -266,7 +269,7 @@ end end - %w(facebook github google liveid vk).each do |provider| + %w(facebook github google liveid vk instagram).each do |provider| context "when #{provider}" do before(:each) do sorcery_controller_property_set(:register_login_time, true) @@ -306,7 +309,7 @@ let(:user) { double('user', id: 42) } - %w(facebook github google liveid vk).each do |provider| + %w(facebook github google liveid vk instagram).each do |provider| context "when #{provider}" do before(:each) do sorcery_model_property_set(:authentications_class, Authentication) @@ -329,7 +332,7 @@ it "resets session after session timeout" do expect(User).to receive(:load_from_provider).with(provider.to_sym, '123').and_return(user) get "test_login_from_#{provider}".to_sym - expect(session[:user_id]).to eq 42 + expect(session[:user_id]).to eq "42" Timecop.travel(Time.now.in_time_zone+0.6) get :test_should_be_logged_in @@ -343,31 +346,50 @@ def stub_all_oauth2_requests! access_token = double(OAuth2::AccessToken) allow(access_token).to receive(:token_param=) + allow(access_token).to receive(:[]).with(:client_id){ + "eYVNBjBDi33aa9GkA3w" + } response = double(OAuth2::Response) - allow(response).to receive(:body) { { - "id"=>"123", - "name"=>"Noam Ben Ari", - "first_name"=>"Noam", - "last_name"=>"Ben Ari", - "link"=>"http://www.facebook.com/nbenari1", - "hometown"=>{"id"=>"110619208966868", "name"=>"Haifa, Israel"}, - "location"=>{"id"=>"106906559341067", "name"=>"Pardes Hanah, Hefa, Israel"}, - "bio"=>"I'm a new daddy, and enjoying it!", - "gender"=>"male", - "email"=>"nbenari@gmail.com", - "timezone"=>2, - "locale"=>"en_US", - "languages"=>[{"id"=>"108405449189952", "name"=>"Hebrew"}, {"id"=>"106059522759137", "name"=>"English"}, {"id"=>"112624162082677", "name"=>"Russian"}], - "verified"=>true, - "updated_time"=>"2011-02-16T20:59:38+0000", - # response for VK auth - "response"=>[ - { - "uid"=>"123", - "first_name"=>"Noam", - "last_name"=>"Ben Ari" - } - ]}.to_json } + allow(response).to receive(:body) { + { + "id"=>"123", + "name"=>"Noam Ben Ari", + "first_name"=>"Noam", + "last_name"=>"Ben Ari", + "link"=>"http://www.facebook.com/nbenari1", + "hometown"=>{"id"=>"110619208966868", "name"=>"Haifa, Israel"}, + "location"=>{"id"=>"106906559341067", "name"=>"Pardes Hanah, Hefa, Israel"}, + "bio"=>"I'm a new daddy, and enjoying it!", + "gender"=>"male", + "email"=>"nbenari@gmail.com", + "timezone"=>2, + "locale"=>"en_US", + "languages"=>[{"id"=>"108405449189952", "name"=>"Hebrew"}, {"id"=>"106059522759137", "name"=>"English"}, {"id"=>"112624162082677", "name"=>"Russian"}], + "verified"=>true, + "updated_time"=>"2011-02-16T20:59:38+0000", + # response for VK auth + "response"=>[ + { + "uid"=>"123", + "first_name"=>"Noam", + "last_name"=>"Ben Ari" + } + ], + # stubbed response for instagram oauth2; + # thankfully keyed by 'data', so doesn't interfere + # with all the other stubs here + "data" =>{ + "username"=>"pnmahoney", + "bio"=>"turn WHAT down?", + "website"=>"", + "profile_picture"=> + "http://photos-d.ak.instagram.com/hphotos-ak-xpa1/10454121_417985815007395_867850883_a.jpg", + "full_name"=>"Patrick Mahoney", + "counts"=>{"media"=>2, "followed_by"=>100, "follows"=>71}, + "id"=>"123" + } + }.to_json + } allow(access_token).to receive(:get) { response } allow(access_token).to receive(:token) { "187041a618229fdaf16613e96e1caabc1e86e46bbfad228de41520e63fe45873684c365a14417289599f3" } # access_token params for VK auth @@ -376,10 +398,14 @@ def stub_all_oauth2_requests! end def set_external_property - sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk]) + sorcery_controller_property_set(:external_providers, [:facebook, :github, :google, :liveid, :vk, :instagram]) sorcery_controller_external_property_set(:facebook, :key, "eYVNBjBDi33aa9GkA3w") sorcery_controller_external_property_set(:facebook, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8") sorcery_controller_external_property_set(:facebook, :callback_url, "http://blabla.com") + sorcery_controller_external_property_set(:instagram, :key, "eYVNBjBDi33aa9GkA3w") + sorcery_controller_external_property_set(:instagram, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8") + sorcery_controller_external_property_set(:instagram, :callback_url, "http://blabla.com") + sorcery_controller_external_property_set(:instagram, :scope, ['basic']) sorcery_controller_external_property_set(:github, :key, "eYVNBjBDi33aa9GkA3w") sorcery_controller_external_property_set(:github, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8") sorcery_controller_external_property_set(:github, :callback_url, "http://blabla.com") @@ -399,7 +425,8 @@ def provider_url(provider) github: "https://github.com/login/oauth/authorize?client_id=#{::Sorcery::Controller::Config.github.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=&state=", google: "https://accounts.google.com/o/oauth2/auth?client_id=#{::Sorcery::Controller::Config.google.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&state=", liveid: "https://oauth.live.com/authorize?client_id=#{::Sorcery::Controller::Config.liveid.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=wl.basic+wl.emails+wl.offline_access&state=", - vk: "https://oauth.vk.com/authorize?client_id=#{::Sorcery::Controller::Config.vk.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.vk.scope}&state=" + vk: "https://oauth.vk.com/authorize?client_id=#{::Sorcery::Controller::Config.vk.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.vk.scope}&state=", + instagram: "https://api.instagram.com/oauth/authorize?client_id=#{::Sorcery::Controller::Config.instagram.key}&display=&redirect_uri=http%3A%2F%2Fblabla.com&response_type=code&scope=#{::Sorcery::Controller::Config.instagram.scope}&state=" }[provider] end diff --git a/spec/controllers/controller_oauth_spec.rb b/spec/controllers/controller_oauth_spec.rb index 55e3b219..24e14099 100644 --- a/spec/controllers/controller_oauth_spec.rb +++ b/spec/controllers/controller_oauth_spec.rb @@ -27,10 +27,17 @@ def stub_all_oauth_requests! before(:all) do sorcery_reload!([:external]) - sorcery_controller_property_set(:external_providers, [:twitter]) + sorcery_controller_property_set(:external_providers, [:twitter, :jira]) sorcery_controller_external_property_set(:twitter, :key, "eYVNBjBDi33aa9GkA3w") sorcery_controller_external_property_set(:twitter, :secret, "XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8") sorcery_controller_external_property_set(:twitter, :callback_url, "http://blabla.com") + + sorcery_controller_external_property_set(:jira, :key, "7810b8e317ebdc81601c72f8daecc0f1") + sorcery_controller_external_property_set(:jira, :secret, "MyAppUsingJira") + sorcery_controller_external_property_set(:jira, :site, "http://jira.mycompany.com/plugins/servlet/oauth") + sorcery_controller_external_property_set(:jira, :signature_method, "RSA-SHA1") + sorcery_controller_external_property_set(:jira, :private_key_file, "myrsakey.pem") + sorcery_controller_external_property_set(:jira, :callback_url, "http://myappusingjira.com/home") end # ----------------- OAuth ----------------------- @@ -83,6 +90,14 @@ def stub_all_oauth_requests! expect(flash[:notice]).to eq "Success!" end + context "when jira" do + it "user logins successfully" do + get :login_at_test_jira + expect(session[:request_token]).not_to be_nil + expect(response).to be_a_redirect + end + end + end describe SorceryController do diff --git a/spec/controllers/controller_remember_me_spec.rb b/spec/controllers/controller_remember_me_spec.rb index 9597b617..1b51e7db 100644 --- a/spec/controllers/controller_remember_me_spec.rb +++ b/spec/controllers/controller_remember_me_spec.rb @@ -51,19 +51,18 @@ end it "logout also calls forget_me!" do - session[:user_id] = user.id - expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id).and_return(user) + session[:user_id] = user.id.to_s + expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user) expect(user).to receive(:remember_me!) expect(user).to receive(:forget_me!) - get :test_logout_with_remember expect(cookies["remember_me_token"]).to be_nil end it "logs user in from cookie" do - session[:user_id] = user.id - expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id).and_return(user) + session[:user_id] = user.id.to_s + expect(User.sorcery_adapter).to receive(:find_by_id).with(user.id.to_s).and_return(user) expect(user).to receive(:remember_me!) expect(user).to receive(:remember_me_token).and_return('token').twice expect(user).to receive(:has_remember_me_token?) { true } diff --git a/spec/controllers/controller_spec.rb b/spec/controllers/controller_spec.rb index e310ec7b..3682e326 100644 --- a/spec/controllers/controller_spec.rb +++ b/spec/controllers/controller_spec.rb @@ -54,7 +54,7 @@ get :test_login, :email => 'bla@bla.com', :password => 'secret' expect(assigns[:user]).to eq user - expect(session[:user_id]).to eq 42 + expect(session[:user_id]).to eq "42" end it "login(email,password) returns the user when success and set the session with user.id" do @@ -63,7 +63,7 @@ get :test_login, :email => 'bla@bla.com', :password => 'secret' expect(assigns[:user]).to eq user - expect(session[:user_id]).to eq user.id + expect(session[:user_id]).to eq user.id.to_s end it "login(username,password) returns nil and not set the session when failure" do @@ -96,7 +96,7 @@ get :test_login, :email => 'BLA@BLA.COM', :password => 'secret' expect(assigns[:user]).to eq user - expect(session[:user_id]).to eq user.id + expect(session[:user_id]).to eq user.id.to_s end # TODO: move test to model @@ -115,21 +115,21 @@ get :test_login, :email => 'bla1@bla.com', :password => 'secret1' expect(assigns[:user]).to eq user - expect(session[:user_id]).to eq user.id + expect(session[:user_id]).to eq user.id.to_s end it "logout clears the session" do cookies[:remember_me_token] = nil - session[:user_id] = user.id - expect(User.sorcery_adapter).to receive(:find_by_id).with(42) { user } + session[:user_id] = user.id.to_s + expect(User.sorcery_adapter).to receive(:find_by_id).with("42") { user } get :test_logout expect(session[:user_id]).to be_nil end it "logged_in? returns true if logged in" do - session[:user_id] = user.id - expect(User.sorcery_adapter).to receive(:find_by_id).with(42) { user } + session[:user_id] = user.id.to_s + expect(User.sorcery_adapter).to receive(:find_by_id).with("42") { user } expect(subject.logged_in?).to be true end @@ -141,8 +141,8 @@ end it "current_user returns the user instance if logged in" do - session[:user_id] = user.id - expect(User.sorcery_adapter).to receive(:find_by_id).with(42) { user } + session[:user_id] = user.id.to_s + expect(User.sorcery_adapter).to receive(:find_by_id).with("42") { user } 2.times { expect(subject.current_user).to eq user } # memoized! end diff --git a/spec/rails_app/app/controllers/sorcery_controller.rb b/spec/rails_app/app/controllers/sorcery_controller.rb index 9ad07f17..89e71bc3 100644 --- a/spec/rails_app/app/controllers/sorcery_controller.rb +++ b/spec/rails_app/app/controllers/sorcery_controller.rb @@ -76,6 +76,10 @@ def test_http_basic_auth render text: 'HTTP Basic Auth' end + def login_at_test_instagram + login_at(:instagram) + end + def login_at_test_twitter login_at(:twitter) end @@ -98,6 +102,10 @@ def login_at_test_liveid login_at(:liveid) end + def login_at_test_jira + login_at(:jira) + end + def login_at_test_vk login_at(:vk) end @@ -106,6 +114,14 @@ def login_at_test_with_state login_at(:facebook, {state: 'bla'}) end + def test_login_from_instagram + if @user = login_from(:instagram) + redirect_to 'bla', notice: 'Success!' + else + redirect_to 'blu', alert: 'Failed!' + end + end + def test_login_from_twitter if @user = login_from(:twitter) redirect_to 'bla', notice: 'Success!' @@ -156,6 +172,22 @@ def test_login_from_vk end end + def test_return_to_with_external_instagram + if @user = login_from(:instagram) + redirect_back_or_to 'bla', notice: 'Success!' + else + redirect_to 'blu', alert: 'Failed!' + end + end + + def test_login_from_jira + if @user = login_from(:jira) + redirect_to 'bla', notice: 'Success!' + else + redirect_to 'blu', alert: 'Failed!' + end + end + def test_return_to_with_external_twitter if @user = login_from(:twitter) redirect_back_or_to 'bla', notice: 'Success!' @@ -164,6 +196,14 @@ def test_return_to_with_external_twitter end end + def test_return_to_with_external_jira + if @user = login_from(:jira) + redirect_back_or_to 'bla', notice: 'Success!' + else + redirect_to 'blu', alert: 'Failed!' + end + end + alias :test_return_to_with_external :test_return_to_with_external_twitter def test_return_to_with_external_facebook diff --git a/spec/rails_app/config/routes.rb b/spec/rails_app/config/routes.rb index 29311461..5984a7d1 100644 --- a/spec/rails_app/config/routes.rb +++ b/spec/rails_app/config/routes.rb @@ -16,26 +16,32 @@ get :test_add_second_provider get :test_return_to_with_external get :test_login_from + get :test_login_from_instagram get :test_login_from_twitter get :test_login_from_facebook get :test_login_from_github get :test_login_from_google get :test_login_from_liveid get :test_login_from_vk + get :test_login_from_jira get :login_at_test + get :login_at_test_instagram get :login_at_test_twitter get :login_at_test_facebook get :login_at_test_github get :login_at_test_google get :login_at_test_liveid get :login_at_test_vk + get :login_at_test_jira get :test_return_to_with_external + get :test_return_to_with_external_instagram get :test_return_to_with_external_twitter get :test_return_to_with_external_facebook get :test_return_to_with_external_github get :test_return_to_with_external_google get :test_return_to_with_external_liveid get :test_return_to_with_external_vk + get :test_return_to_with_external_jira get :test_http_basic_auth get :some_action_making_a_non_persisted_change_to_the_user post :test_login_with_remember diff --git a/spec/shared_examples/user_shared_examples.rb b/spec/shared_examples/user_shared_examples.rb index 898dc5eb..a776b808 100644 --- a/spec/shared_examples/user_shared_examples.rb +++ b/spec/shared_examples/user_shared_examples.rb @@ -444,7 +444,7 @@ def self.matches?(crypted,*tokens) User.sorcery_adapter.delete_all end - [:facebook, :github, :google, :liveid].each do |provider| + [:facebook, :github, :google, :liveid, :instagram].each do |provider| it "does not send activation email to external users" do old_size = ActionMailer::Base.deliveries.size