• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

codebar / planner / 24775744666

22 Apr 2026 11:27AM UTC coverage: 95.453% (-0.04%) from 95.497%
24775744666

push

github

web-flow
Merge pull request #2584 from mroderick/fix/blank-email-validation

fix: handle blank email from GitHub OAuth

4 of 6 new or added lines in 1 file covered. (66.67%)

3 existing lines in 2 files now uncovered.

3485 of 3651 relevant lines covered (95.45%)

46.98 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

75.0
/app/controllers/auth_services_controller.rb
1
class AuthServicesController < ApplicationController
6✔
2
  def new
6✔
3
    referer_path = URI(request.referer).path if request.referer
10✔
4
    if Rails.application.routes.recognize_path(referer_path)[:controller].in?(%w[workshops events meetings])
10✔
5
      session[:referer_path] = referer_path
9✔
6
    end
7
    redirect_to '/auth/github'
10✔
8
  end
9

10
  def create
6✔
11
    member_type = cookies[:member_type]
18✔
12
    current_service = AuthService.find_by(provider: omnihash[:provider],
18✔
13
                                          uid: omnihash[:uid])
14

15
    if logged_in?
18✔
16
      if current_service
×
17
        flash[:notice] = I18n.t('notifications.provider_already_connected',
×
18
                                provider: omnihash[:provider])
19
      end
20
      redirect_to root_path
×
21
    elsif current_service
18✔
22
      session[:member_id] = current_service.member.id
8✔
23
      session[:service_id]         = current_service.id
8✔
24
      session[:oauth_token]        = omnihash[:credentials][:token]
8✔
25
      session[:oauth_token_secret] = omnihash[:credentials][:secret]
8✔
26

27
      finish_registration || redirect_to(referer_or_dashboard_path)
8✔
28
    else
29
        email = omnihash[:info][:email].to_s.strip
10✔
30

31
        if email.blank?
10✔
NEW
32
          flash[:error] = I18n.t('notifications.email_missing_from_provider')
×
NEW
33
          return redirect_to root_url
×
34
        end
35

36
        member = Member.find_by(email:)
10✔
37
        member ||= Member.new(email:)
10✔
38

39
        member.name    ||= omnihash[:info][:name]&.split(' ')&.first || ''
10✔
40
        member.surname ||= omnihash[:info][:name]&.split(' ')&.drop(1)&.join(' ') || ''
10✔
41

42
        member_service = member.auth_services.build(
10✔
43
          provider: omnihash[:provider],
44
          uid: omnihash[:uid]
45
        )
46

47
        member.save!
10✔
48

49
        member.toggle!(:can_log_in)
10✔
50

51
        session[:member_id]          = member.id
10✔
52
        session[:service_id]         = member_service.id
10✔
53
        session[:oauth_token]        = omnihash[:credentials][:token]
10✔
54
        session[:oauth_token_secret] = omnihash[:credentials][:secret]
10✔
55

56
        redirect_to edit_member_details_path(member_type: member_type)
10✔
57
    end
58
  end
59

60
  def destroy
6✔
61
    service = current_user.services.find(params[:id])
×
62
    if service.respond_to?(:destroy) && service.destroy
×
63
      flash[:notice] = I18n.t('notifications.provider_unlinked',
×
64
                              provider: service.provider)
65
      redirect_to redirect_path
×
66
    end
67
  end
68

69
  def failure
6✔
70
    flash[:error] = I18n.t('notifications.authentication_error')
×
71
    redirect_to root_url
×
72
  end
73

74
  private
6✔
75

76
  def referer_or_dashboard_path
6✔
77
    session[:referer_path] || dashboard_path
8✔
78
  end
79

80
  def omnihash
6✔
81
    request.env['omniauth.auth']
122✔
82
  end
83

84
  def omniauth_providers
6✔
85
    (OmniAuth::Strategies.local_constants.map(&:downcase) - %i[developer oauth oauth2]).map(&:to_s)
×
86
  end
87

88
  def redirect_path
6✔
89
    :services
×
90
  end
91
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc