Commit 4d9756c1 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'username-namespace-clash' into 'master'

Prevent autogenerated OAuth username to clash with existing namespace.

If the OAuth username already exists as a group rather than a user, automatic account creation would still fail.

See merge request !1511
parents 6d523db7 161d1554
...@@ -44,6 +44,10 @@ class Namespace < ActiveRecord::Base ...@@ -44,6 +44,10 @@ class Namespace < ActiveRecord::Base
scope :root, -> { where('type IS NULL') } scope :root, -> { where('type IS NULL') }
def self.by_path(path)
where('lower(path) = :value', value: path.downcase).first
end
def self.search(query) def self.search(query)
where("name LIKE :query OR path LIKE :query", query: "%#{query}%") where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
end end
......
...@@ -252,7 +252,7 @@ class User < ActiveRecord::Base ...@@ -252,7 +252,7 @@ class User < ActiveRecord::Base
counter = 0 counter = 0
base = username base = username
while by_login(username).present? while User.by_login(username).present? || Namespace.by_path(username).present?
counter += 1 counter += 1
username = "#{base}#{counter}" username = "#{base}#{counter}"
end end
...@@ -290,7 +290,8 @@ class User < ActiveRecord::Base ...@@ -290,7 +290,8 @@ class User < ActiveRecord::Base
def namespace_uniq def namespace_uniq
namespace_name = self.username namespace_name = self.username
if Namespace.find_by(path: namespace_name) existing_namespace = Namespace.by_path(namespace_name)
if existing_namespace && existing_namespace != self.namespace
self.errors.add :username, "already exists" self.errors.add :username, "already exists"
end end
end end
......
...@@ -303,8 +303,8 @@ describe User do ...@@ -303,8 +303,8 @@ describe User do
describe ".clean_username" do describe ".clean_username" do
let!(:user1) { create(:user, username: "johngitlab-etc") } let!(:user) { create(:user, username: "johngitlab-etc") }
let!(:user2) { create(:user, username: "JohnGitLab-etc1") } let!(:namespace) { create(:namespace, path: "JohnGitLab-etc1") }
it "cleans a username and makes sure it's available" do it "cleans a username and makes sure it's available" do
expect(User.clean_username("-john+gitlab-ETC%.git@gmail.com")).to eq("johngitlab-ETC2") expect(User.clean_username("-john+gitlab-ETC%.git@gmail.com")).to eq("johngitlab-ETC2")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment