diff options
| author | Robert Speicher <robert@gitlab.com> | 2016-08-18 23:18:58 +0000 |
|---|---|---|
| committer | Robert Speicher <robert@gitlab.com> | 2016-08-18 23:18:58 +0000 |
| commit | a59c33e4a3c492bdf05c67be47a5ba14d40e7bb8 (patch) | |
| tree | c40adb301fc5cbd6634a7c3a268e7ce03237ae9b /lib | |
| parent | 4eba6865711c42817eaa4a8109be152afb4efa7c (diff) | |
| parent | de5f2380293f9c8ccbb9a1c83a309589f42b77b8 (diff) | |
| download | gitlab-ce-a59c33e4a3c492bdf05c67be47a5ba14d40e7bb8.tar.gz | |
Merge branch '2fa-check-git-http' into 'master'
2FA checks for Git over HTTP
## What does this MR do?
This MR allows the use of `PersonalAccessTokens` to access Git over HTTP and makes that the only allowed method if the user has 2FA enabled. If a user with 2FA enabled tries to access Git over HTTP using his username and password the request will be denied and the user will be presented with the following message:
```
remote: HTTP Basic: Access denied
remote: You have 2FA enabled, please use a personal access token for Git over HTTP.
remote: You can generate one at http://localhost:3000/profile/personal_access_tokens
fatal: Authentication failed for 'http://localhost:3000/documentcloud/underscore.git/'
```
## What are the relevant issue numbers?
Fixes #13568
See merge request !5764
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/gitlab/auth.rb | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb index db1704af75e..91f0270818a 100644 --- a/lib/gitlab/auth.rb +++ b/lib/gitlab/auth.rb @@ -10,13 +10,12 @@ module Gitlab if valid_ci_request?(login, password, project) result.type = :ci - elsif result.user = find_with_user_password(login, password) - result.type = :gitlab_or_ldap - elsif result.user = oauth_access_token_check(login, password) - result.type = :oauth + else + result = populate_result(login, password) end - rate_limit!(ip, success: !!result.user || (result.type == :ci), login: login) + success = result.user.present? || [:ci, :missing_personal_token].include?(result.type) + rate_limit!(ip, success: success, login: login) result end @@ -76,10 +75,43 @@ module Gitlab end end + def populate_result(login, password) + result = + user_with_password_for_git(login, password) || + oauth_access_token_check(login, password) || + personal_access_token_check(login, password) + + if result + result.type = nil unless result.user + + if result.user && result.user.two_factor_enabled? && result.type == :gitlab_or_ldap + result.type = :missing_personal_token + end + end + + result || Result.new + end + + def user_with_password_for_git(login, password) + user = find_with_user_password(login, password) + Result.new(user, :gitlab_or_ldap) if user + end + def oauth_access_token_check(login, password) if login == "oauth2" && password.present? token = Doorkeeper::AccessToken.by_token(password) - token && token.accessible? && User.find_by(id: token.resource_owner_id) + if token && token.accessible? + user = User.find_by(id: token.resource_owner_id) + Result.new(user, :oauth) + end + end + end + + def personal_access_token_check(login, password) + if login && password + user = User.find_by_personal_access_token(password) + validation = User.by_login(login) + Result.new(user, :personal_token) if user == validation end end end |
