diff --git a/app/models/user.rb b/app/models/user.rb index b593c22fde3ece30eaa7557a2105bb8e480acfc6..c2355eaab99501c76b7330c348741fa5971599d0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -190,6 +190,14 @@ class User < ActiveRecord::Base def search query where("name LIKE :query OR email LIKE :query OR username LIKE :query", query: "%#{query}%") end + + def by_username_or_id(name_or_id) + if (name_or_id.is_a?(Integer)) + User.find_by_id(name_or_id) + else + User.find_by_username(name_or_id) + end + end end # diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 996d3adb17491a53ec91dfa7904cff3eac4c7e90..4f189f3519672e651a48a49a6cffafdbc7984a23 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -12,25 +12,18 @@ module API if (identifier && !(@current_user.id == identifier || @current_user.username == identifier)) render_api_error!('403 Forbidden: Must be admin to use sudo', 403) unless @current_user.is_admin? begin - - if (identifier.is_a?(Integer)) - user = User.find_by_id(identifier) - else - user = User.find_by_username(identifier) - end - if user.nil? - not_found!("No user id or username for: #{identifier}") - end - @current_user = user + @current_user = User.by_username_or_id(identifier) rescue => ex not_found!("No user id or username for: #{identifier}") end + not_found!("No user id or username for: #{identifier}") if current_user.nil? end @current_user end def sudo_identifier() - identifier = params[SUDO_PARAM] == nil ? env[SUDO_HEADER] : params[SUDO_PARAM] + identifier ||= params[SUDO_PARAM] ||= env[SUDO_HEADER] + # Regex for integers if (!!(identifier =~ /^[0-9]+$/)) identifier.to_i else @@ -129,10 +122,10 @@ module API def abilities @abilities ||= begin - abilities = Six.new - abilities << Ability - abilities - end + abilities = Six.new + abilities << Ability + abilities + end end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 695f0ae68462addf79fbe2321f417da71d9376ca..de06bf71dc1adb64ff8328d839bc16e748ef88d2 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -208,4 +208,14 @@ describe User do user.can_create_group.should == false end end + + describe 'by_username_or_id' do + let(:user1){create(:user, username: 'foo')} + it "should get the correct user" do + User.by_username_or_id(user1.id).should == user1 + User.by_username_or_id('foo').should == user1 + User.by_username_or_id(-1).should be_nil + User.by_username_or_id('bar').should be_nil + end + end end diff --git a/spec/requests/api/api_helpers_spec.rb b/spec/requests/api/api_helpers_spec.rb index de71deabb8e5ef979864b05b85ac3c122de7b87d..a1cbfcd60e99e679a189183733a80b7e13d21305 100644 --- a/spec/requests/api/api_helpers_spec.rb +++ b/spec/requests/api/api_helpers_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe Gitlab::API do - include Gitlab::APIHelpers +describe API do + include API::APIHelpers include ApiHelpers let(:user) { create(:user) } let(:admin) { create(:admin) } @@ -13,27 +13,27 @@ describe Gitlab::API do def set_env(token_usr, identifier) clear_env clear_param - env[Gitlab::APIHelpers::PRIVATE_TOKEN_HEADER] = token_usr.private_token - env[Gitlab::APIHelpers::SUDO_HEADER] = identifier + env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = token_usr.private_token + env[API::APIHelpers::SUDO_HEADER] = identifier end def set_param(token_usr, identifier) clear_env clear_param - params[Gitlab::APIHelpers::PRIVATE_TOKEN_PARAM] = token_usr.private_token - params[Gitlab::APIHelpers::SUDO_PARAM] = identifier + params[API::APIHelpers::PRIVATE_TOKEN_PARAM] = token_usr.private_token + params[API::APIHelpers::SUDO_PARAM] = identifier end def clear_env - env.delete(Gitlab::APIHelpers::PRIVATE_TOKEN_HEADER) - env.delete(Gitlab::APIHelpers::SUDO_HEADER) + env.delete(API::APIHelpers::PRIVATE_TOKEN_HEADER) + env.delete(API::APIHelpers::SUDO_HEADER) end def clear_param - params.delete(Gitlab::APIHelpers::PRIVATE_TOKEN_PARAM) - params.delete(Gitlab::APIHelpers::SUDO_PARAM) + params.delete(API::APIHelpers::PRIVATE_TOKEN_PARAM) + params.delete(API::APIHelpers::SUDO_PARAM) end def error!(message, status) @@ -42,10 +42,10 @@ describe Gitlab::API do describe ".current_user" do it "should leave user as is when sudo not specified" do - env[Gitlab::APIHelpers::PRIVATE_TOKEN_HEADER] = user.private_token + env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = user.private_token current_user.should == user clear_env - params[Gitlab::APIHelpers::PRIVATE_TOKEN_PARAM] = user.private_token + params[API::APIHelpers::PRIVATE_TOKEN_PARAM] = user.private_token current_user.should == user end