Commit e0a279d0b395cd24a236ea751e999f535f03d84f
1 parent
89a5dc27
Exists in
oauth_external_login
and in
1 other branch
Fixes failing tests
Showing
15 changed files
with
70 additions
and
68 deletions
Show diff stats
app/api/app.rb
| ... | ... | @@ -11,7 +11,30 @@ module Api |
| 11 | 11 | mount Federation::Webfinger |
| 12 | 12 | end |
| 13 | 13 | |
| 14 | - class BaseApi < Grape::API | |
| 14 | + class App < Grape::API | |
| 15 | + use Rack::JSONP | |
| 16 | + | |
| 17 | + logger = Logger.new(File.join(Rails.root, 'log', "#{ENV['RAILS_ENV'] || 'production'}_api.log")) | |
| 18 | + logger.formatter = GrapeLogging::Formatters::Default.new | |
| 19 | + #use GrapeLogging::Middleware::RequestLogger, { logger: logger } | |
| 20 | + | |
| 21 | + rescue_from :all do |e| | |
| 22 | + logger.error e | |
| 23 | + error! e.message, 500 | |
| 24 | + end unless Rails.env.test? | |
| 25 | + | |
| 26 | + @@NOOSFERO_CONF = nil | |
| 27 | + def self.NOOSFERO_CONF | |
| 28 | + if @@NOOSFERO_CONF | |
| 29 | + @@NOOSFERO_CONF | |
| 30 | + else | |
| 31 | + file = Rails.root.join('config', 'noosfero.yml') | |
| 32 | + @@NOOSFERO_CONF = File.exists?(file) ? YAML.load_file(file)[Rails.env] || {} : {} | |
| 33 | + end | |
| 34 | + end | |
| 35 | + | |
| 36 | + mount NoosferoFederation | |
| 37 | + | |
| 15 | 38 | before { set_locale } |
| 16 | 39 | before { setup_multitenancy } |
| 17 | 40 | before { detect_stuff_by_domain } |
| ... | ... | @@ -43,31 +66,7 @@ module Api |
| 43 | 66 | mount V1::Blocks |
| 44 | 67 | mount V1::Profiles |
| 45 | 68 | mount V1::Activities |
| 46 | - end | |
| 47 | - | |
| 48 | - class App < Grape::API | |
| 49 | - use Rack::JSONP | |
| 50 | - | |
| 51 | - logger = Logger.new(File.join(Rails.root, 'log', "#{ENV['RAILS_ENV'] || 'production'}_api.log")) | |
| 52 | - logger.formatter = GrapeLogging::Formatters::Default.new | |
| 53 | - #use GrapeLogging::Middleware::RequestLogger, { logger: logger } | |
| 54 | 69 | |
| 55 | - rescue_from :all do |e| | |
| 56 | - logger.error e | |
| 57 | - error! e.message, 500 | |
| 58 | - end unless Rails.env.test? | |
| 59 | - | |
| 60 | - @@NOOSFERO_CONF = nil | |
| 61 | - def self.NOOSFERO_CONF | |
| 62 | - if @@NOOSFERO_CONF | |
| 63 | - @@NOOSFERO_CONF | |
| 64 | - else | |
| 65 | - file = Rails.root.join('config', 'noosfero.yml') | |
| 66 | - @@NOOSFERO_CONF = File.exists?(file) ? YAML.load_file(file)[Rails.env] || {} : {} | |
| 67 | - end | |
| 68 | - end | |
| 69 | - mount BaseApi | |
| 70 | - mount NoosferoFederation | |
| 71 | 70 | # hook point which allow plugins to add Grape::API extensions to Api::App |
| 72 | 71 | #finds for plugins which has api mount points classes defined (the class should extends Grape::API) |
| 73 | 72 | @plugins = Noosfero::Plugin.all.map { |p| p.constantize } | ... | ... |
app/api/federation/webfinger.rb
| ... | ... | @@ -44,7 +44,7 @@ def acct_hash |
| 44 | 44 | acct = Hash.new{|hash, key| hash[key] = Hash.new{|hash, key| hash[key] = Array.new}} |
| 45 | 45 | url = rails.options[:Host] + ':' + rails.options[:Port].to_s + '/' |
| 46 | 46 | person = Person.find_by_identifier(extract_person_identifier) |
| 47 | - | |
| 47 | + | |
| 48 | 48 | if person.nil? |
| 49 | 49 | Rails.logger.error 'Person not found' |
| 50 | 50 | not_found! | ... | ... |
app/api/v1/activities.rb
| 1 | 1 | module Api |
| 2 | 2 | module V1 |
| 3 | 3 | class Activities < Grape::API |
| 4 | - | |
| 4 | + | |
| 5 | 5 | resource :profiles do |
| 6 | 6 | |
| 7 | 7 | get ':id/activities' do |
| ... | ... | @@ -9,7 +9,7 @@ module Api |
| 9 | 9 | |
| 10 | 10 | not_found! if profile.blank? || profile.secret || !profile.visible |
| 11 | 11 | forbidden! if !profile.display_private_info_to?(current_person) |
| 12 | - | |
| 12 | + | |
| 13 | 13 | activities = profile.activities.map(&:activity) |
| 14 | 14 | present activities, :with => Entities::Activity, :current_person => current_person |
| 15 | 15 | end | ... | ... |
app/api/v1/articles.rb
| ... | ... | @@ -64,7 +64,7 @@ module Api |
| 64 | 64 | render_api_error!(_('The article couldn\'t be removed due to some problem. Please contact the administrator.'), 400) |
| 65 | 65 | end |
| 66 | 66 | end |
| 67 | - | |
| 67 | + | |
| 68 | 68 | desc 'Report a abuse and/or violent content in a article by id' do |
| 69 | 69 | detail 'Submit a abuse (in general, a content violation) report about a specific article' |
| 70 | 70 | params Entities::Article.documentation | ... | ... |
app/concerns/authenticated_system.rb
| ... | ... | @@ -27,8 +27,8 @@ module AuthenticatedSystem |
| 27 | 27 | @current_user ||= begin |
| 28 | 28 | user = nil |
| 29 | 29 | if session[:external] |
| 30 | - user = User.new #FIXME: User needs to have at least email | |
| 31 | - external_person = ExternalPerson.where(id: session[:external]).last | |
| 30 | + user = User.new | |
| 31 | + external_person = ExternalPerson.find_by(id: session[:external]) | |
| 32 | 32 | if external_person |
| 33 | 33 | user.external_person_id = external_person.id |
| 34 | 34 | user.email = external_person.email |
| ... | ... | @@ -36,8 +36,7 @@ module AuthenticatedSystem |
| 36 | 36 | session[:external] = nil |
| 37 | 37 | end |
| 38 | 38 | else |
| 39 | - id = session[:user] | |
| 40 | - user = User.where(id: id).first if id | |
| 39 | + user = User.find_by(id: user_id) if user_id | |
| 41 | 40 | end |
| 42 | 41 | user.session = session if user |
| 43 | 42 | User.current = user | ... | ... |
app/controllers/public/profile_controller.rb
| ... | ... | @@ -398,7 +398,7 @@ class ProfileController < PublicController |
| 398 | 398 | def icon |
| 399 | 399 | size = params[:size] || :portrait |
| 400 | 400 | image, mime = profile_icon(profile, size.to_sym, true) |
| 401 | - | |
| 401 | + | |
| 402 | 402 | unless image.match(/^\/\/www\.gravatar\.com/).nil? |
| 403 | 403 | redirect_to 'https:' + image |
| 404 | 404 | else | ... | ... |
app/helpers/theme_loader_helper.rb
| ... | ... | @@ -2,7 +2,7 @@ module ThemeLoaderHelper |
| 2 | 2 | def current_theme |
| 3 | 3 | @current_theme ||= |
| 4 | 4 | begin |
| 5 | - if !(defined?(session)).nil? && session[:user_theme] | |
| 5 | + if defined?(session).present? && session[:user_theme] | |
| 6 | 6 | session[:user_theme] |
| 7 | 7 | else |
| 8 | 8 | # utility for developers: set the theme to 'random' in development mode and |
| ... | ... | @@ -34,9 +34,9 @@ module ThemeLoaderHelper |
| 34 | 34 | end |
| 35 | 35 | |
| 36 | 36 | def theme_path |
| 37 | - if !(defined?(session)).nil? && session[:user_theme] | |
| 37 | + if defined?(session).present? && session[:user_theme] | |
| 38 | 38 | '/user_themes/' + current_theme |
| 39 | - elsif session[:theme] | |
| 39 | + elsif defined?(session).present? && session[:theme] | |
| 40 | 40 | '/designs/themes/' + session[:theme] |
| 41 | 41 | else |
| 42 | 42 | '/designs/themes/' + current_theme | ... | ... |
app/models/concerns/external_user.rb
| ... | ... | @@ -19,7 +19,7 @@ module ExternalUser |
| 19 | 19 | def webfinger_lookup(login, domain, environment) |
| 20 | 20 | if login && domain && environment.has_federated_network?(domain) |
| 21 | 21 | url = URI.parse('https://'+ domain +'/.well-known/webfinger?resource=acct:'+ |
| 22 | - login+'@'+Environment.default.external_environments.find_by_url(domain)) | |
| 22 | + login+'@'+domain) | |
| 23 | 23 | req = Net::HTTP::Get.new(url.to_s) |
| 24 | 24 | res = Net::HTTP.start(url.host, url.port) { |http| http.request(req) } |
| 25 | 25 | JSON.parse(res.body) |
| ... | ... | @@ -67,26 +67,29 @@ module ExternalUser |
| 67 | 67 | |
| 68 | 68 | # Authenticates a user from an external social network |
| 69 | 69 | def external_authenticate(username, password, environment) |
| 70 | - login, domain = username.split('@') | |
| 71 | - webfinger = User.webfinger_lookup(login, domain, environment) | |
| 72 | - if webfinger | |
| 73 | - user = User.external_login(login, password, domain) | |
| 74 | - if user | |
| 75 | - u = User.new | |
| 76 | - u.email = user['user']['email'] | |
| 77 | - u.login = login | |
| 78 | - webfinger = OpenStruct.new( | |
| 79 | - identifier: webfinger['properties']['identifier'], | |
| 80 | - name: webfinger['titles']['name'], | |
| 81 | - created_at: webfinger['properties']['created_at'], | |
| 82 | - domain: domain, | |
| 83 | - email: user['user']['email'] | |
| 84 | - ) | |
| 85 | - u.external_person_id = ExternalPerson.get_or_create(webfinger).id | |
| 86 | - return u | |
| 70 | + if username && username.include?('@') | |
| 71 | + login, domain = username.split('@') | |
| 72 | + webfinger = User.webfinger_lookup(login, domain, environment) | |
| 73 | + if webfinger | |
| 74 | + user = User.external_login(login, password, domain) | |
| 75 | + if user | |
| 76 | + u = User.new | |
| 77 | + u.email = user['user']['email'] | |
| 78 | + u.login = login | |
| 79 | + webfinger = OpenStruct.new( | |
| 80 | + identifier: webfinger['properties']['identifier'], | |
| 81 | + name: webfinger['titles']['name'], | |
| 82 | + created_at: webfinger['properties']['created_at'], | |
| 83 | + domain: domain, | |
| 84 | + email: user['user']['email'] | |
| 85 | + ) | |
| 86 | + u.external_person_id = ExternalPerson.get_or_create(webfinger).id | |
| 87 | + return u | |
| 88 | + end | |
| 87 | 89 | end |
| 88 | 90 | end |
| 89 | 91 | nil |
| 90 | 92 | end |
| 93 | + | |
| 91 | 94 | end |
| 92 | 95 | end | ... | ... |
config/routes.rb
| ... | ... | @@ -86,7 +86,7 @@ Noosfero::Application.routes.draw do |
| 86 | 86 | |
| 87 | 87 | # comments |
| 88 | 88 | match 'profile/:profile/comment/:action/:id', controller: 'comment', profile: /#{Noosfero.identifier_format_in_url}/i, via: :all |
| 89 | - | |
| 89 | + | |
| 90 | 90 | # icon |
| 91 | 91 | match 'profile/:profile/icon(/:size)', controller: 'profile', action: 'icon', size: /(big|minor|thumb|portrait|icon)/, profile: /#{Noosfero.identifier_format_in_url}/i, via: :get |
| 92 | 92 | ... | ... |
features/external_login.feature
| ... | ... | @@ -6,7 +6,7 @@ Feature: external login |
| 6 | 6 | @selenium |
| 7 | 7 | Scenario: login from portal homepage |
| 8 | 8 | Given feature "allow_change_of_redirection_after_login" is disabled on environment |
| 9 | - And the following federated networks | |
| 9 | + And the following external environments | |
| 10 | 10 | | identifier | name | url | |
| 11 | 11 | | test | Test | http://federated.noosfero.org | |
| 12 | 12 | And the following external users |
| ... | ... | @@ -25,7 +25,7 @@ Feature: external login |
| 25 | 25 | @selenium |
| 26 | 26 | Scenario: not login from portal homepage |
| 27 | 27 | Given feature "allow_change_of_redirection_after_login" is disabled on environment |
| 28 | - And the following federated networks | |
| 28 | + And the following external environments | |
| 29 | 29 | | identifier | name | url | |
| 30 | 30 | | test | Test | http://federated.noosfero.org | |
| 31 | 31 | And I am not logged in | ... | ... |
plugins/organization_ratings/test/functional/organization_ratings_plugin_profile_controller_test.rb
| ... | ... | @@ -173,6 +173,7 @@ class OrganizationRatingsPluginProfileControllerTest < ActionController::TestCas |
| 173 | 173 | |
| 174 | 174 | logout |
| 175 | 175 | @controller.stubs(:logged_in?).returns(false) |
| 176 | + @controller.stubs(:current_user).returns(nil) | |
| 176 | 177 | |
| 177 | 178 | get :new_rating, profile: @community.identifier |
| 178 | 179 | assert_no_tag :tag => 'p', :content => /Report waiting for approval/, :attributes => {:class =>/comment-rejected-msg/} | ... | ... |
plugins/organization_ratings/views/shared/_make_report_block.html.erb
| 1 | 1 | <% logged_in_image = link_to profile_image(current_person, :portrait), current_person.url if current_user %> |
| 2 | 2 | <% logged_in_name = link_to current_person.name, current_person.url if current_user %> |
| 3 | -<% logged_out_image = image_tag('plugins/organization_ratings/images/user-not-logged.png') %> | |
| 3 | +<% logged_out_image = image_tag('plugins/organization_ratings/public/images/user-not-logged.png') %> | |
| 4 | 4 | |
| 5 | 5 | <div class="make-report-block"> |
| 6 | 6 | <div class="star-profile-information"> | ... | ... |
test/api/federation/webfinger_test.rb
| ... | ... | @@ -4,7 +4,7 @@ class WebfingerTest < ActiveSupport::TestCase |
| 4 | 4 | def setup |
| 5 | 5 | Domain.create(name: 'example.com') |
| 6 | 6 | Environment.default.domains << Domain.last |
| 7 | - User.create(login: 'ze', email: 'ze@localdomain.localdomain', | |
| 7 | + User.create(login: 'ze', email: 'ze@localdomain.localdomain', | |
| 8 | 8 | password: 'zeze', password_confirmation: 'zeze') |
| 9 | 9 | end |
| 10 | 10 | ... | ... |
test/api/people_test.rb
| ... | ... | @@ -376,7 +376,7 @@ class PeopleTest < ActiveSupport::TestCase |
| 376 | 376 | get "/api/v1/people/#{profile.id}/icon?#{params.to_query}" |
| 377 | 377 | assert_equal 200, last_response.status |
| 378 | 378 | json = JSON.parse(last_response.body) |
| 379 | - assert_match /^https?:\/\/.*portrait\.png$/, json['icon'] | |
| 379 | + assert_match(/^https?:\/\/.*portrait\.png$/, json['icon']) | |
| 380 | 380 | end |
| 381 | 381 | |
| 382 | 382 | should 'return icon in provided size if there is a profile image' do |
| ... | ... | @@ -386,7 +386,7 @@ class PeopleTest < ActiveSupport::TestCase |
| 386 | 386 | get "/api/v1/people/#{profile.id}/icon?#{params.to_query}&size=big" |
| 387 | 387 | assert_equal 200, last_response.status |
| 388 | 388 | json = JSON.parse(last_response.body) |
| 389 | - assert_match /^https?:\/\/.*big\.png$/, json['icon'] | |
| 389 | + assert_match(/^https?:\/\/.*big\.png$/, json['icon']) | |
| 390 | 390 | end |
| 391 | 391 | |
| 392 | 392 | should 'return icon from gravatar without size if there is no profile image' do |
| ... | ... | @@ -395,7 +395,7 @@ class PeopleTest < ActiveSupport::TestCase |
| 395 | 395 | get "/api/v1/people/#{profile.id}/icon?#{params.to_query}" |
| 396 | 396 | assert_equal 200, last_response.status |
| 397 | 397 | json = JSON.parse(last_response.body) |
| 398 | - assert_match /^https:\/\/www\.gravatar\.com.*size=64/, json['icon'] | |
| 398 | + assert_match(/^https:\/\/www\.gravatar\.com.*size=64/, json['icon']) | |
| 399 | 399 | end |
| 400 | 400 | |
| 401 | 401 | should 'return icon from gravatar with size if there is no profile image' do |
| ... | ... | @@ -404,7 +404,7 @@ class PeopleTest < ActiveSupport::TestCase |
| 404 | 404 | get "/api/v1/people/#{profile.id}/icon?#{params.to_query}&size=big" |
| 405 | 405 | assert_equal 200, last_response.status |
| 406 | 406 | json = JSON.parse(last_response.body) |
| 407 | - assert_match /^https:\/\/www\.gravatar\.com.*size=150/, json['icon'] | |
| 407 | + assert_match(/^https:\/\/www\.gravatar\.com.*size=150/, json['icon']) | |
| 408 | 408 | end |
| 409 | 409 | |
| 410 | 410 | PERSON_ATTRIBUTES = %w(vote_count comments_count articles_count following_articles_count) | ... | ... |
test/functional/profile_controller_test.rb
| ... | ... | @@ -1935,7 +1935,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 1935 | 1935 | should 'return portrait icon if size is not provided and there is a profile image' do |
| 1936 | 1936 | img = Image.create!(uploaded_data: fixture_file_upload('/files/rails.png', 'image/png')) |
| 1937 | 1937 | profile = fast_create(Person, image_id: img.id) |
| 1938 | - | |
| 1938 | + | |
| 1939 | 1939 | get :icon, profile: profile.identifier, size: nil |
| 1940 | 1940 | assert_response :success |
| 1941 | 1941 | assert_equal 'image/png', @response.header['Content-Type'] |
| ... | ... | @@ -1945,7 +1945,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 1945 | 1945 | should 'return icon in provided size if there is a profile image' do |
| 1946 | 1946 | img = Image.create!(uploaded_data: fixture_file_upload('/files/rails.png', 'image/png')) |
| 1947 | 1947 | profile = fast_create(Person, image_id: img.id) |
| 1948 | - | |
| 1948 | + | |
| 1949 | 1949 | get :icon, profile: profile.identifier, size: :big |
| 1950 | 1950 | assert_response :success |
| 1951 | 1951 | assert_equal 'image/png', @response.header['Content-Type'] |
| ... | ... | @@ -1954,14 +1954,14 @@ class ProfileControllerTest < ActionController::TestCase |
| 1954 | 1954 | |
| 1955 | 1955 | should 'return icon from gravatar without size if there is no profile image' do |
| 1956 | 1956 | profile = fast_create(Person) |
| 1957 | - | |
| 1957 | + | |
| 1958 | 1958 | get :icon, profile: profile.identifier |
| 1959 | 1959 | assert_redirected_to /^https:\/\/www\.gravatar\.com\/.*/ |
| 1960 | 1960 | end |
| 1961 | 1961 | |
| 1962 | 1962 | should 'return icon from gravatar with size if there is no profile image' do |
| 1963 | 1963 | profile = fast_create(Person) |
| 1964 | - | |
| 1964 | + | |
| 1965 | 1965 | get :icon, profile: profile.identifier, size: :thumb |
| 1966 | 1966 | assert_redirected_to /^https:\/\/www\.gravatar\.com\/.*/ |
| 1967 | 1967 | end | ... | ... |