Commit 08fdc37b41d32def049d2a89b92a6252e09a49b2

Authored by Nathan Broadbent
1 parent ee1d6a07
Exists in master and in 1 other branch production

Allow configuration of GitHub permissions (turn on/off access to creating GitHub…

… issues for public/private/no repos)
README.md
... ... @@ -202,9 +202,17 @@ After you have followed these instructions, you will be able to **Sign in with G
202 202  
203 203 You will also be able to link your GitHub profile to your user account on your **Edit profile** page.
204 204  
205   -If you have signed in with GitHub, or linked your GitHub profile,
206   -you are able to create an issue on GitHub if the App has a GitHub repo configured.
207   -You will also be able to create an issue on a configured issue trackers.
  205 +If you have signed in with GitHub, or linked your GitHub profile, and the App has a GitHub repo configured,
  206 +then you will be able to create issues on GitHub.
  207 +You will still be able to create an issue on the App's configured issue tracker.
  208 +
  209 +You can change the requested account permissions by setting `github_access_scope` to:
  210 +
  211 +<table>
  212 + <tr><th>['repo'] </th><td>Allow creating issues for public and private repos.</td></tr>
  213 + <tr><th>['public_repo'] </th><td>Only allow creating issues for public repos.</td></tr>
  214 + <tr><th>[] </th><td>No permission to create issues on any repos.</td></tr>
  215 +</table>
208 216  
209 217  
210 218 **Configuring LDAP authentication:**
... ...
app/controllers/users/omniauth_callbacks_controller.rb
... ... @@ -8,21 +8,17 @@ class Users::OmniauthCallbacksController &lt; Devise::OmniauthCallbacksController
8 8 if current_user
9 9 # ... unless a user is already registered with same github login
10 10 if github_user && github_user != current_user
11   - flash[:error] = "User already registered with GitHub login '#{github_login}'"
  11 + flash[:error] = "User already registered with GitHub login '#{github_login}'!"
12 12 else
13 13 # Add github details to current user
14   - current_user.update_attributes(
15   - :github_login => github_login,
16   - :github_oauth_token => github_token
17   - )
  14 + update_user_with_github_attributes(current_user, github_login, github_token)
18 15 flash[:success] = "Successfully linked GitHub account!"
19 16 end
20 17 # User must have clicked 'link account' from their user page, so redirect there.
21 18 redirect_to user_path(current_user)
22 19 elsif github_user
23 20 # Store OAuth token
24   - github_user.update_attribute :github_oauth_token, github_token
25   -
  21 + update_user_with_github_attributes(github_user, github_login, github_token)
26 22 flash[:success] = I18n.t "devise.omniauth_callbacks.success", :kind => "GitHub"
27 23 sign_in_and_redirect github_user, :event => :authentication
28 24 else
... ... @@ -30,4 +26,13 @@ class Users::OmniauthCallbacksController &lt; Devise::OmniauthCallbacksController
30 26 redirect_to new_user_session_path
31 27 end
32 28 end
  29 +
  30 + private
  31 +
  32 + def update_user_with_github_attributes(user, login, token)
  33 + user.update_attributes(
  34 + :github_login => login,
  35 + :github_oauth_token => token
  36 + )
  37 + end
33 38 end
... ...
app/models/user.rb
... ... @@ -48,6 +48,10 @@ class User
48 48 github_login.present? && github_oauth_token.present?
49 49 end
50 50  
  51 + def can_create_github_issues?
  52 + github_account? && Errbit::Config.github_access_scope.include?('repo')
  53 + end
  54 +
51 55 protected
52 56  
53 57 def destroy_watchers
... ...
app/views/errs/_issue_tracker_links.html.haml
... ... @@ -6,7 +6,7 @@
6 6 %span.disabled= link_to 'creating...', '#', :class => "#{@problem.issue_type}_inactive create-issue"
7 7 = link_to 'retry', create_issue_app_err_path(@app, @problem), :method => :post
8 8 - else
9   - - if current_user.github_account? && @app.github_repo?
  9 + - if current_user.can_create_github_issues? && @app.github_repo?
10 10 %span= link_to 'create issue', create_issue_app_err_path(@app, @problem, :tracker => 'user_github'), :method => :post, :class => "github_create create-issue"
11 11 - if @app.issue_tracker_configured? && !@app.issue_tracker.is_a?(GithubIssuesTracker)
12 12 %span= link_to 'create issue', create_issue_app_err_path(@app, @problem), :method => :post, :class => "#{@app.issue_tracker.label}_create create-issue"
... ...
config/config.example.yml
... ... @@ -61,6 +61,11 @@ deployment:
61 61 github_authentication: false
62 62 github_client_id: 'GITHUB_CLIENT_ID'
63 63 github_secret: 'GITHUB_SECRET'
  64 +# GitHub Permissions to request from user
  65 +# ['repo'] - Allow creating issues for public and private repos.
  66 +# ['public_repo'] - Only allow creating issues for public repos.
  67 +# [] - No permission to create issues on any repos.
  68 +github_access_scope: ['repo']
64 69  
65 70 # Configure SMTP settings. If you are running Errbit on Heroku,
66 71 # sendgrid will be configured by default.
... ...
config/initializers/_load_config.rb
... ... @@ -17,6 +17,7 @@ unless defined?(Errbit::Config)
17 17 Errbit::Config.github_authentication = ENV['GITHUB_AUTHENTICATION']
18 18 Errbit::Config.github_client_id = ENV['GITHUB_CLIENT_ID']
19 19 Errbit::Config.github_secret = ENV['GITHUB_SECRET']
  20 + Errbit::Config.github_access_scope = ENV['GITHUB_ACCESS_SCOPE'].split(',').map(&:strip) if ENV['GITHUB_ACCESS_SCOPE']
20 21  
21 22 Errbit::Config.smtp_settings = {
22 23 :address => "smtp.sendgrid.net",
... ...
config/initializers/devise.rb
... ... @@ -119,7 +119,10 @@ Devise.setup do |config|
119 119 # config.sign_out_all_scopes = false
120 120  
121 121 if Errbit::Config.github_authentication || Rails.env.test?
122   - config.omniauth :github, Errbit::Config.github_client_id, Errbit::Config.github_secret, :scope => 'repo'
  122 + config.omniauth :github,
  123 + Errbit::Config.github_client_id,
  124 + Errbit::Config.github_secret,
  125 + :scope => Errbit::Config.github_access_scope.join(",")
123 126 end
124 127  
125 128 # ==> Navigation configuration
... ...